Skip to content

Commit bb540e6

Browse files
authored
Decouple with a mocked service (#2256)
* refactor * build succeed * mock web failures * mock awaitable * resolve comment * improve scope guard * resolve a comment
1 parent c94a88e commit bb540e6

18 files changed

+342
-497
lines changed

src/CalcViewModel/ApplicationViewModel.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,8 @@ void ApplicationViewModel::OnModeChanged()
171171
if (!m_ConverterViewModel)
172172
{
173173
auto dataLoader = std::make_shared<UnitConverterDataLoader>(ref new GeographicRegion());
174-
auto currencyDataLoader = std::make_shared<CurrencyDataLoader>(std::make_unique<CurrencyHttpClient>());
175-
m_ConverterViewModel = ref new UnitConverterViewModel(std::make_shared<UnitConversionManager::UnitConverter>(dataLoader, currencyDataLoader));
174+
m_ConverterViewModel =
175+
ref new UnitConverterViewModel(std::make_shared<UnitConversionManager::UnitConverter>(dataLoader, std::make_shared<CurrencyDataLoader>()));
176176
}
177177

178178
m_ConverterViewModel->Mode = m_mode;

src/CalcViewModel/CalcViewModel.vcxproj

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,6 @@
325325
<ClInclude Include="Common\Utils.h" />
326326
<ClInclude Include="DataLoaders\CurrencyDataLoader.h" />
327327
<ClInclude Include="DataLoaders\CurrencyHttpClient.h" />
328-
<ClInclude Include="DataLoaders\ICurrencyHttpClient.h" />
329328
<ClInclude Include="DataLoaders\UnitConverterDataConstants.h" />
330329
<ClInclude Include="DataLoaders\UnitConverterDataLoader.h" />
331330
<ClInclude Include="DateCalculatorViewModel.h" />
@@ -396,23 +395,6 @@
396395
<Project>{fc81ff41-02cd-4cd9-9bc5-45a1e39ac6ed}</Project>
397396
</ProjectReference>
398397
</ItemGroup>
399-
<ItemDefinitionGroup Condition="!Exists('DataLoaders\DataLoaderConstants.h')">
400-
<ClCompile>
401-
<AdditionalOptions>/DUSE_MOCK_DATA %(AdditionalOptions)</AdditionalOptions>
402-
</ClCompile>
403-
</ItemDefinitionGroup>
404-
<Choose>
405-
<When Condition="Exists('DataLoaders\DataLoaderConstants.h')">
406-
<ItemGroup>
407-
<ClInclude Include="DataLoaders\DataLoaderConstants.h" />
408-
</ItemGroup>
409-
</When>
410-
<Otherwise>
411-
<ItemGroup>
412-
<ClInclude Include="DataLoaders\DataLoaderMockConstants.h" />
413-
</ItemGroup>
414-
</Otherwise>
415-
</Choose>
416398
<ItemGroup>
417399
<None Include="DataLoaders\DefaultFromToCurrency.json" />
418400
</ItemGroup>

src/CalcViewModel/CalcViewModel.vcxproj.filters

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,6 @@
171171
<ClInclude Include="DataLoaders\CurrencyHttpClient.h">
172172
<Filter>DataLoaders</Filter>
173173
</ClInclude>
174-
<ClInclude Include="DataLoaders\DataLoaderMockConstants.h">
175-
<Filter>DataLoaders</Filter>
176-
</ClInclude>
177-
<ClInclude Include="DataLoaders\ICurrencyHttpClient.h">
178-
<Filter>DataLoaders</Filter>
179-
</ClInclude>
180174
<ClInclude Include="DataLoaders\UnitConverterDataConstants.h">
181175
<Filter>DataLoaders</Filter>
182176
</ClInclude>

src/CalcViewModel/DataLoaders/CurrencyDataLoader.cpp

Lines changed: 27 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,8 @@ namespace CalculatorApp
8989
}
9090
}
9191

