2025-01-23 12:46:34 +05:00
|
|
|
|
using DD.Persistence.Client;
|
|
|
|
|
using DD.Persistence.Client.Clients;
|
|
|
|
|
using DD.Persistence.Client.Clients.Interfaces;
|
|
|
|
|
using DD.Persistence.Client.Clients.Interfaces.Refit;
|
|
|
|
|
using DD.Persistence.Database.Entity;
|
2025-02-28 17:41:34 +05:00
|
|
|
|
using DD.Persistence.Models.ChangeLog;
|
2025-01-23 12:46:34 +05:00
|
|
|
|
using DD.Persistence.Models.Requests;
|
2024-12-18 16:19:05 +05:00
|
|
|
|
using Mapster;
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
2024-12-26 13:42:14 +05:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
2025-02-26 18:18:21 +05:00
|
|
|
|
using UuidExtensions;
|
2025-01-23 12:46:34 +05:00
|
|
|
|
using Xunit;
|
2025-02-28 17:41:34 +05:00
|
|
|
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
namespace DD.Persistence.IntegrationTests.Controllers;
|
|
|
|
|
public class ChangeLogControllerTest : BaseIntegrationTest
|
|
|
|
|
{
|
|
|
|
|
private readonly IChangeLogClient client;
|
2025-02-17 17:34:07 +05:00
|
|
|
|
private readonly PaginationRequest paginationRequest;
|
2025-02-28 17:41:34 +05:00
|
|
|
|
private static readonly Random random = new();
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
public ChangeLogControllerTest(WebAppFactoryFixture factory) : base(factory)
|
|
|
|
|
{
|
2024-12-26 13:42:14 +05:00
|
|
|
|
var refitClientFactory = scope.ServiceProvider
|
|
|
|
|
.GetRequiredService<IRefitClientFactory<IRefitChangeLogClient>>();
|
|
|
|
|
var logger = scope.ServiceProvider.GetRequiredService<ILogger<ChangeLogClient>>();
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
2024-12-26 13:42:14 +05:00
|
|
|
|
client = scope.ServiceProvider
|
|
|
|
|
.GetRequiredService<IChangeLogClient>();
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
2025-02-17 17:34:07 +05:00
|
|
|
|
paginationRequest = new PaginationRequest()
|
|
|
|
|
{
|
|
|
|
|
Skip = 0,
|
|
|
|
|
Take = 10,
|
2025-02-28 17:41:34 +05:00
|
|
|
|
SortSettings = string.Empty,
|
2025-02-17 17:34:07 +05:00
|
|
|
|
};
|
2024-12-18 16:19:05 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
2025-02-28 17:41:34 +05:00
|
|
|
|
public async Task ClearAndInsertRange()
|
2024-12-18 16:19:05 +05:00
|
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
var insertedCount = 10;
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var idDiscriminator = Guid.NewGuid();
|
|
|
|
|
var otherOldDtos = GenerateChangeLogCreateRequest(10);
|
|
|
|
|
await client.AddRange(Guid.NewGuid(), otherOldDtos, Guid.NewGuid().ToString(), CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
var oldDtos = GenerateChangeLogCreateRequest(10);
|
|
|
|
|
await client.AddRange(idDiscriminator, oldDtos, Guid.NewGuid().ToString(), CancellationToken.None);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var newDtos = GenerateChangeLogCreateRequest(insertedCount);
|
2025-02-24 12:11:48 +05:00
|
|
|
|
|
2025-02-18 10:34:42 +05:00
|
|
|
|
//act
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var result = await client.ClearAndAddRange(idDiscriminator, newDtos, "Добавление новых элементов и очистка старых", CancellationToken.None);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.Equal(insertedCount * 2, result);
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var data = await client.GetByDate(idDiscriminator, DateTimeOffset.Now.AddSeconds(1), new PaginationRequest { Take = 10 * insertedCount }, CancellationToken.None);
|
|
|
|
|
Assert.Equal(insertedCount, data.Count);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task AddRange_returns_success()
|
|
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
var count = 3;
|
|
|
|
|
var idDiscriminator = Guid.NewGuid();
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var dtos = GenerateChangeLogCreateRequest(count);
|
2025-02-17 17:34:07 +05:00
|
|
|
|
var comment = "Создаю 3 элемента";
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
// act
|
2025-02-17 17:34:07 +05:00
|
|
|
|
var result = await client.AddRange(idDiscriminator, dtos, comment, CancellationToken.None);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.Equal(count, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task Update_returns_success()
|
|
|
|
|
{
|
2025-02-18 17:21:30 +05:00
|
|
|
|
//arrange
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var begin = DateTimeOffset.UtcNow;
|
2024-12-18 16:19:05 +05:00
|
|
|
|
var idDiscriminator = Guid.NewGuid();
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var dtos = GenerateChangeLogCreateRequest(1);
|
|
|
|
|
var original = dtos.First();
|
2025-02-17 17:34:07 +05:00
|
|
|
|
var comment = "Создаю 1 элемент";
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var result = await client.AddRange(idDiscriminator, [original], comment, CancellationToken.None);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var query = dbContext.Set<ChangeLog>()
|
|
|
|
|
.Include(x => x.CreatedCommit)
|
|
|
|
|
.Where(x => x.CreatedCommit.DiscriminatorId == idDiscriminator);
|
|
|
|
|
var entity = await query.FirstAsync();
|
|
|
|
|
var modified = entity.Adapt<ChangeLogBaseDto>();
|
|
|
|
|
var key = modified.Value.First().Key;
|
|
|
|
|
modified.Value[key] = random.NextDouble();
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
// act
|
2025-02-17 17:34:07 +05:00
|
|
|
|
comment = "Обновляю 1 элемент";
|
2025-02-28 17:41:34 +05:00
|
|
|
|
result = await client.UpdateRange(idDiscriminator, [modified], comment, CancellationToken.None);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.Equal(2, result);
|
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var now = DateTimeOffset.UtcNow.AddSeconds(1);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var changeLogResult = await client.GetChangeLogForInterval(idDiscriminator, begin, now, new CancellationToken());
|
2024-12-18 16:19:05 +05:00
|
|
|
|
Assert.NotNull(changeLogResult);
|
|
|
|
|
|
|
|
|
|
var obsoleteDto = changeLogResult
|
|
|
|
|
.Where(e => e.Obsolete.HasValue)
|
2025-02-28 17:41:34 +05:00
|
|
|
|
.First();
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
var activeDto = changeLogResult
|
|
|
|
|
.Where(e => !e.Obsolete.HasValue)
|
2025-02-28 17:41:34 +05:00
|
|
|
|
.First();
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
Assert.Equal(activeDto.Id, obsoleteDto.IdNext);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task UpdateRange_returns_success()
|
|
|
|
|
{
|
|
|
|
|
var count = 2;
|
2025-02-17 17:34:07 +05:00
|
|
|
|
var idDiscriminator = Guid.NewGuid();
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var dtos = GenerateChangeLogCreateRequest(count);
|
2025-02-17 17:34:07 +05:00
|
|
|
|
var comment = "Создаю 3 элемента";
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
// act
|
2025-02-17 17:34:07 +05:00
|
|
|
|
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 элемента";
|
2025-02-27 16:56:03 +05:00
|
|
|
|
result = await client.UpdateRange(idDiscriminator, paginatedResult.Items, comment, CancellationToken.None);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.Equal(count * 2, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task DeleteRange_returns_success()
|
|
|
|
|
{
|
|
|
|
|
// arrange
|
2025-02-17 17:34:07 +05:00
|
|
|
|
var insertedCount = 10;
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var idDiscriminator = Guid.NewGuid();
|
|
|
|
|
var otherOldDtos = GenerateChangeLogCreateRequest(10);
|
|
|
|
|
await client.AddRange(Guid.NewGuid(), otherOldDtos, Guid.NewGuid().ToString(), CancellationToken.None);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var oldDtos = GenerateChangeLogCreateRequest(10);
|
|
|
|
|
await client.AddRange(idDiscriminator, oldDtos, Guid.NewGuid().ToString(), CancellationToken.None);
|
|
|
|
|
var existing = await client.GetByDate(idDiscriminator, DateTimeOffset.UtcNow.AddSeconds(1), new PaginationRequest { Take= 100*insertedCount}, CancellationToken.None);
|
|
|
|
|
var ids = existing.Items.Select(e => e.Id);
|
2025-02-24 12:11:48 +05:00
|
|
|
|
|
2024-12-18 16:19:05 +05:00
|
|
|
|
// act
|
2025-02-27 16:56:03 +05:00
|
|
|
|
var result = await client.DeleteRange(idDiscriminator, ids, "Удаление нескольких записей", CancellationToken.None);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
// assert
|
2025-02-17 17:34:07 +05:00
|
|
|
|
Assert.Equal(insertedCount, result);
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var items = await dbContext.Set<ChangeLog>()
|
|
|
|
|
.Where(e=> ids.Contains(e.Id))
|
|
|
|
|
.ToArrayAsync(CancellationToken.None);
|
2025-02-24 12:11:48 +05:00
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
Assert.Equal(insertedCount, items.Count());
|
|
|
|
|
Assert.All(items, i => Assert.NotNull(i.IdObsoletedCommit));
|
|
|
|
|
}
|
2025-02-24 12:11:48 +05:00
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
static ChangeLogCommit GenerateCommit(Guid discriminatorId, DateTimeOffset creation)
|
|
|
|
|
=> GenerateCommit(discriminatorId, Guid.NewGuid(), creation);
|
|
|
|
|
|
|
|
|
|
static ChangeLogCommit GenerateCommit(Guid discriminatorId, Guid userId, DateTimeOffset creation)
|
|
|
|
|
=> new ChangeLogCommit
|
|
|
|
|
{
|
|
|
|
|
Id = Guid.NewGuid(),
|
|
|
|
|
DiscriminatorId = discriminatorId,
|
|
|
|
|
IdAuthor = userId,
|
|
|
|
|
Creation = creation,
|
|
|
|
|
Comment = Guid.NewGuid().ToString(),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static IEnumerable<ChangeLog> GenerateChangeLog(int count, ChangeLogCommit createCommit)
|
|
|
|
|
=> GenerateChangeLog(count, createCommit, null, null);
|
|
|
|
|
|
|
|
|
|
static IEnumerable<ChangeLog> GenerateChangeLog(int count, ChangeLogCommit createCommit, ChangeLogCommit? obsoleteCommit, Guid? idNext)
|
|
|
|
|
{
|
|
|
|
|
for (var i = 0; i< count; i++)
|
|
|
|
|
{
|
|
|
|
|
yield return new ChangeLog
|
|
|
|
|
{
|
|
|
|
|
Id = Guid.NewGuid(),
|
|
|
|
|
CreatedCommit = createCommit,
|
|
|
|
|
IdCreatedCommit = createCommit.Id,
|
|
|
|
|
ObsoletedCommit = obsoleteCommit,
|
|
|
|
|
IdObsoletedCommit = obsoleteCommit?.Id,
|
|
|
|
|
IdNext = idNext,
|
|
|
|
|
Value = new Dictionary<string, object> { { "Guid.NewGuid()", random.NextDouble() } }
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static ChangeLogCommit GenerateCommitWithNewData(Guid discriminatorId, DateTimeOffset creation, int count)
|
|
|
|
|
{
|
|
|
|
|
var commit = GenerateCommit(discriminatorId, creation);
|
|
|
|
|
commit.ChangeLogCreatedItems = GenerateChangeLog(count, commit).ToList();
|
|
|
|
|
return commit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async Task<ChangeLogCommit> SeedCommitWithNewData(Guid discriminatorId, DateTimeOffset creation, int count)
|
|
|
|
|
{
|
|
|
|
|
var data = GenerateCommitWithNewData(discriminatorId, creation, count);
|
|
|
|
|
dbContext.Set<ChangeLogCommit>().Add(data);
|
|
|
|
|
await dbContext.SaveChangesAsync();
|
|
|
|
|
return data;
|
2024-12-18 16:19:05 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetDatesRange_returns_success()
|
|
|
|
|
{
|
2025-02-17 17:34:07 +05:00
|
|
|
|
//arrange
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var dateMin = DateTimeOffset.UtcNow.AddDays(-1);
|
|
|
|
|
var dateMax = DateTimeOffset.UtcNow;
|
|
|
|
|
var dateMid = dateMin + 0.5 * (dateMax - dateMin);
|
|
|
|
|
var idDiscriminator = Guid.NewGuid();
|
|
|
|
|
var idOtherDiscriminator = Guid.NewGuid();
|
|
|
|
|
var count = 15;
|
|
|
|
|
|
|
|
|
|
await SeedCommitWithNewData(idDiscriminator, dateMin, count);
|
|
|
|
|
await SeedCommitWithNewData(idDiscriminator, dateMid, count);
|
|
|
|
|
await SeedCommitWithNewData(idDiscriminator, dateMax, count);
|
|
|
|
|
await SeedCommitWithNewData(idOtherDiscriminator, dateMin.AddDays(-1), count);
|
|
|
|
|
|
2024-12-18 16:19:05 +05:00
|
|
|
|
// act
|
2025-02-17 17:34:07 +05:00
|
|
|
|
var result = await client.GetDatesRange(idDiscriminator, CancellationToken.None);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
// assert
|
2025-02-28 17:41:34 +05:00
|
|
|
|
Assert.NotNull(result);
|
|
|
|
|
Assert.Equal(dateMin, result.From, TimeSpan.FromSeconds(1));
|
|
|
|
|
Assert.Equal(dateMax, result.To, TimeSpan.FromSeconds(1));
|
2024-12-18 16:19:05 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetByDate_returns_success()
|
|
|
|
|
{
|
|
|
|
|
// arrange
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var dbSetCommit = dbContext.Set<ChangeLogCommit>();
|
|
|
|
|
var dbSet = dbContext.Set<ChangeLog>();
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var idDiscriminator = Guid.NewGuid();
|
|
|
|
|
var date = DateTimeOffset.UtcNow;
|
|
|
|
|
var expected = 10;
|
|
|
|
|
var skip = 2;
|
|
|
|
|
var take = skip + 2;
|
|
|
|
|
var count = expected + take;
|
|
|
|
|
var commit = GenerateCommit(idDiscriminator, date);
|
|
|
|
|
dbSetCommit.Add(commit);
|
|
|
|
|
var commitData = GenerateChangeLog(count, commit);
|
|
|
|
|
dbSet.AddRange(commitData);
|
|
|
|
|
|
|
|
|
|
await dbContext.SaveChangesAsync(CancellationToken.None);
|
|
|
|
|
var dataWithIds = await dbSet
|
|
|
|
|
.Where(e=>e.CreatedCommit.DiscriminatorId == idDiscriminator)
|
|
|
|
|
.AsNoTracking()
|
|
|
|
|
.ToArrayAsync(CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
var itemsToDelete = dataWithIds.Skip(skip).Take(take);
|
|
|
|
|
var idsToDelete = itemsToDelete.Select(x => x.Id).ToArray();
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
// act
|
2025-02-27 16:56:03 +05:00
|
|
|
|
var deletedCount = await client.DeleteRange(idDiscriminator, idsToDelete, "Удаление нескольких записей", CancellationToken.None);
|
2025-02-28 17:41:34 +05:00
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
var moment = DateTimeOffset.UtcNow.AddSeconds(1);
|
|
|
|
|
var result = await client.GetByDate(idDiscriminator, moment, new() { Take = count *100}, new CancellationToken());
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
Assert.NotNull(result);
|
2025-02-28 17:41:34 +05:00
|
|
|
|
Assert.Equal(expected, result.Items.Count());
|
2024-12-18 16:19:05 +05:00
|
|
|
|
}
|
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetChangeLogForInterval_returns_success()
|
2024-12-18 16:19:05 +05:00
|
|
|
|
{
|
|
|
|
|
// arrange
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var dateMin = DateTimeOffset.UtcNow.AddDays(- 11);
|
|
|
|
|
var dateMax = DateTimeOffset.UtcNow;
|
|
|
|
|
var dateMid = dateMin + 0.5 * (dateMax - dateMin);
|
|
|
|
|
var idDiscriminator = Guid.NewGuid();
|
|
|
|
|
var idOtherDiscriminator = Guid.NewGuid();
|
|
|
|
|
var count = 17;
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var commitMin = await SeedCommitWithNewData(idDiscriminator, dateMin, count);
|
|
|
|
|
var commitMid = await SeedCommitWithNewData(idDiscriminator, dateMid, count);
|
|
|
|
|
await SeedCommitWithNewData(idDiscriminator, dateMax, count);
|
|
|
|
|
await SeedCommitWithNewData(idOtherDiscriminator, dateMin.AddDays(-1), count);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var dateBegin = commitMin.Creation;
|
|
|
|
|
var dateEnd = commitMid.Creation.AddSeconds(1);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var expectedCount = commitMin.ChangeLogCreatedItems.Count()
|
|
|
|
|
+ commitMid.ChangeLogCreatedItems.Count();
|
2024-12-18 16:19:05 +05:00
|
|
|
|
//act
|
2025-02-28 17:41:34 +05:00
|
|
|
|
|
2025-02-17 17:34:07 +05:00
|
|
|
|
var result = await client.GetChangeLogForInterval(idDiscriminator, dateBegin, dateEnd, CancellationToken.None);
|
2024-12-18 16:19:05 +05:00
|
|
|
|
|
|
|
|
|
//assert
|
2025-02-28 17:41:34 +05:00
|
|
|
|
Assert.Equal(expectedCount, result.Count());
|
2024-12-18 16:19:05 +05:00
|
|
|
|
}
|
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
[Fact]
|
|
|
|
|
public async Task GetStatistics_returns_success()
|
2025-02-26 18:18:21 +05:00
|
|
|
|
{
|
|
|
|
|
// arrange
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var discriminatorId = Guid.NewGuid();
|
|
|
|
|
// создаем записи
|
|
|
|
|
var date0 = DateTimeOffset.UtcNow.AddDays(-17);
|
|
|
|
|
var day0 = new DateOnly(date0.Year, date0.Month, date0.Day);
|
|
|
|
|
var inserted0 = 17;
|
|
|
|
|
var commit0 = await SeedCommitWithNewData(discriminatorId, date0, inserted0);
|
|
|
|
|
|
|
|
|
|
// создаем еще записи
|
|
|
|
|
var date1 = DateTimeOffset.UtcNow.AddDays(-7);
|
|
|
|
|
var day1 = new DateOnly(date1.Year, date1.Month, date1.Day);
|
|
|
|
|
var inserted1 = inserted0 + 5;
|
|
|
|
|
var commit1 = await SeedCommitWithNewData(discriminatorId, date1, inserted1);
|
|
|
|
|
|
|
|
|
|
// создаем еще записи с новым дискриминатором
|
|
|
|
|
await SeedCommitWithNewData(Guid.NewGuid(), date1, 17);
|
|
|
|
|
|
|
|
|
|
// обновим
|
|
|
|
|
var date2 = DateTimeOffset.UtcNow;
|
|
|
|
|
var day2 = new DateOnly(date2.Year, date2.Month, date2.Day);
|
|
|
|
|
var updated = commit0.ChangeLogCreatedItems.Select(i => new ChangeLogBaseDto { Id = i.Id, Value = i.Value });
|
|
|
|
|
await client.UpdateRange(commit0.DiscriminatorId, updated, Guid.NewGuid().ToString(), CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
// удалим из коммита
|
|
|
|
|
var idToDelete = commit1.ChangeLogCreatedItems.First().Id;
|
|
|
|
|
await client.DeleteRange(commit1.DiscriminatorId, [idToDelete], Guid.NewGuid().ToString(), CancellationToken.None);
|
2025-02-26 18:18:21 +05:00
|
|
|
|
|
|
|
|
|
//act
|
2025-02-28 17:41:34 +05:00
|
|
|
|
var request = new ChangeLogQuery()
|
2025-02-26 18:18:21 +05:00
|
|
|
|
{
|
2025-02-28 17:41:34 +05:00
|
|
|
|
DiscriminatorId = commit0.DiscriminatorId,
|
|
|
|
|
UserId = null
|
2025-02-26 18:18:21 +05:00
|
|
|
|
};
|
|
|
|
|
var statistics = await client.GetStatistics(request, CancellationToken.None);
|
|
|
|
|
|
|
|
|
|
//assert
|
2025-02-28 17:41:34 +05:00
|
|
|
|
Assert.Equal(3, statistics.Count());
|
|
|
|
|
|
|
|
|
|
var stat0 = statistics.First(s => s.Date == day0);
|
|
|
|
|
Assert.Equal(inserted0, stat0.CreatedChangeLogCount);
|
|
|
|
|
Assert.Equal(0, stat0.ObsoletedChangeLogCount);
|
|
|
|
|
Assert.Equal(1, stat0.CommitCount);
|
|
|
|
|
|
|
|
|
|
var stat1 = statistics.First(s => s.Date == day1);
|
|
|
|
|
Assert.Equal(inserted1, stat1.CreatedChangeLogCount);
|
|
|
|
|
Assert.Equal(0, stat1.ObsoletedChangeLogCount);
|
|
|
|
|
Assert.Equal(1, stat1.CommitCount);
|
|
|
|
|
|
|
|
|
|
var stat2 = statistics.First(s => s.Date == day2);
|
|
|
|
|
Assert.Equal(inserted0, stat2.CreatedChangeLogCount);
|
|
|
|
|
Assert.Equal(inserted0 + 1, stat2.ObsoletedChangeLogCount);
|
|
|
|
|
Assert.Equal(2, stat2.CommitCount);
|
2025-02-26 18:18:21 +05:00
|
|
|
|
}
|
|
|
|
|
|
2025-02-28 17:41:34 +05:00
|
|
|
|
private static IEnumerable<ChangeLogCreateRequest> GenerateChangeLogCreateRequest(int count)
|
2024-12-18 16:19:05 +05:00
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < count; i++)
|
2025-02-28 17:41:34 +05:00
|
|
|
|
yield return new ChangeLogCreateRequest()
|
2024-12-18 16:19:05 +05:00
|
|
|
|
{
|
|
|
|
|
Value = new Dictionary<string, object>()
|
|
|
|
|
{
|
2025-02-28 17:41:34 +05:00
|
|
|
|
{ "Key", random.NextDouble() }
|
|
|
|
|
}
|
2024-12-18 16:19:05 +05:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|