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().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().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() .FindAsync(Builders.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() .FindAsync(Builders.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(() => FieldAuditFactory(documentId), 5); var actionAudits = EnumerableDataSeriesFactory.CreateSeries(() => 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(); } }