92-
CurrencyDataLoader::CurrencyDataLoader(_In_ unique_ptr<ICurrencyHttpClient> client, const wchar_t* forcedResponseLanguage)
93-
: m_client(move(client))
94-
, m_loadStatus(CurrencyLoadStatus::NotLoaded)
92+
CurrencyDataLoader::CurrencyDataLoader(const wchar_t* forcedResponseLanguage)
93+
: m_loadStatus(CurrencyLoadStatus::NotLoaded)
9594
, m_responseLanguage(L"en-US")
9695
, m_ratioFormat(L"")
9796
, m_timestampFormat(L"")
@@ -122,12 +121,7 @@ CurrencyDataLoader::CurrencyDataLoader(_In_ unique_ptr<ICurrencyHttpClient> clie
122121
}
123122
}
124123

125-
if (m_client != nullptr)
126-
{
127-
m_client->SetSourceCurrencyCode(StringReference(DefaultCurrencyCode.data()));
128-
m_client->SetResponseLanguage(m_responseLanguage);
129-
}
130-
124+
m_client.Initialize(StringReference{ DefaultCurrencyCode.data() }, m_responseLanguage);
131125
auto localizationService = LocalizationService::GetInstance();
132126
if (CoreWindow::GetForCurrentThread() != nullptr)
133127
{
@@ -199,26 +193,29 @@ void CurrencyDataLoader::LoadData()
199193
if (!LoadFinished())
200194
{
201195
RegisterForNetworkBehaviorChanges();
202-
create_task([this]() -> task<bool> {
203-
vector<function<future<bool>()>> loadFunctions = {
204-
[this]() { return TryLoadDataFromCacheAsync(); },
205-
[this]() { return TryLoadDataFromWebAsync(); },
206-
};
207-
208-
bool didLoad = false;
209-
for (auto& f : loadFunctions)
196+
create_task(
197+
[this]() -> task<bool>
210198
{
211-
didLoad = co_await f();
212-
if (didLoad)
199+
vector<function<future<bool>()>> loadFunctions = {
200+
[this]() { return TryLoadDataFromCacheAsync(); },
201+
[this]() { return TryLoadDataFromWebAsync(); },
202+
};
203+
204+
bool didLoad = false;
205+
for (auto& f : loadFunctions)
213206
{
214-
break;
207+
didLoad = co_await f();
208+
if (didLoad)
209+
{
210+
break;
211+
}
215212
}
216-
}
217213

218-
co_return didLoad;
219-
})
214+
co_return didLoad;
215+
})
220216
.then(
221-
[this](bool didLoad) {
217+
[this](bool didLoad)
218+
{
222219
UpdateDisplayedTimestamp();
223220
NotifyDataLoadFinished(didLoad);
224221
},
@@ -283,9 +280,7 @@ double CurrencyDataLoader::RoundCurrencyRatio(double ratio)
283280
int numberDecimals = FORMATTER_RATE_MIN_DECIMALS;
284281
if (ratio < 1)
285282
{
286-
numberDecimals = max(
287-
FORMATTER_RATE_MIN_DECIMALS,
288-
(int)(-log10(ratio)) + FORMATTER_RATE_MIN_SIGNIFICANT_DECIMALS);
283+
numberDecimals = max(FORMATTER_RATE_MIN_DECIMALS, (int)(-log10(ratio)) + FORMATTER_RATE_MIN_SIGNIFICANT_DECIMALS);
289284
}
290285

291286
unsigned long long scale = (unsigned long long)powl(10l, numberDecimals);
@@ -314,8 +309,7 @@ pair<wstring, wstring> CurrencyDataLoader::GetCurrencyRatioEquality(_In_ const U
314309
auto ratioString = LocalizationStringUtil::GetLocalizedString(
315310
m_ratioFormat, digitSymbol, StringReference(unit1.abbreviation.c_str()), roundedFormat, StringReference(unit2.abbreviation.c_str()));
316311

317-
auto accessibleRatioString =
318-
LocalizationStringUtil::GetLocalizedString(
312+
auto accessibleRatioString = LocalizationStringUtil::GetLocalizedString(
319313
m_ratioFormat, digitSymbol, StringReference(unit1.accessibleName.c_str()), roundedFormat, StringReference(unit2.accessibleName.c_str()));
320314

321315
return make_pair(ratioString->Data(), accessibleRatioString->Data());
@@ -415,18 +409,13 @@ future<bool> CurrencyDataLoader::TryLoadDataFromWebAsync()
415409
{
416410
ResetLoadStatus();
417411

418-
if (m_client == nullptr)
419-
{
420-
co_return false;
421-
}
422-
423412
if (m_networkAccessBehavior == NetworkAccessBehavior::Offline || (m_networkAccessBehavior == NetworkAccessBehavior::OptIn && !m_meteredOverrideSet))
424413
{
425414
co_return false;
426415
}
427416

428-
String ^ staticDataResponse = co_await m_client->GetCurrencyMetadata();
429-
String ^ allRatiosResponse = co_await m_client->GetCurrencyRatios();
417+
String ^ staticDataResponse = co_await m_client.GetCurrencyMetadataAsync();
418+
String ^ allRatiosResponse = co_await m_client.GetCurrencyRatiosAsync();
430419
if (staticDataResponse == nullptr || allRatiosResponse == nullptr)
431420
{
432421
co_return false;
@@ -550,9 +539,7 @@ bool CurrencyDataLoader::TryParseStaticData(_In_ String ^ rawJson, _Inout_ vecto
550539
staticData[i] = CurrencyStaticData{ countryCode, countryName, currencyCode, currencyName, currencySymbol };
551540
}
552541

553-
auto sortCountryNames = [](const UCM::CurrencyStaticData & s) {
554-
return ref new String(s.countryName.c_str());
555-
};
542+
auto sortCountryNames = [](const UCM::CurrencyStaticData& s) { return ref new String(s.countryName.c_str()); };
556543

557544
LocalizationService::GetInstance()->Sort<UCM::CurrencyStaticData>(staticData, sortCountryNames);
558545

@@ -577,7 +564,7 @@ bool CurrencyDataLoader::TryParseAllRatiosData(_In_ String ^ rawJson, _Inout_ Cu
577564
{
578565
obj = data->GetAt(i)->GetObject();
579566
}
580-
catch (COMException^ e)
567+
catch (COMException ^ e)
581568
{
582569
if (e->HResult == E_ILLEGAL_METHOD_CALL)
583570
{

src/CalcViewModel/DataLoaders/CurrencyDataLoader.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
#include "CalcManager/UnitConverter.h"
77
#include "Common/NetworkManager.h"
8-
#include "ICurrencyHttpClient.h"
8+
#include "CurrencyHttpClient.h"
99

1010
namespace CalculatorApp
1111
{
@@ -54,9 +54,7 @@ namespace CalculatorApp
5454
class CurrencyDataLoader : public UCM::IConverterDataLoader, public UCM::ICurrencyConverterDataLoader
5555
{
5656
public:
57-
CurrencyDataLoader(
58-
_In_ std::unique_ptr<CalculatorApp::ViewModel::DataLoaders::ICurrencyHttpClient> client,
59-
const wchar_t* overrideLanguage = nullptr);
57+
CurrencyDataLoader(const wchar_t* overrideLanguage = nullptr);
6058
~CurrencyDataLoader();
6159

6260
bool LoadFinished();
@@ -114,7 +112,7 @@ namespace CalculatorApp
114112

115113
private:
116114
Platform::String ^ m_responseLanguage;
117-
std::unique_ptr<CalculatorApp::ViewModel::DataLoaders::ICurrencyHttpClient> m_client;
115+
CurrencyHttpClient m_client;
118116

119117
bool m_isRtlLanguage;
120118

0 commit comments

Comments
 (0)