Skip to content

Commit 681f2bc

Browse files
author
Michael Pawlik
committed
Resolved comments, additional logging
1 parent 9d47f10 commit 681f2bc

7 files changed

Lines changed: 92 additions & 76 deletions

File tree

Calinga.NET.Tests/CalingaServiceTests.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public void Translate_ShouldThrow_WhenKeyEmpty()
169169
var service = new CalingaService(_testCalingaServiceSettings);
170170

171171
// Act
172-
Func<Task> getTranslations = async () => await service.TranslateAsync("", TestData.Language_DE).ConfigureAwait(false);
172+
Func<Task> getTranslations = async () => await service.TranslateAsync("", TestData.Language_DE);
173173

174174
// Assert
175175
getTranslations.Should().ThrowAsync<ArgumentNullException>();
@@ -182,7 +182,7 @@ public void Translate_ShouldThrow_WhenKeyLanguageEmpty()
182182
var service = new CalingaService(_testCalingaServiceSettings);
183183

184184
// Act
185-
Func<Task> getTranslations = async () => await service.TranslateAsync(TestData.Key_1, "").ConfigureAwait(false);
185+
Func<Task> getTranslations = async () => await service.TranslateAsync(TestData.Key_1, "");
186186

187187
// Assert
188188
getTranslations.Should().ThrowAsync<ArgumentNullException>();
@@ -209,7 +209,7 @@ public void ContextTranslate_ShouldThrow_WhenKeyLanguageEmpty()
209209
var context = new LanguageContext(TestData.Language_DE, service);
210210

211211
// Act
212-
Func<Task> translate = async () => await context.TranslateAsync("").ConfigureAwait(false);
212+
Func<Task> translate = async () => await context.TranslateAsync("");
213213

214214
// Assert
215215
translate.Should().ThrowAsync<ArgumentNullException>();
@@ -222,7 +222,7 @@ public async Task Translate_ShouldReturnTranslationFromTestData()
222222
var service = new CalingaService(_cachingService.Object, _consumerHttpClient.Object, _testCalingaServiceSettings);
223223

224224
// Act
225-
var translation = await service.TranslateAsync(TestData.Key_1, TestData.Language_DE).ConfigureAwait(false);
225+
var translation = await service.TranslateAsync(TestData.Key_1, TestData.Language_DE);
226226

227227
// Assert
228228
translation.Should().Be(Invariant($"{TestData.Language_DE} {TestData.Translation_Key_1}"));
@@ -242,7 +242,7 @@ public async Task GetLanguages_ShouldReturnLanguagesFromCache()
242242
}));
243243

244244
// Act
245-
var languages = await service.GetLanguagesAsync().ConfigureAwait(false);
245+
var languages = await service.GetLanguagesAsync();
246246

247247
// Assert
248248
languages.Should().BeEquivalentTo(new List<string> { TestData.Language_FR });
@@ -260,7 +260,7 @@ public async Task GetLanguages_ShouldReturnLanguagesFromHttpClient_WhenNotFoundI
260260
_cachingService.Setup(x => x.GetLanguages()).Returns(Task.FromResult(CachedLanguageListResponse.Empty));
261261

262262
// Act
263-
var languages = await service.GetLanguagesAsync().ConfigureAwait(false);
263+
var languages = await service.GetLanguagesAsync();
264264

265265
// Assert
266266
languages.Should().BeEquivalentTo(new List<string> { TestData.Language_EN, TestData.Language_DE });
@@ -273,7 +273,7 @@ public async Task GetReferenceLanguage_ShouldReturnReferenceLanguageFromTestData
273273
var service = new CalingaService(_cachingService.Object, _consumerHttpClient.Object, _testCalingaServiceSettings);
274274

275275
// Act
276-
var referenceLanguage = await service.GetReferenceLanguage().ConfigureAwait(false);
276+
var referenceLanguage = await service.GetReferenceLanguage();
277277

278278
// Assert
279279
referenceLanguage.Should().Be(TestData.Language_EN);
@@ -288,7 +288,7 @@ public async Task GetReferenceLanguage_ShouldThrow_WhenUseCacheOnlyIsTrueAndNoRe
288288
_cachingService.Setup(x => x.GetLanguages()).ReturnsAsync(CachedLanguageListResponse.Empty);
289289

