Files
monorepo/LCU.API.Internal.Document/LCU.API.Internal.DocumentLibTest/Repositories/DocumentAuditRepositoryTest.cs
T
2026-03-13 09:11:35 -05:00

124 lines
4.8 KiB
C#

using FluentAssertions;
using LCU.API.Internal.DocumentLib.Containers;
using LCU.API.Internal.DocumentLib.Repositories;
using LCU.API.Internal.DocumentLibTest.TestDataFactories;
using LCU.API.Internal.DocumentLibTest.TestDoubles;
using LCU.Library.Internal.DocumentModels.Requests;
using MongoDB.Driver;
namespace LCU.API.Internal.DocumentLibTest.Repositories;
public class DocumentAuditRepositoryTest : IDisposable
{
private readonly IDocumentAuditRepository _repository;
private readonly FakeMongoCollectionFactory _collectionFactory = new();
public DocumentAuditRepositoryTest()
{
_repository = new DocumentAuditRepository(_collectionFactory);
}
[Test]
public async Task GetDocumentAudits_FieldAuditRecordsExistForId_ReturnsMatchedLogsById()
{
var audits = EnumerableDataSeriesFactory.CreateSeries(() => FieldAuditFactory(), 5).ToArray();
await _collectionFactory.GetCollection<DocumentAudit>().InsertManyAsync(audits);
var expectedAudits = new[]{ audits.First(), audits.Last() };
var documentIds = expectedAudits.Select(a => a.DocumentId).ToArray();
var retrievedAudits = await _repository.GetDocumentAudits(documentIds);
retrievedAudits.Should().HaveSameCount(documentIds);
expectedAudits.Should().BeEquivalentTo(retrievedAudits, a => a.Using(DateTimeComparison.Truncated));
}
[Test]
public async Task GetDocumentAudits_ActionAuditRecordsExistForId_ReturnsMatchedLogsById()
{
var audits = EnumerableDataSeriesFactory.CreateSeries(() => ActionAuditFactory(), 5).ToArray();
await _collectionFactory.GetCollection<DocumentAudit>().InsertManyAsync(audits);
var expectedAudits = new[] { audits.First(), audits.Last() };
var documentIds = expectedAudits.Select(a => a.DocumentId).ToArray();
var retrievedAudits = await _repository.GetDocumentAudits(documentIds);
retrievedAudits.Should().HaveSameCount(documentIds);
expectedAudits.Should().BeEquivalentTo(retrievedAudits, a => a.Using(DateTimeComparison.Truncated));
}
[Test]
public async Task SaveDocumentAudits_FieldAuditsSubmitted_SavesAll()
{
var audits = EnumerableDataSeriesFactory.CreateSeries(() => FieldAuditFactory(), 5).ToArray();
await _repository.SaveDocumentAudits(audits);
var savedAudits = await (
await _collectionFactory
.GetCollection<DocumentAudit>()
.FindAsync(Builders<DocumentAudit>.Filter.In
(
nameof(DocumentAudit.DocumentId),
audits.Select(a => a.DocumentId))
)
).ToListAsync();
audits.Should().BeEquivalentTo(savedAudits, a => a.Using(DateTimeComparison.Truncated));
}
[Test]
public async Task SaveDocumentAudits_ActionAuditsSubmitted_SavesAll()
{
var audits = EnumerableDataSeriesFactory.CreateSeries(() => ActionAuditFactory(), 5).ToArray();
await _repository.SaveDocumentAudits(audits);
var savedAudits = await (
await _collectionFactory
.GetCollection<DocumentAudit>()
.FindAsync(Builders<DocumentAudit>.Filter.In(nameof(DocumentAudit.DocumentId),
audits.Select(a => a.DocumentId)))
).ToListAsync();
audits.Should().BeEquivalentTo(savedAudits, a => a.Using(DateTimeComparison.Truncated));
}
[Test]
public async Task SaveDocumentAudits_MultipleTypesOfAudits_CanRetrieveAll()
{
var documentId = Guid.NewGuid();
var fieldAudits = EnumerableDataSeriesFactory.CreateSeries<DocumentAudit>(() => FieldAuditFactory(documentId), 5);
var actionAudits = EnumerableDataSeriesFactory.CreateSeries<DocumentAudit>(() => ActionAuditFactory(documentId), 5);
var audits = fieldAudits.Concat(actionAudits).ToArray();
await _repository.SaveDocumentAudits(audits);
var savedAudits = await _repository.GetDocumentAudits(documentId);
audits.Should().BeEquivalentTo(savedAudits, a => a.Using(DateTimeComparison.Truncated));
}
private static DocumentFieldAudit FieldAuditFactory(Guid? documentId = null) => new
(
documentId ?? Guid.NewGuid(),
Guid.NewGuid().ToString(),
DateTime.UtcNow,
Guid.NewGuid().ToString(),
Guid.NewGuid().ToString(),
Guid.NewGuid().ToString(),
Guid.NewGuid().ToString()
);
private static DocumentActionAudit ActionAuditFactory(Guid? documentId = null) => new
(
documentId ?? Guid.NewGuid(),
Guid.NewGuid().ToString(),
DateTime.UtcNow,
Guid.NewGuid().ToString(),
(DocumentAction)DateTime.Now.Millisecond,
Guid.NewGuid().ToString()
);
public void Dispose()
{
_collectionFactory.Dispose();
}
}