using System.Linq.Expressions; using FluentAssertions; using Nop.Core.Caching; using Nop.Core.Domain.Catalog; using Nop.Core.Domain.Gdpr; using Nop.Core.Domain.Tax; using Nop.Data; using NUnit.Framework; namespace Nop.Tests.Nop.Data.Tests; [TestFixture] public class EntityRepositoryTests : BaseNopTest { private IStaticCacheManager _cacheManager; private CacheKey _cacheKey; [OneTimeSetUp] public void SetUp() { _cacheManager = GetService(); _cacheKey = new CacheKey("EntityRepositoryTestsCacheKey"); } [TearDown] public async Task TearDown() { try { var productRepository = GetService>(); var product = await productRepository.GetByIdAsync(2); product.Deleted = false; await productRepository.UpdateAsync(product); await _cacheManager.ClearAsync(); } catch { //ignore } SetDataProviderType(DataProviderType.Unknown); } [Test] [TestCase(DataProviderType.Unknown)] [TestCase(DataProviderType.SqlServer)] [TestCase(DataProviderType.MySql)] [TestCase(DataProviderType.PostgreSQL)] public async Task CanGetById(DataProviderType type) { if (!SetDataProviderType(type)) return; var productRepository = GetService>(); var product = await productRepository.GetByIdAsync(1); product.Should().NotBeNull(); product = await productRepository.GetByIdAsync(2); product.Deleted = true; await productRepository.UpdateAsync(product); product = await productRepository.GetByIdAsync(2); product.Should().NotBeNull(); product = await productRepository.GetByIdAsync(2, includeDeleted: false); product.Should().BeNull(); product = await _cacheManager.GetAsync(_cacheKey, default(Product)); product.Should().BeNull(); await productRepository.GetByIdAsync(1, _ => _cacheKey); product = await _cacheManager.GetAsync(_cacheKey, default(Product)); product.Should().NotBeNull(); } [Test] [TestCase(DataProviderType.Unknown)] [TestCase(DataProviderType.SqlServer)] [TestCase(DataProviderType.MySql)] [TestCase(DataProviderType.PostgreSQL)] public async Task CanGetByIds(DataProviderType type) { if (!SetDataProviderType(type)) return; var productRepository = GetService>(); var product = await productRepository.GetByIdAsync(2); product.Deleted = true; await productRepository.UpdateAsync(product); var ids = new List { 1, 2, 3 }; var products = await productRepository.GetByIdsAsync(ids); products.Count.Should().Be(3); products = await productRepository.GetByIdsAsync(ids, includeDeleted: false); products.Count.Should().Be(2); products = await _cacheManager.GetAsync(_cacheKey, default(IList)); products.Should().BeNull(); await productRepository.GetByIdsAsync(ids, _ => _cacheKey); products = await _cacheManager.GetAsync(_cacheKey, default(IList)); products.Count.Should().Be(3); } [Test] [TestCase(DataProviderType.Unknown)] [TestCase(DataProviderType.SqlServer)] [TestCase(DataProviderType.MySql)] [TestCase(DataProviderType.PostgreSQL)] public async Task CanGetAll(DataProviderType type) { if (!SetDataProviderType(type)) return; var productRepository = GetService>(); var product = await productRepository.GetByIdAsync(2); product.Deleted = true; await productRepository.UpdateAsync(product); var asyncRez = await productRepository.GetAllAsync(query => query, null); asyncRez.Count.Should().BeGreaterThan(0); var taskRez = await productRepository.GetAllAsync(Task.FromResult); taskRez.Count.Should().BeGreaterThan(0); var rez = productRepository.GetAll(query => query, manager => _cacheKey); rez.Count.Should().BeGreaterThan(0); rez = productRepository.GetAll(query => query); rez.Count.Should().BeGreaterThan(0); asyncRez.Count.Should().Be(rez.Count); rez.Count.Should().Be(taskRez.Count); rez = await productRepository.GetAllAsync(Task.FromResult, manager => Task.FromResult(_cacheKey)); rez.Count.Should().BeGreaterThan(0); var fullCount = rez.Count; await _cacheManager.RemoveAsync(_cacheKey); rez = await productRepository.GetAllAsync(Task.FromResult, manager => Task.FromResult(default(CacheKey)), false); rez.Count.Should().BeGreaterThan(0); rez.Count.Should().BeLessThan(fullCount); } [Test] [TestCase(DataProviderType.Unknown)] [TestCase(DataProviderType.SqlServer)] [TestCase(DataProviderType.MySql)] [TestCase(DataProviderType.PostgreSQL)] public async Task CanGetAllPaged(DataProviderType type) { if (!SetDataProviderType(type)) return; var productRepository = GetService>(); var product = await productRepository.GetByIdAsync(2); product.Deleted = true; await productRepository.UpdateAsync(product); var rez = await productRepository.GetAllPagedAsync(query => query); rez.Count.Should().BeGreaterThan(0); var fullCount = rez.Count; rez = await productRepository.GetAllPagedAsync(query => query, includeDeleted: false); rez.Count.Should().BeGreaterThan(0); rez.Count.Should().BeLessThan(fullCount); } [Test] [TestCase(DataProviderType.Unknown)] [TestCase(DataProviderType.SqlServer)] [TestCase(DataProviderType.MySql)] [TestCase(DataProviderType.PostgreSQL)] public async Task CanInsert(DataProviderType type) { if (!SetDataProviderType(type)) return; var taxCategoryRepository = GetService>(); var taxCategory = new TaxCategory { DisplayOrder = 10, Name = "test tax category" }; taxCategory.Id.Should().Be(0); await taxCategoryRepository.InsertAsync(taxCategory); await taxCategoryRepository.DeleteAsync(taxCategory); taxCategory.Id.Should().BeGreaterThan(0); Assert.Throws(() => taxCategoryRepository.InsertAsync(default(TaxCategory)).Wait()); } [Test] [TestCase(DataProviderType.Unknown)] [TestCase(DataProviderType.SqlServer)] [TestCase(DataProviderType.MySql)] [TestCase(DataProviderType.PostgreSQL)] public async Task CanUpdate(DataProviderType type) { if (!SetDataProviderType(type)) return; var taxCategoryRepository = GetService>(); var taxCategory = new TaxCategory { DisplayOrder = 10, Name = "test tax category" }; taxCategory.Id.Should().Be(0); await taxCategoryRepository.InsertAsync(taxCategory); await taxCategoryRepository.UpdateAsync(new TaxCategory { Id = taxCategory.Id, Name = "Updated test tax category" }); var updatedTaxCategory = await taxCategoryRepository.GetByIdAsync(taxCategory.Id); await taxCategoryRepository.DeleteAsync(taxCategory); taxCategory.Id.Should().BeGreaterThan(0); updatedTaxCategory.Name.Should().NotBeEquivalentTo(taxCategory.Name); } [Test] [TestCase(DataProviderType.Unknown)] [TestCase(DataProviderType.SqlServer)] [TestCase(DataProviderType.MySql)] [TestCase(DataProviderType.PostgreSQL)] public async Task CanDelete(DataProviderType type) { if (!SetDataProviderType(type)) return; var taxCategoryRepository = GetService>(); var taxCategory = new TaxCategory { DisplayOrder = 10, Name = "test tax category" }; await taxCategoryRepository.InsertAsync(taxCategory); await taxCategoryRepository.DeleteAsync(taxCategory); taxCategory.Id.Should().BeGreaterThan(0); taxCategory = await taxCategoryRepository.GetByIdAsync(taxCategory.Id); taxCategory.Should().BeNull(); Assert.Throws(() => taxCategoryRepository.DeleteAsync(default(TaxCategory)).Wait()); Assert.Throws(() => taxCategoryRepository.DeleteAsync(default(IList)).Wait()); Assert.Throws(() => taxCategoryRepository.DeleteAsync((Expression>)null).Wait()); } [Test] [TestCase(DataProviderType.Unknown)] [TestCase(DataProviderType.SqlServer)] [TestCase(DataProviderType.MySql)] [TestCase(DataProviderType.PostgreSQL)] public async Task CanLoadOriginalCopy(DataProviderType type) { if (!SetDataProviderType(type)) return; var productRepository = GetService>(); var product = await productRepository.GetByIdAsync(1, _ => default); product.Name = "test name"; var productNew = await productRepository.GetByIdAsync(1, _ => default); var productOld = await productRepository.LoadOriginalCopyAsync(product); productOld.Name.Should().NotBeEquivalentTo(productNew.Name); } [Test] [TestCase(DataProviderType.Unknown)] [TestCase(DataProviderType.SqlServer)] [TestCase(DataProviderType.MySql)] [TestCase(DataProviderType.PostgreSQL)] public async Task CanTruncate(DataProviderType type) { if (!SetDataProviderType(type)) return; var gdprConsentRepository = GetService>(); await gdprConsentRepository.InsertAsync(new List { new() {Message = "Test message 1"}, new() {Message = "Test message 2"}, new() {Message = "Test message 3"}, new() {Message = "Test message 4"}, new() {Message = "Test message 5"} }); var rezWithContent = await gdprConsentRepository.GetAllAsync(query => query); await gdprConsentRepository.TruncateAsync(); var rezWithoutContent = await gdprConsentRepository.GetAllAsync(query => query); var gdprConsent1 = new GdprConsent { Message = "Test message 1" }; var gdprConsent2 = new GdprConsent { Message = "Test message 2" }; await gdprConsentRepository.InsertAsync(gdprConsent1); await gdprConsentRepository.TruncateAsync(true); await gdprConsentRepository.InsertAsync(gdprConsent2); await gdprConsentRepository.TruncateAsync(true); rezWithContent.Count.Should().Be(5); rezWithoutContent.Count.Should().Be(0); gdprConsent1.Id.Should().NotBe(1); gdprConsent2.Id.Should().Be(1); } }