290290
// Act
291-
Func<Task> getReferenceLanguage = async () => await service.GetReferenceLanguage().ConfigureAwait(false);
291+
Func<Task> getReferenceLanguage = async () => await service.GetReferenceLanguage();
292292

293293
// Assert
294294
await getReferenceLanguage.Should().ThrowAsync<LanguagesNotAvailableException>();
@@ -303,7 +303,7 @@ public async Task Translate_ShouldReturnKey_WhenKeyNotExists()
303303
var key = Invariant($"{TestData.Key_1}_Test");
304304

305305
// Act
306-
var result = await service.TranslateAsync(key, TestData.Language_DE).ConfigureAwait(false);
306+
var result = await service.TranslateAsync(key, TestData.Language_DE);
307307

308308
// Assert
309309
result.Should().Be(key);
@@ -320,7 +320,7 @@ public async Task Translate_ShouldReturnKey_WhenNoTranslations()
320320
var service = new CalingaService(cachingService.Object, _consumerHttpClient.Object, _testCalingaServiceSettings);
321321

322322
// Act
323-
var result = await service.TranslateAsync(TestData.Key_1, TestData.Language_DE).ConfigureAwait(false);
323+
var result = await service.TranslateAsync(TestData.Key_1, TestData.Language_DE);
324324

325325
// Assert
326326
result.Should().Be(TestData.Key_1);
@@ -333,7 +333,7 @@ public async Task GetTranslations_ShouldReturnTranslationsFromTestData()
333333
var service = new CalingaService(_cachingService.Object, _consumerHttpClient.Object, _testCalingaServiceSettings);
334334

335335
// Act
336-
var translations = await service.GetTranslationsAsync(TestData.Language_DE).ConfigureAwait(false);
336+
var translations = await service.GetTranslationsAsync(TestData.Language_DE);
337337

338338
// Assert
339339
translations.Count.Should().Be(2);
@@ -350,7 +350,7 @@ public async Task GetTranslations_ShouldNotFail_WhenCachingReturnsNull()
350350
var service = new CalingaService(_cachingService.Object, _consumerHttpClient.Object, _testCalingaServiceSettings);
351351

352352
// Act
353-
var translations = await service.GetTranslationsAsync(TestData.Language_DE).ConfigureAwait(false);
353+
var translations = await service.GetTranslationsAsync(TestData.Language_DE);
354354

355355
// Assert
356356
translations.Any().Should().BeTrue();
@@ -364,7 +364,7 @@ public async Task GetTranslations_ShouldReturnKeysFromTestData_WhenDevMode()
364364
var service = new CalingaService(_cachingService.Object, _consumerHttpClient.Object, setting);
365365

366366
// Act
367-
var translations = await service.GetTranslationsAsync(TestData.Language_DE).ConfigureAwait(false);
367+
var translations = await service.GetTranslationsAsync(TestData.Language_DE);
368368

369369
// Assert
370370
translations.Count.Should().Be(2);
@@ -391,7 +391,7 @@ public async Task GetTranslationsAsync_ShouldFallbackToReferenceLanguage_WhenFal
391391
true));
392392

393393
// Act
394-
var translations = await service.GetTranslationsAsync(TestData.Language_DE).ConfigureAwait(false);
394+
var translations = await service.GetTranslationsAsync(TestData.Language_DE);
395395

396396
// Assert
397397
translations.Should().BeEquivalentTo(TestData.Cache_Translations_En.Result);
@@ -408,7 +408,7 @@ public async Task GetTranslationsAsync_ShouldNotFetchFromHttpClient_WhenUseCache
408408
_consumerHttpClient.Setup(x => x.GetTranslationsAsync(TestData.Language_DE)).Throws<Exception>(); // Should not be called
409409

410410
// Act
411-
var translations = await service.GetTranslationsAsync(TestData.Language_DE).ConfigureAwait(false);
411+
var translations = await service.GetTranslationsAsync(TestData.Language_DE);
412412

