From a8c4fa58e919c8eb11f61f2bab89d8a67f11a1f8 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 9 Jun 2022 17:25:26 +0500 Subject: [PATCH] Add Crud service abstract test. --- AsbCloudApp/Services/ICrudService.cs | 2 +- .../Services/CrudServiceBase.cs | 28 +++++++--- ...viceTest.cs => CrudServiceTestAbstract.cs} | 53 ++++++++----------- .../DepositCrudCacheServiceTest.cs | 28 ++++++++++ 4 files changed, 70 insertions(+), 41 deletions(-) rename AsbCloudWebApi.Tests/ServicesTests/{CrudServiceTest.cs => CrudServiceTestAbstract.cs} (64%) create mode 100644 AsbCloudWebApi.Tests/ServicesTests/DepositCrudCacheServiceTest.cs diff --git a/AsbCloudApp/Services/ICrudService.cs b/AsbCloudApp/Services/ICrudService.cs index 859e8fd4..37dff698 100644 --- a/AsbCloudApp/Services/ICrudService.cs +++ b/AsbCloudApp/Services/ICrudService.cs @@ -69,7 +69,7 @@ namespace AsbCloudApp.Services /// /// /// - /// если больше 0 - Id записи, если меньше 0 - код ошибки + /// количество добавленных, если меньше 0 - код ошибки Task DeleteAsync(int id, CancellationToken token); } #nullable disable diff --git a/AsbCloudInfrastructure/Services/CrudServiceBase.cs b/AsbCloudInfrastructure/Services/CrudServiceBase.cs index 57cda971..c3e9fdb2 100644 --- a/AsbCloudInfrastructure/Services/CrudServiceBase.cs +++ b/AsbCloudInfrastructure/Services/CrudServiceBase.cs @@ -94,25 +94,32 @@ namespace AsbCloudInfrastructure.Services { var entity = Convert(item); entity.Id = 0; - dbSet.Add(entity); + var entry = dbSet.Add(entity); await dbContext.SaveChangesAsync(token); + entry.State = EntityState.Detached; return entity.Id; } /// - public virtual Task InsertRangeAsync(IEnumerable items, CancellationToken token = default) + public virtual async Task InsertRangeAsync(IEnumerable items, CancellationToken token = default) { if (!items.Any()) - return Task.FromResult(0); + return 0; var entities = items.Select(i => { var entity = Convert(i); entity.Id = 0; return entity; }); - - dbSet.AddRange(entities); - return dbContext.SaveChangesAsync(token); + var entries = new List(items.Count()); + foreach (var entity in entities) + { + var entry = dbSet.Add(entity); + entries.Add(entry); + } + var affected = await dbContext.SaveChangesAsync(token); + entries.ForEach(e => e.State = EntityState.Detached); + return affected; } /// @@ -122,11 +129,14 @@ namespace AsbCloudInfrastructure.Services .AsNoTracking() .FirstOrDefaultAsync(e => e.Id == item.Id, token) .ConfigureAwait(false); + if (existingEntity is null) return ICrudService.ErrorIdNotFound; + var entity = Convert(item); var entry = dbSet.Update(entity); await dbContext.SaveChangesAsync(token); + entry.State = EntityState.Detached; return entry.Entity.Id; } @@ -138,8 +148,10 @@ namespace AsbCloudInfrastructure.Services .FirstOrDefault(e => e.Id == id); if (entity == default) return Task.FromResult(ICrudService.ErrorIdNotFound); - dbSet.Remove(entity); - return dbContext.SaveChangesAsync(token); + var entry = dbSet.Remove(entity); + var affected = dbContext.SaveChangesAsync(token); + entry.State = EntityState.Detached; + return affected; } protected virtual TDto Convert(TEntity src) => src.Adapt(); diff --git a/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTestAbstract.cs similarity index 64% rename from AsbCloudWebApi.Tests/ServicesTests/CrudServiceTest.cs rename to AsbCloudWebApi.Tests/ServicesTests/CrudServiceTestAbstract.cs index 0b94eaf1..043af57f 100644 --- a/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTest.cs +++ b/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTestAbstract.cs @@ -1,7 +1,5 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Services; -using AsbCloudDb.Model; -using AsbCloudInfrastructure.Services; +using AsbCloudApp.Services; +using System; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -9,27 +7,6 @@ using Xunit; namespace AsbCloudWebApi.Tests.ServicesTests { - public class DepositCrudServiceTest : CrudServiceTestAbstract - { - protected override DepositDto MakeNewItem() - { - var item = new DepositDto - { - Caption = "test deposit", - Latitude = 1, - Longitude = 2, - Timezone = new SimpleTimezoneDto { Hours = 5, TimezoneId = "test Never-land"} - }; - return item; - } - - protected override ICrudService MakeService() - { - var dbContext = TestHelpter.MakeTestContext(); - return new CrudCacheServiceBase(dbContext); - } - } - public abstract class CrudServiceTestAbstract where TDto: AsbCloudApp.Data.IId { @@ -37,6 +14,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests public CrudServiceTestAbstract() { + AsbCloudInfrastructure.DependencyInjection.MapsterSetup(); service = MakeService(); } @@ -44,11 +22,12 @@ namespace AsbCloudWebApi.Tests.ServicesTests protected abstract TDto MakeNewItem(); [Fact] - public async Task Insert() + public async Task Insert() { var newItem = MakeNewItem(); var id = await service.InsertAsync(newItem, CancellationToken.None); Assert.True(id > 0); + return id; } [Fact] @@ -64,8 +43,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests [Fact] public async Task GetById() { - var newItem = MakeNewItem(); - var id = await service.InsertAsync(newItem, CancellationToken.None); + var id = await Insert(); var gotItem = await service.GetAsync(id, CancellationToken.None); Assert.True(id > 0); Assert.Equal(id, gotItem.Id); @@ -83,14 +61,25 @@ namespace AsbCloudWebApi.Tests.ServicesTests Assert.Equal(count + 1, newCount); } + [Fact] + public async Task UpdateAsync_returns_notfound() + { + var item = MakeNewItem(); + item.Id = int.MaxValue - 1; + var updatedId = await service.UpdateAsync(item, CancellationToken.None); + Assert.True(updatedId < 0); + } + [Fact] public async Task UpdateAsync() { var newItem = MakeNewItem(); - var id = await service.InsertAsync(newItem, CancellationToken.None); - var updatedId = await service.UpdateAsync(newItem, CancellationToken.None); - Assert.True(id > 0); - Assert.Equal(id, updatedId); + newItem.Id = await service.InsertAsync(newItem, CancellationToken.None); + var item = MakeNewItem(); + item.Id = newItem.Id; + var updatedId = await service.UpdateAsync(item, CancellationToken.None); + Assert.True(newItem.Id > 0); + Assert.Equal(newItem.Id, updatedId); } [Fact] diff --git a/AsbCloudWebApi.Tests/ServicesTests/DepositCrudCacheServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/DepositCrudCacheServiceTest.cs new file mode 100644 index 00000000..d7769352 --- /dev/null +++ b/AsbCloudWebApi.Tests/ServicesTests/DepositCrudCacheServiceTest.cs @@ -0,0 +1,28 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services; + +namespace AsbCloudWebApi.Tests.ServicesTests +{ + public class DepositCrudCacheServiceTest : CrudServiceTestAbstract + { + protected override DepositDto MakeNewItem() + { + var item = new DepositDto + { + Caption = "test deposit", + Latitude = 1, + Longitude = 2, + Timezone = new SimpleTimezoneDto { Hours = 5, TimezoneId = "test Never-land"} + }; + return item; + } + + protected override ICrudService MakeService() + { + var dbContext = TestHelpter.MakeTestContext(); + return new CrudCacheServiceBase(dbContext); + } + } +}