persistence/DD.Persistence.Test/ChangeLogTest.cs

306 lines
10 KiB
C#
Raw Normal View History

using DD.Persistence.Database.Repositories;
using DD.Persistence.Models.ChangeLog;
2025-02-19 17:44:48 +05:00
using DD.Persistence.Models.Common;
using DD.Persistence.Models.Requests;
using DD.Persistence.Repositories;
using DD.Persistence.Services;
2025-02-19 17:44:48 +05:00
using Microsoft.Extensions.Caching.Memory;
using NSubstitute;
using UuidExtensions;
namespace DD.Persistence.Test;
public class ChangeLogTest
{
private readonly IChangeLogCommitRepository changeLogCommitRepository = Substitute.For<IChangeLogCommitRepository>();
private readonly IChangeLogRepository changeLogRepository = Substitute.For<IChangeLogRepository>();
private ChangeLogService service;
public ChangeLogTest()
{
var memoryCache = new MemoryCache(new MemoryCacheOptions());
2025-02-19 17:44:48 +05:00
service = new ChangeLogService(memoryCache, changeLogCommitRepository, changeLogRepository);
}
[Fact]
public async Task AddRange()
{
//arrange
2025-02-19 17:44:48 +05:00
var discriminatorId = Uuid7.Guid();
2025-03-03 11:47:29 +05:00
var commitRequest = new ChangeLogCommitCreateRequest(discriminatorId, Uuid7.Guid(), "Добавление нескольких значений");
var commit = new ChangeLogCommitDto() {
IdAuthor = commitRequest.IdAuthor,
Comment = commitRequest.Comment
};
commit.Id = Uuid7.Guid();
2025-03-03 11:47:29 +05:00
var dtos = GenerateChangeLogRequests(2);
2025-02-19 17:44:48 +05:00
changeLogCommitRepository.Add(Arg.Any<ChangeLogCommitCreateRequest>(), Arg.Any<CancellationToken>()).Returns(commit);
2025-02-19 17:44:48 +05:00
changeLogRepository
.AddRange(
Arg.Any<ChangeLogCommitDto>(),
2025-03-07 15:28:02 +05:00
Arg.Any<IEnumerable<IDictionary<string, object>>>(),
2025-02-19 17:44:48 +05:00
Arg.Any<CancellationToken>())
.Returns(2);
//act
2025-02-19 17:44:48 +05:00
var addRangeResult = await service
2025-03-03 11:47:29 +05:00
.AddRange(commitRequest, dtos, CancellationToken.None);
addRangeResult = await service
2025-03-03 11:47:29 +05:00
.AddRange(commitRequest, dtos, CancellationToken.None);
2025-02-19 17:44:48 +05:00
//assert
2025-02-21 12:25:22 +05:00
await changeLogCommitRepository.Received(1).Add(commitRequest, CancellationToken.None);
2025-03-03 11:47:29 +05:00
await changeLogRepository.Received(2).AddRange(Arg.Any<ChangeLogCommitDto>(), dtos, CancellationToken.None);
2025-02-19 17:44:48 +05:00
}
[Fact]
public async Task UpdateRange()
{
//arrange
2025-02-19 17:44:48 +05:00
var discriminatorId = Uuid7.Guid();
2025-03-03 11:47:29 +05:00
var commitRequest = new ChangeLogCommitCreateRequest(discriminatorId, Uuid7.Guid(), "Изменение нескольких значений");
var commit = new ChangeLogCommitDto() {
IdAuthor = commitRequest.IdAuthor,
Comment = commitRequest.Comment
};
commit.Id = Uuid7.Guid();
2025-02-19 17:44:48 +05:00
var dtos = GenerateChangeLogValuesDto(2);
changeLogCommitRepository.Add(Arg.Any<ChangeLogCommitCreateRequest>(), Arg.Any<CancellationToken>()).Returns(commit);
2025-02-19 17:44:48 +05:00
changeLogRepository
.UpdateRange(
Arg.Any<ChangeLogCommitDto>(),
Arg.Any<IEnumerable<ChangeLogBaseDto>>(),
2025-02-19 17:44:48 +05:00
Arg.Any<CancellationToken>())
.Returns(2);
2025-02-21 12:25:22 +05:00
//act
2025-02-19 17:44:48 +05:00
var updateRangeResult = await service
2025-03-03 11:47:29 +05:00
.UpdateRange(commitRequest, dtos, CancellationToken.None);
2025-02-19 17:44:48 +05:00
updateRangeResult = await service
2025-03-03 11:47:29 +05:00
.UpdateRange(commitRequest, dtos, CancellationToken.None);
updateRangeResult = await service
2025-03-03 11:47:29 +05:00
.UpdateRange(commitRequest, dtos, CancellationToken.None);
//assert
2025-02-21 12:25:22 +05:00
await changeLogCommitRepository.Received(1).Add(commitRequest, CancellationToken.None);
await changeLogRepository.Received(3).UpdateRange(Arg.Any<ChangeLogCommitDto>(), dtos, CancellationToken.None);
2025-02-19 17:44:48 +05:00
}
[Fact]
public async Task MarkAsDeleted()
{
//arrange
2025-02-19 17:44:48 +05:00
var discriminatorId = Uuid7.Guid();
2025-03-03 11:47:29 +05:00
var commitRequest = new ChangeLogCommitCreateRequest(discriminatorId, Uuid7.Guid(), "Удаление нескольких значений");
var commit = new ChangeLogCommitDto()
{
IdAuthor = commitRequest.IdAuthor,
Comment = commitRequest.Comment
};
commit.Id = Uuid7.Guid();
2025-02-19 17:44:48 +05:00
var dtos = GenerateChangeLogValuesDto(2);
var dtoIds = dtos.Select(d => d.Id);
changeLogCommitRepository.Add(Arg.Any<ChangeLogCommitCreateRequest>(), Arg.Any<CancellationToken>()).Returns(commit);
2025-02-19 17:44:48 +05:00
changeLogRepository
.MarkAsDeleted(
Arg.Any<IEnumerable<Guid>>(),
Arg.Any<ChangeLogCommitDto>(),
2025-02-19 17:44:48 +05:00
Arg.Any<CancellationToken>())
.Returns(2);
//act
2025-02-19 17:44:48 +05:00
var markAsDeletedResult = await service
2025-03-03 11:47:29 +05:00
.MarkAsDeleted(dtoIds, commitRequest, CancellationToken.None);
markAsDeletedResult = await service
2025-03-03 11:47:29 +05:00
.MarkAsDeleted(dtoIds, commitRequest, CancellationToken.None);
2025-02-19 17:44:48 +05:00
//assert
2025-02-21 12:25:22 +05:00
await changeLogCommitRepository.Received(1).Add(commitRequest, CancellationToken.None);
await changeLogRepository.Received(2).MarkAsDeleted(dtoIds, commit, CancellationToken.None);
2025-02-19 17:44:48 +05:00
}
[Fact]
public async Task ClearAndAddRange()
{
//arrange
2025-02-19 17:44:48 +05:00
var discriminatorId = Uuid7.Guid();
2025-03-03 11:47:29 +05:00
var commitRequest = new ChangeLogCommitCreateRequest(discriminatorId, Uuid7.Guid(), "Удаление и добавление нескольких значений");
var commit = new ChangeLogCommitDto() {
IdAuthor = commitRequest.IdAuthor,
Comment = commitRequest.Comment
};
commit.Id = Uuid7.Guid();
2025-03-03 11:47:29 +05:00
var dtos = GenerateChangeLogRequests(2);
2025-02-19 17:44:48 +05:00
changeLogCommitRepository.Add(Arg.Any<ChangeLogCommitCreateRequest>(), Arg.Any<CancellationToken>()).Returns(commit);
2025-02-19 17:44:48 +05:00
changeLogRepository
.ClearAndAddRange(
Arg.Any<ChangeLogCommitDto>(),
2025-03-07 15:28:02 +05:00
Arg.Any<IEnumerable<IDictionary<string, object>>>(),
2025-02-19 17:44:48 +05:00
Arg.Any<CancellationToken>())
.Returns(2);
//act
2025-02-19 17:44:48 +05:00
var clearAndAddResult = await service
2025-03-03 11:47:29 +05:00
.ClearAndAddRange(commitRequest, dtos, CancellationToken.None);
clearAndAddResult = await service
2025-03-03 11:47:29 +05:00
.ClearAndAddRange(commitRequest, dtos, CancellationToken.None);
2025-02-19 17:44:48 +05:00
//assert
2025-02-21 12:25:22 +05:00
await changeLogCommitRepository.Received(1).Add(commitRequest, CancellationToken.None);
2025-03-03 11:47:29 +05:00
await changeLogRepository.Received(2).ClearAndAddRange(Arg.Any<ChangeLogCommitDto>(), dtos, CancellationToken.None);
2025-02-19 17:44:48 +05:00
}
[Fact]
public async Task GetByDate()
{
//arrange
2025-02-19 17:44:48 +05:00
var discriminatorId = Uuid7.Guid();
var paginationRequest = new PaginationRequest()
{
Skip = 0,
Take = 1000
};
var dtos = GenerateChangeLogValuesDto(5);
var items = new PaginationContainer<ChangeLogBaseDto>()
2025-02-19 17:44:48 +05:00
{
Take = paginationRequest.Take,
Skip = paginationRequest.Skip,
Items = dtos,
Count = 10
};
var momentDate = DateTime.UtcNow;
changeLogRepository
.GetByDate(
Arg.Any<Guid>(),
Arg.Any<DateTimeOffset>(),
Arg.Any<PaginationRequest>(),
Arg.Any<CancellationToken>())
.Returns(items);
//act
2025-02-19 17:44:48 +05:00
var actualItems = await service
.GetByDate(discriminatorId, momentDate, paginationRequest, CancellationToken.None);
//assert
2025-02-19 17:44:48 +05:00
await changeLogRepository.Received(1).GetByDate(discriminatorId, momentDate, paginationRequest, CancellationToken.None);
}
[Fact]
public async Task GetChangeLogForInterval()
{
//arrange
2025-02-19 17:44:48 +05:00
var discriminatorId = Uuid7.Guid();
var dtos = GenerateChangeLogDto(5);
2025-02-19 17:44:48 +05:00
var dateBegin = DateTimeOffset.UtcNow.AddDays(-5);
var dateEnd = DateTimeOffset.UtcNow;
changeLogCommitRepository
2025-02-19 17:44:48 +05:00
.GetChangeLogForInterval(
Arg.Any<Guid>(),
Arg.Any<DateTimeOffset>(),
Arg.Any<DateTimeOffset>(),
Arg.Any<CancellationToken>())
.Returns(dtos);
//act
2025-02-19 17:44:48 +05:00
var actualItems = await service
.GetChangeLogForInterval(discriminatorId, dateBegin, dateEnd, CancellationToken.None);
//assert
await changeLogCommitRepository.Received(1).GetChangeLogForInterval(discriminatorId, dateBegin, dateEnd, CancellationToken.None);
2025-02-19 17:44:48 +05:00
}
[Fact]
public async Task GetDatesChange()
{
//arrange
2025-02-19 17:44:48 +05:00
var discriminatorId = Uuid7.Guid();
var dateBegin = DateTimeOffset.UtcNow.AddDays(-5);
var dateEnd = DateTimeOffset.UtcNow;
var dateOnlyBegin = new DateOnly(dateBegin.Year, dateBegin.Month, dateBegin.Day);
var dateOnlyEnd = new DateOnly(dateEnd.Year, dateEnd.Month, dateEnd.Day);
var dtos = new List<DateOnly>() { dateOnlyBegin, dateOnlyEnd };
2025-02-19 17:44:48 +05:00
changeLogCommitRepository
2025-02-19 17:44:48 +05:00
.GetDatesChange(
Arg.Any<Guid>(),
Arg.Any<CancellationToken>())
.Returns(dtos);
//act
2025-02-19 17:44:48 +05:00
var actualItems = await service
.GetDatesChange(discriminatorId, CancellationToken.None);
//assert
await changeLogCommitRepository.Received(1).GetDatesChange(discriminatorId, CancellationToken.None);
2025-02-19 17:44:48 +05:00
}
private IEnumerable<ChangeLogBaseDto> GenerateChangeLogValuesDto(int count)
2025-02-19 17:44:48 +05:00
{
var items = new List<ChangeLogBaseDto>();
2025-02-19 17:44:48 +05:00
for (int i = 0; i < count; i++)
{
items.Add(new ChangeLogBaseDto()
2025-02-19 17:44:48 +05:00
{
Id = Uuid7.Guid(),
Value = new Dictionary<string, object>
{
{ "1", 1 },
{ "2", 2 }
}
});
}
return items;
}
2025-03-07 15:28:02 +05:00
private IEnumerable<IDictionary<string, object>> GenerateChangeLogRequests(int count)
2025-03-03 11:47:29 +05:00
{
2025-03-07 15:28:02 +05:00
var items = new List<IDictionary<string, object>>();
2025-03-03 11:47:29 +05:00
for (int i = 0; i < count; i++)
{
2025-03-07 15:28:02 +05:00
items.Add(new Dictionary<string, object>
2025-03-03 11:47:29 +05:00
{
{ "1", 1 },
{ "2", 2 }
2025-03-07 15:28:02 +05:00
});
2025-03-03 11:47:29 +05:00
}
return items;
}
2025-02-19 17:44:48 +05:00
private IEnumerable<ChangeLogDto> GenerateChangeLogDto(int count)
{
var items = new List<ChangeLogDto>();
for (int i = 0; i < count; i++)
{
items.Add(new ChangeLogDto()
{
Id = Uuid7.Guid(),
2025-03-03 11:47:29 +05:00
Value = new Dictionary<string, object>
{
{ "1", 1 },
{ "2", 2 }
}
2025-02-19 17:44:48 +05:00
});
}
return items;
}
}