413413
// Assert
414414
translations.Should().BeEquivalentTo(TestData.Cache_Translations_De.Result);
@@ -424,7 +424,7 @@ public async Task GetReferenceLanguage_ShouldThrow_WhenNoReferenceLanguageFound(
424424
_consumerHttpClient.Setup(x => x.GetLanguagesAsync()).ReturnsAsync(new List<Language>());
425425

426426
// Act
427-
Func<Task> getReferenceLanguage = async () => await service.GetReferenceLanguage().ConfigureAwait(false);
427+
Func<Task> getReferenceLanguage = async () => await service.GetReferenceLanguage();
428428

429429
// Assert
430430
await getReferenceLanguage.Should().ThrowAsync<LanguagesNotAvailableException>();
@@ -441,7 +441,7 @@ public async Task GetTranslationsAsync_ShouldThrow_WhenTranslationsNotAvailableA
441441
_consumerHttpClient.Setup(x => x.GetTranslationsAsync(TestData.Language_DE)).Throws<TranslationsNotAvailableException>();
442442

443443
// Act
444-
Func<Task> getTranslations = async () => await service.GetTranslationsAsync(TestData.Language_DE).ConfigureAwait(false);
444+
Func<Task> getTranslations = async () => await service.GetTranslationsAsync(TestData.Language_DE);
445445

446446
// Assert
447447
await getTranslations.Should().ThrowAsync<TranslationsNotAvailableException>();
@@ -459,7 +459,7 @@ public async Task GetTranslationsAsync_ShouldThrow_WhenFallbackToReferenceLangua
459459
_cachingService.Setup(x => x.GetLanguages()).ReturnsAsync(new CachedLanguageListResponse(new List<Language> { new Language { Name = TestData.Language_DE, IsReference = true } }, true));
460460

461461
// Act
462-
Func<Task> getTranslations = async () => await service.GetTranslationsAsync(TestData.Language_DE).ConfigureAwait(false);
462+
Func<Task> getTranslations = async () => await service.GetTranslationsAsync(TestData.Language_DE);
463463

464464
// Assert
465465
await getTranslations.Should().ThrowAsync<TranslationsNotAvailableException>();

Calinga.NET.Tests/FileCachingServiceTests.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,13 @@ public async Task StoreTranslationsAsync_OverwritesExistingFile()
104104
_fileSystem.Setup(fs => fs.WriteAllTextAsync(tempFilePath, It.IsAny<string>())).Returns(Task.CompletedTask);
105105
_fileSystem.Setup(fs => fs.ReadAllTextAsync(tempFilePath)).ReturnsAsync(JsonConvert.SerializeObject(translations));
106106
_fileSystem.Setup(fs => fs.FileExists(path)).Returns(true);
107-
_fileSystem.Setup(fs => fs.MoveFile(path, prevFilePath));
108107
_fileSystem.Setup(fs => fs.ReplaceFile(tempFilePath, path, null));
109108

110109
// Act
111110
await _service.StoreTranslationsAsync(language, translations);
112111

113112
// Assert
114-
_fileSystem.Verify(fs => fs.MoveFile(path, prevFilePath), Times.Once);
113+
_fileSystem.Verify(fs => fs.ReplaceFile(path, prevFilePath, null), Times.Once);
115114
_fileSystem.Verify(fs => fs.ReplaceFile(tempFilePath, path, null), Times.Once);
116115
}
117116

