138 lines
6.8 KiB
C#
138 lines
6.8 KiB
C#
|
using Contracts.DTO;
|
||
|
using Contracts.Repositories;
|
||
|
using Contracts.SearchModels;
|
||
|
using Contracts.ViewModels;
|
||
|
using Moq;
|
||
|
using Services.Domain;
|
||
|
using Services.Support.Exceptions;
|
||
|
using Services.Tests.Support.Fakes.Database;
|
||
|
using Services.Tests.Support.Fakes.Repositories;
|
||
|
|
||
|
namespace Services.Tests.Domain;
|
||
|
|
||
|
public class ChangeRecordServiceTests
|
||
|
{
|
||
|
[Theory]
|
||
|
[InlineData(50)]
|
||
|
[InlineData(-50)]
|
||
|
public async Task Create_WhenUserExists_ThenChangeBalance_ReturnsChangeRecordViewModel(int recordSum, int userBalance = 100)
|
||
|
{
|
||
|
var userRepoFake = new UserRepoFake();
|
||
|
var changeRecordRepoMock = new Mock<IChangeRecordRepo>();
|
||
|
changeRecordRepoMock.Setup(repo => repo.Create(It.IsAny<ChangeRecordDto>())).ReturnsAsync(new ChangeRecordDto());
|
||
|
var changeRecordService = new ChangeRecordService(changeRecordRepoMock.Object, userRepoFake);
|
||
|
// Add user
|
||
|
var user = new UserDto() { Id = Guid.NewGuid(), Balance = userBalance };
|
||
|
await userRepoFake.Create(user);
|
||
|
var changeRecord = new ChangeRecordDto { UserId = user.Id, Sum = recordSum, SpendingGroupId = Guid.NewGuid() };
|
||
|
|
||
|
var result = await changeRecordService.Create(changeRecord);
|
||
|
|
||
|
changeRecordRepoMock.Verify(repo => repo.Create(It.IsAny<ChangeRecordDto>()), Times.Once);
|
||
|
Assert.NotNull(result);
|
||
|
Assert.IsType<ChangeRecordViewModel>(result);
|
||
|
var existedUser = await userRepoFake.Get(new UserSearch { Id = user.Id });
|
||
|
Assert.Equal(existedUser.Balance, userBalance + recordSum);
|
||
|
|
||
|
DbFake.ClearDb();
|
||
|
}
|
||
|
|
||
|
[Theory]
|
||
|
[InlineData(50)]
|
||
|
[InlineData(-50)]
|
||
|
public async Task Delete_WhenUserExists_ThenChangeBalance_ReturnsChangeRecordViewModel(int recordSum, int userBalance = 100)
|
||
|
{
|
||
|
var user = new UserDto() { Id = Guid.NewGuid(), Balance = userBalance };
|
||
|
var changeRecord = new ChangeRecordDto { UserId = user.Id, Sum = recordSum, SpendingGroupId = Guid.NewGuid() };
|
||
|
var userRepoFake = new UserRepoFake();
|
||
|
var changeRecordRepoMock = new Mock<IChangeRecordRepo>();
|
||
|
changeRecordRepoMock.Setup(repo => repo.Delete(It.IsAny<ChangeRecordSearch>())).ReturnsAsync(changeRecord);
|
||
|
changeRecordRepoMock.Setup(repo => repo.Create(It.IsAny<ChangeRecordDto>())).ReturnsAsync(new ChangeRecordDto());
|
||
|
var changeRecordService = new ChangeRecordService(changeRecordRepoMock.Object, userRepoFake);
|
||
|
// Add user and record
|
||
|
await userRepoFake.Create(user);
|
||
|
await changeRecordService.Create(changeRecord);
|
||
|
|
||
|
var result = await changeRecordService.Delete(new ChangeRecordSearch { Id = changeRecord.Id });
|
||
|
|
||
|
changeRecordRepoMock.Verify(repo => repo.Delete(It.IsAny<ChangeRecordSearch>()), Times.Once);
|
||
|
Assert.NotNull(result);
|
||
|
Assert.IsType<ChangeRecordViewModel>(result);
|
||
|
var existedUser = await userRepoFake.Get(new UserSearch { Id = user.Id });
|
||
|
Assert.Equal(existedUser.Balance, userBalance);
|
||
|
|
||
|
DbFake.ClearDb();
|
||
|
}
|
||
|
|
||
|
[Fact]
|
||
|
public void Delete_WhenRecordNotFound_ThenThrowsEntityNotFoundException()
|
||
|
{
|
||
|
var changeRecordRepoMock = new Mock<IChangeRecordRepo>();
|
||
|
var userRepoMock = new Mock<IUserRepo>();
|
||
|
changeRecordRepoMock.Setup(repo => repo.Delete(It.IsAny<ChangeRecordSearch>())).ReturnsAsync((ChangeRecordDto)null);
|
||
|
var changeRecordService = new ChangeRecordService(changeRecordRepoMock.Object, userRepoMock.Object);
|
||
|
|
||
|
Assert.ThrowsAsync<EntityNotFoundException>(() => changeRecordService.Delete(new()));
|
||
|
}
|
||
|
|
||
|
[Fact]
|
||
|
public async Task GetList_ReturnsChangeRecordViewModels()
|
||
|
{
|
||
|
var changeRecordRepoMock = new Mock<IChangeRecordRepo>();
|
||
|
var userRepoMock = new Mock<IUserRepo>();
|
||
|
changeRecordRepoMock.Setup(repo => repo.GetList(It.IsAny<ChangeRecordSearch>())).ReturnsAsync(GetAllChangeRecords());
|
||
|
var changeRecordService = new ChangeRecordService(changeRecordRepoMock.Object, userRepoMock.Object);
|
||
|
|
||
|
var result = await changeRecordService.GetList();
|
||
|
|
||
|
changeRecordRepoMock.Verify(repo => repo.GetList(It.IsAny<ChangeRecordSearch>()), Times.Once);
|
||
|
Assert.NotNull(result);
|
||
|
Assert.IsType<List<ChangeRecordViewModel>>(result.ToList());
|
||
|
}
|
||
|
|
||
|
[Theory]
|
||
|
[InlineData(50, 25)]
|
||
|
[InlineData(-50, 25)]
|
||
|
public async Task Update_WhenUserExists_ThenChangeBalance_ReturnsChangeRecordViewModel(int recordSum, int recorNewSum, int userBalance = 100)
|
||
|
{
|
||
|
var user = new UserDto() { Id = Guid.NewGuid(), Balance = userBalance };
|
||
|
var changeRecord = new ChangeRecordDto { UserId = user.Id, Sum = recordSum, SpendingGroupId = Guid.NewGuid() };
|
||
|
var userRepoFake = new UserRepoFake();
|
||
|
var changeRecordRepoMock = new Mock<IChangeRecordRepo>();
|
||
|
changeRecordRepoMock.Setup(repo => repo.Update(It.IsAny<ChangeRecordDto>())).ReturnsAsync(changeRecord);
|
||
|
changeRecordRepoMock.Setup(repo => repo.Create(It.IsAny<ChangeRecordDto>())).ReturnsAsync(new ChangeRecordDto());
|
||
|
var changeRecordService = new ChangeRecordService(changeRecordRepoMock.Object, userRepoFake);
|
||
|
// Add user and record
|
||
|
await userRepoFake.Create(user);
|
||
|
await changeRecordService.Create(changeRecord);
|
||
|
var newChangeRecord = new ChangeRecordDto { Id = Guid.NewGuid(), UserId = user.Id, Sum = recorNewSum, SpendingGroupId = Guid.NewGuid() };
|
||
|
|
||
|
var result = await changeRecordService.Update(newChangeRecord);
|
||
|
|
||
|
changeRecordRepoMock.Verify(repo => repo.Update(It.IsAny<ChangeRecordDto>()), Times.Once);
|
||
|
Assert.NotNull(result);
|
||
|
Assert.IsType<ChangeRecordViewModel>(result);
|
||
|
var existedUser = await userRepoFake.Get(new UserSearch { Id = user.Id });
|
||
|
Assert.Equal(existedUser.Balance, userBalance + recorNewSum);
|
||
|
|
||
|
DbFake.ClearDb();
|
||
|
}
|
||
|
|
||
|
[Fact]
|
||
|
public void Update_WhenRecordNotExists_ThenThrowsEntityNotFoundException()
|
||
|
{
|
||
|
var changeRecordRepoMock = new Mock<IChangeRecordRepo>();
|
||
|
changeRecordRepoMock.Setup(repo => repo.Update(It.IsAny<ChangeRecordDto>())).ReturnsAsync((ChangeRecordDto?)null);
|
||
|
var userRepoMock = new Mock<IUserRepo>();
|
||
|
var changeRecordService = new ChangeRecordService(changeRecordRepoMock.Object, userRepoMock.Object);
|
||
|
var changeRecord = new ChangeRecordDto { Id = Guid.NewGuid(), UserId = Guid.NewGuid(), Sum = 50, SpendingGroupId = Guid.NewGuid() };
|
||
|
|
||
|
Assert.ThrowsAsync<EntityNotFoundException>(() => changeRecordService.Update(changeRecord));
|
||
|
}
|
||
|
|
||
|
public IEnumerable<ChangeRecordDto> GetAllChangeRecords() => new List<ChangeRecordDto>()
|
||
|
{
|
||
|
new ChangeRecordDto() { Id = Guid.NewGuid(), Sum = 50, SpendingGroupId = Guid.NewGuid(), UserId = Guid.NewGuid() },
|
||
|
new ChangeRecordDto() { Id = Guid.NewGuid(), Sum = 50, SpendingGroupId = Guid.NewGuid(), UserId = Guid.NewGuid() },
|
||
|
};
|
||
|
}
|