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>
/// <param name="id"></param>
/// <param name="token"></param>
/// <returns>если больше 0 - Id записи, если меньше 0 - код ошибки</returns>
/// <returns>количество добавленных, если меньше 0 - код ошибки</returns>
Task<int> DeleteAsync(int id, CancellationToken token);
}
#nullable disable

View File

@ -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;
}
/// <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())
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<Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry>(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;
}
/// <inheritdoc/>
@ -122,11 +129,14 @@ namespace AsbCloudInfrastructure.Services
.AsNoTracking()
.FirstOrDefaultAsync(e => e.Id == item.Id, token)
.ConfigureAwait(false);
if (existingEntity is null)
return ICrudService<TDto>.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<TDto>.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<TDto>();

View File

@ -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<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>
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<int> 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]

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);
}
}
}