Calinga.NET/Caching/FileCachingService.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public async Task<CacheResponse> GetTranslations(string languageName, bool inclu
3333

3434
try
3535
{
36-
var fileContent = await _fileSystem.ReadAllTextAsync(path);
36+
var fileContent = await _fileSystem.ReadAllTextAsync(path).ConfigureAwait(false);
3737

3838
return new CacheResponse(JsonConvert.DeserializeObject<Dictionary<string, string>>(fileContent), true);
3939
}
@@ -54,7 +54,7 @@ public async Task<CachedLanguageListResponse> GetLanguages()
5454
{
5555
try
5656
{
57-
var fileContent = await _fileSystem.ReadAllTextAsync(path);
57+
var fileContent = await _fileSystem.ReadAllTextAsync(path).ConfigureAwait(false);
5858

5959
return new CachedLanguageListResponse(JsonConvert.DeserializeObject<List<Language>>(fileContent), true);
6060
}
@@ -107,10 +107,14 @@ public async Task StoreTranslationsAsync(string language, IReadOnlyDictionary<st
107107
if (_fileSystem.FileExists(path))
108108
{
109109
var prevFilePath = Path.Combine(_filePath, $"{Path.GetFileNameWithoutExtension(path)}.prev.json");
110-
_fileSystem.MoveFile(path, prevFilePath);
110+
_fileSystem.ReplaceFile(path, prevFilePath, null);
111+
112+
_logger.Info($"Previous version of file {path} was renamed to {prevFilePath}");
111113
}
112114

113115
_fileSystem.ReplaceFile(tempFilePath, path, null);
116+
117+
_logger.Info($"Translations for language {language} stored in cache");
114118
}
115119
catch (JsonException ex)
116120
{
@@ -141,7 +145,7 @@ public async Task StoreLanguagesAsync(IEnumerable<Language> languageList)
141145
if (_fileSystem.FileExists(path))
142146
{
143147
var prevFilePath = Path.Combine(_filePath, $"{Path.GetFileNameWithoutExtension(path)}.prev.json");
144-
_fileSystem.MoveFile(path, prevFilePath);
148+
_fileSystem.ReplaceFile(path, prevFilePath, null);
145149
}
146150

147151
_fileSystem.ReplaceFile(tempFilePath, path, null);
@@ -159,7 +163,9 @@ public async Task StoreLanguagesAsync(IEnumerable<Language> languageList)
159163

160164
private static string GetFileName(string language)
161165
{
162-
return Invariant($"{language.ToUpper()}.json");
166+
var sanitizedLanguage = System.Text.RegularExpressions.Regex.Replace(language, @"[^a-zA-Z0-9_\-~]", "");
167+
168+
return Invariant($"{sanitizedLanguage}.json");
163169
}
164170

165171
private void DeleteDirectoryRecursively(DirectoryInfo directory)

Calinga.NET/CalingaService.cs

Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,9 @@ public async Task<string> TranslateAsync(string key, string language)
100100

101101
return translation.Value;
102102
}
103-
catch (TranslationsNotAvailableException)
103+
catch (TranslationsNotAvailableException e)
104104
{
105+
_logger.Warn($"Translations for {language} not found, returning key: {key}. Error: {e.Message}");
105106
return key;
106107
}
107108
}
@@ -112,7 +113,7 @@ public async Task<IReadOnlyDictionary<string, string>> GetTranslationsAsync(stri
112113
{
113114
Guard.IsNotNullOrWhiteSpace(language);
114115

115-
IReadOnlyDictionary<string, string>? cachedTranslations = null;
116+
IReadOnlyDictionary<string, string>? foundTranslations = null;
116117
CacheResponse? cacheResponse = null;
117118

118119
try
@@ -121,52 +122,50 @@ public async Task<IReadOnlyDictionary<string, string>> GetTranslationsAsync(stri
121122
}
122123
catch (Exception e)
123124
{
124-
_logger.Warn("Error while fetching translations from cache. Trying to fetch from consumer API");
125+
_logger.Warn($"Error while fetching translations for language {language} from cache. Trying to fetch from consumer API. Error: {e.Message}");
125126
}
126127

127128
if (cacheResponse is { FoundInCache: true })
128129
{
129-
cachedTranslations = cacheResponse.Result;
130+
foundTranslations = cacheResponse.Result;
131+
132+
_logger.Info($"Translations for language {language} fetched from cache");
133+
134+
return _settings.IsDevMode ? foundTranslations.ToDictionary(k => k.Key, k => k.Key) : foundTranslations;
130135
}
131-
else
136+
137+
if (!_settings.UseCacheOnly)
132138
{
133-
if (!_settings.UseCacheOnly)
139+
try
134140
{
135-
try
136-
{
137-
cachedTranslations = await _consumerHttpClient.GetTranslationsAsync(language).ConfigureAwait(false);
141+
foundTranslations = await _consumerHttpClient.GetTranslationsAsync(language).ConfigureAwait(false);
138142

139-
if (cachedTranslations != null && cachedTranslations.Any())
140-
{
141-
await _cachingService.StoreTranslationsAsync(language, cachedTranslations).ConfigureAwait(false);
142-
}
143-
}
144-
catch (Exception e)
143+
if (foundTranslations != null && foundTranslations.Any())
145144
{
146-
_logger.Warn($"Error when fetching translations for language {language} from consumer API: {e.Message}");
145+
_logger.Info($"Translations for language {language} fetched from consumer API");
147146

148-
if (!_settings.FallbackToReferenceLanguage)
149-
throw;
147+
await _cachingService.StoreTranslationsAsync(language, foundTranslations).ConfigureAwait(false);
148+
return _settings.IsDevMode ? foundTranslations.ToDictionary(k => k.Key, k => k.Key) : foundTranslations;
150149
}
151150
}
151+
catch (Exception e)
152+
{
153+
_logger.Warn($"Error when fetching translations for language {language} from consumer API: {e.Message}");
152154

153-
if (cachedTranslations != null && cachedTranslations.Any())
154-
return _settings.IsDevMode ? cachedTranslations.ToDictionary(k => k.Key, k => k.Key) : cachedTranslations;
155-
156-
var referenceLanguage = await GetReferenceLanguage();
157-
158-
if (!_settings.FallbackToReferenceLanguage || referenceLanguage == language)
159-
throw new TranslationsNotAvailableException(
160-
$"Translation not found, path: {_settings.Organization}, {_settings.Team}, {_settings.Project}, {language}");
161-
162-
_logger.Warn("Translations not found, trying to fetch reference language");
155+
if (!_settings.FallbackToReferenceLanguage)
156+
throw;
157+
}
158+
}
159+
160+
var referenceLanguage = await GetReferenceLanguage().ConfigureAwait(false);
163161

164-
language = referenceLanguage;
162+
if (!_settings.FallbackToReferenceLanguage || referenceLanguage == language)
163+
throw new TranslationsNotAvailableException(
164+
$"Translation not found, path: {_settings.Organization}, {_settings.Team}, {_settings.Project}, {language}");
165165

166-
continue;
167-
}
166+
_logger.Warn("Translations not found, trying to fetch reference language");
168167

169-
return _settings.IsDevMode ? cachedTranslations.ToDictionary(k => k.Key, k => k.Key) : cachedTranslations;
168+
language = referenceLanguage;
170169
}
171170
}
172171

