forked from ddrilling/AsbCloudServer
Add Crud service abstract test.
This commit is contained in:
parent
c9d150d3a9
commit
a8c4fa58e9
@ -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
|
||||||
|
@ -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>();
|
||||||
|
@ -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]
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user