using FluentAssertions; using Humanizer; using Nop.Core.Domain.Localization; using Nop.Core.Events; using Nop.Data; using Nop.Services.Events; using Nop.Services.Localization; using NUnit.Framework; namespace Nop.Tests.Nop.Services.Tests.Localization; [TestFixture] public class LocalizationServiceTests : ServiceTest { private ILocalizationService _localizationService; private IRepository _lsrRepository; private const string PREFIX = "Nop.Tests.Nop.Services.Tests.Localization"; private Dictionary _resources; [OneTimeSetUp] public void SetUp() { _localizationService = GetService(); _lsrRepository = GetService>(); _resources = new Dictionary { [$"{PREFIX}.Val1"] = "Value1", [$"{PREFIX}.Val2"] = "Value2", [$"{PREFIX}.Val3"] = "Value3" }; } [TearDown] public async Task TearDown() { await _localizationService.DeleteLocaleResourcesAsync(PREFIX); } protected IQueryable Filter(Dictionary resources, IQueryable query) { query = query.Where(p => resources.Keys.Select(k => k.ToLowerInvariant()).Contains(p.ResourceName)); return query; } [Test] public async Task CanAddOrUpdateLocaleResource() { var localeStringResources = await _lsrRepository.GetAllAsync(query => Filter(_resources, query)); localeStringResources.Any().Should().BeFalse(); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources); localeStringResources = await _lsrRepository.GetAllAsync(query => Filter(_resources, query)); localeStringResources.Any().Should().BeTrue(); localeStringResources.Count.Should().Be(3); } [Test] public async Task AddOrUpdateLocaleResourceShouldIgnoreKeyCase() { await _localizationService.AddOrUpdateLocaleResourceAsync(_resources); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources.ToDictionary(p => p.Key.ToUpperInvariant(), p => p.Value)); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources.ToDictionary(p => p.Key.ToLowerInvariant(), p => p.Value)); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources.ToDictionary(p => p.Key.Camelize(), p => p.Value)); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources.ToDictionary(p => p.Key.Pascalize(), p => p.Value)); var rez = _lsrRepository.Table .Where(p => p.ResourceName.StartsWith(PREFIX, StringComparison.InvariantCultureIgnoreCase)).ToList(); rez.Count.Should().Be(3); } [Test] public async Task AddOrUpdateLocaleResourceShouldNotIgnoreValueCase() { await _localizationService.AddOrUpdateLocaleResourceAsync(_resources); var rez = _lsrRepository.Table .Where(p => p.ResourceName.StartsWith(PREFIX, StringComparison.InvariantCultureIgnoreCase)).ToList(); rez.Count.Should().Be(3); rez.Count(p => p.ResourceValue == p.ResourceValue.ToUpperInvariant()).Should().Be(0); rez.Count(p => _resources.ContainsValue(p.ResourceValue)).Should().Be(3); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources.ToDictionary(p => p.Key.ToUpperInvariant(), p => p.Value.ToUpperInvariant())); rez = _lsrRepository.Table .Where(p => p.ResourceName.StartsWith(PREFIX, StringComparison.InvariantCultureIgnoreCase)).ToList(); rez.Count.Should().Be(3); rez.Count(p => p.ResourceValue == p.ResourceValue.ToUpperInvariant()).Should().Be(3); rez.Count(p => _resources.ContainsValue(p.ResourceValue)).Should().Be(0); } [Test] public async Task AddOrUpdateLocaleResourceShouldSkipAlreadyExistsResources() { LocaleResourceConsumer.UpdateCount = 0; await _localizationService.AddOrUpdateLocaleResourceAsync(_resources); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources.ToDictionary(p => p.Key.ToUpperInvariant(), p => p.Value)); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources.ToDictionary(p => p.Key.ToLowerInvariant(), p => p.Value)); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources.ToDictionary(p => p.Key.Camelize(), p => p.Value)); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources.ToDictionary(p => p.Key.Pascalize(), p => p.Value)); LocaleResourceConsumer.UpdateCount.Should().Be(0); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources.ToDictionary(p => p.Key.ToUpperInvariant(), p => p.Value.ToUpperInvariant())); LocaleResourceConsumer.UpdateCount.Should().Be(3); } [Test] public async Task AddOrUpdateLocaleResourceShouldApdateAllResorcesIfLangIdIsNull() { var languageService = GetService(); var language = new Language { Name = "test lang", LanguageCulture = "en" }; await languageService.InsertLanguageAsync(language); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources, 1); await _localizationService.AddOrUpdateLocaleResourceAsync(_resources, language.Id); LocaleResourceConsumer.UpdateCount = 0; await _localizationService.AddOrUpdateLocaleResourceAsync(_resources.ToDictionary(p => p.Key, p => p.Value.ToUpperInvariant()), null); await languageService.DeleteLanguageAsync(language); LocaleResourceConsumer.UpdateCount.Should().Be(6); } [Test] public async Task CanDeleteLocaleResources() { await _localizationService.AddOrUpdateLocaleResourceAsync(_resources); var rez = _lsrRepository.Table .Where(p => p.ResourceName.StartsWith(PREFIX, StringComparison.InvariantCultureIgnoreCase)).ToList(); rez.Count.Should().Be(3); await _localizationService.DeleteLocaleResourcesAsync(PREFIX); rez = _lsrRepository.Table .Where(p => p.ResourceName.StartsWith(PREFIX, StringComparison.InvariantCultureIgnoreCase)).ToList(); rez.Count.Should().Be(0); } [Test] public async Task DeleteLocaleResourcesShuoldIgnoreCase() { await _localizationService.AddOrUpdateLocaleResourceAsync(_resources); var rez = _lsrRepository.Table .Where(p => p.ResourceName.StartsWith(PREFIX, StringComparison.InvariantCultureIgnoreCase)).ToList(); rez.Count.Should().Be(3); await _localizationService.DeleteLocaleResourcesAsync(PREFIX.ToUpperInvariant()); rez = _lsrRepository.Table .Where(p => p.ResourceName.StartsWith(PREFIX, StringComparison.InvariantCultureIgnoreCase)).ToList(); rez.Count.Should().Be(0); } public class LocaleResourceConsumer : IConsumer> { public static int UpdateCount { get; set; } public Task HandleEventAsync(EntityUpdatedEvent eventMessage) { UpdateCount += 1; return Task.CompletedTask; } } }