Add Crud service abstract test.

This commit is contained in:
ngfrolov 2022-06-09 17:25:26 +05:00
parent c9d150d3a9
commit a8c4fa58e9
4 changed files with 70 additions and 41 deletions

View File

@ -69,7 +69,7 @@ namespace AsbCloudApp.Services
/// </summary> /// </summary>
/// <param name="id"></param> /// <param name="id"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <returns>если больше 0 - Id записи, если меньше 0 - код ошибки</returns> /// <returns>количество добавленных, если меньше 0 - код ошибки</returns>
Task<int> DeleteAsync(int id, CancellationToken token); Task<int> DeleteAsync(int id, CancellationToken token);
} }
#nullable disable #nullable disable

View File

@ -94,25 +94,32 @@ namespace AsbCloudInfrastructure.Services
{ {
var entity = Convert(item); var entity = Convert(item);
entity.Id = 0; entity.Id = 0;
dbSet.Add(entity); var entry = dbSet.Add(entity);
await dbContext.SaveChangesAsync(token); await dbContext.SaveChangesAsync(token);
entry.State = EntityState.Detached;
return entity.Id; return entity.Id;
} }
/// <inheritdoc/> /// <inheritdoc/>
public virtual Task<int> InsertRangeAsync(IEnumerable<TDto> items, CancellationToken token = default) public virtual async Task<int> InsertRangeAsync(IEnumerable<TDto> items, CancellationToken token = default)
{ {
if (!items.Any()) if (!items.Any())
return Task.FromResult(0); return 0;
var entities = items.Select(i => var entities = items.Select(i =>
{ {
var entity = Convert(i); var entity = Convert(i);
entity.Id = 0; entity.Id = 0;
return entity; return entity;
}); });
var entries = new List<Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry>(items.Count());
dbSet.AddRange(entities); foreach (var entity in entities)
return dbContext.SaveChangesAsync(token); {
var entry = dbSet.Add(entity);
entries.Add(entry);
}
var affected = await dbContext.SaveChangesAsync(token);
entries.ForEach(e => e.State = EntityState.Detached);
return affected;
} }
/// <inheritdoc/> /// <inheritdoc/>
@ -122,11 +129,14 @@ namespace AsbCloudInfrastructure.Services
.AsNoTracking() .AsNoTracking()
.FirstOrDefaultAsync(e => e.Id == item.Id, token) .FirstOrDefaultAsync(e => e.Id == item.Id, token)
.ConfigureAwait(false); .ConfigureAwait(false);
if (existingEntity is null) if (existingEntity is null)
return ICrudService<TDto>.ErrorIdNotFound; return ICrudService<TDto>.ErrorIdNotFound;
var entity = Convert(item); var entity = Convert(item);
var entry = dbSet.Update(entity); var entry = dbSet.Update(entity);
await dbContext.SaveChangesAsync(token); await dbContext.SaveChangesAsync(token);
entry.State = EntityState.Detached;
return entry.Entity.Id; return entry.Entity.Id;
} }
@ -138,8 +148,10 @@ namespace AsbCloudInfrastructure.Services
.FirstOrDefault(e => e.Id == id); .FirstOrDefault(e => e.Id == id);
if (entity == default) if (entity == default)
return Task.FromResult(ICrudService<TDto>.ErrorIdNotFound); return Task.FromResult(ICrudService<TDto>.ErrorIdNotFound);
dbSet.Remove(entity); var entry = dbSet.Remove(entity);
return dbContext.SaveChangesAsync(token); var affected = dbContext.SaveChangesAsync(token);
entry.State = EntityState.Detached;
return affected;
} }
protected virtual TDto Convert(TEntity src) => src.Adapt<TDto>(); protected virtual TDto Convert(TEntity src) => src.Adapt<TDto>();

View File

@ -1,7 +1,5 @@
using AsbCloudApp.Data; using AsbCloudApp.Services;
using AsbCloudApp.Services; using System;
using AsbCloudDb.Model;
using AsbCloudInfrastructure.Services;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -9,27 +7,6 @@ using Xunit;
namespace AsbCloudWebApi.Tests.ServicesTests namespace AsbCloudWebApi.Tests.ServicesTests
{ {
public class DepositCrudServiceTest : CrudServiceTestAbstract<DepositDto>
{
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<DepositDto> MakeService()
{
var dbContext = TestHelpter.MakeTestContext();
return new CrudCacheServiceBase<DepositDto, Deposit>(dbContext);
}
}
public abstract class CrudServiceTestAbstract<TDto> public abstract class CrudServiceTestAbstract<TDto>
where TDto: AsbCloudApp.Data.IId where TDto: AsbCloudApp.Data.IId
{ {
@ -37,6 +14,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests
public CrudServiceTestAbstract() public CrudServiceTestAbstract()
{ {
AsbCloudInfrastructure.DependencyInjection.MapsterSetup();
service = MakeService(); service = MakeService();
} }
@ -44,11 +22,12 @@ namespace AsbCloudWebApi.Tests.ServicesTests
protected abstract TDto MakeNewItem(); protected abstract TDto MakeNewItem();
[Fact] [Fact]
public async Task Insert() public async Task<int> Insert()
{ {
var newItem = MakeNewItem(); var newItem = MakeNewItem();
var id = await service.InsertAsync(newItem, CancellationToken.None); var id = await service.InsertAsync(newItem, CancellationToken.None);
Assert.True(id > 0); Assert.True(id > 0);
return id;
} }
[Fact] [Fact]
@ -64,8 +43,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests
[Fact] [Fact]
public async Task GetById() public async Task GetById()
{ {
var newItem = MakeNewItem(); var id = await Insert();
var id = await service.InsertAsync(newItem, CancellationToken.None);
var gotItem = await service.GetAsync(id, CancellationToken.None); var gotItem = await service.GetAsync(id, CancellationToken.None);
Assert.True(id > 0); Assert.True(id > 0);
Assert.Equal(id, gotItem.Id); Assert.Equal(id, gotItem.Id);
@ -83,14 +61,25 @@ namespace AsbCloudWebApi.Tests.ServicesTests
Assert.Equal(count + 1, newCount); 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] [Fact]
public async Task UpdateAsync() public async Task UpdateAsync()
{ {
var newItem = MakeNewItem(); var newItem = MakeNewItem();
var id = await service.InsertAsync(newItem, CancellationToken.None); newItem.Id = await service.InsertAsync(newItem, CancellationToken.None);
var updatedId = await service.UpdateAsync(newItem, CancellationToken.None); var item = MakeNewItem();
Assert.True(id > 0); item.Id = newItem.Id;
Assert.Equal(id, updatedId); var updatedId = await service.UpdateAsync(item, CancellationToken.None);
Assert.True(newItem.Id > 0);
Assert.Equal(newItem.Id, updatedId);
} }
[Fact] [Fact]

View File

@ -0,0 +1,28 @@
using AsbCloudApp.Data;
using AsbCloudApp.Services;
using AsbCloudDb.Model;
using AsbCloudInfrastructure.Services;
namespace AsbCloudWebApi.Tests.ServicesTests
{
public class DepositCrudCacheServiceTest : CrudServiceTestAbstract<DepositDto>
{
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<DepositDto> MakeService()
{
var dbContext = TestHelpter.MakeTestContext();
return new CrudCacheServiceBase<DepositDto, Deposit>(dbContext);
}
}
}