@@ -200,33 +199,33 @@ public Task ClearCache()
200199

201200
private async Task<IEnumerable<Language>> FetchLanguagesAsync()
202201
{
203-
IEnumerable<Language>? cachedList = null;
202+
IEnumerable<Language>? foundList = null;
204203
var cachedListResponse = await _cachingService.GetLanguages().ConfigureAwait(false);
205204

206205
if (cachedListResponse.FoundInCache)
207206
{
208-
cachedList = cachedListResponse.Result;
207+
foundList = cachedListResponse.Result;
209208
}
210209
else
211210
{
212211
if (!_settings.UseCacheOnly)
213212
{
214-
cachedList = await _consumerHttpClient.GetLanguagesAsync().ConfigureAwait(false);
213+
foundList = await _consumerHttpClient.GetLanguagesAsync().ConfigureAwait(false);
215214

216-
if (cachedList != null && cachedList.Any())
215+
if (foundList != null && foundList.Any())
217216
{
218-
await _cachingService.StoreLanguagesAsync(cachedList);
217+
await _cachingService.StoreLanguagesAsync(foundList);
219218
}
220219
}
221220
}
222-
223-
if (cachedList == null || !cachedList.Any())
221+
222+
if (foundList == null || !foundList.Any())
224223
{
225224
throw new LanguagesNotAvailableException(
226225
$"Languages not found, path: {_settings.Organization}, {_settings.Team}, {_settings.Project}");
227226
}
228227

229-
return cachedList;
228+
return foundList;
230229
}
231230

232231
private static void ValidateSettings(CalingaServiceSettings setting)
@@ -236,6 +235,5 @@ private static void ValidateSettings(CalingaServiceSettings setting)
236235
Guard.IsNotNullOrWhiteSpace(setting.Organization);
237236
Guard.IsNotNullOrWhiteSpace(setting.CacheDirectory);
238237
}
239-
240238
}
241239
}

0 commit comments

Comments
 (0)