From 05b58da1ab26313777dcfe66375dd7246d8d43a3 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 17 Feb 2025 17:34:07 +0500 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Clients/ChangeLogClient.cs | 28 ++-- .../Clients/Interfaces/IChangeLogClient.cs | 111 +++++++------ .../Interfaces/Refit/IRefitChangeLogClient.cs | 14 +- .../Controllers/ChangeLogControllerTest.cs | 157 ++++++++++-------- 4 files changed, 167 insertions(+), 143 deletions(-) diff --git a/DD.Persistence.Client/Clients/ChangeLogClient.cs b/DD.Persistence.Client/Clients/ChangeLogClient.cs index fa73ba9..e2efbb8 100644 --- a/DD.Persistence.Client/Clients/ChangeLogClient.cs +++ b/DD.Persistence.Client/Clients/ChangeLogClient.cs @@ -19,10 +19,10 @@ public class ChangeLogClient : BaseClient, IChangeLogClient } /// - public async Task ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token) + public async Task ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token) { var result = await ExecuteGetResponse( - async () => await refitChangeLogClient.ClearAndAddRange(idDiscriminator, dtos, token), token); + async () => await refitChangeLogClient.ClearAndAddRange(idDiscriminator, dtos, comment, token), token); return result; } @@ -47,55 +47,55 @@ public class ChangeLogClient : BaseClient, IChangeLogClient } /// - public async Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token) + public async Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.Add(idDiscriminator, dto, token), token); + async () => await refitChangeLogClient.Add(idDiscriminator, dto, comment, token), token); return result; } /// - public async Task AddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token) + public async Task AddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.AddRange(idDiscriminator, dtos, token), token); + async () => await refitChangeLogClient.AddRange(idDiscriminator, dtos, comment, token), token); return result; } /// - public async Task Update(ChangeLogValuesDto dto, CancellationToken token) + public async Task Update(ChangeLogValuesDto dto, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.Update(dto, token), token); + async () => await refitChangeLogClient.Update(dto, comment, token), token); return result; } /// - public async Task UpdateRange(IEnumerable dtos, CancellationToken token) + public async Task UpdateRange(IEnumerable dtos, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.UpdateRange(dtos, token), token); + async () => await refitChangeLogClient.UpdateRange(dtos, comment, token), token); return result; } /// - public async Task Delete(Guid id, CancellationToken token) + public async Task Delete(Guid id, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.Delete(id, token), token); + async () => await refitChangeLogClient.Delete(id, comment, token), token); return result; } /// - public async Task DeleteRange(IEnumerable ids, CancellationToken token) + public async Task DeleteRange(IEnumerable ids, string comment, CancellationToken token) { var result = await ExecutePostResponse( - async () => await refitChangeLogClient.DeleteRange(ids, token), token); + async () => await refitChangeLogClient.DeleteRange(ids, comment, token), token); return result; } diff --git a/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs b/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs index 16a491c..9106e2b 100644 --- a/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs +++ b/DD.Persistence.Client/Clients/Interfaces/IChangeLogClient.cs @@ -9,48 +9,53 @@ namespace DD.Persistence.Client.Clients.Interfaces; /// public interface IChangeLogClient : IDisposable { - /// - /// Добавить одну запись - /// - /// - /// - /// - /// - Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token); + /// + /// Добавить одну запись + /// + /// + /// + /// + /// + /// + Task Add(Guid idDiscriminator, ChangeLogValuesDto dto, string comment, CancellationToken token); - /// - /// Добавить несколько записей - /// - /// - /// - /// - /// - Task AddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + /// + /// Добавить несколько записей + /// + /// + /// + /// + /// + /// + Task AddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); - /// - /// Импорт с заменой: удаление старых строк и добавление новых - /// - /// - /// - /// - /// - Task ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + /// + /// Импорт с заменой: удаление старых строк и добавление новых + /// + /// + /// + /// + /// + /// + Task ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); - /// - /// Удалить одну запись - /// - /// - /// - /// - Task Delete(Guid id, CancellationToken token); + /// + /// Удалить одну запись + /// + /// + /// + /// + /// + Task Delete(Guid id, string comment, CancellationToken token); - /// - /// Удалить несколько записей - /// - /// - /// - /// - Task DeleteRange(IEnumerable ids, CancellationToken token); + /// + /// Удалить несколько записей + /// + /// + /// + /// + /// + Task DeleteRange(IEnumerable ids, string comment, CancellationToken token); /// /// Получение актуальных данных на определенную дату (с пагинацией) @@ -80,19 +85,21 @@ public interface IChangeLogClient : IDisposable /// Task GetDatesRange(Guid idDiscriminator, CancellationToken token); - /// - /// Обновить одну запись - /// - /// - /// - /// - Task Update(ChangeLogValuesDto dto, CancellationToken token); + /// + /// Обновить одну запись + /// + /// + /// + /// + /// + Task Update(ChangeLogValuesDto dto, string comment, CancellationToken token); - /// - /// Обновить несколько записей - /// - /// - /// - /// - Task UpdateRange(IEnumerable dtos, CancellationToken token); + /// + /// Обновить несколько записей + /// + /// + /// + /// + /// + Task UpdateRange(IEnumerable dtos, string comment, CancellationToken token); } \ No newline at end of file diff --git a/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs b/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs index a07fac3..117586b 100644 --- a/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs +++ b/DD.Persistence.Client/Clients/Interfaces/Refit/IRefitChangeLogClient.cs @@ -16,7 +16,7 @@ public interface IRefitChangeLogClient : IRefitClient, IDisposable /// Импорт с заменой: удаление старых строк и добавление новых /// [Post($"{BaseRoute}/replace/{{idDiscriminator}}")] - Task> ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + Task> ClearAndAddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); /// /// Получение актуальных данных на определенную дату (с пагинацией) @@ -38,37 +38,37 @@ public interface IRefitChangeLogClient : IRefitClient, IDisposable /// Добавить одну запись /// [Post($"{BaseRoute}/{{idDiscriminator}}")] - Task> Add(Guid idDiscriminator, ChangeLogValuesDto dto, CancellationToken token); + Task> Add(Guid idDiscriminator, ChangeLogValuesDto dto, string comment, CancellationToken token); /// /// Добавить несколько записей /// [Post($"{BaseRoute}/range/{{idDiscriminator}}")] - Task> AddRange(Guid idDiscriminator, IEnumerable dtos, CancellationToken token); + Task> AddRange(Guid idDiscriminator, IEnumerable dtos, string comment, CancellationToken token); /// /// Обновить одну запись /// [Put($"{BaseRoute}")] - Task> Update(ChangeLogValuesDto dto, CancellationToken token); + Task> Update(ChangeLogValuesDto dto, string comment, CancellationToken token); /// /// Обновить несколько записей /// [Put($"{BaseRoute}/range")] - Task> UpdateRange(IEnumerable dtos, CancellationToken token); + Task> UpdateRange(IEnumerable dtos, string comment, CancellationToken token); /// /// Удалить одну запись /// [Delete($"{BaseRoute}")] - Task> Delete(Guid id, CancellationToken token); + Task> Delete(Guid id, string comment, CancellationToken token); /// /// Удалить несколько записей /// [Delete($"{BaseRoute}/range")] - Task> DeleteRange([Body] IEnumerable ids, CancellationToken token); + Task> DeleteRange([Body] IEnumerable ids, string comment, CancellationToken token); /// /// Получение списка дат, в которые происходили изменения (день, месяц, год, без времени) diff --git a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs index b4d90ab..8a8c7d6 100644 --- a/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs +++ b/DD.Persistence.IntegrationTests/Controllers/ChangeLogControllerTest.cs @@ -15,6 +15,7 @@ namespace DD.Persistence.IntegrationTests.Controllers; public class ChangeLogControllerTest : BaseIntegrationTest { private readonly IChangeLogClient client; + private readonly PaginationRequest paginationRequest; private static readonly Random generatorRandomDigits = new(); public ChangeLogControllerTest(WebAppFactoryFixture factory) : base(factory) @@ -25,22 +26,13 @@ public class ChangeLogControllerTest : BaseIntegrationTest client = scope.ServiceProvider .GetRequiredService(); - } - [Fact] - public async Task ClearAndInsertRange_InEmptyDb() - { - // arrange - dbContext.CleanupDbSet(); - - var idDiscriminator = Guid.NewGuid(); - var dtos = Generate(2); - - // act - var result = await client.ClearAndAddRange(idDiscriminator, dtos, new CancellationToken()); - - // assert - Assert.Equal(2, result); + paginationRequest = new PaginationRequest() + { + Skip = 0, + Take = 10, + SortSettings = String.Empty, + }; } [Fact] @@ -48,12 +40,12 @@ public class ChangeLogControllerTest : BaseIntegrationTest { // arrange var insertedCount = 10; - var createdResult = CreateChangeLogItems(insertedCount, (-15, 15)); - var idDiscriminator = createdResult.Item1; - var dtos = createdResult.Item2.Select(e => e.Adapt()); + var newEntitiesData = await CreateAndReturnNewDtos(insertedCount, (-15, 15)); + var idDiscriminator = newEntitiesData.Item1; + var dtos = newEntitiesData.Item2; - // act - var result = await client.ClearAndAddRange(idDiscriminator, dtos, new CancellationToken()); + + var result = await client.ClearAndAddRange(idDiscriminator, dtos, "Добавление новых элементов и очистка старых", CancellationToken.None); // assert Assert.Equal(insertedCount * 2, result); @@ -67,9 +59,10 @@ public class ChangeLogControllerTest : BaseIntegrationTest var idDiscriminator = Guid.NewGuid(); var dtos = Generate(count); var dto = dtos.FirstOrDefault()!; + var comment = "Создаю 1 элемент"; // act - var result = await client.Add(idDiscriminator, dto, new CancellationToken()); + var result = await client.Add(idDiscriminator, dto, comment, CancellationToken.None); // assert Assert.Equal(count, result); @@ -82,9 +75,10 @@ public class ChangeLogControllerTest : BaseIntegrationTest var count = 3; var idDiscriminator = Guid.NewGuid(); var dtos = Generate(count); + var comment = "Создаю 3 элемента"; // act - var result = await client.AddRange(idDiscriminator, dtos, new CancellationToken()); + var result = await client.AddRange(idDiscriminator, dtos, comment, CancellationToken.None); // assert Assert.Equal(count, result); @@ -99,7 +93,8 @@ public class ChangeLogControllerTest : BaseIntegrationTest var idDiscriminator = Guid.NewGuid(); var dtos = Generate(1); var dto = dtos.FirstOrDefault()!; - var result = await client.Add(idDiscriminator, dto, new CancellationToken()); + var comment = "Создаю 1 элемент"; + var result = await client.Add(idDiscriminator, dto, comment, CancellationToken.None); var entity = dbContext.ChangeLog .Where(x => x.IdDiscriminator == idDiscriminator) @@ -107,7 +102,8 @@ public class ChangeLogControllerTest : BaseIntegrationTest dto = entity.Adapt(); // act - result = await client.Update(dto, new CancellationToken()); + comment = "Обновляю 1 элемент"; + result = await client.Update(dto, comment, CancellationToken.None); // assert Assert.Equal(2, result); @@ -139,21 +135,17 @@ public class ChangeLogControllerTest : BaseIntegrationTest [Fact] public async Task UpdateRange_returns_success() { - // arrange var count = 2; + var idDiscriminator = Guid.NewGuid(); var dtos = Generate(count); - var entities = dtos.Select(d => d.Adapt()).ToArray(); - dbContext.ChangeLog.AddRange(entities); - dbContext.SaveChanges(); - - dtos = entities.Select(c => new ChangeLogValuesDto() - { - Id = c.Id, - Value = c.Value - }).ToArray(); + var comment = "Создаю 3 элемента"; // act - var result = await client.UpdateRange(dtos, new CancellationToken()); + var result = await client.AddRange(idDiscriminator, dtos, comment, CancellationToken.None); + var paginatedResult = await client.GetByDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(1), paginationRequest, CancellationToken.None); + // act + comment = "Обновляю 3 элемента"; + result = await client.UpdateRange(paginatedResult.Items, comment, CancellationToken.None); // assert Assert.Equal(count * 2, result); @@ -163,14 +155,13 @@ public class ChangeLogControllerTest : BaseIntegrationTest public async Task Delete_returns_success() { // arrange - var dtos = Generate(1); - var dto = dtos.FirstOrDefault()!; - var entity = dto.Adapt(); - dbContext.ChangeLog.Add(entity); - dbContext.SaveChanges(); + var insertedCount = 1; + var newEntitiesData = await CreateAndReturnNewDtos(insertedCount, (-15, -1)); + var idDiscriminator = newEntitiesData.Item1; + var dto = newEntitiesData.Item2.FirstOrDefault(); // act - var result = await client.Delete(entity.Id, new CancellationToken()); + var result = await client.Delete(dto!.Id, "Удаление одной записи", CancellationToken.None); // assert Assert.Equal(1, result); @@ -180,30 +171,29 @@ public class ChangeLogControllerTest : BaseIntegrationTest public async Task DeleteRange_returns_success() { // arrange - var count = 10; - var dtos = Generate(count); - var entities = dtos.Select(d => d.Adapt()).ToArray(); - dbContext.ChangeLog.AddRange(entities); - dbContext.SaveChanges(); + var insertedCount = 10; + var newEntitiesData = await CreateAndReturnNewDtos(insertedCount, (-15, -1)); + var idDiscriminator = newEntitiesData.Item1; + var dtos = newEntitiesData.Item2; // act - var ids = entities.Select(e => e.Id); - var result = await client.DeleteRange(ids, new CancellationToken()); + var ids = dtos.Select(e => e.Id); + var result = await client.DeleteRange(ids, "Удаление нескольких записей", CancellationToken.None); // assert - Assert.Equal(count, result); + Assert.Equal(insertedCount, result); } [Fact] public async Task GetDatesRange_returns_success() { - // arrange - var changeLogItems = CreateChangeLogItems(3, (-15, 15)); + //arrange + var changeLogItems = await CreateAndReturnNewEntities(3, (-15, -1)); var idDiscriminator = changeLogItems.Item1; - var entities = changeLogItems.Item2.OrderBy(e => e.Creation); + var entities = changeLogItems.Item2.OrderBy(c => c.Creation); // act - var result = await client.GetDatesRange(idDiscriminator, new CancellationToken()); + var result = await client.GetDatesRange(idDiscriminator, CancellationToken.None); // assert Assert.NotNull(result); @@ -228,7 +218,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest //создаем записи var count = 5; - var changeLogItems = CreateChangeLogItems(count, (-15, 15)); + var changeLogItems = await CreateAndReturnNewDtos(count, (-15, 15)); var idDiscriminator = changeLogItems.Item1; var entities = changeLogItems.Item2; @@ -237,14 +227,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest var ids = entities.Select(e => e.Id); var idsToDelete = ids.Skip(2); - var deletedCount = await client.DeleteRange(idsToDelete, new CancellationToken()); - - var paginationRequest = new PaginationRequest() - { - Skip = 0, - Take = 10, - SortSettings = String.Empty, - }; + var deletedCount = await client.DeleteRange(idsToDelete, "Удаление нескольких записей", CancellationToken.None); var moment = DateTimeOffset.UtcNow.AddDays(16); var result = await client.GetByDate(idDiscriminator, moment, paginationRequest, new CancellationToken()); @@ -260,7 +243,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest } [Theory] - [InlineData(5, -15, 15, -20, 20, 10)] + [InlineData(5, -15, -5, -20, 20, 10)] [InlineData(5, -15, -10, -16, -9, 5)] public async Task GetChangeLogForInterval_returns_success( int insertedCount, @@ -276,17 +259,16 @@ public class ChangeLogControllerTest : BaseIntegrationTest //создаем записи var count = insertedCount; var daysRange = (daysBeforeNowChangeLog, daysAfterNowChangeLog); - var changeLogItems = CreateChangeLogItems(count, daysRange); + var changeLogItems = await CreateAndReturnNewDtos(count, daysRange); var idDiscriminator = changeLogItems.Item1; - var entities = changeLogItems.Item2; + var dtos = changeLogItems.Item2; - var dtos = entities.Select(e => e.Adapt()).ToArray(); - await client.UpdateRange(dtos, new CancellationToken()); + await client.UpdateRange(dtos, "Обновляем несколько записей", CancellationToken.None); //act var dateBegin = DateTimeOffset.UtcNow.AddDays(daysBeforeNowFilter); var dateEnd = DateTimeOffset.UtcNow.AddDays(daysAfterNowFilter); - var result = await client.GetChangeLogForInterval(idDiscriminator, dateBegin, dateEnd, new CancellationToken()); + var result = await client.GetChangeLogForInterval(idDiscriminator, dateBegin, dateEnd, CancellationToken.None); //assert Assert.NotNull(result); @@ -308,7 +290,7 @@ public class ChangeLogControllerTest : BaseIntegrationTest } - private (Guid, ChangeLog[]) CreateChangeLogItems(int count, (int, int) daysRange) + private async Task<(Guid, IEnumerable)> CreateAndReturnNewDtos(int count, (int, int) daysRange) { var minDayCount = daysRange.Item1; var maxDayCount = daysRange.Item2; @@ -323,8 +305,43 @@ public class ChangeLogControllerTest : BaseIntegrationTest return entity; }).ToArray(); + + dtos = entities.Select(e => e.Adapt()); + + // act + var result = await client.AddRange(idDiscriminator, dtos, "Добавление элементов", CancellationToken.None); + var paginatedResult = await client.GetByDate(idDiscriminator, DateTimeOffset.UtcNow.AddDays(1), paginationRequest, CancellationToken.None); + return (idDiscriminator, paginatedResult.Items); + } + + private async Task<(Guid, IEnumerable)> CreateAndReturnNewEntities(int count, (int, int) daysRange) + { + var commit = new ChangeLogCommit() + { + Comment = "Комментарий к коммиту", + Creation = DateTimeOffset.UtcNow, + Id = Guid.NewGuid(), + }; + dbContext.ChangeLogAction.Add(commit); + await dbContext.SaveChangesAsync(); + + var minDayCount = daysRange.Item1; + var maxDayCount = daysRange.Item2; + + Guid idDiscriminator = Guid.NewGuid(); + var dtos = Generate(count); + var entities = dtos.Select(d => + { + var entity = d.Adapt(); + entity.IdDiscriminator = idDiscriminator; + entity.Creation = DateTimeOffset.UtcNow.AddDays(generatorRandomDigits.Next(minDayCount, maxDayCount)); + entity.IdCommit = commit.Id; + + return entity; + }).ToArray(); + dbContext.ChangeLog.AddRange(entities); - dbContext.SaveChanges(); + await dbContext.SaveChangesAsync(); return (idDiscriminator, entities); }