using LCU.API.Internal.DocumentLib.Configurations; using LCU.API.Internal.DocumentLib.Containers; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using MongoDB.Driver; using OwnerNumberMigrationTest.TestDataFactories; using OwnerNumberMigrationTest.TestDoubles; namespace OwnerNumberMigrationTest; [Category("Integration")] public class OwnerNumberMigrationIntegrationTest : IDisposable { private readonly FakeMongoCollectionFactory _collectionFactory = new(); private readonly DocumentInformation _personNumber; private readonly DocumentInformation _personNumbers; private readonly DocumentInformation _organizationNumber; private readonly DocumentInformation _organizationNumbers; private readonly DocumentInformation _accountNumber; private readonly DocumentInformation _personNumberMigrated; private readonly DocumentInformation _personNumbersMigrated; private readonly DocumentInformation _organizationNumberMigrated; private readonly DocumentInformation _organizationNumbersMigrated; private readonly DocumentInformation _accountNumberMigrated; public OwnerNumberMigrationIntegrationTest() { static string SingleOwnerFactory() => Guid.NewGuid().ToString(); static string MultipleOwnersFactory() => string.Join ( ",", EnumerableDataSeriesFactory.CreateSeries(SingleOwnerFactory, 3) ); _personNumber = DocumentInformationFactory.CreateDocumentInformation(); _personNumber.Attributes.Clear(); _personNumber.Attributes["PersonNumber"] = SingleOwnerFactory(); _personNumbers = DocumentInformationFactory.CreateDocumentInformation(); _personNumbers.Attributes.Clear(); _personNumbers.Attributes["PersonNumbers"] = MultipleOwnersFactory(); _organizationNumber = DocumentInformationFactory.CreateDocumentInformation(); _organizationNumber.Attributes.Clear(); _organizationNumber.Attributes["OrganizationNumber"] = SingleOwnerFactory(); _organizationNumbers = DocumentInformationFactory.CreateDocumentInformation(); _organizationNumbers.Attributes.Clear(); _organizationNumbers.Attributes["OrganizationNumbers"] = MultipleOwnersFactory(); _accountNumber = DocumentInformationFactory.CreateDocumentInformation(); _accountNumber.Attributes.Clear(); _accountNumber.Attributes["AccountNumber"] = SingleOwnerFactory(); _personNumberMigrated = DocumentInformationFactory.CreateDocumentInformation(); _personNumberMigrated.Attributes.Clear(); _personNumberMigrated.Attributes["PersonNumber"] = SingleOwnerFactory(); _personNumberMigrated.PersonNumbers = _personNumberMigrated.Attributes["PersonNumber"].Split(","); _personNumbersMigrated = DocumentInformationFactory.CreateDocumentInformation(); _personNumbersMigrated.Attributes.Clear(); _personNumbersMigrated.Attributes["PersonNumbers"] = MultipleOwnersFactory(); _personNumbersMigrated.PersonNumbers = _personNumbersMigrated.Attributes["PersonNumbers"].Split(","); _organizationNumberMigrated = DocumentInformationFactory.CreateDocumentInformation(); _organizationNumberMigrated.Attributes.Clear(); _organizationNumberMigrated.Attributes["OrganizationNumber"] = SingleOwnerFactory(); _organizationNumberMigrated.OrganizationNumbers = _organizationNumberMigrated.Attributes["OrganizationNumber"].Split(","); _organizationNumbersMigrated = DocumentInformationFactory.CreateDocumentInformation(); _organizationNumbersMigrated.Attributes.Clear(); _organizationNumbersMigrated.Attributes["OrganizationNumbers"] = MultipleOwnersFactory(); _organizationNumbersMigrated.OrganizationNumbers = _organizationNumbersMigrated.Attributes["OrganizationNumbers"].Split(","); _accountNumberMigrated = DocumentInformationFactory.CreateDocumentInformation(); _accountNumberMigrated.Attributes.Clear(); _accountNumberMigrated.Attributes["AccountNumber"] = SingleOwnerFactory(); _accountNumberMigrated.AccountNumber = _accountNumberMigrated.Attributes["AccountNumber"]; } [SetUp] public async Task Setup() { var collection = _collectionFactory.GetCollection(); await collection.InsertManyAsync(new[] { _personNumber, _personNumbers, _organizationNumber, _organizationNumbers, _accountNumber, _personNumberMigrated, _personNumbersMigrated, _organizationNumberMigrated, _organizationNumbersMigrated, _accountNumberMigrated }); await collection.UpdateManyAsync ( Builders.Filter.In ( d => d.DocumentId, new[] { _personNumber.DocumentId, _personNumbers.DocumentId, _organizationNumber.DocumentId, _organizationNumbers.DocumentId, _accountNumber.DocumentId } ), Builders.Update .Unset(nameof(DocumentInformation.PersonNumbers)) .Unset(nameof(DocumentInformation.OrganizationNumbers)) .Unset(nameof(DocumentInformation.AccountNumber)) ); } [Test] public async Task Program_AllCases_MigratesDocuments() { await Host.CreateDefaultBuilder() .ConfigureServices(services => { services.RegisterOwnerMigrationServices(); services.AddSingleton(NullLogger.Instance); services.AddSingleton(new DatabaseConfiguration { ConnectionString = _collectionFactory.ConnectionString, DatabaseName = _collectionFactory.DatabaseName(), DocumentContainerName = _collectionFactory.CollectionName() }); }) .Build() .RunAsync(); var migratedDocuments = (await (await _collectionFactory .GetCollection() .FindAsync(Builders.Filter.Empty) ).ToListAsync()) .ToDictionary(d => d.DocumentId); CollectionAssert.AreEqual(_personNumber.Attributes["PersonNumber"].Split(","), migratedDocuments[_personNumber.DocumentId].PersonNumbers); CollectionAssert.AreEqual(_personNumbers.Attributes["PersonNumbers"].Split(","), migratedDocuments[_personNumbers.DocumentId].PersonNumbers); CollectionAssert.AreEqual(_organizationNumber.Attributes["OrganizationNumber"].Split(","), migratedDocuments[_organizationNumber.DocumentId].OrganizationNumbers); CollectionAssert.AreEqual(_organizationNumbers.Attributes["OrganizationNumbers"].Split(","), migratedDocuments[_organizationNumbers.DocumentId].OrganizationNumbers); Assert.AreEqual(_accountNumber.Attributes["AccountNumber"], migratedDocuments[_accountNumber.DocumentId].AccountNumber); CollectionAssert.AreEqual(_personNumber.Attributes["PersonNumber"], migratedDocuments[_personNumber.DocumentId].Attributes["PersonNumber"]); CollectionAssert.AreEqual(_personNumbers.Attributes["PersonNumbers"], migratedDocuments[_personNumbers.DocumentId].Attributes["PersonNumbers"]); CollectionAssert.AreEqual(_organizationNumber.Attributes["OrganizationNumber"], migratedDocuments[_organizationNumber.DocumentId].Attributes["OrganizationNumber"]); CollectionAssert.AreEqual(_organizationNumbers.Attributes["OrganizationNumbers"], migratedDocuments[_organizationNumbers.DocumentId].Attributes["OrganizationNumbers"]); Assert.AreEqual(_accountNumber.Attributes["AccountNumber"], migratedDocuments[_accountNumber.DocumentId].Attributes["AccountNumber"]); CollectionAssert.AreEqual(_personNumberMigrated.PersonNumbers, migratedDocuments[_personNumberMigrated.DocumentId].PersonNumbers); CollectionAssert.AreEqual(_personNumbersMigrated.PersonNumbers, migratedDocuments[_personNumbersMigrated.DocumentId].PersonNumbers); CollectionAssert.AreEqual(_organizationNumberMigrated.OrganizationNumbers, migratedDocuments[_organizationNumberMigrated.DocumentId].OrganizationNumbers); CollectionAssert.AreEqual(_organizationNumbersMigrated.OrganizationNumbers, migratedDocuments[_organizationNumbersMigrated.DocumentId].OrganizationNumbers); CollectionAssert.AreEqual(_accountNumberMigrated.OrganizationNumbers, migratedDocuments[_accountNumberMigrated.DocumentId].OrganizationNumbers); CollectionAssert.AreEqual(_personNumberMigrated.Attributes["PersonNumber"], migratedDocuments[_personNumberMigrated.DocumentId].Attributes["PersonNumber"]); CollectionAssert.AreEqual(_personNumbersMigrated.Attributes["PersonNumbers"], migratedDocuments[_personNumbersMigrated.DocumentId].Attributes["PersonNumbers"]); CollectionAssert.AreEqual(_organizationNumberMigrated.Attributes["OrganizationNumber"], migratedDocuments[_organizationNumberMigrated.DocumentId].Attributes["OrganizationNumber"]); CollectionAssert.AreEqual(_organizationNumbersMigrated.Attributes["OrganizationNumbers"], migratedDocuments[_organizationNumbersMigrated.DocumentId].Attributes["OrganizationNumbers"]); CollectionAssert.AreEqual(_accountNumberMigrated.Attributes["AccountNumber"], migratedDocuments[_accountNumberMigrated.DocumentId].Attributes["AccountNumber"]); } public void Dispose() { _collectionFactory.Dispose(); } }