From ff31ca1177ff57ba324e17dbaf40422185a4649d Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Tue, 8 Oct 2024 11:08:06 +0200 Subject: [PATCH 01/42] Huge clean --- .build/NuGet.config | 13 -- .github/CODEOWNERS | 2 - .github/dependabot.yml | 24 --- .github/pull_request_template.md | 43 ----- .github/release.yml | 14 -- .pipelines/azure-pipelines-pr.yaml | 53 ------ .pipelines/azure-pipelines.yaml | 69 ------- .../Mongo.Migration.Test.Core.csproj | 38 ---- Mongo.Migration.Test/IntegrationTest.cs | 38 ---- .../Database/DatabaseMigrationRunnerSetup.cs | 37 ---- .../Mongo.Migration.Test.csproj | 170 ------------------ .../Properties/AssemblyInfo.cs | 33 ---- Mongo.Migration.Test/packages.config | 17 -- .../Documents/DocumentVersion_When_casting.cs | 4 +- .../Documents/DocumentVersion_When_compare.cs | 16 +- .../DocumentVersion_When_creating.cs | 8 +- .../Documents/Document_when_creating.cs | 4 +- .../AttributeMigrationLocator_when_locate.cs | 6 +- ...rializer_when_serialize_and_deserialize.cs | 11 +- Mongo.Migration.Tests/IntegrationTest.cs | 40 +++++ .../Database/DatabaseIntegrationTest.cs | 44 ++--- .../Database/DatabaseMigrationRunnerSetup.cs | 23 +++ ...baseMigrationRunner_when_migrating_down.cs | 27 ++- ...tabaseMigrationRunner_when_migrating_up.cs | 27 ++- .../DatabaseMigration_when_creating.cs | 6 +- ...mentMigrationRunner_when_migrating_down.cs | 22 +-- ...cumentMigrationRunner_when_migrating_up.cs | 24 ++- .../DocumentMigration_when_creating.cs | 6 +- .../DocumentMigration_when_migrating.cs | 7 +- .../TypeMigrationLocator_when_locate.cs | 23 ++- .../Mongo.Migration.Tests.csproj | 25 +++ .../MongoRegistrater_when_registrating.cs | 12 +- .../Performance/PerformanceOnStartup.cs | 62 ++++--- ...seVersionService_when_determine_version.cs | 19 +- ...ntVersionService_when_determine_version.cs | 23 ++- .../MongoMigration_when_initialize.cs | 15 +- ...grationInterceptorFactory_when_creating.cs | 21 +-- ...InterceptorProvider_when_get_serializer.cs | 15 +- .../Database/TestDatabaseMigration_0_0_1.cs | 3 +- .../Database/TestDatabaseMigration_0_0_2.cs | 3 +- .../Database/TestDatabaseMigration_0_0_3.cs | 3 +- .../TestDoubles/TestClass.cs | 2 +- .../TestDocumentWithOneMigration.cs | 2 +- .../TestDocumentWithOneMigration_0_0_1.cs | 3 +- .../TestDocumentWithTwoMigration.cs | 2 +- ...tDocumentWithTwoMigrationHighestVersion.cs | 3 +- ...entWithTwoMigrationHighestVersion_0_0_1.cs | 3 +- ...entWithTwoMigrationHighestVersion_0_0_2.cs | 3 +- ...stDocumentWithTwoMigrationMiddleVersion.cs | 2 +- ...mentWithTwoMigrationMiddleVersion_0_0_1.cs | 3 +- ...mentWithTwoMigrationMiddleVersion_0_0_2.cs | 3 +- .../TestDocumentWithTwoMigration_0_0_1.cs | 3 +- .../TestDocumentWithTwoMigration_0_0_2.cs | 3 +- Mongo.Migration.sln | 20 +-- .../Attributes/CollectionLocation.cs | 4 +- .../CollectionLocationInformation.cs | 4 +- .../Documents/Attributes/RuntimeVersion.cs | 6 +- .../Documents/Attributes/StartUpVersion.cs | 6 +- Mongo.Migration/Documents/DocumentVersion.cs | 30 ++-- .../Documents/Locators/AbstractLocator.cs | 10 +- .../Documents/Locators/CollectionLocator.cs | 12 +- .../Documents/Locators/ICollectionLocator.cs | 3 - .../Locators/IRuntimeVersionLocator.cs | 4 +- .../Locators/IStartUpVersionLocator.cs | 4 +- .../Locators/RuntimeVersionLocator.cs | 12 +- .../Locators/StartUpVersionLocator.cs | 12 +- .../Exceptions/AlreadyInitializedException.cs | 4 +- .../Exceptions/DuplicateVersionException.cs | 4 +- .../InvalidVersionValueException.cs | 4 +- .../MongoMigrationDatabaseNotFound.cs | 2 - .../MongoMigrationNoMongoClientException.cs | 4 +- .../NoDatabaseNameFoundException.cs | 2 - .../Exceptions/NoMigrationsFoundException.cs | 4 +- .../VersionStringToLongException.cs | 2 - .../Exceptions/VersionViolationException.cs | 4 +- .../Extensions/EnumerableExtensions.cs | 6 +- .../Migrations/Adapters/IContainerAdapter.cs | 6 - .../Adapters/IContainerCollection.cs | 19 -- .../Migrations/Adapters/IContainerProvider.cs | 9 - .../Migrations/Adapters/LightInjectAdapter.cs | 45 ----- .../Migrations/Adapters/ServiceProvider.cs | 19 -- .../Migrations/Database/DatabaseMigration.cs | 6 +- .../Database/DatabaseMigrationRunner.cs | 55 +++--- .../StartUpDatabaseMigrationRunner.cs | 28 ++- .../Migrations/Document/DocumentMigration.cs | 6 +- .../Document/DocumentMigrationRunner.cs | 35 ++-- .../Document/IDocumentMigrationRunner.cs | 4 +- .../StartUpDocumentMigrationRunner.cs | 43 +++-- Mongo.Migration/Migrations/IMigration.cs | 4 +- .../DatabaseTypeMigrationDependencyLocator.cs | 17 +- .../Migrations/Locators/IMigrationLocator.cs | 3 - .../Migrations/Locators/MigrationLocator.cs | 44 +++-- .../TypeMigrationDependencyLocator.cs | 22 +-- .../Locators/TypeMigrationLocator.cs | 10 +- Mongo.Migration/Migrations/Migration.cs | 4 +- Mongo.Migration/Mongo.Migration.csproj | 54 ++---- Mongo.Migration/MongoMigration.cs | 24 +-- Mongo.Migration/Properties/AssemblyInfo.cs | 4 - .../Services/DatabaseVersionService.cs | 18 +- .../Services/DocumentVersionService.cs | 32 ++-- .../Services/IDocumentVersionService.cs | 3 - .../IMigrationInterceptorFactory.cs | 4 +- .../Interceptors/MigrationInterceptor.cs | 8 +- .../MigrationInterceptorFactory.cs | 10 +- .../MigrationInterceptorProvider.cs | 9 +- Mongo.Migration/Services/MigrationService.cs | 35 ++-- .../DotNetCore/MongoMigrationExtensions.cs | 2 - .../Startup/Static/ComponentRegistry.cs | 77 -------- .../Startup/Static/IComponentRegistry.cs | 12 -- .../Startup/Static/MongoMigrationClient.cs | 26 +-- 110 files changed, 533 insertions(+), 1409 deletions(-) delete mode 100644 .build/NuGet.config delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/dependabot.yml delete mode 100644 .github/pull_request_template.md delete mode 100644 .github/release.yml delete mode 100644 .pipelines/azure-pipelines-pr.yaml delete mode 100644 .pipelines/azure-pipelines.yaml delete mode 100644 Mongo.Migration.Test.Core/Mongo.Migration.Test.Core.csproj delete mode 100644 Mongo.Migration.Test/IntegrationTest.cs delete mode 100644 Mongo.Migration.Test/Migrations/Database/DatabaseMigrationRunnerSetup.cs delete mode 100644 Mongo.Migration.Test/Mongo.Migration.Test.csproj delete mode 100644 Mongo.Migration.Test/Properties/AssemblyInfo.cs delete mode 100644 Mongo.Migration.Test/packages.config rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Documents/DocumentVersion_When_casting.cs (93%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Documents/DocumentVersion_When_compare.cs (74%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Documents/DocumentVersion_When_creating.cs (95%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Documents/Document_when_creating.cs (94%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Documents/Locators/AttributeMigrationLocator_when_locate.cs (90%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs (88%) create mode 100644 Mongo.Migration.Tests/IntegrationTest.cs rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Migrations/Database/DatabaseIntegrationTest.cs (50%) create mode 100644 Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs (72%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs (73%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Migrations/Database/DatabaseMigration_when_creating.cs (90%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs (74%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs (75%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Migrations/Document/DocumentMigration_when_creating.cs (91%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Migrations/Document/DocumentMigration_when_migrating.cs (91%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Migrations/Locators/TypeMigrationLocator_when_locate.cs (65%) create mode 100644 Mongo.Migration.Tests/Mongo.Migration.Tests.csproj rename {Mongo.Migration.Test => Mongo.Migration.Tests}/MongoDB/MongoRegistrater_when_registrating.cs (75%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Performance/PerformanceOnStartup.cs (63%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Services/DatabaseVersionService_when_determine_version.cs (65%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Services/DocumentVersionService_when_determine_version.cs (74%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Services/Initializers/MongoMigration_when_initialize.cs (73%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs (71%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs (71%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs (88%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs (88%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs (88%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestClass.cs (76%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestDocumentWithOneMigration.cs (88%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs (94%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestDocumentWithTwoMigration.cs (83%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs (88%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs (94%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs (94%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs (84%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs (94%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs (94%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs (94%) rename {Mongo.Migration.Test => Mongo.Migration.Tests}/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs (94%) delete mode 100644 Mongo.Migration/Migrations/Adapters/IContainerAdapter.cs delete mode 100644 Mongo.Migration/Migrations/Adapters/IContainerCollection.cs delete mode 100644 Mongo.Migration/Migrations/Adapters/IContainerProvider.cs delete mode 100644 Mongo.Migration/Migrations/Adapters/LightInjectAdapter.cs delete mode 100644 Mongo.Migration/Migrations/Adapters/ServiceProvider.cs delete mode 100644 Mongo.Migration/Properties/AssemblyInfo.cs delete mode 100644 Mongo.Migration/Startup/Static/ComponentRegistry.cs delete mode 100644 Mongo.Migration/Startup/Static/IComponentRegistry.cs diff --git a/.build/NuGet.config b/.build/NuGet.config deleted file mode 100644 index 21a6bf8..0000000 --- a/.build/NuGet.config +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 09faa15..0000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,2 +0,0 @@ -# Make the Turing team owner of the entire repo -* @sherweb/dothraki diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 0c2fc8d..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,24 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -registries: - nuget-org: - type: nuget-feed - url: https://api.nuget.org/v3/index.json - sherweb: - type: nuget-feed - url: https://nuget.pkg.github.com/Sherweb/index.json - username: op-github-svc - password: ${{secrets.OP_GITHUB_SVC_PAT}} -updates: - - package-ecosystem: "nuget" # See documentation for possible values - directory: "/" # Location of package manifests - registries: - - nuget-org - - sherweb - schedule: - interval: "daily" - time: "00:00" \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 81a831b..0000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,43 +0,0 @@ -## Summary of changes[^practices] - -````text -This section is where you explain the changes you made. - -Remove this block when done. -```` - -Related Work Item: AB#xxxxx - -## Dependencies - -````text -This section is where you list all the dependencies of this PR. - -Remove this block when done. -Remove this section if empty. -```` - -## Dependents[^deps] - -````text -This section is where you list all the changes to be done after this PR -(breaking changes in contracts, consumers to update, etc.). - -Remove this block when done. -Remove this section if empty. -```` - -### Checks - -- [ ] I have labeled the PR correctly -- [ ] I have set the PR title with the proper versioning[^versioning] prefix (will help for the merge commit message) -- [ ] I have added tests that prove my fix is effective or that my feature works -- [ ] I have maximized the division of this story and could not make multiple smaller PRs -- [ ] I have used stable versions for every package in this PR (if not dependending on an unclosed PR) -- [ ] The changelog is written in the story - -![image](https://app.office-protect.com/assets/office-protect-logo-white.png) - -[^practices]: https://wiki.sherweb.com/display/TUR/Meilleures+pratiques+pour+la+revue+de+pull+requests -[^deps]: https://github.com/sherweb/OfficeProtect.Utils/blob/master/dependencies/README.md -[^versioning]: https://github.com/sherweb/OfficeProtect.Application/blob/master/docs/software/application-versioning.md diff --git a/.github/release.yml b/.github/release.yml deleted file mode 100644 index 08793e7..0000000 --- a/.github/release.yml +++ /dev/null @@ -1,14 +0,0 @@ -changelog: - categories: - - title: Breaking changes - labels: - - breaking change - - title: Features - labels: - - feature - - title: Changes - labels: - - change - - title: Fixes - labels: - - bug diff --git a/.pipelines/azure-pipelines-pr.yaml b/.pipelines/azure-pipelines-pr.yaml deleted file mode 100644 index 0b9f09e..0000000 --- a/.pipelines/azure-pipelines-pr.yaml +++ /dev/null @@ -1,53 +0,0 @@ -parameters: - - name: arrayExecs - type: object - default: - - none - - name: arrayPackages - type: object - default: - - Mongo.Migration - - name: arrayTests - type: object - default: - - none - - name: dockerfilePath - type: string - default: "none" - - name: dotNetSdkVersion - type: string - default: '6.x' - - name: gitRepoName - type: string - default: "Mongo.Migration" - -variables: - - group: github-credentials - -pr: - - main - - master -trigger: none - -pool: - vmImage: 'ubuntu-latest' - -resources: - repositories: - - repository: tools - type: git - name: OfficeProtect/tools - ref: main - -stages: - - stage: PR_Analysis - displayName: Lint, Tests and Static Analysis - jobs: - - template: azdoTemplates/workflows/pr-dotnet.yaml@tools - parameters: - arrayExecs: ${{ parameters.arrayExecs }} - arrayPackages: ${{ parameters.arrayPackages }} - arrayTests: ${{ parameters.arrayTests }} - dockerfilePath: "${{ parameters.dockerfilePath }}" - dotNetSdkVersion: "${{ parameters.dotNetSdkVersion }}" - projectPath: "$(System.DefaultWorkingDirectory)/${{ parameters.gitRepoName }}" diff --git a/.pipelines/azure-pipelines.yaml b/.pipelines/azure-pipelines.yaml deleted file mode 100644 index 36cd355..0000000 --- a/.pipelines/azure-pipelines.yaml +++ /dev/null @@ -1,69 +0,0 @@ -parameters: - - name: acrRepoURI - type: string - default: 'acr0opp0dev0root0sw.azurecr.io' - - name: arrayExecs - type: object - default: - - none - - name: arrayPackages - type: object - default: - - Mongo.Migration - - name: arrayTests - type: object - default: - - none - - name: dockerfilePath - type: string - default: "none" - - name: dotNetSdkVersion - type: string - default: '6.x' - - name: gitRepoName - type: string - default: "Mongo.Migration" - -variables: - - group: DatadogCI - - group: github-credentials - -pr: none -trigger: - branches: - include: - - 'main' - - 'master' - -pool: - vmImage: 'ubuntu-latest' - -resources: - repositories: - - repository: tools - type: git - name: OfficeProtect/tools - ref: main - - repository: kube-services - type: github - endpoint: op-github-svc - name: sherweb/kube-services - ref: dev - -stages: - - stage: CI_CD - displayName: DotNet Continuous Integration & Deployment - jobs: - - template: azdoTemplates/workflows/ci-dotnet.yaml@tools - parameters: - acrRepoURI: "${{ parameters.acrRepoURI }}" - arrayExecs: ${{ parameters.arrayExecs }} - arrayPackages: ${{ parameters.arrayPackages }} - arrayTests: ${{ parameters.arrayTests }} - dockerfilePath: "${{ parameters.dockerfilePath }}" - dotNetSdkVersion: "${{ parameters.dotNetSdkVersion }}" - projectPath: "$(System.DefaultWorkingDirectory)/${{ parameters.gitRepoName }}" - - template: azdoTemplates/workflows/cd-docker.yaml@tools - parameters: - env: "dev" - imageNames: ${{ parameters.arrayExecs }} diff --git a/Mongo.Migration.Test.Core/Mongo.Migration.Test.Core.csproj b/Mongo.Migration.Test.Core/Mongo.Migration.Test.Core.csproj deleted file mode 100644 index d4abe21..0000000 --- a/Mongo.Migration.Test.Core/Mongo.Migration.Test.Core.csproj +++ /dev/null @@ -1,38 +0,0 @@ - - - false - Library - net6.0 - x64 - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - \ No newline at end of file diff --git a/Mongo.Migration.Test/IntegrationTest.cs b/Mongo.Migration.Test/IntegrationTest.cs deleted file mode 100644 index 418d395..0000000 --- a/Mongo.Migration.Test/IntegrationTest.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; - -using Mongo.Migration.Startup; -using Mongo.Migration.Startup.Static; - -using Mongo2Go; - -using MongoDB.Driver; - -namespace Mongo.Migration.Test -{ - public class IntegrationTest : IDisposable - { - protected IMongoClient _client; - - protected IComponentRegistry _components; - - protected MongoDbRunner _mongoToGoRunner; - - public void Dispose() - { - this._mongoToGoRunner?.Dispose(); - } - - protected void OnSetUp() - { - this._mongoToGoRunner = MongoDbRunner.Start(); - this._client = new MongoClient(this._mongoToGoRunner.ConnectionString); - - this._client.GetDatabase("PerformanceTest").CreateCollection("Test"); - - this._components = new ComponentRegistry( - new MongoMigrationSettings - { ConnectionString = this._mongoToGoRunner.ConnectionString, Database = "PerformanceTest" }); - this._components.RegisterComponents(this._client); - } - } -} \ No newline at end of file diff --git a/Mongo.Migration.Test/Migrations/Database/DatabaseMigrationRunnerSetup.cs b/Mongo.Migration.Test/Migrations/Database/DatabaseMigrationRunnerSetup.cs deleted file mode 100644 index d35f768..0000000 --- a/Mongo.Migration.Test/Migrations/Database/DatabaseMigrationRunnerSetup.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Mongo.Migration.Documents.Serializers; - -using MongoDB.Bson; -using MongoDB.Bson.Serialization; - -using NLog; - -using NUnit.Framework; - -namespace Mongo.Migration.Test.Migrations.Database -{ - [SetUpFixture] - public class DatabaseMigrationRunnerSetup - { - private readonly Logger _logger = LogManager.GetCurrentClassLogger(); - - [OneTimeSetUp] - public void GlobalSetup() - { - try - { - var documentSerializaer = new DocumentVersionSerializer(); - BsonSerializer.RegisterSerializer(documentSerializaer.ValueType, documentSerializaer); - } - catch (BsonSerializationException ex) - { - this._logger.Warn(ex); - } - } - - [OneTimeTearDown] - public void GlobalTeardown() - { - // Do logout here - } - } -} \ No newline at end of file diff --git a/Mongo.Migration.Test/Mongo.Migration.Test.csproj b/Mongo.Migration.Test/Mongo.Migration.Test.csproj deleted file mode 100644 index cb0686d..0000000 --- a/Mongo.Migration.Test/Mongo.Migration.Test.csproj +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - Debug - AnyCPU - {8EDF4429-251A-416D-BB68-93F227191BCF} - Library - Properties - Mongo.Migration.Test - Mongo.Migration.Test - v4.8 - 512 - - default - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll - True - - - ..\packages\DnsClient.1.2.0\lib\net45\DnsClient.dll - True - - - ..\packages\FluentAssertions.5.6.0\lib\net47\FluentAssertions.dll - True - - - - ..\packages\Mongo2Go.2.2.11\lib\netstandard1.6\Mongo2Go.dll - True - - - ..\packages\MongoDB.Bson.2.8.0\lib\net452\MongoDB.Bson.dll - True - - - ..\packages\MongoDB.Driver.2.8.0\lib\net452\MongoDB.Driver.dll - True - - - ..\packages\MongoDB.Driver.Core.2.8.0\lib\net452\MongoDB.Driver.Core.dll - True - - - - ..\packages\NSubstitute.4.1.0\lib\net46\NSubstitute.dll - True - - - ..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll - True - - - - ..\packages\System.Buffers.4.5.0\lib\netstandard2.0\System.Buffers.dll - True - - - - ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll - True - - - ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll - True - - - ..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - True - - - ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {8dffd615-1e1a-4bed-8a96-caf4c3637e81} - Mongo.Migration - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}. - - - - - \ No newline at end of file diff --git a/Mongo.Migration.Test/Properties/AssemblyInfo.cs b/Mongo.Migration.Test/Properties/AssemblyInfo.cs deleted file mode 100644 index 5edd146..0000000 --- a/Mongo.Migration.Test/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Mongo.Migration.Test")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("nunit.tests")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Mongo.Migration.Test/packages.config b/Mongo.Migration.Test/packages.config deleted file mode 100644 index 25ca16e..0000000 --- a/Mongo.Migration.Test/packages.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Mongo.Migration.Test/Documents/DocumentVersion_When_casting.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs similarity index 93% rename from Mongo.Migration.Test/Documents/DocumentVersion_When_casting.cs rename to Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs index dfb20ed..a3f1c82 100644 --- a/Mongo.Migration.Test/Documents/DocumentVersion_When_casting.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs @@ -1,10 +1,8 @@ using FluentAssertions; - using Mongo.Migration.Documents; - using NUnit.Framework; -namespace Mongo.Migration.Test.Documents +namespace Mongo.Migration.Tests.Documents { [TestFixture] public class DocumentVersion_When_casting diff --git a/Mongo.Migration.Test/Documents/DocumentVersion_When_compare.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs similarity index 74% rename from Mongo.Migration.Test/Documents/DocumentVersion_When_compare.cs rename to Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs index 3cd31c3..3de5428 100644 --- a/Mongo.Migration.Test/Documents/DocumentVersion_When_compare.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs @@ -1,10 +1,8 @@ using FluentAssertions; - using Mongo.Migration.Documents; - using NUnit.Framework; -namespace Mongo.Migration.Test.Documents +namespace Mongo.Migration.Tests.Documents { [TestFixture] public class DocumentVersion_When_compare @@ -18,7 +16,7 @@ public class DocumentVersion_When_compare [Test] public void If_higherVersion_lte_equalLowerVersion_Then_false() { - bool result = this.higherVersion <= this.lowerVersion; + bool result = higherVersion <= lowerVersion; result.Should().BeFalse(); } @@ -26,7 +24,7 @@ public void If_higherVersion_lte_equalLowerVersion_Then_false() [Test] public void If_lowerVersion_gt_higherVersion_Then_false() { - bool result = this.lowerVersion > this.higherVersion; + bool result = lowerVersion > higherVersion; result.Should().BeFalse(); } @@ -34,7 +32,7 @@ public void If_lowerVersion_gt_higherVersion_Then_false() [Test] public void If_lowerVersion_gte_equalLowerVersion_Then_true() { - bool result = this.lowerVersion >= this.equalLowerVersion; + bool result = lowerVersion >= equalLowerVersion; result.Should().BeTrue(); } @@ -42,7 +40,7 @@ public void If_lowerVersion_gte_equalLowerVersion_Then_true() [Test] public void If_lowerVersion_gte_higherVersion_Then_false() { - bool result = this.lowerVersion >= this.higherVersion; + bool result = lowerVersion >= higherVersion; result.Should().BeFalse(); } @@ -50,7 +48,7 @@ public void If_lowerVersion_gte_higherVersion_Then_false() [Test] public void If_lowerVersion_lt_higherVersion_Then_true() { - bool result = this.lowerVersion < this.higherVersion; + bool result = lowerVersion < higherVersion; result.Should().BeTrue(); } @@ -58,7 +56,7 @@ public void If_lowerVersion_lt_higherVersion_Then_true() [Test] public void If_lowerVersion_lte_equalLowerVersion_Then_true() { - bool result = this.lowerVersion <= this.equalLowerVersion; + bool result = lowerVersion <= equalLowerVersion; result.Should().BeTrue(); } diff --git a/Mongo.Migration.Test/Documents/DocumentVersion_When_creating.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs similarity index 95% rename from Mongo.Migration.Test/Documents/DocumentVersion_When_creating.cs rename to Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs index a3ff804..4d7e0c5 100644 --- a/Mongo.Migration.Test/Documents/DocumentVersion_When_creating.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs @@ -1,13 +1,9 @@ -using System; - -using FluentAssertions; - +using FluentAssertions; using Mongo.Migration.Documents; using Mongo.Migration.Exceptions; - using NUnit.Framework; -namespace Mongo.Migration.Test.Documents +namespace Mongo.Migration.Tests.Documents { [TestFixture] public class DocumentVersion_When_creating diff --git a/Mongo.Migration.Test/Documents/Document_when_creating.cs b/Mongo.Migration.Tests/Documents/Document_when_creating.cs similarity index 94% rename from Mongo.Migration.Test/Documents/Document_when_creating.cs rename to Mongo.Migration.Tests/Documents/Document_when_creating.cs index 3fc4797..fa58158 100644 --- a/Mongo.Migration.Test/Documents/Document_when_creating.cs +++ b/Mongo.Migration.Tests/Documents/Document_when_creating.cs @@ -1,10 +1,8 @@ using FluentAssertions; - using Mongo.Migration.Documents; - using NUnit.Framework; -namespace Mongo.Migration.Test.Documents +namespace Mongo.Migration.Tests.Documents { [TestFixture] public class Document_when_creating diff --git a/Mongo.Migration.Test/Documents/Locators/AttributeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs similarity index 90% rename from Mongo.Migration.Test/Documents/Locators/AttributeMigrationLocator_when_locate.cs rename to Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs index dd6cb8c..4878575 100644 --- a/Mongo.Migration.Test/Documents/Locators/AttributeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs @@ -1,11 +1,9 @@ using FluentAssertions; - using Mongo.Migration.Documents.Locators; -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Test.Documents.Locators +namespace Mongo.Migration.Tests.Documents.Locators { [TestFixture] internal class VersionLocator_when_locate diff --git a/Mongo.Migration.Test/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs similarity index 88% rename from Mongo.Migration.Test/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs rename to Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs index 0439e97..9909c96 100644 --- a/Mongo.Migration.Test/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs +++ b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs @@ -1,15 +1,12 @@ using FluentAssertions; - using Mongo.Migration.Documents; using Mongo.Migration.Documents.Serializers; - using MongoDB.Bson; using MongoDB.Bson.IO; using MongoDB.Bson.Serialization; - using NUnit.Framework; -namespace Mongo.Migration.Test.Documents.Serializers +namespace Mongo.Migration.Tests.Documents.Serializers { [TestFixture] public class DocumentVersionSerializer_when_serialize_and_deserialize @@ -27,7 +24,7 @@ public void Then_version_is_deserialized_correct() var args = new BsonDeserializationArgs { NominalType = typeof(DocumentVersion) }; // Act - DocumentVersion result = this._serializer.Deserialize(context, args); + DocumentVersion result = _serializer.Deserialize(context, args); // Assert result.Should().BeOfType(); @@ -44,7 +41,7 @@ public void Then_version_is_serialized_correct() var version = new DocumentVersion("0.0.1"); // Act - this._serializer.Serialize(context, args, version); + _serializer.Serialize(context, args, version); // Assert BsonDocument document = writer.Document; @@ -54,7 +51,7 @@ public void Then_version_is_serialized_correct() [SetUp] public void SetUp() { - this._serializer = new DocumentVersionSerializer(); + _serializer = new DocumentVersionSerializer(); } private static BsonDocumentReader CreateVersionReader(BsonDocument document) diff --git a/Mongo.Migration.Tests/IntegrationTest.cs b/Mongo.Migration.Tests/IntegrationTest.cs new file mode 100644 index 0000000..7dc88ee --- /dev/null +++ b/Mongo.Migration.Tests/IntegrationTest.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Mongo.Migration.Startup; +using Mongo.Migration.Startup.DotNetCore; +using Mongo2Go; +using MongoDB.Driver; + +namespace Mongo.Migration.Tests +{ + public class IntegrationTest : IDisposable + { + protected IMongoClient _client; + + protected IServiceProvider _serviceProvider; + + protected MongoDbRunner _mongoToGoRunner; + + public void Dispose() + { + _mongoToGoRunner?.Dispose(); + } + + protected void OnSetUp() + { + _mongoToGoRunner = MongoDbRunner.Start(); + _client = new MongoClient(_mongoToGoRunner.ConnectionString); + + _client.GetDatabase("PerformanceTest").CreateCollection("Test"); + + ServiceCollection serviceCollection = new ServiceCollection(); + serviceCollection + .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) + .AddSingleton(_client) + .AddMigration(new MongoMigrationSettings { ConnectionString = _mongoToGoRunner.ConnectionString, Database = "PerformanceTest" }); + + _serviceProvider = serviceCollection.BuildServiceProvider(); + } + } +} \ No newline at end of file diff --git a/Mongo.Migration.Test/Migrations/Database/DatabaseIntegrationTest.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs similarity index 50% rename from Mongo.Migration.Test/Migrations/Database/DatabaseIntegrationTest.cs rename to Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs index 07f8933..24e37f5 100644 --- a/Mongo.Migration.Test/Migrations/Database/DatabaseIntegrationTest.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs @@ -1,18 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Linq; - +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Startup; -using Mongo.Migration.Startup.Static; - +using Mongo.Migration.Startup.DotNetCore; using Mongo2Go; - using MongoDB.Bson; using MongoDB.Driver; -namespace Mongo.Migration.Test.Migrations.Database +namespace Mongo.Migration.Tests.Migrations.Database { internal class DatabaseIntegrationTest : IDisposable { @@ -20,7 +17,7 @@ internal class DatabaseIntegrationTest : IDisposable protected IMongoClient _client; - protected IComponentRegistry _components; + protected IServiceProvider _serviceProvider; protected IMongoDatabase _db; @@ -32,35 +29,40 @@ internal class DatabaseIntegrationTest : IDisposable public void Dispose() { - this._mongoToGoRunner?.Dispose(); + _mongoToGoRunner?.Dispose(); } protected virtual void OnSetUp(DocumentVersion databaseMigrationVersion) { - this._mongoToGoRunner = MongoDbRunner.Start(); - this._client = new MongoClient(this._mongoToGoRunner.ConnectionString); - this._db = this._client.GetDatabase(this.DatabaseName); - this._db.CreateCollection(this.CollectionName); + _mongoToGoRunner = MongoDbRunner.Start(); + _client = new MongoClient(_mongoToGoRunner.ConnectionString); + _db = _client.GetDatabase(DatabaseName); + _db.CreateCollection(CollectionName); - this._components = new ComponentRegistry( - new MongoMigrationSettings + + ServiceCollection serviceCollection = new ServiceCollection(); + serviceCollection + .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) + .AddSingleton(_client) + .AddMigration(new MongoMigrationSettings { - ConnectionString = this._mongoToGoRunner.ConnectionString, - Database = this.DatabaseName, + ConnectionString = _mongoToGoRunner.ConnectionString, + Database = DatabaseName, DatabaseMigrationVersion = databaseMigrationVersion }); - this._components.RegisterComponents(this._client); + + _serviceProvider = serviceCollection.BuildServiceProvider(); } protected void InsertMigrations(IEnumerable migrations) { var list = migrations.Select(m => new BsonDocument { { "MigrationId", m.GetType().ToString() }, { "Version", m.Version.ToString() } }); - this._db.GetCollection(MigrationsCollectionName).InsertManyAsync(list).Wait(); + _db.GetCollection(MigrationsCollectionName).InsertManyAsync(list).Wait(); } protected List GetMigrationHistory() { - var migrationHistoryCollection = this._db.GetCollection(MigrationsCollectionName); + var migrationHistoryCollection = _db.GetCollection(MigrationsCollectionName); return migrationHistoryCollection.Find(m => true).ToList(); } } diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs new file mode 100644 index 0000000..68ac5b6 --- /dev/null +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs @@ -0,0 +1,23 @@ +using Mongo.Migration.Documents.Serializers; +using MongoDB.Bson.Serialization; +using NUnit.Framework; + +namespace Mongo.Migration.Tests.Migrations.Database +{ + [SetUpFixture] + public class DatabaseMigrationRunnerSetup + { + [OneTimeSetUp] + public void GlobalSetup() + { + var documentVersionSerializer = new DocumentVersionSerializer(); + BsonSerializer.TryRegisterSerializer(documentVersionSerializer.ValueType, documentVersionSerializer); + } + + [OneTimeTearDown] + public void GlobalTeardown() + { + // Do logout here + } + } +} \ No newline at end of file diff --git a/Mongo.Migration.Test/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs similarity index 72% rename from Mongo.Migration.Test/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs rename to Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs index 96e4f3e..53b35b4 100644 --- a/Mongo.Migration.Test/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs @@ -1,12 +1,11 @@ using FluentAssertions; - +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Database; -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles.Database; using NUnit.Framework; -namespace Mongo.Migration.Test.Migrations.Database +namespace Mongo.Migration.Tests.Migrations.Database { [TestFixture] internal class DatabaseMigrationRunner_when_migrating_down : DatabaseIntegrationTest @@ -17,22 +16,22 @@ protected override void OnSetUp(DocumentVersion databaseMigrationVersion) { base.OnSetUp(databaseMigrationVersion); - this._runner = this._components.Get(); + _runner = _serviceProvider.GetRequiredService(); } [TearDown] public void TearDown() { - this.Dispose(); + Dispose(); } [Test] public void When_database_has_migrations_Then_down_all_migrations() { - this.OnSetUp(DocumentVersion.Default()); + OnSetUp(DocumentVersion.Default()); // Arrange - this.InsertMigrations( + InsertMigrations( new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), @@ -41,20 +40,20 @@ public void When_database_has_migrations_Then_down_all_migrations() }); // Act - this._runner.Run(this._db); + _runner.Run(_db); // Assert - var migrations = this.GetMigrationHistory(); + var migrations = GetMigrationHistory(); migrations.Should().BeEmpty(); } [Test] public void When_database_has_migrations_Then_down_to_selected_migration() { - this.OnSetUp(new DocumentVersion("0.0.1")); + OnSetUp(new DocumentVersion("0.0.1")); // Arrange - this.InsertMigrations( + InsertMigrations( new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), @@ -63,10 +62,10 @@ public void When_database_has_migrations_Then_down_to_selected_migration() }); // Act - this._runner.Run(this._db); + _runner.Run(_db); // Assert - var migrations = this.GetMigrationHistory(); + var migrations = GetMigrationHistory(); migrations.Should().NotBeEmpty(); migrations.Should().OnlyContain(m => m.Version == "0.0.1"); } diff --git a/Mongo.Migration.Test/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs similarity index 73% rename from Mongo.Migration.Test/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs rename to Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs index 7a03cf0..8884b47 100644 --- a/Mongo.Migration.Test/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs @@ -1,12 +1,11 @@ using FluentAssertions; - +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Database; -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles.Database; using NUnit.Framework; -namespace Mongo.Migration.Test.Migrations.Database +namespace Mongo.Migration.Tests.Migrations.Database { [TestFixture] internal class DatabaseMigrationRunner_when_migrating_up : DatabaseIntegrationTest @@ -18,23 +17,23 @@ public void SetUp() { base.OnSetUp(DocumentVersion.Empty()); - this._runner = this._components.Get(); + _runner = _serviceProvider.GetRequiredService(); } [TearDown] public void TearDown() { - this.Dispose(); + Dispose(); } [Test] public void When_database_has_no_migrations_Then_all_migrations_are_used() { // Act - this._runner.Run(this._db); + _runner.Run(_db); // Assert - var migrations = this.GetMigrationHistory(); + var migrations = GetMigrationHistory(); migrations.Should().NotBeEmpty(); migrations[0].Version.ToString().Should().BeEquivalentTo("0.0.1"); migrations[1].Version.ToString().Should().BeEquivalentTo("0.0.2"); @@ -45,13 +44,13 @@ public void When_database_has_no_migrations_Then_all_migrations_are_used() public void When_database_has_migrations_Then_latest_migrations_are_used() { // Arrange - this.InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), new TestDatabaseMigration_0_0_2() }); + InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), new TestDatabaseMigration_0_0_2() }); // Act - this._runner.Run(this._db); + _runner.Run(_db); // Assert - var migrations = this.GetMigrationHistory(); + var migrations = GetMigrationHistory(); migrations.Should().NotBeEmpty(); migrations[2].Version.ToString().Should().BeEquivalentTo("0.0.3"); } @@ -60,14 +59,14 @@ public void When_database_has_migrations_Then_latest_migrations_are_used() public void When_database_has_latest_version_Then_nothing_happens() { // Arrange - this.InsertMigrations( + InsertMigrations( new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), new TestDatabaseMigration_0_0_2(), new TestDatabaseMigration_0_0_3() }); // Act - this._runner.Run(this._db); + _runner.Run(_db); // Assert - var migrations = this.GetMigrationHistory(); + var migrations = GetMigrationHistory(); migrations.Should().NotBeEmpty(); migrations[0].Version.ToString().Should().BeEquivalentTo("0.0.1"); migrations[1].Version.ToString().Should().BeEquivalentTo("0.0.2"); diff --git a/Mongo.Migration.Test/Migrations/Database/DatabaseMigration_when_creating.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs similarity index 90% rename from Mongo.Migration.Test/Migrations/Database/DatabaseMigration_when_creating.cs rename to Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs index 1e3cc95..58e51a3 100644 --- a/Mongo.Migration.Test/Migrations/Database/DatabaseMigration_when_creating.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs @@ -1,11 +1,9 @@ using FluentAssertions; - using Mongo.Migration.Migrations.Database; -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles.Database; using NUnit.Framework; -namespace Mongo.Migration.Test.Migrations.Database +namespace Mongo.Migration.Tests.Migrations.Database { [TestFixture] public class DatabaseMigration_when_creating diff --git a/Mongo.Migration.Test/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs similarity index 74% rename from Mongo.Migration.Test/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs rename to Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs index 8f6e382..a5e41a8 100644 --- a/Mongo.Migration.Test/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs @@ -1,15 +1,11 @@ -using System.Linq; - -using FluentAssertions; - +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Migrations.Document; -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles; using MongoDB.Bson; - using NUnit.Framework; -namespace Mongo.Migration.Test.Migrations.Document +namespace Mongo.Migration.Tests.Migrations.Document { [TestFixture] internal class DocumentMigrationRunner_when_migrating_down : IntegrationTest @@ -19,15 +15,15 @@ internal class DocumentMigrationRunner_when_migrating_down : IntegrationTest [SetUp] public void SetUp() { - this.OnSetUp(); + OnSetUp(); - this._runner = this._components.Get(); + _runner = _serviceProvider.GetRequiredService(); } [TearDown] public void TearDown() { - this.Dispose(); + Dispose(); } [Test] @@ -41,7 +37,7 @@ public void When_migrating_down_Then_all_migrations_are_used() }; // Act - this._runner.Run(typeof(TestDocumentWithTwoMigration), document); + _runner.Run(typeof(TestDocumentWithTwoMigration), document); // Assert document.Names.ToList()[1].Should().Be("Dors"); @@ -60,7 +56,7 @@ public void When_document_has_Then_all_migrations_are_used_to_that_version() }; // Act - this._runner.Run(typeof(TestDocumentWithTwoMigrationMiddleVersion), document); + _runner.Run(typeof(TestDocumentWithTwoMigrationMiddleVersion), document); // Assert document.Names.ToList()[1].Should().Be("Doors"); diff --git a/Mongo.Migration.Test/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs similarity index 75% rename from Mongo.Migration.Test/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs rename to Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs index 7a1b466..289f0c2 100644 --- a/Mongo.Migration.Test/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs @@ -1,15 +1,11 @@ -using System.Linq; - -using FluentAssertions; - +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Migrations.Document; -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles; using MongoDB.Bson; - using NUnit.Framework; -namespace Mongo.Migration.Test.Migrations.Document +namespace Mongo.Migration.Tests.Migrations.Document { [TestFixture] internal class DocumentMigrationRunner_when_migrating_up : IntegrationTest @@ -19,15 +15,15 @@ internal class DocumentMigrationRunner_when_migrating_up : IntegrationTest [SetUp] public void SetUp() { - this.OnSetUp(); + OnSetUp(); - this._runner = this._components.Get(); + _runner = _serviceProvider.GetRequiredService(); } [TearDown] public void TearDown() { - this.Dispose(); + Dispose(); } [Test] @@ -41,7 +37,7 @@ public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() }; // Act - this._runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); + _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert document.Names.ToList()[1].Should().Be("Door"); @@ -58,7 +54,7 @@ public void When_document_has_no_version_Then_all_migrations_are_used() }; // Act - this._runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); + _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert document.Names.ToList()[1].Should().Be("Door"); @@ -76,7 +72,7 @@ public void When_document_has_current_version_Then_nothing_happens() }; // Act - this._runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); + _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert document.Names.ToList()[1].Should().Be("Door"); diff --git a/Mongo.Migration.Test/Migrations/Document/DocumentMigration_when_creating.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs similarity index 91% rename from Mongo.Migration.Test/Migrations/Document/DocumentMigration_when_creating.cs rename to Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs index 610f5fa..be8d3e6 100644 --- a/Mongo.Migration.Test/Migrations/Document/DocumentMigration_when_creating.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs @@ -1,10 +1,8 @@ using FluentAssertions; - -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Test.Migrations.Document +namespace Mongo.Migration.Tests.Migrations.Document { [TestFixture] public class DocumentMigration_when_creating diff --git a/Mongo.Migration.Test/Migrations/Document/DocumentMigration_when_migrating.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs similarity index 91% rename from Mongo.Migration.Test/Migrations/Document/DocumentMigration_when_migrating.cs rename to Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs index 830dbb2..80fb6fa 100644 --- a/Mongo.Migration.Test/Migrations/Document/DocumentMigration_when_migrating.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs @@ -1,12 +1,9 @@ using FluentAssertions; - -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles; using MongoDB.Bson; - using NUnit.Framework; -namespace Mongo.Migration.Test.Migrations.Document +namespace Mongo.Migration.Tests.Migrations.Document { [TestFixture] public class DocumentMigration_when_migrating diff --git a/Mongo.Migration.Test/Migrations/Locators/TypeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs similarity index 65% rename from Mongo.Migration.Test/Migrations/Locators/TypeMigrationLocator_when_locate.cs rename to Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs index 0bb8deb..364307d 100644 --- a/Mongo.Migration.Test/Migrations/Locators/TypeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs @@ -1,13 +1,10 @@ -using System.Linq; - -using FluentAssertions; - +using FluentAssertions; +using Microsoft.Extensions.Logging.Abstractions; using Mongo.Migration.Migrations.Locators; -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Test.Migrations.Locators +namespace Mongo.Migration.Tests.Migrations.Locators { [TestFixture] public class TypeMigrationLocator_when_locate @@ -18,14 +15,14 @@ public class TypeMigrationLocator_when_locate public void OneTimeSetUp() { // Arrange - this._locator = new TypeMigrationLocator(); + _locator = new TypeMigrationLocator(NullLogger.Instance); } [Test] public void When_document_has_one_migration_Then_migrations_count_should_be_one() { // Act - var result = this._locator.GetMigrations(typeof(TestDocumentWithOneMigration)); + var result = _locator.GetMigrations(typeof(TestDocumentWithOneMigration)); // Assert result.Count().Should().Be(1); @@ -35,7 +32,7 @@ public void When_document_has_one_migration_Then_migrations_count_should_be_one( public void When_document_has_two_migration_Then_migrations_count_should_be_two() { // Act - var result = this._locator.GetMigrations(typeof(TestDocumentWithTwoMigration)); + var result = _locator.GetMigrations(typeof(TestDocumentWithTwoMigration)); // Assert result.Count().Should().Be(2); @@ -45,7 +42,7 @@ public void When_document_has_two_migration_Then_migrations_count_should_be_two( public void When_get_latest_version_of_migrations() { // Act - var version = this._locator.GetLatestVersion(typeof(TestDocumentWithTwoMigration)); + var version = _locator.GetLatestVersion(typeof(TestDocumentWithTwoMigration)); // Assert version.Should().Be("0.0.2"); @@ -55,7 +52,7 @@ public void When_get_latest_version_of_migrations() public void When_get_migrations_gt_and_equal_version() { // Act - var result = this._locator.GetMigrationsGtEq(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); + var result = _locator.GetMigrationsGtEq(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); // Assert result[0].Should().BeOfType(); @@ -66,7 +63,7 @@ public void When_get_migrations_gt_and_equal_version() public void When_get_migrations_gt_version() { // Act - var result = this._locator.GetMigrationsGt(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); + var result = _locator.GetMigrationsGt(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); // Assert result[0].Should().BeOfType(); diff --git a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj new file mode 100644 index 0000000..b36a495 --- /dev/null +++ b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj @@ -0,0 +1,25 @@ + + + + net7.0;net8.0 + enable + enable + false + true + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Mongo.Migration.Test/MongoDB/MongoRegistrater_when_registrating.cs b/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs similarity index 75% rename from Mongo.Migration.Test/MongoDB/MongoRegistrater_when_registrating.cs rename to Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs index 370e559..0cec292 100644 --- a/Mongo.Migration.Test/MongoDB/MongoRegistrater_when_registrating.cs +++ b/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs @@ -1,13 +1,11 @@ using FluentAssertions; - +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Documents; using Mongo.Migration.Services; - using MongoDB.Bson.Serialization; - using NUnit.Framework; -namespace Mongo.Migration.Test.MongoDB +namespace Mongo.Migration.Tests.MongoDB { [TestFixture] internal class MongoRegistrator_when_registrating : IntegrationTest @@ -15,20 +13,20 @@ internal class MongoRegistrator_when_registrating : IntegrationTest [SetUp] public void SetUp() { - this.OnSetUp(); + OnSetUp(); } [TearDown] public void TearDown() { - this.Dispose(); + Dispose(); } [Test] public void Then_serializer_is_registered() { // Arrange - var migrationService = this._components.Get(); + var migrationService = _serviceProvider.GetRequiredService(); // Act migrationService.Migrate(); diff --git a/Mongo.Migration.Test/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs similarity index 63% rename from Mongo.Migration.Test/Performance/PerformanceOnStartup.cs rename to Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index d675dd8..8e4b047 100644 --- a/Mongo.Migration.Test/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -1,20 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; - +using System.Diagnostics; using FluentAssertions; - +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Mongo.Migration.Startup; +using Mongo.Migration.Startup.DotNetCore; using Mongo.Migration.Startup.Static; -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles; using Mongo2Go; - using MongoDB.Bson; using MongoDB.Driver; - using NUnit.Framework; -namespace Mongo.Migration.Test.Performance +namespace Mongo.Migration.Tests.Performance { [TestFixture] public class PerformanceTestOnStartup @@ -35,15 +33,15 @@ public class PerformanceTestOnStartup public void TearDown() { MongoMigrationClient.Reset(); - this._client = null; - this._runner.Dispose(); + _client = null; + _runner.Dispose(); } [SetUp] public void SetUp() { - this._runner = MongoDbRunner.Start(); - this._client = new MongoClient(this._runner.ConnectionString); + _runner = MongoDbRunner.Start(); + _client = new MongoClient(_runner.ConnectionString); } [Test] @@ -51,28 +49,34 @@ public void When_migrating_number_of_documents() { // Arrange // Worm up MongoCache - this.ClearCollection(); - this.AddDocumentsToCache(); - this.ClearCollection(); + ClearCollection(); + AddDocumentsToCache(); + ClearCollection(); // Act // Measure time of MongoDb processing without Mongo.Migration - this.InsertMany(DOCUMENT_COUNT, false); + InsertMany(DOCUMENT_COUNT, false); var sw = new Stopwatch(); sw.Start(); - this.MigrateAll(false); + MigrateAll(false); sw.Stop(); - this.ClearCollection(); + ClearCollection(); // Measure time of MongoDb processing without Mongo.Migration - this.InsertMany(DOCUMENT_COUNT, true); + InsertMany(DOCUMENT_COUNT, true); var swWithMigration = new Stopwatch(); swWithMigration.Start(); - MongoMigrationClient.Initialize(this._client); + ServiceCollection serviceCollection = new ServiceCollection(); + serviceCollection + .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) + .AddSingleton(_client) + .AddMigration(new MongoMigrationSettings()); + ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); + MongoMigrationClient.Initialize(serviceProvider); swWithMigration.Stop(); - this.ClearCollection(); + ClearCollection(); var result = swWithMigration.ElapsedMilliseconds - sw.ElapsedMilliseconds; @@ -100,7 +104,7 @@ private void InsertMany(int number, bool withVersion) documents.Add(document); } - this._client.GetDatabase(DATABASE_NAME).GetCollection(COLLECTION_NAME).InsertManyAsync(documents) + _client.GetDatabase(DATABASE_NAME).GetCollection(COLLECTION_NAME).InsertManyAsync(documents) .Wait(); } @@ -108,26 +112,26 @@ private void MigrateAll(bool withVersion) { if (withVersion) { - var versionedCollectin = this._client.GetDatabase(DATABASE_NAME) + var versionedCollectin = _client.GetDatabase(DATABASE_NAME) .GetCollection(COLLECTION_NAME); var versionedResult = versionedCollectin.FindAsync(_ => true).Result.ToListAsync().Result; return; } - var collection = this._client.GetDatabase(DATABASE_NAME) + var collection = _client.GetDatabase(DATABASE_NAME) .GetCollection(COLLECTION_NAME); var result = collection.FindAsync(_ => true).Result.ToListAsync().Result; } private void AddDocumentsToCache() { - this.InsertMany(DOCUMENT_COUNT, false); - this.MigrateAll(false); + InsertMany(DOCUMENT_COUNT, false); + MigrateAll(false); } private void ClearCollection() { - this._client.GetDatabase(DATABASE_NAME).DropCollection(COLLECTION_NAME); + _client.GetDatabase(DATABASE_NAME).DropCollection(COLLECTION_NAME); } } } \ No newline at end of file diff --git a/Mongo.Migration.Test/Services/DatabaseVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs similarity index 65% rename from Mongo.Migration.Test/Services/DatabaseVersionService_when_determine_version.cs rename to Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs index 77d6a81..a97a673 100644 --- a/Mongo.Migration.Test/Services/DatabaseVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs @@ -1,12 +1,11 @@ using FluentAssertions; - +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Documents; using Mongo.Migration.Services; -using Mongo.Migration.Test.Migrations.Database; - +using Mongo.Migration.Tests.Migrations.Database; using NUnit.Framework; -namespace Mongo.Migration.Test.Services +namespace Mongo.Migration.Tests.Services { [TestFixture] internal class DatabaseVersionService_when_determine_version : DatabaseIntegrationTest @@ -17,23 +16,23 @@ protected override void OnSetUp(DocumentVersion version) { base.OnSetUp(version); - this._service = this._components.Get(); + _service = _serviceProvider.GetRequiredService(); } [TearDown] public void TearDown() { - this.Dispose(); + Dispose(); } [Test] public void When_project_has_migrations_Then_get_latest_version() { // Arrange - this.OnSetUp(DocumentVersion.Empty()); + OnSetUp(DocumentVersion.Empty()); // Act - var migrationVersion = this._service.GetCurrentOrLatestMigrationVersion(); + var migrationVersion = _service.GetCurrentOrLatestMigrationVersion(); // Assert migrationVersion.ToString().Should().Be("0.0.3"); @@ -43,10 +42,10 @@ public void When_project_has_migrations_Then_get_latest_version() public void When_version_set_on_startup_Then_use_startup_version() { // Arrange - this.OnSetUp(new DocumentVersion(0, 0, 2)); + OnSetUp(new DocumentVersion(0, 0, 2)); // Act - var migrationVersion = this._service.GetCurrentOrLatestMigrationVersion(); + var migrationVersion = _service.GetCurrentOrLatestMigrationVersion(); // Assert migrationVersion.ToString().Should().Be("0.0.2"); diff --git a/Mongo.Migration.Test/Services/DocumentVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs similarity index 74% rename from Mongo.Migration.Test/Services/DocumentVersionService_when_determine_version.cs rename to Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs index 219ce0b..81b32b8 100644 --- a/Mongo.Migration.Test/Services/DocumentVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs @@ -1,14 +1,11 @@ -using System; - -using FluentAssertions; - +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Exceptions; using Mongo.Migration.Services; -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Test.Services +namespace Mongo.Migration.Tests.Services { [TestFixture] internal class DocumentVersionService_when_determine_version : IntegrationTest @@ -18,15 +15,15 @@ internal class DocumentVersionService_when_determine_version : IntegrationTest [SetUp] public void SetUp() { - this.OnSetUp(); + OnSetUp(); - this._service = this._components.Get(); + _service = _serviceProvider.GetRequiredService(); } [TearDown] public void TearDown() { - this.Dispose(); + Dispose(); } [Test] @@ -36,7 +33,7 @@ public void When_document_has_current_version_Then_current_version_is_set() var document = new TestDocumentWithTwoMigrationMiddleVersion(); // Act - this._service.DetermineVersion(document); + _service.DetermineVersion(document); // Assert document.Version.Should().Be("0.0.1"); @@ -49,7 +46,7 @@ public void When_document_has_highest_version_Then_highest_version_is_set() var document = new TestDocumentWithTwoMigrationHighestVersion(); // Act - this._service.DetermineVersion(document); + _service.DetermineVersion(document); // Assert document.Version.Should().Be("0.0.2"); @@ -62,7 +59,7 @@ public void When_document_has_version_that_should_not_be_Then_throw_exception() var document = new TestDocumentWithTwoMigrationHighestVersion { Version = "0.0.1" }; // Act// Act - Action checkAction = () => { this._service.DetermineVersion(document); }; + Action checkAction = () => { _service.DetermineVersion(document); }; // Assert checkAction.Should().Throw(); diff --git a/Mongo.Migration.Test/Services/Initializers/MongoMigration_when_initialize.cs b/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs similarity index 73% rename from Mongo.Migration.Test/Services/Initializers/MongoMigration_when_initialize.cs rename to Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs index 8a125b5..c8889f4 100644 --- a/Mongo.Migration.Test/Services/Initializers/MongoMigration_when_initialize.cs +++ b/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs @@ -1,15 +1,10 @@ -using System; - -using FluentAssertions; - +using FluentAssertions; using Mongo.Migration.Exceptions; using Mongo.Migration.Startup.Static; - using NSubstitute; - using NUnit.Framework; -namespace Mongo.Migration.Test.Services.Initializers +namespace Mongo.Migration.Tests.Services.Initializers { [TestFixture] public class MongoMigration_when_initialize @@ -24,10 +19,12 @@ public void TearDown() public void When_inizialize_twice_Then_throw_exception() { // Arrange - var registry = Substitute.For(); + var registry = Substitute.For(); var mongoMigration = Substitute.For(); - registry.Get().Returns(mongoMigration); + registry + .GetService(Arg.Is(typeof(IMongoMigration))) + .Returns(mongoMigration); // Act MongoMigrationClient.Initialize(registry); diff --git a/Mongo.Migration.Test/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs similarity index 71% rename from Mongo.Migration.Test/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs rename to Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs index a94c12b..31de23f 100644 --- a/Mongo.Migration.Test/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs @@ -1,13 +1,10 @@ -using System; - -using FluentAssertions; - +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Services.Interceptors; -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Test.Services.Interceptors +namespace Mongo.Migration.Tests.Services.Interceptors { [TestFixture] internal class MigrationInterceptorFactory_when_creating : IntegrationTest @@ -15,20 +12,20 @@ internal class MigrationInterceptorFactory_when_creating : IntegrationTest [SetUp] public void SetUp() { - this.OnSetUp(); + OnSetUp(); } [TearDown] public void TearDown() { - this.Dispose(); + Dispose(); } [Test] public void If_type_is_assignable_to_document_Then_interceptor_is_created() { // Arrange - var factory = this._components.Get(); + var factory = _serviceProvider.GetRequiredService(); // Act var interceptor = factory.Create(typeof(TestDocumentWithOneMigration)); @@ -41,7 +38,7 @@ public void If_type_is_assignable_to_document_Then_interceptor_is_created() public void If_type_is_not_assignable_to_document_Then_exception_is_thrown() { // Arrange - var factory = this._components.Get(); + var factory = _serviceProvider.GetRequiredService(); // Act Action act = () => factory.Create(typeof(TestClass)); @@ -54,7 +51,7 @@ public void If_type_is_not_assignable_to_document_Then_exception_is_thrown() public void If_type_is_null_Then_exception_is_thrown() { // Arrange - var factory = this._components.Get(); + var factory = _serviceProvider.GetRequiredService(); // Act Action act = () => factory.Create(null); diff --git a/Mongo.Migration.Test/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs similarity index 71% rename from Mongo.Migration.Test/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs rename to Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs index 7e48b69..d8f45f4 100644 --- a/Mongo.Migration.Test/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs @@ -1,11 +1,10 @@ using FluentAssertions; - +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Services.Interceptors; -using Mongo.Migration.Test.TestDoubles; - +using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Test.Services.Interceptors +namespace Mongo.Migration.Tests.Services.Interceptors { [TestFixture] internal class MigrationInterceptorProvider_when_get_serializer : IntegrationTest @@ -13,20 +12,20 @@ internal class MigrationInterceptorProvider_when_get_serializer : IntegrationTes [SetUp] public void SetUp() { - this.OnSetUp(); + OnSetUp(); } [TearDown] public void TearDown() { - this.Dispose(); + Dispose(); } [Test] public void When_entity_is_document_Then_provide_serializer() { // Arrange - var provider = this._components.Get(); + var provider = _serviceProvider.GetRequiredService(); // Act var serializer = provider.GetSerializer(typeof(TestDocumentWithOneMigration)); @@ -39,7 +38,7 @@ public void When_entity_is_document_Then_provide_serializer() public void When_entity_is_not_document_Then_provide_null() { // Arrange - var provider = this._components.Get(); + var provider = _serviceProvider.GetRequiredService(); // Act var serializer = provider.GetSerializer(typeof(TestClass)); diff --git a/Mongo.Migration.Test/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs similarity index 88% rename from Mongo.Migration.Test/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs rename to Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs index 64ecd6e..333ca24 100644 --- a/Mongo.Migration.Test/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs @@ -1,8 +1,7 @@ using Mongo.Migration.Migrations.Database; - using MongoDB.Driver; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles.Database { internal class TestDatabaseMigration_0_0_1 : DatabaseMigration { diff --git a/Mongo.Migration.Test/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs similarity index 88% rename from Mongo.Migration.Test/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs rename to Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs index 5e260a7..434b972 100644 --- a/Mongo.Migration.Test/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs @@ -1,8 +1,7 @@ using Mongo.Migration.Migrations.Database; - using MongoDB.Driver; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles.Database { internal class TestDatabaseMigration_0_0_2 : DatabaseMigration { diff --git a/Mongo.Migration.Test/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs similarity index 88% rename from Mongo.Migration.Test/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs rename to Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs index 7658858..8ed709a 100644 --- a/Mongo.Migration.Test/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs @@ -1,8 +1,7 @@ using Mongo.Migration.Migrations.Database; - using MongoDB.Driver; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles.Database { internal class TestDatabaseMigration_0_0_3 : DatabaseMigration { diff --git a/Mongo.Migration.Test/TestDoubles/TestClass.cs b/Mongo.Migration.Tests/TestDoubles/TestClass.cs similarity index 76% rename from Mongo.Migration.Test/TestDoubles/TestClass.cs rename to Mongo.Migration.Tests/TestDoubles/TestClass.cs index a2cd389..5f8a907 100644 --- a/Mongo.Migration.Test/TestDoubles/TestClass.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestClass.cs @@ -1,6 +1,6 @@ using MongoDB.Bson; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { public class TestClass { diff --git a/Mongo.Migration.Test/TestDoubles/TestDocumentWithOneMigration.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs similarity index 88% rename from Mongo.Migration.Test/TestDoubles/TestDocumentWithOneMigration.cs rename to Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs index 58ddf83..aa7464c 100644 --- a/Mongo.Migration.Test/TestDoubles/TestDocumentWithOneMigration.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs @@ -1,7 +1,7 @@ using Mongo.Migration.Documents; using Mongo.Migration.Documents.Attributes; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { [RuntimeVersion("0.0.1")] internal class TestDocumentWithOneMigration : Document diff --git a/Mongo.Migration.Test/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs similarity index 94% rename from Mongo.Migration.Test/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs rename to Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs index d5ef2d3..4875fea 100644 --- a/Mongo.Migration.Test/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs @@ -1,8 +1,7 @@ using Mongo.Migration.Migrations.Document; - using MongoDB.Bson; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { internal class TestDocumentWithOneMigration_0_0_1 : DocumentMigration { diff --git a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigration.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs similarity index 83% rename from Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigration.cs rename to Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs index 20dc81b..7748221 100644 --- a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigration.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs @@ -1,7 +1,7 @@ using Mongo.Migration.Documents; using Mongo.Migration.Documents.Attributes; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { [RuntimeVersion("0.0.0")] internal class TestDocumentWithTwoMigration : Document diff --git a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs similarity index 88% rename from Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs rename to Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs index 71c355d..47a5e9e 100644 --- a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs @@ -1,9 +1,8 @@ using Mongo.Migration.Documents; using Mongo.Migration.Documents.Attributes; - using MongoDB.Bson; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { [RuntimeVersion("0.0.2")] [CollectionLocation("Test", "PerformanceTest")] diff --git a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs similarity index 94% rename from Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs rename to Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs index b5ebed9..014d708 100644 --- a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs @@ -1,8 +1,7 @@ using Mongo.Migration.Migrations.Document; - using MongoDB.Bson; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { internal class TestDocumentWithTwoMigrationHighestVersion_0_0_1 : DocumentMigration { diff --git a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs similarity index 94% rename from Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs rename to Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs index 4226663..4a4e8b5 100644 --- a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs @@ -1,8 +1,7 @@ using Mongo.Migration.Migrations.Document; - using MongoDB.Bson; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { internal class TestDocumentWithTwoMigrationHighestVersion_0_0_2 : DocumentMigration { diff --git a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs similarity index 84% rename from Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs rename to Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs index 8c567b4..f934e8d 100644 --- a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs @@ -1,7 +1,7 @@ using Mongo.Migration.Documents; using Mongo.Migration.Documents.Attributes; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { [RuntimeVersion("0.0.1")] internal class TestDocumentWithTwoMigrationMiddleVersion : Document diff --git a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs similarity index 94% rename from Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs rename to Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs index 77bb0cb..ce36d7a 100644 --- a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs @@ -1,8 +1,7 @@ using Mongo.Migration.Migrations.Document; - using MongoDB.Bson; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { internal class TestDocumentWithTwoMigrationMiddleVersion_0_0_1 : DocumentMigration { diff --git a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs similarity index 94% rename from Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs rename to Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs index 413cd36..d381f00 100644 --- a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs @@ -1,8 +1,7 @@ using Mongo.Migration.Migrations.Document; - using MongoDB.Bson; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { internal class TestDocumentWithTwoMigrationMiddleVersion_0_0_2 : DocumentMigration { diff --git a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs similarity index 94% rename from Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs rename to Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs index 813fe9d..f596b58 100644 --- a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs @@ -1,8 +1,7 @@ using Mongo.Migration.Migrations.Document; - using MongoDB.Bson; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { internal class TestDocumentWithTwoMigration_0_0_1 : DocumentMigration { diff --git a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs similarity index 94% rename from Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs rename to Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs index 6531a2c..8fd789b 100644 --- a/Mongo.Migration.Test/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs @@ -1,8 +1,7 @@ using Mongo.Migration.Migrations.Document; - using MongoDB.Bson; -namespace Mongo.Migration.Test.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles { internal class TestDocumentWithTwoMigration_0_0_2 : DocumentMigration { diff --git a/Mongo.Migration.sln b/Mongo.Migration.sln index 5f1345f..87f6847 100644 --- a/Mongo.Migration.sln +++ b/Mongo.Migration.sln @@ -12,32 +12,22 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Git", "Git", "{CB26356F-6A6 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo.Migration", "Mongo.Migration\Mongo.Migration.csproj", "{8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo.Migration.Test.Core", "Mongo.Migration.Test.Core\Mongo.Migration.Test.Core.csproj", "{1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo.Migration.Tests", "Mongo.Migration.Tests\Mongo.Migration.Tests.csproj", "{1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Debug|Any CPU.ActiveCfg = Debug|x64 {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Debug|Any CPU.Build.0 = Debug|x64 - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Debug|x64.ActiveCfg = Debug|x64 - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Debug|x64.Build.0 = Debug|x64 - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Release|Any CPU.Build.0 = Release|Any CPU - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Release|x64.ActiveCfg = Release|x64 - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Release|x64.Build.0 = Release|x64 + {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Release|Any CPU.ActiveCfg = Debug|Any CPU + {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Release|Any CPU.Build.0 = Debug|Any CPU {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Debug|x64.ActiveCfg = Debug|x64 - {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Debug|x64.Build.0 = Debug|x64 - {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Release|Any CPU.Build.0 = Release|Any CPU - {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Release|x64.ActiveCfg = Release|x64 - {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Release|x64.Build.0 = Release|x64 + {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Release|Any CPU.ActiveCfg = Debug|Any CPU + {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Release|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs b/Mongo.Migration/Documents/Attributes/CollectionLocation.cs index 752c6aa..0626b60 100644 --- a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs +++ b/Mongo.Migration/Documents/Attributes/CollectionLocation.cs @@ -1,5 +1,3 @@ -using System; - namespace Mongo.Migration.Documents.Attributes { [AttributeUsage(AttributeTargets.Class)] @@ -9,7 +7,7 @@ public class CollectionLocation : Attribute public CollectionLocation(string collectionName, string databaseName = null) { - this.CollectionInformation = new CollectionLocationInformation(databaseName, collectionName); + CollectionInformation = new CollectionLocationInformation(databaseName, collectionName); } } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs b/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs index b0c00ed..cf815cb 100644 --- a/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs +++ b/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs @@ -4,8 +4,8 @@ public struct CollectionLocationInformation { public CollectionLocationInformation(string database, string collection) { - this.Database = database; - this.Collection = collection; + Database = database; + Collection = collection; } public string Database { get; } diff --git a/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs b/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs index cd1ffbe..fcdf24f 100644 --- a/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs +++ b/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs @@ -1,6 +1,4 @@ -using System; - -namespace Mongo.Migration.Documents.Attributes +namespace Mongo.Migration.Documents.Attributes { [AttributeUsage(AttributeTargets.Class)] public class RuntimeVersion : Attribute @@ -9,7 +7,7 @@ public class RuntimeVersion : Attribute public RuntimeVersion(string version) { - this.Version = version; + Version = version; } } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Attributes/StartUpVersion.cs b/Mongo.Migration/Documents/Attributes/StartUpVersion.cs index 85b2ca5..d795af3 100644 --- a/Mongo.Migration/Documents/Attributes/StartUpVersion.cs +++ b/Mongo.Migration/Documents/Attributes/StartUpVersion.cs @@ -1,6 +1,4 @@ -using System; - -namespace Mongo.Migration.Documents.Attributes +namespace Mongo.Migration.Documents.Attributes { [AttributeUsage(AttributeTargets.Class)] public class StartUpVersion : Attribute @@ -9,7 +7,7 @@ public class StartUpVersion : Attribute public StartUpVersion(string version) { - this.Version = version; + Version = version; } } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/DocumentVersion.cs b/Mongo.Migration/Documents/DocumentVersion.cs index a9e8dfb..efc02f5 100644 --- a/Mongo.Migration/Documents/DocumentVersion.cs +++ b/Mongo.Migration/Documents/DocumentVersion.cs @@ -1,6 +1,4 @@ -using System; - -using Mongo.Migration.Documents.Serializers; +using Mongo.Migration.Documents.Serializers; using Mongo.Migration.Exceptions; using MongoDB.Bson.Serialization; @@ -39,18 +37,18 @@ public DocumentVersion(string version) throw new VersionStringToLongException(version); } - this.Major = ParseVersionPart(versionParts[0]); + Major = ParseVersionPart(versionParts[0]); - this.Minor = ParseVersionPart(versionParts[1]); + Minor = ParseVersionPart(versionParts[1]); - this.Revision = ParseVersionPart(versionParts[2]); + Revision = ParseVersionPart(versionParts[2]); } public DocumentVersion(int major, int minor, int revision) { - this.Major = major; - this.Minor = minor; - this.Revision = revision; + Major = major; + Minor = minor; + Revision = revision; } public static DocumentVersion Default() @@ -75,12 +73,12 @@ public static implicit operator string(DocumentVersion documentVersion) public override string ToString() { - return $"{this.Major}.{this.Minor}.{this.Revision}"; + return $"{Major}.{Minor}.{Revision}"; } public int CompareTo(DocumentVersion other) { - if (this.Equals(other)) + if (Equals(other)) { return 0; } @@ -122,7 +120,7 @@ public int CompareTo(DocumentVersion other) public bool Equals(DocumentVersion other) { - return other.Major == this.Major && other.Minor == this.Minor && other.Revision == this.Revision; + return other.Major == Major && other.Minor == Minor && other.Revision == Revision; } public override bool Equals(object obj) @@ -137,16 +135,16 @@ public override bool Equals(object obj) return false; } - return this.Equals((DocumentVersion)obj); + return Equals((DocumentVersion)obj); } public override int GetHashCode() { unchecked { - int result = this.Major; - result = (result * 397) ^ this.Minor; - result = (result * 397) ^ this.Revision; + int result = Major; + result = (result * 397) ^ Minor; + result = (result * 397) ^ Revision; return result; } } diff --git a/Mongo.Migration/Documents/Locators/AbstractLocator.cs b/Mongo.Migration/Documents/Locators/AbstractLocator.cs index 8cbbcf0..160136c 100644 --- a/Mongo.Migration/Documents/Locators/AbstractLocator.cs +++ b/Mongo.Migration/Documents/Locators/AbstractLocator.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; - namespace Mongo.Migration.Documents.Locators { public abstract class AbstractLocator : ILocator @@ -12,15 +10,15 @@ protected IDictionary LocatesDictionary { get { - if (this._locatesDictionary == null) + if (_locatesDictionary == null) { - this.Locate(); + Locate(); } - return this._locatesDictionary; + return _locatesDictionary; } - set => this._locatesDictionary = value; + set => _locatesDictionary = value; } public abstract TReturnType? GetLocateOrNull(TTypeIdentifier identifier); diff --git a/Mongo.Migration/Documents/Locators/CollectionLocator.cs b/Mongo.Migration/Documents/Locators/CollectionLocator.cs index a25694e..e15bae1 100644 --- a/Mongo.Migration/Documents/Locators/CollectionLocator.cs +++ b/Mongo.Migration/Documents/Locators/CollectionLocator.cs @@ -1,7 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; - using Mongo.Migration.Documents.Attributes; namespace Mongo.Migration.Documents.Locators @@ -10,12 +6,12 @@ public class CollectionLocator : AbstractLocator GetLocatesOrEmpty() { - return this.LocatesDictionary; + return LocatesDictionary; } } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/ICollectionLocator.cs b/Mongo.Migration/Documents/Locators/ICollectionLocator.cs index 19f1dde..d2d0869 100644 --- a/Mongo.Migration/Documents/Locators/ICollectionLocator.cs +++ b/Mongo.Migration/Documents/Locators/ICollectionLocator.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections.Generic; - using Mongo.Migration.Documents.Attributes; namespace Mongo.Migration.Documents.Locators diff --git a/Mongo.Migration/Documents/Locators/IRuntimeVersionLocator.cs b/Mongo.Migration/Documents/Locators/IRuntimeVersionLocator.cs index 837e65d..00223bb 100644 --- a/Mongo.Migration/Documents/Locators/IRuntimeVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/IRuntimeVersionLocator.cs @@ -1,6 +1,4 @@ -using System; - -namespace Mongo.Migration.Documents.Locators +namespace Mongo.Migration.Documents.Locators { internal interface IRuntimeVersionLocator : ILocator { diff --git a/Mongo.Migration/Documents/Locators/IStartUpVersionLocator.cs b/Mongo.Migration/Documents/Locators/IStartUpVersionLocator.cs index fe444a9..1259981 100644 --- a/Mongo.Migration/Documents/Locators/IStartUpVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/IStartUpVersionLocator.cs @@ -1,6 +1,4 @@ -using System; - -namespace Mongo.Migration.Documents.Locators +namespace Mongo.Migration.Documents.Locators { internal interface IStartUpVersionLocator : ILocator { diff --git a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs index a77a51f..4fb358f 100644 --- a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -using Mongo.Migration.Documents.Attributes; +using Mongo.Migration.Documents.Attributes; namespace Mongo.Migration.Documents.Locators { @@ -10,12 +6,12 @@ internal class RuntimeVersionLocator : AbstractLocator, I { public override DocumentVersion? GetLocateOrNull(Type identifier) { - if (!this.LocatesDictionary.ContainsKey(identifier)) + if (!LocatesDictionary.ContainsKey(identifier)) { return null; } - this.LocatesDictionary.TryGetValue(identifier, out var value); + LocatesDictionary.TryGetValue(identifier, out var value); return value; } @@ -36,7 +32,7 @@ from t in a.GetTypes() versions.Add(type.Type, version); } - this.LocatesDictionary = versions; + LocatesDictionary = versions; } } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs index 24abc04..5df855f 100644 --- a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -using Mongo.Migration.Documents.Attributes; +using Mongo.Migration.Documents.Attributes; namespace Mongo.Migration.Documents.Locators { @@ -10,12 +6,12 @@ internal class StartUpVersionLocator : AbstractLocator, I { public override DocumentVersion? GetLocateOrNull(Type identifier) { - if (!this.LocatesDictionary.ContainsKey(identifier)) + if (!LocatesDictionary.ContainsKey(identifier)) { return null; } - this.LocatesDictionary.TryGetValue(identifier, out var value); + LocatesDictionary.TryGetValue(identifier, out var value); return value; } @@ -36,7 +32,7 @@ from t in a.GetTypes() versions.Add(type.Type, version); } - this.LocatesDictionary = versions; + LocatesDictionary = versions; } } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/AlreadyInitializedException.cs b/Mongo.Migration/Exceptions/AlreadyInitializedException.cs index a13cc1a..1aed909 100644 --- a/Mongo.Migration/Exceptions/AlreadyInitializedException.cs +++ b/Mongo.Migration/Exceptions/AlreadyInitializedException.cs @@ -1,6 +1,4 @@ -using System; - -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions { public class AlreadyInitializedException : Exception { diff --git a/Mongo.Migration/Exceptions/DuplicateVersionException.cs b/Mongo.Migration/Exceptions/DuplicateVersionException.cs index 6c0c43d..7f83624 100644 --- a/Mongo.Migration/Exceptions/DuplicateVersionException.cs +++ b/Mongo.Migration/Exceptions/DuplicateVersionException.cs @@ -1,6 +1,4 @@ -using System; - -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions { internal class DuplicateVersionException : Exception { diff --git a/Mongo.Migration/Exceptions/InvalidVersionValueException.cs b/Mongo.Migration/Exceptions/InvalidVersionValueException.cs index 216a3c8..45e0f95 100644 --- a/Mongo.Migration/Exceptions/InvalidVersionValueException.cs +++ b/Mongo.Migration/Exceptions/InvalidVersionValueException.cs @@ -1,6 +1,4 @@ -using System; - -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions { public class InvalidVersionValueException : Exception { diff --git a/Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs b/Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs index 29a93e6..127dafa 100644 --- a/Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs +++ b/Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs @@ -1,5 +1,3 @@ -using System; - namespace Mongo.Migration.Exceptions { internal class MongoMigrationDatabaseNotFound diff --git a/Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs b/Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs index e8398b2..cf51bd7 100644 --- a/Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs +++ b/Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs @@ -1,6 +1,4 @@ -using System; - -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions { public class MongoMigrationNoMongoClientException : Exception { diff --git a/Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs b/Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs index 70fe214..edc9480 100644 --- a/Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs +++ b/Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs @@ -1,5 +1,3 @@ -using System; - namespace Mongo.Migration.Exceptions { internal class NoDatabaseNameFoundException : Exception diff --git a/Mongo.Migration/Exceptions/NoMigrationsFoundException.cs b/Mongo.Migration/Exceptions/NoMigrationsFoundException.cs index 3fa2a72..5d53dc6 100644 --- a/Mongo.Migration/Exceptions/NoMigrationsFoundException.cs +++ b/Mongo.Migration/Exceptions/NoMigrationsFoundException.cs @@ -1,6 +1,4 @@ -using System; - -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions { public class NoMigrationsFoundException : Exception { diff --git a/Mongo.Migration/Exceptions/VersionStringToLongException.cs b/Mongo.Migration/Exceptions/VersionStringToLongException.cs index eef22c4..9e9e0bd 100644 --- a/Mongo.Migration/Exceptions/VersionStringToLongException.cs +++ b/Mongo.Migration/Exceptions/VersionStringToLongException.cs @@ -1,5 +1,3 @@ -using System; - namespace Mongo.Migration.Exceptions { public class VersionStringToLongException : Exception diff --git a/Mongo.Migration/Exceptions/VersionViolationException.cs b/Mongo.Migration/Exceptions/VersionViolationException.cs index 235e51a..be88ad7 100644 --- a/Mongo.Migration/Exceptions/VersionViolationException.cs +++ b/Mongo.Migration/Exceptions/VersionViolationException.cs @@ -1,6 +1,4 @@ -using System; - -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; namespace Mongo.Migration.Exceptions { diff --git a/Mongo.Migration/Extensions/EnumerableExtensions.cs b/Mongo.Migration/Extensions/EnumerableExtensions.cs index e48483d..91ddee7 100644 --- a/Mongo.Migration/Extensions/EnumerableExtensions.cs +++ b/Mongo.Migration/Extensions/EnumerableExtensions.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -using Mongo.Migration.Exceptions; +using Mongo.Migration.Exceptions; using Mongo.Migration.Migrations; namespace Mongo.Migration.Extensions diff --git a/Mongo.Migration/Migrations/Adapters/IContainerAdapter.cs b/Mongo.Migration/Migrations/Adapters/IContainerAdapter.cs deleted file mode 100644 index 2a2db60..0000000 --- a/Mongo.Migration/Migrations/Adapters/IContainerAdapter.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Mongo.Migration.Migrations.Adapters -{ - public interface IContainerAdapter : IContainerCollection, IContainerProvider - { - } -} \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Adapters/IContainerCollection.cs b/Mongo.Migration/Migrations/Adapters/IContainerCollection.cs deleted file mode 100644 index 757be3a..0000000 --- a/Mongo.Migration/Migrations/Adapters/IContainerCollection.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace Mongo.Migration.Migrations.Adapters -{ - public interface IContainerCollection - { - void Register() - where TInterface : class - where TImplementation : class, TInterface; - - void RegisterInstance(object instance); - - void RegisterSingleton() - where TInterface : class - where TImplementation : class, TInterface; - - void Register(Type serviceType, Type implementingType); - } -} \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Adapters/IContainerProvider.cs b/Mongo.Migration/Migrations/Adapters/IContainerProvider.cs deleted file mode 100644 index 55d3f59..0000000 --- a/Mongo.Migration/Migrations/Adapters/IContainerProvider.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace Mongo.Migration.Migrations.Adapters -{ - public interface IContainerProvider - { - object GetInstance(Type type); - } -} \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Adapters/LightInjectAdapter.cs b/Mongo.Migration/Migrations/Adapters/LightInjectAdapter.cs deleted file mode 100644 index 29e4155..0000000 --- a/Mongo.Migration/Migrations/Adapters/LightInjectAdapter.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; - -using LightInject; - -namespace Mongo.Migration.Migrations.Adapters -{ - public class LightInjectAdapter : IContainerAdapter - { - private readonly IServiceContainer _container; - - public LightInjectAdapter(IServiceContainer container) - { - this._container = container; - } - - public object GetInstance(Type type) - { - return this._container.GetInstance(type); - } - - public void Register() - where TInterface : class - where TImplementation : class, TInterface - { - this._container.Register(); - } - - public void Register(Type serviceType, Type implementingType) - { - this._container.Register(serviceType, implementingType); - } - - public void RegisterInstance(object instance) - { - this._container.RegisterInstance(typeof(TInterface), instance); - } - - public void RegisterSingleton() - where TInterface : class - where TImplementation : class, TInterface - { - this._container.Register(new PerContainerLifetime()); - } - } -} \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Adapters/ServiceProvider.cs b/Mongo.Migration/Migrations/Adapters/ServiceProvider.cs deleted file mode 100644 index ecdeae3..0000000 --- a/Mongo.Migration/Migrations/Adapters/ServiceProvider.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace Mongo.Migration.Migrations.Adapters -{ - public class ServiceProvider : IContainerProvider - { - private readonly IServiceProvider _serviceProvider; - - public ServiceProvider(IServiceProvider serviceProvider) - { - this._serviceProvider = serviceProvider; - } - - public object GetInstance(Type type) - { - return this._serviceProvider.GetService(type); - } - } -} \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/DatabaseMigration.cs b/Mongo.Migration/Migrations/Database/DatabaseMigration.cs index 6073606..be64f33 100644 --- a/Mongo.Migration/Migrations/Database/DatabaseMigration.cs +++ b/Mongo.Migration/Migrations/Database/DatabaseMigration.cs @@ -1,6 +1,4 @@ -using System; - -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; using MongoDB.Driver; @@ -10,7 +8,7 @@ public abstract class DatabaseMigration : IDatabaseMigration { protected DatabaseMigration(string version) { - this.Version = version; + Version = version; } public DocumentVersion Version { get; } diff --git a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs index c446bfd..a032b55 100644 --- a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs @@ -1,13 +1,7 @@ -using System; -using System.Linq; - -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; - +using Microsoft.Extensions.Logging; using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Locators; using Mongo.Migration.Services; - using MongoDB.Driver; namespace Mongo.Migration.Migrations.Database @@ -23,35 +17,28 @@ internal class DatabaseMigrationRunner : IDatabaseMigrationRunner private IDatabaseTypeMigrationDependencyLocator _migrationLocator { get; } public DatabaseMigrationRunner( - IDatabaseTypeMigrationDependencyLocator migrationLocator, - IDatabaseVersionService databaseVersionService) - : this(migrationLocator, databaseVersionService, NullLoggerFactory.Instance) - { - } - - private DatabaseMigrationRunner( IDatabaseTypeMigrationDependencyLocator migrationLocator, IDatabaseVersionService databaseVersionService, - ILoggerFactory loggerFactory) + ILogger logger) { - this._migrationLocator = migrationLocator; - this._databaseVersionService = databaseVersionService; - this._logger = loggerFactory.CreateLogger(); + _migrationLocator = migrationLocator; + _databaseVersionService = databaseVersionService; + _logger = logger; } public void Run(IMongoDatabase db) { - this._logger.LogInformation("Database migration started."); - var databaseVersion = this._databaseVersionService.GetLatestDatabaseVersion(db); - var currentOrLatest = this._databaseVersionService.GetCurrentOrLatestMigrationVersion(); + _logger.LogInformation("Database migration started."); + var databaseVersion = _databaseVersionService.GetLatestDatabaseVersion(db); + var currentOrLatest = _databaseVersionService.GetCurrentOrLatestMigrationVersion(); if (databaseVersion == currentOrLatest) { return; } - this.MigrateUpOrDown(db, databaseVersion, currentOrLatest); - this._logger.LogInformation("Database migration finished."); + MigrateUpOrDown(db, databaseVersion, currentOrLatest); + _logger.LogInformation("Database migration finished."); } private void MigrateUpOrDown( @@ -61,32 +48,32 @@ private void MigrateUpOrDown( { if (databaseVersion > to) { - this.MigrateDown(db, databaseVersion, to); + MigrateDown(db, databaseVersion, to); return; } - this.MigrateUp(db, databaseVersion, to); + MigrateUp(db, databaseVersion, to); } private void MigrateUp(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion) { - var migrations = this._migrationLocator.GetMigrationsFromTo(this.DatabaseMigrationType, currentVersion, toVersion).ToList(); + var migrations = _migrationLocator.GetMigrationsFromTo(DatabaseMigrationType, currentVersion, toVersion).ToList(); foreach (var migration in migrations) { - this._logger.LogInformation("Database Migration Up: {0}:{1} ", currentVersion.GetType().ToString(), migration.Version); + _logger.LogInformation("Database Migration Up: {0}:{1} ", currentVersion.GetType().ToString(), migration.Version); migration.Up(db); - this._databaseVersionService.Save(db, migration); + _databaseVersionService.Save(db, migration); - this._logger.LogInformation("Database Migration Up finished successful: {0}:{1} ", migration.GetType().ToString(), migration.Version); + _logger.LogInformation("Database Migration Up finished successful: {0}:{1} ", migration.GetType().ToString(), migration.Version); } } private void MigrateDown(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion) { - var migrations = this._migrationLocator - .GetMigrationsGtEq(this.DatabaseMigrationType, toVersion) + var migrations = _migrationLocator + .GetMigrationsGtEq(DatabaseMigrationType, toVersion) .OrderByDescending(m => m.Version) .ToList(); @@ -98,12 +85,12 @@ private void MigrateDown(IMongoDatabase db, DocumentVersion currentVersion, Docu break; } - this._logger.LogInformation("Database Migration Down: {0}:{1} ", migration.GetType().ToString(), migration.Version); + _logger.LogInformation("Database Migration Down: {0}:{1} ", migration.GetType().ToString(), migration.Version); migration.Down(db); - this._databaseVersionService.Remove(db, migration); + _databaseVersionService.Remove(db, migration); - this._logger.LogInformation("Database Migration Down finished successful: {0}:{1} ", migration.GetType().ToString(), migration.Version); + _logger.LogInformation("Database Migration Down finished successful: {0}:{1} ", migration.GetType().ToString(), migration.Version); } } } diff --git a/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs index a5a693b..3b8740c 100644 --- a/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs @@ -1,5 +1,3 @@ -using System.Linq; - using Mongo.Migration.Documents.Attributes; using Mongo.Migration.Documents.Locators; using Mongo.Migration.Exceptions; @@ -34,14 +32,14 @@ public StartUpDatabaseMigrationRunner( if (settings.ClientSettings != null) { - this._client = new MongoClient(settings.ClientSettings); + _client = new MongoClient(settings.ClientSettings); } else { - this._client = new MongoClient(settings.ConnectionString); + _client = new MongoClient(settings.ConnectionString); } - this._databaseName = settings.Database; + _databaseName = settings.Database; } public StartUpDatabaseMigrationRunner( @@ -53,41 +51,41 @@ public StartUpDatabaseMigrationRunner( collectionLocator, migrationRunner) { - this._client = client; + _client = client; if (settings.ConnectionString == null && settings.Database == null) { return; } - this._client = new MongoClient(settings.ConnectionString); - this._databaseName = settings.Database; + _client = new MongoClient(settings.ConnectionString); + _databaseName = settings.Database; } private StartUpDatabaseMigrationRunner( ICollectionLocator collectionLocator, IDatabaseMigrationRunner migrationRunner) { - this._collectionLocator = collectionLocator; - this._migrationRunner = migrationRunner; + _collectionLocator = collectionLocator; + _migrationRunner = migrationRunner; } public void RunAll() { - var locations = this._collectionLocator.GetLocatesOrEmpty().ToList(); + var locations = _collectionLocator.GetLocatesOrEmpty().ToList(); var information = locations.FirstOrDefault().Value; - var databaseName = this.GetDatabaseOrDefault(information); + var databaseName = GetDatabaseOrDefault(information); - this._migrationRunner.Run(this._client.GetDatabase(databaseName)); + _migrationRunner.Run(_client.GetDatabase(databaseName)); } private string GetDatabaseOrDefault(CollectionLocationInformation information) { - if (string.IsNullOrEmpty(this._databaseName) && string.IsNullOrEmpty(information.Database)) + if (string.IsNullOrEmpty(_databaseName) && string.IsNullOrEmpty(information.Database)) { throw new NoDatabaseNameFoundException(); } - return string.IsNullOrEmpty(information.Database) ? this._databaseName : information.Database; + return string.IsNullOrEmpty(information.Database) ? _databaseName : information.Database; } } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/DocumentMigration.cs b/Mongo.Migration/Migrations/Document/DocumentMigration.cs index c4fa196..70b2116 100644 --- a/Mongo.Migration/Migrations/Document/DocumentMigration.cs +++ b/Mongo.Migration/Migrations/Document/DocumentMigration.cs @@ -1,6 +1,4 @@ -using System; - -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; using MongoDB.Bson; @@ -11,7 +9,7 @@ public abstract class DocumentMigration : IDocumentMigration { protected DocumentMigration(string version) { - this.Version = version; + Version = version; } public DocumentVersion Version { get; } diff --git a/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs index 44b2440..20bb35f 100644 --- a/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs @@ -1,7 +1,4 @@ -using System; -using System.Linq; - -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Locators; using Mongo.Migration.Services; @@ -17,34 +14,34 @@ internal class DocumentMigrationRunner : IDocumentMigrationRunner public DocumentMigrationRunner(IMigrationLocator migrationLocator, IDocumentVersionService documentVersionService) { - this._migrationLocator = migrationLocator; - this._documentVersionService = documentVersionService; + _migrationLocator = migrationLocator; + _documentVersionService = documentVersionService; } public void Run(Type type, BsonDocument document) { - var documentVersion = this._documentVersionService.GetVersionOrDefault(document); - var currentOrLatest = this._documentVersionService.GetCurrentOrLatestMigrationVersion(type); + var documentVersion = _documentVersionService.GetVersionOrDefault(document); + var currentOrLatest = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); if (documentVersion == currentOrLatest) { return; } - this.MigrateUpOrDown(type, document, documentVersion, currentOrLatest); + MigrateUpOrDown(type, document, documentVersion, currentOrLatest); } public void Run(Type type, BsonDocument document, DocumentVersion to) { - var documentVersion = this._documentVersionService.GetVersionOrDefault(document); - var currentOrLatest = this._documentVersionService.GetCurrentOrLatestMigrationVersion(type); + var documentVersion = _documentVersionService.GetVersionOrDefault(document); + var currentOrLatest = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); if (documentVersion == to || documentVersion == currentOrLatest) { return; } - this.MigrateUpOrDown(type, document, documentVersion, to); + MigrateUpOrDown(type, document, documentVersion, to); } private void MigrateUpOrDown( @@ -55,27 +52,27 @@ private void MigrateUpOrDown( { if (documentVersion > to) { - this.MigrateDown(type, document, to); + MigrateDown(type, document, to); return; } - this.MigrateUp(type, document, documentVersion, to); + MigrateUp(type, document, documentVersion, to); } private void MigrateUp(Type type, BsonDocument document, DocumentVersion version, DocumentVersion toVersion) { - var migrations = this._migrationLocator.GetMigrationsFromTo(type, version, toVersion).ToList(); + var migrations = _migrationLocator.GetMigrationsFromTo(type, version, toVersion).ToList(); foreach (var migration in migrations) { migration.Up(document); - this._documentVersionService.SetVersion(document, migration.Version); + _documentVersionService.SetVersion(document, migration.Version); } } private void MigrateDown(Type type, BsonDocument document, DocumentVersion version) { - var migrations = this._migrationLocator + var migrations = _migrationLocator .GetMigrationsGtEq(type, version) .OrderByDescending(m => m.Version) .ToList(); @@ -89,8 +86,8 @@ private void MigrateDown(Type type, BsonDocument document, DocumentVersion versi migrations[m].Down(document); - var docVersion = this._documentVersionService.DetermineLastVersion(version, migrations, m); - this._documentVersionService.SetVersion(document, docVersion); + var docVersion = _documentVersionService.DetermineLastVersion(version, migrations, m); + _documentVersionService.SetVersion(document, docVersion); } } } diff --git a/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs index dde4076..a7dfdc9 100644 --- a/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs @@ -1,6 +1,4 @@ -using System; - -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; using MongoDB.Bson; diff --git a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs index 7dbf13e..2090a7d 100644 --- a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections.Generic; - using Mongo.Migration.Documents.Attributes; using Mongo.Migration.Documents.Locators; using Mongo.Migration.Exceptions; @@ -41,14 +38,14 @@ public StartUpDocumentMigrationRunner( if (settings.ClientSettings != null) { - this._client = new MongoClient(settings.ClientSettings); + _client = new MongoClient(settings.ClientSettings); } else { - this._client = new MongoClient(settings.ConnectionString); + _client = new MongoClient(settings.ConnectionString); } - this._databaseName = settings.Database; + _databaseName = settings.Database; } public StartUpDocumentMigrationRunner( @@ -62,15 +59,15 @@ public StartUpDocumentMigrationRunner( documentVersionService, migrationRunner) { - this._client = client; + _client = client; if (settings.ConnectionString == null && settings.Database == null) { return; } - this._client = new MongoClient(settings.ConnectionString); - this._databaseName = settings.Database; + _client = new MongoClient(settings.ConnectionString); + _databaseName = settings.Database; } private StartUpDocumentMigrationRunner( @@ -78,28 +75,28 @@ private StartUpDocumentMigrationRunner( IDocumentVersionService documentVersionService, IDocumentMigrationRunner migrationRunner) { - this._collectionLocator = collectionLocator; - this._documentVersionService = documentVersionService; - this._migrationRunner = migrationRunner; + _collectionLocator = collectionLocator; + _documentVersionService = documentVersionService; + _migrationRunner = migrationRunner; } public void RunAll() { - var locations = this._collectionLocator.GetLocatesOrEmpty(); + var locations = _collectionLocator.GetLocatesOrEmpty(); foreach (var locate in locations) { var information = locate.Value; var type = locate.Key; - var databaseName = this.GetDatabaseOrDefault(information); - var collectionVersion = this._documentVersionService.GetCollectionVersion(type); + var databaseName = GetDatabaseOrDefault(information); + var collectionVersion = _documentVersionService.GetCollectionVersion(type); - var collection = this._client.GetDatabase(databaseName) + var collection = _client.GetDatabase(databaseName) .GetCollection(information.Collection); var bulk = new List>(); - var query = this.CreateQueryForRelevantDocuments(type); + var query = CreateQueryForRelevantDocuments(type); using (var cursor = collection.FindSync(query)) { @@ -108,7 +105,7 @@ public void RunAll() var batch = cursor.Current; foreach (var document in batch) { - this._migrationRunner.Run(type, document, collectionVersion); + _migrationRunner.Run(type, document, collectionVersion); var update = new ReplaceOneModel( new BsonDocument { { "_id", document["_id"] } }, @@ -129,22 +126,22 @@ public void RunAll() private string GetDatabaseOrDefault(CollectionLocationInformation information) { - if (string.IsNullOrEmpty(this._databaseName) && string.IsNullOrEmpty(information.Database)) + if (string.IsNullOrEmpty(_databaseName) && string.IsNullOrEmpty(information.Database)) { throw new NoDatabaseNameFoundException(); } - return string.IsNullOrEmpty(information.Database) ? this._databaseName : information.Database; + return string.IsNullOrEmpty(information.Database) ? _databaseName : information.Database; } private FilterDefinition CreateQueryForRelevantDocuments( Type type) { - var currentVersion = this._documentVersionService.GetCurrentOrLatestMigrationVersion(type); + var currentVersion = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); - var existFilter = Builders.Filter.Exists(this._documentVersionService.GetVersionFieldName(), false); + var existFilter = Builders.Filter.Exists(_documentVersionService.GetVersionFieldName(), false); var notEqualFilter = Builders.Filter.Ne( - this._documentVersionService.GetVersionFieldName(), + _documentVersionService.GetVersionFieldName(), currentVersion); return Builders.Filter.Or(existFilter, notEqualFilter); diff --git a/Mongo.Migration/Migrations/IMigration.cs b/Mongo.Migration/Migrations/IMigration.cs index e40690d..11f4460 100644 --- a/Mongo.Migration/Migrations/IMigration.cs +++ b/Mongo.Migration/Migrations/IMigration.cs @@ -1,6 +1,4 @@ -using System; - -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; namespace Mongo.Migration.Migrations { diff --git a/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs index 6d1d34b..737d7fa 100644 --- a/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; - -using Mongo.Migration.Migrations.Adapters; +using Microsoft.Extensions.Logging; using Mongo.Migration.Migrations.Database; namespace Mongo.Migration.Migrations.Locators @@ -14,21 +11,21 @@ protected override IDictionary> Mi { get { - if (this._migrations == null) + if (_migrations == null) { - this.Locate(); + Locate(); } - return this._migrations; + return _migrations; } set { - this._migrations = value; + _migrations = value; } } - public DatabaseTypeMigrationDependencyLocator(IContainerProvider containerProvider) - : base(containerProvider) + public DatabaseTypeMigrationDependencyLocator(ILogger logger, IServiceProvider serviceProvider) + : base(logger, serviceProvider) { } } diff --git a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs index 55c6e2a..8c10773 100644 --- a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections.Generic; - using Mongo.Migration.Documents; namespace Mongo.Migration.Migrations.Locators diff --git a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs index e3aeef2..83d6308 100644 --- a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs @@ -1,58 +1,56 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; - +using System.Reflection; +using Microsoft.Extensions.Logging; using Mongo.Migration.Documents; using Mongo.Migration.Exceptions; using Mongo.Migration.Extensions; -using NLog; - namespace Mongo.Migration.Migrations.Locators { public abstract class MigrationLocator : IMigrationLocator where TMigrationType : class, IMigration { - private readonly Logger _logger = LogManager.GetCurrentClassLogger(); + private readonly ILogger> _logger; private IEnumerable _assemblies; private IDictionary> _migrations; - protected IEnumerable Assemblies => this._assemblies ??= GetAssemblies(); + protected MigrationLocator(ILogger> logger) + { + _logger = logger; + } + + protected IEnumerable Assemblies => _assemblies ??= GetAssemblies(); protected virtual IDictionary> Migrations { get { - if (this._migrations == null) + if (_migrations == null) { - this.Locate(); + Locate(); } - if (this._migrations.NullOrEmpty()) + if (_migrations.NullOrEmpty()) { - this._logger.Info(new NoMigrationsFoundException()); + _logger.LogInformation(new NoMigrationsFoundException(), "No migration found"); } - return this._migrations; + return _migrations; } - set => this._migrations = value; + set => _migrations = value; } public IEnumerable GetMigrations(Type type) { - IReadOnlyCollection migrations; - this.Migrations.TryGetValue(type, out migrations); + Migrations.TryGetValue(type, out var migrations); return migrations ?? Enumerable.Empty(); } public IEnumerable GetMigrationsFromTo(Type type, DocumentVersion version, DocumentVersion otherVersion) { - var migrations = this.GetMigrations(type); + var migrations = GetMigrations(type); return migrations @@ -63,7 +61,7 @@ public IEnumerable GetMigrationsFromTo(Type type, DocumentVersio public IEnumerable GetMigrationsGt(Type type, DocumentVersion version) { - var migrations = this.GetMigrations(type); + var migrations = GetMigrations(type); return migrations @@ -73,7 +71,7 @@ public IEnumerable GetMigrationsGt(Type type, DocumentVersion ve public IEnumerable GetMigrationsGtEq(Type type, DocumentVersion version) { - var migrations = this.GetMigrations(type); + var migrations = GetMigrations(type); return migrations @@ -83,7 +81,7 @@ public IEnumerable GetMigrationsGtEq(Type type, DocumentVersion public DocumentVersion GetLatestVersion(Type type) { - var migrations = this.GetMigrations(type); + var migrations = GetMigrations(type); if (migrations == null || !migrations.Any()) { @@ -95,7 +93,7 @@ public DocumentVersion GetLatestVersion(Type type) public abstract void Locate(); - private static IEnumerable GetAssemblies() + private static IReadOnlyList GetAssemblies() { var location = AppDomain.CurrentDomain.BaseDirectory; var path = Path.GetDirectoryName(location); diff --git a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs index 335b6a0..0f59214 100644 --- a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs @@ -1,32 +1,29 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; - +using System.Reflection; +using Microsoft.Extensions.Logging; using Mongo.Migration.Extensions; -using Mongo.Migration.Migrations.Adapters; namespace Mongo.Migration.Migrations.Locators { internal class TypeMigrationDependencyLocator : MigrationLocator where TMigrationType : class, IMigration { - private readonly IContainerProvider _containerProvider; + private readonly IServiceProvider _serviceProvider; - public TypeMigrationDependencyLocator(IContainerProvider containerProvider) + public TypeMigrationDependencyLocator(ILogger> logger, IServiceProvider serviceProvider) + : base(logger) { - this._containerProvider = containerProvider; + _serviceProvider = serviceProvider; } public override void Locate() { var migrationTypes = - (from assembly in this.Assemblies + (from assembly in Assemblies from type in assembly.GetTypes() where typeof(TMigrationType).IsAssignableFrom(type) && !type.IsAbstract select type).Distinct(new TypeComparer()); - this.Migrations = migrationTypes.Select(this.GetMigrationInstance).ToMigrationDictionary(); + Migrations = migrationTypes.Select(GetMigrationInstance).ToMigrationDictionary(); } private TMigrationType GetMigrationInstance(Type type) @@ -37,8 +34,7 @@ private TMigrationType GetMigrationInstance(Type type) { object[] args = constructor .GetParameters() - .Select(o => o.ParameterType) - .Select(o => this._containerProvider.GetInstance(o)) + .Select(parameterInfo => _serviceProvider.GetService(parameterInfo.ParameterType)) .ToArray(); return Activator.CreateInstance(type, args) as TMigrationType; diff --git a/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs b/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs index e990b9f..e86edbf 100644 --- a/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs @@ -1,6 +1,4 @@ -using System; -using System.Linq; - +using Microsoft.Extensions.Logging; using Mongo.Migration.Extensions; using Mongo.Migration.Migrations.Document; @@ -8,15 +6,17 @@ namespace Mongo.Migration.Migrations.Locators { internal class TypeMigrationLocator : MigrationLocator { + public TypeMigrationLocator(ILogger logger) : base(logger) { } + public override void Locate() { var migrationTypes = - (from assembly in this.Assemblies + (from assembly in Assemblies from type in assembly.GetTypes() where typeof(IDocumentMigration).IsAssignableFrom(type) && !type.IsAbstract select type).Distinct(); - this.Migrations = migrationTypes.Select(t => (IDocumentMigration)Activator.CreateInstance(t)).ToMigrationDictionary(); + Migrations = migrationTypes.Select(t => (IDocumentMigration)Activator.CreateInstance(t)).ToMigrationDictionary(); } } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Migration.cs b/Mongo.Migration/Migrations/Migration.cs index 15c42f9..bcbe28c 100644 --- a/Mongo.Migration/Migrations/Migration.cs +++ b/Mongo.Migration/Migrations/Migration.cs @@ -1,6 +1,4 @@ -using System; - -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Document; namespace Mongo.Migration.Migrations diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index fca899c..6f01111 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -1,39 +1,19 @@  - - net6.0 - x64 - Sherweb - Sherweb - Office Protect - OfficeProtect.Mongo.Migration - Forked from Mongo.Migration which is designed for MongoDB C# Driver to migrate your documents easily on-the-fly. - https://github.com/sherweb/Mongo.Migration.git - git - op-icon.png - true - true - snupkg - false - true - true - true - v - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + + + net7.0;net8.0 + enable + enable + op-icon.png + + + + + + + + + + + \ No newline at end of file diff --git a/Mongo.Migration/MongoMigration.cs b/Mongo.Migration/MongoMigration.cs index 2adb03e..de2a59a 100644 --- a/Mongo.Migration/MongoMigration.cs +++ b/Mongo.Migration/MongoMigration.cs @@ -27,23 +27,23 @@ public MongoMigration( IStartUpVersionLocator startUpVersionLocator, IMigrationService migrationService) { - this._documentMigrationLocator = documentMigrationLocator; - this._databaseMigrationLocator = databaseMigrationLocator; - this._runtimeVersionLocator = runtimeVersionLocator; - this._collectionLocator = collectionLocator; - this._startUpVersionLocator = startUpVersionLocator; - this._migrationService = migrationService; + _documentMigrationLocator = documentMigrationLocator; + _databaseMigrationLocator = databaseMigrationLocator; + _runtimeVersionLocator = runtimeVersionLocator; + _collectionLocator = collectionLocator; + _startUpVersionLocator = startUpVersionLocator; + _migrationService = migrationService; } public void Run() { - this._documentMigrationLocator.Locate(); - this._databaseMigrationLocator.Locate(); - this._runtimeVersionLocator.Locate(); - this._collectionLocator.Locate(); - this._startUpVersionLocator.Locate(); + _documentMigrationLocator.Locate(); + _databaseMigrationLocator.Locate(); + _runtimeVersionLocator.Locate(); + _collectionLocator.Locate(); + _startUpVersionLocator.Locate(); - this._migrationService.Migrate(); + _migrationService.Migrate(); } } } \ No newline at end of file diff --git a/Mongo.Migration/Properties/AssemblyInfo.cs b/Mongo.Migration/Properties/AssemblyInfo.cs deleted file mode 100644 index 9070160..0000000 --- a/Mongo.Migration/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,4 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("Mongo.Migration.Test")] -[assembly: InternalsVisibleTo("Mongo.Migration.Test.Core")] \ No newline at end of file diff --git a/Mongo.Migration/Services/DatabaseVersionService.cs b/Mongo.Migration/Services/DatabaseVersionService.cs index 5a77d85..e622e36 100644 --- a/Mongo.Migration/Services/DatabaseVersionService.cs +++ b/Mongo.Migration/Services/DatabaseVersionService.cs @@ -1,5 +1,3 @@ -using System.Linq; - using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Locators; @@ -21,20 +19,20 @@ public DatabaseVersionService( IDatabaseTypeMigrationDependencyLocator migrationLocator, IMongoMigrationSettings mongoMigrationSettings) { - this._migrationLocator = migrationLocator; - this._mongoMigrationSettings = mongoMigrationSettings; + _migrationLocator = migrationLocator; + _mongoMigrationSettings = mongoMigrationSettings; } public DocumentVersion GetCurrentOrLatestMigrationVersion() { - return this._mongoMigrationSettings.DatabaseMigrationVersion > DocumentVersion.Empty() - ? this._mongoMigrationSettings.DatabaseMigrationVersion - : this._migrationLocator.GetLatestVersion(typeof(DatabaseMigration)); + return _mongoMigrationSettings.DatabaseMigrationVersion > DocumentVersion.Empty() + ? _mongoMigrationSettings.DatabaseMigrationVersion + : _migrationLocator.GetLatestVersion(typeof(DatabaseMigration)); } public DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db) { - var migrations = this.GetMigrationsCollection(db).Find(m => true).ToList(); + var migrations = GetMigrationsCollection(db).Find(m => true).ToList(); if (migrations == null || !migrations.Any()) { return DocumentVersion.Default(); @@ -45,7 +43,7 @@ public DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db) public void Save(IMongoDatabase db, IDatabaseMigration migration) { - this.GetMigrationsCollection(db).InsertOne( + GetMigrationsCollection(db).InsertOne( new MigrationHistory { MigrationId = migration.GetType().ToString(), @@ -55,7 +53,7 @@ public void Save(IMongoDatabase db, IDatabaseMigration migration) public void Remove(IMongoDatabase db, IDatabaseMigration migration) { - this.GetMigrationsCollection(db).DeleteOne(Builders.Filter.Eq(mh => mh.MigrationId, migration.GetType().ToString())); + GetMigrationsCollection(db).DeleteOne(Builders.Filter.Eq(mh => mh.MigrationId, migration.GetType().ToString())); } private IMongoCollection GetMigrationsCollection(IMongoDatabase db) diff --git a/Mongo.Migration/Services/DocumentVersionService.cs b/Mongo.Migration/Services/DocumentVersionService.cs index 1e70178..ace4e89 100644 --- a/Mongo.Migration/Services/DocumentVersionService.cs +++ b/Mongo.Migration/Services/DocumentVersionService.cs @@ -1,7 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; - using Mongo.Migration.Documents; using Mongo.Migration.Documents.Locators; using Mongo.Migration.Exceptions; @@ -31,35 +27,35 @@ public DocumentVersionService( IStartUpVersionLocator startUpVersionLocator, IMongoMigrationSettings mongoMigrationSettings) { - this._migrationLocator = migrationLocator; - this._runtimeVersionLocator = runtimeVersionLocator; - this._startUpVersionLocator = startUpVersionLocator; - this._versionFieldName = string.IsNullOrWhiteSpace(mongoMigrationSettings.VersionFieldName) + _migrationLocator = migrationLocator; + _runtimeVersionLocator = runtimeVersionLocator; + _startUpVersionLocator = startUpVersionLocator; + _versionFieldName = string.IsNullOrWhiteSpace(mongoMigrationSettings.VersionFieldName) ? VERSION_FIELD_NAME : mongoMigrationSettings.VersionFieldName; } public string GetVersionFieldName() { - return this._versionFieldName; + return _versionFieldName; } public DocumentVersion GetCurrentOrLatestMigrationVersion(Type type) { - var latestVersion = this._migrationLocator.GetLatestVersion(type); - return this.GetCurrentVersion(type) ?? latestVersion; + var latestVersion = _migrationLocator.GetLatestVersion(type); + return GetCurrentVersion(type) ?? latestVersion; } public DocumentVersion GetCollectionVersion(Type type) { - var version = this.GetCurrentOrLatestMigrationVersion(type); - return this._startUpVersionLocator.GetLocateOrNull(type) ?? version; + var version = GetCurrentOrLatestMigrationVersion(type); + return _startUpVersionLocator.GetLocateOrNull(type) ?? version; } public DocumentVersion GetVersionOrDefault(BsonDocument document) { BsonValue value; - document.TryGetValue(this.GetVersionFieldName(), out value); + document.TryGetValue(GetVersionFieldName(), out value); if (value != null && !value.IsBsonNull) { @@ -71,7 +67,7 @@ public DocumentVersion GetVersionOrDefault(BsonDocument document) public void SetVersion(BsonDocument document, DocumentVersion version) { - document[this.GetVersionFieldName()] = version.ToString(); + document[GetVersionFieldName()] = version.ToString(); } public void DetermineVersion(TClass instance) @@ -79,8 +75,8 @@ public void DetermineVersion(TClass instance) { var type = typeof(TClass); var documentVersion = instance.Version.ToString(); - var latestVersion = this._migrationLocator.GetLatestVersion(type); - var currentVersion = this._runtimeVersionLocator.GetLocateOrNull(type) ?? latestVersion; + var latestVersion = _migrationLocator.GetLatestVersion(type); + var currentVersion = _runtimeVersionLocator.GetLocateOrNull(type) ?? latestVersion; if (documentVersion == currentVersion) { @@ -116,7 +112,7 @@ public DocumentVersion DetermineLastVersion( private DocumentVersion? GetCurrentVersion(Type type) { - return this._runtimeVersionLocator.GetLocateOrNull(type); + return _runtimeVersionLocator.GetLocateOrNull(type); } private static void SetVersion( diff --git a/Mongo.Migration/Services/IDocumentVersionService.cs b/Mongo.Migration/Services/IDocumentVersionService.cs index 9c75b1f..addd01f 100644 --- a/Mongo.Migration/Services/IDocumentVersionService.cs +++ b/Mongo.Migration/Services/IDocumentVersionService.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections.Generic; - using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Document; diff --git a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs index 30dd4dc..fe8e82c 100644 --- a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs +++ b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs @@ -1,6 +1,4 @@ -using System; - -using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization; namespace Mongo.Migration.Services.Interceptors { diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs index 319f503..1cad4a9 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs @@ -17,13 +17,13 @@ internal class MigrationInterceptor : BsonClassMapSerializer).MakeGenericType(type); - var interceptor = Activator.CreateInstance(genericType, this._migrationRunner, this._documentVersionService); + var interceptor = Activator.CreateInstance(genericType, _migrationRunner, _documentVersionService); return interceptor as IBsonSerializer; } } diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs index c1b8ed8..87aa9ab 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs @@ -1,7 +1,4 @@ -using System; -using System.Linq; - -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; using MongoDB.Bson; using MongoDB.Bson.Serialization; @@ -14,14 +11,14 @@ internal class MigrationInterceptorProvider : IMigrationInterceptorProvider public MigrationInterceptorProvider(IMigrationInterceptorFactory migrationInterceptorFactory) { - this._migrationInterceptorFactory = migrationInterceptorFactory; + _migrationInterceptorFactory = migrationInterceptorFactory; } public IBsonSerializer GetSerializer(Type type) { if (ShouldBeMigrated(type)) { - return this._migrationInterceptorFactory.Create(type); + return _migrationInterceptorFactory.Create(type); } return null; diff --git a/Mongo.Migration/Services/MigrationService.cs b/Mongo.Migration/Services/MigrationService.cs index 6253dec..ceb3841 100644 --- a/Mongo.Migration/Services/MigrationService.cs +++ b/Mongo.Migration/Services/MigrationService.cs @@ -1,6 +1,4 @@ using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; - using Mongo.Migration.Documents.Serializers; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Document; @@ -26,43 +24,36 @@ internal class MigrationService : IMigrationService public MigrationService( DocumentVersionSerializer serializer, IMigrationInterceptorProvider provider, + ILogger logger, IStartUpDocumentMigrationRunner startUpDocumentMigrationRunner, IStartUpDatabaseMigrationRunner startUpDatabaseMigrationRunner) - : this(serializer, provider, NullLoggerFactory.Instance) - { - this._startUpDocumentMigrationRunner = startUpDocumentMigrationRunner; - this._startUpDatabaseMigrationRunner = startUpDatabaseMigrationRunner; - } - - private MigrationService( - DocumentVersionSerializer serializer, - IMigrationInterceptorProvider provider, - ILoggerFactory loggerFactory) { - this._serializer = serializer; - this._provider = provider; - this._logger = loggerFactory.CreateLogger(); + _serializer = serializer; + _provider = provider; + _logger = logger; + _startUpDocumentMigrationRunner = startUpDocumentMigrationRunner; + _startUpDatabaseMigrationRunner = startUpDatabaseMigrationRunner; } public void Migrate() { - BsonSerializer.RegisterSerializationProvider(this._provider); - this.RegisterSerializer(); + BsonSerializer.RegisterSerializationProvider(_provider); + RegisterSerializer(); - this.OnStartup(); + OnStartup(); } private void OnStartup() { - this._startUpDatabaseMigrationRunner.RunAll(); - this._startUpDocumentMigrationRunner.RunAll(); + _startUpDatabaseMigrationRunner.RunAll(); + _startUpDocumentMigrationRunner.RunAll(); } private void RegisterSerializer() { try { - BsonSerializer.RegisterSerializer(this._serializer.ValueType, this._serializer); + BsonSerializer.RegisterSerializer(_serializer.ValueType, _serializer); } catch (BsonSerializationException ex) { @@ -70,7 +61,7 @@ private void RegisterSerializer() // We have to do this, because there is always a default DocumentVersionSerialzer. // BsonSerializer.LookupSerializer(), does not work. - this._logger.LogError(ex, ex.GetType().ToString()); + _logger.LogError(ex, ex.GetType().ToString()); } } } diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs b/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs index 96a41ec..24edaaa 100644 --- a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs +++ b/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs @@ -2,7 +2,6 @@ using Mongo.Migration.Documents.Locators; using Mongo.Migration.Documents.Serializers; -using Mongo.Migration.Migrations.Adapters; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Document; using Mongo.Migration.Migrations.Locators; @@ -24,7 +23,6 @@ private static void RegisterDefaults(IServiceCollection services, IMongoMigratio { services.AddSingleton(settings); - services.AddSingleton(); services.AddSingleton(typeof(IMigrationLocator<>), typeof(TypeMigrationDependencyLocator<>)); services.AddSingleton(); services.AddSingleton(); diff --git a/Mongo.Migration/Startup/Static/ComponentRegistry.cs b/Mongo.Migration/Startup/Static/ComponentRegistry.cs deleted file mode 100644 index 7b219cb..0000000 --- a/Mongo.Migration/Startup/Static/ComponentRegistry.cs +++ /dev/null @@ -1,77 +0,0 @@ -using LightInject; - -using Mongo.Migration.Documents.Locators; -using Mongo.Migration.Documents.Serializers; -using Mongo.Migration.Migrations.Adapters; -using Mongo.Migration.Migrations.Database; -using Mongo.Migration.Migrations.Document; -using Mongo.Migration.Migrations.Locators; -using Mongo.Migration.Services; -using Mongo.Migration.Services.Interceptors; - -using MongoDB.Driver; - -namespace Mongo.Migration.Startup.Static -{ - internal class ComponentRegistry : IComponentRegistry - { - private readonly IContainerAdapter _containerAdapter; - - private readonly IMongoMigrationSettings _settings; - - public ComponentRegistry(IMongoMigrationSettings settings, IContainerAdapter containerAdapter = null) - { - this._settings = settings; - - if (containerAdapter == null) - { - containerAdapter = new LightInjectAdapter(new ServiceContainer()); - } - - this._containerAdapter = containerAdapter; - } - - public void RegisterComponents(IMongoClient client) - { - this.RegisterDefaults(); - - this._containerAdapter.RegisterInstance(client); - - this._containerAdapter.Register(); - } - - public TComponent Get() - where TComponent : class - { - return (TComponent)this._containerAdapter.GetInstance(typeof(TComponent)); - } - - private void RegisterDefaults() - { - this._containerAdapter.RegisterInstance(this._containerAdapter); - - this._containerAdapter.Register(typeof(IMigrationLocator<>), typeof(TypeMigrationDependencyLocator<>)); - - this._containerAdapter.RegisterInstance(this._settings); - - this._containerAdapter.RegisterSingleton(); - this._containerAdapter.RegisterSingleton(); - this._containerAdapter.RegisterSingleton(); - this._containerAdapter.RegisterSingleton(); - - this._containerAdapter.Register(); - this._containerAdapter.Register(); - this._containerAdapter.Register(); - this._containerAdapter.Register(); - - this._containerAdapter.Register(); - this._containerAdapter.Register(); - this._containerAdapter.Register(); - - this._containerAdapter.Register(); - this._containerAdapter.Register(); - - this._containerAdapter.Register(); - } - } -} \ No newline at end of file diff --git a/Mongo.Migration/Startup/Static/IComponentRegistry.cs b/Mongo.Migration/Startup/Static/IComponentRegistry.cs deleted file mode 100644 index 8dbd83a..0000000 --- a/Mongo.Migration/Startup/Static/IComponentRegistry.cs +++ /dev/null @@ -1,12 +0,0 @@ -using MongoDB.Driver; - -namespace Mongo.Migration.Startup.Static -{ - public interface IComponentRegistry - { - void RegisterComponents(IMongoClient client); - - TComponent Get() - where TComponent : class; - } -} \ No newline at end of file diff --git a/Mongo.Migration/Startup/Static/MongoMigrationClient.cs b/Mongo.Migration/Startup/Static/MongoMigrationClient.cs index 2163b19..1622f85 100644 --- a/Mongo.Migration/Startup/Static/MongoMigrationClient.cs +++ b/Mongo.Migration/Startup/Static/MongoMigrationClient.cs @@ -1,7 +1,5 @@ -using Mongo.Migration.Exceptions; -using Mongo.Migration.Migrations.Adapters; - -using MongoDB.Driver; +using Microsoft.Extensions.DependencyInjection; +using Mongo.Migration.Exceptions; namespace Mongo.Migration.Startup.Static { @@ -9,35 +7,19 @@ public static class MongoMigrationClient { private static bool _isRunning; - public static void Initialize(IComponentRegistry componentRegistry) + public static void Initialize(IServiceProvider serviceProvider) { if (_isRunning) { throw new AlreadyInitializedException(); } - var app = componentRegistry.Get(); + var app = serviceProvider.GetRequiredService(); app.Run(); _isRunning = true; } - public static void Initialize(IMongoClient client, IContainerAdapter containerAdapter) - { - var componentRegistry = new ComponentRegistry(new MongoMigrationSettings(), containerAdapter); - componentRegistry.RegisterComponents(client); - - Initialize(componentRegistry); - } - - public static void Initialize(IMongoClient client, IMongoMigrationSettings settings = null, IContainerAdapter containerAdapter = null) - { - var componentRegistry = new ComponentRegistry(settings ?? new MongoMigrationSettings(), containerAdapter); - componentRegistry.RegisterComponents(client); - - Initialize(componentRegistry); - } - public static void Reset() { _isRunning = false; From 75038c8dc7408dff85828ffabe9576db96324050 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Tue, 8 Oct 2024 11:46:41 +0200 Subject: [PATCH 02/42] update deps --- Mongo.Migration.Tests/Mongo.Migration.Tests.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj index b36a495..d30d89b 100644 --- a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj +++ b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj @@ -14,7 +14,10 @@ - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + From 9c3b74220c246812f5a954a27c4f6b6aaed5c54a Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Fri, 8 Nov 2024 23:49:02 +0100 Subject: [PATCH 03/42] another cleanup --- .../Documents/DocumentVersion_When_compare.cs | 6 ++-- ...rializer_when_serialize_and_deserialize.cs | 4 +-- Mongo.Migration.Tests/IntegrationTest.cs | 12 ++++--- .../Database/DatabaseIntegrationTest.cs | 17 ++++++---- ...baseMigrationRunner_when_migrating_down.cs | 12 +++---- ...tabaseMigrationRunner_when_migrating_up.cs | 8 ++--- ...mentMigrationRunner_when_migrating_down.cs | 6 ++-- ...cumentMigrationRunner_when_migrating_up.cs | 8 ++--- .../TypeMigrationLocator_when_locate.cs | 6 ++-- .../Mongo.Migration.Tests.csproj | 4 +-- .../MongoRegistrater_when_registrating.cs | 2 +- .../Performance/PerformanceOnStartup.cs | 6 ++-- ...seVersionService_when_determine_version.cs | 12 +++---- ...ntVersionService_when_determine_version.cs | 2 +- ...grationInterceptorFactory_when_creating.cs | 8 ++--- ...InterceptorProvider_when_get_serializer.cs | 4 +-- .../Attributes/CollectionLocation.cs | 4 +-- .../CollectionLocationInformation.cs | 6 ++-- Mongo.Migration/Documents/DocumentVersion.cs | 31 +++++++---------- .../Documents/Locators/AbstractLocator.cs | 4 +-- .../Serializers/DocumentVersionSerializer.cs | 2 +- .../Extensions/EnumerableExtensions.cs | 5 --- .../Database/DatabaseMigrationRunner.cs | 19 +++++------ .../Migrations/Database/MigrationHistory.cs | 2 +- .../StartUpDocumentMigrationRunner.cs | 2 +- .../DatabaseTypeMigrationDependencyLocator.cs | 9 ++--- .../Migrations/Locators/IMigrationLocator.cs | 2 +- .../Migrations/Locators/MigrationLocator.cs | 34 +++++++++---------- .../TypeMigrationDependencyLocator.cs | 23 ++++++++----- .../Locators/TypeMigrationLocator.cs | 6 +++- Mongo.Migration/Migrations/Migration.cs | 15 -------- Mongo.Migration/Mongo.Migration.csproj | 2 +- .../Services/DatabaseVersionService.cs | 6 ++-- .../Services/DocumentVersionService.cs | 7 ++-- .../MigrationInterceptorFactory.cs | 3 +- Mongo.Migration/Services/MigrationService.cs | 2 +- .../DotNetCore/MongoMigrationExtensions.cs | 2 +- 37 files changed, 144 insertions(+), 159 deletions(-) delete mode 100644 Mongo.Migration/Migrations/Migration.cs diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs index 3de5428..5ced3a3 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs @@ -7,11 +7,11 @@ namespace Mongo.Migration.Tests.Documents [TestFixture] public class DocumentVersion_When_compare { - private readonly DocumentVersion equalLowerVersion = new DocumentVersion("0.0.1"); + private readonly DocumentVersion equalLowerVersion = new("0.0.1"); - private readonly DocumentVersion higherVersion = new DocumentVersion("0.0.2"); + private readonly DocumentVersion higherVersion = new("0.0.2"); - private readonly DocumentVersion lowerVersion = new DocumentVersion("0.0.1"); + private readonly DocumentVersion lowerVersion = new("0.0.1"); [Test] public void If_higherVersion_lte_equalLowerVersion_Then_false() diff --git a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs index 9909c96..0e0eacb 100644 --- a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs +++ b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs @@ -51,7 +51,7 @@ public void Then_version_is_serialized_correct() [SetUp] public void SetUp() { - _serializer = new DocumentVersionSerializer(); + _serializer = new(); } private static BsonDocumentReader CreateVersionReader(BsonDocument document) @@ -64,7 +64,7 @@ private static BsonDocumentReader CreateVersionReader(BsonDocument document) private static BsonDocumentWriter CreateVersionWriter() { - var writer = new BsonDocumentWriter(new BsonDocument()); + var writer = new BsonDocumentWriter(new()); writer.WriteStartDocument(); writer.WriteName("version"); return writer; diff --git a/Mongo.Migration.Tests/IntegrationTest.cs b/Mongo.Migration.Tests/IntegrationTest.cs index 7dc88ee..2bffeab 100644 --- a/Mongo.Migration.Tests/IntegrationTest.cs +++ b/Mongo.Migration.Tests/IntegrationTest.cs @@ -10,15 +10,19 @@ namespace Mongo.Migration.Tests { public class IntegrationTest : IDisposable { - protected IMongoClient _client; + private MongoClient? _client; - protected IServiceProvider _serviceProvider; + private MongoDbRunner? _mongoToGoRunner; - protected MongoDbRunner _mongoToGoRunner; + private ServiceProvider? _serviceProvider; + + protected IServiceProvider Provider => _serviceProvider ?? throw new InvalidOperationException("Must be setup"); public void Dispose() { + _serviceProvider?.Dispose(); _mongoToGoRunner?.Dispose(); + GC.SuppressFinalize(this); } protected void OnSetUp() @@ -28,7 +32,7 @@ protected void OnSetUp() _client.GetDatabase("PerformanceTest").CreateCollection("Test"); - ServiceCollection serviceCollection = new ServiceCollection(); + ServiceCollection serviceCollection = new(); serviceCollection .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) .AddSingleton(_client) diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs index 24e37f5..2f84175 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs @@ -15,13 +15,15 @@ internal class DatabaseIntegrationTest : IDisposable { private const string MigrationsCollectionName = "_migrations"; - protected IMongoClient _client; + private MongoClient? _client; - protected IServiceProvider _serviceProvider; + private ServiceProvider? _serviceProvider; + protected IServiceProvider Provider => _serviceProvider ?? throw new InvalidOperationException("Must be setup"); - protected IMongoDatabase _db; + private IMongoDatabase? _db; + protected IMongoDatabase Db => _db ?? throw new InvalidOperationException("Must be setup"); - protected MongoDbRunner _mongoToGoRunner; + private MongoDbRunner? _mongoToGoRunner; protected virtual string DatabaseName { get; set; } = "DatabaseMigration"; @@ -29,6 +31,7 @@ internal class DatabaseIntegrationTest : IDisposable public void Dispose() { + _serviceProvider?.Dispose(); _mongoToGoRunner?.Dispose(); } @@ -40,7 +43,7 @@ protected virtual void OnSetUp(DocumentVersion databaseMigrationVersion) _db.CreateCollection(CollectionName); - ServiceCollection serviceCollection = new ServiceCollection(); + ServiceCollection serviceCollection = new(); serviceCollection .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) .AddSingleton(_client) @@ -57,12 +60,12 @@ protected virtual void OnSetUp(DocumentVersion databaseMigrationVersion) protected void InsertMigrations(IEnumerable migrations) { var list = migrations.Select(m => new BsonDocument { { "MigrationId", m.GetType().ToString() }, { "Version", m.Version.ToString() } }); - _db.GetCollection(MigrationsCollectionName).InsertManyAsync(list).Wait(); + Db.GetCollection(MigrationsCollectionName).InsertManyAsync(list).Wait(); } protected List GetMigrationHistory() { - var migrationHistoryCollection = _db.GetCollection(MigrationsCollectionName); + var migrationHistoryCollection = Db.GetCollection(MigrationsCollectionName); return migrationHistoryCollection.Find(m => true).ToList(); } } diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs index 53b35b4..fcbb58c 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs @@ -8,15 +8,15 @@ namespace Mongo.Migration.Tests.Migrations.Database { [TestFixture] - internal class DatabaseMigrationRunner_when_migrating_down : DatabaseIntegrationTest + internal class DatabaseMigrationRunnerWhenMigratingDown : DatabaseIntegrationTest { - private IDatabaseMigrationRunner _runner; + private IDatabaseMigrationRunner? _runner; protected override void OnSetUp(DocumentVersion databaseMigrationVersion) { base.OnSetUp(databaseMigrationVersion); - _runner = _serviceProvider.GetRequiredService(); + _runner = Provider.GetRequiredService(); } [TearDown] @@ -40,7 +40,7 @@ public void When_database_has_migrations_Then_down_all_migrations() }); // Act - _runner.Run(_db); + _runner?.Run(Db); // Assert var migrations = GetMigrationHistory(); @@ -50,7 +50,7 @@ public void When_database_has_migrations_Then_down_all_migrations() [Test] public void When_database_has_migrations_Then_down_to_selected_migration() { - OnSetUp(new DocumentVersion("0.0.1")); + OnSetUp(new("0.0.1")); // Arrange InsertMigrations( @@ -62,7 +62,7 @@ public void When_database_has_migrations_Then_down_to_selected_migration() }); // Act - _runner.Run(_db); + _runner?.Run(Db); // Assert var migrations = GetMigrationHistory(); diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs index 8884b47..a96aeec 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs @@ -17,7 +17,7 @@ public void SetUp() { base.OnSetUp(DocumentVersion.Empty()); - _runner = _serviceProvider.GetRequiredService(); + _runner = Provider.GetRequiredService(); } [TearDown] @@ -30,7 +30,7 @@ public void TearDown() public void When_database_has_no_migrations_Then_all_migrations_are_used() { // Act - _runner.Run(_db); + _runner.Run(Db); // Assert var migrations = GetMigrationHistory(); @@ -47,7 +47,7 @@ public void When_database_has_migrations_Then_latest_migrations_are_used() InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), new TestDatabaseMigration_0_0_2() }); // Act - _runner.Run(_db); + _runner.Run(Db); // Assert var migrations = GetMigrationHistory(); @@ -63,7 +63,7 @@ public void When_database_has_latest_version_Then_nothing_happens() new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), new TestDatabaseMigration_0_0_2(), new TestDatabaseMigration_0_0_3() }); // Act - _runner.Run(_db); + _runner.Run(Db); // Assert var migrations = GetMigrationHistory(); diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs index a5e41a8..1ca43ff 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs @@ -17,7 +17,7 @@ public void SetUp() { OnSetUp(); - _runner = _serviceProvider.GetRequiredService(); + _runner = Provider.GetRequiredService(); } [TearDown] @@ -30,7 +30,7 @@ public void TearDown() public void When_migrating_down_Then_all_migrations_are_used() { // Arrange - BsonDocument document = new BsonDocument + BsonDocument document = new() { { "Version", "0.0.2" }, { "Door", 3 } @@ -49,7 +49,7 @@ public void When_document_has_Then_all_migrations_are_used_to_that_version() { // Arrange // Arrange - BsonDocument document = new BsonDocument + BsonDocument document = new() { { "Version", "0.0.2" }, { "Door", 3 } diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs index 289f0c2..f5b7153 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs @@ -17,7 +17,7 @@ public void SetUp() { OnSetUp(); - _runner = _serviceProvider.GetRequiredService(); + _runner = Provider.GetRequiredService(); } [TearDown] @@ -30,7 +30,7 @@ public void TearDown() public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() { // Arrange - BsonDocument document = new BsonDocument + BsonDocument document = new() { { "Version", "0.0.0" }, { "Dors", 3 } @@ -48,7 +48,7 @@ public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() public void When_document_has_no_version_Then_all_migrations_are_used() { // Arrange - BsonDocument document = new BsonDocument + BsonDocument document = new() { { "Dors", 3 } }; @@ -65,7 +65,7 @@ public void When_document_has_no_version_Then_all_migrations_are_used() public void When_document_has_current_version_Then_nothing_happens() { // Arrange - BsonDocument document = new BsonDocument + BsonDocument document = new() { { "Version", "0.0.2" }, { "Door", 3 } diff --git a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs index 364307d..026508d 100644 --- a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs @@ -7,7 +7,7 @@ namespace Mongo.Migration.Tests.Migrations.Locators { [TestFixture] - public class TypeMigrationLocator_when_locate + public class TypeMigrationLocatorWhenLocate { private TypeMigrationLocator _locator; @@ -25,7 +25,7 @@ public void When_document_has_one_migration_Then_migrations_count_should_be_one( var result = _locator.GetMigrations(typeof(TestDocumentWithOneMigration)); // Assert - result.Count().Should().Be(1); + result.Count.Should().Be(1); } [Test] @@ -35,7 +35,7 @@ public void When_document_has_two_migration_Then_migrations_count_should_be_two( var result = _locator.GetMigrations(typeof(TestDocumentWithTwoMigration)); // Assert - result.Count().Should().Be(2); + result.Count.Should().Be(2); } [Test] diff --git a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj index d30d89b..b4a3772 100644 --- a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj +++ b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj @@ -11,8 +11,8 @@ - - + + all diff --git a/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs b/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs index 0cec292..5069da1 100644 --- a/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs +++ b/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs @@ -26,7 +26,7 @@ public void TearDown() public void Then_serializer_is_registered() { // Arrange - var migrationService = _serviceProvider.GetRequiredService(); + var migrationService = Provider.GetRequiredService(); // Act migrationService.Migrate(); diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index 8e4b047..9e16ef1 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -33,7 +33,7 @@ public class PerformanceTestOnStartup public void TearDown() { MongoMigrationClient.Reset(); - _client = null; + _client = null!; _runner.Dispose(); } @@ -41,7 +41,7 @@ public void TearDown() public void SetUp() { _runner = MongoDbRunner.Start(); - _client = new MongoClient(_runner.ConnectionString); + _client = new(_runner.ConnectionString); } [Test] @@ -67,7 +67,7 @@ public void When_migrating_number_of_documents() InsertMany(DOCUMENT_COUNT, true); var swWithMigration = new Stopwatch(); swWithMigration.Start(); - ServiceCollection serviceCollection = new ServiceCollection(); + ServiceCollection serviceCollection = new(); serviceCollection .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) .AddSingleton(_client) diff --git a/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs index a97a673..ea8edf4 100644 --- a/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs @@ -8,15 +8,15 @@ namespace Mongo.Migration.Tests.Services { [TestFixture] - internal class DatabaseVersionService_when_determine_version : DatabaseIntegrationTest + internal class DatabaseVersionServiceWhenDetermineVersion : DatabaseIntegrationTest { - private IDatabaseVersionService _service; + private IDatabaseVersionService? _service; protected override void OnSetUp(DocumentVersion version) { base.OnSetUp(version); - _service = _serviceProvider.GetRequiredService(); + _service = Provider.GetRequiredService(); } [TearDown] @@ -32,7 +32,7 @@ public void When_project_has_migrations_Then_get_latest_version() OnSetUp(DocumentVersion.Empty()); // Act - var migrationVersion = _service.GetCurrentOrLatestMigrationVersion(); + var migrationVersion = _service?.GetCurrentOrLatestMigrationVersion(); // Assert migrationVersion.ToString().Should().Be("0.0.3"); @@ -42,10 +42,10 @@ public void When_project_has_migrations_Then_get_latest_version() public void When_version_set_on_startup_Then_use_startup_version() { // Arrange - OnSetUp(new DocumentVersion(0, 0, 2)); + OnSetUp(new(0, 0, 2)); // Act - var migrationVersion = _service.GetCurrentOrLatestMigrationVersion(); + var migrationVersion = _service?.GetCurrentOrLatestMigrationVersion(); // Assert migrationVersion.ToString().Should().Be("0.0.2"); diff --git a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs index 81b32b8..7e24676 100644 --- a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs @@ -17,7 +17,7 @@ public void SetUp() { OnSetUp(); - _service = _serviceProvider.GetRequiredService(); + _service = Provider.GetRequiredService(); } [TearDown] diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs index 31de23f..417d347 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs @@ -25,7 +25,7 @@ public void TearDown() public void If_type_is_assignable_to_document_Then_interceptor_is_created() { // Arrange - var factory = _serviceProvider.GetRequiredService(); + var factory = Provider.GetRequiredService(); // Act var interceptor = factory.Create(typeof(TestDocumentWithOneMigration)); @@ -38,7 +38,7 @@ public void If_type_is_assignable_to_document_Then_interceptor_is_created() public void If_type_is_not_assignable_to_document_Then_exception_is_thrown() { // Arrange - var factory = _serviceProvider.GetRequiredService(); + var factory = Provider.GetRequiredService(); // Act Action act = () => factory.Create(typeof(TestClass)); @@ -51,10 +51,10 @@ public void If_type_is_not_assignable_to_document_Then_exception_is_thrown() public void If_type_is_null_Then_exception_is_thrown() { // Arrange - var factory = _serviceProvider.GetRequiredService(); + var factory = Provider.GetRequiredService(); // Act - Action act = () => factory.Create(null); + Action act = () => factory.Create(null!); // Assert act.Should().ThrowExactly(); diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs index d8f45f4..d1d8b81 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs @@ -25,7 +25,7 @@ public void TearDown() public void When_entity_is_document_Then_provide_serializer() { // Arrange - var provider = _serviceProvider.GetRequiredService(); + var provider = Provider.GetRequiredService(); // Act var serializer = provider.GetSerializer(typeof(TestDocumentWithOneMigration)); @@ -38,7 +38,7 @@ public void When_entity_is_document_Then_provide_serializer() public void When_entity_is_not_document_Then_provide_null() { // Arrange - var provider = _serviceProvider.GetRequiredService(); + var provider = Provider.GetRequiredService(); // Act var serializer = provider.GetSerializer(typeof(TestClass)); diff --git a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs b/Mongo.Migration/Documents/Attributes/CollectionLocation.cs index 0626b60..3d83b64 100644 --- a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs +++ b/Mongo.Migration/Documents/Attributes/CollectionLocation.cs @@ -5,9 +5,9 @@ public class CollectionLocation : Attribute { public CollectionLocationInformation CollectionInformation { get; } - public CollectionLocation(string collectionName, string databaseName = null) + public CollectionLocation(string collectionName, string? databaseName = null) { - CollectionInformation = new CollectionLocationInformation(databaseName, collectionName); + CollectionInformation = new(databaseName, collectionName); } } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs b/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs index cf815cb..0d08a74 100644 --- a/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs +++ b/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs @@ -1,14 +1,14 @@ namespace Mongo.Migration.Documents.Attributes { - public struct CollectionLocationInformation + public readonly struct CollectionLocationInformation { - public CollectionLocationInformation(string database, string collection) + public CollectionLocationInformation(string? database, string collection) { Database = database; Collection = collection; } - public string Database { get; } + public string? Database { get; } public string Collection { get; } } diff --git a/Mongo.Migration/Documents/DocumentVersion.cs b/Mongo.Migration/Documents/DocumentVersion.cs index efc02f5..5f7c758 100644 --- a/Mongo.Migration/Documents/DocumentVersion.cs +++ b/Mongo.Migration/Documents/DocumentVersion.cs @@ -5,11 +5,11 @@ namespace Mongo.Migration.Documents { - public struct DocumentVersion : IComparable + public readonly struct DocumentVersion : IComparable { - private const char VERSION_SPLIT_CHAR = '.'; + private const char VersionSplitChar = '.'; - private const int MAX_LENGTH = 3; + private const int MaxLength = 3; public int Major { get; init; } @@ -30,9 +30,9 @@ static DocumentVersion() public DocumentVersion(string version) { - string[] versionParts = version.Split(VERSION_SPLIT_CHAR); + string[] versionParts = version.Split(VersionSplitChar); - if (versionParts.Length != MAX_LENGTH) + if (versionParts.Length != MaxLength) { throw new VersionStringToLongException(version); } @@ -58,12 +58,12 @@ public static DocumentVersion Default() public static DocumentVersion Empty() { - return new DocumentVersion(-1, 0, 0); + return new(-1, 0, 0); } public static implicit operator DocumentVersion(string version) { - return new DocumentVersion(version); + return new(version); } public static implicit operator string(DocumentVersion documentVersion) @@ -123,9 +123,9 @@ public bool Equals(DocumentVersion other) return other.Major == Major && other.Minor == Minor && other.Revision == Revision; } - public override bool Equals(object obj) + public override bool Equals(object? obj) { - if (ReferenceEquals(null, obj)) + if (obj is null) { return false; } @@ -140,21 +140,14 @@ public override bool Equals(object obj) public override int GetHashCode() { - unchecked - { - int result = Major; - result = (result * 397) ^ Minor; - result = (result * 397) ^ Revision; - return result; - } + return HashCode.Combine(Major, Minor, Revision); } private static int ParseVersionPart(string value) { - string revisionString = value; - if (!int.TryParse(revisionString, out var target)) + if (!int.TryParse(value, out int target)) { - throw new InvalidVersionValueException(revisionString); + throw new InvalidVersionValueException(value); } return target; diff --git a/Mongo.Migration/Documents/Locators/AbstractLocator.cs b/Mongo.Migration/Documents/Locators/AbstractLocator.cs index 160136c..fcc1587 100644 --- a/Mongo.Migration/Documents/Locators/AbstractLocator.cs +++ b/Mongo.Migration/Documents/Locators/AbstractLocator.cs @@ -4,7 +4,7 @@ public abstract class AbstractLocator : ILocator _locatesDictionary; + private IDictionary? _locatesDictionary; protected IDictionary LocatesDictionary { @@ -15,7 +15,7 @@ protected IDictionary LocatesDictionary Locate(); } - return _locatesDictionary; + return _locatesDictionary!; } set => _locatesDictionary = value; diff --git a/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs b/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs index 31b4d60..be2fef5 100644 --- a/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs +++ b/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs @@ -17,7 +17,7 @@ public override void Serialize( public override DocumentVersion Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { var versionString = context.Reader.ReadString(); - return new DocumentVersion(versionString); + return new(versionString); } } } \ No newline at end of file diff --git a/Mongo.Migration/Extensions/EnumerableExtensions.cs b/Mongo.Migration/Extensions/EnumerableExtensions.cs index 91ddee7..968c658 100644 --- a/Mongo.Migration/Extensions/EnumerableExtensions.cs +++ b/Mongo.Migration/Extensions/EnumerableExtensions.cs @@ -5,11 +5,6 @@ namespace Mongo.Migration.Extensions { internal static class EnumerableExtensions { - internal static bool NullOrEmpty(this IEnumerable list) - { - return list == null || !list.Any(); - } - internal static IEnumerable CheckForDuplicates(this IEnumerable list) where TMigrationType : class, IMigration { diff --git a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs index a032b55..9d1450c 100644 --- a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs @@ -12,9 +12,9 @@ internal class DatabaseMigrationRunner : IDatabaseMigrationRunner private readonly ILogger _logger; - private readonly Type DatabaseMigrationType = typeof(DatabaseMigration); + private readonly Type _databaseMigrationType = typeof(DatabaseMigration); - private IDatabaseTypeMigrationDependencyLocator _migrationLocator { get; } + private readonly IDatabaseTypeMigrationDependencyLocator _migrationLocator; public DatabaseMigrationRunner( IDatabaseTypeMigrationDependencyLocator migrationLocator, @@ -57,40 +57,39 @@ private void MigrateUpOrDown( private void MigrateUp(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion) { - var migrations = _migrationLocator.GetMigrationsFromTo(DatabaseMigrationType, currentVersion, toVersion).ToList(); + var migrations = _migrationLocator.GetMigrationsFromTo(_databaseMigrationType, currentVersion, toVersion).ToList(); foreach (var migration in migrations) { - _logger.LogInformation("Database Migration Up: {0}:{1} ", currentVersion.GetType().ToString(), migration.Version); + _logger.LogInformation("Database Migration Up: {Type}:{Version} ", currentVersion.GetType(), migration.Version); migration.Up(db); _databaseVersionService.Save(db, migration); - _logger.LogInformation("Database Migration Up finished successful: {0}:{1} ", migration.GetType().ToString(), migration.Version); + _logger.LogInformation("Database Migration Up finished successful: {Type}:{Version} ", migration.GetType(), migration.Version); } } private void MigrateDown(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion) { var migrations = _migrationLocator - .GetMigrationsGtEq(DatabaseMigrationType, toVersion) + .GetMigrationsGtEq(_databaseMigrationType, toVersion) .OrderByDescending(m => m.Version) .ToList(); - for (var m = 0; m < migrations.Count; m++) + foreach (var migration in migrations) { - var migration = migrations[m]; if (migration.Version == toVersion) { break; } - _logger.LogInformation("Database Migration Down: {0}:{1} ", migration.GetType().ToString(), migration.Version); + _logger.LogInformation("Database Migration Down: {Type}:{Version} ", migration.GetType(), migration.Version); migration.Down(db); _databaseVersionService.Remove(db, migration); - _logger.LogInformation("Database Migration Down finished successful: {0}:{1} ", migration.GetType().ToString(), migration.Version); + _logger.LogInformation("Database Migration Down finished successful: {Type}:{Version} ", migration.GetType(), migration.Version); } } } diff --git a/Mongo.Migration/Migrations/Database/MigrationHistory.cs b/Mongo.Migration/Migrations/Database/MigrationHistory.cs index b214a26..6b940ab 100644 --- a/Mongo.Migration/Migrations/Database/MigrationHistory.cs +++ b/Mongo.Migration/Migrations/Database/MigrationHistory.cs @@ -8,7 +8,7 @@ public class MigrationHistory { public ObjectId Id { get; set; } - public string MigrationId { get; set; } + public required string MigrationId { get; set; } public DocumentVersion Version { get; set; } } diff --git a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs index 2090a7d..4625bc5 100644 --- a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs @@ -15,7 +15,7 @@ internal class StartUpDocumentMigrationRunner : IStartUpDocumentMigrationRunner private readonly ICollectionLocator _collectionLocator; - private readonly string _databaseName; + private readonly string? _databaseName; private readonly IDocumentVersionService _documentVersionService; diff --git a/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs index 737d7fa..1d34323 100644 --- a/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs @@ -5,7 +5,7 @@ namespace Mongo.Migration.Migrations.Locators { internal class DatabaseTypeMigrationDependencyLocator : TypeMigrationDependencyLocator, IDatabaseTypeMigrationDependencyLocator { - private IDictionary> _migrations; + private IDictionary>? _migrations; protected override IDictionary> Migrations { @@ -16,12 +16,9 @@ protected override IDictionary> Mi Locate(); } - return _migrations; - } - set - { - _migrations = value; + return _migrations!; } + set => _migrations = value; } public DatabaseTypeMigrationDependencyLocator(ILogger logger, IServiceProvider serviceProvider) diff --git a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs index 8c10773..824ac20 100644 --- a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs @@ -5,7 +5,7 @@ namespace Mongo.Migration.Migrations.Locators public interface IMigrationLocator where TMigrationType : class, IMigration { - IEnumerable GetMigrations(Type type); + IReadOnlyCollection GetMigrations(Type type); IEnumerable GetMigrationsGt(Type type, DocumentVersion version); diff --git a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs index 83d6308..1463954 100644 --- a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs @@ -2,7 +2,6 @@ using Microsoft.Extensions.Logging; using Mongo.Migration.Documents; using Mongo.Migration.Exceptions; -using Mongo.Migration.Extensions; namespace Mongo.Migration.Migrations.Locators { @@ -11,41 +10,45 @@ public abstract class MigrationLocator : IMigrationLocator> _logger; - private IEnumerable _assemblies; + private readonly List _assemblies; - private IDictionary> _migrations; + private IDictionary>? _migrations; protected MigrationLocator(ILogger> logger) { _logger = logger; + _assemblies = GetAssemblies(); } - protected IEnumerable Assemblies => _assemblies ??= GetAssemblies(); + protected IEnumerable Assemblies => _assemblies; protected virtual IDictionary> Migrations { get { - if (_migrations == null) + if (_migrations is null) { Locate(); } - if (_migrations.NullOrEmpty()) + if (_migrations is null || _migrations.Count <= 0) { _logger.LogInformation(new NoMigrationsFoundException(), "No migration found"); } - return _migrations; + return _migrations!; } set => _migrations = value; } - public IEnumerable GetMigrations(Type type) + public IReadOnlyCollection GetMigrations(Type type) { - Migrations.TryGetValue(type, out var migrations); + if(Migrations.TryGetValue(type, out var migrations)) + { + return migrations; + } - return migrations ?? Enumerable.Empty(); + return Array.Empty(); } public IEnumerable GetMigrationsFromTo(Type type, DocumentVersion version, DocumentVersion otherVersion) @@ -83,17 +86,14 @@ public DocumentVersion GetLatestVersion(Type type) { var migrations = GetMigrations(type); - if (migrations == null || !migrations.Any()) - { - return DocumentVersion.Default(); - } - - return migrations.Max(m => m.Version); + return migrations.Count > 0 + ? migrations.Max(m => m.Version) + : DocumentVersion.Default(); } public abstract void Locate(); - private static IReadOnlyList GetAssemblies() + private static List GetAssemblies() { var location = AppDomain.CurrentDomain.BaseDirectory; var path = Path.GetDirectoryName(location); diff --git a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs index 0f59214..914cce6 100644 --- a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs @@ -1,4 +1,5 @@ using System.Reflection; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Mongo.Migration.Extensions; @@ -28,31 +29,35 @@ where typeof(TMigrationType).IsAssignableFrom(type) && !type.IsAbstract private TMigrationType GetMigrationInstance(Type type) { - ConstructorInfo constructor = type.GetConstructors()[0]; + ConstructorInfo[] constructors = type.GetConstructors(); - if (constructor != null) + if (constructors.Length > 0) { - object[] args = constructor + object[] args = constructors + .First() .GetParameters() - .Select(parameterInfo => _serviceProvider.GetService(parameterInfo.ParameterType)) + .Select(parameterInfo => _serviceProvider.GetRequiredService(parameterInfo.ParameterType)) .ToArray(); - return Activator.CreateInstance(type, args) as TMigrationType; + return Activator.CreateInstance(type, args) as TMigrationType + ?? throw new InvalidOperationException($"Cannot create {type} migration"); } - return Activator.CreateInstance(type) as TMigrationType; + return Activator.CreateInstance(type) as TMigrationType + ?? throw new InvalidOperationException($"Cannot create {type} migration"); } private class TypeComparer : IEqualityComparer { - public bool Equals(Type x, Type y) + public bool Equals(Type? x, Type? y) { - return x.AssemblyQualifiedName == y.AssemblyQualifiedName; + return x?.AssemblyQualifiedName == y?.AssemblyQualifiedName; } public int GetHashCode(Type obj) { - return obj.AssemblyQualifiedName.GetHashCode(); + return obj.AssemblyQualifiedName?.GetHashCode() + ?? throw new InvalidOperationException($"Cannot get AssemblyQualifiedName from {obj}"); } } } diff --git a/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs b/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs index e86edbf..430d2d5 100644 --- a/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs @@ -16,7 +16,11 @@ from type in assembly.GetTypes() where typeof(IDocumentMigration).IsAssignableFrom(type) && !type.IsAbstract select type).Distinct(); - Migrations = migrationTypes.Select(t => (IDocumentMigration)Activator.CreateInstance(t)).ToMigrationDictionary(); + Migrations = migrationTypes + .Select(t => + Activator.CreateInstance(t) as IDocumentMigration + ?? throw new InvalidOperationException($"Cannot create {t} document migration")) + .ToMigrationDictionary(); } } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Migration.cs b/Mongo.Migration/Migrations/Migration.cs deleted file mode 100644 index bcbe28c..0000000 --- a/Mongo.Migration/Migrations/Migration.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Mongo.Migration.Documents; -using Mongo.Migration.Migrations.Document; - -namespace Mongo.Migration.Migrations -{ - [Obsolete] - public abstract class Migration : DocumentMigration - where TClass : class, IDocument - { - protected Migration(string version) - : base(version) - { - } - } -} \ No newline at end of file diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index 6f01111..337f875 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -8,7 +8,7 @@ - + diff --git a/Mongo.Migration/Services/DatabaseVersionService.cs b/Mongo.Migration/Services/DatabaseVersionService.cs index e622e36..b6a8c93 100644 --- a/Mongo.Migration/Services/DatabaseVersionService.cs +++ b/Mongo.Migration/Services/DatabaseVersionService.cs @@ -33,7 +33,7 @@ public DocumentVersion GetCurrentOrLatestMigrationVersion() public DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db) { var migrations = GetMigrationsCollection(db).Find(m => true).ToList(); - if (migrations == null || !migrations.Any()) + if (migrations == null || migrations.Count <= 0) { return DocumentVersion.Default(); } @@ -44,7 +44,7 @@ public DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db) public void Save(IMongoDatabase db, IDatabaseMigration migration) { GetMigrationsCollection(db).InsertOne( - new MigrationHistory + new() { MigrationId = migration.GetType().ToString(), Version = migration.Version @@ -56,7 +56,7 @@ public void Remove(IMongoDatabase db, IDatabaseMigration migration) GetMigrationsCollection(db).DeleteOne(Builders.Filter.Eq(mh => mh.MigrationId, migration.GetType().ToString())); } - private IMongoCollection GetMigrationsCollection(IMongoDatabase db) + private static IMongoCollection GetMigrationsCollection(IMongoDatabase db) { return db.GetCollection(MigrationsCollectionName); } diff --git a/Mongo.Migration/Services/DocumentVersionService.cs b/Mongo.Migration/Services/DocumentVersionService.cs index ace4e89..a645a36 100644 --- a/Mongo.Migration/Services/DocumentVersionService.cs +++ b/Mongo.Migration/Services/DocumentVersionService.cs @@ -11,7 +11,7 @@ namespace Mongo.Migration.Services { internal class DocumentVersionService : IDocumentVersionService { - private static readonly string VERSION_FIELD_NAME = "Version"; + private static readonly string VersionFieldName = "Version"; private readonly IMigrationLocator _migrationLocator; @@ -31,7 +31,7 @@ public DocumentVersionService( _runtimeVersionLocator = runtimeVersionLocator; _startUpVersionLocator = startUpVersionLocator; _versionFieldName = string.IsNullOrWhiteSpace(mongoMigrationSettings.VersionFieldName) - ? VERSION_FIELD_NAME + ? VersionFieldName : mongoMigrationSettings.VersionFieldName; } @@ -54,8 +54,7 @@ public DocumentVersion GetCollectionVersion(Type type) public DocumentVersion GetVersionOrDefault(BsonDocument document) { - BsonValue value; - document.TryGetValue(GetVersionFieldName(), out value); + document.TryGetValue(GetVersionFieldName(), out BsonValue value); if (value != null && !value.IsBsonNull) { diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs index 1a37359..d5e3702 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs @@ -20,7 +20,8 @@ public IBsonSerializer Create(Type type) { var genericType = typeof(MigrationInterceptor<>).MakeGenericType(type); var interceptor = Activator.CreateInstance(genericType, _migrationRunner, _documentVersionService); - return interceptor as IBsonSerializer; + return interceptor as IBsonSerializer + ?? throw new InvalidOperationException($"Cannot create {genericType} interceptor"); } } } \ No newline at end of file diff --git a/Mongo.Migration/Services/MigrationService.cs b/Mongo.Migration/Services/MigrationService.cs index ceb3841..53c69c5 100644 --- a/Mongo.Migration/Services/MigrationService.cs +++ b/Mongo.Migration/Services/MigrationService.cs @@ -61,7 +61,7 @@ private void RegisterSerializer() // We have to do this, because there is always a default DocumentVersionSerialzer. // BsonSerializer.LookupSerializer(), does not work. - _logger.LogError(ex, ex.GetType().ToString()); + _logger.LogError(ex, "Cannot register {Type} twice", typeof(DocumentVersionSerializer)); } } } diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs b/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs index 24edaaa..571db0c 100644 --- a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs +++ b/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs @@ -12,7 +12,7 @@ namespace Mongo.Migration.Startup.DotNetCore { public static class MongoMigrationExtensions { - public static void AddMigration(this IServiceCollection services, IMongoMigrationSettings settings = null) + public static void AddMigration(this IServiceCollection services, IMongoMigrationSettings? settings = null) { RegisterDefaults(services, settings ?? new MongoMigrationSettings()); From 7c1f59388df730139c8e63f905cad3958966ca0b Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Sat, 9 Nov 2024 14:11:20 +0100 Subject: [PATCH 04/42] namespaces --- .../Documents/DocumentVersion_When_casting.cs | 31 ++- .../Documents/DocumentVersion_When_compare.cs | 85 ++++--- .../DocumentVersion_When_creating.cs | 89 ++++---- .../Documents/Document_when_creating.cs | 41 ++-- .../AttributeMigrationLocator_when_locate.cs | 45 ++-- ...rializer_when_serialize_and_deserialize.cs | 103 +++++---- Mongo.Migration.Tests/IntegrationTest.cs | 49 ++-- .../Database/DatabaseIntegrationTest.cs | 89 ++++---- .../Database/DatabaseMigrationRunnerSetup.cs | 27 ++- ...baseMigrationRunner_when_migrating_down.cs | 103 +++++---- ...tabaseMigrationRunner_when_migrating_up.cs | 109 +++++---- .../DatabaseMigration_when_creating.cs | 53 +++-- ...mentMigrationRunner_when_migrating_down.cs | 89 ++++---- ...cumentMigrationRunner_when_migrating_up.cs | 113 +++++---- .../DocumentMigration_when_creating.cs | 53 +++-- .../DocumentMigration_when_migrating.cs | 49 ++-- .../TypeMigrationLocator_when_locate.cs | 103 +++++---- .../MongoRegistrater_when_registrating.cs | 45 ++-- .../Performance/PerformanceOnStartup.cs | 199 ++++++++-------- ...seVersionService_when_determine_version.cs | 85 ++++--- ...ntVersionService_when_determine_version.cs | 91 ++++---- .../MongoMigration_when_initialize.cs | 45 ++-- ...grationInterceptorFactory_when_creating.cs | 105 +++++---- ...InterceptorProvider_when_get_serializer.cs | 79 ++++--- .../Database/TestDatabaseMigration_0_0_1.cs | 23 +- .../Database/TestDatabaseMigration_0_0_2.cs | 23 +- .../Database/TestDatabaseMigration_0_0_3.cs | 23 +- .../TestDoubles/TestClass.cs | 11 +- .../TestDocumentWithOneMigration.cs | 19 +- .../TestDocumentWithOneMigration_0_0_1.cs | 35 ++- .../TestDocumentWithTwoMigration.cs | 11 +- ...tDocumentWithTwoMigrationHighestVersion.cs | 15 +- ...entWithTwoMigrationHighestVersion_0_0_1.cs | 35 ++- ...entWithTwoMigrationHighestVersion_0_0_2.cs | 35 ++- ...stDocumentWithTwoMigrationMiddleVersion.cs | 11 +- ...mentWithTwoMigrationMiddleVersion_0_0_1.cs | 35 ++- ...mentWithTwoMigrationMiddleVersion_0_0_2.cs | 35 ++- .../TestDocumentWithTwoMigration_0_0_1.cs | 35 ++- .../TestDocumentWithTwoMigration_0_0_2.cs | 35 ++- .../Attributes/CollectionLocation.cs | 17 +- .../CollectionLocationInformation.cs | 19 +- .../Documents/Attributes/RuntimeVersion.cs | 17 +- .../Documents/Attributes/StartUpVersion.cs | 17 +- Mongo.Migration/Documents/Document.cs | 9 +- Mongo.Migration/Documents/DocumentVersion.cs | 215 +++++++++--------- Mongo.Migration/Documents/IDocument.cs | 9 +- .../Documents/Locators/AbstractLocator.cs | 35 ++- .../Documents/Locators/CollectionLocator.cs | 61 +++-- .../Documents/Locators/ICollectionLocator.cs | 9 +- .../Documents/Locators/ILocator.cs | 15 +- .../Locators/IRuntimeVersionLocator.cs | 7 +- .../Locators/IStartUpVersionLocator.cs | 7 +- .../Locators/RuntimeVersionLocator.cs | 49 ++-- .../Locators/StartUpVersionLocator.cs | 49 ++-- .../Serializers/DocumentVersionSerializer.cs | 29 ++- .../Exceptions/AlreadyInitializedException.cs | 11 +- .../Exceptions/DuplicateVersionException.cs | 11 +- .../InvalidVersionValueException.cs | 13 +- .../MongoMigrationDatabaseNotFound.cs | 13 +- .../MongoMigrationNoMongoClientException.cs | 11 +- .../NoDatabaseNameFoundException.cs | 7 +- .../Exceptions/NoMigrationsFoundException.cs | 7 +- .../VersionStringToLongException.cs | 13 +- .../Exceptions/VersionViolationException.cs | 17 +- .../Extensions/EnumerableExtensions.cs | 63 +++-- Mongo.Migration/IMongoMigration.cs | 9 +- .../Migrations/Database/DatabaseMigration.cs | 21 +- .../Database/DatabaseMigrationRunner.cs | 127 +++++------ .../Migrations/Database/IDatabaseMigration.cs | 11 +- .../Database/IDatabaseMigrationRunner.cs | 9 +- .../IStartUpDatabaseMigrationRunner.cs | 9 +- .../Migrations/Database/MigrationHistory.cs | 13 +- .../StartUpDatabaseMigrationRunner.cs | 125 +++++----- .../Migrations/Document/DocumentMigration.cs | 23 +- .../Document/DocumentMigrationRunner.cs | 123 +++++----- .../Migrations/Document/IDocumentMigration.cs | 11 +- .../Document/IDocumentMigrationRunner.cs | 11 +- .../IStartUpDocumentMigrationRunner.cs | 9 +- .../StartUpDocumentMigrationRunner.cs | 209 +++++++++-------- Mongo.Migration/Migrations/IMigration.cs | 11 +- .../DatabaseTypeMigrationDependencyLocator.cs | 33 ++- ...IDatabaseTypeMigrationDependencyLocator.cs | 7 +- .../Migrations/Locators/IMigrationLocator.cs | 21 +- .../Migrations/Locators/MigrationLocator.cs | 153 +++++++------ .../TypeMigrationDependencyLocator.cs | 85 ++++--- .../Locators/TypeMigrationLocator.cs | 33 ++- Mongo.Migration/Mongo.Migration.csproj | 1 + Mongo.Migration/MongoMigration.cs | 79 ++++--- .../Services/DatabaseVersionService.cs | 87 ++++--- .../Services/DocumentVersionService.cs | 183 ++++++++------- .../Services/IDatabaseVersionService.cs | 15 +- .../Services/IDocumentVersionService.cs | 29 ++- Mongo.Migration/Services/IMigrationService.cs | 9 +- .../IMigrationInterceptorFactory.cs | 9 +- .../IMigrationInterceptorProvider.cs | 7 +- .../Interceptors/MigrationInterceptor.cs | 51 ++--- .../MigrationInterceptorFactory.cs | 33 ++- .../MigrationInterceptorProvider.cs | 35 ++- Mongo.Migration/Services/MigrationService.cs | 85 ++++--- .../DotNetCore/MongoMigrationExtensions.cs | 51 ++--- .../Startup/IMongoMigrationSettings.cs | 17 +- .../Startup/MongoMigrationSettings.cs | 17 +- .../Startup/Static/MongoMigrationClient.cs | 33 ++- 103 files changed, 2342 insertions(+), 2443 deletions(-) diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs index a3f1c82..4e8e1f1 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs @@ -2,27 +2,26 @@ using Mongo.Migration.Documents; using NUnit.Framework; -namespace Mongo.Migration.Tests.Documents +namespace Mongo.Migration.Tests.Documents; + +[TestFixture] +public class DocumentVersion_When_casting { - [TestFixture] - public class DocumentVersion_When_casting + [Test] + public void If_implicit_string_to_version_Then_cast_should_work() { - [Test] - public void If_implicit_string_to_version_Then_cast_should_work() - { - DocumentVersion version = "1.0.2"; + DocumentVersion version = "1.0.2"; - version.ToString().Should().Be("1.0.2"); - } + version.ToString().Should().Be("1.0.2"); + } - [Test] - public void If_implicit_version_to_string_Then_cast_should_work() - { - var version = new DocumentVersion("1.0.2"); + [Test] + public void If_implicit_version_to_string_Then_cast_should_work() + { + var version = new DocumentVersion("1.0.2"); - string versionString = version; + string versionString = version; - versionString.Should().Be("1.0.2"); - } + versionString.Should().Be("1.0.2"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs index 5ced3a3..5955c42 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs @@ -2,63 +2,62 @@ using Mongo.Migration.Documents; using NUnit.Framework; -namespace Mongo.Migration.Tests.Documents +namespace Mongo.Migration.Tests.Documents; + +[TestFixture] +public class DocumentVersion_When_compare { - [TestFixture] - public class DocumentVersion_When_compare - { - private readonly DocumentVersion equalLowerVersion = new("0.0.1"); + private readonly DocumentVersion equalLowerVersion = new("0.0.1"); - private readonly DocumentVersion higherVersion = new("0.0.2"); + private readonly DocumentVersion higherVersion = new("0.0.2"); - private readonly DocumentVersion lowerVersion = new("0.0.1"); + private readonly DocumentVersion lowerVersion = new("0.0.1"); - [Test] - public void If_higherVersion_lte_equalLowerVersion_Then_false() - { - bool result = higherVersion <= lowerVersion; + [Test] + public void If_higherVersion_lte_equalLowerVersion_Then_false() + { + bool result = higherVersion <= lowerVersion; - result.Should().BeFalse(); - } + result.Should().BeFalse(); + } - [Test] - public void If_lowerVersion_gt_higherVersion_Then_false() - { - bool result = lowerVersion > higherVersion; + [Test] + public void If_lowerVersion_gt_higherVersion_Then_false() + { + bool result = lowerVersion > higherVersion; - result.Should().BeFalse(); - } + result.Should().BeFalse(); + } - [Test] - public void If_lowerVersion_gte_equalLowerVersion_Then_true() - { - bool result = lowerVersion >= equalLowerVersion; + [Test] + public void If_lowerVersion_gte_equalLowerVersion_Then_true() + { + bool result = lowerVersion >= equalLowerVersion; - result.Should().BeTrue(); - } + result.Should().BeTrue(); + } - [Test] - public void If_lowerVersion_gte_higherVersion_Then_false() - { - bool result = lowerVersion >= higherVersion; + [Test] + public void If_lowerVersion_gte_higherVersion_Then_false() + { + bool result = lowerVersion >= higherVersion; - result.Should().BeFalse(); - } + result.Should().BeFalse(); + } - [Test] - public void If_lowerVersion_lt_higherVersion_Then_true() - { - bool result = lowerVersion < higherVersion; + [Test] + public void If_lowerVersion_lt_higherVersion_Then_true() + { + bool result = lowerVersion < higherVersion; - result.Should().BeTrue(); - } + result.Should().BeTrue(); + } - [Test] - public void If_lowerVersion_lte_equalLowerVersion_Then_true() - { - bool result = lowerVersion <= equalLowerVersion; + [Test] + public void If_lowerVersion_lte_equalLowerVersion_Then_true() + { + bool result = lowerVersion <= equalLowerVersion; - result.Should().BeTrue(); - } + result.Should().BeTrue(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs index 4d7e0c5..c267249 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs @@ -3,65 +3,64 @@ using Mongo.Migration.Exceptions; using NUnit.Framework; -namespace Mongo.Migration.Tests.Documents +namespace Mongo.Migration.Tests.Documents; + +[TestFixture] +public class DocumentVersion_When_creating { - [TestFixture] - public class DocumentVersion_When_creating + [Test] + public void If_Default_Then_version_is_default_value() { - [Test] - public void If_Default_Then_version_is_default_value() - { - DocumentVersion version = DocumentVersion.Default(); + DocumentVersion version = DocumentVersion.Default(); - version.ToString().Should().Be("0.0.0"); - } + version.ToString().Should().Be("0.0.0"); + } - [Test] - public void If_first_part_contains_char_Then_exception_is_thrown() - { - Action act = () => new DocumentVersion("a.0.0"); + [Test] + public void If_first_part_contains_char_Then_exception_is_thrown() + { + Action act = () => new DocumentVersion("a.0.0"); - act.Should().Throw(); - } + act.Should().Throw(); + } - [Test] - public void If_new_version_with_int_Then_version_string_should_be_same() - { - var version = new DocumentVersion(1, 0, 2); + [Test] + public void If_new_version_with_int_Then_version_string_should_be_same() + { + var version = new DocumentVersion(1, 0, 2); - version.ToString().Should().Be("1.0.2"); - } + version.ToString().Should().Be("1.0.2"); + } - [Test] - public void If_new_version_with_string_Then_version_string_should_be_same() - { - var version = new DocumentVersion("1.0.2"); + [Test] + public void If_new_version_with_string_Then_version_string_should_be_same() + { + var version = new DocumentVersion("1.0.2"); - version.ToString().Should().Be("1.0.2"); - } + version.ToString().Should().Be("1.0.2"); + } - [Test] - public void If_second_part_contains_char_Then_exception_is_thrown() - { - Action act = () => new DocumentVersion("0.a.0"); + [Test] + public void If_second_part_contains_char_Then_exception_is_thrown() + { + Action act = () => new DocumentVersion("0.a.0"); - act.Should().Throw(); - } + act.Should().Throw(); + } - [Test] - public void If_third_part_contains_char_Then_exception_is_thrown() - { - Action act = () => new DocumentVersion("0.0.a"); + [Test] + public void If_third_part_contains_char_Then_exception_is_thrown() + { + Action act = () => new DocumentVersion("0.0.a"); - act.Should().Throw(); - } + act.Should().Throw(); + } - [Test] - public void If_version_string_is_to_long_Then_exception_is_thrown() - { - Action act = () => new DocumentVersion("0.0.0.0"); + [Test] + public void If_version_string_is_to_long_Then_exception_is_thrown() + { + Action act = () => new DocumentVersion("0.0.0.0"); - act.Should().Throw(); - } + act.Should().Throw(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/Document_when_creating.cs b/Mongo.Migration.Tests/Documents/Document_when_creating.cs index fa58158..2ee98f4 100644 --- a/Mongo.Migration.Tests/Documents/Document_when_creating.cs +++ b/Mongo.Migration.Tests/Documents/Document_when_creating.cs @@ -2,32 +2,31 @@ using Mongo.Migration.Documents; using NUnit.Framework; -namespace Mongo.Migration.Tests.Documents +namespace Mongo.Migration.Tests.Documents; + +[TestFixture] +public class Document_when_creating { - [TestFixture] - public class Document_when_creating + [Test] + public void Then_document_can_be_created() { - [Test] - public void Then_document_can_be_created() - { - // Arrange Act - IDocument document = new Document(); + // Arrange Act + IDocument document = new Document(); - // Assert - document.Should().BeOfType(); - } + // Assert + document.Should().BeOfType(); + } - [Test] - public void Then_document_has_a_version() - { - // Arrange - IDocument document = new Document(); + [Test] + public void Then_document_has_a_version() + { + // Arrange + IDocument document = new Document(); - // Act - var version = document.Version; + // Act + var version = document.Version; - // Assert - version.Should().Be("0.0.0"); - } + // Assert + version.Should().Be("0.0.0"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs index 4878575..487a237 100644 --- a/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs @@ -3,35 +3,34 @@ using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Tests.Documents.Locators +namespace Mongo.Migration.Tests.Documents.Locators; + +[TestFixture] +internal class VersionLocator_when_locate { - [TestFixture] - internal class VersionLocator_when_locate + [Test] + public void Then_find_current_version_of_document() { - [Test] - public void Then_find_current_version_of_document() - { - // Arrange - var locator = new RuntimeVersionLocator(); + // Arrange + var locator = new RuntimeVersionLocator(); - // Act - var currentVersion = locator.GetLocateOrNull(typeof(TestDocumentWithOneMigration)); + // Act + var currentVersion = locator.GetLocateOrNull(typeof(TestDocumentWithOneMigration)); - // Assert - currentVersion.ToString().Should().Be("0.0.1"); - } + // Assert + currentVersion.ToString().Should().Be("0.0.1"); + } - [Test] - public void When_document_has_no_attribute_Then_return_null() - { - // Arrange - var locator = new RuntimeVersionLocator(); + [Test] + public void When_document_has_no_attribute_Then_return_null() + { + // Arrange + var locator = new RuntimeVersionLocator(); - // Act - var currentVersion = locator.GetLocateOrNull(typeof(TestDocumentWithoutAttribute)); + // Act + var currentVersion = locator.GetLocateOrNull(typeof(TestDocumentWithoutAttribute)); - // Assert - currentVersion.Should().BeNull(); - } + // Assert + currentVersion.Should().BeNull(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs index 0e0eacb..75969fb 100644 --- a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs +++ b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs @@ -6,68 +6,67 @@ using MongoDB.Bson.Serialization; using NUnit.Framework; -namespace Mongo.Migration.Tests.Documents.Serializers +namespace Mongo.Migration.Tests.Documents.Serializers; + +[TestFixture] +public class DocumentVersionSerializer_when_serialize_and_deserialize { - [TestFixture] - public class DocumentVersionSerializer_when_serialize_and_deserialize - { - private DocumentVersionSerializer _serializer; + private DocumentVersionSerializer _serializer; - [Test] - public void Then_version_is_deserialized_correct() - { - // Arrange - var document = new BsonDocument { { "version", "0.1.1" } }; - BsonDocumentReader reader = CreateVersionReader(document); + [Test] + public void Then_version_is_deserialized_correct() + { + // Arrange + var document = new BsonDocument { { "version", "0.1.1" } }; + BsonDocumentReader reader = CreateVersionReader(document); - BsonDeserializationContext context = BsonDeserializationContext.CreateRoot(reader); - var args = new BsonDeserializationArgs { NominalType = typeof(DocumentVersion) }; + BsonDeserializationContext context = BsonDeserializationContext.CreateRoot(reader); + var args = new BsonDeserializationArgs { NominalType = typeof(DocumentVersion) }; - // Act - DocumentVersion result = _serializer.Deserialize(context, args); + // Act + DocumentVersion result = _serializer.Deserialize(context, args); - // Assert - result.Should().BeOfType(); - result.Should().Be("0.1.1"); - } + // Assert + result.Should().BeOfType(); + result.Should().Be("0.1.1"); + } - [Test] - public void Then_version_is_serialized_correct() - { - // Arrange - BsonDocumentWriter writer = CreateVersionWriter(); - BsonSerializationContext context = BsonSerializationContext.CreateRoot(writer); - var args = new BsonSerializationArgs { NominalType = typeof(DocumentVersion) }; - var version = new DocumentVersion("0.0.1"); + [Test] + public void Then_version_is_serialized_correct() + { + // Arrange + BsonDocumentWriter writer = CreateVersionWriter(); + BsonSerializationContext context = BsonSerializationContext.CreateRoot(writer); + var args = new BsonSerializationArgs { NominalType = typeof(DocumentVersion) }; + var version = new DocumentVersion("0.0.1"); - // Act - _serializer.Serialize(context, args, version); + // Act + _serializer.Serialize(context, args, version); - // Assert - BsonDocument document = writer.Document; - document.ToString().Should().Be("{ \"version\" : \"0.0.1\" }"); - } + // Assert + BsonDocument document = writer.Document; + document.ToString().Should().Be("{ \"version\" : \"0.0.1\" }"); + } - [SetUp] - public void SetUp() - { - _serializer = new(); - } + [SetUp] + public void SetUp() + { + _serializer = new(); + } - private static BsonDocumentReader CreateVersionReader(BsonDocument document) - { - var reader = new BsonDocumentReader(document); - reader.ReadStartDocument(); - reader.ReadName(); - return reader; - } + private static BsonDocumentReader CreateVersionReader(BsonDocument document) + { + var reader = new BsonDocumentReader(document); + reader.ReadStartDocument(); + reader.ReadName(); + return reader; + } - private static BsonDocumentWriter CreateVersionWriter() - { - var writer = new BsonDocumentWriter(new()); - writer.WriteStartDocument(); - writer.WriteName("version"); - return writer; - } + private static BsonDocumentWriter CreateVersionWriter() + { + var writer = new BsonDocumentWriter(new()); + writer.WriteStartDocument(); + writer.WriteName("version"); + return writer; } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/IntegrationTest.cs b/Mongo.Migration.Tests/IntegrationTest.cs index 2bffeab..5fdfaee 100644 --- a/Mongo.Migration.Tests/IntegrationTest.cs +++ b/Mongo.Migration.Tests/IntegrationTest.cs @@ -6,39 +6,38 @@ using Mongo2Go; using MongoDB.Driver; -namespace Mongo.Migration.Tests +namespace Mongo.Migration.Tests; + +public class IntegrationTest : IDisposable { - public class IntegrationTest : IDisposable - { - private MongoClient? _client; + private MongoClient? _client; - private MongoDbRunner? _mongoToGoRunner; + private MongoDbRunner? _mongoToGoRunner; - private ServiceProvider? _serviceProvider; + private ServiceProvider? _serviceProvider; - protected IServiceProvider Provider => _serviceProvider ?? throw new InvalidOperationException("Must be setup"); + protected IServiceProvider Provider => _serviceProvider ?? throw new InvalidOperationException("Must be setup"); - public void Dispose() - { - _serviceProvider?.Dispose(); - _mongoToGoRunner?.Dispose(); - GC.SuppressFinalize(this); - } + public void Dispose() + { + _serviceProvider?.Dispose(); + _mongoToGoRunner?.Dispose(); + GC.SuppressFinalize(this); + } - protected void OnSetUp() - { - _mongoToGoRunner = MongoDbRunner.Start(); - _client = new MongoClient(_mongoToGoRunner.ConnectionString); + protected void OnSetUp() + { + _mongoToGoRunner = MongoDbRunner.Start(); + _client = new MongoClient(_mongoToGoRunner.ConnectionString); - _client.GetDatabase("PerformanceTest").CreateCollection("Test"); + _client.GetDatabase("PerformanceTest").CreateCollection("Test"); - ServiceCollection serviceCollection = new(); - serviceCollection - .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) - .AddSingleton(_client) - .AddMigration(new MongoMigrationSettings { ConnectionString = _mongoToGoRunner.ConnectionString, Database = "PerformanceTest" }); + ServiceCollection serviceCollection = new(); + serviceCollection + .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) + .AddSingleton(_client) + .AddMigration(new MongoMigrationSettings { ConnectionString = _mongoToGoRunner.ConnectionString, Database = "PerformanceTest" }); - _serviceProvider = serviceCollection.BuildServiceProvider(); - } + _serviceProvider = serviceCollection.BuildServiceProvider(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs index 2f84175..fc84313 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs @@ -9,64 +9,63 @@ using MongoDB.Bson; using MongoDB.Driver; -namespace Mongo.Migration.Tests.Migrations.Database +namespace Mongo.Migration.Tests.Migrations.Database; + +internal class DatabaseIntegrationTest : IDisposable { - internal class DatabaseIntegrationTest : IDisposable - { - private const string MigrationsCollectionName = "_migrations"; + private const string MigrationsCollectionName = "_migrations"; - private MongoClient? _client; + private MongoClient? _client; - private ServiceProvider? _serviceProvider; - protected IServiceProvider Provider => _serviceProvider ?? throw new InvalidOperationException("Must be setup"); + private ServiceProvider? _serviceProvider; + protected IServiceProvider Provider => _serviceProvider ?? throw new InvalidOperationException("Must be setup"); - private IMongoDatabase? _db; - protected IMongoDatabase Db => _db ?? throw new InvalidOperationException("Must be setup"); + private IMongoDatabase? _db; + protected IMongoDatabase Db => _db ?? throw new InvalidOperationException("Must be setup"); - private MongoDbRunner? _mongoToGoRunner; + private MongoDbRunner? _mongoToGoRunner; - protected virtual string DatabaseName { get; set; } = "DatabaseMigration"; + protected virtual string DatabaseName { get; set; } = "DatabaseMigration"; - protected virtual string CollectionName { get; set; } = "Test"; + protected virtual string CollectionName { get; set; } = "Test"; - public void Dispose() - { - _serviceProvider?.Dispose(); - _mongoToGoRunner?.Dispose(); - } + public void Dispose() + { + _serviceProvider?.Dispose(); + _mongoToGoRunner?.Dispose(); + } - protected virtual void OnSetUp(DocumentVersion databaseMigrationVersion) - { - _mongoToGoRunner = MongoDbRunner.Start(); - _client = new MongoClient(_mongoToGoRunner.ConnectionString); - _db = _client.GetDatabase(DatabaseName); - _db.CreateCollection(CollectionName); + protected virtual void OnSetUp(DocumentVersion databaseMigrationVersion) + { + _mongoToGoRunner = MongoDbRunner.Start(); + _client = new MongoClient(_mongoToGoRunner.ConnectionString); + _db = _client.GetDatabase(DatabaseName); + _db.CreateCollection(CollectionName); - ServiceCollection serviceCollection = new(); - serviceCollection - .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) - .AddSingleton(_client) - .AddMigration(new MongoMigrationSettings - { - ConnectionString = _mongoToGoRunner.ConnectionString, - Database = DatabaseName, - DatabaseMigrationVersion = databaseMigrationVersion - }); + ServiceCollection serviceCollection = new(); + serviceCollection + .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) + .AddSingleton(_client) + .AddMigration(new MongoMigrationSettings + { + ConnectionString = _mongoToGoRunner.ConnectionString, + Database = DatabaseName, + DatabaseMigrationVersion = databaseMigrationVersion + }); - _serviceProvider = serviceCollection.BuildServiceProvider(); - } + _serviceProvider = serviceCollection.BuildServiceProvider(); + } - protected void InsertMigrations(IEnumerable migrations) - { - var list = migrations.Select(m => new BsonDocument { { "MigrationId", m.GetType().ToString() }, { "Version", m.Version.ToString() } }); - Db.GetCollection(MigrationsCollectionName).InsertManyAsync(list).Wait(); - } + protected void InsertMigrations(IEnumerable migrations) + { + var list = migrations.Select(m => new BsonDocument { { "MigrationId", m.GetType().ToString() }, { "Version", m.Version.ToString() } }); + Db.GetCollection(MigrationsCollectionName).InsertManyAsync(list).Wait(); + } - protected List GetMigrationHistory() - { - var migrationHistoryCollection = Db.GetCollection(MigrationsCollectionName); - return migrationHistoryCollection.Find(m => true).ToList(); - } + protected List GetMigrationHistory() + { + var migrationHistoryCollection = Db.GetCollection(MigrationsCollectionName); + return migrationHistoryCollection.Find(m => true).ToList(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs index 68ac5b6..4de5762 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs @@ -2,22 +2,21 @@ using MongoDB.Bson.Serialization; using NUnit.Framework; -namespace Mongo.Migration.Tests.Migrations.Database +namespace Mongo.Migration.Tests.Migrations.Database; + +[SetUpFixture] +public class DatabaseMigrationRunnerSetup { - [SetUpFixture] - public class DatabaseMigrationRunnerSetup + [OneTimeSetUp] + public void GlobalSetup() { - [OneTimeSetUp] - public void GlobalSetup() - { - var documentVersionSerializer = new DocumentVersionSerializer(); - BsonSerializer.TryRegisterSerializer(documentVersionSerializer.ValueType, documentVersionSerializer); - } + var documentVersionSerializer = new DocumentVersionSerializer(); + BsonSerializer.TryRegisterSerializer(documentVersionSerializer.ValueType, documentVersionSerializer); + } - [OneTimeTearDown] - public void GlobalTeardown() - { - // Do logout here - } + [OneTimeTearDown] + public void GlobalTeardown() + { + // Do logout here } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs index fcbb58c..7fa8a9c 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs @@ -5,69 +5,68 @@ using Mongo.Migration.Tests.TestDoubles.Database; using NUnit.Framework; -namespace Mongo.Migration.Tests.Migrations.Database +namespace Mongo.Migration.Tests.Migrations.Database; + +[TestFixture] +internal class DatabaseMigrationRunnerWhenMigratingDown : DatabaseIntegrationTest { - [TestFixture] - internal class DatabaseMigrationRunnerWhenMigratingDown : DatabaseIntegrationTest - { - private IDatabaseMigrationRunner? _runner; + private IDatabaseMigrationRunner? _runner; - protected override void OnSetUp(DocumentVersion databaseMigrationVersion) - { - base.OnSetUp(databaseMigrationVersion); + protected override void OnSetUp(DocumentVersion databaseMigrationVersion) + { + base.OnSetUp(databaseMigrationVersion); - _runner = Provider.GetRequiredService(); - } + _runner = Provider.GetRequiredService(); + } - [TearDown] - public void TearDown() - { - Dispose(); - } + [TearDown] + public void TearDown() + { + Dispose(); + } - [Test] - public void When_database_has_migrations_Then_down_all_migrations() - { - OnSetUp(DocumentVersion.Default()); + [Test] + public void When_database_has_migrations_Then_down_all_migrations() + { + OnSetUp(DocumentVersion.Default()); - // Arrange - InsertMigrations( - new DatabaseMigration[] - { - new TestDatabaseMigration_0_0_1(), - new TestDatabaseMigration_0_0_2(), - new TestDatabaseMigration_0_0_3() - }); + // Arrange + InsertMigrations( + new DatabaseMigration[] + { + new TestDatabaseMigration_0_0_1(), + new TestDatabaseMigration_0_0_2(), + new TestDatabaseMigration_0_0_3() + }); - // Act - _runner?.Run(Db); + // Act + _runner?.Run(Db); - // Assert - var migrations = GetMigrationHistory(); - migrations.Should().BeEmpty(); - } + // Assert + var migrations = GetMigrationHistory(); + migrations.Should().BeEmpty(); + } - [Test] - public void When_database_has_migrations_Then_down_to_selected_migration() - { - OnSetUp(new("0.0.1")); + [Test] + public void When_database_has_migrations_Then_down_to_selected_migration() + { + OnSetUp(new("0.0.1")); - // Arrange - InsertMigrations( - new DatabaseMigration[] - { - new TestDatabaseMigration_0_0_1(), - new TestDatabaseMigration_0_0_2(), - new TestDatabaseMigration_0_0_3() - }); + // Arrange + InsertMigrations( + new DatabaseMigration[] + { + new TestDatabaseMigration_0_0_1(), + new TestDatabaseMigration_0_0_2(), + new TestDatabaseMigration_0_0_3() + }); - // Act - _runner?.Run(Db); + // Act + _runner?.Run(Db); - // Assert - var migrations = GetMigrationHistory(); - migrations.Should().NotBeEmpty(); - migrations.Should().OnlyContain(m => m.Version == "0.0.1"); - } + // Assert + var migrations = GetMigrationHistory(); + migrations.Should().NotBeEmpty(); + migrations.Should().OnlyContain(m => m.Version == "0.0.1"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs index a96aeec..52c72f2 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs @@ -5,72 +5,71 @@ using Mongo.Migration.Tests.TestDoubles.Database; using NUnit.Framework; -namespace Mongo.Migration.Tests.Migrations.Database +namespace Mongo.Migration.Tests.Migrations.Database; + +[TestFixture] +internal class DatabaseMigrationRunner_when_migrating_up : DatabaseIntegrationTest { - [TestFixture] - internal class DatabaseMigrationRunner_when_migrating_up : DatabaseIntegrationTest - { - private IDatabaseMigrationRunner _runner; + private IDatabaseMigrationRunner _runner; - [SetUp] - public void SetUp() - { - base.OnSetUp(DocumentVersion.Empty()); + [SetUp] + public void SetUp() + { + base.OnSetUp(DocumentVersion.Empty()); - _runner = Provider.GetRequiredService(); - } + _runner = Provider.GetRequiredService(); + } - [TearDown] - public void TearDown() - { - Dispose(); - } + [TearDown] + public void TearDown() + { + Dispose(); + } - [Test] - public void When_database_has_no_migrations_Then_all_migrations_are_used() - { - // Act - _runner.Run(Db); + [Test] + public void When_database_has_no_migrations_Then_all_migrations_are_used() + { + // Act + _runner.Run(Db); - // Assert - var migrations = GetMigrationHistory(); - migrations.Should().NotBeEmpty(); - migrations[0].Version.ToString().Should().BeEquivalentTo("0.0.1"); - migrations[1].Version.ToString().Should().BeEquivalentTo("0.0.2"); - migrations[2].Version.ToString().Should().BeEquivalentTo("0.0.3"); - } + // Assert + var migrations = GetMigrationHistory(); + migrations.Should().NotBeEmpty(); + migrations[0].Version.ToString().Should().BeEquivalentTo("0.0.1"); + migrations[1].Version.ToString().Should().BeEquivalentTo("0.0.2"); + migrations[2].Version.ToString().Should().BeEquivalentTo("0.0.3"); + } - [Test] - public void When_database_has_migrations_Then_latest_migrations_are_used() - { - // Arrange - InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), new TestDatabaseMigration_0_0_2() }); + [Test] + public void When_database_has_migrations_Then_latest_migrations_are_used() + { + // Arrange + InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), new TestDatabaseMigration_0_0_2() }); - // Act - _runner.Run(Db); + // Act + _runner.Run(Db); - // Assert - var migrations = GetMigrationHistory(); - migrations.Should().NotBeEmpty(); - migrations[2].Version.ToString().Should().BeEquivalentTo("0.0.3"); - } + // Assert + var migrations = GetMigrationHistory(); + migrations.Should().NotBeEmpty(); + migrations[2].Version.ToString().Should().BeEquivalentTo("0.0.3"); + } - [Test] - public void When_database_has_latest_version_Then_nothing_happens() - { - // Arrange - InsertMigrations( - new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), new TestDatabaseMigration_0_0_2(), new TestDatabaseMigration_0_0_3() }); + [Test] + public void When_database_has_latest_version_Then_nothing_happens() + { + // Arrange + InsertMigrations( + new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), new TestDatabaseMigration_0_0_2(), new TestDatabaseMigration_0_0_3() }); - // Act - _runner.Run(Db); + // Act + _runner.Run(Db); - // Assert - var migrations = GetMigrationHistory(); - migrations.Should().NotBeEmpty(); - migrations[0].Version.ToString().Should().BeEquivalentTo("0.0.1"); - migrations[1].Version.ToString().Should().BeEquivalentTo("0.0.2"); - migrations[2].Version.ToString().Should().BeEquivalentTo("0.0.3"); - } + // Assert + var migrations = GetMigrationHistory(); + migrations.Should().NotBeEmpty(); + migrations[0].Version.ToString().Should().BeEquivalentTo("0.0.1"); + migrations[1].Version.ToString().Should().BeEquivalentTo("0.0.2"); + migrations[2].Version.ToString().Should().BeEquivalentTo("0.0.3"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs index 58e51a3..0cc5f93 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs @@ -3,39 +3,38 @@ using Mongo.Migration.Tests.TestDoubles.Database; using NUnit.Framework; -namespace Mongo.Migration.Tests.Migrations.Database +namespace Mongo.Migration.Tests.Migrations.Database; + +[TestFixture] +public class DatabaseMigration_when_creating { - [TestFixture] - public class DatabaseMigration_when_creating + [Test] + public void Then_migration_has_type_DatabaseMigration() { - [Test] - public void Then_migration_has_type_DatabaseMigration() - { - // Arrange Act - var migration = new TestDatabaseMigration_0_0_1(); + // Arrange Act + var migration = new TestDatabaseMigration_0_0_1(); - // Assert - migration.Type.Should().Be(typeof(DatabaseMigration)); - } + // Assert + migration.Type.Should().Be(typeof(DatabaseMigration)); + } - [Test] - public void Then_migration_have_version() - { - // Arrange Act - var migration = new TestDatabaseMigration_0_0_1(); + [Test] + public void Then_migration_have_version() + { + // Arrange Act + var migration = new TestDatabaseMigration_0_0_1(); - // Assert - migration.Version.Should().Be("0.0.1"); - } + // Assert + migration.Version.Should().Be("0.0.1"); + } - [Test] - public void Then_migration_should_be_created() - { - // Arrange Act - var migration = new TestDatabaseMigration_0_0_1(); + [Test] + public void Then_migration_should_be_created() + { + // Arrange Act + var migration = new TestDatabaseMigration_0_0_1(); - // Assert - migration.Should().BeOfType(); - } + // Assert + migration.Should().BeOfType(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs index 1ca43ff..552ddda 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs @@ -5,62 +5,61 @@ using MongoDB.Bson; using NUnit.Framework; -namespace Mongo.Migration.Tests.Migrations.Document +namespace Mongo.Migration.Tests.Migrations.Document; + +[TestFixture] +internal class DocumentMigrationRunner_when_migrating_down : IntegrationTest { - [TestFixture] - internal class DocumentMigrationRunner_when_migrating_down : IntegrationTest - { - private IDocumentMigrationRunner _runner; + private IDocumentMigrationRunner _runner; - [SetUp] - public void SetUp() - { - OnSetUp(); + [SetUp] + public void SetUp() + { + OnSetUp(); - _runner = Provider.GetRequiredService(); - } + _runner = Provider.GetRequiredService(); + } - [TearDown] - public void TearDown() - { - Dispose(); - } + [TearDown] + public void TearDown() + { + Dispose(); + } - [Test] - public void When_migrating_down_Then_all_migrations_are_used() + [Test] + public void When_migrating_down_Then_all_migrations_are_used() + { + // Arrange + BsonDocument document = new() { - // Arrange - BsonDocument document = new() - { - { "Version", "0.0.2" }, - { "Door", 3 } - }; + { "Version", "0.0.2" }, + { "Door", 3 } + }; - // Act - _runner.Run(typeof(TestDocumentWithTwoMigration), document); + // Act + _runner.Run(typeof(TestDocumentWithTwoMigration), document); - // Assert - document.Names.ToList()[1].Should().Be("Dors"); - document.Values.ToList()[0].AsString.Should().Be("0.0.0"); - } + // Assert + document.Names.ToList()[1].Should().Be("Dors"); + document.Values.ToList()[0].AsString.Should().Be("0.0.0"); + } - [Test] - public void When_document_has_Then_all_migrations_are_used_to_that_version() + [Test] + public void When_document_has_Then_all_migrations_are_used_to_that_version() + { + // Arrange + // Arrange + BsonDocument document = new() { - // Arrange - // Arrange - BsonDocument document = new() - { - { "Version", "0.0.2" }, - { "Door", 3 } - }; + { "Version", "0.0.2" }, + { "Door", 3 } + }; - // Act - _runner.Run(typeof(TestDocumentWithTwoMigrationMiddleVersion), document); + // Act + _runner.Run(typeof(TestDocumentWithTwoMigrationMiddleVersion), document); - // Assert - document.Names.ToList()[1].Should().Be("Doors"); - document.Values.ToList()[0].AsString.Should().Be("0.0.1"); - } + // Assert + document.Names.ToList()[1].Should().Be("Doors"); + document.Values.ToList()[0].AsString.Should().Be("0.0.1"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs index f5b7153..18ccb22 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs @@ -5,78 +5,77 @@ using MongoDB.Bson; using NUnit.Framework; -namespace Mongo.Migration.Tests.Migrations.Document +namespace Mongo.Migration.Tests.Migrations.Document; + +[TestFixture] +internal class DocumentMigrationRunner_when_migrating_up : IntegrationTest { - [TestFixture] - internal class DocumentMigrationRunner_when_migrating_up : IntegrationTest - { - private IDocumentMigrationRunner _runner; + private IDocumentMigrationRunner _runner; - [SetUp] - public void SetUp() - { - OnSetUp(); + [SetUp] + public void SetUp() + { + OnSetUp(); - _runner = Provider.GetRequiredService(); - } + _runner = Provider.GetRequiredService(); + } - [TearDown] - public void TearDown() - { - Dispose(); - } + [TearDown] + public void TearDown() + { + Dispose(); + } - [Test] - public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() + [Test] + public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() + { + // Arrange + BsonDocument document = new() { - // Arrange - BsonDocument document = new() - { - { "Version", "0.0.0" }, - { "Dors", 3 } - }; + { "Version", "0.0.0" }, + { "Dors", 3 } + }; - // Act - _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); + // Act + _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); - // Assert - document.Names.ToList()[1].Should().Be("Door"); - document.Values.ToList()[0].AsString.Should().Be("0.0.2"); - } + // Assert + document.Names.ToList()[1].Should().Be("Door"); + document.Values.ToList()[0].AsString.Should().Be("0.0.2"); + } - [Test] - public void When_document_has_no_version_Then_all_migrations_are_used() + [Test] + public void When_document_has_no_version_Then_all_migrations_are_used() + { + // Arrange + BsonDocument document = new() { - // Arrange - BsonDocument document = new() - { - { "Dors", 3 } - }; + { "Dors", 3 } + }; - // Act - _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); + // Act + _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); - // Assert - document.Names.ToList()[1].Should().Be("Door"); - document.Values.ToList()[0].AsString.Should().Be("0.0.2"); - } + // Assert + document.Names.ToList()[1].Should().Be("Door"); + document.Values.ToList()[0].AsString.Should().Be("0.0.2"); + } - [Test] - public void When_document_has_current_version_Then_nothing_happens() + [Test] + public void When_document_has_current_version_Then_nothing_happens() + { + // Arrange + BsonDocument document = new() { - // Arrange - BsonDocument document = new() - { - { "Version", "0.0.2" }, - { "Door", 3 } - }; + { "Version", "0.0.2" }, + { "Door", 3 } + }; - // Act - _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); + // Act + _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); - // Assert - document.Names.ToList()[1].Should().Be("Door"); - document.Values.ToList()[0].AsString.Should().Be("0.0.2"); - } + // Assert + document.Names.ToList()[1].Should().Be("Door"); + document.Values.ToList()[0].AsString.Should().Be("0.0.2"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs index be8d3e6..5686897 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs @@ -2,39 +2,38 @@ using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Tests.Migrations.Document +namespace Mongo.Migration.Tests.Migrations.Document; + +[TestFixture] +public class DocumentMigration_when_creating { - [TestFixture] - public class DocumentMigration_when_creating + [Test] + public void Then_migration_has_type_testClass() { - [Test] - public void Then_migration_has_type_testClass() - { - // Arrange Act - var migration = new TestDocumentWithOneMigration_0_0_1(); + // Arrange Act + var migration = new TestDocumentWithOneMigration_0_0_1(); - // Assert - migration.Type.Should().Be(typeof(TestDocumentWithOneMigration)); - } + // Assert + migration.Type.Should().Be(typeof(TestDocumentWithOneMigration)); + } - [Test] - public void Then_migration_have_version() - { - // Arrange Act - var migration = new TestDocumentWithOneMigration_0_0_1(); + [Test] + public void Then_migration_have_version() + { + // Arrange Act + var migration = new TestDocumentWithOneMigration_0_0_1(); - // Assert - migration.Version.Should().Be("0.0.1"); - } + // Assert + migration.Version.Should().Be("0.0.1"); + } - [Test] - public void Then_migration_should_be_created() - { - // Arrange Act - var migration = new TestDocumentWithOneMigration_0_0_1(); + [Test] + public void Then_migration_should_be_created() + { + // Arrange Act + var migration = new TestDocumentWithOneMigration_0_0_1(); - // Assert - migration.Should().BeOfType(); - } + // Assert + migration.Should().BeOfType(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs index 80fb6fa..bb05227 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs @@ -3,37 +3,36 @@ using MongoDB.Bson; using NUnit.Framework; -namespace Mongo.Migration.Tests.Migrations.Document +namespace Mongo.Migration.Tests.Migrations.Document; + +[TestFixture] +public class DocumentMigration_when_migrating { - [TestFixture] - public class DocumentMigration_when_migrating + [Test] + public void When_migrating_down_Then_document_changes() { - [Test] - public void When_migrating_down_Then_document_changes() - { - // Arrange - var migration = new TestDocumentWithOneMigration_0_0_1(); - var document = new BsonDocument { { "Doors", 3 } }; + // Arrange + var migration = new TestDocumentWithOneMigration_0_0_1(); + var document = new BsonDocument { { "Doors", 3 } }; - // Act - migration.Down(document); + // Act + migration.Down(document); - // Assert - document.Should().BeEquivalentTo(new BsonDocument { { "Dors", 3 } }); - } + // Assert + document.Should().BeEquivalentTo(new BsonDocument { { "Dors", 3 } }); + } - [Test] - public void When_migrating_up_Then_document_changes() - { - // Arrange - var migration = new TestDocumentWithOneMigration_0_0_1(); - var document = new BsonDocument { { "Dors", 3 } }; + [Test] + public void When_migrating_up_Then_document_changes() + { + // Arrange + var migration = new TestDocumentWithOneMigration_0_0_1(); + var document = new BsonDocument { { "Dors", 3 } }; - // Act - migration.Up(document); + // Act + migration.Up(document); - // Assert - document.Should().BeEquivalentTo(new BsonDocument { { "Doors", 3 } }); - } + // Assert + document.Should().BeEquivalentTo(new BsonDocument { { "Doors", 3 } }); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs index 026508d..c5f9c55 100644 --- a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs @@ -4,69 +4,68 @@ using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Tests.Migrations.Locators +namespace Mongo.Migration.Tests.Migrations.Locators; + +[TestFixture] +public class TypeMigrationLocatorWhenLocate { - [TestFixture] - public class TypeMigrationLocatorWhenLocate - { - private TypeMigrationLocator _locator; + private TypeMigrationLocator _locator; - [OneTimeSetUp] - public void OneTimeSetUp() - { - // Arrange - _locator = new TypeMigrationLocator(NullLogger.Instance); - } + [OneTimeSetUp] + public void OneTimeSetUp() + { + // Arrange + _locator = new TypeMigrationLocator(NullLogger.Instance); + } - [Test] - public void When_document_has_one_migration_Then_migrations_count_should_be_one() - { - // Act - var result = _locator.GetMigrations(typeof(TestDocumentWithOneMigration)); + [Test] + public void When_document_has_one_migration_Then_migrations_count_should_be_one() + { + // Act + var result = _locator.GetMigrations(typeof(TestDocumentWithOneMigration)); - // Assert - result.Count.Should().Be(1); - } + // Assert + result.Count.Should().Be(1); + } - [Test] - public void When_document_has_two_migration_Then_migrations_count_should_be_two() - { - // Act - var result = _locator.GetMigrations(typeof(TestDocumentWithTwoMigration)); + [Test] + public void When_document_has_two_migration_Then_migrations_count_should_be_two() + { + // Act + var result = _locator.GetMigrations(typeof(TestDocumentWithTwoMigration)); - // Assert - result.Count.Should().Be(2); - } + // Assert + result.Count.Should().Be(2); + } - [Test] - public void When_get_latest_version_of_migrations() - { - // Act - var version = _locator.GetLatestVersion(typeof(TestDocumentWithTwoMigration)); + [Test] + public void When_get_latest_version_of_migrations() + { + // Act + var version = _locator.GetLatestVersion(typeof(TestDocumentWithTwoMigration)); - // Assert - version.Should().Be("0.0.2"); - } + // Assert + version.Should().Be("0.0.2"); + } - [Test] - public void When_get_migrations_gt_and_equal_version() - { - // Act - var result = _locator.GetMigrationsGtEq(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); + [Test] + public void When_get_migrations_gt_and_equal_version() + { + // Act + var result = _locator.GetMigrationsGtEq(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); - // Assert - result[0].Should().BeOfType(); - result[1].Should().BeOfType(); - } + // Assert + result[0].Should().BeOfType(); + result[1].Should().BeOfType(); + } - [Test] - public void When_get_migrations_gt_version() - { - // Act - var result = _locator.GetMigrationsGt(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); + [Test] + public void When_get_migrations_gt_version() + { + // Act + var result = _locator.GetMigrationsGt(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); - // Assert - result[0].Should().BeOfType(); - } + // Assert + result[0].Should().BeOfType(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs b/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs index 5069da1..cd135e2 100644 --- a/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs +++ b/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs @@ -5,34 +5,33 @@ using MongoDB.Bson.Serialization; using NUnit.Framework; -namespace Mongo.Migration.Tests.MongoDB +namespace Mongo.Migration.Tests.MongoDB; + +[TestFixture] +internal class MongoRegistrator_when_registrating : IntegrationTest { - [TestFixture] - internal class MongoRegistrator_when_registrating : IntegrationTest + [SetUp] + public void SetUp() { - [SetUp] - public void SetUp() - { - OnSetUp(); - } + OnSetUp(); + } - [TearDown] - public void TearDown() - { - Dispose(); - } + [TearDown] + public void TearDown() + { + Dispose(); + } - [Test] - public void Then_serializer_is_registered() - { - // Arrange - var migrationService = Provider.GetRequiredService(); + [Test] + public void Then_serializer_is_registered() + { + // Arrange + var migrationService = Provider.GetRequiredService(); - // Act - migrationService.Migrate(); + // Act + migrationService.Migrate(); - // Arrange - BsonSerializer.LookupSerializer().ValueType.Should().Be(typeof(DocumentVersion)); - } + // Arrange + BsonSerializer.LookupSerializer().ValueType.Should().Be(typeof(DocumentVersion)); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index 9e16ef1..8d5af2e 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -12,126 +12,125 @@ using MongoDB.Driver; using NUnit.Framework; -namespace Mongo.Migration.Tests.Performance +namespace Mongo.Migration.Tests.Performance; + +[TestFixture] +public class PerformanceTestOnStartup { - [TestFixture] - public class PerformanceTestOnStartup - { - private const int DOCUMENT_COUNT = 10000; + private const int DOCUMENT_COUNT = 10000; - private const string DATABASE_NAME = "PerformanceTest"; + private const string DATABASE_NAME = "PerformanceTest"; - private const string COLLECTION_NAME = "Test"; + private const string COLLECTION_NAME = "Test"; - private const int TOLERANCE_MS = 2800; + private const int TOLERANCE_MS = 2800; - private MongoClient _client; + private MongoClient _client; - private MongoDbRunner _runner; + private MongoDbRunner _runner; - [TearDown] - public void TearDown() - { - MongoMigrationClient.Reset(); - _client = null!; - _runner.Dispose(); - } + [TearDown] + public void TearDown() + { + MongoMigrationClient.Reset(); + _client = null!; + _runner.Dispose(); + } - [SetUp] - public void SetUp() - { - _runner = MongoDbRunner.Start(); - _client = new(_runner.ConnectionString); - } + [SetUp] + public void SetUp() + { + _runner = MongoDbRunner.Start(); + _client = new(_runner.ConnectionString); + } - [Test] - public void When_migrating_number_of_documents() - { - // Arrange - // Worm up MongoCache - ClearCollection(); - AddDocumentsToCache(); - ClearCollection(); - - // Act - // Measure time of MongoDb processing without Mongo.Migration - InsertMany(DOCUMENT_COUNT, false); - var sw = new Stopwatch(); - sw.Start(); - MigrateAll(false); - sw.Stop(); - - ClearCollection(); - - // Measure time of MongoDb processing without Mongo.Migration - InsertMany(DOCUMENT_COUNT, true); - var swWithMigration = new Stopwatch(); - swWithMigration.Start(); - ServiceCollection serviceCollection = new(); - serviceCollection - .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) - .AddSingleton(_client) - .AddMigration(new MongoMigrationSettings()); - ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); - MongoMigrationClient.Initialize(serviceProvider); - swWithMigration.Stop(); - - ClearCollection(); - - var result = swWithMigration.ElapsedMilliseconds - sw.ElapsedMilliseconds; - - Console.WriteLine( - $"MongoDB: {sw.ElapsedMilliseconds}ms, Mongo.Migration: {swWithMigration.ElapsedMilliseconds}ms, Diff: {result}ms (Tolerance: {TOLERANCE_MS}ms), Documents: {DOCUMENT_COUNT}, Migrations per Document: 2"); - - // Assert - result.Should().BeLessThan(TOLERANCE_MS); - } + [Test] + public void When_migrating_number_of_documents() + { + // Arrange + // Worm up MongoCache + ClearCollection(); + AddDocumentsToCache(); + ClearCollection(); + + // Act + // Measure time of MongoDb processing without Mongo.Migration + InsertMany(DOCUMENT_COUNT, false); + var sw = new Stopwatch(); + sw.Start(); + MigrateAll(false); + sw.Stop(); + + ClearCollection(); + + // Measure time of MongoDb processing without Mongo.Migration + InsertMany(DOCUMENT_COUNT, true); + var swWithMigration = new Stopwatch(); + swWithMigration.Start(); + ServiceCollection serviceCollection = new(); + serviceCollection + .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) + .AddSingleton(_client) + .AddMigration(new MongoMigrationSettings()); + ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); + MongoMigrationClient.Initialize(serviceProvider); + swWithMigration.Stop(); + + ClearCollection(); + + var result = swWithMigration.ElapsedMilliseconds - sw.ElapsedMilliseconds; + + Console.WriteLine( + $"MongoDB: {sw.ElapsedMilliseconds}ms, Mongo.Migration: {swWithMigration.ElapsedMilliseconds}ms, Diff: {result}ms (Tolerance: {TOLERANCE_MS}ms), Documents: {DOCUMENT_COUNT}, Migrations per Document: 2"); + + // Assert + result.Should().BeLessThan(TOLERANCE_MS); + } - private void InsertMany(int number, bool withVersion) + private void InsertMany(int number, bool withVersion) + { + var documents = new List(); + for (var n = 0; n < number; n++) { - var documents = new List(); - for (var n = 0; n < number; n++) + var document = new BsonDocument { - var document = new BsonDocument - { - { "Dors", 3 } - }; - if (withVersion) - { - document.Add("Version", "0.0.0"); - } - - documents.Add(document); - } - - _client.GetDatabase(DATABASE_NAME).GetCollection(COLLECTION_NAME).InsertManyAsync(documents) - .Wait(); - } - - private void MigrateAll(bool withVersion) - { + { "Dors", 3 } + }; if (withVersion) { - var versionedCollectin = _client.GetDatabase(DATABASE_NAME) - .GetCollection(COLLECTION_NAME); - var versionedResult = versionedCollectin.FindAsync(_ => true).Result.ToListAsync().Result; - return; + document.Add("Version", "0.0.0"); } - var collection = _client.GetDatabase(DATABASE_NAME) - .GetCollection(COLLECTION_NAME); - var result = collection.FindAsync(_ => true).Result.ToListAsync().Result; + documents.Add(document); } - private void AddDocumentsToCache() - { - InsertMany(DOCUMENT_COUNT, false); - MigrateAll(false); - } + _client.GetDatabase(DATABASE_NAME).GetCollection(COLLECTION_NAME).InsertManyAsync(documents) + .Wait(); + } - private void ClearCollection() + private void MigrateAll(bool withVersion) + { + if (withVersion) { - _client.GetDatabase(DATABASE_NAME).DropCollection(COLLECTION_NAME); + var versionedCollectin = _client.GetDatabase(DATABASE_NAME) + .GetCollection(COLLECTION_NAME); + var versionedResult = versionedCollectin.FindAsync(_ => true).Result.ToListAsync().Result; + return; } + + var collection = _client.GetDatabase(DATABASE_NAME) + .GetCollection(COLLECTION_NAME); + var result = collection.FindAsync(_ => true).Result.ToListAsync().Result; + } + + private void AddDocumentsToCache() + { + InsertMany(DOCUMENT_COUNT, false); + MigrateAll(false); + } + + private void ClearCollection() + { + _client.GetDatabase(DATABASE_NAME).DropCollection(COLLECTION_NAME); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs index ea8edf4..7cb3315 100644 --- a/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs @@ -5,50 +5,49 @@ using Mongo.Migration.Tests.Migrations.Database; using NUnit.Framework; -namespace Mongo.Migration.Tests.Services +namespace Mongo.Migration.Tests.Services; + +[TestFixture] +internal class DatabaseVersionServiceWhenDetermineVersion : DatabaseIntegrationTest { - [TestFixture] - internal class DatabaseVersionServiceWhenDetermineVersion : DatabaseIntegrationTest + private IDatabaseVersionService? _service; + + protected override void OnSetUp(DocumentVersion version) + { + base.OnSetUp(version); + + _service = Provider.GetRequiredService(); + } + + [TearDown] + public void TearDown() + { + Dispose(); + } + + [Test] + public void When_project_has_migrations_Then_get_latest_version() + { + // Arrange + OnSetUp(DocumentVersion.Empty()); + + // Act + var migrationVersion = _service?.GetCurrentOrLatestMigrationVersion(); + + // Assert + migrationVersion.ToString().Should().Be("0.0.3"); + } + + [Test] + public void When_version_set_on_startup_Then_use_startup_version() { - private IDatabaseVersionService? _service; - - protected override void OnSetUp(DocumentVersion version) - { - base.OnSetUp(version); - - _service = Provider.GetRequiredService(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - - [Test] - public void When_project_has_migrations_Then_get_latest_version() - { - // Arrange - OnSetUp(DocumentVersion.Empty()); - - // Act - var migrationVersion = _service?.GetCurrentOrLatestMigrationVersion(); - - // Assert - migrationVersion.ToString().Should().Be("0.0.3"); - } - - [Test] - public void When_version_set_on_startup_Then_use_startup_version() - { - // Arrange - OnSetUp(new(0, 0, 2)); - - // Act - var migrationVersion = _service?.GetCurrentOrLatestMigrationVersion(); - - // Assert - migrationVersion.ToString().Should().Be("0.0.2"); - } + // Arrange + OnSetUp(new(0, 0, 2)); + + // Act + var migrationVersion = _service?.GetCurrentOrLatestMigrationVersion(); + + // Assert + migrationVersion.ToString().Should().Be("0.0.2"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs index 7e24676..86df6ef 100644 --- a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs @@ -5,64 +5,63 @@ using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Tests.Services +namespace Mongo.Migration.Tests.Services; + +[TestFixture] +internal class DocumentVersionService_when_determine_version : IntegrationTest { - [TestFixture] - internal class DocumentVersionService_when_determine_version : IntegrationTest - { - private IDocumentVersionService _service; + private IDocumentVersionService _service; - [SetUp] - public void SetUp() - { - OnSetUp(); + [SetUp] + public void SetUp() + { + OnSetUp(); - _service = Provider.GetRequiredService(); - } + _service = Provider.GetRequiredService(); + } - [TearDown] - public void TearDown() - { - Dispose(); - } + [TearDown] + public void TearDown() + { + Dispose(); + } - [Test] - public void When_document_has_current_version_Then_current_version_is_set() - { - // Arrange - var document = new TestDocumentWithTwoMigrationMiddleVersion(); + [Test] + public void When_document_has_current_version_Then_current_version_is_set() + { + // Arrange + var document = new TestDocumentWithTwoMigrationMiddleVersion(); - // Act - _service.DetermineVersion(document); + // Act + _service.DetermineVersion(document); - // Assert - document.Version.Should().Be("0.0.1"); - } + // Assert + document.Version.Should().Be("0.0.1"); + } - [Test] - public void When_document_has_highest_version_Then_highest_version_is_set() - { - // Arrange - var document = new TestDocumentWithTwoMigrationHighestVersion(); + [Test] + public void When_document_has_highest_version_Then_highest_version_is_set() + { + // Arrange + var document = new TestDocumentWithTwoMigrationHighestVersion(); - // Act - _service.DetermineVersion(document); + // Act + _service.DetermineVersion(document); - // Assert - document.Version.Should().Be("0.0.2"); - } + // Assert + document.Version.Should().Be("0.0.2"); + } - [Test] - public void When_document_has_version_that_should_not_be_Then_throw_exception() - { - // Arrange - var document = new TestDocumentWithTwoMigrationHighestVersion { Version = "0.0.1" }; + [Test] + public void When_document_has_version_that_should_not_be_Then_throw_exception() + { + // Arrange + var document = new TestDocumentWithTwoMigrationHighestVersion { Version = "0.0.1" }; - // Act// Act - Action checkAction = () => { _service.DetermineVersion(document); }; + // Act// Act + Action checkAction = () => { _service.DetermineVersion(document); }; - // Assert - checkAction.Should().Throw(); - } + // Assert + checkAction.Should().Throw(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs b/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs index c8889f4..3daa269 100644 --- a/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs +++ b/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs @@ -4,35 +4,34 @@ using NSubstitute; using NUnit.Framework; -namespace Mongo.Migration.Tests.Services.Initializers +namespace Mongo.Migration.Tests.Services.Initializers; + +[TestFixture] +public class MongoMigration_when_initialize { - [TestFixture] - public class MongoMigration_when_initialize + [TearDown] + public void TearDown() { - [TearDown] - public void TearDown() - { - MongoMigrationClient.Reset(); - } + MongoMigrationClient.Reset(); + } - [Test] - public void When_inizialize_twice_Then_throw_exception() - { - // Arrange - var registry = Substitute.For(); - var mongoMigration = Substitute.For(); + [Test] + public void When_inizialize_twice_Then_throw_exception() + { + // Arrange + var registry = Substitute.For(); + var mongoMigration = Substitute.For(); - registry - .GetService(Arg.Is(typeof(IMongoMigration))) - .Returns(mongoMigration); + registry + .GetService(Arg.Is(typeof(IMongoMigration))) + .Returns(mongoMigration); - // Act - MongoMigrationClient.Initialize(registry); + // Act + MongoMigrationClient.Initialize(registry); - Action comparison = () => MongoMigrationClient.Initialize(registry); + Action comparison = () => MongoMigrationClient.Initialize(registry); - // Assert - comparison.Should().Throw(); - } + // Assert + comparison.Should().Throw(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs index 417d347..79cd32b 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs @@ -4,60 +4,59 @@ using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Tests.Services.Interceptors +namespace Mongo.Migration.Tests.Services.Interceptors; + +[TestFixture] +internal class MigrationInterceptorFactory_when_creating : IntegrationTest { - [TestFixture] - internal class MigrationInterceptorFactory_when_creating : IntegrationTest + [SetUp] + public void SetUp() + { + OnSetUp(); + } + + [TearDown] + public void TearDown() + { + Dispose(); + } + + [Test] + public void If_type_is_assignable_to_document_Then_interceptor_is_created() { - [SetUp] - public void SetUp() - { - OnSetUp(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - - [Test] - public void If_type_is_assignable_to_document_Then_interceptor_is_created() - { - // Arrange - var factory = Provider.GetRequiredService(); - - // Act - var interceptor = factory.Create(typeof(TestDocumentWithOneMigration)); - - // Assert - interceptor.ValueType.Should().Be(); - } - - [Test] - public void If_type_is_not_assignable_to_document_Then_exception_is_thrown() - { - // Arrange - var factory = Provider.GetRequiredService(); - - // Act - Action act = () => factory.Create(typeof(TestClass)); - - // Assert - act.Should().ThrowExactly(); - } - - [Test] - public void If_type_is_null_Then_exception_is_thrown() - { - // Arrange - var factory = Provider.GetRequiredService(); - - // Act - Action act = () => factory.Create(null!); - - // Assert - act.Should().ThrowExactly(); - } + // Arrange + var factory = Provider.GetRequiredService(); + + // Act + var interceptor = factory.Create(typeof(TestDocumentWithOneMigration)); + + // Assert + interceptor.ValueType.Should().Be(); + } + + [Test] + public void If_type_is_not_assignable_to_document_Then_exception_is_thrown() + { + // Arrange + var factory = Provider.GetRequiredService(); + + // Act + Action act = () => factory.Create(typeof(TestClass)); + + // Assert + act.Should().ThrowExactly(); + } + + [Test] + public void If_type_is_null_Then_exception_is_thrown() + { + // Arrange + var factory = Provider.GetRequiredService(); + + // Act + Action act = () => factory.Create(null!); + + // Assert + act.Should().ThrowExactly(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs index d1d8b81..277d14c 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs @@ -4,47 +4,46 @@ using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; -namespace Mongo.Migration.Tests.Services.Interceptors +namespace Mongo.Migration.Tests.Services.Interceptors; + +[TestFixture] +internal class MigrationInterceptorProvider_when_get_serializer : IntegrationTest { - [TestFixture] - internal class MigrationInterceptorProvider_when_get_serializer : IntegrationTest + [SetUp] + public void SetUp() + { + OnSetUp(); + } + + [TearDown] + public void TearDown() + { + Dispose(); + } + + [Test] + public void When_entity_is_document_Then_provide_serializer() { - [SetUp] - public void SetUp() - { - OnSetUp(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - - [Test] - public void When_entity_is_document_Then_provide_serializer() - { - // Arrange - var provider = Provider.GetRequiredService(); - - // Act - var serializer = provider.GetSerializer(typeof(TestDocumentWithOneMigration)); - - // Assert - serializer.ValueType.Should().Be(typeof(TestDocumentWithOneMigration)); - } - - [Test] - public void When_entity_is_not_document_Then_provide_null() - { - // Arrange - var provider = Provider.GetRequiredService(); - - // Act - var serializer = provider.GetSerializer(typeof(TestClass)); - - // Assert - serializer.Should().BeNull(); - } + // Arrange + var provider = Provider.GetRequiredService(); + + // Act + var serializer = provider.GetSerializer(typeof(TestDocumentWithOneMigration)); + + // Assert + serializer.ValueType.Should().Be(typeof(TestDocumentWithOneMigration)); + } + + [Test] + public void When_entity_is_not_document_Then_provide_null() + { + // Arrange + var provider = Provider.GetRequiredService(); + + // Act + var serializer = provider.GetSerializer(typeof(TestClass)); + + // Assert + serializer.Should().BeNull(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs index 333ca24..e805c03 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs @@ -1,21 +1,20 @@ using Mongo.Migration.Migrations.Database; using MongoDB.Driver; -namespace Mongo.Migration.Tests.TestDoubles.Database +namespace Mongo.Migration.Tests.TestDoubles.Database; + +internal class TestDatabaseMigration_0_0_1 : DatabaseMigration { - internal class TestDatabaseMigration_0_0_1 : DatabaseMigration + public TestDatabaseMigration_0_0_1() + : base("0.0.1") { - public TestDatabaseMigration_0_0_1() - : base("0.0.1") - { - } + } - public override void Up(IMongoDatabase db) - { - } + public override void Up(IMongoDatabase db) + { + } - public override void Down(IMongoDatabase db) - { - } + public override void Down(IMongoDatabase db) + { } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs index 434b972..9784f07 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs @@ -1,21 +1,20 @@ using Mongo.Migration.Migrations.Database; using MongoDB.Driver; -namespace Mongo.Migration.Tests.TestDoubles.Database +namespace Mongo.Migration.Tests.TestDoubles.Database; + +internal class TestDatabaseMigration_0_0_2 : DatabaseMigration { - internal class TestDatabaseMigration_0_0_2 : DatabaseMigration + public TestDatabaseMigration_0_0_2() + : base("0.0.2") { - public TestDatabaseMigration_0_0_2() - : base("0.0.2") - { - } + } - public override void Up(IMongoDatabase db) - { - } + public override void Up(IMongoDatabase db) + { + } - public override void Down(IMongoDatabase db) - { - } + public override void Down(IMongoDatabase db) + { } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs index 8ed709a..d5f1834 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs @@ -1,21 +1,20 @@ using Mongo.Migration.Migrations.Database; using MongoDB.Driver; -namespace Mongo.Migration.Tests.TestDoubles.Database +namespace Mongo.Migration.Tests.TestDoubles.Database; + +internal class TestDatabaseMigration_0_0_3 : DatabaseMigration { - internal class TestDatabaseMigration_0_0_3 : DatabaseMigration + public TestDatabaseMigration_0_0_3() + : base("0.0.3") { - public TestDatabaseMigration_0_0_3() - : base("0.0.3") - { - } + } - public override void Up(IMongoDatabase db) - { - } + public override void Up(IMongoDatabase db) + { + } - public override void Down(IMongoDatabase db) - { - } + public override void Down(IMongoDatabase db) + { } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestClass.cs b/Mongo.Migration.Tests/TestDoubles/TestClass.cs index 5f8a907..b851acc 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestClass.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestClass.cs @@ -1,11 +1,10 @@ using MongoDB.Bson; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +public class TestClass { - public class TestClass - { - public ObjectId Id { get; set; } + public ObjectId Id { get; set; } - public int Dors { get; set; } - } + public int Dors { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs index aa7464c..de9f45b 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs @@ -1,16 +1,15 @@ using Mongo.Migration.Documents; using Mongo.Migration.Documents.Attributes; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +[RuntimeVersion("0.0.1")] +internal class TestDocumentWithOneMigration : Document { - [RuntimeVersion("0.0.1")] - internal class TestDocumentWithOneMigration : Document - { - public int Doors { get; set; } - } + public int Doors { get; set; } +} - internal class TestDocumentWithoutAttribute : Document - { - public int Doors { get; set; } - } +internal class TestDocumentWithoutAttribute : Document +{ + public int Doors { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs index 4875fea..63593a6 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs @@ -1,27 +1,26 @@ using Mongo.Migration.Migrations.Document; using MongoDB.Bson; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +internal class TestDocumentWithOneMigration_0_0_1 : DocumentMigration { - internal class TestDocumentWithOneMigration_0_0_1 : DocumentMigration + public TestDocumentWithOneMigration_0_0_1() + : base("0.0.1") { - public TestDocumentWithOneMigration_0_0_1() - : base("0.0.1") - { - } + } - public override void Up(BsonDocument document) - { - var doors = document["Dors"].ToInt32(); - document.Add("Doors", doors); - document.Remove("Dors"); - } + public override void Up(BsonDocument document) + { + var doors = document["Dors"].ToInt32(); + document.Add("Doors", doors); + document.Remove("Dors"); + } - public override void Down(BsonDocument document) - { - var doors = document["Doors"].ToInt32(); - document.Add("Dors", doors); - document.Remove("Doors"); - } + public override void Down(BsonDocument document) + { + var doors = document["Doors"].ToInt32(); + document.Add("Dors", doors); + document.Remove("Doors"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs index 7748221..47483ad 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs @@ -1,11 +1,10 @@ using Mongo.Migration.Documents; using Mongo.Migration.Documents.Attributes; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +[RuntimeVersion("0.0.0")] +internal class TestDocumentWithTwoMigration : Document { - [RuntimeVersion("0.0.0")] - internal class TestDocumentWithTwoMigration : Document - { - public int Dors { get; set; } - } + public int Dors { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs index 47a5e9e..389a274 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs @@ -2,14 +2,13 @@ using Mongo.Migration.Documents.Attributes; using MongoDB.Bson; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +[RuntimeVersion("0.0.2")] +[CollectionLocation("Test", "PerformanceTest")] +internal class TestDocumentWithTwoMigrationHighestVersion : Document { - [RuntimeVersion("0.0.2")] - [CollectionLocation("Test", "PerformanceTest")] - internal class TestDocumentWithTwoMigrationHighestVersion : Document - { - public ObjectId Id { get; set; } + public ObjectId Id { get; set; } - public int Door { get; set; } - } + public int Door { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs index 014d708..8797c3e 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs @@ -1,27 +1,26 @@ using Mongo.Migration.Migrations.Document; using MongoDB.Bson; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +internal class TestDocumentWithTwoMigrationHighestVersion_0_0_1 : DocumentMigration { - internal class TestDocumentWithTwoMigrationHighestVersion_0_0_1 : DocumentMigration + public TestDocumentWithTwoMigrationHighestVersion_0_0_1() + : base("0.0.1") { - public TestDocumentWithTwoMigrationHighestVersion_0_0_1() - : base("0.0.1") - { - } + } - public override void Up(BsonDocument document) - { - var doors = document["Dors"].ToInt32(); - document.Add("Doors", doors); - document.Remove("Dors"); - } + public override void Up(BsonDocument document) + { + var doors = document["Dors"].ToInt32(); + document.Add("Doors", doors); + document.Remove("Dors"); + } - public override void Down(BsonDocument document) - { - var doors = document["Doors"].ToInt32(); - document.Add("Dors", doors); - document.Remove("Doors"); - } + public override void Down(BsonDocument document) + { + var doors = document["Doors"].ToInt32(); + document.Add("Dors", doors); + document.Remove("Doors"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs index 4a4e8b5..3246d29 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs @@ -1,27 +1,26 @@ using Mongo.Migration.Migrations.Document; using MongoDB.Bson; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +internal class TestDocumentWithTwoMigrationHighestVersion_0_0_2 : DocumentMigration { - internal class TestDocumentWithTwoMigrationHighestVersion_0_0_2 : DocumentMigration + public TestDocumentWithTwoMigrationHighestVersion_0_0_2() + : base("0.0.2") { - public TestDocumentWithTwoMigrationHighestVersion_0_0_2() - : base("0.0.2") - { - } + } - public override void Up(BsonDocument document) - { - var doors = document["Doors"].ToInt32(); - document.Add("Door", doors); - document.Remove("Doors"); - } + public override void Up(BsonDocument document) + { + var doors = document["Doors"].ToInt32(); + document.Add("Door", doors); + document.Remove("Doors"); + } - public override void Down(BsonDocument document) - { - var doors = document["Door"].ToInt32(); - document.Add("Doors", doors); - document.Remove("Door"); - } + public override void Down(BsonDocument document) + { + var doors = document["Door"].ToInt32(); + document.Add("Doors", doors); + document.Remove("Door"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs index f934e8d..037a630 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs @@ -1,11 +1,10 @@ using Mongo.Migration.Documents; using Mongo.Migration.Documents.Attributes; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +[RuntimeVersion("0.0.1")] +internal class TestDocumentWithTwoMigrationMiddleVersion : Document { - [RuntimeVersion("0.0.1")] - internal class TestDocumentWithTwoMigrationMiddleVersion : Document - { - public int Door { get; set; } - } + public int Door { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs index ce36d7a..36e6fdd 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs @@ -1,27 +1,26 @@ using Mongo.Migration.Migrations.Document; using MongoDB.Bson; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +internal class TestDocumentWithTwoMigrationMiddleVersion_0_0_1 : DocumentMigration { - internal class TestDocumentWithTwoMigrationMiddleVersion_0_0_1 : DocumentMigration + public TestDocumentWithTwoMigrationMiddleVersion_0_0_1() + : base("0.0.1") { - public TestDocumentWithTwoMigrationMiddleVersion_0_0_1() - : base("0.0.1") - { - } + } - public override void Up(BsonDocument document) - { - var doors = document["Dors"].ToInt32(); - document.Add("Doors", doors); - document.Remove("Dors"); - } + public override void Up(BsonDocument document) + { + var doors = document["Dors"].ToInt32(); + document.Add("Doors", doors); + document.Remove("Dors"); + } - public override void Down(BsonDocument document) - { - var doors = document["Doors"].ToInt32(); - document.Add("Dors", doors); - document.Remove("Doors"); - } + public override void Down(BsonDocument document) + { + var doors = document["Doors"].ToInt32(); + document.Add("Dors", doors); + document.Remove("Doors"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs index d381f00..69e1aef 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs @@ -1,27 +1,26 @@ using Mongo.Migration.Migrations.Document; using MongoDB.Bson; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +internal class TestDocumentWithTwoMigrationMiddleVersion_0_0_2 : DocumentMigration { - internal class TestDocumentWithTwoMigrationMiddleVersion_0_0_2 : DocumentMigration + public TestDocumentWithTwoMigrationMiddleVersion_0_0_2() + : base("0.0.2") { - public TestDocumentWithTwoMigrationMiddleVersion_0_0_2() - : base("0.0.2") - { - } + } - public override void Up(BsonDocument document) - { - var doors = document["Doors"].ToInt32(); - document.Add("Door", doors); - document.Remove("Doors"); - } + public override void Up(BsonDocument document) + { + var doors = document["Doors"].ToInt32(); + document.Add("Door", doors); + document.Remove("Doors"); + } - public override void Down(BsonDocument document) - { - var doors = document["Door"].ToInt32(); - document.Add("Doors", doors); - document.Remove("Door"); - } + public override void Down(BsonDocument document) + { + var doors = document["Door"].ToInt32(); + document.Add("Doors", doors); + document.Remove("Door"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs index f596b58..fc99c73 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs @@ -1,27 +1,26 @@ using Mongo.Migration.Migrations.Document; using MongoDB.Bson; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +internal class TestDocumentWithTwoMigration_0_0_1 : DocumentMigration { - internal class TestDocumentWithTwoMigration_0_0_1 : DocumentMigration + public TestDocumentWithTwoMigration_0_0_1() + : base("0.0.1") { - public TestDocumentWithTwoMigration_0_0_1() - : base("0.0.1") - { - } + } - public override void Up(BsonDocument document) - { - var doors = document["Dors"].ToInt32(); - document.Add("Doors", doors); - document.Remove("Dors"); - } + public override void Up(BsonDocument document) + { + var doors = document["Dors"].ToInt32(); + document.Add("Doors", doors); + document.Remove("Dors"); + } - public override void Down(BsonDocument document) - { - var doors = document["Doors"].ToInt32(); - document.Add("Dors", doors); - document.Remove("Doors"); - } + public override void Down(BsonDocument document) + { + var doors = document["Doors"].ToInt32(); + document.Add("Dors", doors); + document.Remove("Doors"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs index 8fd789b..5c5aeea 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs @@ -1,27 +1,26 @@ using Mongo.Migration.Migrations.Document; using MongoDB.Bson; -namespace Mongo.Migration.Tests.TestDoubles +namespace Mongo.Migration.Tests.TestDoubles; + +internal class TestDocumentWithTwoMigration_0_0_2 : DocumentMigration { - internal class TestDocumentWithTwoMigration_0_0_2 : DocumentMigration + public TestDocumentWithTwoMigration_0_0_2() + : base("0.0.2") { - public TestDocumentWithTwoMigration_0_0_2() - : base("0.0.2") - { - } + } - public override void Up(BsonDocument document) - { - var doors = document["Doors"].ToInt32(); - document.Add("Door", doors); - document.Remove("Doors"); - } + public override void Up(BsonDocument document) + { + var doors = document["Doors"].ToInt32(); + document.Add("Door", doors); + document.Remove("Doors"); + } - public override void Down(BsonDocument document) - { - var doors = document["Door"].ToInt32(); - document.Add("Doors", doors); - document.Remove("Door"); - } + public override void Down(BsonDocument document) + { + var doors = document["Door"].ToInt32(); + document.Add("Doors", doors); + document.Remove("Door"); } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs b/Mongo.Migration/Documents/Attributes/CollectionLocation.cs index 3d83b64..5202463 100644 --- a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs +++ b/Mongo.Migration/Documents/Attributes/CollectionLocation.cs @@ -1,13 +1,12 @@ -namespace Mongo.Migration.Documents.Attributes +namespace Mongo.Migration.Documents.Attributes; + +[AttributeUsage(AttributeTargets.Class)] +public class CollectionLocation : Attribute { - [AttributeUsage(AttributeTargets.Class)] - public class CollectionLocation : Attribute - { - public CollectionLocationInformation CollectionInformation { get; } + public CollectionLocationInformation CollectionInformation { get; } - public CollectionLocation(string collectionName, string? databaseName = null) - { - CollectionInformation = new(databaseName, collectionName); - } + public CollectionLocation(string collectionName, string? databaseName = null) + { + CollectionInformation = new(databaseName, collectionName); } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs b/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs index 0d08a74..cd23486 100644 --- a/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs +++ b/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs @@ -1,15 +1,14 @@ -namespace Mongo.Migration.Documents.Attributes +namespace Mongo.Migration.Documents.Attributes; + +public readonly struct CollectionLocationInformation { - public readonly struct CollectionLocationInformation + public CollectionLocationInformation(string? database, string collection) { - public CollectionLocationInformation(string? database, string collection) - { - Database = database; - Collection = collection; - } + Database = database; + Collection = collection; + } - public string? Database { get; } + public string? Database { get; } - public string Collection { get; } - } + public string Collection { get; } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs b/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs index fcdf24f..ff9aaa0 100644 --- a/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs +++ b/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs @@ -1,13 +1,12 @@ -namespace Mongo.Migration.Documents.Attributes +namespace Mongo.Migration.Documents.Attributes; + +[AttributeUsage(AttributeTargets.Class)] +public class RuntimeVersion : Attribute { - [AttributeUsage(AttributeTargets.Class)] - public class RuntimeVersion : Attribute - { - public DocumentVersion Version { get; } + public DocumentVersion Version { get; } - public RuntimeVersion(string version) - { - Version = version; - } + public RuntimeVersion(string version) + { + Version = version; } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Attributes/StartUpVersion.cs b/Mongo.Migration/Documents/Attributes/StartUpVersion.cs index d795af3..006fe01 100644 --- a/Mongo.Migration/Documents/Attributes/StartUpVersion.cs +++ b/Mongo.Migration/Documents/Attributes/StartUpVersion.cs @@ -1,13 +1,12 @@ -namespace Mongo.Migration.Documents.Attributes +namespace Mongo.Migration.Documents.Attributes; + +[AttributeUsage(AttributeTargets.Class)] +public class StartUpVersion : Attribute { - [AttributeUsage(AttributeTargets.Class)] - public class StartUpVersion : Attribute - { - public DocumentVersion Version { get; } + public DocumentVersion Version { get; } - public StartUpVersion(string version) - { - Version = version; - } + public StartUpVersion(string version) + { + Version = version; } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Document.cs b/Mongo.Migration/Documents/Document.cs index bc4f575..4740e45 100644 --- a/Mongo.Migration/Documents/Document.cs +++ b/Mongo.Migration/Documents/Document.cs @@ -1,7 +1,6 @@ -namespace Mongo.Migration.Documents +namespace Mongo.Migration.Documents; + +public class Document : IDocument { - public class Document : IDocument - { - public DocumentVersion Version { get; set; } - } + public DocumentVersion Version { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/DocumentVersion.cs b/Mongo.Migration/Documents/DocumentVersion.cs index 5f7c758..3ca15f1 100644 --- a/Mongo.Migration/Documents/DocumentVersion.cs +++ b/Mongo.Migration/Documents/DocumentVersion.cs @@ -3,154 +3,153 @@ using MongoDB.Bson.Serialization; -namespace Mongo.Migration.Documents +namespace Mongo.Migration.Documents; + +public readonly struct DocumentVersion : IComparable { - public readonly struct DocumentVersion : IComparable - { - private const char VersionSplitChar = '.'; + private const char VersionSplitChar = '.'; - private const int MaxLength = 3; + private const int MaxLength = 3; - public int Major { get; init; } + public int Major { get; init; } - public int Minor { get; init; } + public int Minor { get; init; } - public int Revision { get; init; } + public int Revision { get; init; } - static DocumentVersion() + static DocumentVersion() + { + try + { + BsonSerializer.RegisterSerializer(typeof(DocumentVersion), new DocumentVersionSerializer()); + } + catch (Exception) { - try - { - BsonSerializer.RegisterSerializer(typeof(DocumentVersion), new DocumentVersionSerializer()); - } - catch (Exception) - { - } } + } + + public DocumentVersion(string version) + { + string[] versionParts = version.Split(VersionSplitChar); - public DocumentVersion(string version) + if (versionParts.Length != MaxLength) { - string[] versionParts = version.Split(VersionSplitChar); + throw new VersionStringToLongException(version); + } - if (versionParts.Length != MaxLength) - { - throw new VersionStringToLongException(version); - } + Major = ParseVersionPart(versionParts[0]); - Major = ParseVersionPart(versionParts[0]); + Minor = ParseVersionPart(versionParts[1]); - Minor = ParseVersionPart(versionParts[1]); + Revision = ParseVersionPart(versionParts[2]); + } - Revision = ParseVersionPart(versionParts[2]); - } + public DocumentVersion(int major, int minor, int revision) + { + Major = major; + Minor = minor; + Revision = revision; + } - public DocumentVersion(int major, int minor, int revision) - { - Major = major; - Minor = minor; - Revision = revision; - } + public static DocumentVersion Default() + { + return default(DocumentVersion); + } - public static DocumentVersion Default() - { - return default(DocumentVersion); - } + public static DocumentVersion Empty() + { + return new(-1, 0, 0); + } - public static DocumentVersion Empty() - { - return new(-1, 0, 0); - } + public static implicit operator DocumentVersion(string version) + { + return new(version); + } - public static implicit operator DocumentVersion(string version) - { - return new(version); - } + public static implicit operator string(DocumentVersion documentVersion) + { + return documentVersion.ToString(); + } - public static implicit operator string(DocumentVersion documentVersion) - { - return documentVersion.ToString(); - } + public override string ToString() + { + return $"{Major}.{Minor}.{Revision}"; + } - public override string ToString() + public int CompareTo(DocumentVersion other) + { + if (Equals(other)) { - return $"{Major}.{Minor}.{Revision}"; + return 0; } - public int CompareTo(DocumentVersion other) - { - if (Equals(other)) - { - return 0; - } + return this > other ? 1 : -1; + } - return this > other ? 1 : -1; - } + public static bool operator ==(DocumentVersion a, DocumentVersion b) + { + return a.Equals(b); + } - public static bool operator ==(DocumentVersion a, DocumentVersion b) - { - return a.Equals(b); - } + public static bool operator !=(DocumentVersion a, DocumentVersion b) + { + return !(a == b); + } - public static bool operator !=(DocumentVersion a, DocumentVersion b) - { - return !(a == b); - } + public static bool operator >(DocumentVersion a, DocumentVersion b) + { + return a.Major > b.Major + || (a.Major == b.Major && a.Minor > b.Minor) + || (a.Major == b.Major && a.Minor == b.Minor && a.Revision > b.Revision); + } - public static bool operator >(DocumentVersion a, DocumentVersion b) - { - return a.Major > b.Major - || (a.Major == b.Major && a.Minor > b.Minor) - || (a.Major == b.Major && a.Minor == b.Minor && a.Revision > b.Revision); - } + public static bool operator <(DocumentVersion a, DocumentVersion b) + { + return a != b && !(a > b); + } - public static bool operator <(DocumentVersion a, DocumentVersion b) - { - return a != b && !(a > b); - } + public static bool operator <=(DocumentVersion a, DocumentVersion b) + { + return a == b || a < b; + } - public static bool operator <=(DocumentVersion a, DocumentVersion b) - { - return a == b || a < b; - } + public static bool operator >=(DocumentVersion a, DocumentVersion b) + { + return a == b || a > b; + } - public static bool operator >=(DocumentVersion a, DocumentVersion b) - { - return a == b || a > b; - } + public bool Equals(DocumentVersion other) + { + return other.Major == Major && other.Minor == Minor && other.Revision == Revision; + } - public bool Equals(DocumentVersion other) + public override bool Equals(object? obj) + { + if (obj is null) { - return other.Major == Major && other.Minor == Minor && other.Revision == Revision; + return false; } - public override bool Equals(object? obj) + if (obj.GetType() != typeof(DocumentVersion)) { - if (obj is null) - { - return false; - } + return false; + } - if (obj.GetType() != typeof(DocumentVersion)) - { - return false; - } + return Equals((DocumentVersion)obj); + } - return Equals((DocumentVersion)obj); - } + public override int GetHashCode() + { + return HashCode.Combine(Major, Minor, Revision); + } - public override int GetHashCode() + private static int ParseVersionPart(string value) + { + if (!int.TryParse(value, out int target)) { - return HashCode.Combine(Major, Minor, Revision); + throw new InvalidVersionValueException(value); } - private static int ParseVersionPart(string value) - { - if (!int.TryParse(value, out int target)) - { - throw new InvalidVersionValueException(value); - } - - return target; - } + return target; } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/IDocument.cs b/Mongo.Migration/Documents/IDocument.cs index 5188393..b803619 100644 --- a/Mongo.Migration/Documents/IDocument.cs +++ b/Mongo.Migration/Documents/IDocument.cs @@ -1,7 +1,6 @@ -namespace Mongo.Migration.Documents +namespace Mongo.Migration.Documents; + +public interface IDocument { - public interface IDocument - { - DocumentVersion Version { get; set; } - } + DocumentVersion Version { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/AbstractLocator.cs b/Mongo.Migration/Documents/Locators/AbstractLocator.cs index fcc1587..c0c0138 100644 --- a/Mongo.Migration/Documents/Locators/AbstractLocator.cs +++ b/Mongo.Migration/Documents/Locators/AbstractLocator.cs @@ -1,28 +1,27 @@ -namespace Mongo.Migration.Documents.Locators +namespace Mongo.Migration.Documents.Locators; + +public abstract class AbstractLocator : ILocator + where TReturnType : struct + where TTypeIdentifier : class { - public abstract class AbstractLocator : ILocator - where TReturnType : struct - where TTypeIdentifier : class - { - private IDictionary? _locatesDictionary; + private IDictionary? _locatesDictionary; - protected IDictionary LocatesDictionary + protected IDictionary LocatesDictionary + { + get { - get + if (_locatesDictionary == null) { - if (_locatesDictionary == null) - { - Locate(); - } - - return _locatesDictionary!; + Locate(); } - set => _locatesDictionary = value; + return _locatesDictionary!; } - public abstract TReturnType? GetLocateOrNull(TTypeIdentifier identifier); - - public abstract void Locate(); + set => _locatesDictionary = value; } + + public abstract TReturnType? GetLocateOrNull(TTypeIdentifier identifier); + + public abstract void Locate(); } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/CollectionLocator.cs b/Mongo.Migration/Documents/Locators/CollectionLocator.cs index e15bae1..f06144f 100644 --- a/Mongo.Migration/Documents/Locators/CollectionLocator.cs +++ b/Mongo.Migration/Documents/Locators/CollectionLocator.cs @@ -1,43 +1,42 @@ using Mongo.Migration.Documents.Attributes; -namespace Mongo.Migration.Documents.Locators +namespace Mongo.Migration.Documents.Locators; + +public class CollectionLocator : AbstractLocator, ICollectionLocator { - public class CollectionLocator : AbstractLocator, ICollectionLocator + public override CollectionLocationInformation? GetLocateOrNull(Type identifier) { - public override CollectionLocationInformation? GetLocateOrNull(Type identifier) + if (!LocatesDictionary.ContainsKey(identifier)) { - if (!LocatesDictionary.ContainsKey(identifier)) - { - return null; - } - - LocatesDictionary.TryGetValue(identifier, out var value); - return value; + return null; } - public override void Locate() - { - var types = - from a in AppDomain.CurrentDomain.GetAssemblies() - from t in a.GetTypes() - let attributes = t.GetCustomAttributes(typeof(CollectionLocation), true) - where attributes != null && attributes.Length > 0 - select new { Type = t, Attributes = attributes.Cast() }; - - var versions = new Dictionary(); - - foreach (var type in types) - { - var version = type.Attributes.First().CollectionInformation; - versions.Add(type.Type, version); - } - - LocatesDictionary = versions; - } + LocatesDictionary.TryGetValue(identifier, out var value); + return value; + } + + public override void Locate() + { + var types = + from a in AppDomain.CurrentDomain.GetAssemblies() + from t in a.GetTypes() + let attributes = t.GetCustomAttributes(typeof(CollectionLocation), true) + where attributes != null && attributes.Length > 0 + select new { Type = t, Attributes = attributes.Cast() }; + + var versions = new Dictionary(); - public IDictionary GetLocatesOrEmpty() + foreach (var type in types) { - return LocatesDictionary; + var version = type.Attributes.First().CollectionInformation; + versions.Add(type.Type, version); } + + LocatesDictionary = versions; + } + + public IDictionary GetLocatesOrEmpty() + { + return LocatesDictionary; } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/ICollectionLocator.cs b/Mongo.Migration/Documents/Locators/ICollectionLocator.cs index d2d0869..d348d90 100644 --- a/Mongo.Migration/Documents/Locators/ICollectionLocator.cs +++ b/Mongo.Migration/Documents/Locators/ICollectionLocator.cs @@ -1,9 +1,8 @@ using Mongo.Migration.Documents.Attributes; -namespace Mongo.Migration.Documents.Locators +namespace Mongo.Migration.Documents.Locators; + +public interface ICollectionLocator : ILocator { - public interface ICollectionLocator : ILocator - { - IDictionary GetLocatesOrEmpty(); - } + IDictionary GetLocatesOrEmpty(); } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/ILocator.cs b/Mongo.Migration/Documents/Locators/ILocator.cs index bd7d7ac..6e21ebe 100644 --- a/Mongo.Migration/Documents/Locators/ILocator.cs +++ b/Mongo.Migration/Documents/Locators/ILocator.cs @@ -1,11 +1,10 @@ -namespace Mongo.Migration.Documents.Locators +namespace Mongo.Migration.Documents.Locators; + +public interface ILocator + where TReturnType : struct + where TTypeIdentifier : class { - public interface ILocator - where TReturnType : struct - where TTypeIdentifier : class - { - TReturnType? GetLocateOrNull(TTypeIdentifier identifier); + TReturnType? GetLocateOrNull(TTypeIdentifier identifier); - void Locate(); - } + void Locate(); } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/IRuntimeVersionLocator.cs b/Mongo.Migration/Documents/Locators/IRuntimeVersionLocator.cs index 00223bb..ef54d48 100644 --- a/Mongo.Migration/Documents/Locators/IRuntimeVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/IRuntimeVersionLocator.cs @@ -1,6 +1,5 @@ -namespace Mongo.Migration.Documents.Locators +namespace Mongo.Migration.Documents.Locators; + +internal interface IRuntimeVersionLocator : ILocator { - internal interface IRuntimeVersionLocator : ILocator - { - } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/IStartUpVersionLocator.cs b/Mongo.Migration/Documents/Locators/IStartUpVersionLocator.cs index 1259981..2e74882 100644 --- a/Mongo.Migration/Documents/Locators/IStartUpVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/IStartUpVersionLocator.cs @@ -1,6 +1,5 @@ -namespace Mongo.Migration.Documents.Locators +namespace Mongo.Migration.Documents.Locators; + +internal interface IStartUpVersionLocator : ILocator { - internal interface IStartUpVersionLocator : ILocator - { - } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs index 4fb358f..b33e6fd 100644 --- a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs @@ -1,38 +1,37 @@ using Mongo.Migration.Documents.Attributes; -namespace Mongo.Migration.Documents.Locators +namespace Mongo.Migration.Documents.Locators; + +internal class RuntimeVersionLocator : AbstractLocator, IRuntimeVersionLocator { - internal class RuntimeVersionLocator : AbstractLocator, IRuntimeVersionLocator + public override DocumentVersion? GetLocateOrNull(Type identifier) { - public override DocumentVersion? GetLocateOrNull(Type identifier) + if (!LocatesDictionary.ContainsKey(identifier)) { - if (!LocatesDictionary.ContainsKey(identifier)) - { - return null; - } - - LocatesDictionary.TryGetValue(identifier, out var value); - return value; + return null; } - public override void Locate() - { - var types = - from a in AppDomain.CurrentDomain.GetAssemblies() - from t in a.GetTypes() - let attributes = t.GetCustomAttributes(typeof(RuntimeVersion), true) - where attributes != null && attributes.Length > 0 - select new { Type = t, Attributes = attributes.Cast() }; + LocatesDictionary.TryGetValue(identifier, out var value); + return value; + } - var versions = new Dictionary(); + public override void Locate() + { + var types = + from a in AppDomain.CurrentDomain.GetAssemblies() + from t in a.GetTypes() + let attributes = t.GetCustomAttributes(typeof(RuntimeVersion), true) + where attributes != null && attributes.Length > 0 + select new { Type = t, Attributes = attributes.Cast() }; - foreach (var type in types) - { - var version = type.Attributes.First().Version; - versions.Add(type.Type, version); - } + var versions = new Dictionary(); - LocatesDictionary = versions; + foreach (var type in types) + { + var version = type.Attributes.First().Version; + versions.Add(type.Type, version); } + + LocatesDictionary = versions; } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs index 5df855f..156964b 100644 --- a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs @@ -1,38 +1,37 @@ using Mongo.Migration.Documents.Attributes; -namespace Mongo.Migration.Documents.Locators +namespace Mongo.Migration.Documents.Locators; + +internal class StartUpVersionLocator : AbstractLocator, IStartUpVersionLocator { - internal class StartUpVersionLocator : AbstractLocator, IStartUpVersionLocator + public override DocumentVersion? GetLocateOrNull(Type identifier) { - public override DocumentVersion? GetLocateOrNull(Type identifier) + if (!LocatesDictionary.ContainsKey(identifier)) { - if (!LocatesDictionary.ContainsKey(identifier)) - { - return null; - } - - LocatesDictionary.TryGetValue(identifier, out var value); - return value; + return null; } - public override void Locate() - { - var types = - from a in AppDomain.CurrentDomain.GetAssemblies() - from t in a.GetTypes() - let attributes = t.GetCustomAttributes(typeof(StartUpVersion), true) - where attributes != null && attributes.Length > 0 - select new { Type = t, Attributes = attributes.Cast() }; + LocatesDictionary.TryGetValue(identifier, out var value); + return value; + } - var versions = new Dictionary(); + public override void Locate() + { + var types = + from a in AppDomain.CurrentDomain.GetAssemblies() + from t in a.GetTypes() + let attributes = t.GetCustomAttributes(typeof(StartUpVersion), true) + where attributes != null && attributes.Length > 0 + select new { Type = t, Attributes = attributes.Cast() }; - foreach (var type in types) - { - var version = type.Attributes.First().Version; - versions.Add(type.Type, version); - } + var versions = new Dictionary(); - LocatesDictionary = versions; + foreach (var type in types) + { + var version = type.Attributes.First().Version; + versions.Add(type.Type, version); } + + LocatesDictionary = versions; } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs b/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs index be2fef5..c66df73 100644 --- a/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs +++ b/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs @@ -1,23 +1,22 @@ using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Serializers; -namespace Mongo.Migration.Documents.Serializers +namespace Mongo.Migration.Documents.Serializers; + +public class DocumentVersionSerializer : SerializerBase { - public class DocumentVersionSerializer : SerializerBase + public override void Serialize( + BsonSerializationContext context, + BsonSerializationArgs args, + DocumentVersion value) { - public override void Serialize( - BsonSerializationContext context, - BsonSerializationArgs args, - DocumentVersion value) - { - var versionString = $"{value.Major}.{value.Minor}.{value.Revision}"; - context.Writer.WriteString(versionString); - } + var versionString = $"{value.Major}.{value.Minor}.{value.Revision}"; + context.Writer.WriteString(versionString); + } - public override DocumentVersion Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) - { - var versionString = context.Reader.ReadString(); - return new(versionString); - } + public override DocumentVersion Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + var versionString = context.Reader.ReadString(); + return new(versionString); } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/AlreadyInitializedException.cs b/Mongo.Migration/Exceptions/AlreadyInitializedException.cs index 1aed909..2e04e53 100644 --- a/Mongo.Migration/Exceptions/AlreadyInitializedException.cs +++ b/Mongo.Migration/Exceptions/AlreadyInitializedException.cs @@ -1,10 +1,9 @@ -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions; + +public class AlreadyInitializedException : Exception { - public class AlreadyInitializedException : Exception + public AlreadyInitializedException() + : base(string.Format(ErrorTexts.AlreadyInitialized)) { - public AlreadyInitializedException() - : base(string.Format(ErrorTexts.AlreadyInitialized)) - { - } } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/DuplicateVersionException.cs b/Mongo.Migration/Exceptions/DuplicateVersionException.cs index 7f83624..849250c 100644 --- a/Mongo.Migration/Exceptions/DuplicateVersionException.cs +++ b/Mongo.Migration/Exceptions/DuplicateVersionException.cs @@ -1,10 +1,9 @@ -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions; + +internal class DuplicateVersionException : Exception { - internal class DuplicateVersionException : Exception + public DuplicateVersionException(string typeName, string version) + : base(string.Format(ErrorTexts.DuplicateVersion, typeName, version)) { - public DuplicateVersionException(string typeName, string version) - : base(string.Format(ErrorTexts.DuplicateVersion, typeName, version)) - { - } } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/InvalidVersionValueException.cs b/Mongo.Migration/Exceptions/InvalidVersionValueException.cs index 45e0f95..bae8505 100644 --- a/Mongo.Migration/Exceptions/InvalidVersionValueException.cs +++ b/Mongo.Migration/Exceptions/InvalidVersionValueException.cs @@ -1,11 +1,10 @@ -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions; + +public class InvalidVersionValueException : Exception { - public class InvalidVersionValueException : Exception + public InvalidVersionValueException(string value) + : + base(string.Format(ErrorTexts.InvalidVersionValue, value)) { - public InvalidVersionValueException(string value) - : - base(string.Format(ErrorTexts.InvalidVersionValue, value)) - { - } } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs b/Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs index 127dafa..68eac02 100644 --- a/Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs +++ b/Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs @@ -1,11 +1,10 @@ -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions; + +internal class MongoMigrationDatabaseNotFound + : Exception { - internal class MongoMigrationDatabaseNotFound - : Exception + public MongoMigrationDatabaseNotFound(string databaseName, string valueConnectionString) + : base(string.Format(ErrorTexts.ConnectionCheckError, databaseName, valueConnectionString)) { - public MongoMigrationDatabaseNotFound(string databaseName, string valueConnectionString) - : base(string.Format(ErrorTexts.ConnectionCheckError, databaseName, valueConnectionString)) - { - } } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs b/Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs index cf51bd7..21c2bab 100644 --- a/Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs +++ b/Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs @@ -1,10 +1,9 @@ -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions; + +public class MongoMigrationNoMongoClientException : Exception { - public class MongoMigrationNoMongoClientException : Exception + public MongoMigrationNoMongoClientException() + : base(string.Format(ErrorTexts.NoMongoClient)) { - public MongoMigrationNoMongoClientException() - : base(string.Format(ErrorTexts.NoMongoClient)) - { - } } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs b/Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs index edc9480..f4c500a 100644 --- a/Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs +++ b/Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs @@ -1,6 +1,5 @@ -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions; + +internal class NoDatabaseNameFoundException : Exception { - internal class NoDatabaseNameFoundException : Exception - { - } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/NoMigrationsFoundException.cs b/Mongo.Migration/Exceptions/NoMigrationsFoundException.cs index 5d53dc6..517ad9b 100644 --- a/Mongo.Migration/Exceptions/NoMigrationsFoundException.cs +++ b/Mongo.Migration/Exceptions/NoMigrationsFoundException.cs @@ -1,6 +1,5 @@ -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions; + +public class NoMigrationsFoundException : Exception { - public class NoMigrationsFoundException : Exception - { - } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/VersionStringToLongException.cs b/Mongo.Migration/Exceptions/VersionStringToLongException.cs index 9e9e0bd..1abf975 100644 --- a/Mongo.Migration/Exceptions/VersionStringToLongException.cs +++ b/Mongo.Migration/Exceptions/VersionStringToLongException.cs @@ -1,11 +1,10 @@ -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions; + +public class VersionStringToLongException : Exception { - public class VersionStringToLongException : Exception + public VersionStringToLongException(string version) + : + base(string.Format(ErrorTexts.VersionStringToLong, version)) { - public VersionStringToLongException(string version) - : - base(string.Format(ErrorTexts.VersionStringToLong, version)) - { - } } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/VersionViolationException.cs b/Mongo.Migration/Exceptions/VersionViolationException.cs index be88ad7..3af053d 100644 --- a/Mongo.Migration/Exceptions/VersionViolationException.cs +++ b/Mongo.Migration/Exceptions/VersionViolationException.cs @@ -1,15 +1,14 @@ using Mongo.Migration.Documents; -namespace Mongo.Migration.Exceptions +namespace Mongo.Migration.Exceptions; + +public class VersionViolationException : Exception { - public class VersionViolationException : Exception + public VersionViolationException( + DocumentVersion currentVersion, + DocumentVersion documentVersion, + DocumentVersion latestVersion) + : base(string.Format(ErrorTexts.DuplicateVersion, currentVersion, documentVersion, latestVersion)) { - public VersionViolationException( - DocumentVersion currentVersion, - DocumentVersion documentVersion, - DocumentVersion latestVersion) - : base(string.Format(ErrorTexts.DuplicateVersion, currentVersion, documentVersion, latestVersion)) - { - } } } \ No newline at end of file diff --git a/Mongo.Migration/Extensions/EnumerableExtensions.cs b/Mongo.Migration/Extensions/EnumerableExtensions.cs index 968c658..1d84bdd 100644 --- a/Mongo.Migration/Extensions/EnumerableExtensions.cs +++ b/Mongo.Migration/Extensions/EnumerableExtensions.cs @@ -1,50 +1,49 @@ using Mongo.Migration.Exceptions; using Mongo.Migration.Migrations; -namespace Mongo.Migration.Extensions +namespace Mongo.Migration.Extensions; + +internal static class EnumerableExtensions { - internal static class EnumerableExtensions + internal static IEnumerable CheckForDuplicates(this IEnumerable list) + where TMigrationType : class, IMigration { - internal static IEnumerable CheckForDuplicates(this IEnumerable list) - where TMigrationType : class, IMigration + var uniqueHashes = new HashSet(); + foreach (var element in list) { - var uniqueHashes = new HashSet(); - foreach (var element in list) + var version = element.Version.ToString(); + if (uniqueHashes.Add(version)) { - var version = element.Version.ToString(); - if (uniqueHashes.Add(version)) - { - continue; - } - - var typeName = element.GetType().Name; - throw new DuplicateVersionException(typeName, element.Version); + continue; } - return list; + var typeName = element.GetType().Name; + throw new DuplicateVersionException(typeName, element.Version); } - internal static IDictionary> ToMigrationDictionary( - this IEnumerable migrations) - where TMigrationType : class, IMigration - { - var dictonary = new Dictionary>(); - var list = migrations.ToList(); - var types = (from m in list select m.Type).Distinct(); + return list; + } - foreach (var type in types) + internal static IDictionary> ToMigrationDictionary( + this IEnumerable migrations) + where TMigrationType : class, IMigration + { + var dictonary = new Dictionary>(); + var list = migrations.ToList(); + var types = (from m in list select m.Type).Distinct(); + + foreach (var type in types) + { + if (dictonary.ContainsKey(type)) { - if (dictonary.ContainsKey(type)) - { - continue; - } - - var uniqueMigrations = - list.Where(m => m.Type == type).CheckForDuplicates().OrderBy(m => m.Version).ToList(); - dictonary.Add(type, uniqueMigrations); + continue; } - return dictonary; + var uniqueMigrations = + list.Where(m => m.Type == type).CheckForDuplicates().OrderBy(m => m.Version).ToList(); + dictonary.Add(type, uniqueMigrations); } + + return dictonary; } } \ No newline at end of file diff --git a/Mongo.Migration/IMongoMigration.cs b/Mongo.Migration/IMongoMigration.cs index 1e610d7..e73c868 100644 --- a/Mongo.Migration/IMongoMigration.cs +++ b/Mongo.Migration/IMongoMigration.cs @@ -1,7 +1,6 @@ -namespace Mongo.Migration +namespace Mongo.Migration; + +public interface IMongoMigration { - public interface IMongoMigration - { - void Run(); - } + void Run(); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/DatabaseMigration.cs b/Mongo.Migration/Migrations/Database/DatabaseMigration.cs index be64f33..dccf495 100644 --- a/Mongo.Migration/Migrations/Database/DatabaseMigration.cs +++ b/Mongo.Migration/Migrations/Database/DatabaseMigration.cs @@ -2,21 +2,20 @@ using MongoDB.Driver; -namespace Mongo.Migration.Migrations.Database +namespace Mongo.Migration.Migrations.Database; + +public abstract class DatabaseMigration : IDatabaseMigration { - public abstract class DatabaseMigration : IDatabaseMigration + protected DatabaseMigration(string version) { - protected DatabaseMigration(string version) - { - Version = version; - } + Version = version; + } - public DocumentVersion Version { get; } + public DocumentVersion Version { get; } - public Type Type => typeof(DatabaseMigration); + public Type Type => typeof(DatabaseMigration); - public abstract void Up(IMongoDatabase db); + public abstract void Up(IMongoDatabase db); - public abstract void Down(IMongoDatabase db); - } + public abstract void Down(IMongoDatabase db); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs index 9d1450c..7d6f1ec 100644 --- a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs @@ -4,93 +4,92 @@ using Mongo.Migration.Services; using MongoDB.Driver; -namespace Mongo.Migration.Migrations.Database +namespace Mongo.Migration.Migrations.Database; + +internal class DatabaseMigrationRunner : IDatabaseMigrationRunner { - internal class DatabaseMigrationRunner : IDatabaseMigrationRunner - { - private readonly IDatabaseVersionService _databaseVersionService; + private readonly IDatabaseVersionService _databaseVersionService; - private readonly ILogger _logger; + private readonly ILogger _logger; - private readonly Type _databaseMigrationType = typeof(DatabaseMigration); + private readonly Type _databaseMigrationType = typeof(DatabaseMigration); - private readonly IDatabaseTypeMigrationDependencyLocator _migrationLocator; + private readonly IDatabaseTypeMigrationDependencyLocator _migrationLocator; - public DatabaseMigrationRunner( - IDatabaseTypeMigrationDependencyLocator migrationLocator, - IDatabaseVersionService databaseVersionService, - ILogger logger) - { - _migrationLocator = migrationLocator; - _databaseVersionService = databaseVersionService; - _logger = logger; - } + public DatabaseMigrationRunner( + IDatabaseTypeMigrationDependencyLocator migrationLocator, + IDatabaseVersionService databaseVersionService, + ILogger logger) + { + _migrationLocator = migrationLocator; + _databaseVersionService = databaseVersionService; + _logger = logger; + } + + public void Run(IMongoDatabase db) + { + _logger.LogInformation("Database migration started."); + var databaseVersion = _databaseVersionService.GetLatestDatabaseVersion(db); + var currentOrLatest = _databaseVersionService.GetCurrentOrLatestMigrationVersion(); - public void Run(IMongoDatabase db) + if (databaseVersion == currentOrLatest) { - _logger.LogInformation("Database migration started."); - var databaseVersion = _databaseVersionService.GetLatestDatabaseVersion(db); - var currentOrLatest = _databaseVersionService.GetCurrentOrLatestMigrationVersion(); + return; + } - if (databaseVersion == currentOrLatest) - { - return; - } + MigrateUpOrDown(db, databaseVersion, currentOrLatest); + _logger.LogInformation("Database migration finished."); + } - MigrateUpOrDown(db, databaseVersion, currentOrLatest); - _logger.LogInformation("Database migration finished."); + private void MigrateUpOrDown( + IMongoDatabase db, + DocumentVersion databaseVersion, + DocumentVersion to) + { + if (databaseVersion > to) + { + MigrateDown(db, databaseVersion, to); + return; } - private void MigrateUpOrDown( - IMongoDatabase db, - DocumentVersion databaseVersion, - DocumentVersion to) - { - if (databaseVersion > to) - { - MigrateDown(db, databaseVersion, to); - return; - } + MigrateUp(db, databaseVersion, to); + } - MigrateUp(db, databaseVersion, to); - } + private void MigrateUp(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion) + { + var migrations = _migrationLocator.GetMigrationsFromTo(_databaseMigrationType, currentVersion, toVersion).ToList(); - private void MigrateUp(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion) + foreach (var migration in migrations) { - var migrations = _migrationLocator.GetMigrationsFromTo(_databaseMigrationType, currentVersion, toVersion).ToList(); - - foreach (var migration in migrations) - { - _logger.LogInformation("Database Migration Up: {Type}:{Version} ", currentVersion.GetType(), migration.Version); + _logger.LogInformation("Database Migration Up: {Type}:{Version} ", currentVersion.GetType(), migration.Version); - migration.Up(db); - _databaseVersionService.Save(db, migration); + migration.Up(db); + _databaseVersionService.Save(db, migration); - _logger.LogInformation("Database Migration Up finished successful: {Type}:{Version} ", migration.GetType(), migration.Version); - } + _logger.LogInformation("Database Migration Up finished successful: {Type}:{Version} ", migration.GetType(), migration.Version); } + } - private void MigrateDown(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion) - { - var migrations = _migrationLocator - .GetMigrationsGtEq(_databaseMigrationType, toVersion) - .OrderByDescending(m => m.Version) - .ToList(); + private void MigrateDown(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion) + { + var migrations = _migrationLocator + .GetMigrationsGtEq(_databaseMigrationType, toVersion) + .OrderByDescending(m => m.Version) + .ToList(); - foreach (var migration in migrations) + foreach (var migration in migrations) + { + if (migration.Version == toVersion) { - if (migration.Version == toVersion) - { - break; - } + break; + } - _logger.LogInformation("Database Migration Down: {Type}:{Version} ", migration.GetType(), migration.Version); + _logger.LogInformation("Database Migration Down: {Type}:{Version} ", migration.GetType(), migration.Version); - migration.Down(db); - _databaseVersionService.Remove(db, migration); + migration.Down(db); + _databaseVersionService.Remove(db, migration); - _logger.LogInformation("Database Migration Down finished successful: {Type}:{Version} ", migration.GetType(), migration.Version); - } + _logger.LogInformation("Database Migration Down finished successful: {Type}:{Version} ", migration.GetType(), migration.Version); } } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/IDatabaseMigration.cs b/Mongo.Migration/Migrations/Database/IDatabaseMigration.cs index 79e87b5..95c0dfa 100644 --- a/Mongo.Migration/Migrations/Database/IDatabaseMigration.cs +++ b/Mongo.Migration/Migrations/Database/IDatabaseMigration.cs @@ -1,11 +1,10 @@ using MongoDB.Driver; -namespace Mongo.Migration.Migrations.Database +namespace Mongo.Migration.Migrations.Database; + +public interface IDatabaseMigration : IMigration { - public interface IDatabaseMigration : IMigration - { - void Up(IMongoDatabase db); + void Up(IMongoDatabase db); - void Down(IMongoDatabase db); - } + void Down(IMongoDatabase db); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs index d0a6086..5b3d71c 100644 --- a/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs @@ -1,9 +1,8 @@ using MongoDB.Driver; -namespace Mongo.Migration.Migrations.Database +namespace Mongo.Migration.Migrations.Database; + +internal interface IDatabaseMigrationRunner { - internal interface IDatabaseMigrationRunner - { - void Run(IMongoDatabase db); - } + void Run(IMongoDatabase db); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/IStartUpDatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/IStartUpDatabaseMigrationRunner.cs index 94411da..60786cc 100644 --- a/Mongo.Migration/Migrations/Database/IStartUpDatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/IStartUpDatabaseMigrationRunner.cs @@ -1,7 +1,6 @@ -namespace Mongo.Migration.Migrations.Database +namespace Mongo.Migration.Migrations.Database; + +internal interface IStartUpDatabaseMigrationRunner { - internal interface IStartUpDatabaseMigrationRunner - { - void RunAll(); - } + void RunAll(); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/MigrationHistory.cs b/Mongo.Migration/Migrations/Database/MigrationHistory.cs index 6b940ab..cd1ed01 100644 --- a/Mongo.Migration/Migrations/Database/MigrationHistory.cs +++ b/Mongo.Migration/Migrations/Database/MigrationHistory.cs @@ -2,14 +2,13 @@ using MongoDB.Bson; -namespace Mongo.Migration.Migrations.Database +namespace Mongo.Migration.Migrations.Database; + +public class MigrationHistory { - public class MigrationHistory - { - public ObjectId Id { get; set; } + public ObjectId Id { get; set; } - public required string MigrationId { get; set; } + public required string MigrationId { get; set; } - public DocumentVersion Version { get; set; } - } + public DocumentVersion Version { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs index 3b8740c..3756bf8 100644 --- a/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs @@ -5,87 +5,86 @@ using MongoDB.Driver; -namespace Mongo.Migration.Migrations.Database +namespace Mongo.Migration.Migrations.Database; + +internal class StartUpDatabaseMigrationRunner : IStartUpDatabaseMigrationRunner { - internal class StartUpDatabaseMigrationRunner : IStartUpDatabaseMigrationRunner - { - private readonly IMongoClient _client; + private readonly IMongoClient _client; - private readonly ICollectionLocator _collectionLocator; + private readonly ICollectionLocator _collectionLocator; - private readonly string _databaseName; + private readonly string _databaseName; - private readonly IDatabaseMigrationRunner _migrationRunner; + private readonly IDatabaseMigrationRunner _migrationRunner; - public StartUpDatabaseMigrationRunner( - IMongoMigrationSettings settings, - ICollectionLocator collectionLocator, - IDatabaseMigrationRunner migrationRunner) - : this( - collectionLocator, - migrationRunner) + public StartUpDatabaseMigrationRunner( + IMongoMigrationSettings settings, + ICollectionLocator collectionLocator, + IDatabaseMigrationRunner migrationRunner) + : this( + collectionLocator, + migrationRunner) + { + if (settings.ConnectionString == null && settings.Database == null || settings.ClientSettings == null) { - if (settings.ConnectionString == null && settings.Database == null || settings.ClientSettings == null) - { - throw new MongoMigrationNoMongoClientException(); - } - - if (settings.ClientSettings != null) - { - _client = new MongoClient(settings.ClientSettings); - } - else - { - _client = new MongoClient(settings.ConnectionString); - } - - _databaseName = settings.Database; + throw new MongoMigrationNoMongoClientException(); } - public StartUpDatabaseMigrationRunner( - IMongoClient client, - IMongoMigrationSettings settings, - ICollectionLocator collectionLocator, - IDatabaseMigrationRunner migrationRunner) - : this( - collectionLocator, - migrationRunner) + if (settings.ClientSettings != null) + { + _client = new MongoClient(settings.ClientSettings); + } + else { - _client = client; - if (settings.ConnectionString == null && settings.Database == null) - { - return; - } - _client = new MongoClient(settings.ConnectionString); - _databaseName = settings.Database; } - private StartUpDatabaseMigrationRunner( - ICollectionLocator collectionLocator, - IDatabaseMigrationRunner migrationRunner) + _databaseName = settings.Database; + } + + public StartUpDatabaseMigrationRunner( + IMongoClient client, + IMongoMigrationSettings settings, + ICollectionLocator collectionLocator, + IDatabaseMigrationRunner migrationRunner) + : this( + collectionLocator, + migrationRunner) + { + _client = client; + if (settings.ConnectionString == null && settings.Database == null) { - _collectionLocator = collectionLocator; - _migrationRunner = migrationRunner; + return; } - public void RunAll() - { - var locations = _collectionLocator.GetLocatesOrEmpty().ToList(); - var information = locations.FirstOrDefault().Value; - var databaseName = GetDatabaseOrDefault(information); + _client = new MongoClient(settings.ConnectionString); + _databaseName = settings.Database; + } - _migrationRunner.Run(_client.GetDatabase(databaseName)); - } + private StartUpDatabaseMigrationRunner( + ICollectionLocator collectionLocator, + IDatabaseMigrationRunner migrationRunner) + { + _collectionLocator = collectionLocator; + _migrationRunner = migrationRunner; + } - private string GetDatabaseOrDefault(CollectionLocationInformation information) - { - if (string.IsNullOrEmpty(_databaseName) && string.IsNullOrEmpty(information.Database)) - { - throw new NoDatabaseNameFoundException(); - } + public void RunAll() + { + var locations = _collectionLocator.GetLocatesOrEmpty().ToList(); + var information = locations.FirstOrDefault().Value; + var databaseName = GetDatabaseOrDefault(information); - return string.IsNullOrEmpty(information.Database) ? _databaseName : information.Database; + _migrationRunner.Run(_client.GetDatabase(databaseName)); + } + + private string GetDatabaseOrDefault(CollectionLocationInformation information) + { + if (string.IsNullOrEmpty(_databaseName) && string.IsNullOrEmpty(information.Database)) + { + throw new NoDatabaseNameFoundException(); } + + return string.IsNullOrEmpty(information.Database) ? _databaseName : information.Database; } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/DocumentMigration.cs b/Mongo.Migration/Migrations/Document/DocumentMigration.cs index 70b2116..1de5336 100644 --- a/Mongo.Migration/Migrations/Document/DocumentMigration.cs +++ b/Mongo.Migration/Migrations/Document/DocumentMigration.cs @@ -2,22 +2,21 @@ using MongoDB.Bson; -namespace Mongo.Migration.Migrations.Document +namespace Mongo.Migration.Migrations.Document; + +public abstract class DocumentMigration : IDocumentMigration + where TClass : class, IDocument { - public abstract class DocumentMigration : IDocumentMigration - where TClass : class, IDocument + protected DocumentMigration(string version) { - protected DocumentMigration(string version) - { - Version = version; - } + Version = version; + } - public DocumentVersion Version { get; } + public DocumentVersion Version { get; } - public Type Type => typeof(TClass); + public Type Type => typeof(TClass); - public abstract void Up(BsonDocument document); + public abstract void Up(BsonDocument document); - public abstract void Down(BsonDocument document); - } + public abstract void Down(BsonDocument document); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs index 20bb35f..dc3e8f4 100644 --- a/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs @@ -4,91 +4,90 @@ using MongoDB.Bson; -namespace Mongo.Migration.Migrations.Document +namespace Mongo.Migration.Migrations.Document; + +internal class DocumentMigrationRunner : IDocumentMigrationRunner { - internal class DocumentMigrationRunner : IDocumentMigrationRunner + private readonly IDocumentVersionService _documentVersionService; + + private readonly IMigrationLocator _migrationLocator; + + public DocumentMigrationRunner(IMigrationLocator migrationLocator, IDocumentVersionService documentVersionService) { - private readonly IDocumentVersionService _documentVersionService; + _migrationLocator = migrationLocator; + _documentVersionService = documentVersionService; + } - private readonly IMigrationLocator _migrationLocator; + public void Run(Type type, BsonDocument document) + { + var documentVersion = _documentVersionService.GetVersionOrDefault(document); + var currentOrLatest = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); - public DocumentMigrationRunner(IMigrationLocator migrationLocator, IDocumentVersionService documentVersionService) + if (documentVersion == currentOrLatest) { - _migrationLocator = migrationLocator; - _documentVersionService = documentVersionService; + return; } - public void Run(Type type, BsonDocument document) - { - var documentVersion = _documentVersionService.GetVersionOrDefault(document); - var currentOrLatest = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); - - if (documentVersion == currentOrLatest) - { - return; - } + MigrateUpOrDown(type, document, documentVersion, currentOrLatest); + } - MigrateUpOrDown(type, document, documentVersion, currentOrLatest); - } + public void Run(Type type, BsonDocument document, DocumentVersion to) + { + var documentVersion = _documentVersionService.GetVersionOrDefault(document); + var currentOrLatest = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); - public void Run(Type type, BsonDocument document, DocumentVersion to) + if (documentVersion == to || documentVersion == currentOrLatest) { - var documentVersion = _documentVersionService.GetVersionOrDefault(document); - var currentOrLatest = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); + return; + } - if (documentVersion == to || documentVersion == currentOrLatest) - { - return; - } + MigrateUpOrDown(type, document, documentVersion, to); + } - MigrateUpOrDown(type, document, documentVersion, to); + private void MigrateUpOrDown( + Type type, + BsonDocument document, + DocumentVersion documentVersion, + DocumentVersion to) + { + if (documentVersion > to) + { + MigrateDown(type, document, to); + return; } - private void MigrateUpOrDown( - Type type, - BsonDocument document, - DocumentVersion documentVersion, - DocumentVersion to) - { - if (documentVersion > to) - { - MigrateDown(type, document, to); - return; - } + MigrateUp(type, document, documentVersion, to); + } - MigrateUp(type, document, documentVersion, to); - } + private void MigrateUp(Type type, BsonDocument document, DocumentVersion version, DocumentVersion toVersion) + { + var migrations = _migrationLocator.GetMigrationsFromTo(type, version, toVersion).ToList(); - private void MigrateUp(Type type, BsonDocument document, DocumentVersion version, DocumentVersion toVersion) + foreach (var migration in migrations) { - var migrations = _migrationLocator.GetMigrationsFromTo(type, version, toVersion).ToList(); - - foreach (var migration in migrations) - { - migration.Up(document); - _documentVersionService.SetVersion(document, migration.Version); - } + migration.Up(document); + _documentVersionService.SetVersion(document, migration.Version); } + } - private void MigrateDown(Type type, BsonDocument document, DocumentVersion version) - { - var migrations = _migrationLocator - .GetMigrationsGtEq(type, version) - .OrderByDescending(m => m.Version) - .ToList(); + private void MigrateDown(Type type, BsonDocument document, DocumentVersion version) + { + var migrations = _migrationLocator + .GetMigrationsGtEq(type, version) + .OrderByDescending(m => m.Version) + .ToList(); - for (var m = 0; m < migrations.Count; m++) + for (var m = 0; m < migrations.Count; m++) + { + if (version == migrations[m].Version) { - if (version == migrations[m].Version) - { - break; - } + break; + } - migrations[m].Down(document); + migrations[m].Down(document); - var docVersion = _documentVersionService.DetermineLastVersion(version, migrations, m); - _documentVersionService.SetVersion(document, docVersion); - } + var docVersion = _documentVersionService.DetermineLastVersion(version, migrations, m); + _documentVersionService.SetVersion(document, docVersion); } } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/IDocumentMigration.cs b/Mongo.Migration/Migrations/Document/IDocumentMigration.cs index f0fff23..931ed7a 100644 --- a/Mongo.Migration/Migrations/Document/IDocumentMigration.cs +++ b/Mongo.Migration/Migrations/Document/IDocumentMigration.cs @@ -1,11 +1,10 @@ using MongoDB.Bson; -namespace Mongo.Migration.Migrations.Document +namespace Mongo.Migration.Migrations.Document; + +public interface IDocumentMigration : IMigration { - public interface IDocumentMigration : IMigration - { - void Up(BsonDocument document); + void Up(BsonDocument document); - void Down(BsonDocument document); - } + void Down(BsonDocument document); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs index a7dfdc9..6a922e1 100644 --- a/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs @@ -2,12 +2,11 @@ using MongoDB.Bson; -namespace Mongo.Migration.Migrations.Document +namespace Mongo.Migration.Migrations.Document; + +internal interface IDocumentMigrationRunner { - internal interface IDocumentMigrationRunner - { - void Run(Type type, BsonDocument document, DocumentVersion to); + void Run(Type type, BsonDocument document, DocumentVersion to); - void Run(Type type, BsonDocument document); - } + void Run(Type type, BsonDocument document); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs index f308d93..671bd48 100644 --- a/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs @@ -1,7 +1,6 @@ -namespace Mongo.Migration.Migrations.Document +namespace Mongo.Migration.Migrations.Document; + +internal interface IStartUpDocumentMigrationRunner { - internal interface IStartUpDocumentMigrationRunner - { - void RunAll(); - } + void RunAll(); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs index 4625bc5..9afa93b 100644 --- a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs @@ -7,144 +7,143 @@ using MongoDB.Bson; using MongoDB.Driver; -namespace Mongo.Migration.Migrations.Document +namespace Mongo.Migration.Migrations.Document; + +internal class StartUpDocumentMigrationRunner : IStartUpDocumentMigrationRunner { - internal class StartUpDocumentMigrationRunner : IStartUpDocumentMigrationRunner - { - private readonly IMongoClient _client; + private readonly IMongoClient _client; - private readonly ICollectionLocator _collectionLocator; + private readonly ICollectionLocator _collectionLocator; - private readonly string? _databaseName; + private readonly string? _databaseName; - private readonly IDocumentVersionService _documentVersionService; + private readonly IDocumentVersionService _documentVersionService; - private readonly IDocumentMigrationRunner _migrationRunner; + private readonly IDocumentMigrationRunner _migrationRunner; - public StartUpDocumentMigrationRunner( - IMongoMigrationSettings settings, - ICollectionLocator collectionLocator, - IDocumentVersionService documentVersionService, - IDocumentMigrationRunner migrationRunner) - : this( - collectionLocator, - documentVersionService, - migrationRunner) + public StartUpDocumentMigrationRunner( + IMongoMigrationSettings settings, + ICollectionLocator collectionLocator, + IDocumentVersionService documentVersionService, + IDocumentMigrationRunner migrationRunner) + : this( + collectionLocator, + documentVersionService, + migrationRunner) + { + if (settings.ConnectionString == null && settings.Database == null || settings.ClientSettings == null) { - if (settings.ConnectionString == null && settings.Database == null || settings.ClientSettings == null) - { - throw new MongoMigrationNoMongoClientException(); - } - - if (settings.ClientSettings != null) - { - _client = new MongoClient(settings.ClientSettings); - } - else - { - _client = new MongoClient(settings.ConnectionString); - } - - _databaseName = settings.Database; + throw new MongoMigrationNoMongoClientException(); } - public StartUpDocumentMigrationRunner( - IMongoClient client, - IMongoMigrationSettings settings, - ICollectionLocator collectionLocator, - IDocumentVersionService documentVersionService, - IDocumentMigrationRunner migrationRunner) - : this( - collectionLocator, - documentVersionService, - migrationRunner) + if (settings.ClientSettings != null) + { + _client = new MongoClient(settings.ClientSettings); + } + else { - _client = client; - - if (settings.ConnectionString == null && settings.Database == null) - { - return; - } - _client = new MongoClient(settings.ConnectionString); - _databaseName = settings.Database; } - private StartUpDocumentMigrationRunner( - ICollectionLocator collectionLocator, - IDocumentVersionService documentVersionService, - IDocumentMigrationRunner migrationRunner) + _databaseName = settings.Database; + } + + public StartUpDocumentMigrationRunner( + IMongoClient client, + IMongoMigrationSettings settings, + ICollectionLocator collectionLocator, + IDocumentVersionService documentVersionService, + IDocumentMigrationRunner migrationRunner) + : this( + collectionLocator, + documentVersionService, + migrationRunner) + { + _client = client; + + if (settings.ConnectionString == null && settings.Database == null) { - _collectionLocator = collectionLocator; - _documentVersionService = documentVersionService; - _migrationRunner = migrationRunner; + return; } - public void RunAll() - { - var locations = _collectionLocator.GetLocatesOrEmpty(); + _client = new MongoClient(settings.ConnectionString); + _databaseName = settings.Database; + } - foreach (var locate in locations) - { - var information = locate.Value; - var type = locate.Key; - var databaseName = GetDatabaseOrDefault(information); - var collectionVersion = _documentVersionService.GetCollectionVersion(type); + private StartUpDocumentMigrationRunner( + ICollectionLocator collectionLocator, + IDocumentVersionService documentVersionService, + IDocumentMigrationRunner migrationRunner) + { + _collectionLocator = collectionLocator; + _documentVersionService = documentVersionService; + _migrationRunner = migrationRunner; + } + + public void RunAll() + { + var locations = _collectionLocator.GetLocatesOrEmpty(); + + foreach (var locate in locations) + { + var information = locate.Value; + var type = locate.Key; + var databaseName = GetDatabaseOrDefault(information); + var collectionVersion = _documentVersionService.GetCollectionVersion(type); - var collection = _client.GetDatabase(databaseName) - .GetCollection(information.Collection); + var collection = _client.GetDatabase(databaseName) + .GetCollection(information.Collection); - var bulk = new List>(); + var bulk = new List>(); - var query = CreateQueryForRelevantDocuments(type); + var query = CreateQueryForRelevantDocuments(type); - using (var cursor = collection.FindSync(query)) + using (var cursor = collection.FindSync(query)) + { + while (cursor.MoveNext()) { - while (cursor.MoveNext()) + var batch = cursor.Current; + foreach (var document in batch) { - var batch = cursor.Current; - foreach (var document in batch) - { - _migrationRunner.Run(type, document, collectionVersion); - - var update = new ReplaceOneModel( - new BsonDocument { { "_id", document["_id"] } }, - document - ); - - bulk.Add(update); - } - } - } + _migrationRunner.Run(type, document, collectionVersion); - if (bulk.Count > 0) - { - collection.BulkWrite(bulk); + var update = new ReplaceOneModel( + new BsonDocument { { "_id", document["_id"] } }, + document + ); + + bulk.Add(update); + } } } - } - private string GetDatabaseOrDefault(CollectionLocationInformation information) - { - if (string.IsNullOrEmpty(_databaseName) && string.IsNullOrEmpty(information.Database)) + if (bulk.Count > 0) { - throw new NoDatabaseNameFoundException(); + collection.BulkWrite(bulk); } - - return string.IsNullOrEmpty(information.Database) ? _databaseName : information.Database; } + } - private FilterDefinition CreateQueryForRelevantDocuments( - Type type) + private string GetDatabaseOrDefault(CollectionLocationInformation information) + { + if (string.IsNullOrEmpty(_databaseName) && string.IsNullOrEmpty(information.Database)) { - var currentVersion = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); + throw new NoDatabaseNameFoundException(); + } - var existFilter = Builders.Filter.Exists(_documentVersionService.GetVersionFieldName(), false); - var notEqualFilter = Builders.Filter.Ne( - _documentVersionService.GetVersionFieldName(), - currentVersion); + return string.IsNullOrEmpty(information.Database) ? _databaseName : information.Database; + } - return Builders.Filter.Or(existFilter, notEqualFilter); - } + private FilterDefinition CreateQueryForRelevantDocuments( + Type type) + { + var currentVersion = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); + + var existFilter = Builders.Filter.Exists(_documentVersionService.GetVersionFieldName(), false); + var notEqualFilter = Builders.Filter.Ne( + _documentVersionService.GetVersionFieldName(), + currentVersion); + + return Builders.Filter.Or(existFilter, notEqualFilter); } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/IMigration.cs b/Mongo.Migration/Migrations/IMigration.cs index 11f4460..c9b44f4 100644 --- a/Mongo.Migration/Migrations/IMigration.cs +++ b/Mongo.Migration/Migrations/IMigration.cs @@ -1,11 +1,10 @@ using Mongo.Migration.Documents; -namespace Mongo.Migration.Migrations +namespace Mongo.Migration.Migrations; + +public interface IMigration { - public interface IMigration - { - DocumentVersion Version { get; } + DocumentVersion Version { get; } - Type Type { get; } - } + Type Type { get; } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs index 1d34323..8fe7c70 100644 --- a/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs @@ -1,29 +1,28 @@ using Microsoft.Extensions.Logging; using Mongo.Migration.Migrations.Database; -namespace Mongo.Migration.Migrations.Locators +namespace Mongo.Migration.Migrations.Locators; + +internal class DatabaseTypeMigrationDependencyLocator : TypeMigrationDependencyLocator, IDatabaseTypeMigrationDependencyLocator { - internal class DatabaseTypeMigrationDependencyLocator : TypeMigrationDependencyLocator, IDatabaseTypeMigrationDependencyLocator - { - private IDictionary>? _migrations; + private IDictionary>? _migrations; - protected override IDictionary> Migrations + protected override IDictionary> Migrations + { + get { - get + if (_migrations == null) { - if (_migrations == null) - { - Locate(); - } - - return _migrations!; + Locate(); } - set => _migrations = value; - } - public DatabaseTypeMigrationDependencyLocator(ILogger logger, IServiceProvider serviceProvider) - : base(logger, serviceProvider) - { + return _migrations!; } + set => _migrations = value; + } + + public DatabaseTypeMigrationDependencyLocator(ILogger logger, IServiceProvider serviceProvider) + : base(logger, serviceProvider) + { } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/IDatabaseTypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/IDatabaseTypeMigrationDependencyLocator.cs index f99fea4..8cd8dca 100644 --- a/Mongo.Migration/Migrations/Locators/IDatabaseTypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/IDatabaseTypeMigrationDependencyLocator.cs @@ -1,8 +1,7 @@ using Mongo.Migration.Migrations.Database; -namespace Mongo.Migration.Migrations.Locators +namespace Mongo.Migration.Migrations.Locators; + +internal interface IDatabaseTypeMigrationDependencyLocator : IMigrationLocator { - internal interface IDatabaseTypeMigrationDependencyLocator : IMigrationLocator - { - } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs index 824ac20..9e04ee0 100644 --- a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs @@ -1,20 +1,19 @@ using Mongo.Migration.Documents; -namespace Mongo.Migration.Migrations.Locators +namespace Mongo.Migration.Migrations.Locators; + +public interface IMigrationLocator + where TMigrationType : class, IMigration { - public interface IMigrationLocator - where TMigrationType : class, IMigration - { - IReadOnlyCollection GetMigrations(Type type); + IReadOnlyCollection GetMigrations(Type type); - IEnumerable GetMigrationsGt(Type type, DocumentVersion version); + IEnumerable GetMigrationsGt(Type type, DocumentVersion version); - IEnumerable GetMigrationsGtEq(Type type, DocumentVersion version); + IEnumerable GetMigrationsGtEq(Type type, DocumentVersion version); - IEnumerable GetMigrationsFromTo(Type type, DocumentVersion version, DocumentVersion otherVersion); + IEnumerable GetMigrationsFromTo(Type type, DocumentVersion version, DocumentVersion otherVersion); - DocumentVersion GetLatestVersion(Type type); + DocumentVersion GetLatestVersion(Type type); - void Locate(); - } + void Locate(); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs index 1463954..038558f 100644 --- a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs @@ -3,112 +3,111 @@ using Mongo.Migration.Documents; using Mongo.Migration.Exceptions; -namespace Mongo.Migration.Migrations.Locators +namespace Mongo.Migration.Migrations.Locators; + +public abstract class MigrationLocator : IMigrationLocator + where TMigrationType : class, IMigration { - public abstract class MigrationLocator : IMigrationLocator - where TMigrationType : class, IMigration - { - private readonly ILogger> _logger; + private readonly ILogger> _logger; - private readonly List _assemblies; + private readonly List _assemblies; - private IDictionary>? _migrations; + private IDictionary>? _migrations; - protected MigrationLocator(ILogger> logger) - { - _logger = logger; - _assemblies = GetAssemblies(); - } + protected MigrationLocator(ILogger> logger) + { + _logger = logger; + _assemblies = GetAssemblies(); + } - protected IEnumerable Assemblies => _assemblies; + protected IEnumerable Assemblies => _assemblies; - protected virtual IDictionary> Migrations + protected virtual IDictionary> Migrations + { + get { - get + if (_migrations is null) { - if (_migrations is null) - { - Locate(); - } - - if (_migrations is null || _migrations.Count <= 0) - { - _logger.LogInformation(new NoMigrationsFoundException(), "No migration found"); - } - - return _migrations!; + Locate(); } - set => _migrations = value; - } - public IReadOnlyCollection GetMigrations(Type type) - { - if(Migrations.TryGetValue(type, out var migrations)) + if (_migrations is null || _migrations.Count <= 0) { - return migrations; + _logger.LogInformation(new NoMigrationsFoundException(), "No migration found"); } - return Array.Empty(); + return _migrations!; } + set => _migrations = value; + } - public IEnumerable GetMigrationsFromTo(Type type, DocumentVersion version, DocumentVersion otherVersion) + public IReadOnlyCollection GetMigrations(Type type) + { + if(Migrations.TryGetValue(type, out var migrations)) { - var migrations = GetMigrations(type); - - return - migrations - .Where(m => m.Version > version) - .Where(m => m.Version <= otherVersion) - .ToList(); + return migrations; } - public IEnumerable GetMigrationsGt(Type type, DocumentVersion version) - { - var migrations = GetMigrations(type); + return Array.Empty(); + } - return - migrations - .Where(m => m.Version > version) - .ToList(); - } + public IEnumerable GetMigrationsFromTo(Type type, DocumentVersion version, DocumentVersion otherVersion) + { + var migrations = GetMigrations(type); - public IEnumerable GetMigrationsGtEq(Type type, DocumentVersion version) - { - var migrations = GetMigrations(type); + return + migrations + .Where(m => m.Version > version) + .Where(m => m.Version <= otherVersion) + .ToList(); + } - return - migrations - .Where(m => m.Version >= version) - .ToList(); - } + public IEnumerable GetMigrationsGt(Type type, DocumentVersion version) + { + var migrations = GetMigrations(type); - public DocumentVersion GetLatestVersion(Type type) - { - var migrations = GetMigrations(type); + return + migrations + .Where(m => m.Version > version) + .ToList(); + } - return migrations.Count > 0 - ? migrations.Max(m => m.Version) - : DocumentVersion.Default(); - } + public IEnumerable GetMigrationsGtEq(Type type, DocumentVersion version) + { + var migrations = GetMigrations(type); - public abstract void Locate(); + return + migrations + .Where(m => m.Version >= version) + .ToList(); + } - private static List GetAssemblies() - { - var location = AppDomain.CurrentDomain.BaseDirectory; - var path = Path.GetDirectoryName(location); + public DocumentVersion GetLatestVersion(Type type) + { + var migrations = GetMigrations(type); - if (string.IsNullOrWhiteSpace(path)) - { - throw new DirectoryNotFoundException(ErrorTexts.AppDirNotFound); - } + return migrations.Count > 0 + ? migrations.Max(m => m.Version) + : DocumentVersion.Default(); + } - var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); - var migrationAssemblies = Directory.GetFiles(path, "*.MongoMigrations*.dll").Select(Assembly.LoadFile); + public abstract void Locate(); - assemblies.AddRange(migrationAssemblies); + private static List GetAssemblies() + { + var location = AppDomain.CurrentDomain.BaseDirectory; + var path = Path.GetDirectoryName(location); - return assemblies; + if (string.IsNullOrWhiteSpace(path)) + { + throw new DirectoryNotFoundException(ErrorTexts.AppDirNotFound); } + + var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); + var migrationAssemblies = Directory.GetFiles(path, "*.MongoMigrations*.dll").Select(Assembly.LoadFile); + + assemblies.AddRange(migrationAssemblies); + + return assemblies; } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs index 914cce6..a0c2a60 100644 --- a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs @@ -3,62 +3,61 @@ using Microsoft.Extensions.Logging; using Mongo.Migration.Extensions; -namespace Mongo.Migration.Migrations.Locators +namespace Mongo.Migration.Migrations.Locators; + +internal class TypeMigrationDependencyLocator : MigrationLocator + where TMigrationType : class, IMigration { - internal class TypeMigrationDependencyLocator : MigrationLocator - where TMigrationType : class, IMigration - { - private readonly IServiceProvider _serviceProvider; + private readonly IServiceProvider _serviceProvider; - public TypeMigrationDependencyLocator(ILogger> logger, IServiceProvider serviceProvider) + public TypeMigrationDependencyLocator(ILogger> logger, IServiceProvider serviceProvider) : base(logger) - { - _serviceProvider = serviceProvider; - } - - public override void Locate() - { - var migrationTypes = - (from assembly in Assemblies - from type in assembly.GetTypes() - where typeof(TMigrationType).IsAssignableFrom(type) && !type.IsAbstract - select type).Distinct(new TypeComparer()); + { + _serviceProvider = serviceProvider; + } - Migrations = migrationTypes.Select(GetMigrationInstance).ToMigrationDictionary(); - } + public override void Locate() + { + var migrationTypes = + (from assembly in Assemblies + from type in assembly.GetTypes() + where typeof(TMigrationType).IsAssignableFrom(type) && !type.IsAbstract + select type).Distinct(new TypeComparer()); - private TMigrationType GetMigrationInstance(Type type) - { - ConstructorInfo[] constructors = type.GetConstructors(); + Migrations = migrationTypes.Select(GetMigrationInstance).ToMigrationDictionary(); + } - if (constructors.Length > 0) - { - object[] args = constructors - .First() - .GetParameters() - .Select(parameterInfo => _serviceProvider.GetRequiredService(parameterInfo.ParameterType)) - .ToArray(); + private TMigrationType GetMigrationInstance(Type type) + { + ConstructorInfo[] constructors = type.GetConstructors(); - return Activator.CreateInstance(type, args) as TMigrationType - ?? throw new InvalidOperationException($"Cannot create {type} migration"); - } + if (constructors.Length > 0) + { + object[] args = constructors + .First() + .GetParameters() + .Select(parameterInfo => _serviceProvider.GetRequiredService(parameterInfo.ParameterType)) + .ToArray(); - return Activator.CreateInstance(type) as TMigrationType + return Activator.CreateInstance(type, args) as TMigrationType ?? throw new InvalidOperationException($"Cannot create {type} migration"); } - private class TypeComparer : IEqualityComparer + return Activator.CreateInstance(type) as TMigrationType + ?? throw new InvalidOperationException($"Cannot create {type} migration"); + } + + private class TypeComparer : IEqualityComparer + { + public bool Equals(Type? x, Type? y) { - public bool Equals(Type? x, Type? y) - { - return x?.AssemblyQualifiedName == y?.AssemblyQualifiedName; - } + return x?.AssemblyQualifiedName == y?.AssemblyQualifiedName; + } - public int GetHashCode(Type obj) - { - return obj.AssemblyQualifiedName?.GetHashCode() - ?? throw new InvalidOperationException($"Cannot get AssemblyQualifiedName from {obj}"); - } + public int GetHashCode(Type obj) + { + return obj.AssemblyQualifiedName?.GetHashCode() + ?? throw new InvalidOperationException($"Cannot get AssemblyQualifiedName from {obj}"); } } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs b/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs index 430d2d5..2b0d495 100644 --- a/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs @@ -2,25 +2,24 @@ using Mongo.Migration.Extensions; using Mongo.Migration.Migrations.Document; -namespace Mongo.Migration.Migrations.Locators +namespace Mongo.Migration.Migrations.Locators; + +internal class TypeMigrationLocator : MigrationLocator { - internal class TypeMigrationLocator : MigrationLocator - { - public TypeMigrationLocator(ILogger logger) : base(logger) { } + public TypeMigrationLocator(ILogger logger) : base(logger) { } - public override void Locate() - { - var migrationTypes = - (from assembly in Assemblies - from type in assembly.GetTypes() - where typeof(IDocumentMigration).IsAssignableFrom(type) && !type.IsAbstract - select type).Distinct(); + public override void Locate() + { + var migrationTypes = + (from assembly in Assemblies + from type in assembly.GetTypes() + where typeof(IDocumentMigration).IsAssignableFrom(type) && !type.IsAbstract + select type).Distinct(); - Migrations = migrationTypes - .Select(t => - Activator.CreateInstance(t) as IDocumentMigration - ?? throw new InvalidOperationException($"Cannot create {t} document migration")) - .ToMigrationDictionary(); - } + Migrations = migrationTypes + .Select(t => + Activator.CreateInstance(t) as IDocumentMigration + ?? throw new InvalidOperationException($"Cannot create {t} document migration")) + .ToMigrationDictionary(); } } \ No newline at end of file diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index 337f875..7fcc11a 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -5,6 +5,7 @@ enable enable op-icon.png + embedded diff --git a/Mongo.Migration/MongoMigration.cs b/Mongo.Migration/MongoMigration.cs index de2a59a..e7ac771 100644 --- a/Mongo.Migration/MongoMigration.cs +++ b/Mongo.Migration/MongoMigration.cs @@ -3,47 +3,46 @@ using Mongo.Migration.Migrations.Locators; using Mongo.Migration.Services; -namespace Mongo.Migration +namespace Mongo.Migration; + +internal class MongoMigration : IMongoMigration { - internal class MongoMigration : IMongoMigration + private readonly ICollectionLocator _collectionLocator; + + private readonly IDatabaseTypeMigrationDependencyLocator _databaseMigrationLocator; + + private readonly IMigrationLocator _documentMigrationLocator; + + private readonly IMigrationService _migrationService; + + private readonly IRuntimeVersionLocator _runtimeVersionLocator; + + private readonly IStartUpVersionLocator _startUpVersionLocator; + + public MongoMigration( + IMigrationLocator documentMigrationLocator, + IDatabaseTypeMigrationDependencyLocator databaseMigrationLocator, + IRuntimeVersionLocator runtimeVersionLocator, + ICollectionLocator collectionLocator, + IStartUpVersionLocator startUpVersionLocator, + IMigrationService migrationService) { - private readonly ICollectionLocator _collectionLocator; - - private readonly IDatabaseTypeMigrationDependencyLocator _databaseMigrationLocator; - - private readonly IMigrationLocator _documentMigrationLocator; - - private readonly IMigrationService _migrationService; - - private readonly IRuntimeVersionLocator _runtimeVersionLocator; - - private readonly IStartUpVersionLocator _startUpVersionLocator; - - public MongoMigration( - IMigrationLocator documentMigrationLocator, - IDatabaseTypeMigrationDependencyLocator databaseMigrationLocator, - IRuntimeVersionLocator runtimeVersionLocator, - ICollectionLocator collectionLocator, - IStartUpVersionLocator startUpVersionLocator, - IMigrationService migrationService) - { - _documentMigrationLocator = documentMigrationLocator; - _databaseMigrationLocator = databaseMigrationLocator; - _runtimeVersionLocator = runtimeVersionLocator; - _collectionLocator = collectionLocator; - _startUpVersionLocator = startUpVersionLocator; - _migrationService = migrationService; - } - - public void Run() - { - _documentMigrationLocator.Locate(); - _databaseMigrationLocator.Locate(); - _runtimeVersionLocator.Locate(); - _collectionLocator.Locate(); - _startUpVersionLocator.Locate(); - - _migrationService.Migrate(); - } + _documentMigrationLocator = documentMigrationLocator; + _databaseMigrationLocator = databaseMigrationLocator; + _runtimeVersionLocator = runtimeVersionLocator; + _collectionLocator = collectionLocator; + _startUpVersionLocator = startUpVersionLocator; + _migrationService = migrationService; + } + + public void Run() + { + _documentMigrationLocator.Locate(); + _databaseMigrationLocator.Locate(); + _runtimeVersionLocator.Locate(); + _collectionLocator.Locate(); + _startUpVersionLocator.Locate(); + + _migrationService.Migrate(); } } \ No newline at end of file diff --git a/Mongo.Migration/Services/DatabaseVersionService.cs b/Mongo.Migration/Services/DatabaseVersionService.cs index b6a8c93..6392bc7 100644 --- a/Mongo.Migration/Services/DatabaseVersionService.cs +++ b/Mongo.Migration/Services/DatabaseVersionService.cs @@ -5,60 +5,59 @@ using MongoDB.Driver; -namespace Mongo.Migration.Services +namespace Mongo.Migration.Services; + +internal class DatabaseVersionService : IDatabaseVersionService { - internal class DatabaseVersionService : IDatabaseVersionService - { - private const string MigrationsCollectionName = "_migrations"; + private const string MigrationsCollectionName = "_migrations"; - private readonly IDatabaseTypeMigrationDependencyLocator _migrationLocator; + private readonly IDatabaseTypeMigrationDependencyLocator _migrationLocator; - private readonly IMongoMigrationSettings _mongoMigrationSettings; + private readonly IMongoMigrationSettings _mongoMigrationSettings; - public DatabaseVersionService( - IDatabaseTypeMigrationDependencyLocator migrationLocator, - IMongoMigrationSettings mongoMigrationSettings) - { - _migrationLocator = migrationLocator; - _mongoMigrationSettings = mongoMigrationSettings; - } + public DatabaseVersionService( + IDatabaseTypeMigrationDependencyLocator migrationLocator, + IMongoMigrationSettings mongoMigrationSettings) + { + _migrationLocator = migrationLocator; + _mongoMigrationSettings = mongoMigrationSettings; + } - public DocumentVersion GetCurrentOrLatestMigrationVersion() - { - return _mongoMigrationSettings.DatabaseMigrationVersion > DocumentVersion.Empty() - ? _mongoMigrationSettings.DatabaseMigrationVersion - : _migrationLocator.GetLatestVersion(typeof(DatabaseMigration)); - } + public DocumentVersion GetCurrentOrLatestMigrationVersion() + { + return _mongoMigrationSettings.DatabaseMigrationVersion > DocumentVersion.Empty() + ? _mongoMigrationSettings.DatabaseMigrationVersion + : _migrationLocator.GetLatestVersion(typeof(DatabaseMigration)); + } - public DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db) + public DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db) + { + var migrations = GetMigrationsCollection(db).Find(m => true).ToList(); + if (migrations == null || migrations.Count <= 0) { - var migrations = GetMigrationsCollection(db).Find(m => true).ToList(); - if (migrations == null || migrations.Count <= 0) - { - return DocumentVersion.Default(); - } - - return migrations.Max(m => m.Version); + return DocumentVersion.Default(); } - public void Save(IMongoDatabase db, IDatabaseMigration migration) - { - GetMigrationsCollection(db).InsertOne( - new() - { - MigrationId = migration.GetType().ToString(), - Version = migration.Version - }); - } + return migrations.Max(m => m.Version); + } - public void Remove(IMongoDatabase db, IDatabaseMigration migration) - { - GetMigrationsCollection(db).DeleteOne(Builders.Filter.Eq(mh => mh.MigrationId, migration.GetType().ToString())); - } + public void Save(IMongoDatabase db, IDatabaseMigration migration) + { + GetMigrationsCollection(db).InsertOne( + new() + { + MigrationId = migration.GetType().ToString(), + Version = migration.Version + }); + } - private static IMongoCollection GetMigrationsCollection(IMongoDatabase db) - { - return db.GetCollection(MigrationsCollectionName); - } + public void Remove(IMongoDatabase db, IDatabaseMigration migration) + { + GetMigrationsCollection(db).DeleteOne(Builders.Filter.Eq(mh => mh.MigrationId, migration.GetType().ToString())); + } + + private static IMongoCollection GetMigrationsCollection(IMongoDatabase db) + { + return db.GetCollection(MigrationsCollectionName); } } \ No newline at end of file diff --git a/Mongo.Migration/Services/DocumentVersionService.cs b/Mongo.Migration/Services/DocumentVersionService.cs index a645a36..d5e6b68 100644 --- a/Mongo.Migration/Services/DocumentVersionService.cs +++ b/Mongo.Migration/Services/DocumentVersionService.cs @@ -7,126 +7,125 @@ using MongoDB.Bson; -namespace Mongo.Migration.Services +namespace Mongo.Migration.Services; + +internal class DocumentVersionService : IDocumentVersionService { - internal class DocumentVersionService : IDocumentVersionService - { - private static readonly string VersionFieldName = "Version"; + private static readonly string VersionFieldName = "Version"; - private readonly IMigrationLocator _migrationLocator; + private readonly IMigrationLocator _migrationLocator; - private readonly IRuntimeVersionLocator _runtimeVersionLocator; + private readonly IRuntimeVersionLocator _runtimeVersionLocator; - private readonly IStartUpVersionLocator _startUpVersionLocator; + private readonly IStartUpVersionLocator _startUpVersionLocator; - private readonly string _versionFieldName; + private readonly string _versionFieldName; - public DocumentVersionService( - IMigrationLocator migrationLocator, - IRuntimeVersionLocator runtimeVersionLocator, - IStartUpVersionLocator startUpVersionLocator, - IMongoMigrationSettings mongoMigrationSettings) - { - _migrationLocator = migrationLocator; - _runtimeVersionLocator = runtimeVersionLocator; - _startUpVersionLocator = startUpVersionLocator; - _versionFieldName = string.IsNullOrWhiteSpace(mongoMigrationSettings.VersionFieldName) - ? VersionFieldName - : mongoMigrationSettings.VersionFieldName; - } + public DocumentVersionService( + IMigrationLocator migrationLocator, + IRuntimeVersionLocator runtimeVersionLocator, + IStartUpVersionLocator startUpVersionLocator, + IMongoMigrationSettings mongoMigrationSettings) + { + _migrationLocator = migrationLocator; + _runtimeVersionLocator = runtimeVersionLocator; + _startUpVersionLocator = startUpVersionLocator; + _versionFieldName = string.IsNullOrWhiteSpace(mongoMigrationSettings.VersionFieldName) + ? VersionFieldName + : mongoMigrationSettings.VersionFieldName; + } - public string GetVersionFieldName() - { - return _versionFieldName; - } + public string GetVersionFieldName() + { + return _versionFieldName; + } - public DocumentVersion GetCurrentOrLatestMigrationVersion(Type type) - { - var latestVersion = _migrationLocator.GetLatestVersion(type); - return GetCurrentVersion(type) ?? latestVersion; - } + public DocumentVersion GetCurrentOrLatestMigrationVersion(Type type) + { + var latestVersion = _migrationLocator.GetLatestVersion(type); + return GetCurrentVersion(type) ?? latestVersion; + } + + public DocumentVersion GetCollectionVersion(Type type) + { + var version = GetCurrentOrLatestMigrationVersion(type); + return _startUpVersionLocator.GetLocateOrNull(type) ?? version; + } + + public DocumentVersion GetVersionOrDefault(BsonDocument document) + { + document.TryGetValue(GetVersionFieldName(), out BsonValue value); - public DocumentVersion GetCollectionVersion(Type type) + if (value != null && !value.IsBsonNull) { - var version = GetCurrentOrLatestMigrationVersion(type); - return _startUpVersionLocator.GetLocateOrNull(type) ?? version; + return value.AsString; } - public DocumentVersion GetVersionOrDefault(BsonDocument document) - { - document.TryGetValue(GetVersionFieldName(), out BsonValue value); + return DocumentVersion.Default(); + } - if (value != null && !value.IsBsonNull) - { - return value.AsString; - } + public void SetVersion(BsonDocument document, DocumentVersion version) + { + document[GetVersionFieldName()] = version.ToString(); + } - return DocumentVersion.Default(); - } + public void DetermineVersion(TClass instance) + where TClass : class, IDocument + { + var type = typeof(TClass); + var documentVersion = instance.Version.ToString(); + var latestVersion = _migrationLocator.GetLatestVersion(type); + var currentVersion = _runtimeVersionLocator.GetLocateOrNull(type) ?? latestVersion; - public void SetVersion(BsonDocument document, DocumentVersion version) + if (documentVersion == currentVersion) { - document[GetVersionFieldName()] = version.ToString(); + return; } - public void DetermineVersion(TClass instance) - where TClass : class, IDocument + if (documentVersion == latestVersion) { - var type = typeof(TClass); - var documentVersion = instance.Version.ToString(); - var latestVersion = _migrationLocator.GetLatestVersion(type); - var currentVersion = _runtimeVersionLocator.GetLocateOrNull(type) ?? latestVersion; - - if (documentVersion == currentVersion) - { - return; - } - - if (documentVersion == latestVersion) - { - return; - } - - if (DocumentVersion.Default() == documentVersion) - { - SetVersion(instance, currentVersion, latestVersion); - return; - } - - throw new VersionViolationException(currentVersion.ToString(), documentVersion, latestVersion); + return; } - public DocumentVersion DetermineLastVersion( - DocumentVersion version, - List migrations, - int currentMigration) + if (DocumentVersion.Default() == documentVersion) { - if (migrations.Last() != migrations[currentMigration]) - { - return migrations[currentMigration + 1].Version; - } - - return version; + SetVersion(instance, currentVersion, latestVersion); + return; } - private DocumentVersion? GetCurrentVersion(Type type) + throw new VersionViolationException(currentVersion.ToString(), documentVersion, latestVersion); + } + + public DocumentVersion DetermineLastVersion( + DocumentVersion version, + List migrations, + int currentMigration) + { + if (migrations.Last() != migrations[currentMigration]) { - return _runtimeVersionLocator.GetLocateOrNull(type); + return migrations[currentMigration + 1].Version; } - private static void SetVersion( - TClass instance, - DocumentVersion? currentVersion, - DocumentVersion latestVersion) - where TClass : class, IDocument - { - if (currentVersion < latestVersion) - { - instance.Version = currentVersion.ToString(); - return; - } + return version; + } - instance.Version = latestVersion; + private DocumentVersion? GetCurrentVersion(Type type) + { + return _runtimeVersionLocator.GetLocateOrNull(type); + } + + private static void SetVersion( + TClass instance, + DocumentVersion? currentVersion, + DocumentVersion latestVersion) + where TClass : class, IDocument + { + if (currentVersion < latestVersion) + { + instance.Version = currentVersion.ToString(); + return; } + + instance.Version = latestVersion; } } \ No newline at end of file diff --git a/Mongo.Migration/Services/IDatabaseVersionService.cs b/Mongo.Migration/Services/IDatabaseVersionService.cs index 853daaf..5634bdb 100644 --- a/Mongo.Migration/Services/IDatabaseVersionService.cs +++ b/Mongo.Migration/Services/IDatabaseVersionService.cs @@ -3,16 +3,15 @@ using MongoDB.Driver; -namespace Mongo.Migration.Services +namespace Mongo.Migration.Services; + +public interface IDatabaseVersionService { - public interface IDatabaseVersionService - { - DocumentVersion GetCurrentOrLatestMigrationVersion(); + DocumentVersion GetCurrentOrLatestMigrationVersion(); - DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db); + DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db); - void Save(IMongoDatabase db, IDatabaseMigration migration); + void Save(IMongoDatabase db, IDatabaseMigration migration); - void Remove(IMongoDatabase db, IDatabaseMigration migration); - } + void Remove(IMongoDatabase db, IDatabaseMigration migration); } \ No newline at end of file diff --git a/Mongo.Migration/Services/IDocumentVersionService.cs b/Mongo.Migration/Services/IDocumentVersionService.cs index addd01f..97f5c8b 100644 --- a/Mongo.Migration/Services/IDocumentVersionService.cs +++ b/Mongo.Migration/Services/IDocumentVersionService.cs @@ -3,26 +3,25 @@ using MongoDB.Bson; -namespace Mongo.Migration.Services +namespace Mongo.Migration.Services; + +public interface IDocumentVersionService { - public interface IDocumentVersionService - { - string GetVersionFieldName(); + string GetVersionFieldName(); - DocumentVersion GetCurrentOrLatestMigrationVersion(Type type); + DocumentVersion GetCurrentOrLatestMigrationVersion(Type type); - DocumentVersion GetCollectionVersion(Type type); + DocumentVersion GetCollectionVersion(Type type); - DocumentVersion GetVersionOrDefault(BsonDocument document); + DocumentVersion GetVersionOrDefault(BsonDocument document); - void SetVersion(BsonDocument document, DocumentVersion version); + void SetVersion(BsonDocument document, DocumentVersion version); - void DetermineVersion(TClass instance) - where TClass : class, IDocument; + void DetermineVersion(TClass instance) + where TClass : class, IDocument; - DocumentVersion DetermineLastVersion( - DocumentVersion version, - List migrations, - int currentMigration); - } + DocumentVersion DetermineLastVersion( + DocumentVersion version, + List migrations, + int currentMigration); } \ No newline at end of file diff --git a/Mongo.Migration/Services/IMigrationService.cs b/Mongo.Migration/Services/IMigrationService.cs index 5b63f8c..15d1286 100644 --- a/Mongo.Migration/Services/IMigrationService.cs +++ b/Mongo.Migration/Services/IMigrationService.cs @@ -1,7 +1,6 @@ -namespace Mongo.Migration.Services +namespace Mongo.Migration.Services; + +internal interface IMigrationService { - internal interface IMigrationService - { - void Migrate(); - } + void Migrate(); } \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs index fe8e82c..799f380 100644 --- a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs +++ b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs @@ -1,9 +1,8 @@ using MongoDB.Bson.Serialization; -namespace Mongo.Migration.Services.Interceptors +namespace Mongo.Migration.Services.Interceptors; + +internal interface IMigrationInterceptorFactory { - internal interface IMigrationInterceptorFactory - { - IBsonSerializer Create(Type type); - } + IBsonSerializer Create(Type type); } \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs index 8b6e7f0..37a9e3c 100644 --- a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs +++ b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs @@ -1,8 +1,7 @@ using MongoDB.Bson.Serialization; -namespace Mongo.Migration.Services.Interceptors +namespace Mongo.Migration.Services.Interceptors; + +public interface IMigrationInterceptorProvider : IBsonSerializationProvider { - public interface IMigrationInterceptorProvider : IBsonSerializationProvider - { - } } \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs index 1cad4a9..a1ae2e2 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs @@ -5,40 +5,39 @@ using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Serializers; -namespace Mongo.Migration.Services.Interceptors +namespace Mongo.Migration.Services.Interceptors; + +internal class MigrationInterceptor : BsonClassMapSerializer + where TDocument : class, IDocument { - internal class MigrationInterceptor : BsonClassMapSerializer - where TDocument : class, IDocument - { - private readonly IDocumentVersionService _documentVersionService; + private readonly IDocumentVersionService _documentVersionService; - private readonly IDocumentMigrationRunner _migrationRunner; + private readonly IDocumentMigrationRunner _migrationRunner; - public MigrationInterceptor(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) - : base(BsonClassMap.LookupClassMap(typeof(TDocument))) - { - _migrationRunner = migrationRunner; - _documentVersionService = documentVersionService; - } + public MigrationInterceptor(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) + : base(BsonClassMap.LookupClassMap(typeof(TDocument))) + { + _migrationRunner = migrationRunner; + _documentVersionService = documentVersionService; + } - public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TDocument value) - { - _documentVersionService.DetermineVersion(value); + public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TDocument value) + { + _documentVersionService.DetermineVersion(value); - base.Serialize(context, args, value); - } + base.Serialize(context, args, value); + } - public override TDocument Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) - { - // TODO: Performance? LatestVersion, dont do anything - var document = BsonDocumentSerializer.Instance.Deserialize(context); + public override TDocument Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + // TODO: Performance? LatestVersion, dont do anything + var document = BsonDocumentSerializer.Instance.Deserialize(context); - _migrationRunner.Run(typeof(TDocument), document); + _migrationRunner.Run(typeof(TDocument), document); - var migratedContext = - BsonDeserializationContext.CreateRoot(new BsonDocumentReader(document)); + var migratedContext = + BsonDeserializationContext.CreateRoot(new BsonDocumentReader(document)); - return base.Deserialize(migratedContext, args); - } + return base.Deserialize(migratedContext, args); } } \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs index d5e3702..0eb938f 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs @@ -2,26 +2,25 @@ using MongoDB.Bson.Serialization; -namespace Mongo.Migration.Services.Interceptors +namespace Mongo.Migration.Services.Interceptors; + +internal class MigrationInterceptorFactory : IMigrationInterceptorFactory { - internal class MigrationInterceptorFactory : IMigrationInterceptorFactory - { - private readonly IDocumentVersionService _documentVersionService; + private readonly IDocumentVersionService _documentVersionService; - private readonly IDocumentMigrationRunner _migrationRunner; + private readonly IDocumentMigrationRunner _migrationRunner; - public MigrationInterceptorFactory(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) - { - _migrationRunner = migrationRunner; - _documentVersionService = documentVersionService; - } + public MigrationInterceptorFactory(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) + { + _migrationRunner = migrationRunner; + _documentVersionService = documentVersionService; + } - public IBsonSerializer Create(Type type) - { - var genericType = typeof(MigrationInterceptor<>).MakeGenericType(type); - var interceptor = Activator.CreateInstance(genericType, _migrationRunner, _documentVersionService); - return interceptor as IBsonSerializer - ?? throw new InvalidOperationException($"Cannot create {genericType} interceptor"); - } + public IBsonSerializer Create(Type type) + { + var genericType = typeof(MigrationInterceptor<>).MakeGenericType(type); + var interceptor = Activator.CreateInstance(genericType, _migrationRunner, _documentVersionService); + return interceptor as IBsonSerializer + ?? throw new InvalidOperationException($"Cannot create {genericType} interceptor"); } } \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs index 87aa9ab..4f8d898 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs @@ -3,30 +3,29 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization; -namespace Mongo.Migration.Services.Interceptors +namespace Mongo.Migration.Services.Interceptors; + +internal class MigrationInterceptorProvider : IMigrationInterceptorProvider { - internal class MigrationInterceptorProvider : IMigrationInterceptorProvider + private readonly IMigrationInterceptorFactory _migrationInterceptorFactory; + + public MigrationInterceptorProvider(IMigrationInterceptorFactory migrationInterceptorFactory) { - private readonly IMigrationInterceptorFactory _migrationInterceptorFactory; + _migrationInterceptorFactory = migrationInterceptorFactory; + } - public MigrationInterceptorProvider(IMigrationInterceptorFactory migrationInterceptorFactory) + public IBsonSerializer GetSerializer(Type type) + { + if (ShouldBeMigrated(type)) { - _migrationInterceptorFactory = migrationInterceptorFactory; + return _migrationInterceptorFactory.Create(type); } - public IBsonSerializer GetSerializer(Type type) - { - if (ShouldBeMigrated(type)) - { - return _migrationInterceptorFactory.Create(type); - } - - return null; - } + return null; + } - private static bool ShouldBeMigrated(Type type) - { - return type.GetInterfaces().Contains(typeof(IDocument)) && type != typeof(BsonDocument); - } + private static bool ShouldBeMigrated(Type type) + { + return type.GetInterfaces().Contains(typeof(IDocument)) && type != typeof(BsonDocument); } } \ No newline at end of file diff --git a/Mongo.Migration/Services/MigrationService.cs b/Mongo.Migration/Services/MigrationService.cs index 53c69c5..0e37ff1 100644 --- a/Mongo.Migration/Services/MigrationService.cs +++ b/Mongo.Migration/Services/MigrationService.cs @@ -7,62 +7,61 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization; -namespace Mongo.Migration.Services +namespace Mongo.Migration.Services; + +internal class MigrationService : IMigrationService { - internal class MigrationService : IMigrationService - { - private readonly ILogger _logger; + private readonly ILogger _logger; - private readonly IMigrationInterceptorProvider _provider; + private readonly IMigrationInterceptorProvider _provider; - private readonly DocumentVersionSerializer _serializer; + private readonly DocumentVersionSerializer _serializer; - private readonly IStartUpDatabaseMigrationRunner _startUpDatabaseMigrationRunner; + private readonly IStartUpDatabaseMigrationRunner _startUpDatabaseMigrationRunner; - private readonly IStartUpDocumentMigrationRunner _startUpDocumentMigrationRunner; + private readonly IStartUpDocumentMigrationRunner _startUpDocumentMigrationRunner; - public MigrationService( - DocumentVersionSerializer serializer, - IMigrationInterceptorProvider provider, - ILogger logger, - IStartUpDocumentMigrationRunner startUpDocumentMigrationRunner, - IStartUpDatabaseMigrationRunner startUpDatabaseMigrationRunner) - { - _serializer = serializer; - _provider = provider; - _logger = logger; - _startUpDocumentMigrationRunner = startUpDocumentMigrationRunner; - _startUpDatabaseMigrationRunner = startUpDatabaseMigrationRunner; - } + public MigrationService( + DocumentVersionSerializer serializer, + IMigrationInterceptorProvider provider, + ILogger logger, + IStartUpDocumentMigrationRunner startUpDocumentMigrationRunner, + IStartUpDatabaseMigrationRunner startUpDatabaseMigrationRunner) + { + _serializer = serializer; + _provider = provider; + _logger = logger; + _startUpDocumentMigrationRunner = startUpDocumentMigrationRunner; + _startUpDatabaseMigrationRunner = startUpDatabaseMigrationRunner; + } - public void Migrate() - { - BsonSerializer.RegisterSerializationProvider(_provider); - RegisterSerializer(); + public void Migrate() + { + BsonSerializer.RegisterSerializationProvider(_provider); + RegisterSerializer(); - OnStartup(); - } + OnStartup(); + } - private void OnStartup() + private void OnStartup() + { + _startUpDatabaseMigrationRunner.RunAll(); + _startUpDocumentMigrationRunner.RunAll(); + } + + private void RegisterSerializer() + { + try { - _startUpDatabaseMigrationRunner.RunAll(); - _startUpDocumentMigrationRunner.RunAll(); + BsonSerializer.RegisterSerializer(_serializer.ValueType, _serializer); } - - private void RegisterSerializer() + catch (BsonSerializationException ex) { - try - { - BsonSerializer.RegisterSerializer(_serializer.ValueType, _serializer); - } - catch (BsonSerializationException ex) - { - // Catch if Serializer was registered already ... not great, I know. - // We have to do this, because there is always a default DocumentVersionSerialzer. - // BsonSerializer.LookupSerializer(), does not work. + // Catch if Serializer was registered already ... not great, I know. + // We have to do this, because there is always a default DocumentVersionSerialzer. + // BsonSerializer.LookupSerializer(), does not work. - _logger.LogError(ex, "Cannot register {Type} twice", typeof(DocumentVersionSerializer)); - } + _logger.LogError(ex, "Cannot register {Type} twice", typeof(DocumentVersionSerializer)); } } } \ No newline at end of file diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs b/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs index 571db0c..cd47505 100644 --- a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs +++ b/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs @@ -8,41 +8,40 @@ using Mongo.Migration.Services; using Mongo.Migration.Services.Interceptors; -namespace Mongo.Migration.Startup.DotNetCore +namespace Mongo.Migration.Startup.DotNetCore; + +public static class MongoMigrationExtensions { - public static class MongoMigrationExtensions + public static void AddMigration(this IServiceCollection services, IMongoMigrationSettings? settings = null) { - public static void AddMigration(this IServiceCollection services, IMongoMigrationSettings? settings = null) - { - RegisterDefaults(services, settings ?? new MongoMigrationSettings()); + RegisterDefaults(services, settings ?? new MongoMigrationSettings()); - services.AddScoped(); - } + services.AddScoped(); + } - private static void RegisterDefaults(IServiceCollection services, IMongoMigrationSettings settings) - { - services.AddSingleton(settings); + private static void RegisterDefaults(IServiceCollection services, IMongoMigrationSettings settings) + { + services.AddSingleton(settings); - services.AddSingleton(typeof(IMigrationLocator<>), typeof(TypeMigrationDependencyLocator<>)); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(typeof(IMigrationLocator<>), typeof(TypeMigrationDependencyLocator<>)); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); - services.AddTransient(); + services.AddTransient(); - services.AddTransient(); - } + services.AddTransient(); } } \ No newline at end of file diff --git a/Mongo.Migration/Startup/IMongoMigrationSettings.cs b/Mongo.Migration/Startup/IMongoMigrationSettings.cs index 9ed34cb..30a3b68 100644 --- a/Mongo.Migration/Startup/IMongoMigrationSettings.cs +++ b/Mongo.Migration/Startup/IMongoMigrationSettings.cs @@ -2,18 +2,17 @@ using MongoDB.Driver; -namespace Mongo.Migration.Startup +namespace Mongo.Migration.Startup; + +public interface IMongoMigrationSettings { - public interface IMongoMigrationSettings - { - string ConnectionString { get; set; } + string ConnectionString { get; set; } - string Database { get; set; } + string Database { get; set; } - DocumentVersion DatabaseMigrationVersion { get; set; } + DocumentVersion DatabaseMigrationVersion { get; set; } - string VersionFieldName { get; set; } + string VersionFieldName { get; set; } - MongoClientSettings ClientSettings { get; set; } - } + MongoClientSettings ClientSettings { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration/Startup/MongoMigrationSettings.cs b/Mongo.Migration/Startup/MongoMigrationSettings.cs index 9349347..4d375b3 100644 --- a/Mongo.Migration/Startup/MongoMigrationSettings.cs +++ b/Mongo.Migration/Startup/MongoMigrationSettings.cs @@ -2,18 +2,17 @@ using MongoDB.Driver; -namespace Mongo.Migration.Startup +namespace Mongo.Migration.Startup; + +public class MongoMigrationSettings : IMongoMigrationSettings { - public class MongoMigrationSettings : IMongoMigrationSettings - { - public string ConnectionString { get; set; } + public string ConnectionString { get; set; } - public string Database { get; set; } + public string Database { get; set; } - public DocumentVersion DatabaseMigrationVersion { get; set; } = DocumentVersion.Empty(); + public DocumentVersion DatabaseMigrationVersion { get; set; } = DocumentVersion.Empty(); - public string VersionFieldName { get; set; } + public string VersionFieldName { get; set; } - public MongoClientSettings ClientSettings { get; set; } - } + public MongoClientSettings ClientSettings { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration/Startup/Static/MongoMigrationClient.cs b/Mongo.Migration/Startup/Static/MongoMigrationClient.cs index 1622f85..c14b394 100644 --- a/Mongo.Migration/Startup/Static/MongoMigrationClient.cs +++ b/Mongo.Migration/Startup/Static/MongoMigrationClient.cs @@ -1,28 +1,27 @@ using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Exceptions; -namespace Mongo.Migration.Startup.Static +namespace Mongo.Migration.Startup.Static; + +public static class MongoMigrationClient { - public static class MongoMigrationClient - { - private static bool _isRunning; + private static bool _isRunning; - public static void Initialize(IServiceProvider serviceProvider) + public static void Initialize(IServiceProvider serviceProvider) + { + if (_isRunning) { - if (_isRunning) - { - throw new AlreadyInitializedException(); - } + throw new AlreadyInitializedException(); + } - var app = serviceProvider.GetRequiredService(); - app.Run(); + var app = serviceProvider.GetRequiredService(); + app.Run(); - _isRunning = true; - } + _isRunning = true; + } - public static void Reset() - { - _isRunning = false; - } + public static void Reset() + { + _isRunning = false; } } \ No newline at end of file From ffaea9f4e555d504e2b3849f829ac9951c752299 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Sat, 9 Nov 2024 14:12:32 +0100 Subject: [PATCH 05/42] naming convention --- .../Documents/DocumentVersion_When_casting.cs | 2 +- .../Documents/DocumentVersion_When_compare.cs | 20 ++++++------- .../DocumentVersion_When_creating.cs | 2 +- .../Documents/Document_when_creating.cs | 2 +- .../AttributeMigrationLocator_when_locate.cs | 2 +- ...rializer_when_serialize_and_deserialize.cs | 2 +- ...baseMigrationRunner_when_migrating_down.cs | 12 ++++---- ...tabaseMigrationRunner_when_migrating_up.cs | 6 ++-- .../DatabaseMigration_when_creating.cs | 10 +++---- ...mentMigrationRunner_when_migrating_down.cs | 2 +- ...cumentMigrationRunner_when_migrating_up.cs | 2 +- .../DocumentMigration_when_creating.cs | 10 +++---- .../DocumentMigration_when_migrating.cs | 6 ++-- .../TypeMigrationLocator_when_locate.cs | 6 ++-- .../MongoRegistrater_when_registrating.cs | 2 +- .../Performance/PerformanceOnStartup.cs | 30 +++++++++---------- ...ntVersionService_when_determine_version.cs | 2 +- .../MongoMigration_when_initialize.cs | 2 +- ...grationInterceptorFactory_when_creating.cs | 2 +- ...InterceptorProvider_when_get_serializer.cs | 2 +- .../Database/TestDatabaseMigration_0_0_1.cs | 4 +-- .../Database/TestDatabaseMigration_0_0_2.cs | 4 +-- .../Database/TestDatabaseMigration_0_0_3.cs | 4 +-- .../TestDocumentWithOneMigration_0_0_1.cs | 4 +-- ...entWithTwoMigrationHighestVersion_0_0_1.cs | 4 +-- ...entWithTwoMigrationHighestVersion_0_0_2.cs | 4 +-- ...mentWithTwoMigrationMiddleVersion_0_0_1.cs | 4 +-- ...mentWithTwoMigrationMiddleVersion_0_0_2.cs | 4 +-- .../TestDocumentWithTwoMigration_0_0_1.cs | 4 +-- .../TestDocumentWithTwoMigration_0_0_2.cs | 4 +-- 30 files changed, 82 insertions(+), 82 deletions(-) diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs index 4e8e1f1..1b25a77 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs @@ -5,7 +5,7 @@ namespace Mongo.Migration.Tests.Documents; [TestFixture] -public class DocumentVersion_When_casting +public class DocumentVersionWhenCasting { [Test] public void If_implicit_string_to_version_Then_cast_should_work() diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs index 5955c42..c693062 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs @@ -5,18 +5,18 @@ namespace Mongo.Migration.Tests.Documents; [TestFixture] -public class DocumentVersion_When_compare +public class DocumentVersionWhenCompare { - private readonly DocumentVersion equalLowerVersion = new("0.0.1"); + private readonly DocumentVersion _equalLowerVersion = new("0.0.1"); - private readonly DocumentVersion higherVersion = new("0.0.2"); + private readonly DocumentVersion _higherVersion = new("0.0.2"); - private readonly DocumentVersion lowerVersion = new("0.0.1"); + private readonly DocumentVersion _lowerVersion = new("0.0.1"); [Test] public void If_higherVersion_lte_equalLowerVersion_Then_false() { - bool result = higherVersion <= lowerVersion; + bool result = _higherVersion <= _lowerVersion; result.Should().BeFalse(); } @@ -24,7 +24,7 @@ public void If_higherVersion_lte_equalLowerVersion_Then_false() [Test] public void If_lowerVersion_gt_higherVersion_Then_false() { - bool result = lowerVersion > higherVersion; + bool result = _lowerVersion > _higherVersion; result.Should().BeFalse(); } @@ -32,7 +32,7 @@ public void If_lowerVersion_gt_higherVersion_Then_false() [Test] public void If_lowerVersion_gte_equalLowerVersion_Then_true() { - bool result = lowerVersion >= equalLowerVersion; + bool result = _lowerVersion >= _equalLowerVersion; result.Should().BeTrue(); } @@ -40,7 +40,7 @@ public void If_lowerVersion_gte_equalLowerVersion_Then_true() [Test] public void If_lowerVersion_gte_higherVersion_Then_false() { - bool result = lowerVersion >= higherVersion; + bool result = _lowerVersion >= _higherVersion; result.Should().BeFalse(); } @@ -48,7 +48,7 @@ public void If_lowerVersion_gte_higherVersion_Then_false() [Test] public void If_lowerVersion_lt_higherVersion_Then_true() { - bool result = lowerVersion < higherVersion; + bool result = _lowerVersion < _higherVersion; result.Should().BeTrue(); } @@ -56,7 +56,7 @@ public void If_lowerVersion_lt_higherVersion_Then_true() [Test] public void If_lowerVersion_lte_equalLowerVersion_Then_true() { - bool result = lowerVersion <= equalLowerVersion; + bool result = _lowerVersion <= _equalLowerVersion; result.Should().BeTrue(); } diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs index c267249..a3d685a 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs @@ -6,7 +6,7 @@ namespace Mongo.Migration.Tests.Documents; [TestFixture] -public class DocumentVersion_When_creating +public class DocumentVersionWhenCreating { [Test] public void If_Default_Then_version_is_default_value() diff --git a/Mongo.Migration.Tests/Documents/Document_when_creating.cs b/Mongo.Migration.Tests/Documents/Document_when_creating.cs index 2ee98f4..edd4cfc 100644 --- a/Mongo.Migration.Tests/Documents/Document_when_creating.cs +++ b/Mongo.Migration.Tests/Documents/Document_when_creating.cs @@ -5,7 +5,7 @@ namespace Mongo.Migration.Tests.Documents; [TestFixture] -public class Document_when_creating +public class DocumentWhenCreating { [Test] public void Then_document_can_be_created() diff --git a/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs index 487a237..9e9a5c4 100644 --- a/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs @@ -6,7 +6,7 @@ namespace Mongo.Migration.Tests.Documents.Locators; [TestFixture] -internal class VersionLocator_when_locate +internal class VersionLocatorWhenLocate { [Test] public void Then_find_current_version_of_document() diff --git a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs index 75969fb..ea34262 100644 --- a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs +++ b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs @@ -9,7 +9,7 @@ namespace Mongo.Migration.Tests.Documents.Serializers; [TestFixture] -public class DocumentVersionSerializer_when_serialize_and_deserialize +public class DocumentVersionSerializerWhenSerializeAndDeserialize { private DocumentVersionSerializer _serializer; diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs index 7fa8a9c..ef2bfc4 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs @@ -34,9 +34,9 @@ public void When_database_has_migrations_Then_down_all_migrations() InsertMigrations( new DatabaseMigration[] { - new TestDatabaseMigration_0_0_1(), - new TestDatabaseMigration_0_0_2(), - new TestDatabaseMigration_0_0_3() + new TestDatabaseMigration001(), + new TestDatabaseMigration002(), + new TestDatabaseMigration003() }); // Act @@ -56,9 +56,9 @@ public void When_database_has_migrations_Then_down_to_selected_migration() InsertMigrations( new DatabaseMigration[] { - new TestDatabaseMigration_0_0_1(), - new TestDatabaseMigration_0_0_2(), - new TestDatabaseMigration_0_0_3() + new TestDatabaseMigration001(), + new TestDatabaseMigration002(), + new TestDatabaseMigration003() }); // Act diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs index 52c72f2..3bba3d8 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs @@ -8,7 +8,7 @@ namespace Mongo.Migration.Tests.Migrations.Database; [TestFixture] -internal class DatabaseMigrationRunner_when_migrating_up : DatabaseIntegrationTest +internal class DatabaseMigrationRunnerWhenMigratingUp : DatabaseIntegrationTest { private IDatabaseMigrationRunner _runner; @@ -44,7 +44,7 @@ public void When_database_has_no_migrations_Then_all_migrations_are_used() public void When_database_has_migrations_Then_latest_migrations_are_used() { // Arrange - InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), new TestDatabaseMigration_0_0_2() }); + InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration001(), new TestDatabaseMigration002() }); // Act _runner.Run(Db); @@ -60,7 +60,7 @@ public void When_database_has_latest_version_Then_nothing_happens() { // Arrange InsertMigrations( - new DatabaseMigration[] { new TestDatabaseMigration_0_0_1(), new TestDatabaseMigration_0_0_2(), new TestDatabaseMigration_0_0_3() }); + new DatabaseMigration[] { new TestDatabaseMigration001(), new TestDatabaseMigration002(), new TestDatabaseMigration003() }); // Act _runner.Run(Db); diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs index 0cc5f93..0b1094f 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs @@ -6,13 +6,13 @@ namespace Mongo.Migration.Tests.Migrations.Database; [TestFixture] -public class DatabaseMigration_when_creating +public class DatabaseMigrationWhenCreating { [Test] public void Then_migration_has_type_DatabaseMigration() { // Arrange Act - var migration = new TestDatabaseMigration_0_0_1(); + var migration = new TestDatabaseMigration001(); // Assert migration.Type.Should().Be(typeof(DatabaseMigration)); @@ -22,7 +22,7 @@ public void Then_migration_has_type_DatabaseMigration() public void Then_migration_have_version() { // Arrange Act - var migration = new TestDatabaseMigration_0_0_1(); + var migration = new TestDatabaseMigration001(); // Assert migration.Version.Should().Be("0.0.1"); @@ -32,9 +32,9 @@ public void Then_migration_have_version() public void Then_migration_should_be_created() { // Arrange Act - var migration = new TestDatabaseMigration_0_0_1(); + var migration = new TestDatabaseMigration001(); // Assert - migration.Should().BeOfType(); + migration.Should().BeOfType(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs index 552ddda..d48b0aa 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs @@ -8,7 +8,7 @@ namespace Mongo.Migration.Tests.Migrations.Document; [TestFixture] -internal class DocumentMigrationRunner_when_migrating_down : IntegrationTest +internal class DocumentMigrationRunnerWhenMigratingDown : IntegrationTest { private IDocumentMigrationRunner _runner; diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs index 18ccb22..b06a55c 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs @@ -8,7 +8,7 @@ namespace Mongo.Migration.Tests.Migrations.Document; [TestFixture] -internal class DocumentMigrationRunner_when_migrating_up : IntegrationTest +internal class DocumentMigrationRunnerWhenMigratingUp : IntegrationTest { private IDocumentMigrationRunner _runner; diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs index 5686897..9a07acc 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs @@ -5,13 +5,13 @@ namespace Mongo.Migration.Tests.Migrations.Document; [TestFixture] -public class DocumentMigration_when_creating +public class DocumentMigrationWhenCreating { [Test] public void Then_migration_has_type_testClass() { // Arrange Act - var migration = new TestDocumentWithOneMigration_0_0_1(); + var migration = new TestDocumentWithOneMigration001(); // Assert migration.Type.Should().Be(typeof(TestDocumentWithOneMigration)); @@ -21,7 +21,7 @@ public void Then_migration_has_type_testClass() public void Then_migration_have_version() { // Arrange Act - var migration = new TestDocumentWithOneMigration_0_0_1(); + var migration = new TestDocumentWithOneMigration001(); // Assert migration.Version.Should().Be("0.0.1"); @@ -31,9 +31,9 @@ public void Then_migration_have_version() public void Then_migration_should_be_created() { // Arrange Act - var migration = new TestDocumentWithOneMigration_0_0_1(); + var migration = new TestDocumentWithOneMigration001(); // Assert - migration.Should().BeOfType(); + migration.Should().BeOfType(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs index bb05227..d836117 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs @@ -6,13 +6,13 @@ namespace Mongo.Migration.Tests.Migrations.Document; [TestFixture] -public class DocumentMigration_when_migrating +public class DocumentMigrationWhenMigrating { [Test] public void When_migrating_down_Then_document_changes() { // Arrange - var migration = new TestDocumentWithOneMigration_0_0_1(); + var migration = new TestDocumentWithOneMigration001(); var document = new BsonDocument { { "Doors", 3 } }; // Act @@ -26,7 +26,7 @@ public void When_migrating_down_Then_document_changes() public void When_migrating_up_Then_document_changes() { // Arrange - var migration = new TestDocumentWithOneMigration_0_0_1(); + var migration = new TestDocumentWithOneMigration001(); var document = new BsonDocument { { "Dors", 3 } }; // Act diff --git a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs index c5f9c55..eeb59d7 100644 --- a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs @@ -55,8 +55,8 @@ public void When_get_migrations_gt_and_equal_version() var result = _locator.GetMigrationsGtEq(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); // Assert - result[0].Should().BeOfType(); - result[1].Should().BeOfType(); + result[0].Should().BeOfType(); + result[1].Should().BeOfType(); } [Test] @@ -66,6 +66,6 @@ public void When_get_migrations_gt_version() var result = _locator.GetMigrationsGt(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); // Assert - result[0].Should().BeOfType(); + result[0].Should().BeOfType(); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs b/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs index cd135e2..2d1f701 100644 --- a/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs +++ b/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs @@ -8,7 +8,7 @@ namespace Mongo.Migration.Tests.MongoDB; [TestFixture] -internal class MongoRegistrator_when_registrating : IntegrationTest +internal class MongoRegistratorWhenRegistrating : IntegrationTest { [SetUp] public void SetUp() diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index 8d5af2e..9b7b304 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -17,13 +17,13 @@ namespace Mongo.Migration.Tests.Performance; [TestFixture] public class PerformanceTestOnStartup { - private const int DOCUMENT_COUNT = 10000; + private const int DocumentCount = 10000; - private const string DATABASE_NAME = "PerformanceTest"; + private const string DatabaseName = "PerformanceTest"; - private const string COLLECTION_NAME = "Test"; + private const string CollectionName = "Test"; - private const int TOLERANCE_MS = 2800; + private const int ToleranceMs = 2800; private MongoClient _client; @@ -55,7 +55,7 @@ public void When_migrating_number_of_documents() // Act // Measure time of MongoDb processing without Mongo.Migration - InsertMany(DOCUMENT_COUNT, false); + InsertMany(DocumentCount, false); var sw = new Stopwatch(); sw.Start(); MigrateAll(false); @@ -64,7 +64,7 @@ public void When_migrating_number_of_documents() ClearCollection(); // Measure time of MongoDb processing without Mongo.Migration - InsertMany(DOCUMENT_COUNT, true); + InsertMany(DocumentCount, true); var swWithMigration = new Stopwatch(); swWithMigration.Start(); ServiceCollection serviceCollection = new(); @@ -81,10 +81,10 @@ public void When_migrating_number_of_documents() var result = swWithMigration.ElapsedMilliseconds - sw.ElapsedMilliseconds; Console.WriteLine( - $"MongoDB: {sw.ElapsedMilliseconds}ms, Mongo.Migration: {swWithMigration.ElapsedMilliseconds}ms, Diff: {result}ms (Tolerance: {TOLERANCE_MS}ms), Documents: {DOCUMENT_COUNT}, Migrations per Document: 2"); + $"MongoDB: {sw.ElapsedMilliseconds}ms, Mongo.Migration: {swWithMigration.ElapsedMilliseconds}ms, Diff: {result}ms (Tolerance: {ToleranceMs}ms), Documents: {DocumentCount}, Migrations per Document: 2"); // Assert - result.Should().BeLessThan(TOLERANCE_MS); + result.Should().BeLessThan(ToleranceMs); } private void InsertMany(int number, bool withVersion) @@ -104,7 +104,7 @@ private void InsertMany(int number, bool withVersion) documents.Add(document); } - _client.GetDatabase(DATABASE_NAME).GetCollection(COLLECTION_NAME).InsertManyAsync(documents) + _client.GetDatabase(DatabaseName).GetCollection(CollectionName).InsertManyAsync(documents) .Wait(); } @@ -112,25 +112,25 @@ private void MigrateAll(bool withVersion) { if (withVersion) { - var versionedCollectin = _client.GetDatabase(DATABASE_NAME) - .GetCollection(COLLECTION_NAME); + var versionedCollectin = _client.GetDatabase(DatabaseName) + .GetCollection(CollectionName); var versionedResult = versionedCollectin.FindAsync(_ => true).Result.ToListAsync().Result; return; } - var collection = _client.GetDatabase(DATABASE_NAME) - .GetCollection(COLLECTION_NAME); + var collection = _client.GetDatabase(DatabaseName) + .GetCollection(CollectionName); var result = collection.FindAsync(_ => true).Result.ToListAsync().Result; } private void AddDocumentsToCache() { - InsertMany(DOCUMENT_COUNT, false); + InsertMany(DocumentCount, false); MigrateAll(false); } private void ClearCollection() { - _client.GetDatabase(DATABASE_NAME).DropCollection(COLLECTION_NAME); + _client.GetDatabase(DatabaseName).DropCollection(CollectionName); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs index 86df6ef..8487b6b 100644 --- a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs @@ -8,7 +8,7 @@ namespace Mongo.Migration.Tests.Services; [TestFixture] -internal class DocumentVersionService_when_determine_version : IntegrationTest +internal class DocumentVersionServiceWhenDetermineVersion : IntegrationTest { private IDocumentVersionService _service; diff --git a/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs b/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs index 3daa269..cbc4ad7 100644 --- a/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs +++ b/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs @@ -7,7 +7,7 @@ namespace Mongo.Migration.Tests.Services.Initializers; [TestFixture] -public class MongoMigration_when_initialize +public class MongoMigrationWhenInitialize { [TearDown] public void TearDown() diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs index 79cd32b..7b8ed30 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs @@ -7,7 +7,7 @@ namespace Mongo.Migration.Tests.Services.Interceptors; [TestFixture] -internal class MigrationInterceptorFactory_when_creating : IntegrationTest +internal class MigrationInterceptorFactoryWhenCreating : IntegrationTest { [SetUp] public void SetUp() diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs index 277d14c..563fd44 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs @@ -7,7 +7,7 @@ namespace Mongo.Migration.Tests.Services.Interceptors; [TestFixture] -internal class MigrationInterceptorProvider_when_get_serializer : IntegrationTest +internal class MigrationInterceptorProviderWhenGetSerializer : IntegrationTest { [SetUp] public void SetUp() diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs index e805c03..ec64f3c 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs @@ -3,9 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles.Database; -internal class TestDatabaseMigration_0_0_1 : DatabaseMigration +internal class TestDatabaseMigration001 : DatabaseMigration { - public TestDatabaseMigration_0_0_1() + public TestDatabaseMigration001() : base("0.0.1") { } diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs index 9784f07..d8b85cf 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs @@ -3,9 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles.Database; -internal class TestDatabaseMigration_0_0_2 : DatabaseMigration +internal class TestDatabaseMigration002 : DatabaseMigration { - public TestDatabaseMigration_0_0_2() + public TestDatabaseMigration002() : base("0.0.2") { } diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs index d5f1834..2e2e935 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs @@ -3,9 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles.Database; -internal class TestDatabaseMigration_0_0_3 : DatabaseMigration +internal class TestDatabaseMigration003 : DatabaseMigration { - public TestDatabaseMigration_0_0_3() + public TestDatabaseMigration003() : base("0.0.3") { } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs index 63593a6..da5ec18 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs @@ -3,9 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithOneMigration_0_0_1 : DocumentMigration +internal class TestDocumentWithOneMigration001 : DocumentMigration { - public TestDocumentWithOneMigration_0_0_1() + public TestDocumentWithOneMigration001() : base("0.0.1") { } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs index 8797c3e..f0a2cad 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs @@ -3,9 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigrationHighestVersion_0_0_1 : DocumentMigration +internal class TestDocumentWithTwoMigrationHighestVersion001 : DocumentMigration { - public TestDocumentWithTwoMigrationHighestVersion_0_0_1() + public TestDocumentWithTwoMigrationHighestVersion001() : base("0.0.1") { } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs index 3246d29..fac98ef 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs @@ -3,9 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigrationHighestVersion_0_0_2 : DocumentMigration +internal class TestDocumentWithTwoMigrationHighestVersion002 : DocumentMigration { - public TestDocumentWithTwoMigrationHighestVersion_0_0_2() + public TestDocumentWithTwoMigrationHighestVersion002() : base("0.0.2") { } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs index 36e6fdd..b63a344 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs @@ -3,9 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigrationMiddleVersion_0_0_1 : DocumentMigration +internal class TestDocumentWithTwoMigrationMiddleVersion001 : DocumentMigration { - public TestDocumentWithTwoMigrationMiddleVersion_0_0_1() + public TestDocumentWithTwoMigrationMiddleVersion001() : base("0.0.1") { } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs index 69e1aef..44a9e91 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs @@ -3,9 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigrationMiddleVersion_0_0_2 : DocumentMigration +internal class TestDocumentWithTwoMigrationMiddleVersion002 : DocumentMigration { - public TestDocumentWithTwoMigrationMiddleVersion_0_0_2() + public TestDocumentWithTwoMigrationMiddleVersion002() : base("0.0.2") { } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs index fc99c73..98c1e17 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs @@ -3,9 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigration_0_0_1 : DocumentMigration +internal class TestDocumentWithTwoMigration001 : DocumentMigration { - public TestDocumentWithTwoMigration_0_0_1() + public TestDocumentWithTwoMigration001() : base("0.0.1") { } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs index 5c5aeea..6ec0b8f 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs @@ -3,9 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigration_0_0_2 : DocumentMigration +internal class TestDocumentWithTwoMigration002 : DocumentMigration { - public TestDocumentWithTwoMigration_0_0_2() + public TestDocumentWithTwoMigration002() : base("0.0.2") { } From 55c3aab9d4e9fd655603a57e867e6972c5da28d5 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Sat, 9 Nov 2024 23:19:43 +0100 Subject: [PATCH 06/42] Bump mongo 3.0 - Bump mongo 3.0 - replace Mongo2Go > Testcontainers.Mongodb --- Mongo.Migration.Tests/IntegrationTest.cs | 43 ++++++++++--------- .../Database/DatabaseIntegrationTest.cs | 43 ++++++++++--------- ...baseMigrationRunner_when_migrating_down.cs | 29 ++++--------- ...tabaseMigrationRunner_when_migrating_up.cs | 39 +++++++---------- ...mentMigrationRunner_when_migrating_down.cs | 23 ++-------- ...cumentMigrationRunner_when_migrating_up.cs | 25 +++-------- .../Mongo.Migration.Tests.csproj | 2 +- .../MongoRegistrater_when_registrating.cs | 12 ------ .../Performance/PerformanceOnStartup.cs | 37 +++++++--------- ...seVersionService_when_determine_version.cs | 29 ++++--------- ...ntVersionService_when_determine_version.cs | 25 +++-------- ...grationInterceptorFactory_when_creating.cs | 12 ------ ...InterceptorProvider_when_get_serializer.cs | 12 ------ .../TestcontainersContext.cs | 32 ++++++++++++++ .../StartUpDatabaseMigrationRunner.cs | 33 ++++---------- .../StartUpDocumentMigrationRunner.cs | 39 +++++------------ Mongo.Migration/Mongo.Migration.csproj | 2 +- .../Interceptors/MigrationInterceptor.cs | 30 +++++++------ .../Startup/IMongoMigrationSettings.cs | 6 +-- 19 files changed, 180 insertions(+), 293 deletions(-) create mode 100644 Mongo.Migration.Tests/TestcontainersContext.cs diff --git a/Mongo.Migration.Tests/IntegrationTest.cs b/Mongo.Migration.Tests/IntegrationTest.cs index 5fdfaee..31fa925 100644 --- a/Mongo.Migration.Tests/IntegrationTest.cs +++ b/Mongo.Migration.Tests/IntegrationTest.cs @@ -3,41 +3,44 @@ using Microsoft.Extensions.Logging.Abstractions; using Mongo.Migration.Startup; using Mongo.Migration.Startup.DotNetCore; -using Mongo2Go; using MongoDB.Driver; +using NUnit.Framework; namespace Mongo.Migration.Tests; -public class IntegrationTest : IDisposable +[TestFixture] +public class IntegrationTest { - private MongoClient? _client; - - private MongoDbRunner? _mongoToGoRunner; - + private const string DatabaseName = "PerformanceTest"; + private const string CollectionName = "Test"; private ServiceProvider? _serviceProvider; protected IServiceProvider Provider => _serviceProvider ?? throw new InvalidOperationException("Must be setup"); - public void Dispose() - { - _serviceProvider?.Dispose(); - _mongoToGoRunner?.Dispose(); - GC.SuppressFinalize(this); - } - - protected void OnSetUp() + [SetUp] + protected async Task SetUpAsync() { - _mongoToGoRunner = MongoDbRunner.Start(); - _client = new MongoClient(_mongoToGoRunner.ConnectionString); - - _client.GetDatabase("PerformanceTest").CreateCollection("Test"); + IMongoClient client = TestcontainersContext.MongoClient; + await client.GetDatabase(DatabaseName).CreateCollectionAsync(CollectionName); ServiceCollection serviceCollection = new(); serviceCollection .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) - .AddSingleton(_client) - .AddMigration(new MongoMigrationSettings { ConnectionString = _mongoToGoRunner.ConnectionString, Database = "PerformanceTest" }); + .AddSingleton(client) + .AddMigration(new MongoMigrationSettings { Database = DatabaseName }); _serviceProvider = serviceCollection.BuildServiceProvider(); } + + [TearDown] + protected async Task TearDownAsync() + { + if (_serviceProvider is not null) + { + await _serviceProvider.DisposeAsync(); + } + IMongoClient client = TestcontainersContext.MongoClient; + await client.GetDatabase(DatabaseName) + .DropCollectionAsync(CollectionName); + } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs index fc84313..d13013c 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs @@ -5,51 +5,39 @@ using Mongo.Migration.Migrations.Database; using Mongo.Migration.Startup; using Mongo.Migration.Startup.DotNetCore; -using Mongo2Go; using MongoDB.Bson; using MongoDB.Driver; +using NUnit.Framework; namespace Mongo.Migration.Tests.Migrations.Database; -internal class DatabaseIntegrationTest : IDisposable +[TestFixture] +internal class DatabaseIntegrationTest { private const string MigrationsCollectionName = "_migrations"; - private MongoClient? _client; - private ServiceProvider? _serviceProvider; protected IServiceProvider Provider => _serviceProvider ?? throw new InvalidOperationException("Must be setup"); private IMongoDatabase? _db; protected IMongoDatabase Db => _db ?? throw new InvalidOperationException("Must be setup"); - private MongoDbRunner? _mongoToGoRunner; - protected virtual string DatabaseName { get; set; } = "DatabaseMigration"; protected virtual string CollectionName { get; set; } = "Test"; - - public void Dispose() - { - _serviceProvider?.Dispose(); - _mongoToGoRunner?.Dispose(); - } - - protected virtual void OnSetUp(DocumentVersion databaseMigrationVersion) + + protected async Task OnSetUpAsync(DocumentVersion databaseMigrationVersion) { - _mongoToGoRunner = MongoDbRunner.Start(); - _client = new MongoClient(_mongoToGoRunner.ConnectionString); - _db = _client.GetDatabase(DatabaseName); - _db.CreateCollection(CollectionName); - + IMongoClient client = TestcontainersContext.MongoClient; + _db = client.GetDatabase(DatabaseName); + await _db.CreateCollectionAsync(CollectionName); ServiceCollection serviceCollection = new(); serviceCollection .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) - .AddSingleton(_client) + .AddSingleton(client) .AddMigration(new MongoMigrationSettings { - ConnectionString = _mongoToGoRunner.ConnectionString, Database = DatabaseName, DatabaseMigrationVersion = databaseMigrationVersion }); @@ -57,6 +45,19 @@ protected virtual void OnSetUp(DocumentVersion databaseMigrationVersion) _serviceProvider = serviceCollection.BuildServiceProvider(); } + [TearDown] + public async Task TearDownAsync() + { + if (_serviceProvider is not null) + { + await _serviceProvider.DisposeAsync(); + } + IMongoClient client = TestcontainersContext.MongoClient; + IMongoDatabase database = client.GetDatabase(DatabaseName); + await database.DropCollectionAsync(CollectionName); + await database.DropCollectionAsync(MigrationsCollectionName); + } + protected void InsertMigrations(IEnumerable migrations) { var list = migrations.Select(m => new BsonDocument { { "MigrationId", m.GetType().ToString() }, { "Version", m.Version.ToString() } }); diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs index ef2bfc4..48bafbd 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs @@ -10,25 +10,11 @@ namespace Mongo.Migration.Tests.Migrations.Database; [TestFixture] internal class DatabaseMigrationRunnerWhenMigratingDown : DatabaseIntegrationTest { - private IDatabaseMigrationRunner? _runner; - - protected override void OnSetUp(DocumentVersion databaseMigrationVersion) - { - base.OnSetUp(databaseMigrationVersion); - - _runner = Provider.GetRequiredService(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - [Test] - public void When_database_has_migrations_Then_down_all_migrations() + public async Task When_database_has_migrations_Then_down_all_migrations() { - OnSetUp(DocumentVersion.Default()); + await OnSetUpAsync(DocumentVersion.Default()); + IDatabaseMigrationRunner runner = Provider.GetRequiredService(); // Arrange InsertMigrations( @@ -40,7 +26,7 @@ public void When_database_has_migrations_Then_down_all_migrations() }); // Act - _runner?.Run(Db); + runner.Run(Db); // Assert var migrations = GetMigrationHistory(); @@ -48,9 +34,10 @@ public void When_database_has_migrations_Then_down_all_migrations() } [Test] - public void When_database_has_migrations_Then_down_to_selected_migration() + public async Task When_database_has_migrations_Then_down_to_selected_migration() { - OnSetUp(new("0.0.1")); + await OnSetUpAsync(new("0.0.1")); + IDatabaseMigrationRunner runner = Provider.GetRequiredService(); // Arrange InsertMigrations( @@ -62,7 +49,7 @@ public void When_database_has_migrations_Then_down_to_selected_migration() }); // Act - _runner?.Run(Db); + runner.Run(Db); // Assert var migrations = GetMigrationHistory(); diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs index 3bba3d8..960f786 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs @@ -10,27 +10,15 @@ namespace Mongo.Migration.Tests.Migrations.Database; [TestFixture] internal class DatabaseMigrationRunnerWhenMigratingUp : DatabaseIntegrationTest { - private IDatabaseMigrationRunner _runner; - - [SetUp] - public void SetUp() - { - base.OnSetUp(DocumentVersion.Empty()); - - _runner = Provider.GetRequiredService(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - [Test] - public void When_database_has_no_migrations_Then_all_migrations_are_used() + public async Task When_database_has_no_migrations_Then_all_migrations_are_used() { + // Arrange + await OnSetUpAsync(DocumentVersion.Empty()); + IDatabaseMigrationRunner runner = Provider.GetRequiredService(); + // Act - _runner.Run(Db); + runner.Run(Db); // Assert var migrations = GetMigrationHistory(); @@ -41,13 +29,15 @@ public void When_database_has_no_migrations_Then_all_migrations_are_used() } [Test] - public void When_database_has_migrations_Then_latest_migrations_are_used() + public async Task When_database_has_migrations_Then_latest_migrations_are_used() { // Arrange + await OnSetUpAsync(DocumentVersion.Empty()); + IDatabaseMigrationRunner runner = Provider.GetRequiredService(); InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration001(), new TestDatabaseMigration002() }); // Act - _runner.Run(Db); + runner.Run(Db); // Assert var migrations = GetMigrationHistory(); @@ -56,14 +46,15 @@ public void When_database_has_migrations_Then_latest_migrations_are_used() } [Test] - public void When_database_has_latest_version_Then_nothing_happens() + public async Task When_database_has_latest_version_Then_nothing_happens() { // Arrange - InsertMigrations( - new DatabaseMigration[] { new TestDatabaseMigration001(), new TestDatabaseMigration002(), new TestDatabaseMigration003() }); + await OnSetUpAsync(DocumentVersion.Empty()); + IDatabaseMigrationRunner runner = Provider.GetRequiredService(); + InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration001(), new TestDatabaseMigration002(), new TestDatabaseMigration003() }); // Act - _runner.Run(Db); + runner.Run(Db); // Assert var migrations = GetMigrationHistory(); diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs index d48b0aa..18eaf27 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs @@ -10,26 +10,11 @@ namespace Mongo.Migration.Tests.Migrations.Document; [TestFixture] internal class DocumentMigrationRunnerWhenMigratingDown : IntegrationTest { - private IDocumentMigrationRunner _runner; - - [SetUp] - public void SetUp() - { - OnSetUp(); - - _runner = Provider.GetRequiredService(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - [Test] public void When_migrating_down_Then_all_migrations_are_used() { // Arrange + IDocumentMigrationRunner runner = Provider.GetRequiredService(); BsonDocument document = new() { { "Version", "0.0.2" }, @@ -37,7 +22,7 @@ public void When_migrating_down_Then_all_migrations_are_used() }; // Act - _runner.Run(typeof(TestDocumentWithTwoMigration), document); + runner.Run(typeof(TestDocumentWithTwoMigration), document); // Assert document.Names.ToList()[1].Should().Be("Dors"); @@ -48,7 +33,7 @@ public void When_migrating_down_Then_all_migrations_are_used() public void When_document_has_Then_all_migrations_are_used_to_that_version() { // Arrange - // Arrange + IDocumentMigrationRunner runner = Provider.GetRequiredService(); BsonDocument document = new() { { "Version", "0.0.2" }, @@ -56,7 +41,7 @@ public void When_document_has_Then_all_migrations_are_used_to_that_version() }; // Act - _runner.Run(typeof(TestDocumentWithTwoMigrationMiddleVersion), document); + runner.Run(typeof(TestDocumentWithTwoMigrationMiddleVersion), document); // Assert document.Names.ToList()[1].Should().Be("Doors"); diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs index b06a55c..5994a0b 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs @@ -10,26 +10,11 @@ namespace Mongo.Migration.Tests.Migrations.Document; [TestFixture] internal class DocumentMigrationRunnerWhenMigratingUp : IntegrationTest { - private IDocumentMigrationRunner _runner; - - [SetUp] - public void SetUp() - { - OnSetUp(); - - _runner = Provider.GetRequiredService(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - [Test] public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() { // Arrange + IDocumentMigrationRunner runner = Provider.GetRequiredService(); BsonDocument document = new() { { "Version", "0.0.0" }, @@ -37,7 +22,7 @@ public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() }; // Act - _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); + runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert document.Names.ToList()[1].Should().Be("Door"); @@ -48,13 +33,14 @@ public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() public void When_document_has_no_version_Then_all_migrations_are_used() { // Arrange + IDocumentMigrationRunner runner = Provider.GetRequiredService(); BsonDocument document = new() { { "Dors", 3 } }; // Act - _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); + runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert document.Names.ToList()[1].Should().Be("Door"); @@ -65,6 +51,7 @@ public void When_document_has_no_version_Then_all_migrations_are_used() public void When_document_has_current_version_Then_nothing_happens() { // Arrange + IDocumentMigrationRunner runner = Provider.GetRequiredService(); BsonDocument document = new() { { "Version", "0.0.2" }, @@ -72,7 +59,7 @@ public void When_document_has_current_version_Then_nothing_happens() }; // Act - _runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); + runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert document.Names.ToList()[1].Should().Be("Door"); diff --git a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj index b4a3772..7adc886 100644 --- a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj +++ b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj @@ -19,7 +19,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs b/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs index 2d1f701..26f2e58 100644 --- a/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs +++ b/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs @@ -10,18 +10,6 @@ namespace Mongo.Migration.Tests.MongoDB; [TestFixture] internal class MongoRegistratorWhenRegistrating : IntegrationTest { - [SetUp] - public void SetUp() - { - OnSetUp(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - [Test] public void Then_serializer_is_registered() { diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index 9b7b304..a4a9619 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -7,7 +7,6 @@ using Mongo.Migration.Startup.DotNetCore; using Mongo.Migration.Startup.Static; using Mongo.Migration.Tests.TestDoubles; -using Mongo2Go; using MongoDB.Bson; using MongoDB.Driver; using NUnit.Framework; @@ -25,23 +24,10 @@ public class PerformanceTestOnStartup private const int ToleranceMs = 2800; - private MongoClient _client; - - private MongoDbRunner _runner; - [TearDown] public void TearDown() { MongoMigrationClient.Reset(); - _client = null!; - _runner.Dispose(); - } - - [SetUp] - public void SetUp() - { - _runner = MongoDbRunner.Start(); - _client = new(_runner.ConnectionString); } [Test] @@ -63,14 +49,15 @@ public void When_migrating_number_of_documents() ClearCollection(); - // Measure time of MongoDb processing without Mongo.Migration + // Measure time of MongoDb processing with Mongo.Migration + IMongoClient client = TestcontainersContext.MongoClient; InsertMany(DocumentCount, true); var swWithMigration = new Stopwatch(); swWithMigration.Start(); ServiceCollection serviceCollection = new(); serviceCollection .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) - .AddSingleton(_client) + .AddSingleton(client) .AddMigration(new MongoMigrationSettings()); ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); MongoMigrationClient.Initialize(serviceProvider); @@ -104,21 +91,25 @@ private void InsertMany(int number, bool withVersion) documents.Add(document); } - _client.GetDatabase(DatabaseName).GetCollection(CollectionName).InsertManyAsync(documents) + TestcontainersContext.MongoClient + .GetDatabase(DatabaseName) + .GetCollection(CollectionName) + .InsertManyAsync(documents) .Wait(); } private void MigrateAll(bool withVersion) { + IMongoClient client = TestcontainersContext.MongoClient; + if (withVersion) { - var versionedCollectin = _client.GetDatabase(DatabaseName) + var versionedCollection = client.GetDatabase(DatabaseName) .GetCollection(CollectionName); - var versionedResult = versionedCollectin.FindAsync(_ => true).Result.ToListAsync().Result; + var versionedResult = versionedCollection.FindAsync(_ => true).Result.ToListAsync().Result; return; } - - var collection = _client.GetDatabase(DatabaseName) + var collection = client.GetDatabase(DatabaseName) .GetCollection(CollectionName); var result = collection.FindAsync(_ => true).Result.ToListAsync().Result; } @@ -131,6 +122,8 @@ private void AddDocumentsToCache() private void ClearCollection() { - _client.GetDatabase(DatabaseName).DropCollection(CollectionName); + TestcontainersContext.MongoClient + .GetDatabase(DatabaseName) + .DropCollection(CollectionName); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs index 7cb3315..0b9e677 100644 --- a/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs @@ -10,42 +10,29 @@ namespace Mongo.Migration.Tests.Services; [TestFixture] internal class DatabaseVersionServiceWhenDetermineVersion : DatabaseIntegrationTest { - private IDatabaseVersionService? _service; - - protected override void OnSetUp(DocumentVersion version) - { - base.OnSetUp(version); - - _service = Provider.GetRequiredService(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - [Test] - public void When_project_has_migrations_Then_get_latest_version() + public async Task When_project_has_migrations_Then_get_latest_version() { // Arrange - OnSetUp(DocumentVersion.Empty()); + await OnSetUpAsync(DocumentVersion.Empty()); + IDatabaseVersionService service = Provider.GetRequiredService(); // Act - var migrationVersion = _service?.GetCurrentOrLatestMigrationVersion(); + var migrationVersion = service.GetCurrentOrLatestMigrationVersion(); // Assert migrationVersion.ToString().Should().Be("0.0.3"); } [Test] - public void When_version_set_on_startup_Then_use_startup_version() + public async Task When_version_set_on_startup_Then_use_startup_version() { // Arrange - OnSetUp(new(0, 0, 2)); + await OnSetUpAsync(new(0, 0, 2)); + IDatabaseVersionService service = Provider.GetRequiredService(); // Act - var migrationVersion = _service?.GetCurrentOrLatestMigrationVersion(); + var migrationVersion = service.GetCurrentOrLatestMigrationVersion(); // Assert migrationVersion.ToString().Should().Be("0.0.2"); diff --git a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs index 8487b6b..9286504 100644 --- a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs @@ -10,30 +10,15 @@ namespace Mongo.Migration.Tests.Services; [TestFixture] internal class DocumentVersionServiceWhenDetermineVersion : IntegrationTest { - private IDocumentVersionService _service; - - [SetUp] - public void SetUp() - { - OnSetUp(); - - _service = Provider.GetRequiredService(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - [Test] public void When_document_has_current_version_Then_current_version_is_set() { // Arrange + IDocumentVersionService service = Provider.GetRequiredService(); var document = new TestDocumentWithTwoMigrationMiddleVersion(); // Act - _service.DetermineVersion(document); + service.DetermineVersion(document); // Assert document.Version.Should().Be("0.0.1"); @@ -43,10 +28,11 @@ public void When_document_has_current_version_Then_current_version_is_set() public void When_document_has_highest_version_Then_highest_version_is_set() { // Arrange + IDocumentVersionService service = Provider.GetRequiredService(); var document = new TestDocumentWithTwoMigrationHighestVersion(); // Act - _service.DetermineVersion(document); + service.DetermineVersion(document); // Assert document.Version.Should().Be("0.0.2"); @@ -56,10 +42,11 @@ public void When_document_has_highest_version_Then_highest_version_is_set() public void When_document_has_version_that_should_not_be_Then_throw_exception() { // Arrange + IDocumentVersionService service = Provider.GetRequiredService(); var document = new TestDocumentWithTwoMigrationHighestVersion { Version = "0.0.1" }; // Act// Act - Action checkAction = () => { _service.DetermineVersion(document); }; + Action checkAction = () => { service.DetermineVersion(document); }; // Assert checkAction.Should().Throw(); diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs index 7b8ed30..33657bb 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs @@ -9,18 +9,6 @@ namespace Mongo.Migration.Tests.Services.Interceptors; [TestFixture] internal class MigrationInterceptorFactoryWhenCreating : IntegrationTest { - [SetUp] - public void SetUp() - { - OnSetUp(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - [Test] public void If_type_is_assignable_to_document_Then_interceptor_is_created() { diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs index 563fd44..cf38c72 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs @@ -9,18 +9,6 @@ namespace Mongo.Migration.Tests.Services.Interceptors; [TestFixture] internal class MigrationInterceptorProviderWhenGetSerializer : IntegrationTest { - [SetUp] - public void SetUp() - { - OnSetUp(); - } - - [TearDown] - public void TearDown() - { - Dispose(); - } - [Test] public void When_entity_is_document_Then_provide_serializer() { diff --git a/Mongo.Migration.Tests/TestcontainersContext.cs b/Mongo.Migration.Tests/TestcontainersContext.cs new file mode 100644 index 0000000..a784ff0 --- /dev/null +++ b/Mongo.Migration.Tests/TestcontainersContext.cs @@ -0,0 +1,32 @@ +using MongoDB.Driver; +using NUnit.Framework; +using Testcontainers.MongoDb; + +namespace Mongo.Migration.Tests; + +[SetUpFixture] +public sealed class TestcontainersContext +{ + private static readonly MongoDbContainer s_mongoDbContainer = + new MongoDbBuilder() + .Build(); + private static MongoClient? s_mongoClient; + + public static IMongoClient MongoClient => s_mongoClient ?? throw new InvalidOperationException("Must be initialized"); + + [OneTimeSetUp] + public async Task OneTimeSetup() + { + await s_mongoDbContainer.StartAsync(); + s_mongoClient = new MongoClient(s_mongoDbContainer.GetConnectionString()); + } + + [OneTimeTearDown] + public async Task OneTimeTearDown() + { + s_mongoClient?.Dispose(); + s_mongoClient = null; + await s_mongoDbContainer.StopAsync(); + await s_mongoDbContainer.DisposeAsync(); + } +} \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs index 3756bf8..e6d1ff8 100644 --- a/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs @@ -22,24 +22,14 @@ public StartUpDatabaseMigrationRunner( ICollectionLocator collectionLocator, IDatabaseMigrationRunner migrationRunner) : this( + settings.ClientSettings != null + ? new MongoClient(settings.ClientSettings) + : new MongoClient(settings.ConnectionString), + settings.Database, collectionLocator, migrationRunner) { - if (settings.ConnectionString == null && settings.Database == null || settings.ClientSettings == null) - { - throw new MongoMigrationNoMongoClientException(); - } - - if (settings.ClientSettings != null) - { - _client = new MongoClient(settings.ClientSettings); - } - else - { - _client = new MongoClient(settings.ConnectionString); - } - _databaseName = settings.Database; } public StartUpDatabaseMigrationRunner( @@ -47,24 +37,19 @@ public StartUpDatabaseMigrationRunner( IMongoMigrationSettings settings, ICollectionLocator collectionLocator, IDatabaseMigrationRunner migrationRunner) - : this( - collectionLocator, - migrationRunner) + : this(client, settings.Database, collectionLocator, migrationRunner) { - _client = client; - if (settings.ConnectionString == null && settings.Database == null) - { - return; - } - _client = new MongoClient(settings.ConnectionString); - _databaseName = settings.Database; } private StartUpDatabaseMigrationRunner( + IMongoClient client, + string databaseName, ICollectionLocator collectionLocator, IDatabaseMigrationRunner migrationRunner) { + _client = client; + _databaseName = databaseName; _collectionLocator = collectionLocator; _migrationRunner = migrationRunner; } diff --git a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs index 9afa93b..906fc8f 100644 --- a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs @@ -15,7 +15,7 @@ internal class StartUpDocumentMigrationRunner : IStartUpDocumentMigrationRunner private readonly ICollectionLocator _collectionLocator; - private readonly string? _databaseName; + private readonly string _databaseName; private readonly IDocumentVersionService _documentVersionService; @@ -27,25 +27,15 @@ public StartUpDocumentMigrationRunner( IDocumentVersionService documentVersionService, IDocumentMigrationRunner migrationRunner) : this( + settings.ClientSettings != null + ? new MongoClient(settings.ClientSettings) + : new MongoClient(settings.ConnectionString), + settings.Database, collectionLocator, documentVersionService, migrationRunner) { - if (settings.ConnectionString == null && settings.Database == null || settings.ClientSettings == null) - { - throw new MongoMigrationNoMongoClientException(); - } - - if (settings.ClientSettings != null) - { - _client = new MongoClient(settings.ClientSettings); - } - else - { - _client = new MongoClient(settings.ConnectionString); - } - - _databaseName = settings.Database; + } public StartUpDocumentMigrationRunner( @@ -54,27 +44,20 @@ public StartUpDocumentMigrationRunner( ICollectionLocator collectionLocator, IDocumentVersionService documentVersionService, IDocumentMigrationRunner migrationRunner) - : this( - collectionLocator, - documentVersionService, - migrationRunner) + : this(client, settings.Database, collectionLocator, documentVersionService, migrationRunner) { - _client = client; - if (settings.ConnectionString == null && settings.Database == null) - { - return; - } - - _client = new MongoClient(settings.ConnectionString); - _databaseName = settings.Database; } private StartUpDocumentMigrationRunner( + IMongoClient client, + string databaseName, ICollectionLocator collectionLocator, IDocumentVersionService documentVersionService, IDocumentMigrationRunner migrationRunner) { + _client = client; + _databaseName = databaseName; _collectionLocator = collectionLocator; _documentVersionService = documentVersionService; _migrationRunner = migrationRunner; diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index 7fcc11a..e5473e8 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -10,7 +10,7 @@ - + diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs index a1ae2e2..a13bf2a 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs @@ -1,31 +1,28 @@ using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Document; - using MongoDB.Bson.IO; using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Serializers; namespace Mongo.Migration.Services.Interceptors; -internal class MigrationInterceptor : BsonClassMapSerializer +internal sealed class MigrationInterceptor : SerializerBase where TDocument : class, IDocument { + private static readonly Type s_tDocumentType = typeof(TDocument); + private readonly IDocumentVersionService _documentVersionService; private readonly IDocumentMigrationRunner _migrationRunner; + private readonly BsonClassMapSerializer _innerSerializer; + public MigrationInterceptor(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) - : base(BsonClassMap.LookupClassMap(typeof(TDocument))) { _migrationRunner = migrationRunner; _documentVersionService = documentVersionService; - } - - public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TDocument value) - { - _documentVersionService.DetermineVersion(value); - - base.Serialize(context, args, value); + BsonClassMap classMap = BsonClassMap.LookupClassMap(s_tDocumentType); + _innerSerializer = new BsonClassMapSerializer(classMap); } public override TDocument Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) @@ -33,11 +30,16 @@ public override TDocument Deserialize(BsonDeserializationContext context, BsonDe // TODO: Performance? LatestVersion, dont do anything var document = BsonDocumentSerializer.Instance.Deserialize(context); - _migrationRunner.Run(typeof(TDocument), document); + _migrationRunner.Run(s_tDocumentType, document); - var migratedContext = - BsonDeserializationContext.CreateRoot(new BsonDocumentReader(document)); + var migratedContext = BsonDeserializationContext.CreateRoot(new BsonDocumentReader(document)); + + return _innerSerializer.Deserialize(migratedContext, args); + } - return base.Deserialize(migratedContext, args); + public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TDocument value) + { + _documentVersionService.DetermineVersion(value); + _innerSerializer.Serialize(context, args, value); } } \ No newline at end of file diff --git a/Mongo.Migration/Startup/IMongoMigrationSettings.cs b/Mongo.Migration/Startup/IMongoMigrationSettings.cs index 30a3b68..f198e83 100644 --- a/Mongo.Migration/Startup/IMongoMigrationSettings.cs +++ b/Mongo.Migration/Startup/IMongoMigrationSettings.cs @@ -6,13 +6,13 @@ namespace Mongo.Migration.Startup; public interface IMongoMigrationSettings { - string ConnectionString { get; set; } + string? ConnectionString { get; set; } - string Database { get; set; } + string? Database { get; set; } DocumentVersion DatabaseMigrationVersion { get; set; } string VersionFieldName { get; set; } - MongoClientSettings ClientSettings { get; set; } + MongoClientSettings? ClientSettings { get; set; } } \ No newline at end of file From 3b90f285b6b121168ded64ed57d385bda26ce084 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Mon, 9 Dec 2024 09:03:54 +0100 Subject: [PATCH 07/42] remove warnings --- .../Documents/DocumentVersion_When_casting.cs | 6 +- .../Documents/DocumentVersion_When_compare.cs | 6 +- .../DocumentVersion_When_creating.cs | 47 ++++-- .../Documents/Document_when_creating.cs | 2 +- ...rializer_when_serialize_and_deserialize.cs | 4 +- .../DotNetCore/MigrationBuilderTests.cs | 138 ++++++++++++++++ Mongo.Migration.Tests/IntegrationTest.cs | 22 +-- .../Database/DatabaseIntegrationTest.cs | 32 +--- .../Database/DatabaseMigrationRunnerSetup.cs | 22 --- ...baseMigrationRunner_when_migrating_down.cs | 14 +- ...tabaseMigrationRunner_when_migrating_up.cs | 18 +-- .../DatabaseMigration_when_creating.cs | 2 +- ...mentMigrationRunner_when_migrating_down.cs | 8 +- ...cumentMigrationRunner_when_migrating_up.cs | 6 +- .../DocumentMigration_when_creating.cs | 2 +- .../Interceptor/InterceptorTests.cs | 96 ++++++++++++ .../TypeMigrationLocator_when_locate.cs | 13 +- .../MongoRegistrater_when_registrating.cs | 25 --- .../MongoDB/MongoRegistryTests.cs | 41 +++++ .../Performance/PerformanceOnStartup.cs | 40 ++--- ...seVersionService_when_determine_version.cs | 28 +--- ...ntVersionService_when_determine_version.cs | 13 +- .../MongoMigration_when_initialize.cs | 37 ----- ...grationInterceptorFactory_when_creating.cs | 6 +- ...InterceptorProvider_when_get_serializer.cs | 4 +- .../TestDocumentWithOneMigration.cs | 3 + .../TestDocumentWithTwoMigration.cs | 2 + ...tDocumentWithTwoMigrationHighestVersion.cs | 2 +- ...stDocumentWithTwoMigrationMiddleVersion.cs | 4 +- ...mentWithTwoMigrationMiddleVersion_0_0_1.cs | 12 +- ...mentWithTwoMigrationMiddleVersion_0_0_2.cs | 12 +- .../TestcontainersContext.cs | 40 +++-- .../Attributes/CollectionLocation.cs | 4 +- .../CollectionLocationInformation.cs | 5 +- .../Documents/Attributes/RuntimeVersion.cs | 2 +- .../Documents/Attributes/StartUpVersion.cs | 2 +- Mongo.Migration/Documents/DocumentVersion.cs | 147 ++++-------------- .../Documents/Locators/CollectionLocator.cs | 2 +- .../Serializers/DocumentVersionSerializer.cs | 11 +- .../Extensions/EnumerableExtensions.cs | 2 +- Mongo.Migration/IMongoMigration.cs | 2 +- .../Migrations/Database/DatabaseMigration.cs | 2 +- .../Database/DatabaseMigrationRunner.cs | 17 +- .../Database/IDatabaseMigrationRunner.cs | 7 +- .../IStartUpDatabaseMigrationRunner.cs | 6 - .../StartUpDatabaseMigrationRunner.cs | 75 --------- .../Migrations/Document/DocumentMigration.cs | 2 +- .../Document/IDocumentMigrationRunner.cs | 2 +- .../IStartUpDocumentMigrationRunner.cs | 4 +- .../StartUpDocumentMigrationRunner.cs | 61 +------- .../DatabaseTypeMigrationDependencyLocator.cs | 7 +- .../Migrations/Locators/MigrationLocator.cs | 2 +- Mongo.Migration/Mongo.Migration.csproj | 8 +- Mongo.Migration/MongoMigration.cs | 12 +- .../Services/DatabaseVersionService.cs | 17 +- .../Services/DocumentVersionService.cs | 28 ++-- .../Services/IDatabaseVersionService.cs | 2 +- .../Services/IDocumentVersionService.cs | 1 - Mongo.Migration/Services/IMigrationService.cs | 6 +- .../IMigrationInterceptorFactory.cs | 9 +- .../IMigrationInterceptorProvider.cs | 3 +- .../MigrationInterceptorFactory.cs | 4 + .../MigrationInterceptorProvider.cs | 18 ++- Mongo.Migration/Services/MigrationService.cs | 94 ++++++----- .../DotNetCore/MongoMigrationBuilder.cs | 97 ++++++++++++ .../DotNetCore/MongoMigrationExtensions.cs | 47 ++---- .../MongoMigrationStartupSettings.cs | 8 + .../Startup/IMongoMigrationSettings.cs | 18 --- .../Startup/MongoMigrationSettings.cs | 14 +- .../Startup/Static/MongoMigrationClient.cs | 27 ---- 70 files changed, 758 insertions(+), 724 deletions(-) create mode 100644 Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs delete mode 100644 Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs create mode 100644 Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs delete mode 100644 Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs create mode 100644 Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs delete mode 100644 Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs delete mode 100644 Mongo.Migration/Migrations/Database/IStartUpDatabaseMigrationRunner.cs delete mode 100644 Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs create mode 100644 Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs create mode 100644 Mongo.Migration/Startup/DotNetCore/MongoMigrationStartupSettings.cs delete mode 100644 Mongo.Migration/Startup/IMongoMigrationSettings.cs delete mode 100644 Mongo.Migration/Startup/Static/MongoMigrationClient.cs diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs index 1b25a77..0cd5bcf 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs @@ -10,7 +10,7 @@ public class DocumentVersionWhenCasting [Test] public void If_implicit_string_to_version_Then_cast_should_work() { - DocumentVersion version = "1.0.2"; + DocumentVersion version = new DocumentVersion(1,0,2); version.ToString().Should().Be("1.0.2"); } @@ -18,9 +18,9 @@ public void If_implicit_string_to_version_Then_cast_should_work() [Test] public void If_implicit_version_to_string_Then_cast_should_work() { - var version = new DocumentVersion("1.0.2"); + var version = new DocumentVersion(1,0,2); - string versionString = version; + string versionString = version.ToString(); versionString.Should().Be("1.0.2"); } diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs index c693062..a81e33c 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs @@ -7,11 +7,11 @@ namespace Mongo.Migration.Tests.Documents; [TestFixture] public class DocumentVersionWhenCompare { - private readonly DocumentVersion _equalLowerVersion = new("0.0.1"); + private readonly DocumentVersion _equalLowerVersion = new(0,0,1); - private readonly DocumentVersion _higherVersion = new("0.0.2"); + private readonly DocumentVersion _higherVersion = new(0, 0, 2); - private readonly DocumentVersion _lowerVersion = new("0.0.1"); + private readonly DocumentVersion _lowerVersion = new(0, 0, 1); [Test] public void If_higherVersion_lte_equalLowerVersion_Then_false() diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs index a3d685a..7ccab8b 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs @@ -1,6 +1,5 @@ using FluentAssertions; using Mongo.Migration.Documents; -using Mongo.Migration.Exceptions; using NUnit.Framework; namespace Mongo.Migration.Tests.Documents; @@ -8,10 +7,18 @@ namespace Mongo.Migration.Tests.Documents; [TestFixture] public class DocumentVersionWhenCreating { + [Test] + public void If_Empty_Then_version_is_empty_value() + { + DocumentVersion version = DocumentVersion.Empty; + + version.ToString().Should().Be("-1.0.0"); + } + [Test] public void If_Default_Then_version_is_default_value() { - DocumentVersion version = DocumentVersion.Default(); + DocumentVersion version = DocumentVersion.Default; version.ToString().Should().Be("0.0.0"); } @@ -19,9 +26,9 @@ public void If_Default_Then_version_is_default_value() [Test] public void If_first_part_contains_char_Then_exception_is_thrown() { - Action act = () => new DocumentVersion("a.0.0"); + Action act = () => DocumentVersion.Parse("a.0.0"); - act.Should().Throw(); + act.Should().Throw(); } [Test] @@ -35,7 +42,7 @@ public void If_new_version_with_int_Then_version_string_should_be_same() [Test] public void If_new_version_with_string_Then_version_string_should_be_same() { - var version = new DocumentVersion("1.0.2"); + var version = DocumentVersion.Parse("1.0.2"); version.ToString().Should().Be("1.0.2"); } @@ -43,24 +50,40 @@ public void If_new_version_with_string_Then_version_string_should_be_same() [Test] public void If_second_part_contains_char_Then_exception_is_thrown() { - Action act = () => new DocumentVersion("0.a.0"); + Action act = () => DocumentVersion.Parse("0.a.0"); - act.Should().Throw(); + act.Should().Throw(); } [Test] public void If_third_part_contains_char_Then_exception_is_thrown() { - Action act = () => new DocumentVersion("0.0.a"); + Action act = () => DocumentVersion.Parse("0.0.a"); + + act.Should().Throw(); + } + + [Test] + public void If_version_string_is_too_long_Then_exception_is_thrown() + { + Action act = () => DocumentVersion.Parse("0.0.0.0"); + + act.Should().Throw(); + } + + [Test] + public void If_version_string_is_too_short1_then_default() + { + var version = DocumentVersion.Parse("33"); - act.Should().Throw(); + version.ToString().Should().Be("33.0.0"); } [Test] - public void If_version_string_is_to_long_Then_exception_is_thrown() + public void If_version_string_is_too_short2_then_default() { - Action act = () => new DocumentVersion("0.0.0.0"); + var version = DocumentVersion.Parse("42.27"); - act.Should().Throw(); + version.ToString().Should().Be("42.27.0"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/Document_when_creating.cs b/Mongo.Migration.Tests/Documents/Document_when_creating.cs index edd4cfc..dc9d89c 100644 --- a/Mongo.Migration.Tests/Documents/Document_when_creating.cs +++ b/Mongo.Migration.Tests/Documents/Document_when_creating.cs @@ -27,6 +27,6 @@ public void Then_document_has_a_version() var version = document.Version; // Assert - version.Should().Be("0.0.0"); + version.ToString().Should().Be("0.0.0"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs index ea34262..8d7630b 100644 --- a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs +++ b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs @@ -28,7 +28,7 @@ public void Then_version_is_deserialized_correct() // Assert result.Should().BeOfType(); - result.Should().Be("0.1.1"); + result.ToString().Should().Be("0.1.1"); } [Test] @@ -38,7 +38,7 @@ public void Then_version_is_serialized_correct() BsonDocumentWriter writer = CreateVersionWriter(); BsonSerializationContext context = BsonSerializationContext.CreateRoot(writer); var args = new BsonSerializationArgs { NominalType = typeof(DocumentVersion) }; - var version = new DocumentVersion("0.0.1"); + var version = new DocumentVersion(0,0,1); // Act _serializer.Serialize(context, args, version); diff --git a/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs b/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs new file mode 100644 index 0000000..7e75521 --- /dev/null +++ b/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Mongo.Migration.Documents.Locators; +using Mongo.Migration.Migrations.Database; +using Mongo.Migration.Migrations.Document; +using Mongo.Migration.Services; +using Mongo.Migration.Services.Interceptors; +using Mongo.Migration.Startup.DotNetCore; +using MongoDB.Driver; +using NUnit.Framework; + +namespace Mongo.Migration.Tests.DotNetCore; + +[TestFixture] +internal class MigrationBuilderTests +{ + [Test] + public void AllMigrationsEnabledWhenNotSet() + { + IServiceCollection services = CreateEmptyServiceCollection(); + + services.AddMigration(); + + using ServiceProvider provider = services.BuildServiceProvider(); + + MongoMigrationStartupSettings startupSettings = provider.GetRequiredService(); + + Assert.Multiple(() => + { + Assert.That(startupSettings.RuntimeMigrationEnabled, Is.True); + Assert.That(startupSettings.DatabaseMigrationEnabled, Is.True); + Assert.That(startupSettings.StartupDocumentMigrationEnabled, Is.True); + }); + } + + [Test] + public void RuntimeMigrationOnlyRequiredRegistered() + { + IServiceCollection services = CreateEmptyServiceCollection(); + + services.AddMigration(builder => builder.AddRuntimeDocumentMigration()); + + using ServiceProvider provider = services.BuildServiceProvider(); + + MongoMigrationStartupSettings startupSettings = provider.GetRequiredService(); + + Assert.Multiple(() => + { + Assert.That(startupSettings.RuntimeMigrationEnabled, Is.True); + Assert.That(startupSettings.DatabaseMigrationEnabled, Is.False); + Assert.That(startupSettings.StartupDocumentMigrationEnabled, Is.False); + + Assert.That( + provider.GetRequiredService(), + Is.TypeOf()); + Assert.That( + provider.GetRequiredService(), + Is.TypeOf()); + + Assert.Throws(() => provider.GetRequiredService()); + Assert.Throws(() => provider.GetRequiredService()); + Assert.Throws(() => provider.GetRequiredService()); + }); + } + + [Test] + public void DatabaseMigrationOnlyRequiredRegistered() + { + IServiceCollection services = CreateEmptyServiceCollection(); + + services.AddMigration(builder => builder.AddDatabaseMigration()); + + using ServiceProvider provider = services.BuildServiceProvider(); + + MongoMigrationStartupSettings startupSettings = provider.GetRequiredService(); + + Assert.Multiple(() => + { + Assert.That(startupSettings.RuntimeMigrationEnabled, Is.False); + Assert.That(startupSettings.DatabaseMigrationEnabled, Is.True); + Assert.That(startupSettings.StartupDocumentMigrationEnabled, Is.False); + + Assert.That( + provider.GetRequiredService(), + Is.TypeOf()); + Assert.That( + provider.GetRequiredService(), + Is.TypeOf()); + + Assert.Throws(() => provider.GetRequiredService()); + Assert.Throws(() => provider.GetRequiredService()); + Assert.Throws(() => + provider.GetRequiredService()); + }); + } + + [Test] + public void DocumentStartupMigrationOnlyRequiredRegistered() + { + IServiceCollection services = CreateEmptyServiceCollection(); + + services.AddMigration(builder => builder.AddStartupDocumentMigration()); + + using ServiceProvider provider = services.BuildServiceProvider(); + + MongoMigrationStartupSettings startupSettings = provider.GetRequiredService(); + + Assert.Multiple(() => + { + Assert.That(startupSettings.RuntimeMigrationEnabled, Is.False); + Assert.That(startupSettings.DatabaseMigrationEnabled, Is.False); + Assert.That(startupSettings.StartupDocumentMigrationEnabled, Is.True); + + Assert.That( + provider.GetRequiredService(), + Is.TypeOf()); + Assert.That( + provider.GetRequiredService(), + Is.TypeOf()); + + Assert.Throws(() => provider.GetRequiredService()); + Assert.Throws(() => provider.GetRequiredService()); + }); + } + + private static IServiceCollection CreateEmptyServiceCollection() + { + return new ServiceCollection() + .AddLogging(builder => builder.AddProvider(NullLoggerProvider.Instance)) + .AddSingleton(new MongoClient()); + } +} \ No newline at end of file diff --git a/Mongo.Migration.Tests/IntegrationTest.cs b/Mongo.Migration.Tests/IntegrationTest.cs index 31fa925..ef7c2e3 100644 --- a/Mongo.Migration.Tests/IntegrationTest.cs +++ b/Mongo.Migration.Tests/IntegrationTest.cs @@ -1,9 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; -using Mongo.Migration.Startup; -using Mongo.Migration.Startup.DotNetCore; -using MongoDB.Driver; +using MongoDB.Driver; using NUnit.Framework; namespace Mongo.Migration.Tests; @@ -13,32 +8,17 @@ public class IntegrationTest { private const string DatabaseName = "PerformanceTest"; private const string CollectionName = "Test"; - private ServiceProvider? _serviceProvider; - - protected IServiceProvider Provider => _serviceProvider ?? throw new InvalidOperationException("Must be setup"); [SetUp] protected async Task SetUpAsync() { IMongoClient client = TestcontainersContext.MongoClient; await client.GetDatabase(DatabaseName).CreateCollectionAsync(CollectionName); - - ServiceCollection serviceCollection = new(); - serviceCollection - .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) - .AddSingleton(client) - .AddMigration(new MongoMigrationSettings { Database = DatabaseName }); - - _serviceProvider = serviceCollection.BuildServiceProvider(); } [TearDown] protected async Task TearDownAsync() { - if (_serviceProvider is not null) - { - await _serviceProvider.DisposeAsync(); - } IMongoClient client = TestcontainersContext.MongoClient; await client.GetDatabase(DatabaseName) .DropCollectionAsync(CollectionName); diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs index d13013c..cecabb3 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs @@ -1,10 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; -using Mongo.Migration.Documents; -using Mongo.Migration.Migrations.Database; -using Mongo.Migration.Startup; -using Mongo.Migration.Startup.DotNetCore; +using Mongo.Migration.Migrations.Database; using MongoDB.Bson; using MongoDB.Driver; using NUnit.Framework; @@ -16,9 +10,6 @@ internal class DatabaseIntegrationTest { private const string MigrationsCollectionName = "_migrations"; - private ServiceProvider? _serviceProvider; - protected IServiceProvider Provider => _serviceProvider ?? throw new InvalidOperationException("Must be setup"); - private IMongoDatabase? _db; protected IMongoDatabase Db => _db ?? throw new InvalidOperationException("Must be setup"); @@ -26,32 +17,16 @@ internal class DatabaseIntegrationTest protected virtual string CollectionName { get; set; } = "Test"; - protected async Task OnSetUpAsync(DocumentVersion databaseMigrationVersion) + protected async Task OnSetUpAsync() { IMongoClient client = TestcontainersContext.MongoClient; _db = client.GetDatabase(DatabaseName); await _db.CreateCollectionAsync(CollectionName); - - ServiceCollection serviceCollection = new(); - serviceCollection - .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) - .AddSingleton(client) - .AddMigration(new MongoMigrationSettings - { - Database = DatabaseName, - DatabaseMigrationVersion = databaseMigrationVersion - }); - - _serviceProvider = serviceCollection.BuildServiceProvider(); } [TearDown] public async Task TearDownAsync() { - if (_serviceProvider is not null) - { - await _serviceProvider.DisposeAsync(); - } IMongoClient client = TestcontainersContext.MongoClient; IMongoDatabase database = client.GetDatabase(DatabaseName); await database.DropCollectionAsync(CollectionName); @@ -61,7 +36,8 @@ public async Task TearDownAsync() protected void InsertMigrations(IEnumerable migrations) { var list = migrations.Select(m => new BsonDocument { { "MigrationId", m.GetType().ToString() }, { "Version", m.Version.ToString() } }); - Db.GetCollection(MigrationsCollectionName).InsertManyAsync(list).Wait(); + Db.GetCollection(MigrationsCollectionName) + .InsertManyAsync(list).Wait(); } protected List GetMigrationHistory() diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs deleted file mode 100644 index 4de5762..0000000 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunnerSetup.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Mongo.Migration.Documents.Serializers; -using MongoDB.Bson.Serialization; -using NUnit.Framework; - -namespace Mongo.Migration.Tests.Migrations.Database; - -[SetUpFixture] -public class DatabaseMigrationRunnerSetup -{ - [OneTimeSetUp] - public void GlobalSetup() - { - var documentVersionSerializer = new DocumentVersionSerializer(); - BsonSerializer.TryRegisterSerializer(documentVersionSerializer.ValueType, documentVersionSerializer); - } - - [OneTimeTearDown] - public void GlobalTeardown() - { - // Do logout here - } -} \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs index 48bafbd..2851f47 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs @@ -13,8 +13,8 @@ internal class DatabaseMigrationRunnerWhenMigratingDown : DatabaseIntegrationTes [Test] public async Task When_database_has_migrations_Then_down_all_migrations() { - await OnSetUpAsync(DocumentVersion.Default()); - IDatabaseMigrationRunner runner = Provider.GetRequiredService(); + await OnSetUpAsync(); + IDatabaseMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); // Arrange InsertMigrations( @@ -26,7 +26,7 @@ public async Task When_database_has_migrations_Then_down_all_migrations() }); // Act - runner.Run(Db); + runner.Run(Db, DocumentVersion.Default); // Assert var migrations = GetMigrationHistory(); @@ -36,8 +36,8 @@ public async Task When_database_has_migrations_Then_down_all_migrations() [Test] public async Task When_database_has_migrations_Then_down_to_selected_migration() { - await OnSetUpAsync(new("0.0.1")); - IDatabaseMigrationRunner runner = Provider.GetRequiredService(); + await OnSetUpAsync(); + IDatabaseMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); // Arrange InsertMigrations( @@ -49,11 +49,11 @@ public async Task When_database_has_migrations_Then_down_to_selected_migration() }); // Act - runner.Run(Db); + runner.Run(Db, new DocumentVersion(0, 0, 1)); // Assert var migrations = GetMigrationHistory(); migrations.Should().NotBeEmpty(); - migrations.Should().OnlyContain(m => m.Version == "0.0.1"); + migrations.Should().OnlyContain(m => m.Version == new DocumentVersion(0, 0, 1)); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs index 960f786..9ab57a9 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs @@ -14,11 +14,11 @@ internal class DatabaseMigrationRunnerWhenMigratingUp : DatabaseIntegrationTest public async Task When_database_has_no_migrations_Then_all_migrations_are_used() { // Arrange - await OnSetUpAsync(DocumentVersion.Empty()); - IDatabaseMigrationRunner runner = Provider.GetRequiredService(); + await OnSetUpAsync(); + IDatabaseMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); // Act - runner.Run(Db); + runner.Run(Db, DocumentVersion.Empty); // Assert var migrations = GetMigrationHistory(); @@ -32,12 +32,12 @@ public async Task When_database_has_no_migrations_Then_all_migrations_are_used() public async Task When_database_has_migrations_Then_latest_migrations_are_used() { // Arrange - await OnSetUpAsync(DocumentVersion.Empty()); - IDatabaseMigrationRunner runner = Provider.GetRequiredService(); + await OnSetUpAsync(); + IDatabaseMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration001(), new TestDatabaseMigration002() }); // Act - runner.Run(Db); + runner.Run(Db, DocumentVersion.Empty); // Assert var migrations = GetMigrationHistory(); @@ -49,12 +49,12 @@ public async Task When_database_has_migrations_Then_latest_migrations_are_used() public async Task When_database_has_latest_version_Then_nothing_happens() { // Arrange - await OnSetUpAsync(DocumentVersion.Empty()); - IDatabaseMigrationRunner runner = Provider.GetRequiredService(); + await OnSetUpAsync(); + IDatabaseMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration001(), new TestDatabaseMigration002(), new TestDatabaseMigration003() }); // Act - runner.Run(Db); + runner.Run(Db, DocumentVersion.Empty); // Assert var migrations = GetMigrationHistory(); diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs index 0b1094f..ae5d409 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs @@ -25,7 +25,7 @@ public void Then_migration_have_version() var migration = new TestDatabaseMigration001(); // Assert - migration.Version.Should().Be("0.0.1"); + migration.Version.ToString().Should().Be("0.0.1"); } [Test] diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs index 18eaf27..39d80ff 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs @@ -14,7 +14,7 @@ internal class DocumentMigrationRunnerWhenMigratingDown : IntegrationTest public void When_migrating_down_Then_all_migrations_are_used() { // Arrange - IDocumentMigrationRunner runner = Provider.GetRequiredService(); + IDocumentMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); BsonDocument document = new() { { "Version", "0.0.2" }, @@ -33,18 +33,18 @@ public void When_migrating_down_Then_all_migrations_are_used() public void When_document_has_Then_all_migrations_are_used_to_that_version() { // Arrange - IDocumentMigrationRunner runner = Provider.GetRequiredService(); + IDocumentMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); BsonDocument document = new() { { "Version", "0.0.2" }, - { "Door", 3 } + { "Doors2", 3 } }; // Act runner.Run(typeof(TestDocumentWithTwoMigrationMiddleVersion), document); // Assert - document.Names.ToList()[1].Should().Be("Doors"); + document.Names.ToList()[1].Should().Be("Doors1"); document.Values.ToList()[0].AsString.Should().Be("0.0.1"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs index 5994a0b..97f79e4 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs @@ -14,7 +14,7 @@ internal class DocumentMigrationRunnerWhenMigratingUp : IntegrationTest public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() { // Arrange - IDocumentMigrationRunner runner = Provider.GetRequiredService(); + IDocumentMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); BsonDocument document = new() { { "Version", "0.0.0" }, @@ -33,7 +33,7 @@ public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() public void When_document_has_no_version_Then_all_migrations_are_used() { // Arrange - IDocumentMigrationRunner runner = Provider.GetRequiredService(); + IDocumentMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); BsonDocument document = new() { { "Dors", 3 } @@ -51,7 +51,7 @@ public void When_document_has_no_version_Then_all_migrations_are_used() public void When_document_has_current_version_Then_nothing_happens() { // Arrange - IDocumentMigrationRunner runner = Provider.GetRequiredService(); + IDocumentMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); BsonDocument document = new() { { "Version", "0.0.2" }, diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs index 9a07acc..732d694 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs @@ -24,7 +24,7 @@ public void Then_migration_have_version() var migration = new TestDocumentWithOneMigration001(); // Assert - migration.Version.Should().Be("0.0.1"); + migration.Version.ToString().Should().Be("0.0.1"); } [Test] diff --git a/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs b/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs new file mode 100644 index 0000000..4256033 --- /dev/null +++ b/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs @@ -0,0 +1,96 @@ +using Microsoft.Extensions.DependencyInjection; +using Mongo.Migration.Tests.TestDoubles; +using MongoDB.Bson; +using MongoDB.Driver; +using NUnit.Framework; + +namespace Mongo.Migration.Tests.Migrations.Interceptor; + +public class InterceptorMigrationWhenCreating : IntegrationTest +{ + private const string DatabaseName = "TestDatabase"; + private const string CollectionName = "TestCollection"; + + [Test] + public async Task TestSerializationIntercepted() + { + IMongoCollection untypedCollection = GetCollection(); + IMongoCollection testDocumentCollection = + GetCollection(); + + await testDocumentCollection.InsertOneAsync(new TestDocumentWithTwoMigrationMiddleVersion + { + Doors1 = 42 + }); + + BsonDocument? documentInserted = await untypedCollection + .Find(Builders.Filter.Eq("Doors1", 42)) + .FirstOrDefaultAsync(); + + Assert.That(documentInserted, Is.Not.Null); + Assert.That(documentInserted["Version"].AsString, Is.EqualTo("0.0.1")); + } + + [Test] + public async Task TestDeserializationIntercepted() + { + IMongoCollection untypedCollection = GetCollection(); + IMongoCollection testDocumentCollection = + GetCollection(); + + await untypedCollection.InsertManyAsync(new[] + { + new BsonDocument + { + new("Doors0", new BsonInt32(0)), + new("Version", new BsonString("0.0.0")) + }, + new BsonDocument + { + new("Doors1", new BsonInt32(1)), + new("Version", new BsonString("0.0.1")) + }, + new BsonDocument + { + new("Doors2", new BsonInt32(2)), + new("Version", new BsonString("0.0.2")) + } + }); + + var asyncCursor = await testDocumentCollection + .FindAsync(FilterDefinition.Empty); + List documents = await asyncCursor.ToListAsync(); + + Assert.Multiple(() => + { + Assert.That(documents.Count, Is.EqualTo(3)); + Assert.That( + documents.Select(d => d.Version.ToString()), + Is.All.EqualTo("0.0.1")); + + Assert.That(documents[0].Doors1, Is.EqualTo(0)); + Assert.That(documents[1].Doors1, Is.EqualTo(1)); + Assert.That(documents[2].Doors1, Is.EqualTo(2)); + }); + } + + [SetUp] + public void SetUpLocal() + { + IMongoCollection _ = GetCollection(); + } + + [TearDown] + public async Task TearDownLocalAsync() + { + await GetCollection() + .DeleteManyAsync(d => true); + } + + private static IMongoCollection GetCollection() + { + return TestcontainersContext.Provider.GetRequiredService() + .GetDatabase(DatabaseName) + .GetCollection(CollectionName); + } +} \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs index eeb59d7..13580bf 100644 --- a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs @@ -1,5 +1,6 @@ using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; +using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Locators; using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; @@ -45,14 +46,17 @@ public void When_get_latest_version_of_migrations() var version = _locator.GetLatestVersion(typeof(TestDocumentWithTwoMigration)); // Assert - version.Should().Be("0.0.2"); + version.ToString().Should().Be("0.0.2"); } [Test] public void When_get_migrations_gt_and_equal_version() { // Act - var result = _locator.GetMigrationsGtEq(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); + var result = _locator.GetMigrationsGtEq( + typeof(TestDocumentWithTwoMigration), + new DocumentVersion(0,0,1)) + .ToList(); // Assert result[0].Should().BeOfType(); @@ -63,7 +67,10 @@ public void When_get_migrations_gt_and_equal_version() public void When_get_migrations_gt_version() { // Act - var result = _locator.GetMigrationsGt(typeof(TestDocumentWithTwoMigration), "0.0.1").ToList(); + var result = _locator.GetMigrationsGt( + typeof(TestDocumentWithTwoMigration), + new DocumentVersion(0, 0, 1)) + .ToList(); // Assert result[0].Should().BeOfType(); diff --git a/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs b/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs deleted file mode 100644 index 26f2e58..0000000 --- a/Mongo.Migration.Tests/MongoDB/MongoRegistrater_when_registrating.cs +++ /dev/null @@ -1,25 +0,0 @@ -using FluentAssertions; -using Microsoft.Extensions.DependencyInjection; -using Mongo.Migration.Documents; -using Mongo.Migration.Services; -using MongoDB.Bson.Serialization; -using NUnit.Framework; - -namespace Mongo.Migration.Tests.MongoDB; - -[TestFixture] -internal class MongoRegistratorWhenRegistrating : IntegrationTest -{ - [Test] - public void Then_serializer_is_registered() - { - // Arrange - var migrationService = Provider.GetRequiredService(); - - // Act - migrationService.Migrate(); - - // Arrange - BsonSerializer.LookupSerializer().ValueType.Should().Be(typeof(DocumentVersion)); - } -} \ No newline at end of file diff --git a/Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs b/Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs new file mode 100644 index 0000000..b3b8e30 --- /dev/null +++ b/Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs @@ -0,0 +1,41 @@ +using Microsoft.Extensions.DependencyInjection; +using Mongo.Migration.Documents; +using Mongo.Migration.Documents.Serializers; +using Mongo.Migration.Services; +using Mongo.Migration.Services.Interceptors; +using Mongo.Migration.Tests.TestDoubles; +using MongoDB.Bson; +using MongoDB.Bson.Serialization; +using NUnit.Framework; + +namespace Mongo.Migration.Tests.MongoDB; + +/// +/// Test that static serializers are registered (called from ) +/// +[TestFixture] +internal class MongoRegistryTests : IntegrationTest +{ + [Test] + public void DocumentVersionSerializerIsRegistered() + { + Assert.That( + BsonSerializer.SerializerRegistry.GetSerializer(), + Is.TypeOf()); + } + + [Test] + public void MongoSerializerProviderIsRegistered() + { + Assert.That( + BsonSerializer.SerializerRegistry.GetSerializer(), + Is.TypeOf>()); + } + + [Test] + public void WhenInitializeTwiceThrows() + { + var migrationService = TestcontainersContext.Provider.GetRequiredService(); + Assert.Throws(migrationService.RegisterBsonStatics); + } +} \ No newline at end of file diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index a4a9619..36fdf27 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -1,11 +1,9 @@ -using System.Diagnostics; +using System.ComponentModel.Design; +using System.Diagnostics; using FluentAssertions; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; -using Mongo.Migration.Startup; -using Mongo.Migration.Startup.DotNetCore; -using Mongo.Migration.Startup.Static; +using Mongo.Migration.Migrations.Database; +using Mongo.Migration.Migrations.Document; using Mongo.Migration.Tests.TestDoubles; using MongoDB.Bson; using MongoDB.Driver; @@ -24,12 +22,6 @@ public class PerformanceTestOnStartup private const int ToleranceMs = 2800; - [TearDown] - public void TearDown() - { - MongoMigrationClient.Reset(); - } - [Test] public void When_migrating_number_of_documents() { @@ -54,27 +46,23 @@ public void When_migrating_number_of_documents() InsertMany(DocumentCount, true); var swWithMigration = new Stopwatch(); swWithMigration.Start(); - ServiceCollection serviceCollection = new(); - serviceCollection - .AddLogging(l => l.AddProvider(NullLoggerProvider.Instance)) - .AddSingleton(client) - .AddMigration(new MongoMigrationSettings()); - ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); - MongoMigrationClient.Initialize(serviceProvider); + + IStartUpDocumentMigrationRunner documentMigrationRunner = + TestcontainersContext.Provider.GetRequiredService(); + documentMigrationRunner.RunAll(client.GetDatabase(DatabaseName)); swWithMigration.Stop(); ClearCollection(); var result = swWithMigration.ElapsedMilliseconds - sw.ElapsedMilliseconds; - Console.WriteLine( - $"MongoDB: {sw.ElapsedMilliseconds}ms, Mongo.Migration: {swWithMigration.ElapsedMilliseconds}ms, Diff: {result}ms (Tolerance: {ToleranceMs}ms), Documents: {DocumentCount}, Migrations per Document: 2"); - + TestContext.Out.WriteLine($"MongoDB: {sw.ElapsedMilliseconds}ms, Mongo.Migration: {swWithMigration.ElapsedMilliseconds}ms, Diff: {result}ms (Tolerance: {ToleranceMs}ms), Documents: {DocumentCount}, Migrations per Document: 2"); + // Assert result.Should().BeLessThan(ToleranceMs); } - private void InsertMany(int number, bool withVersion) + private static void InsertMany(int number, bool withVersion) { var documents = new List(); for (var n = 0; n < number; n++) @@ -98,7 +86,7 @@ private void InsertMany(int number, bool withVersion) .Wait(); } - private void MigrateAll(bool withVersion) + private static void MigrateAll(bool withVersion) { IMongoClient client = TestcontainersContext.MongoClient; @@ -114,13 +102,13 @@ private void MigrateAll(bool withVersion) var result = collection.FindAsync(_ => true).Result.ToListAsync().Result; } - private void AddDocumentsToCache() + private static void AddDocumentsToCache() { InsertMany(DocumentCount, false); MigrateAll(false); } - private void ClearCollection() + private static void ClearCollection() { TestcontainersContext.MongoClient .GetDatabase(DatabaseName) diff --git a/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs index 0b9e677..25a8f24 100644 --- a/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DatabaseVersionService_when_determine_version.cs @@ -1,6 +1,4 @@ -using FluentAssertions; -using Microsoft.Extensions.DependencyInjection; -using Mongo.Migration.Documents; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Services; using Mongo.Migration.Tests.Migrations.Database; using NUnit.Framework; @@ -11,30 +9,16 @@ namespace Mongo.Migration.Tests.Services; internal class DatabaseVersionServiceWhenDetermineVersion : DatabaseIntegrationTest { [Test] - public async Task When_project_has_migrations_Then_get_latest_version() + public async Task WhenProjectHasMigrationsThenGetLatestVersion() { // Arrange - await OnSetUpAsync(DocumentVersion.Empty()); - IDatabaseVersionService service = Provider.GetRequiredService(); + await OnSetUpAsync(); + IDatabaseVersionService service = TestcontainersContext.Provider.GetRequiredService(); // Act - var migrationVersion = service.GetCurrentOrLatestMigrationVersion(); + var migrationVersion = service.GetLatestMigrationVersion(); // Assert - migrationVersion.ToString().Should().Be("0.0.3"); - } - - [Test] - public async Task When_version_set_on_startup_Then_use_startup_version() - { - // Arrange - await OnSetUpAsync(new(0, 0, 2)); - IDatabaseVersionService service = Provider.GetRequiredService(); - - // Act - var migrationVersion = service.GetCurrentOrLatestMigrationVersion(); - - // Assert - migrationVersion.ToString().Should().Be("0.0.2"); + Assert.That(migrationVersion.ToString(), Is.EqualTo("0.0.3")); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs index 9286504..da6b730 100644 --- a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs @@ -1,5 +1,6 @@ using FluentAssertions; using Microsoft.Extensions.DependencyInjection; +using Mongo.Migration.Documents; using Mongo.Migration.Exceptions; using Mongo.Migration.Services; using Mongo.Migration.Tests.TestDoubles; @@ -14,36 +15,36 @@ internal class DocumentVersionServiceWhenDetermineVersion : IntegrationTest public void When_document_has_current_version_Then_current_version_is_set() { // Arrange - IDocumentVersionService service = Provider.GetRequiredService(); + IDocumentVersionService service = TestcontainersContext.Provider.GetRequiredService(); var document = new TestDocumentWithTwoMigrationMiddleVersion(); // Act service.DetermineVersion(document); // Assert - document.Version.Should().Be("0.0.1"); + document.Version.ToString().Should().Be("0.0.1"); } [Test] public void When_document_has_highest_version_Then_highest_version_is_set() { // Arrange - IDocumentVersionService service = Provider.GetRequiredService(); + IDocumentVersionService service = TestcontainersContext.Provider.GetRequiredService(); var document = new TestDocumentWithTwoMigrationHighestVersion(); // Act service.DetermineVersion(document); // Assert - document.Version.Should().Be("0.0.2"); + document.Version.ToString().Should().Be("0.0.2"); } [Test] public void When_document_has_version_that_should_not_be_Then_throw_exception() { // Arrange - IDocumentVersionService service = Provider.GetRequiredService(); - var document = new TestDocumentWithTwoMigrationHighestVersion { Version = "0.0.1" }; + IDocumentVersionService service = TestcontainersContext.Provider.GetRequiredService(); + var document = new TestDocumentWithTwoMigrationHighestVersion { Version = new DocumentVersion(0,0,1) }; // Act// Act Action checkAction = () => { service.DetermineVersion(document); }; diff --git a/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs b/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs deleted file mode 100644 index cbc4ad7..0000000 --- a/Mongo.Migration.Tests/Services/Initializers/MongoMigration_when_initialize.cs +++ /dev/null @@ -1,37 +0,0 @@ -using FluentAssertions; -using Mongo.Migration.Exceptions; -using Mongo.Migration.Startup.Static; -using NSubstitute; -using NUnit.Framework; - -namespace Mongo.Migration.Tests.Services.Initializers; - -[TestFixture] -public class MongoMigrationWhenInitialize -{ - [TearDown] - public void TearDown() - { - MongoMigrationClient.Reset(); - } - - [Test] - public void When_inizialize_twice_Then_throw_exception() - { - // Arrange - var registry = Substitute.For(); - var mongoMigration = Substitute.For(); - - registry - .GetService(Arg.Is(typeof(IMongoMigration))) - .Returns(mongoMigration); - - // Act - MongoMigrationClient.Initialize(registry); - - Action comparison = () => MongoMigrationClient.Initialize(registry); - - // Assert - comparison.Should().Throw(); - } -} \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs index 33657bb..e969e71 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs @@ -13,7 +13,7 @@ internal class MigrationInterceptorFactoryWhenCreating : IntegrationTest public void If_type_is_assignable_to_document_Then_interceptor_is_created() { // Arrange - var factory = Provider.GetRequiredService(); + var factory = TestcontainersContext.Provider.GetRequiredService(); // Act var interceptor = factory.Create(typeof(TestDocumentWithOneMigration)); @@ -26,7 +26,7 @@ public void If_type_is_assignable_to_document_Then_interceptor_is_created() public void If_type_is_not_assignable_to_document_Then_exception_is_thrown() { // Arrange - var factory = Provider.GetRequiredService(); + var factory = TestcontainersContext.Provider.GetRequiredService(); // Act Action act = () => factory.Create(typeof(TestClass)); @@ -39,7 +39,7 @@ public void If_type_is_not_assignable_to_document_Then_exception_is_thrown() public void If_type_is_null_Then_exception_is_thrown() { // Arrange - var factory = Provider.GetRequiredService(); + var factory = TestcontainersContext.Provider.GetRequiredService(); // Act Action act = () => factory.Create(null!); diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs index cf38c72..822c559 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs @@ -13,7 +13,7 @@ internal class MigrationInterceptorProviderWhenGetSerializer : IntegrationTest public void When_entity_is_document_Then_provide_serializer() { // Arrange - var provider = Provider.GetRequiredService(); + var provider = TestcontainersContext.Provider.GetRequiredService(); // Act var serializer = provider.GetSerializer(typeof(TestDocumentWithOneMigration)); @@ -26,7 +26,7 @@ public void When_entity_is_document_Then_provide_serializer() public void When_entity_is_not_document_Then_provide_null() { // Arrange - var provider = Provider.GetRequiredService(); + var provider = TestcontainersContext.Provider.GetRequiredService(); // Act var serializer = provider.GetSerializer(typeof(TestClass)); diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs index de9f45b..07d1143 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs @@ -1,15 +1,18 @@ using Mongo.Migration.Documents; using Mongo.Migration.Documents.Attributes; +using MongoDB.Bson; namespace Mongo.Migration.Tests.TestDoubles; [RuntimeVersion("0.0.1")] internal class TestDocumentWithOneMigration : Document { + public ObjectId Id { get; set; } public int Doors { get; set; } } internal class TestDocumentWithoutAttribute : Document { + public ObjectId Id { get; set; } public int Doors { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs index 47483ad..16b5c23 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs @@ -1,10 +1,12 @@ using Mongo.Migration.Documents; using Mongo.Migration.Documents.Attributes; +using MongoDB.Bson; namespace Mongo.Migration.Tests.TestDoubles; [RuntimeVersion("0.0.0")] internal class TestDocumentWithTwoMigration : Document { + public ObjectId Id { get; set; } public int Dors { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs index 389a274..3b7d06f 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs @@ -5,7 +5,7 @@ namespace Mongo.Migration.Tests.TestDoubles; [RuntimeVersion("0.0.2")] -[CollectionLocation("Test", "PerformanceTest")] +[CollectionLocation("Test")] internal class TestDocumentWithTwoMigrationHighestVersion : Document { public ObjectId Id { get; set; } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs index 037a630..f56b759 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs @@ -1,10 +1,12 @@ using Mongo.Migration.Documents; using Mongo.Migration.Documents.Attributes; +using MongoDB.Bson; namespace Mongo.Migration.Tests.TestDoubles; [RuntimeVersion("0.0.1")] internal class TestDocumentWithTwoMigrationMiddleVersion : Document { - public int Door { get; set; } + public ObjectId Id { get; set; } + public int Doors1 { get; set; } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs index b63a344..5f35e47 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs @@ -12,15 +12,15 @@ public TestDocumentWithTwoMigrationMiddleVersion001() public override void Up(BsonDocument document) { - var doors = document["Dors"].ToInt32(); - document.Add("Doors", doors); - document.Remove("Dors"); + var doors = document["Doors0"].ToInt32(); + document.Add("Doors1", doors); + document.Remove("Doors0"); } public override void Down(BsonDocument document) { - var doors = document["Doors"].ToInt32(); - document.Add("Dors", doors); - document.Remove("Doors"); + var doors = document["Doors1"].ToInt32(); + document.Add("Doors0", doors); + document.Remove("Doors1"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs index 44a9e91..485d532 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs @@ -12,15 +12,15 @@ public TestDocumentWithTwoMigrationMiddleVersion002() public override void Up(BsonDocument document) { - var doors = document["Doors"].ToInt32(); - document.Add("Door", doors); - document.Remove("Doors"); + var doors = document["Doors1"].ToInt32(); + document.Add("Doors2", doors); + document.Remove("Doors1"); } public override void Down(BsonDocument document) { - var doors = document["Door"].ToInt32(); - document.Add("Doors", doors); - document.Remove("Door"); + var doors = document["Doors2"].ToInt32(); + document.Add("Doors1", doors); + document.Remove("Doors2"); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestcontainersContext.cs b/Mongo.Migration.Tests/TestcontainersContext.cs index a784ff0..fa6010c 100644 --- a/Mongo.Migration.Tests/TestcontainersContext.cs +++ b/Mongo.Migration.Tests/TestcontainersContext.cs @@ -1,4 +1,9 @@ -using MongoDB.Driver; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Mongo.Migration.Services; +using Mongo.Migration.Startup.DotNetCore; +using MongoDB.Driver; using NUnit.Framework; using Testcontainers.MongoDb; @@ -7,25 +12,40 @@ namespace Mongo.Migration.Tests; [SetUpFixture] public sealed class TestcontainersContext { - private static readonly MongoDbContainer s_mongoDbContainer = - new MongoDbBuilder() - .Build(); - private static MongoClient? s_mongoClient; + private static readonly MongoDbContainer s_mongoDbContainer = new MongoDbBuilder().Build(); + + private static ServiceProvider? s_provider; + + public static IServiceProvider Provider => s_provider ?? throw new InvalidOperationException("Must be setup"); + + public static IMongoClient MongoClient => Provider.GetRequiredService(); + - public static IMongoClient MongoClient => s_mongoClient ?? throw new InvalidOperationException("Must be initialized"); - [OneTimeSetUp] public async Task OneTimeSetup() { await s_mongoDbContainer.StartAsync(); - s_mongoClient = new MongoClient(s_mongoDbContainer.GetConnectionString()); + + IServiceCollection services = new ServiceCollection(); + services + .AddLogging(builder => builder.AddProvider(NullLoggerProvider.Instance)) + .AddSingleton(new MongoClient(s_mongoDbContainer.GetConnectionString())) + .AddMigration(); + + s_provider = services.BuildServiceProvider(); + + IMigrationService migrationService = s_provider.GetRequiredService(); + migrationService.RegisterBsonStatics(); } [OneTimeTearDown] public async Task OneTimeTearDown() { - s_mongoClient?.Dispose(); - s_mongoClient = null; + if (s_provider is not null) + { + await s_provider.DisposeAsync(); + } + await s_mongoDbContainer.StopAsync(); await s_mongoDbContainer.DisposeAsync(); } diff --git a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs b/Mongo.Migration/Documents/Attributes/CollectionLocation.cs index 5202463..20cbaf2 100644 --- a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs +++ b/Mongo.Migration/Documents/Attributes/CollectionLocation.cs @@ -5,8 +5,8 @@ public class CollectionLocation : Attribute { public CollectionLocationInformation CollectionInformation { get; } - public CollectionLocation(string collectionName, string? databaseName = null) + public CollectionLocation(string collectionName) { - CollectionInformation = new(databaseName, collectionName); + CollectionInformation = new(collectionName); } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs b/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs index cd23486..422ae4f 100644 --- a/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs +++ b/Mongo.Migration/Documents/Attributes/CollectionLocationInformation.cs @@ -2,13 +2,10 @@ namespace Mongo.Migration.Documents.Attributes; public readonly struct CollectionLocationInformation { - public CollectionLocationInformation(string? database, string collection) + public CollectionLocationInformation(string collection) { - Database = database; Collection = collection; } - public string? Database { get; } - public string Collection { get; } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs b/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs index ff9aaa0..fd0d882 100644 --- a/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs +++ b/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs @@ -7,6 +7,6 @@ public class RuntimeVersion : Attribute public RuntimeVersion(string version) { - Version = version; + Version = DocumentVersion.Parse(version.AsSpan()); } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Attributes/StartUpVersion.cs b/Mongo.Migration/Documents/Attributes/StartUpVersion.cs index 006fe01..a9fae64 100644 --- a/Mongo.Migration/Documents/Attributes/StartUpVersion.cs +++ b/Mongo.Migration/Documents/Attributes/StartUpVersion.cs @@ -7,6 +7,6 @@ public class StartUpVersion : Attribute public StartUpVersion(string version) { - Version = version; + Version = DocumentVersion.Parse(version.AsSpan()); } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/DocumentVersion.cs b/Mongo.Migration/Documents/DocumentVersion.cs index 3ca15f1..1a9d7f2 100644 --- a/Mongo.Migration/Documents/DocumentVersion.cs +++ b/Mongo.Migration/Documents/DocumentVersion.cs @@ -1,49 +1,15 @@ -using Mongo.Migration.Documents.Serializers; -using Mongo.Migration.Exceptions; +namespace Mongo.Migration.Documents; -using MongoDB.Bson.Serialization; - -namespace Mongo.Migration.Documents; - -public readonly struct DocumentVersion : IComparable +public readonly record struct DocumentVersion : IComparable { private const char VersionSplitChar = '.'; - private const int MaxLength = 3; - public int Major { get; init; } public int Minor { get; init; } public int Revision { get; init; } - static DocumentVersion() - { - try - { - BsonSerializer.RegisterSerializer(typeof(DocumentVersion), new DocumentVersionSerializer()); - } - catch (Exception) - { - } - } - - public DocumentVersion(string version) - { - string[] versionParts = version.Split(VersionSplitChar); - - if (versionParts.Length != MaxLength) - { - throw new VersionStringToLongException(version); - } - - Major = ParseVersionPart(versionParts[0]); - - Minor = ParseVersionPart(versionParts[1]); - - Revision = ParseVersionPart(versionParts[2]); - } - public DocumentVersion(int major, int minor, int revision) { Major = major; @@ -51,105 +17,60 @@ public DocumentVersion(int major, int minor, int revision) Revision = revision; } - public static DocumentVersion Default() - { - return default(DocumentVersion); - } + public static readonly DocumentVersion Default = new(0,0,0); - public static DocumentVersion Empty() - { - return new(-1, 0, 0); - } + public static readonly DocumentVersion Empty = new(-1, 0, 0); - public static implicit operator DocumentVersion(string version) - { - return new(version); - } + public static implicit operator DocumentVersion(string version) => Parse(version.AsSpan()); - public static implicit operator string(DocumentVersion documentVersion) - { - return documentVersion.ToString(); - } + public static implicit operator DocumentVersion(ReadOnlySpan versionSpan) => Parse(versionSpan); - public override string ToString() - { - return $"{Major}.{Minor}.{Revision}"; - } + public static implicit operator string(DocumentVersion documentVersion) => documentVersion.ToString(); + + public override string ToString() => $"{Major}.{Minor}.{Revision}"; public int CompareTo(DocumentVersion other) { - if (Equals(other)) + int compare = Major.CompareTo(other.Major); + if (compare != 0) { - return 0; + return compare; } - return this > other ? 1 : -1; - } + compare = Minor.CompareTo(other.Minor); + if (compare != 0) + { + return compare; + } - public static bool operator ==(DocumentVersion a, DocumentVersion b) - { - return a.Equals(b); + return Revision.CompareTo(other.Revision); } - public static bool operator !=(DocumentVersion a, DocumentVersion b) - { - return !(a == b); - } + public static bool operator >(DocumentVersion a, DocumentVersion b) => a.CompareTo(b) > 0; - public static bool operator >(DocumentVersion a, DocumentVersion b) - { - return a.Major > b.Major - || (a.Major == b.Major && a.Minor > b.Minor) - || (a.Major == b.Major && a.Minor == b.Minor && a.Revision > b.Revision); - } + public static bool operator <(DocumentVersion a, DocumentVersion b) => a.CompareTo(b) < 0; - public static bool operator <(DocumentVersion a, DocumentVersion b) - { - return a != b && !(a > b); - } + public static bool operator >=(DocumentVersion a, DocumentVersion b) => a.CompareTo(b) >= 0; - public static bool operator <=(DocumentVersion a, DocumentVersion b) - { - return a == b || a < b; - } + public static bool operator <=(DocumentVersion a, DocumentVersion b) => a.CompareTo(b) <= 0; - public static bool operator >=(DocumentVersion a, DocumentVersion b) + public static DocumentVersion Parse(ReadOnlySpan versionSpan) { - return a == b || a > b; - } + int[] versionParts = new int[3]; + int versionPartCount = 0; + int startIndex = 0; - public bool Equals(DocumentVersion other) - { - return other.Major == Major && other.Minor == Minor && other.Revision == Revision; - } - - public override bool Equals(object? obj) - { - if (obj is null) + for (int i = 0; i < versionSpan.Length; i++) { - return false; + if (versionSpan[i] == VersionSplitChar) + { + versionParts[versionPartCount++] = int.Parse(versionSpan[startIndex..i]); + startIndex = i + 1; + } } - if (obj.GetType() != typeof(DocumentVersion)) - { - return false; - } - - return Equals((DocumentVersion)obj); - } - - public override int GetHashCode() - { - return HashCode.Combine(Major, Minor, Revision); - } - - private static int ParseVersionPart(string value) - { - if (!int.TryParse(value, out int target)) - { - throw new InvalidVersionValueException(value); - } + versionParts[versionPartCount] = int.Parse(versionSpan[startIndex..]); - return target; + return new DocumentVersion(versionParts[0], versionParts[1], versionParts[2]); } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/CollectionLocator.cs b/Mongo.Migration/Documents/Locators/CollectionLocator.cs index f06144f..b2e4a2f 100644 --- a/Mongo.Migration/Documents/Locators/CollectionLocator.cs +++ b/Mongo.Migration/Documents/Locators/CollectionLocator.cs @@ -21,7 +21,7 @@ public override void Locate() from a in AppDomain.CurrentDomain.GetAssemblies() from t in a.GetTypes() let attributes = t.GetCustomAttributes(typeof(CollectionLocation), true) - where attributes != null && attributes.Length > 0 + where attributes is { Length: > 0 } select new { Type = t, Attributes = attributes.Cast() }; var versions = new Dictionary(); diff --git a/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs b/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs index c66df73..dda29b0 100644 --- a/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs +++ b/Mongo.Migration/Documents/Serializers/DocumentVersionSerializer.cs @@ -3,20 +3,19 @@ namespace Mongo.Migration.Documents.Serializers; -public class DocumentVersionSerializer : SerializerBase +public sealed class DocumentVersionSerializer : SerializerBase { public override void Serialize( BsonSerializationContext context, - BsonSerializationArgs args, + BsonSerializationArgs _, DocumentVersion value) { - var versionString = $"{value.Major}.{value.Minor}.{value.Revision}"; - context.Writer.WriteString(versionString); + context.Writer.WriteString(value.ToString()); } - public override DocumentVersion Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + public override DocumentVersion Deserialize(BsonDeserializationContext context, BsonDeserializationArgs _) { var versionString = context.Reader.ReadString(); - return new(versionString); + return DocumentVersion.Parse(versionString.AsSpan()); } } \ No newline at end of file diff --git a/Mongo.Migration/Extensions/EnumerableExtensions.cs b/Mongo.Migration/Extensions/EnumerableExtensions.cs index 1d84bdd..6d32e46 100644 --- a/Mongo.Migration/Extensions/EnumerableExtensions.cs +++ b/Mongo.Migration/Extensions/EnumerableExtensions.cs @@ -18,7 +18,7 @@ internal static IEnumerable CheckForDuplicates(t } var typeName = element.GetType().Name; - throw new DuplicateVersionException(typeName, element.Version); + throw new DuplicateVersionException(typeName, element.Version.ToString()); } return list; diff --git a/Mongo.Migration/IMongoMigration.cs b/Mongo.Migration/IMongoMigration.cs index e73c868..fba82ac 100644 --- a/Mongo.Migration/IMongoMigration.cs +++ b/Mongo.Migration/IMongoMigration.cs @@ -1,6 +1,6 @@ namespace Mongo.Migration; -public interface IMongoMigration +public interface IMongoMigrationBak { void Run(); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/DatabaseMigration.cs b/Mongo.Migration/Migrations/Database/DatabaseMigration.cs index dccf495..a558e60 100644 --- a/Mongo.Migration/Migrations/Database/DatabaseMigration.cs +++ b/Mongo.Migration/Migrations/Database/DatabaseMigration.cs @@ -8,7 +8,7 @@ public abstract class DatabaseMigration : IDatabaseMigration { protected DatabaseMigration(string version) { - Version = version; + Version = DocumentVersion.Parse(version.AsSpan()); } public DocumentVersion Version { get; } diff --git a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs index 7d6f1ec..4491194 100644 --- a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs @@ -26,18 +26,19 @@ public DatabaseMigrationRunner( _logger = logger; } - public void Run(IMongoDatabase db) + public void Run(IMongoDatabase db, DocumentVersion? targetVersion = null) { _logger.LogInformation("Database migration started."); - var databaseVersion = _databaseVersionService.GetLatestDatabaseVersion(db); - var currentOrLatest = _databaseVersionService.GetCurrentOrLatestMigrationVersion(); + DocumentVersion databaseVersion = _databaseVersionService.GetLatestDatabaseVersion(db); + DocumentVersion currentOrLatest = targetVersion is not null && targetVersion > DocumentVersion.Empty + ? targetVersion.Value + : _databaseVersionService.GetLatestMigrationVersion(); - if (databaseVersion == currentOrLatest) + if (databaseVersion != currentOrLatest) { - return; + MigrateUpOrDown(db, databaseVersion, currentOrLatest); } - - MigrateUpOrDown(db, databaseVersion, currentOrLatest); + _logger.LogInformation("Database migration finished."); } @@ -70,8 +71,10 @@ private void MigrateUp(IMongoDatabase db, DocumentVersion currentVersion, Docume } } + // consider filtering migration version between current and to private void MigrateDown(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion) { + //var migrations = _migrationLocator.GetMigrationsFromTo(_databaseMigrationType, currentVersion, toVersion).Reverse().ToList(); ??? => look not ordered var migrations = _migrationLocator .GetMigrationsGtEq(_databaseMigrationType, toVersion) .OrderByDescending(m => m.Version) diff --git a/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs index 5b3d71c..0306b5f 100644 --- a/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs @@ -1,8 +1,9 @@ -using MongoDB.Driver; +using Mongo.Migration.Documents; +using MongoDB.Driver; namespace Mongo.Migration.Migrations.Database; -internal interface IDatabaseMigrationRunner +public interface IDatabaseMigrationRunner { - void Run(IMongoDatabase db); + void Run(IMongoDatabase db, DocumentVersion? targetVersion = null); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/IStartUpDatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/IStartUpDatabaseMigrationRunner.cs deleted file mode 100644 index 60786cc..0000000 --- a/Mongo.Migration/Migrations/Database/IStartUpDatabaseMigrationRunner.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Mongo.Migration.Migrations.Database; - -internal interface IStartUpDatabaseMigrationRunner -{ - void RunAll(); -} \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs deleted file mode 100644 index e6d1ff8..0000000 --- a/Mongo.Migration/Migrations/Database/StartUpDatabaseMigrationRunner.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Mongo.Migration.Documents.Attributes; -using Mongo.Migration.Documents.Locators; -using Mongo.Migration.Exceptions; -using Mongo.Migration.Startup; - -using MongoDB.Driver; - -namespace Mongo.Migration.Migrations.Database; - -internal class StartUpDatabaseMigrationRunner : IStartUpDatabaseMigrationRunner -{ - private readonly IMongoClient _client; - - private readonly ICollectionLocator _collectionLocator; - - private readonly string _databaseName; - - private readonly IDatabaseMigrationRunner _migrationRunner; - - public StartUpDatabaseMigrationRunner( - IMongoMigrationSettings settings, - ICollectionLocator collectionLocator, - IDatabaseMigrationRunner migrationRunner) - : this( - settings.ClientSettings != null - ? new MongoClient(settings.ClientSettings) - : new MongoClient(settings.ConnectionString), - settings.Database, - collectionLocator, - migrationRunner) - { - - } - - public StartUpDatabaseMigrationRunner( - IMongoClient client, - IMongoMigrationSettings settings, - ICollectionLocator collectionLocator, - IDatabaseMigrationRunner migrationRunner) - : this(client, settings.Database, collectionLocator, migrationRunner) - { - - } - - private StartUpDatabaseMigrationRunner( - IMongoClient client, - string databaseName, - ICollectionLocator collectionLocator, - IDatabaseMigrationRunner migrationRunner) - { - _client = client; - _databaseName = databaseName; - _collectionLocator = collectionLocator; - _migrationRunner = migrationRunner; - } - - public void RunAll() - { - var locations = _collectionLocator.GetLocatesOrEmpty().ToList(); - var information = locations.FirstOrDefault().Value; - var databaseName = GetDatabaseOrDefault(information); - - _migrationRunner.Run(_client.GetDatabase(databaseName)); - } - - private string GetDatabaseOrDefault(CollectionLocationInformation information) - { - if (string.IsNullOrEmpty(_databaseName) && string.IsNullOrEmpty(information.Database)) - { - throw new NoDatabaseNameFoundException(); - } - - return string.IsNullOrEmpty(information.Database) ? _databaseName : information.Database; - } -} \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/DocumentMigration.cs b/Mongo.Migration/Migrations/Document/DocumentMigration.cs index 1de5336..970f6b1 100644 --- a/Mongo.Migration/Migrations/Document/DocumentMigration.cs +++ b/Mongo.Migration/Migrations/Document/DocumentMigration.cs @@ -9,7 +9,7 @@ public abstract class DocumentMigration : IDocumentMigration { protected DocumentMigration(string version) { - Version = version; + Version = DocumentVersion.Parse(version.AsSpan()); } public DocumentVersion Version { get; } diff --git a/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs index 6a922e1..ce1e603 100644 --- a/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs @@ -4,7 +4,7 @@ namespace Mongo.Migration.Migrations.Document; -internal interface IDocumentMigrationRunner +public interface IDocumentMigrationRunner { void Run(Type type, BsonDocument document, DocumentVersion to); diff --git a/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs index 671bd48..597cf43 100644 --- a/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs @@ -1,6 +1,8 @@ +using MongoDB.Driver; + namespace Mongo.Migration.Migrations.Document; internal interface IStartUpDocumentMigrationRunner { - void RunAll(); + void RunAll(IMongoDatabase database); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs index 906fc8f..363ecec 100644 --- a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs @@ -1,9 +1,5 @@ -using Mongo.Migration.Documents.Attributes; using Mongo.Migration.Documents.Locators; -using Mongo.Migration.Exceptions; using Mongo.Migration.Services; -using Mongo.Migration.Startup; - using MongoDB.Bson; using MongoDB.Driver; @@ -11,59 +7,23 @@ namespace Mongo.Migration.Migrations.Document; internal class StartUpDocumentMigrationRunner : IStartUpDocumentMigrationRunner { - private readonly IMongoClient _client; - private readonly ICollectionLocator _collectionLocator; - private readonly string _databaseName; - private readonly IDocumentVersionService _documentVersionService; private readonly IDocumentMigrationRunner _migrationRunner; public StartUpDocumentMigrationRunner( - IMongoMigrationSettings settings, - ICollectionLocator collectionLocator, - IDocumentVersionService documentVersionService, - IDocumentMigrationRunner migrationRunner) - : this( - settings.ClientSettings != null - ? new MongoClient(settings.ClientSettings) - : new MongoClient(settings.ConnectionString), - settings.Database, - collectionLocator, - documentVersionService, - migrationRunner) - { - - } - - public StartUpDocumentMigrationRunner( - IMongoClient client, - IMongoMigrationSettings settings, ICollectionLocator collectionLocator, IDocumentVersionService documentVersionService, IDocumentMigrationRunner migrationRunner) - : this(client, settings.Database, collectionLocator, documentVersionService, migrationRunner) { - - } - - private StartUpDocumentMigrationRunner( - IMongoClient client, - string databaseName, - ICollectionLocator collectionLocator, - IDocumentVersionService documentVersionService, - IDocumentMigrationRunner migrationRunner) - { - _client = client; - _databaseName = databaseName; _collectionLocator = collectionLocator; _documentVersionService = documentVersionService; _migrationRunner = migrationRunner; } - public void RunAll() + public void RunAll(IMongoDatabase database) { var locations = _collectionLocator.GetLocatesOrEmpty(); @@ -71,11 +31,9 @@ public void RunAll() { var information = locate.Value; var type = locate.Key; - var databaseName = GetDatabaseOrDefault(information); var collectionVersion = _documentVersionService.GetCollectionVersion(type); - var collection = _client.GetDatabase(databaseName) - .GetCollection(information.Collection); + var collection = database.GetCollection(information.Collection); var bulk = new List>(); @@ -91,7 +49,7 @@ public void RunAll() _migrationRunner.Run(type, document, collectionVersion); var update = new ReplaceOneModel( - new BsonDocument { { "_id", document["_id"] } }, + new BsonDocument { { "_id", document["_id"] } }, document ); @@ -107,18 +65,7 @@ public void RunAll() } } - private string GetDatabaseOrDefault(CollectionLocationInformation information) - { - if (string.IsNullOrEmpty(_databaseName) && string.IsNullOrEmpty(information.Database)) - { - throw new NoDatabaseNameFoundException(); - } - - return string.IsNullOrEmpty(information.Database) ? _databaseName : information.Database; - } - - private FilterDefinition CreateQueryForRelevantDocuments( - Type type) + private FilterDefinition CreateQueryForRelevantDocuments(Type type) { var currentVersion = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); diff --git a/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs index 8fe7c70..6185ee9 100644 --- a/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs @@ -6,6 +6,8 @@ namespace Mongo.Migration.Migrations.Locators; internal class DatabaseTypeMigrationDependencyLocator : TypeMigrationDependencyLocator, IDatabaseTypeMigrationDependencyLocator { private IDictionary>? _migrations; + public DatabaseTypeMigrationDependencyLocator(ILogger logger, IServiceProvider serviceProvider) + : base(logger, serviceProvider) { } protected override IDictionary> Migrations { @@ -21,8 +23,5 @@ protected override IDictionary> Mi set => _migrations = value; } - public DatabaseTypeMigrationDependencyLocator(ILogger logger, IServiceProvider serviceProvider) - : base(logger, serviceProvider) - { - } + } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs index 038558f..600e1cc 100644 --- a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs @@ -88,7 +88,7 @@ public DocumentVersion GetLatestVersion(Type type) return migrations.Count > 0 ? migrations.Max(m => m.Version) - : DocumentVersion.Default(); + : DocumentVersion.Default; } public abstract void Locate(); diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index e5473e8..08fa9e8 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -6,12 +6,16 @@ enable op-icon.png embedded + en - + + + + - + diff --git a/Mongo.Migration/MongoMigration.cs b/Mongo.Migration/MongoMigration.cs index e7ac771..da694cd 100644 --- a/Mongo.Migration/MongoMigration.cs +++ b/Mongo.Migration/MongoMigration.cs @@ -1,10 +1,5 @@ -using Mongo.Migration.Documents.Locators; -using Mongo.Migration.Migrations.Document; -using Mongo.Migration.Migrations.Locators; -using Mongo.Migration.Services; - -namespace Mongo.Migration; - +namespace Mongo.Migration; +/* internal class MongoMigration : IMongoMigration { private readonly ICollectionLocator _collectionLocator; @@ -45,4 +40,5 @@ public void Run() _migrationService.Migrate(); } -} \ No newline at end of file +} +*/ \ No newline at end of file diff --git a/Mongo.Migration/Services/DatabaseVersionService.cs b/Mongo.Migration/Services/DatabaseVersionService.cs index 6392bc7..813217d 100644 --- a/Mongo.Migration/Services/DatabaseVersionService.cs +++ b/Mongo.Migration/Services/DatabaseVersionService.cs @@ -13,29 +13,22 @@ internal class DatabaseVersionService : IDatabaseVersionService private readonly IDatabaseTypeMigrationDependencyLocator _migrationLocator; - private readonly IMongoMigrationSettings _mongoMigrationSettings; - - public DatabaseVersionService( - IDatabaseTypeMigrationDependencyLocator migrationLocator, - IMongoMigrationSettings mongoMigrationSettings) + public DatabaseVersionService(IDatabaseTypeMigrationDependencyLocator migrationLocator) { _migrationLocator = migrationLocator; - _mongoMigrationSettings = mongoMigrationSettings; } - public DocumentVersion GetCurrentOrLatestMigrationVersion() + public DocumentVersion GetLatestMigrationVersion() { - return _mongoMigrationSettings.DatabaseMigrationVersion > DocumentVersion.Empty() - ? _mongoMigrationSettings.DatabaseMigrationVersion - : _migrationLocator.GetLatestVersion(typeof(DatabaseMigration)); + return _migrationLocator.GetLatestVersion(typeof(DatabaseMigration)); } public DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db) { var migrations = GetMigrationsCollection(db).Find(m => true).ToList(); - if (migrations == null || migrations.Count <= 0) + if (migrations is { Count: 0 }) { - return DocumentVersion.Default(); + return DocumentVersion.Default; } return migrations.Max(m => m.Version); diff --git a/Mongo.Migration/Services/DocumentVersionService.cs b/Mongo.Migration/Services/DocumentVersionService.cs index d5e6b68..647e271 100644 --- a/Mongo.Migration/Services/DocumentVersionService.cs +++ b/Mongo.Migration/Services/DocumentVersionService.cs @@ -9,9 +9,9 @@ namespace Mongo.Migration.Services; -internal class DocumentVersionService : IDocumentVersionService +internal sealed class DocumentVersionService : IDocumentVersionService { - private static readonly string VersionFieldName = "Version"; + private const string DefaultVersionFieldName = "Version"; private readonly IMigrationLocator _migrationLocator; @@ -25,13 +25,13 @@ public DocumentVersionService( IMigrationLocator migrationLocator, IRuntimeVersionLocator runtimeVersionLocator, IStartUpVersionLocator startUpVersionLocator, - IMongoMigrationSettings mongoMigrationSettings) + MongoMigrationSettings mongoMigrationSettings) { _migrationLocator = migrationLocator; _runtimeVersionLocator = runtimeVersionLocator; _startUpVersionLocator = startUpVersionLocator; _versionFieldName = string.IsNullOrWhiteSpace(mongoMigrationSettings.VersionFieldName) - ? VersionFieldName + ? DefaultVersionFieldName : mongoMigrationSettings.VersionFieldName; } @@ -54,26 +54,24 @@ public DocumentVersion GetCollectionVersion(Type type) public DocumentVersion GetVersionOrDefault(BsonDocument document) { - document.TryGetValue(GetVersionFieldName(), out BsonValue value); - - if (value != null && !value.IsBsonNull) + if (document.TryGetValue(GetVersionFieldName(), out BsonValue value) && !value.IsBsonNull) { - return value.AsString; + return DocumentVersion.Parse(value.AsString.AsSpan()); } - return DocumentVersion.Default(); + return DocumentVersion.Default; } public void SetVersion(BsonDocument document, DocumentVersion version) { - document[GetVersionFieldName()] = version.ToString(); + document[GetVersionFieldName()] = new BsonString(version.ToString()); } public void DetermineVersion(TClass instance) where TClass : class, IDocument { var type = typeof(TClass); - var documentVersion = instance.Version.ToString(); + var documentVersion = instance.Version; var latestVersion = _migrationLocator.GetLatestVersion(type); var currentVersion = _runtimeVersionLocator.GetLocateOrNull(type) ?? latestVersion; @@ -87,13 +85,13 @@ public void DetermineVersion(TClass instance) return; } - if (DocumentVersion.Default() == documentVersion) + if (DocumentVersion.Default == documentVersion || DocumentVersion.Empty == documentVersion) { SetVersion(instance, currentVersion, latestVersion); return; } - throw new VersionViolationException(currentVersion.ToString(), documentVersion, latestVersion); + throw new VersionViolationException(currentVersion, documentVersion, latestVersion); } public DocumentVersion DetermineLastVersion( @@ -116,13 +114,13 @@ public DocumentVersion DetermineLastVersion( private static void SetVersion( TClass instance, - DocumentVersion? currentVersion, + DocumentVersion currentVersion, DocumentVersion latestVersion) where TClass : class, IDocument { if (currentVersion < latestVersion) { - instance.Version = currentVersion.ToString(); + instance.Version = currentVersion; return; } diff --git a/Mongo.Migration/Services/IDatabaseVersionService.cs b/Mongo.Migration/Services/IDatabaseVersionService.cs index 5634bdb..c12c11c 100644 --- a/Mongo.Migration/Services/IDatabaseVersionService.cs +++ b/Mongo.Migration/Services/IDatabaseVersionService.cs @@ -7,7 +7,7 @@ namespace Mongo.Migration.Services; public interface IDatabaseVersionService { - DocumentVersion GetCurrentOrLatestMigrationVersion(); + DocumentVersion GetLatestMigrationVersion(); DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db); diff --git a/Mongo.Migration/Services/IDocumentVersionService.cs b/Mongo.Migration/Services/IDocumentVersionService.cs index 97f5c8b..1e7070f 100644 --- a/Mongo.Migration/Services/IDocumentVersionService.cs +++ b/Mongo.Migration/Services/IDocumentVersionService.cs @@ -1,6 +1,5 @@ using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Document; - using MongoDB.Bson; namespace Mongo.Migration.Services; diff --git a/Mongo.Migration/Services/IMigrationService.cs b/Mongo.Migration/Services/IMigrationService.cs index 15d1286..c19ea03 100644 --- a/Mongo.Migration/Services/IMigrationService.cs +++ b/Mongo.Migration/Services/IMigrationService.cs @@ -1,6 +1,8 @@ namespace Mongo.Migration.Services; -internal interface IMigrationService +public interface IMigrationService { - void Migrate(); + void RegisterBsonStatics(); + + Task MigrateAsync(string databaseName, string? targetDatabaseVersion); } \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs index 799f380..124eaae 100644 --- a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs +++ b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs @@ -1,8 +1,13 @@ -using MongoDB.Bson.Serialization; +using Mongo.Migration.Migrations.Document; +using MongoDB.Bson.Serialization; namespace Mongo.Migration.Services.Interceptors; -internal interface IMigrationInterceptorFactory +public interface IMigrationInterceptorFactory { IBsonSerializer Create(Type type); + + IDocumentVersionService DocumentVersionService { get; } + + IDocumentMigrationRunner MigrationRunner { get; } } \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs index 37a9e3c..4ef86ea 100644 --- a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs +++ b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs @@ -2,6 +2,7 @@ namespace Mongo.Migration.Services.Interceptors; -public interface IMigrationInterceptorProvider : IBsonSerializationProvider +public interface IMigrationInterceptorProvider : IRegistryAwareBsonSerializationProvider { + IMigrationInterceptorFactory MigrationInterceptorFactory { get; } } \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs index 0eb938f..a6e35ed 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs @@ -23,4 +23,8 @@ public IBsonSerializer Create(Type type) return interceptor as IBsonSerializer ?? throw new InvalidOperationException($"Cannot create {genericType} interceptor"); } + + public IDocumentVersionService DocumentVersionService => _documentVersionService; + + public IDocumentMigrationRunner MigrationRunner => _migrationRunner; } \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs index 4f8d898..3ca1f79 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs @@ -1,5 +1,4 @@ using Mongo.Migration.Documents; - using MongoDB.Bson; using MongoDB.Bson.Serialization; @@ -7,6 +6,9 @@ namespace Mongo.Migration.Services.Interceptors; internal class MigrationInterceptorProvider : IMigrationInterceptorProvider { + private static readonly Type s_iDocumentType = typeof(IDocument); + private static readonly Type s_bsonDocumentType = typeof(BsonDocument); + private readonly IMigrationInterceptorFactory _migrationInterceptorFactory; public MigrationInterceptorProvider(IMigrationInterceptorFactory migrationInterceptorFactory) @@ -15,17 +17,27 @@ public MigrationInterceptorProvider(IMigrationInterceptorFactory migrationInterc } public IBsonSerializer GetSerializer(Type type) + { + return GetSerializer(type, BsonSerializer.SerializerRegistry); + } + + public IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry) { if (ShouldBeMigrated(type)) { return _migrationInterceptorFactory.Create(type); } - return null; + // Go to next provider + // see https://github.com/mongodb/mongo-csharp-driver/blob/main/src/MongoDB.Bson/Serialization/BsonSerializerRegistry.cs#L155 + return null!; } private static bool ShouldBeMigrated(Type type) { - return type.GetInterfaces().Contains(typeof(IDocument)) && type != typeof(BsonDocument); + return type != s_bsonDocumentType + && type.GetInterfaces().Contains(s_iDocumentType); } + + public IMigrationInterceptorFactory MigrationInterceptorFactory => _migrationInterceptorFactory; } \ No newline at end of file diff --git a/Mongo.Migration/Services/MigrationService.cs b/Mongo.Migration/Services/MigrationService.cs index 0e37ff1..1dc46c2 100644 --- a/Mongo.Migration/Services/MigrationService.cs +++ b/Mongo.Migration/Services/MigrationService.cs @@ -1,67 +1,91 @@ +using System.Diagnostics; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Mongo.Migration.Documents; using Mongo.Migration.Documents.Serializers; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Document; using Mongo.Migration.Services.Interceptors; - -using MongoDB.Bson; +using Mongo.Migration.Startup.DotNetCore; using MongoDB.Bson.Serialization; +using MongoDB.Driver; namespace Mongo.Migration.Services; internal class MigrationService : IMigrationService { private readonly ILogger _logger; - - private readonly IMigrationInterceptorProvider _provider; - - private readonly DocumentVersionSerializer _serializer; - - private readonly IStartUpDatabaseMigrationRunner _startUpDatabaseMigrationRunner; - - private readonly IStartUpDocumentMigrationRunner _startUpDocumentMigrationRunner; + private readonly IMongoClient _client; + private readonly MongoMigrationStartupSettings _startupSettings; + private readonly IServiceProvider _provider; public MigrationService( - DocumentVersionSerializer serializer, - IMigrationInterceptorProvider provider, ILogger logger, - IStartUpDocumentMigrationRunner startUpDocumentMigrationRunner, - IStartUpDatabaseMigrationRunner startUpDatabaseMigrationRunner) + IMongoClient client, + MongoMigrationStartupSettings startupSettings, + IServiceProvider provider) { - _serializer = serializer; - _provider = provider; _logger = logger; - _startUpDocumentMigrationRunner = startUpDocumentMigrationRunner; - _startUpDatabaseMigrationRunner = startUpDatabaseMigrationRunner; + _client = client; + _startupSettings = startupSettings; + _provider = provider; } - public void Migrate() + public void RegisterBsonStatics() { - BsonSerializer.RegisterSerializationProvider(_provider); - RegisterSerializer(); + BsonSerializer.RegisterSerializer(new DocumentVersionSerializer()); - OnStartup(); + if (_startupSettings.RuntimeMigrationEnabled) + { + IMigrationInterceptorProvider migrationInterceptorProvider = _provider.GetRequiredService(); + BsonSerializer.RegisterSerializationProvider(migrationInterceptorProvider); + } } - private void OnStartup() + public async Task MigrateAsync(string databaseName, string? targetDatabaseVersion) { - _startUpDatabaseMigrationRunner.RunAll(); - _startUpDocumentMigrationRunner.RunAll(); + if (_startupSettings.DatabaseMigrationEnabled) + { + await ExecuteDatabaseMigrationAsync(databaseName, targetDatabaseVersion); + } + + if (_startupSettings.StartupDocumentMigrationEnabled) + { + await ExecuteDocumentMigrationAsync(databaseName); + } } - private void RegisterSerializer() + private async Task ExecuteDatabaseMigrationAsync(string databaseName, string? targetVersion) { - try + Stopwatch sw = Stopwatch.StartNew(); + + DocumentVersion? typedTargetVersion = null; + + if (targetVersion is not null) { - BsonSerializer.RegisterSerializer(_serializer.ValueType, _serializer); + typedTargetVersion = DocumentVersion.Parse(targetVersion.AsSpan()); } - catch (BsonSerializationException ex) - { - // Catch if Serializer was registered already ... not great, I know. - // We have to do this, because there is always a default DocumentVersionSerialzer. - // BsonSerializer.LookupSerializer(), does not work. - _logger.LogError(ex, "Cannot register {Type} twice", typeof(DocumentVersionSerializer)); - } + _logger.LogInformation("Executing database migration..."); + await using var scope = _provider.CreateAsyncScope(); + + IMongoDatabase database = _client.GetDatabase(databaseName); + IDatabaseMigrationRunner runner = scope.ServiceProvider.GetRequiredService(); + runner.Run(database, typedTargetVersion); + + _logger.LogInformation("Database migration done in {ElapsedMs} ms", sw.ElapsedMilliseconds); + } + + private async Task ExecuteDocumentMigrationAsync(string databaseName) + { + Stopwatch sw = Stopwatch.StartNew(); + _logger.LogInformation("Executing document migration..."); + await using var scope = _provider.CreateAsyncScope(); + + IMongoDatabase database = _client.GetDatabase(databaseName); + IStartUpDocumentMigrationRunner runner = scope.ServiceProvider.GetRequiredService(); + runner.RunAll(database); + + _logger.LogInformation("Database migration done in {ElapsedMs} ms", sw.ElapsedMilliseconds); } } \ No newline at end of file diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs b/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs new file mode 100644 index 0000000..52e05b6 --- /dev/null +++ b/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs @@ -0,0 +1,97 @@ +using Microsoft.Extensions.DependencyInjection; +using Mongo.Migration.Documents.Locators; +using Mongo.Migration.Migrations.Database; +using Mongo.Migration.Migrations.Document; +using Mongo.Migration.Migrations.Locators; +using Mongo.Migration.Services; +using Mongo.Migration.Services.Interceptors; + +namespace Mongo.Migration.Startup.DotNetCore; + +public class MongoMigrationBuilder +{ + private readonly IServiceCollection _services; + private readonly MongoMigrationSettings _mongoMigrationSettings; + private readonly MongoMigrationStartupSettings _mongoMigrationStartupSettings; + + private bool _interceptorAdded; + + internal MongoMigrationBuilder(IServiceCollection services) + { + _services = services; + _mongoMigrationSettings = new MongoMigrationSettings(); + _mongoMigrationStartupSettings = new MongoMigrationStartupSettings(); + + _services + .AddSingleton(_mongoMigrationSettings) + .AddSingleton(_mongoMigrationStartupSettings) + .AddTransient(); + } + + public string VersionFieldName + { + get => _mongoMigrationSettings.VersionFieldName; + set => _mongoMigrationSettings.VersionFieldName = value; + } + + public MongoMigrationBuilder AddRuntimeDocumentMigration() + { + AddInterceptorServices(); + _mongoMigrationStartupSettings.RuntimeMigrationEnabled = true; + return this; + } + + public MongoMigrationBuilder AddStartupDocumentMigration() + { + AddInterceptorServices(); + + _services + .AddTransient() + .AddTransient(); + + _mongoMigrationStartupSettings.StartupDocumentMigrationEnabled = true; + + return this; + } + + public MongoMigrationBuilder AddDatabaseMigration() + { + _services + .AddTransient() + .AddTransient() + .AddTransient(); + + _mongoMigrationStartupSettings.DatabaseMigrationEnabled = true; + + return this; + } + + public void AddAllMigrationsIfNothingWasAdded() + { + if (_mongoMigrationStartupSettings is {RuntimeMigrationEnabled: false, StartupDocumentMigrationEnabled: false, DatabaseMigrationEnabled: false}) + { + AddRuntimeDocumentMigration(); + AddDatabaseMigration(); + AddStartupDocumentMigration(); + } + } + + private void AddInterceptorServices() + { + if (_interceptorAdded) + { + return; + } + + _services + .AddSingleton, TypeMigrationLocator>() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddSingleton(); + + _interceptorAdded = true; + } +} \ No newline at end of file diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs b/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs index cd47505..9449918 100644 --- a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs +++ b/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs @@ -1,47 +1,28 @@ +using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; - -using Mongo.Migration.Documents.Locators; -using Mongo.Migration.Documents.Serializers; -using Mongo.Migration.Migrations.Database; -using Mongo.Migration.Migrations.Document; -using Mongo.Migration.Migrations.Locators; using Mongo.Migration.Services; -using Mongo.Migration.Services.Interceptors; - namespace Mongo.Migration.Startup.DotNetCore; public static class MongoMigrationExtensions { - public static void AddMigration(this IServiceCollection services, IMongoMigrationSettings? settings = null) + public static IServiceCollection AddMigration( + this IServiceCollection services, + Action? configure = null) { - RegisterDefaults(services, settings ?? new MongoMigrationSettings()); + MongoMigrationBuilder builder = new MongoMigrationBuilder(services); - services.AddScoped(); - } - - private static void RegisterDefaults(IServiceCollection services, IMongoMigrationSettings settings) - { - services.AddSingleton(settings); + configure?.Invoke(builder); - services.AddSingleton(typeof(IMigrationLocator<>), typeof(TypeMigrationDependencyLocator<>)); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + builder.AddAllMigrationsIfNothingWasAdded(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); + return services; + } - services.AddTransient(); + public static async Task InitializeAndMigrateAsync(this IApplicationBuilder app, string databaseName, string? targetDatabaseVersion) + { + IMigrationService migrationService = app.ApplicationServices.GetRequiredService(); + migrationService.RegisterBsonStatics(); - services.AddTransient(); + await migrationService.MigrateAsync(databaseName, targetDatabaseVersion); } } \ No newline at end of file diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationStartupSettings.cs b/Mongo.Migration/Startup/DotNetCore/MongoMigrationStartupSettings.cs new file mode 100644 index 0000000..80c13ed --- /dev/null +++ b/Mongo.Migration/Startup/DotNetCore/MongoMigrationStartupSettings.cs @@ -0,0 +1,8 @@ +namespace Mongo.Migration.Startup.DotNetCore; + +internal class MongoMigrationStartupSettings +{ + public bool RuntimeMigrationEnabled { get; set; } + public bool StartupDocumentMigrationEnabled { get; set; } + public bool DatabaseMigrationEnabled { get; set; } +} \ No newline at end of file diff --git a/Mongo.Migration/Startup/IMongoMigrationSettings.cs b/Mongo.Migration/Startup/IMongoMigrationSettings.cs deleted file mode 100644 index f198e83..0000000 --- a/Mongo.Migration/Startup/IMongoMigrationSettings.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Mongo.Migration.Documents; - -using MongoDB.Driver; - -namespace Mongo.Migration.Startup; - -public interface IMongoMigrationSettings -{ - string? ConnectionString { get; set; } - - string? Database { get; set; } - - DocumentVersion DatabaseMigrationVersion { get; set; } - - string VersionFieldName { get; set; } - - MongoClientSettings? ClientSettings { get; set; } -} \ No newline at end of file diff --git a/Mongo.Migration/Startup/MongoMigrationSettings.cs b/Mongo.Migration/Startup/MongoMigrationSettings.cs index 4d375b3..5ffb3b1 100644 --- a/Mongo.Migration/Startup/MongoMigrationSettings.cs +++ b/Mongo.Migration/Startup/MongoMigrationSettings.cs @@ -1,18 +1,8 @@ using Mongo.Migration.Documents; -using MongoDB.Driver; - namespace Mongo.Migration.Startup; -public class MongoMigrationSettings : IMongoMigrationSettings +public class MongoMigrationSettings { - public string ConnectionString { get; set; } - - public string Database { get; set; } - - public DocumentVersion DatabaseMigrationVersion { get; set; } = DocumentVersion.Empty(); - - public string VersionFieldName { get; set; } - - public MongoClientSettings ClientSettings { get; set; } + public string VersionFieldName { get; set; } = "Version"; } \ No newline at end of file diff --git a/Mongo.Migration/Startup/Static/MongoMigrationClient.cs b/Mongo.Migration/Startup/Static/MongoMigrationClient.cs deleted file mode 100644 index c14b394..0000000 --- a/Mongo.Migration/Startup/Static/MongoMigrationClient.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Mongo.Migration.Exceptions; - -namespace Mongo.Migration.Startup.Static; - -public static class MongoMigrationClient -{ - private static bool _isRunning; - - public static void Initialize(IServiceProvider serviceProvider) - { - if (_isRunning) - { - throw new AlreadyInitializedException(); - } - - var app = serviceProvider.GetRequiredService(); - app.Run(); - - _isRunning = true; - } - - public static void Reset() - { - _isRunning = false; - } -} \ No newline at end of file From caeb066a40501ed3cfceadef70b426daaf468c92 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Mon, 23 Dec 2024 13:56:06 +0100 Subject: [PATCH 08/42] exception cleanup --- .../DotNetCore/MigrationBuilderTests.cs | 7 +- .../Interceptor/InterceptorTests.cs | 2 +- .../Performance/PerformanceOnStartup.cs | 4 +- .../Exceptions/AlreadyInitializedException.cs | 9 -- .../Exceptions/DuplicateVersionException.cs | 2 +- .../Exceptions/ErrorTexts.Designer.cs | 135 ---------------- Mongo.Migration/Exceptions/ErrorTexts.resx | 144 ------------------ .../InvalidVersionValueException.cs | 10 -- .../MongoMigrationDatabaseNotFound.cs | 10 -- .../MongoMigrationNoMongoClientException.cs | 9 -- .../NoDatabaseNameFoundException.cs | 5 - .../Exceptions/NoMigrationsFoundException.cs | 5 - .../VersionStringToLongException.cs | 10 -- .../Exceptions/VersionViolationException.cs | 2 +- .../Extensions/EnumerableExtensions.cs | 15 +- .../Migrations/Locators/MigrationLocator.cs | 5 +- .../Services/DatabaseVersionService.cs | 2 - .../Startup/MongoMigrationSettings.cs | 2 - 18 files changed, 16 insertions(+), 362 deletions(-) delete mode 100644 Mongo.Migration/Exceptions/AlreadyInitializedException.cs delete mode 100644 Mongo.Migration/Exceptions/ErrorTexts.Designer.cs delete mode 100644 Mongo.Migration/Exceptions/ErrorTexts.resx delete mode 100644 Mongo.Migration/Exceptions/InvalidVersionValueException.cs delete mode 100644 Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs delete mode 100644 Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs delete mode 100644 Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs delete mode 100644 Mongo.Migration/Exceptions/NoMigrationsFoundException.cs delete mode 100644 Mongo.Migration/Exceptions/VersionStringToLongException.cs diff --git a/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs b/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs index 7e75521..ba913f6 100644 --- a/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs +++ b/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Mongo.Migration.Documents.Locators; diff --git a/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs b/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs index 4256033..88b9f8b 100644 --- a/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs +++ b/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs @@ -63,7 +63,7 @@ await untypedCollection.InsertManyAsync(new[] Assert.Multiple(() => { - Assert.That(documents.Count, Is.EqualTo(3)); + Assert.That(documents, Has.Count.EqualTo(3)); Assert.That( documents.Select(d => d.Version.ToString()), Is.All.EqualTo("0.0.1")); diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index 36fdf27..b2c676d 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -1,8 +1,6 @@ -using System.ComponentModel.Design; -using System.Diagnostics; +using System.Diagnostics; using FluentAssertions; using Microsoft.Extensions.DependencyInjection; -using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Document; using Mongo.Migration.Tests.TestDoubles; using MongoDB.Bson; diff --git a/Mongo.Migration/Exceptions/AlreadyInitializedException.cs b/Mongo.Migration/Exceptions/AlreadyInitializedException.cs deleted file mode 100644 index 2e04e53..0000000 --- a/Mongo.Migration/Exceptions/AlreadyInitializedException.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Mongo.Migration.Exceptions; - -public class AlreadyInitializedException : Exception -{ - public AlreadyInitializedException() - : base(string.Format(ErrorTexts.AlreadyInitialized)) - { - } -} \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/DuplicateVersionException.cs b/Mongo.Migration/Exceptions/DuplicateVersionException.cs index 849250c..5d31990 100644 --- a/Mongo.Migration/Exceptions/DuplicateVersionException.cs +++ b/Mongo.Migration/Exceptions/DuplicateVersionException.cs @@ -3,7 +3,7 @@ internal class DuplicateVersionException : Exception { public DuplicateVersionException(string typeName, string version) - : base(string.Format(ErrorTexts.DuplicateVersion, typeName, version)) + : base($"Migration '{typeName}' contains duplicate version: {version}") { } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/ErrorTexts.Designer.cs b/Mongo.Migration/Exceptions/ErrorTexts.Designer.cs deleted file mode 100644 index a8b34e7..0000000 --- a/Mongo.Migration/Exceptions/ErrorTexts.Designer.cs +++ /dev/null @@ -1,135 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Mongo.Migration.Exceptions { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class ErrorTexts { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal ErrorTexts() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Mongo.Migration.Exceptions.ErrorTexts", typeof(ErrorTexts).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to MongoMigration was already initialized. - /// - public static string AlreadyInitialized { - get { - return ResourceManager.GetString("AlreadyInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Application directory could not be found. - /// - public static string AppDirNotFound { - get { - return ResourceManager.GetString("AppDirNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Database could not be found for: '{0}', database: '{1}'. - /// - public static string ConnectionCheckError { - get { - return ResourceManager.GetString("ConnectionCheckError", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Migration '{0}' contains duplicate version: {1}. - /// - public static string DuplicateVersion { - get { - return ResourceManager.GetString("DuplicateVersion", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid value: {0}. - /// - public static string InvalidVersionValue { - get { - return ResourceManager.GetString("InvalidVersionValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No MongoClient, you need to register a MongoClient to the DI-Container or define connection settings with MongoMigrationSettings. - /// - public static string NoMongoClient { - get { - return ResourceManager.GetString("NoMongoClient", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Versions must have format: major.minor.revision, this doesn't match: {0}. - /// - public static string VersionStringToLong { - get { - return ResourceManager.GetString("VersionStringToLong", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to CurrentVersion: '{0}', DocumentVersion: '{1}', LatestMigrationVersion: '{2}'. - /// - public static string VersionViolated { - get { - return ResourceManager.GetString("VersionViolated", resourceCulture); - } - } - } -} diff --git a/Mongo.Migration/Exceptions/ErrorTexts.resx b/Mongo.Migration/Exceptions/ErrorTexts.resx deleted file mode 100644 index 2320653..0000000 --- a/Mongo.Migration/Exceptions/ErrorTexts.resx +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MongoMigration was already initialized - - - Migration '{0}' contains duplicate version: {1} - - - Invalid value: {0} - - - Versions must have format: major.minor.revision, this doesn't match: {0} - - - No MongoClient, you need to register a MongoClient to the DI-Container or define connection settings with MongoMigrationSettings - - - CurrentVersion: '{0}', DocumentVersion: '{1}', LatestMigrationVersion: '{2}' - - - Application directory could not be found - - - Database could not be found for: '{0}', database: '{1}' - - \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/InvalidVersionValueException.cs b/Mongo.Migration/Exceptions/InvalidVersionValueException.cs deleted file mode 100644 index bae8505..0000000 --- a/Mongo.Migration/Exceptions/InvalidVersionValueException.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Mongo.Migration.Exceptions; - -public class InvalidVersionValueException : Exception -{ - public InvalidVersionValueException(string value) - : - base(string.Format(ErrorTexts.InvalidVersionValue, value)) - { - } -} \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs b/Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs deleted file mode 100644 index 68eac02..0000000 --- a/Mongo.Migration/Exceptions/MongoMigrationDatabaseNotFound.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Mongo.Migration.Exceptions; - -internal class MongoMigrationDatabaseNotFound - : Exception -{ - public MongoMigrationDatabaseNotFound(string databaseName, string valueConnectionString) - : base(string.Format(ErrorTexts.ConnectionCheckError, databaseName, valueConnectionString)) - { - } -} \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs b/Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs deleted file mode 100644 index 21c2bab..0000000 --- a/Mongo.Migration/Exceptions/MongoMigrationNoMongoClientException.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Mongo.Migration.Exceptions; - -public class MongoMigrationNoMongoClientException : Exception -{ - public MongoMigrationNoMongoClientException() - : base(string.Format(ErrorTexts.NoMongoClient)) - { - } -} \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs b/Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs deleted file mode 100644 index f4c500a..0000000 --- a/Mongo.Migration/Exceptions/NoDatabaseNameFoundException.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Mongo.Migration.Exceptions; - -internal class NoDatabaseNameFoundException : Exception -{ -} \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/NoMigrationsFoundException.cs b/Mongo.Migration/Exceptions/NoMigrationsFoundException.cs deleted file mode 100644 index 517ad9b..0000000 --- a/Mongo.Migration/Exceptions/NoMigrationsFoundException.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Mongo.Migration.Exceptions; - -public class NoMigrationsFoundException : Exception -{ -} \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/VersionStringToLongException.cs b/Mongo.Migration/Exceptions/VersionStringToLongException.cs deleted file mode 100644 index 1abf975..0000000 --- a/Mongo.Migration/Exceptions/VersionStringToLongException.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Mongo.Migration.Exceptions; - -public class VersionStringToLongException : Exception -{ - public VersionStringToLongException(string version) - : - base(string.Format(ErrorTexts.VersionStringToLong, version)) - { - } -} \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/VersionViolationException.cs b/Mongo.Migration/Exceptions/VersionViolationException.cs index 3af053d..9018929 100644 --- a/Mongo.Migration/Exceptions/VersionViolationException.cs +++ b/Mongo.Migration/Exceptions/VersionViolationException.cs @@ -8,7 +8,7 @@ public VersionViolationException( DocumentVersion currentVersion, DocumentVersion documentVersion, DocumentVersion latestVersion) - : base(string.Format(ErrorTexts.DuplicateVersion, currentVersion, documentVersion, latestVersion)) + : base($"CurrentVersion: '{currentVersion}', DocumentVersion: '{documentVersion}', LatestMigrationVersion: '{latestVersion}'") { } } \ No newline at end of file diff --git a/Mongo.Migration/Extensions/EnumerableExtensions.cs b/Mongo.Migration/Extensions/EnumerableExtensions.cs index 6d32e46..6de5bfa 100644 --- a/Mongo.Migration/Extensions/EnumerableExtensions.cs +++ b/Mongo.Migration/Extensions/EnumerableExtensions.cs @@ -28,22 +28,25 @@ internal static IDictionary> ToMigrati this IEnumerable migrations) where TMigrationType : class, IMigration { - var dictonary = new Dictionary>(); + var dictionary = new Dictionary>(); var list = migrations.ToList(); var types = (from m in list select m.Type).Distinct(); foreach (var type in types) { - if (dictonary.ContainsKey(type)) + if (dictionary.ContainsKey(type)) { continue; } - var uniqueMigrations = - list.Where(m => m.Type == type).CheckForDuplicates().OrderBy(m => m.Version).ToList(); - dictonary.Add(type, uniqueMigrations); + var uniqueMigrations = list + .Where(m => m.Type == type) + .CheckForDuplicates() + .OrderBy(m => m.Version) + .ToList(); + dictionary.Add(type, uniqueMigrations); } - return dictonary; + return dictionary; } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs index 600e1cc..b1dde5f 100644 --- a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs @@ -1,7 +1,6 @@ using System.Reflection; using Microsoft.Extensions.Logging; using Mongo.Migration.Documents; -using Mongo.Migration.Exceptions; namespace Mongo.Migration.Migrations.Locators; @@ -33,7 +32,7 @@ protected virtual IDictionary> Migrati if (_migrations is null || _migrations.Count <= 0) { - _logger.LogInformation(new NoMigrationsFoundException(), "No migration found"); + _logger.LogWarning("No migration found"); } return _migrations!; @@ -100,7 +99,7 @@ private static List GetAssemblies() if (string.IsNullOrWhiteSpace(path)) { - throw new DirectoryNotFoundException(ErrorTexts.AppDirNotFound); + throw new DirectoryNotFoundException(location); } var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); diff --git a/Mongo.Migration/Services/DatabaseVersionService.cs b/Mongo.Migration/Services/DatabaseVersionService.cs index 813217d..6e7320d 100644 --- a/Mongo.Migration/Services/DatabaseVersionService.cs +++ b/Mongo.Migration/Services/DatabaseVersionService.cs @@ -1,8 +1,6 @@ using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Locators; -using Mongo.Migration.Startup; - using MongoDB.Driver; namespace Mongo.Migration.Services; diff --git a/Mongo.Migration/Startup/MongoMigrationSettings.cs b/Mongo.Migration/Startup/MongoMigrationSettings.cs index 5ffb3b1..73c9886 100644 --- a/Mongo.Migration/Startup/MongoMigrationSettings.cs +++ b/Mongo.Migration/Startup/MongoMigrationSettings.cs @@ -1,5 +1,3 @@ -using Mongo.Migration.Documents; - namespace Mongo.Migration.Startup; public class MongoMigrationSettings From 3577c7221be2cf46df314daffa70925c354fad82 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Mon, 23 Dec 2024 13:59:21 +0100 Subject: [PATCH 09/42] remove warnin and small optim --- Mongo.Migration/Extensions/EnumerableExtensions.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Mongo.Migration/Extensions/EnumerableExtensions.cs b/Mongo.Migration/Extensions/EnumerableExtensions.cs index 6de5bfa..7e51756 100644 --- a/Mongo.Migration/Extensions/EnumerableExtensions.cs +++ b/Mongo.Migration/Extensions/EnumerableExtensions.cs @@ -1,4 +1,5 @@ -using Mongo.Migration.Exceptions; +using Mongo.Migration.Documents; +using Mongo.Migration.Exceptions; using Mongo.Migration.Migrations; namespace Mongo.Migration.Extensions; @@ -8,20 +9,18 @@ internal static class EnumerableExtensions internal static IEnumerable CheckForDuplicates(this IEnumerable list) where TMigrationType : class, IMigration { - var uniqueHashes = new HashSet(); + var uniqueHashes = new HashSet(); foreach (var element in list) { - var version = element.Version.ToString(); + var version = element.Version; if (uniqueHashes.Add(version)) { - continue; + yield return element; } var typeName = element.GetType().Name; throw new DuplicateVersionException(typeName, element.Version.ToString()); } - - return list; } internal static IDictionary> ToMigrationDictionary( From d19dad9451060a8d3d45e8055c366539c46115cd Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Mon, 23 Dec 2024 14:06:25 +0100 Subject: [PATCH 10/42] fix duplicate version algo --- Mongo.Migration/Extensions/EnumerableExtensions.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Mongo.Migration/Extensions/EnumerableExtensions.cs b/Mongo.Migration/Extensions/EnumerableExtensions.cs index 7e51756..8233fa9 100644 --- a/Mongo.Migration/Extensions/EnumerableExtensions.cs +++ b/Mongo.Migration/Extensions/EnumerableExtensions.cs @@ -12,14 +12,14 @@ internal static IEnumerable CheckForDuplicates(t var uniqueHashes = new HashSet(); foreach (var element in list) { - var version = element.Version; - if (uniqueHashes.Add(version)) + if (uniqueHashes.Add(element.Version)) { yield return element; } - - var typeName = element.GetType().Name; - throw new DuplicateVersionException(typeName, element.Version.ToString()); + else + { + throw new DuplicateVersionException(element.GetType().Name, element.Version.ToString()); + } } } From 912f6184d1a6fc394b4b6648f22933320582088b Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Mon, 23 Dec 2024 14:30:46 +0100 Subject: [PATCH 11/42] optim unecessary lookup at runtime --- .../Document/DocumentMigrationRunner.cs | 3 +-- .../Interceptors/MigrationInterceptor.cs | 17 +++++++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs index dc3e8f4..e05ee36 100644 --- a/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs @@ -34,9 +34,8 @@ public void Run(Type type, BsonDocument document) public void Run(Type type, BsonDocument document, DocumentVersion to) { var documentVersion = _documentVersionService.GetVersionOrDefault(document); - var currentOrLatest = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); - if (documentVersion == to || documentVersion == currentOrLatest) + if (documentVersion == to) { return; } diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs index a13bf2a..99ff45e 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs @@ -1,5 +1,6 @@ using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Document; +using MongoDB.Bson; using MongoDB.Bson.IO; using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Serializers; @@ -11,35 +12,31 @@ internal sealed class MigrationInterceptor : SerializerBase _innerSerializer; public MigrationInterceptor(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) { _migrationRunner = migrationRunner; - _documentVersionService = documentVersionService; + _runtimeVersion = documentVersionService.GetCurrentOrLatestMigrationVersion(s_tDocumentType); BsonClassMap classMap = BsonClassMap.LookupClassMap(s_tDocumentType); _innerSerializer = new BsonClassMapSerializer(classMap); } public override TDocument Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { - // TODO: Performance? LatestVersion, dont do anything - var document = BsonDocumentSerializer.Instance.Deserialize(context); - - _migrationRunner.Run(s_tDocumentType, document); - + BsonDocument document = BsonDocumentSerializer.Instance.Deserialize(context); + _migrationRunner.Run(s_tDocumentType, document, _runtimeVersion); var migratedContext = BsonDeserializationContext.CreateRoot(new BsonDocumentReader(document)); - return _innerSerializer.Deserialize(migratedContext, args); } public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TDocument value) { - _documentVersionService.DetermineVersion(value); + value.Version = _runtimeVersion; _innerSerializer.Serialize(context, args, value); } } \ No newline at end of file From 8a926b49319337bf06e738ab122eb8c82544bf72 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Mon, 23 Dec 2024 22:59:55 +0100 Subject: [PATCH 12/42] Fix migration down version, minor optims --- ...cumentMigrationRunner_when_migrating_up.cs | 4 +- .../TypeMigrationLocator_when_locate.cs | 19 +++---- .../Extensions/EnumerableExtensions.cs | 4 +- .../Database/DatabaseMigrationRunner.cs | 24 +++------ .../Database/IDatabaseMigrationRunner.cs | 2 +- .../Migrations/Document/DocumentMigration.cs | 3 +- .../Document/DocumentMigrationRunner.cs | 50 +++++++------------ .../Document/IDocumentMigrationRunner.cs | 2 +- .../Migrations/Locators/IMigrationLocator.cs | 8 ++- .../Migrations/Locators/MigrationLocator.cs | 35 ++++--------- .../Services/DocumentVersionService.cs | 12 ++--- .../Services/IDocumentVersionService.cs | 6 +-- .../Interceptors/MigrationInterceptor.cs | 2 +- .../MigrationInterceptorProvider.cs | 5 +- 14 files changed, 65 insertions(+), 111 deletions(-) diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs index 97f79e4..29f0650 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs @@ -43,8 +43,8 @@ public void When_document_has_no_version_Then_all_migrations_are_used() runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert - document.Names.ToList()[1].Should().Be("Door"); - document.Values.ToList()[0].AsString.Should().Be("0.0.2"); + document["Door"].AsInt32.Should().Be(3); + document["Version"].AsString.Should().Be("0.0.2"); } [Test] diff --git a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs index 13580bf..4eb03d1 100644 --- a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs @@ -50,29 +50,26 @@ public void When_get_latest_version_of_migrations() } [Test] - public void When_get_migrations_gt_and_equal_version() + public void When_get_migrations_from_to() { // Act - var result = _locator.GetMigrationsGtEq( - typeof(TestDocumentWithTwoMigration), - new DocumentVersion(0,0,1)) + var result = _locator + .GetMigrationsFromTo(typeof(TestDocumentWithTwoMigration), DocumentVersion.Default, DocumentVersion.Parse("0.0.1")) .ToList(); - // Assert + result.Should().HaveCount(1); result[0].Should().BeOfType(); - result[1].Should().BeOfType(); } [Test] - public void When_get_migrations_gt_version() + public void When_get_migrations_from_to_down() { // Act - var result = _locator.GetMigrationsGt( - typeof(TestDocumentWithTwoMigration), - new DocumentVersion(0, 0, 1)) + var result = _locator + .GetMigrationsFromToDown(typeof(TestDocumentWithTwoMigration), DocumentVersion.Parse("0.0.2"), DocumentVersion.Parse("0.0.1")) .ToList(); - // Assert + result.Should().HaveCount(1); result[0].Should().BeOfType(); } } \ No newline at end of file diff --git a/Mongo.Migration/Extensions/EnumerableExtensions.cs b/Mongo.Migration/Extensions/EnumerableExtensions.cs index 8233fa9..105778a 100644 --- a/Mongo.Migration/Extensions/EnumerableExtensions.cs +++ b/Mongo.Migration/Extensions/EnumerableExtensions.cs @@ -7,7 +7,7 @@ namespace Mongo.Migration.Extensions; internal static class EnumerableExtensions { internal static IEnumerable CheckForDuplicates(this IEnumerable list) - where TMigrationType : class, IMigration + where TMigrationType : IMigration { var uniqueHashes = new HashSet(); foreach (var element in list) @@ -25,7 +25,7 @@ internal static IEnumerable CheckForDuplicates(t internal static IDictionary> ToMigrationDictionary( this IEnumerable migrations) - where TMigrationType : class, IMigration + where TMigrationType : IMigration { var dictionary = new Dictionary>(); var list = migrations.ToList(); diff --git a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs index 4491194..fd64250 100644 --- a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs @@ -26,7 +26,7 @@ public DatabaseMigrationRunner( _logger = logger; } - public void Run(IMongoDatabase db, DocumentVersion? targetVersion = null) + public void Run(IMongoDatabase db, in DocumentVersion? targetVersion = null) { _logger.LogInformation("Database migration started."); DocumentVersion databaseVersion = _databaseVersionService.GetLatestDatabaseVersion(db); @@ -44,8 +44,8 @@ public void Run(IMongoDatabase db, DocumentVersion? targetVersion = null) private void MigrateUpOrDown( IMongoDatabase db, - DocumentVersion databaseVersion, - DocumentVersion to) + in DocumentVersion databaseVersion, + in DocumentVersion to) { if (databaseVersion > to) { @@ -56,9 +56,10 @@ private void MigrateUpOrDown( MigrateUp(db, databaseVersion, to); } - private void MigrateUp(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion) + private void MigrateUp(IMongoDatabase db, in DocumentVersion currentVersion, in DocumentVersion toVersion) { - var migrations = _migrationLocator.GetMigrationsFromTo(_databaseMigrationType, currentVersion, toVersion).ToList(); + var migrations = _migrationLocator + .GetMigrationsFromTo(_databaseMigrationType, currentVersion, toVersion); foreach (var migration in migrations) { @@ -71,22 +72,13 @@ private void MigrateUp(IMongoDatabase db, DocumentVersion currentVersion, Docume } } - // consider filtering migration version between current and to - private void MigrateDown(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion) + private void MigrateDown(IMongoDatabase db, in DocumentVersion currentVersion, in DocumentVersion toVersion) { - //var migrations = _migrationLocator.GetMigrationsFromTo(_databaseMigrationType, currentVersion, toVersion).Reverse().ToList(); ??? => look not ordered var migrations = _migrationLocator - .GetMigrationsGtEq(_databaseMigrationType, toVersion) - .OrderByDescending(m => m.Version) - .ToList(); + .GetMigrationsFromToDown(_databaseMigrationType, currentVersion, toVersion); foreach (var migration in migrations) { - if (migration.Version == toVersion) - { - break; - } - _logger.LogInformation("Database Migration Down: {Type}:{Version} ", migration.GetType(), migration.Version); migration.Down(db); diff --git a/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs index 0306b5f..953ae42 100644 --- a/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs @@ -5,5 +5,5 @@ namespace Mongo.Migration.Migrations.Database; public interface IDatabaseMigrationRunner { - void Run(IMongoDatabase db, DocumentVersion? targetVersion = null); + void Run(IMongoDatabase db, in DocumentVersion? targetVersion = null); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/DocumentMigration.cs b/Mongo.Migration/Migrations/Document/DocumentMigration.cs index 970f6b1..50a2b11 100644 --- a/Mongo.Migration/Migrations/Document/DocumentMigration.cs +++ b/Mongo.Migration/Migrations/Document/DocumentMigration.cs @@ -1,11 +1,10 @@ using Mongo.Migration.Documents; - using MongoDB.Bson; namespace Mongo.Migration.Migrations.Document; public abstract class DocumentMigration : IDocumentMigration - where TClass : class, IDocument + where TClass : IDocument { protected DocumentMigration(string version) { diff --git a/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs index e05ee36..d89a432 100644 --- a/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/DocumentMigrationRunner.cs @@ -20,18 +20,11 @@ public DocumentMigrationRunner(IMigrationLocator migrationLo public void Run(Type type, BsonDocument document) { - var documentVersion = _documentVersionService.GetVersionOrDefault(document); var currentOrLatest = _documentVersionService.GetCurrentOrLatestMigrationVersion(type); - - if (documentVersion == currentOrLatest) - { - return; - } - - MigrateUpOrDown(type, document, documentVersion, currentOrLatest); + Run(type, document, currentOrLatest); } - public void Run(Type type, BsonDocument document, DocumentVersion to) + public void Run(Type type, BsonDocument document, in DocumentVersion to) { var documentVersion = _documentVersionService.GetVersionOrDefault(document); @@ -46,47 +39,40 @@ public void Run(Type type, BsonDocument document, DocumentVersion to) private void MigrateUpOrDown( Type type, BsonDocument document, - DocumentVersion documentVersion, - DocumentVersion to) + in DocumentVersion documentVersion, + in DocumentVersion to) { if (documentVersion > to) { - MigrateDown(type, document, to); - return; + MigrateDown(type, document, documentVersion, to); } - - MigrateUp(type, document, documentVersion, to); + else + { + MigrateUp(type, document, documentVersion, to); + } + + _documentVersionService.SetVersion(document, to); } - private void MigrateUp(Type type, BsonDocument document, DocumentVersion version, DocumentVersion toVersion) + private void MigrateUp(Type type, BsonDocument document, in DocumentVersion version, in DocumentVersion toVersion) { - var migrations = _migrationLocator.GetMigrationsFromTo(type, version, toVersion).ToList(); + var migrations = _migrationLocator + .GetMigrationsFromTo(type, version, toVersion); foreach (var migration in migrations) { migration.Up(document); - _documentVersionService.SetVersion(document, migration.Version); } } - private void MigrateDown(Type type, BsonDocument document, DocumentVersion version) + private void MigrateDown(Type type, BsonDocument document, in DocumentVersion version, in DocumentVersion toVersion) { var migrations = _migrationLocator - .GetMigrationsGtEq(type, version) - .OrderByDescending(m => m.Version) - .ToList(); + .GetMigrationsFromToDown(type, version, toVersion); - for (var m = 0; m < migrations.Count; m++) + foreach (var migration in migrations) { - if (version == migrations[m].Version) - { - break; - } - - migrations[m].Down(document); - - var docVersion = _documentVersionService.DetermineLastVersion(version, migrations, m); - _documentVersionService.SetVersion(document, docVersion); + migration.Down(document); } } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs index ce1e603..51ef928 100644 --- a/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/IDocumentMigrationRunner.cs @@ -6,7 +6,7 @@ namespace Mongo.Migration.Migrations.Document; public interface IDocumentMigrationRunner { - void Run(Type type, BsonDocument document, DocumentVersion to); + void Run(Type type, BsonDocument document, in DocumentVersion to); void Run(Type type, BsonDocument document); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs index 9e04ee0..ee0a8e8 100644 --- a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs @@ -2,17 +2,15 @@ namespace Mongo.Migration.Migrations.Locators; -public interface IMigrationLocator +public interface IMigrationLocator where TMigrationType : class, IMigration { IReadOnlyCollection GetMigrations(Type type); - IEnumerable GetMigrationsGt(Type type, DocumentVersion version); - - IEnumerable GetMigrationsGtEq(Type type, DocumentVersion version); - IEnumerable GetMigrationsFromTo(Type type, DocumentVersion version, DocumentVersion otherVersion); + IEnumerable GetMigrationsFromToDown(Type type, DocumentVersion version, DocumentVersion otherVersion); + DocumentVersion GetLatestVersion(Type type); void Locate(); diff --git a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs index b1dde5f..dba0f5a 100644 --- a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs @@ -1,4 +1,5 @@ -using System.Reflection; +using System.Collections.Immutable; +using System.Reflection; using Microsoft.Extensions.Logging; using Mongo.Migration.Documents; @@ -35,7 +36,7 @@ protected virtual IDictionary> Migrati _logger.LogWarning("No migration found"); } - return _migrations!; + return _migrations ?? ImmutableDictionary>.Empty; } set => _migrations = value; } @@ -52,33 +53,15 @@ public IReadOnlyCollection GetMigrations(Type type) public IEnumerable GetMigrationsFromTo(Type type, DocumentVersion version, DocumentVersion otherVersion) { - var migrations = GetMigrations(type); - - return - migrations - .Where(m => m.Version > version) - .Where(m => m.Version <= otherVersion) - .ToList(); + return GetMigrations(type) + .Where(m => m.Version > version && m.Version <= otherVersion); } - public IEnumerable GetMigrationsGt(Type type, DocumentVersion version) + public IEnumerable GetMigrationsFromToDown(Type type, DocumentVersion version, DocumentVersion otherVersion) { - var migrations = GetMigrations(type); - - return - migrations - .Where(m => m.Version > version) - .ToList(); - } - - public IEnumerable GetMigrationsGtEq(Type type, DocumentVersion version) - { - var migrations = GetMigrations(type); - - return - migrations - .Where(m => m.Version >= version) - .ToList(); + return GetMigrations(type) + .Where(m => m.Version <= version && m.Version > otherVersion) + .Reverse(); } public DocumentVersion GetLatestVersion(Type type) diff --git a/Mongo.Migration/Services/DocumentVersionService.cs b/Mongo.Migration/Services/DocumentVersionService.cs index 647e271..0138dc2 100644 --- a/Mongo.Migration/Services/DocumentVersionService.cs +++ b/Mongo.Migration/Services/DocumentVersionService.cs @@ -62,13 +62,13 @@ public DocumentVersion GetVersionOrDefault(BsonDocument document) return DocumentVersion.Default; } - public void SetVersion(BsonDocument document, DocumentVersion version) + public void SetVersion(BsonDocument document, in DocumentVersion version) { document[GetVersionFieldName()] = new BsonString(version.ToString()); } public void DetermineVersion(TClass instance) - where TClass : class, IDocument + where TClass : IDocument { var type = typeof(TClass); var documentVersion = instance.Version; @@ -95,7 +95,7 @@ public void DetermineVersion(TClass instance) } public DocumentVersion DetermineLastVersion( - DocumentVersion version, + in DocumentVersion version, List migrations, int currentMigration) { @@ -114,9 +114,9 @@ public DocumentVersion DetermineLastVersion( private static void SetVersion( TClass instance, - DocumentVersion currentVersion, - DocumentVersion latestVersion) - where TClass : class, IDocument + in DocumentVersion currentVersion, + in DocumentVersion latestVersion) + where TClass : IDocument { if (currentVersion < latestVersion) { diff --git a/Mongo.Migration/Services/IDocumentVersionService.cs b/Mongo.Migration/Services/IDocumentVersionService.cs index 1e7070f..a73b7d3 100644 --- a/Mongo.Migration/Services/IDocumentVersionService.cs +++ b/Mongo.Migration/Services/IDocumentVersionService.cs @@ -14,13 +14,13 @@ public interface IDocumentVersionService DocumentVersion GetVersionOrDefault(BsonDocument document); - void SetVersion(BsonDocument document, DocumentVersion version); + void SetVersion(BsonDocument document, in DocumentVersion version); void DetermineVersion(TClass instance) - where TClass : class, IDocument; + where TClass : IDocument; DocumentVersion DetermineLastVersion( - DocumentVersion version, + in DocumentVersion version, List migrations, int currentMigration); } \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs index 99ff45e..b0580dc 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs @@ -8,7 +8,7 @@ namespace Mongo.Migration.Services.Interceptors; internal sealed class MigrationInterceptor : SerializerBase - where TDocument : class, IDocument + where TDocument : IDocument { private static readonly Type s_tDocumentType = typeof(TDocument); diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs index 3ca1f79..da38b03 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs +++ b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs @@ -8,7 +8,6 @@ internal class MigrationInterceptorProvider : IMigrationInterceptorProvider { private static readonly Type s_iDocumentType = typeof(IDocument); private static readonly Type s_bsonDocumentType = typeof(BsonDocument); - private readonly IMigrationInterceptorFactory _migrationInterceptorFactory; public MigrationInterceptorProvider(IMigrationInterceptorFactory migrationInterceptorFactory) @@ -35,8 +34,8 @@ public IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry serializ private static bool ShouldBeMigrated(Type type) { - return type != s_bsonDocumentType - && type.GetInterfaces().Contains(s_iDocumentType); + return type != s_bsonDocumentType + && type.GetInterfaces().Contains(s_iDocumentType); } public IMigrationInterceptorFactory MigrationInterceptorFactory => _migrationInterceptorFactory; From 5d6bcc88a5f6e2cfb30416605c3c1677de1d8c22 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Fri, 27 Dec 2024 15:11:04 +0100 Subject: [PATCH 13/42] add runtime migration performance tests --- Mongo.Migration.Tests/IntegrationTest.cs | 9 +- .../Performance/PerformanceOnStartup.cs | 51 ++++----- .../PerformanceRuntimeMigration.cs | 106 ++++++++++++++++++ .../TestDoubles/TestClass.cs | 2 + 4 files changed, 135 insertions(+), 33 deletions(-) create mode 100644 Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs diff --git a/Mongo.Migration.Tests/IntegrationTest.cs b/Mongo.Migration.Tests/IntegrationTest.cs index ef7c2e3..518feab 100644 --- a/Mongo.Migration.Tests/IntegrationTest.cs +++ b/Mongo.Migration.Tests/IntegrationTest.cs @@ -1,4 +1,5 @@ -using MongoDB.Driver; +using MongoDB.Bson; +using MongoDB.Driver; using NUnit.Framework; namespace Mongo.Migration.Tests; @@ -6,14 +7,14 @@ namespace Mongo.Migration.Tests; [TestFixture] public class IntegrationTest { - private const string DatabaseName = "PerformanceTest"; + private const string DatabaseName = "IntegrationTest"; private const string CollectionName = "Test"; [SetUp] - protected async Task SetUpAsync() + protected void SetUp() { IMongoClient client = TestcontainersContext.MongoClient; - await client.GetDatabase(DatabaseName).CreateCollectionAsync(CollectionName); + client.GetDatabase(DatabaseName).GetCollection(CollectionName); } [TearDown] diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index b2c676d..20e1fa9 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -21,27 +21,27 @@ public class PerformanceTestOnStartup private const int ToleranceMs = 2800; [Test] - public void When_migrating_number_of_documents() + public async Task When_migrating_number_of_documents() { // Arrange // Worm up MongoCache ClearCollection(); - AddDocumentsToCache(); + await AddDocumentsToCacheAsync(); ClearCollection(); // Act // Measure time of MongoDb processing without Mongo.Migration - InsertMany(DocumentCount, false); + await InsertDocumentsAsync(DocumentCount); var sw = new Stopwatch(); sw.Start(); - MigrateAll(false); + await QueryAllAsync(false); sw.Stop(); ClearCollection(); // Measure time of MongoDb processing with Mongo.Migration IMongoClient client = TestcontainersContext.MongoClient; - InsertMany(DocumentCount, true); + await InsertDocumentsAsync(DocumentCount); var swWithMigration = new Stopwatch(); swWithMigration.Start(); @@ -54,37 +54,30 @@ public void When_migrating_number_of_documents() var result = swWithMigration.ElapsedMilliseconds - sw.ElapsedMilliseconds; - TestContext.Out.WriteLine($"MongoDB: {sw.ElapsedMilliseconds}ms, Mongo.Migration: {swWithMigration.ElapsedMilliseconds}ms, Diff: {result}ms (Tolerance: {ToleranceMs}ms), Documents: {DocumentCount}, Migrations per Document: 2"); + await TestContext.Out.WriteLineAsync($"MongoDB: {sw.ElapsedMilliseconds}ms, Mongo.Migration: {swWithMigration.ElapsedMilliseconds}ms, Diff: {result}ms (Tolerance: {ToleranceMs}ms), Documents: {DocumentCount}, Migrations per Document: 2"); // Assert result.Should().BeLessThan(ToleranceMs); } - private static void InsertMany(int number, bool withVersion) + private static Task InsertDocumentsAsync(int documentCount) { - var documents = new List(); - for (var n = 0; n < number; n++) - { - var document = new BsonDocument - { - { "Dors", 3 } - }; - if (withVersion) + var documents = Enumerable + .Range(0, documentCount) + .Select(i => new BsonDocument { - document.Add("Version", "0.0.0"); - } + { "_id", new BsonObjectId(ObjectId.GenerateNewId())}, + { "Dors", new BsonInt32(i) }, + { "Version", BsonString.Create("0.0.0") } + }); - documents.Add(document); - } - - TestcontainersContext.MongoClient + return TestcontainersContext.MongoClient .GetDatabase(DatabaseName) .GetCollection(CollectionName) - .InsertManyAsync(documents) - .Wait(); + .InsertManyAsync(documents); } - private static void MigrateAll(bool withVersion) + private static async Task QueryAllAsync(bool withVersion) { IMongoClient client = TestcontainersContext.MongoClient; @@ -92,18 +85,18 @@ private static void MigrateAll(bool withVersion) { var versionedCollection = client.GetDatabase(DatabaseName) .GetCollection(CollectionName); - var versionedResult = versionedCollection.FindAsync(_ => true).Result.ToListAsync().Result; + var versionedResult = await (await versionedCollection.FindAsync(_ => true)).ToListAsync(); return; } var collection = client.GetDatabase(DatabaseName) .GetCollection(CollectionName); - var result = collection.FindAsync(_ => true).Result.ToListAsync().Result; + var result = await (await collection.FindAsync(_ => true)).ToListAsync(); } - private static void AddDocumentsToCache() + private static async Task AddDocumentsToCacheAsync() { - InsertMany(DocumentCount, false); - MigrateAll(false); + await InsertDocumentsAsync(DocumentCount); + await QueryAllAsync(false); } private static void ClearCollection() diff --git a/Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs b/Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs new file mode 100644 index 0000000..0e6cf5c --- /dev/null +++ b/Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs @@ -0,0 +1,106 @@ + +using System.Diagnostics; +using Mongo.Migration.Tests.TestDoubles; +using MongoDB.Bson; +using MongoDB.Driver; +using NUnit.Framework; + +namespace Mongo.Migration.Tests.Performance; + +public class PerformanceRuntimeMigration +{ + private const string DatabaseName = "PerformanceTest"; + + private const string CollectionName = "TestRuntime"; + + [TearDown] + public Task TearDownAsync() + { + return GetCollection() + .DeleteManyAsync(FilterDefinition.Empty); + } + + private IMongoCollection GetCollection() + { + return TestcontainersContext.MongoClient + .GetDatabase(DatabaseName) + .GetCollection(CollectionName); + } + + private Task InsertDocumentsAsync(int documentCount, Func documentFactory) + { + var documents = Enumerable + .Range(0, documentCount) + .Select(documentFactory); + + return GetCollection() + .InsertManyAsync(documents); + } + + [TestCase(1_000, 100L)] + [TestCase(10_000, 200L)] + [TestCase(50_000, 500L)] + public async Task MeasureVanillaRead(int documentCount, long msDurationThreshold) + { + await InsertDocumentsAsync(documentCount, i => new BsonDocument + { + { "_id", new BsonObjectId(ObjectId.GenerateNewId())}, + { "Dors", new BsonInt32(i) }, + { "Version", BsonString.Create("0.0.0") } + }); + + IMongoCollection collection = GetCollection(); + Stopwatch sw = Stopwatch.StartNew(); + List results = await (await collection.FindAsync(FilterDefinition.Empty)).ToListAsync(); + sw.Stop(); + + await TestContext.Out.WriteLineAsync($"Elapsed {sw.ElapsedMilliseconds} ms to read {results.Count} documents"); + Assert.That(sw.ElapsedMilliseconds, Is.LessThan(msDurationThreshold)); + } + + [TestCase(1_000, 200L)] + [TestCase(10_000, 400L)] + [TestCase(50_000, 1000L)] + public async Task MeasureRead2Migrations(int documentCount, long msDurationThreshold) + { + await InsertDocumentsAsync(documentCount, i => new BsonDocument + { + { "_id", new BsonObjectId(ObjectId.GenerateNewId())}, + { "Dors", new BsonInt32(i) }, + { "Version", BsonString.Create("0.0.0") } + }); + + IMongoCollection collection = GetCollection(); + TestDocumentWithTwoMigrationHighestVersion? initDocument = collection.AsQueryable().FirstOrDefault(); + + Stopwatch sw = Stopwatch.StartNew(); + List results = await (await collection.FindAsync(FilterDefinition.Empty)).ToListAsync(); + sw.Stop(); + + await TestContext.Out.WriteLineAsync($"Elapsed {sw.ElapsedMilliseconds} ms to read {results.Count} documents"); + Assert.That(sw.ElapsedMilliseconds, Is.LessThan(msDurationThreshold)); + } + + [TestCase(1_000, 200L)] + [TestCase(10_000, 400L)] + [TestCase(50_000, 1000L)] + public async Task MeasureReadNoMigration(int documentCount, long msDurationThreshold) + { + await InsertDocumentsAsync(documentCount, i => new BsonDocument + { + { "_id", new BsonObjectId(ObjectId.GenerateNewId())}, + { "Door", new BsonInt32(i) }, + { "Version", BsonString.Create("0.0.2") } + }); + + IMongoCollection collection = GetCollection(); + TestDocumentWithTwoMigrationHighestVersion? initDocument = collection.AsQueryable().FirstOrDefault(); + + Stopwatch sw = Stopwatch.StartNew(); + List results = await (await collection.FindAsync(FilterDefinition.Empty)).ToListAsync(); + sw.Stop(); + + await TestContext.Out.WriteLineAsync($"Elapsed {sw.ElapsedMilliseconds} ms to read {results.Count} documents"); + Assert.That(sw.ElapsedMilliseconds, Is.LessThan(msDurationThreshold)); + } +} \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestClass.cs b/Mongo.Migration.Tests/TestDoubles/TestClass.cs index b851acc..b4029b2 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestClass.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestClass.cs @@ -7,4 +7,6 @@ public class TestClass public ObjectId Id { get; set; } public int Dors { get; set; } + + public required string Version { get; set; } } \ No newline at end of file From 1a05238bdc810f9a04de6439272b4d02416eed9e Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Sun, 5 Jan 2025 15:52:10 +0100 Subject: [PATCH 14/42] remove interceptorfactory and interceptor provider --- .../DotNetCore/MigrationBuilderTests.cs | 15 +++---- ...grationInterceptorFactory_when_creating.cs | 26 +++++------ ...InterceptorProvider_when_get_serializer.cs | 8 ++-- .../IMigrationInterceptorFactory.cs | 13 ------ .../IMigrationInterceptorProvider.cs | 8 ---- .../MigrationBsonSerializerProvider.cs | 43 +++++++++++++++++++ .../MigrationInterceptorFactory.cs | 30 ------------- .../MigrationInterceptorProvider.cs | 42 ------------------ Mongo.Migration/Services/MigrationService.cs | 4 +- .../DotNetCore/MongoMigrationBuilder.cs | 8 ++-- 10 files changed, 72 insertions(+), 125 deletions(-) delete mode 100644 Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs delete mode 100644 Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs create mode 100644 Mongo.Migration/Services/Interceptors/MigrationBsonSerializerProvider.cs delete mode 100644 Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs delete mode 100644 Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs diff --git a/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs b/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs index ba913f6..30e4a4a 100644 --- a/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs +++ b/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs @@ -51,12 +51,8 @@ public void RuntimeMigrationOnlyRequiredRegistered() Assert.That(startupSettings.DatabaseMigrationEnabled, Is.False); Assert.That(startupSettings.StartupDocumentMigrationEnabled, Is.False); - Assert.That( - provider.GetRequiredService(), - Is.TypeOf()); - Assert.That( - provider.GetRequiredService(), - Is.TypeOf()); + Assert.That(provider.GetRequiredService(), Is.TypeOf()); + Assert.DoesNotThrow(() => provider.GetRequiredService()); Assert.Throws(() => provider.GetRequiredService()); Assert.Throws(() => provider.GetRequiredService()); @@ -88,10 +84,9 @@ public void DatabaseMigrationOnlyRequiredRegistered() provider.GetRequiredService(), Is.TypeOf()); - Assert.Throws(() => provider.GetRequiredService()); + Assert.Throws(() => provider.GetRequiredService()); Assert.Throws(() => provider.GetRequiredService()); - Assert.Throws(() => - provider.GetRequiredService()); + Assert.Throws(() => provider.GetRequiredService()); }); } @@ -119,7 +114,7 @@ public void DocumentStartupMigrationOnlyRequiredRegistered() provider.GetRequiredService(), Is.TypeOf()); - Assert.Throws(() => provider.GetRequiredService()); + Assert.Throws(() => provider.GetRequiredService()); Assert.Throws(() => provider.GetRequiredService()); }); } diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs index e969e71..3411567 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs @@ -1,7 +1,7 @@ -using FluentAssertions; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Services.Interceptors; using Mongo.Migration.Tests.TestDoubles; +using MongoDB.Bson.Serialization; using NUnit.Framework; namespace Mongo.Migration.Tests.Services.Interceptors; @@ -13,38 +13,38 @@ internal class MigrationInterceptorFactoryWhenCreating : IntegrationTest public void If_type_is_assignable_to_document_Then_interceptor_is_created() { // Arrange - var factory = TestcontainersContext.Provider.GetRequiredService(); + var serializerProvider = TestcontainersContext.Provider.GetRequiredService(); // Act - var interceptor = factory.Create(typeof(TestDocumentWithOneMigration)); + IBsonSerializer serializer = serializerProvider.GetSerializer(typeof(TestDocumentWithOneMigration)); // Assert - interceptor.ValueType.Should().Be(); + Assert.That(serializer, Is.TypeOf(typeof(MigrationInterceptor))); } [Test] - public void If_type_is_not_assignable_to_document_Then_exception_is_thrown() + public void If_type_is_not_assignable_to_document_Then_null_returned() { // Arrange - var factory = TestcontainersContext.Provider.GetRequiredService(); + var serializerProvider = TestcontainersContext.Provider.GetRequiredService(); // Act - Action act = () => factory.Create(typeof(TestClass)); + IBsonSerializer serializer = serializerProvider.GetSerializer(typeof(TestClass)); // Assert - act.Should().ThrowExactly(); + Assert.That(serializer, Is.Null); } [Test] - public void If_type_is_null_Then_exception_is_thrown() + public void If_type_is_null_Then_null_returned() { // Arrange - var factory = TestcontainersContext.Provider.GetRequiredService(); + var serializerProvider = TestcontainersContext.Provider.GetRequiredService(); // Act - Action act = () => factory.Create(null!); + IBsonSerializer serializer = serializerProvider.GetSerializer(null!); // Assert - act.Should().ThrowExactly(); + Assert.That(serializer, Is.Null); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs index 822c559..7c4a7ff 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs @@ -13,10 +13,10 @@ internal class MigrationInterceptorProviderWhenGetSerializer : IntegrationTest public void When_entity_is_document_Then_provide_serializer() { // Arrange - var provider = TestcontainersContext.Provider.GetRequiredService(); + var serializationProvider = TestcontainersContext.Provider.GetRequiredService(); // Act - var serializer = provider.GetSerializer(typeof(TestDocumentWithOneMigration)); + var serializer = serializationProvider.GetSerializer(typeof(TestDocumentWithOneMigration)); // Assert serializer.ValueType.Should().Be(typeof(TestDocumentWithOneMigration)); @@ -26,10 +26,10 @@ public void When_entity_is_document_Then_provide_serializer() public void When_entity_is_not_document_Then_provide_null() { // Arrange - var provider = TestcontainersContext.Provider.GetRequiredService(); + var serializationProvider = TestcontainersContext.Provider.GetRequiredService(); // Act - var serializer = provider.GetSerializer(typeof(TestClass)); + var serializer = serializationProvider.GetSerializer(typeof(TestClass)); // Assert serializer.Should().BeNull(); diff --git a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs deleted file mode 100644 index 124eaae..0000000 --- a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorFactory.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Mongo.Migration.Migrations.Document; -using MongoDB.Bson.Serialization; - -namespace Mongo.Migration.Services.Interceptors; - -public interface IMigrationInterceptorFactory -{ - IBsonSerializer Create(Type type); - - IDocumentVersionService DocumentVersionService { get; } - - IDocumentMigrationRunner MigrationRunner { get; } -} \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs deleted file mode 100644 index 4ef86ea..0000000 --- a/Mongo.Migration/Services/Interceptors/IMigrationInterceptorProvider.cs +++ /dev/null @@ -1,8 +0,0 @@ -using MongoDB.Bson.Serialization; - -namespace Mongo.Migration.Services.Interceptors; - -public interface IMigrationInterceptorProvider : IRegistryAwareBsonSerializationProvider -{ - IMigrationInterceptorFactory MigrationInterceptorFactory { get; } -} \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/MigrationBsonSerializerProvider.cs b/Mongo.Migration/Services/Interceptors/MigrationBsonSerializerProvider.cs new file mode 100644 index 0000000..a98aa8f --- /dev/null +++ b/Mongo.Migration/Services/Interceptors/MigrationBsonSerializerProvider.cs @@ -0,0 +1,43 @@ +using Mongo.Migration.Documents; +using Mongo.Migration.Migrations.Document; +using MongoDB.Bson.Serialization; + +namespace Mongo.Migration.Services.Interceptors; + +internal sealed class MigrationBsonSerializerProvider : IRegistryAwareBsonSerializationProvider +{ + private static readonly Type s_migrationInterceptorGenericType = typeof(MigrationInterceptor<>); + private static readonly Type s_iDocumentType = typeof(IDocument); + + private readonly IDocumentVersionService _documentVersionService; + + private readonly IDocumentMigrationRunner _migrationRunner; + + public MigrationBsonSerializerProvider(IDocumentMigrationRunner migrationRunner, + IDocumentVersionService documentVersionService) + { + _migrationRunner = migrationRunner; + _documentVersionService = documentVersionService; + } + + public IBsonSerializer GetSerializer(Type type) + { + return GetSerializer(type, BsonSerializer.SerializerRegistry); + } + + public IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry) + { + if (type is null || !ShouldBeMigrated(type)) + { + return null!; + } + + var genericType = s_migrationInterceptorGenericType.MakeGenericType(type); + return (IBsonSerializer) Activator.CreateInstance(genericType, _migrationRunner, _documentVersionService)!; + } + + private static bool ShouldBeMigrated(Type type) + { + return type.GetInterfaces().Contains(s_iDocumentType); + } +} \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs deleted file mode 100644 index a6e35ed..0000000 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorFactory.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Mongo.Migration.Migrations.Document; - -using MongoDB.Bson.Serialization; - -namespace Mongo.Migration.Services.Interceptors; - -internal class MigrationInterceptorFactory : IMigrationInterceptorFactory -{ - private readonly IDocumentVersionService _documentVersionService; - - private readonly IDocumentMigrationRunner _migrationRunner; - - public MigrationInterceptorFactory(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) - { - _migrationRunner = migrationRunner; - _documentVersionService = documentVersionService; - } - - public IBsonSerializer Create(Type type) - { - var genericType = typeof(MigrationInterceptor<>).MakeGenericType(type); - var interceptor = Activator.CreateInstance(genericType, _migrationRunner, _documentVersionService); - return interceptor as IBsonSerializer - ?? throw new InvalidOperationException($"Cannot create {genericType} interceptor"); - } - - public IDocumentVersionService DocumentVersionService => _documentVersionService; - - public IDocumentMigrationRunner MigrationRunner => _migrationRunner; -} \ No newline at end of file diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs b/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs deleted file mode 100644 index da38b03..0000000 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptorProvider.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Mongo.Migration.Documents; -using MongoDB.Bson; -using MongoDB.Bson.Serialization; - -namespace Mongo.Migration.Services.Interceptors; - -internal class MigrationInterceptorProvider : IMigrationInterceptorProvider -{ - private static readonly Type s_iDocumentType = typeof(IDocument); - private static readonly Type s_bsonDocumentType = typeof(BsonDocument); - private readonly IMigrationInterceptorFactory _migrationInterceptorFactory; - - public MigrationInterceptorProvider(IMigrationInterceptorFactory migrationInterceptorFactory) - { - _migrationInterceptorFactory = migrationInterceptorFactory; - } - - public IBsonSerializer GetSerializer(Type type) - { - return GetSerializer(type, BsonSerializer.SerializerRegistry); - } - - public IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry) - { - if (ShouldBeMigrated(type)) - { - return _migrationInterceptorFactory.Create(type); - } - - // Go to next provider - // see https://github.com/mongodb/mongo-csharp-driver/blob/main/src/MongoDB.Bson/Serialization/BsonSerializerRegistry.cs#L155 - return null!; - } - - private static bool ShouldBeMigrated(Type type) - { - return type != s_bsonDocumentType - && type.GetInterfaces().Contains(s_iDocumentType); - } - - public IMigrationInterceptorFactory MigrationInterceptorFactory => _migrationInterceptorFactory; -} \ No newline at end of file diff --git a/Mongo.Migration/Services/MigrationService.cs b/Mongo.Migration/Services/MigrationService.cs index 1dc46c2..f23317f 100644 --- a/Mongo.Migration/Services/MigrationService.cs +++ b/Mongo.Migration/Services/MigrationService.cs @@ -37,8 +37,8 @@ public void RegisterBsonStatics() if (_startupSettings.RuntimeMigrationEnabled) { - IMigrationInterceptorProvider migrationInterceptorProvider = _provider.GetRequiredService(); - BsonSerializer.RegisterSerializationProvider(migrationInterceptorProvider); + MigrationBsonSerializerProvider migrationSerializerProvider = _provider.GetRequiredService(); + BsonSerializer.RegisterSerializationProvider(migrationSerializerProvider); } } diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs b/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs index 52e05b6..26dae2d 100644 --- a/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs +++ b/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs @@ -37,6 +37,10 @@ public string VersionFieldName public MongoMigrationBuilder AddRuntimeDocumentMigration() { AddInterceptorServices(); + + _services + .AddSingleton(); + _mongoMigrationStartupSettings.RuntimeMigrationEnabled = true; return this; } @@ -88,9 +92,7 @@ private void AddInterceptorServices() .AddSingleton() .AddSingleton() .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton(); + .AddSingleton(); _interceptorAdded = true; } From 713a1f6a1556020a0710cc20d039f3e1f928e2f9 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Mon, 6 Jan 2025 09:17:26 +0100 Subject: [PATCH 15/42] Optimize runtime migration when no migration --- .../DotNetCore/MigrationBuilderTests.cs | 2 +- .../MongoDB/MongoRegistryTests.cs | 4 +-- ...grationInterceptorFactory_when_creating.cs | 4 +-- ...InterceptorProvider_when_get_serializer.cs | 2 +- .../MigrationBsonSerializerProvider.cs | 9 +++--- .../MigrationSerializer.cs} | 31 ++++++++++++++----- Mongo.Migration/Services/MigrationService.cs | 2 +- .../DotNetCore/MongoMigrationBuilder.cs | 2 +- 8 files changed, 37 insertions(+), 19 deletions(-) rename Mongo.Migration/{Services/Interceptors => Bson}/MigrationBsonSerializerProvider.cs (76%) rename Mongo.Migration/{Services/Interceptors/MigrationInterceptor.cs => Bson/MigrationSerializer.cs} (57%) diff --git a/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs b/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs index 30e4a4a..8469ac6 100644 --- a/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs +++ b/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs @@ -1,11 +1,11 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using Mongo.Migration.Bson; using Mongo.Migration.Documents.Locators; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Document; using Mongo.Migration.Services; -using Mongo.Migration.Services.Interceptors; using Mongo.Migration.Startup.DotNetCore; using MongoDB.Driver; using NUnit.Framework; diff --git a/Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs b/Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs index b3b8e30..1e7cf69 100644 --- a/Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs +++ b/Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs @@ -1,8 +1,8 @@ using Microsoft.Extensions.DependencyInjection; +using Mongo.Migration.Bson; using Mongo.Migration.Documents; using Mongo.Migration.Documents.Serializers; using Mongo.Migration.Services; -using Mongo.Migration.Services.Interceptors; using Mongo.Migration.Tests.TestDoubles; using MongoDB.Bson; using MongoDB.Bson.Serialization; @@ -29,7 +29,7 @@ public void MongoSerializerProviderIsRegistered() { Assert.That( BsonSerializer.SerializerRegistry.GetSerializer(), - Is.TypeOf>()); + Is.TypeOf>()); } [Test] diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs index 3411567..def828a 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs @@ -1,5 +1,5 @@ using Microsoft.Extensions.DependencyInjection; -using Mongo.Migration.Services.Interceptors; +using Mongo.Migration.Bson; using Mongo.Migration.Tests.TestDoubles; using MongoDB.Bson.Serialization; using NUnit.Framework; @@ -19,7 +19,7 @@ public void If_type_is_assignable_to_document_Then_interceptor_is_created() IBsonSerializer serializer = serializerProvider.GetSerializer(typeof(TestDocumentWithOneMigration)); // Assert - Assert.That(serializer, Is.TypeOf(typeof(MigrationInterceptor))); + Assert.That(serializer, Is.TypeOf(typeof(MigrationSerializer))); } [Test] diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs index 7c4a7ff..a67d9ee 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs @@ -1,6 +1,6 @@ using FluentAssertions; using Microsoft.Extensions.DependencyInjection; -using Mongo.Migration.Services.Interceptors; +using Mongo.Migration.Bson; using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; diff --git a/Mongo.Migration/Services/Interceptors/MigrationBsonSerializerProvider.cs b/Mongo.Migration/Bson/MigrationBsonSerializerProvider.cs similarity index 76% rename from Mongo.Migration/Services/Interceptors/MigrationBsonSerializerProvider.cs rename to Mongo.Migration/Bson/MigrationBsonSerializerProvider.cs index a98aa8f..c99a665 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationBsonSerializerProvider.cs +++ b/Mongo.Migration/Bson/MigrationBsonSerializerProvider.cs @@ -1,12 +1,13 @@ using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Document; +using Mongo.Migration.Services; using MongoDB.Bson.Serialization; -namespace Mongo.Migration.Services.Interceptors; +namespace Mongo.Migration.Bson; internal sealed class MigrationBsonSerializerProvider : IRegistryAwareBsonSerializationProvider { - private static readonly Type s_migrationInterceptorGenericType = typeof(MigrationInterceptor<>); + private static readonly Type s_migrationSerializerGenericType = typeof(MigrationSerializer<>); private static readonly Type s_iDocumentType = typeof(IDocument); private readonly IDocumentVersionService _documentVersionService; @@ -32,8 +33,8 @@ public IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry serializ return null!; } - var genericType = s_migrationInterceptorGenericType.MakeGenericType(type); - return (IBsonSerializer) Activator.CreateInstance(genericType, _migrationRunner, _documentVersionService)!; + var genericType = s_migrationSerializerGenericType.MakeGenericType(type); + return (IBsonSerializer)Activator.CreateInstance(genericType, _migrationRunner, _documentVersionService)!; } private static bool ShouldBeMigrated(Type type) diff --git a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs b/Mongo.Migration/Bson/MigrationSerializer.cs similarity index 57% rename from Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs rename to Mongo.Migration/Bson/MigrationSerializer.cs index b0580dc..9a8a7a2 100644 --- a/Mongo.Migration/Services/Interceptors/MigrationInterceptor.cs +++ b/Mongo.Migration/Bson/MigrationSerializer.cs @@ -1,33 +1,50 @@ using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Document; -using MongoDB.Bson; using MongoDB.Bson.IO; +using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Serializers; +using Mongo.Migration.Services; -namespace Mongo.Migration.Services.Interceptors; - -internal sealed class MigrationInterceptor : SerializerBase +namespace Mongo.Migration.Bson; +internal sealed class MigrationSerializer : SerializerBase where TDocument : IDocument { private static readonly Type s_tDocumentType = typeof(TDocument); private readonly IDocumentMigrationRunner _migrationRunner; + private readonly IDocumentVersionService _documentVersionService; + private readonly DocumentVersion _runtimeVersion; + private readonly string _runtimeVersionString; + private readonly BsonClassMapSerializer _innerSerializer; - public MigrationInterceptor(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) + public MigrationSerializer(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) { _migrationRunner = migrationRunner; - _runtimeVersion = documentVersionService.GetCurrentOrLatestMigrationVersion(s_tDocumentType); + _documentVersionService = documentVersionService; + _runtimeVersion = _documentVersionService.GetCurrentOrLatestMigrationVersion(s_tDocumentType); + _runtimeVersionString = _runtimeVersion.ToString(); BsonClassMap classMap = BsonClassMap.LookupClassMap(s_tDocumentType); _innerSerializer = new BsonClassMapSerializer(classMap); } public override TDocument Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { + BsonReaderBookmark bookmark = context.Reader.GetBookmark(); + + context.Reader.ReadStartDocument(); + string currentVersion = context.Reader.FindStringElement(_documentVersionService.GetVersionFieldName()); + context.Reader.ReturnToBookmark(bookmark); + + if (_runtimeVersionString == currentVersion) + { + return _innerSerializer.Deserialize(context, args); + } + BsonDocument document = BsonDocumentSerializer.Instance.Deserialize(context); _migrationRunner.Run(s_tDocumentType, document, _runtimeVersion); var migratedContext = BsonDeserializationContext.CreateRoot(new BsonDocumentReader(document)); @@ -39,4 +56,4 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati value.Version = _runtimeVersion; _innerSerializer.Serialize(context, args, value); } -} \ No newline at end of file +} diff --git a/Mongo.Migration/Services/MigrationService.cs b/Mongo.Migration/Services/MigrationService.cs index f23317f..92717ee 100644 --- a/Mongo.Migration/Services/MigrationService.cs +++ b/Mongo.Migration/Services/MigrationService.cs @@ -1,11 +1,11 @@ using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Mongo.Migration.Bson; using Mongo.Migration.Documents; using Mongo.Migration.Documents.Serializers; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Document; -using Mongo.Migration.Services.Interceptors; using Mongo.Migration.Startup.DotNetCore; using MongoDB.Bson.Serialization; using MongoDB.Driver; diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs b/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs index 26dae2d..a99d3fb 100644 --- a/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs +++ b/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.DependencyInjection; +using Mongo.Migration.Bson; using Mongo.Migration.Documents.Locators; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Document; using Mongo.Migration.Migrations.Locators; using Mongo.Migration.Services; -using Mongo.Migration.Services.Interceptors; namespace Mongo.Migration.Startup.DotNetCore; From 9511a12ffff22946719541070187d85342e666d7 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Mon, 6 Jan 2025 09:50:03 +0100 Subject: [PATCH 16/42] Various cleanup and suggestions --- ...grationInterceptorFactory_when_creating.cs | 13 ------ .../Bson/MigrationBsonSerializerProvider.cs | 11 ++--- .../Attributes/CollectionLocation.cs | 2 +- Mongo.Migration/Documents/DocumentVersion.cs | 6 +-- .../Documents/Locators/ILocator.cs | 2 +- .../Locators/RuntimeVersionLocator.cs | 2 +- .../Locators/StartUpVersionLocator.cs | 2 +- .../Extensions/EnumerableExtensions.cs | 2 +- Mongo.Migration/IMongoMigration.cs | 6 --- .../TypeMigrationDependencyLocator.cs | 2 +- Mongo.Migration/MongoMigration.cs | 44 ------------------- .../Services/DocumentVersionService.cs | 13 ------ .../Services/IDocumentVersionService.cs | 5 --- 13 files changed, 13 insertions(+), 97 deletions(-) delete mode 100644 Mongo.Migration/IMongoMigration.cs delete mode 100644 Mongo.Migration/MongoMigration.cs diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs index def828a..79c4ec6 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs @@ -34,17 +34,4 @@ public void If_type_is_not_assignable_to_document_Then_null_returned() // Assert Assert.That(serializer, Is.Null); } - - [Test] - public void If_type_is_null_Then_null_returned() - { - // Arrange - var serializerProvider = TestcontainersContext.Provider.GetRequiredService(); - - // Act - IBsonSerializer serializer = serializerProvider.GetSerializer(null!); - - // Assert - Assert.That(serializer, Is.Null); - } } \ No newline at end of file diff --git a/Mongo.Migration/Bson/MigrationBsonSerializerProvider.cs b/Mongo.Migration/Bson/MigrationBsonSerializerProvider.cs index c99a665..25957fd 100644 --- a/Mongo.Migration/Bson/MigrationBsonSerializerProvider.cs +++ b/Mongo.Migration/Bson/MigrationBsonSerializerProvider.cs @@ -10,15 +10,12 @@ internal sealed class MigrationBsonSerializerProvider : IRegistryAwareBsonSerial private static readonly Type s_migrationSerializerGenericType = typeof(MigrationSerializer<>); private static readonly Type s_iDocumentType = typeof(IDocument); - private readonly IDocumentVersionService _documentVersionService; - - private readonly IDocumentMigrationRunner _migrationRunner; + private readonly object[] _constructorParameters; public MigrationBsonSerializerProvider(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) { - _migrationRunner = migrationRunner; - _documentVersionService = documentVersionService; + _constructorParameters = new object[] { migrationRunner, documentVersionService }; } public IBsonSerializer GetSerializer(Type type) @@ -28,13 +25,13 @@ public IBsonSerializer GetSerializer(Type type) public IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry) { - if (type is null || !ShouldBeMigrated(type)) + if (!ShouldBeMigrated(type)) { return null!; } var genericType = s_migrationSerializerGenericType.MakeGenericType(type); - return (IBsonSerializer)Activator.CreateInstance(genericType, _migrationRunner, _documentVersionService)!; + return (IBsonSerializer)Activator.CreateInstance(genericType, _constructorParameters)!; } private static bool ShouldBeMigrated(Type type) diff --git a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs b/Mongo.Migration/Documents/Attributes/CollectionLocation.cs index 20cbaf2..055d59e 100644 --- a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs +++ b/Mongo.Migration/Documents/Attributes/CollectionLocation.cs @@ -7,6 +7,6 @@ public class CollectionLocation : Attribute public CollectionLocation(string collectionName) { - CollectionInformation = new(collectionName); + CollectionInformation = new CollectionLocationInformation(collectionName); } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/DocumentVersion.cs b/Mongo.Migration/Documents/DocumentVersion.cs index 1a9d7f2..b1e6a16 100644 --- a/Mongo.Migration/Documents/DocumentVersion.cs +++ b/Mongo.Migration/Documents/DocumentVersion.cs @@ -4,11 +4,11 @@ { private const char VersionSplitChar = '.'; - public int Major { get; init; } + public int Major { get; } - public int Minor { get; init; } + public int Minor { get; } - public int Revision { get; init; } + public int Revision { get; } public DocumentVersion(int major, int minor, int revision) { diff --git a/Mongo.Migration/Documents/Locators/ILocator.cs b/Mongo.Migration/Documents/Locators/ILocator.cs index 6e21ebe..afc587c 100644 --- a/Mongo.Migration/Documents/Locators/ILocator.cs +++ b/Mongo.Migration/Documents/Locators/ILocator.cs @@ -1,6 +1,6 @@ namespace Mongo.Migration.Documents.Locators; -public interface ILocator +public interface ILocator where TReturnType : struct where TTypeIdentifier : class { diff --git a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs index b33e6fd..d4cdb0a 100644 --- a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs @@ -21,7 +21,7 @@ public override void Locate() from a in AppDomain.CurrentDomain.GetAssemblies() from t in a.GetTypes() let attributes = t.GetCustomAttributes(typeof(RuntimeVersion), true) - where attributes != null && attributes.Length > 0 + where attributes is {Length: > 0} select new { Type = t, Attributes = attributes.Cast() }; var versions = new Dictionary(); diff --git a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs index 156964b..5d3623f 100644 --- a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs @@ -21,7 +21,7 @@ public override void Locate() from a in AppDomain.CurrentDomain.GetAssemblies() from t in a.GetTypes() let attributes = t.GetCustomAttributes(typeof(StartUpVersion), true) - where attributes != null && attributes.Length > 0 + where attributes is {Length: > 0} select new { Type = t, Attributes = attributes.Cast() }; var versions = new Dictionary(); diff --git a/Mongo.Migration/Extensions/EnumerableExtensions.cs b/Mongo.Migration/Extensions/EnumerableExtensions.cs index 105778a..e331d8d 100644 --- a/Mongo.Migration/Extensions/EnumerableExtensions.cs +++ b/Mongo.Migration/Extensions/EnumerableExtensions.cs @@ -6,7 +6,7 @@ namespace Mongo.Migration.Extensions; internal static class EnumerableExtensions { - internal static IEnumerable CheckForDuplicates(this IEnumerable list) + private static IEnumerable CheckForDuplicates(this IEnumerable list) where TMigrationType : IMigration { var uniqueHashes = new HashSet(); diff --git a/Mongo.Migration/IMongoMigration.cs b/Mongo.Migration/IMongoMigration.cs deleted file mode 100644 index fba82ac..0000000 --- a/Mongo.Migration/IMongoMigration.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Mongo.Migration; - -public interface IMongoMigrationBak -{ - void Run(); -} \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs index a0c2a60..c628fcc 100644 --- a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs @@ -33,7 +33,7 @@ private TMigrationType GetMigrationInstance(Type type) if (constructors.Length > 0) { - object[] args = constructors + var args = constructors .First() .GetParameters() .Select(parameterInfo => _serviceProvider.GetRequiredService(parameterInfo.ParameterType)) diff --git a/Mongo.Migration/MongoMigration.cs b/Mongo.Migration/MongoMigration.cs deleted file mode 100644 index da694cd..0000000 --- a/Mongo.Migration/MongoMigration.cs +++ /dev/null @@ -1,44 +0,0 @@ -namespace Mongo.Migration; -/* -internal class MongoMigration : IMongoMigration -{ - private readonly ICollectionLocator _collectionLocator; - - private readonly IDatabaseTypeMigrationDependencyLocator _databaseMigrationLocator; - - private readonly IMigrationLocator _documentMigrationLocator; - - private readonly IMigrationService _migrationService; - - private readonly IRuntimeVersionLocator _runtimeVersionLocator; - - private readonly IStartUpVersionLocator _startUpVersionLocator; - - public MongoMigration( - IMigrationLocator documentMigrationLocator, - IDatabaseTypeMigrationDependencyLocator databaseMigrationLocator, - IRuntimeVersionLocator runtimeVersionLocator, - ICollectionLocator collectionLocator, - IStartUpVersionLocator startUpVersionLocator, - IMigrationService migrationService) - { - _documentMigrationLocator = documentMigrationLocator; - _databaseMigrationLocator = databaseMigrationLocator; - _runtimeVersionLocator = runtimeVersionLocator; - _collectionLocator = collectionLocator; - _startUpVersionLocator = startUpVersionLocator; - _migrationService = migrationService; - } - - public void Run() - { - _documentMigrationLocator.Locate(); - _databaseMigrationLocator.Locate(); - _runtimeVersionLocator.Locate(); - _collectionLocator.Locate(); - _startUpVersionLocator.Locate(); - - _migrationService.Migrate(); - } -} -*/ \ No newline at end of file diff --git a/Mongo.Migration/Services/DocumentVersionService.cs b/Mongo.Migration/Services/DocumentVersionService.cs index 0138dc2..40b423a 100644 --- a/Mongo.Migration/Services/DocumentVersionService.cs +++ b/Mongo.Migration/Services/DocumentVersionService.cs @@ -94,19 +94,6 @@ public void DetermineVersion(TClass instance) throw new VersionViolationException(currentVersion, documentVersion, latestVersion); } - public DocumentVersion DetermineLastVersion( - in DocumentVersion version, - List migrations, - int currentMigration) - { - if (migrations.Last() != migrations[currentMigration]) - { - return migrations[currentMigration + 1].Version; - } - - return version; - } - private DocumentVersion? GetCurrentVersion(Type type) { return _runtimeVersionLocator.GetLocateOrNull(type); diff --git a/Mongo.Migration/Services/IDocumentVersionService.cs b/Mongo.Migration/Services/IDocumentVersionService.cs index a73b7d3..5243af3 100644 --- a/Mongo.Migration/Services/IDocumentVersionService.cs +++ b/Mongo.Migration/Services/IDocumentVersionService.cs @@ -18,9 +18,4 @@ public interface IDocumentVersionService void DetermineVersion(TClass instance) where TClass : IDocument; - - DocumentVersion DetermineLastVersion( - in DocumentVersion version, - List migrations, - int currentMigration); } \ No newline at end of file From e08aeec401bd4e78ef9454536ee4905335515022 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Tue, 21 Jan 2025 15:21:49 +0100 Subject: [PATCH 17/42] dep hygiene and remove fluentassertion --- .../Documents/DocumentVersion_When_casting.cs | 9 ++--- .../Documents/DocumentVersion_When_compare.cs | 15 ++++---- .../DocumentVersion_When_creating.cs | 36 ++++++------------- .../Documents/Document_when_creating.cs | 7 ++-- .../AttributeMigrationLocator_when_locate.cs | 7 ++-- ...rializer_when_serialize_and_deserialize.cs | 11 +++--- ...baseMigrationRunner_when_migrating_down.cs | 11 +++--- ...tabaseMigrationRunner_when_migrating_up.cs | 25 ++++++------- .../DatabaseMigration_when_creating.cs | 9 +++-- ...mentMigrationRunner_when_migrating_down.cs | 11 +++--- ...cumentMigrationRunner_when_migrating_up.cs | 16 ++++----- .../DocumentMigration_when_creating.cs | 9 +++-- .../DocumentMigration_when_migrating.cs | 7 ++-- .../TypeMigrationLocator_when_locate.cs | 17 +++++---- .../Mongo.Migration.Tests.csproj | 10 ++++-- .../Performance/PerformanceOnStartup.cs | 3 +- ...ntVersionService_when_determine_version.cs | 12 +++---- ...InterceptorProvider_when_get_serializer.cs | 7 ++-- .../MigrationBuilderTests.cs | 4 +-- .../TestcontainersContext.cs | 2 +- Mongo.Migration/Mongo.Migration.csproj | 5 +-- Mongo.Migration/Services/MigrationService.cs | 2 +- .../{DotNetCore => }/MongoMigrationBuilder.cs | 12 +++---- .../MongoMigrationExtensions.cs | 6 ++-- .../MongoMigrationStartupSettings.cs | 2 +- 25 files changed, 111 insertions(+), 144 deletions(-) rename Mongo.Migration.Tests/{DotNetCore => Startup}/MigrationBuilderTests.cs (98%) rename Mongo.Migration/Startup/{DotNetCore => }/MongoMigrationBuilder.cs (89%) rename Mongo.Migration/Startup/{DotNetCore => }/MongoMigrationExtensions.cs (65%) rename Mongo.Migration/Startup/{DotNetCore => }/MongoMigrationStartupSettings.cs (81%) diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs index 0cd5bcf..9f6c401 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; using NUnit.Framework; namespace Mongo.Migration.Tests.Documents; @@ -11,8 +10,7 @@ public class DocumentVersionWhenCasting public void If_implicit_string_to_version_Then_cast_should_work() { DocumentVersion version = new DocumentVersion(1,0,2); - - version.ToString().Should().Be("1.0.2"); + Assert.That(version == "1.0.2", Is.True); } [Test] @@ -21,7 +19,6 @@ public void If_implicit_version_to_string_Then_cast_should_work() var version = new DocumentVersion(1,0,2); string versionString = version.ToString(); - - versionString.Should().Be("1.0.2"); + Assert.That(versionString, Is.EqualTo("1.0.2")); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs index a81e33c..ae98c3c 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_compare.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; using NUnit.Framework; namespace Mongo.Migration.Tests.Documents; @@ -18,7 +17,7 @@ public void If_higherVersion_lte_equalLowerVersion_Then_false() { bool result = _higherVersion <= _lowerVersion; - result.Should().BeFalse(); + Assert.That(result, Is.False); } [Test] @@ -26,7 +25,7 @@ public void If_lowerVersion_gt_higherVersion_Then_false() { bool result = _lowerVersion > _higherVersion; - result.Should().BeFalse(); + Assert.That(result, Is.False); } [Test] @@ -34,7 +33,7 @@ public void If_lowerVersion_gte_equalLowerVersion_Then_true() { bool result = _lowerVersion >= _equalLowerVersion; - result.Should().BeTrue(); + Assert.That(result, Is.True); } [Test] @@ -42,7 +41,7 @@ public void If_lowerVersion_gte_higherVersion_Then_false() { bool result = _lowerVersion >= _higherVersion; - result.Should().BeFalse(); + Assert.That(result, Is.False); } [Test] @@ -50,7 +49,7 @@ public void If_lowerVersion_lt_higherVersion_Then_true() { bool result = _lowerVersion < _higherVersion; - result.Should().BeTrue(); + Assert.That(result, Is.True); } [Test] @@ -58,6 +57,6 @@ public void If_lowerVersion_lte_equalLowerVersion_Then_true() { bool result = _lowerVersion <= _equalLowerVersion; - result.Should().BeTrue(); + Assert.That(result, Is.True); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs index 7ccab8b..b347bdc 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_creating.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; using NUnit.Framework; namespace Mongo.Migration.Tests.Documents; @@ -11,8 +10,7 @@ public class DocumentVersionWhenCreating public void If_Empty_Then_version_is_empty_value() { DocumentVersion version = DocumentVersion.Empty; - - version.ToString().Should().Be("-1.0.0"); + Assert.That(version.ToString(), Is.EqualTo("-1.0.0")); } [Test] @@ -20,70 +18,58 @@ public void If_Default_Then_version_is_default_value() { DocumentVersion version = DocumentVersion.Default; - version.ToString().Should().Be("0.0.0"); + Assert.That(version.ToString(), Is.EqualTo("0.0.0")); } [Test] public void If_first_part_contains_char_Then_exception_is_thrown() { - Action act = () => DocumentVersion.Parse("a.0.0"); - - act.Should().Throw(); + Assert.Throws(() => DocumentVersion.Parse("a.0.0")); } [Test] public void If_new_version_with_int_Then_version_string_should_be_same() { var version = new DocumentVersion(1, 0, 2); - - version.ToString().Should().Be("1.0.2"); + Assert.That(version.ToString(), Is.EqualTo("1.0.2")); } [Test] public void If_new_version_with_string_Then_version_string_should_be_same() { var version = DocumentVersion.Parse("1.0.2"); - - version.ToString().Should().Be("1.0.2"); + Assert.That(version.ToString(), Is.EqualTo("1.0.2")); } [Test] public void If_second_part_contains_char_Then_exception_is_thrown() { - Action act = () => DocumentVersion.Parse("0.a.0"); - - act.Should().Throw(); + Assert.Throws(() => DocumentVersion.Parse("0.a.0")); } [Test] public void If_third_part_contains_char_Then_exception_is_thrown() { - Action act = () => DocumentVersion.Parse("0.0.a"); - - act.Should().Throw(); + Assert.Throws(() => DocumentVersion.Parse("0.0.a")); } [Test] public void If_version_string_is_too_long_Then_exception_is_thrown() { - Action act = () => DocumentVersion.Parse("0.0.0.0"); - - act.Should().Throw(); + Assert.Throws(() => DocumentVersion.Parse("0.0.0.0")); } [Test] public void If_version_string_is_too_short1_then_default() { var version = DocumentVersion.Parse("33"); - - version.ToString().Should().Be("33.0.0"); + Assert.That(version.ToString(), Is.EqualTo("33.0.0")); } [Test] public void If_version_string_is_too_short2_then_default() { var version = DocumentVersion.Parse("42.27"); - - version.ToString().Should().Be("42.27.0"); + Assert.That(version.ToString(), Is.EqualTo("42.27.0")); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/Document_when_creating.cs b/Mongo.Migration.Tests/Documents/Document_when_creating.cs index dc9d89c..a294c88 100644 --- a/Mongo.Migration.Tests/Documents/Document_when_creating.cs +++ b/Mongo.Migration.Tests/Documents/Document_when_creating.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; using NUnit.Framework; namespace Mongo.Migration.Tests.Documents; @@ -14,7 +13,7 @@ public void Then_document_can_be_created() IDocument document = new Document(); // Assert - document.Should().BeOfType(); + Assert.That(document, Is.TypeOf()); } [Test] @@ -27,6 +26,6 @@ public void Then_document_has_a_version() var version = document.Version; // Assert - version.ToString().Should().Be("0.0.0"); + Assert.That(version.ToString(), Is.EqualTo("0.0.0")); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs index 9e9a5c4..8a09c20 100644 --- a/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Mongo.Migration.Documents.Locators; +using Mongo.Migration.Documents.Locators; using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; @@ -18,7 +17,7 @@ public void Then_find_current_version_of_document() var currentVersion = locator.GetLocateOrNull(typeof(TestDocumentWithOneMigration)); // Assert - currentVersion.ToString().Should().Be("0.0.1"); + Assert.That(currentVersion.ToString(), Is.EqualTo("0.0.1")); } [Test] @@ -31,6 +30,6 @@ public void When_document_has_no_attribute_Then_return_null() var currentVersion = locator.GetLocateOrNull(typeof(TestDocumentWithoutAttribute)); // Assert - currentVersion.Should().BeNull(); + Assert.That(currentVersion, Is.Null); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs index 8d7630b..3f99e5e 100644 --- a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs +++ b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Mongo.Migration.Documents; +using Mongo.Migration.Documents; using Mongo.Migration.Documents.Serializers; using MongoDB.Bson; using MongoDB.Bson.IO; @@ -26,9 +25,9 @@ public void Then_version_is_deserialized_correct() // Act DocumentVersion result = _serializer.Deserialize(context, args); - // Assert - result.Should().BeOfType(); - result.ToString().Should().Be("0.1.1"); + // Assert + Assert.That(result, Is.TypeOf()); + Assert.That(result.ToString(), Is.EqualTo("0.1.1")); } [Test] @@ -45,7 +44,7 @@ public void Then_version_is_serialized_correct() // Assert BsonDocument document = writer.Document; - document.ToString().Should().Be("{ \"version\" : \"0.0.1\" }"); + Assert.That(document.ToString(), Is.EqualTo("{ \"version\" : \"0.0.1\" }")); } [SetUp] diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs index 2851f47..e2c4066 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Tests.TestDoubles.Database; @@ -30,7 +29,7 @@ public async Task When_database_has_migrations_Then_down_all_migrations() // Assert var migrations = GetMigrationHistory(); - migrations.Should().BeEmpty(); + Assert.That(migrations, Is.Empty); } [Test] @@ -52,8 +51,8 @@ public async Task When_database_has_migrations_Then_down_to_selected_migration() runner.Run(Db, new DocumentVersion(0, 0, 1)); // Assert - var migrations = GetMigrationHistory(); - migrations.Should().NotBeEmpty(); - migrations.Should().OnlyContain(m => m.Version == new DocumentVersion(0, 0, 1)); + List migrations = GetMigrationHistory(); + Assert.That(migrations, Is.Not.Empty); + Assert.That(migrations, Has.One.Matches(m => m.Version == new DocumentVersion(0, 0, 1))); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs index 9ab57a9..2b347e6 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Tests.TestDoubles.Database; @@ -22,10 +21,10 @@ public async Task When_database_has_no_migrations_Then_all_migrations_are_used() // Assert var migrations = GetMigrationHistory(); - migrations.Should().NotBeEmpty(); - migrations[0].Version.ToString().Should().BeEquivalentTo("0.0.1"); - migrations[1].Version.ToString().Should().BeEquivalentTo("0.0.2"); - migrations[2].Version.ToString().Should().BeEquivalentTo("0.0.3"); + Assert.That(migrations, Is.Not.Empty); + Assert.That(migrations[0].Version.ToString(), Is.EqualTo("0.0.1")); + Assert.That(migrations[1].Version.ToString(), Is.EqualTo("0.0.2")); + Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); } [Test] @@ -41,8 +40,8 @@ public async Task When_database_has_migrations_Then_latest_migrations_are_used() // Assert var migrations = GetMigrationHistory(); - migrations.Should().NotBeEmpty(); - migrations[2].Version.ToString().Should().BeEquivalentTo("0.0.3"); + Assert.That(migrations, Is.Not.Empty); + Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); } [Test] @@ -58,9 +57,11 @@ public async Task When_database_has_latest_version_Then_nothing_happens() // Assert var migrations = GetMigrationHistory(); - migrations.Should().NotBeEmpty(); - migrations[0].Version.ToString().Should().BeEquivalentTo("0.0.1"); - migrations[1].Version.ToString().Should().BeEquivalentTo("0.0.2"); - migrations[2].Version.ToString().Should().BeEquivalentTo("0.0.3"); + + + Assert.That(migrations, Is.Not.Empty); + Assert.That(migrations[0].Version.ToString(), Is.EqualTo("0.0.1")); + Assert.That(migrations[1].Version.ToString(), Is.EqualTo("0.0.2")); + Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs index ae5d409..25e9402 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigration_when_creating.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Mongo.Migration.Migrations.Database; +using Mongo.Migration.Migrations.Database; using Mongo.Migration.Tests.TestDoubles.Database; using NUnit.Framework; @@ -15,7 +14,7 @@ public void Then_migration_has_type_DatabaseMigration() var migration = new TestDatabaseMigration001(); // Assert - migration.Type.Should().Be(typeof(DatabaseMigration)); + Assert.That(migration.Type, Is.EqualTo(typeof(DatabaseMigration))); } [Test] @@ -25,7 +24,7 @@ public void Then_migration_have_version() var migration = new TestDatabaseMigration001(); // Assert - migration.Version.ToString().Should().Be("0.0.1"); + Assert.That(migration.Version.ToString(), Is.EqualTo("0.0.1")); } [Test] @@ -35,6 +34,6 @@ public void Then_migration_should_be_created() var migration = new TestDatabaseMigration001(); // Assert - migration.Should().BeOfType(); + Assert.That(migration, Is.TypeOf()); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs index 39d80ff..5022270 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Migrations.Document; using Mongo.Migration.Tests.TestDoubles; using MongoDB.Bson; @@ -25,8 +24,8 @@ public void When_migrating_down_Then_all_migrations_are_used() runner.Run(typeof(TestDocumentWithTwoMigration), document); // Assert - document.Names.ToList()[1].Should().Be("Dors"); - document.Values.ToList()[0].AsString.Should().Be("0.0.0"); + Assert.That(document.Names.ToList()[1], Is.EqualTo("Dors")); + Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.0")); } [Test] @@ -44,7 +43,7 @@ public void When_document_has_Then_all_migrations_are_used_to_that_version() runner.Run(typeof(TestDocumentWithTwoMigrationMiddleVersion), document); // Assert - document.Names.ToList()[1].Should().Be("Doors1"); - document.Values.ToList()[0].AsString.Should().Be("0.0.1"); + Assert.That(document.Names.ToList()[1], Is.EqualTo("Doors1")); + Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.1")); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs index 29f0650..e2eed0f 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Migrations.Document; using Mongo.Migration.Tests.TestDoubles; using MongoDB.Bson; @@ -25,8 +24,8 @@ public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert - document.Names.ToList()[1].Should().Be("Door"); - document.Values.ToList()[0].AsString.Should().Be("0.0.2"); + Assert.That(document.Names.ToList()[1], Is.EqualTo("Door")); + Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.2")); } [Test] @@ -43,8 +42,8 @@ public void When_document_has_no_version_Then_all_migrations_are_used() runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert - document["Door"].AsInt32.Should().Be(3); - document["Version"].AsString.Should().Be("0.0.2"); + Assert.That(document["Door"].AsInt32, Is.EqualTo(3)); + Assert.That(document["Version"].AsString, Is.EqualTo("0.0.2")); } [Test] @@ -62,7 +61,8 @@ public void When_document_has_current_version_Then_nothing_happens() runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert - document.Names.ToList()[1].Should().Be("Door"); - document.Values.ToList()[0].AsString.Should().Be("0.0.2"); + + Assert.That(document.Names.ToList()[1], Is.EqualTo("Door")); + Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.2")); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs index 732d694..9acc13c 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Mongo.Migration.Tests.TestDoubles; +using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; namespace Mongo.Migration.Tests.Migrations.Document; @@ -14,7 +13,7 @@ public void Then_migration_has_type_testClass() var migration = new TestDocumentWithOneMigration001(); // Assert - migration.Type.Should().Be(typeof(TestDocumentWithOneMigration)); + Assert.That(migration.Type, Is.EqualTo(typeof(TestDocumentWithOneMigration))); } [Test] @@ -24,7 +23,7 @@ public void Then_migration_have_version() var migration = new TestDocumentWithOneMigration001(); // Assert - migration.Version.ToString().Should().Be("0.0.1"); + Assert.That(migration.Version.ToString(), Is.EqualTo("0.0.1")); } [Test] @@ -34,6 +33,6 @@ public void Then_migration_should_be_created() var migration = new TestDocumentWithOneMigration001(); // Assert - migration.Should().BeOfType(); + Assert.That(migration, Is.TypeOf(typeof(TestDocumentWithOneMigration001))); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs index d836117..915cc9f 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Mongo.Migration.Tests.TestDoubles; +using Mongo.Migration.Tests.TestDoubles; using MongoDB.Bson; using NUnit.Framework; @@ -19,7 +18,7 @@ public void When_migrating_down_Then_document_changes() migration.Down(document); // Assert - document.Should().BeEquivalentTo(new BsonDocument { { "Dors", 3 } }); + Assert.That(document, Is.EquivalentTo(new BsonDocument { { "Dors", 3 } })); } [Test] @@ -33,6 +32,6 @@ public void When_migrating_up_Then_document_changes() migration.Up(document); // Assert - document.Should().BeEquivalentTo(new BsonDocument { { "Doors", 3 } }); + Assert.That(document, Is.EquivalentTo(new BsonDocument { { "Doors", 3 } })); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs index 4eb03d1..aed02e3 100644 --- a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Logging.Abstractions; using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Locators; using Mongo.Migration.Tests.TestDoubles; @@ -26,7 +25,7 @@ public void When_document_has_one_migration_Then_migrations_count_should_be_one( var result = _locator.GetMigrations(typeof(TestDocumentWithOneMigration)); // Assert - result.Count.Should().Be(1); + Assert.That(result, Has.Count.EqualTo(1)); } [Test] @@ -36,7 +35,7 @@ public void When_document_has_two_migration_Then_migrations_count_should_be_two( var result = _locator.GetMigrations(typeof(TestDocumentWithTwoMigration)); // Assert - result.Count.Should().Be(2); + Assert.That(result, Has.Count.EqualTo(2)); } [Test] @@ -46,7 +45,7 @@ public void When_get_latest_version_of_migrations() var version = _locator.GetLatestVersion(typeof(TestDocumentWithTwoMigration)); // Assert - version.ToString().Should().Be("0.0.2"); + Assert.That(version.ToString(), Is.EqualTo("0.0.2")); } [Test] @@ -57,8 +56,8 @@ public void When_get_migrations_from_to() .GetMigrationsFromTo(typeof(TestDocumentWithTwoMigration), DocumentVersion.Default, DocumentVersion.Parse("0.0.1")) .ToList(); // Assert - result.Should().HaveCount(1); - result[0].Should().BeOfType(); + Assert.That(result, Has.Count.EqualTo(1)); + Assert.That(result[0], Is.TypeOf()); } [Test] @@ -69,7 +68,7 @@ public void When_get_migrations_from_to_down() .GetMigrationsFromToDown(typeof(TestDocumentWithTwoMigration), DocumentVersion.Parse("0.0.2"), DocumentVersion.Parse("0.0.1")) .ToList(); // Assert - result.Should().HaveCount(1); - result[0].Should().BeOfType(); + Assert.That(result, Has.Count.EqualTo(1)); + Assert.That(result[0], Is.TypeOf()); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj index 7adc886..ae07939 100644 --- a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj +++ b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj @@ -9,9 +9,13 @@ - - - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index 20e1fa9..17d5d35 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Migrations.Document; using Mongo.Migration.Tests.TestDoubles; @@ -57,7 +56,7 @@ public async Task When_migrating_number_of_documents() await TestContext.Out.WriteLineAsync($"MongoDB: {sw.ElapsedMilliseconds}ms, Mongo.Migration: {swWithMigration.ElapsedMilliseconds}ms, Diff: {result}ms (Tolerance: {ToleranceMs}ms), Documents: {DocumentCount}, Migrations per Document: 2"); // Assert - result.Should().BeLessThan(ToleranceMs); + Assert.That(result, Is.LessThan(ToleranceMs)); } private static Task InsertDocumentsAsync(int documentCount) diff --git a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs index da6b730..c66d07e 100644 --- a/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs +++ b/Mongo.Migration.Tests/Services/DocumentVersionService_when_determine_version.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Documents; using Mongo.Migration.Exceptions; using Mongo.Migration.Services; @@ -22,7 +21,7 @@ public void When_document_has_current_version_Then_current_version_is_set() service.DetermineVersion(document); // Assert - document.Version.ToString().Should().Be("0.0.1"); + Assert.That(document.Version.ToString(), Is.EqualTo("0.0.1")); } [Test] @@ -36,7 +35,7 @@ public void When_document_has_highest_version_Then_highest_version_is_set() service.DetermineVersion(document); // Assert - document.Version.ToString().Should().Be("0.0.2"); + Assert.That(document.Version.ToString(), Is.EqualTo("0.0.2")); } [Test] @@ -46,10 +45,7 @@ public void When_document_has_version_that_should_not_be_Then_throw_exception() IDocumentVersionService service = TestcontainersContext.Provider.GetRequiredService(); var document = new TestDocumentWithTwoMigrationHighestVersion { Version = new DocumentVersion(0,0,1) }; - // Act// Act - Action checkAction = () => { service.DetermineVersion(document); }; - // Assert - checkAction.Should().Throw(); + Assert.Throws(() => service.DetermineVersion(document)); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs index a67d9ee..54c4a0c 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs @@ -1,5 +1,4 @@ -using FluentAssertions; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Bson; using Mongo.Migration.Tests.TestDoubles; using NUnit.Framework; @@ -19,7 +18,7 @@ public void When_entity_is_document_Then_provide_serializer() var serializer = serializationProvider.GetSerializer(typeof(TestDocumentWithOneMigration)); // Assert - serializer.ValueType.Should().Be(typeof(TestDocumentWithOneMigration)); + Assert.That(serializer.ValueType, Is.EqualTo(typeof(TestDocumentWithOneMigration))); } [Test] @@ -32,6 +31,6 @@ public void When_entity_is_not_document_Then_provide_null() var serializer = serializationProvider.GetSerializer(typeof(TestClass)); // Assert - serializer.Should().BeNull(); + Assert.That(serializer, Is.Null); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs b/Mongo.Migration.Tests/Startup/MigrationBuilderTests.cs similarity index 98% rename from Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs rename to Mongo.Migration.Tests/Startup/MigrationBuilderTests.cs index 8469ac6..22948bb 100644 --- a/Mongo.Migration.Tests/DotNetCore/MigrationBuilderTests.cs +++ b/Mongo.Migration.Tests/Startup/MigrationBuilderTests.cs @@ -6,11 +6,11 @@ using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Document; using Mongo.Migration.Services; -using Mongo.Migration.Startup.DotNetCore; +using Mongo.Migration.Startup; using MongoDB.Driver; using NUnit.Framework; -namespace Mongo.Migration.Tests.DotNetCore; +namespace Mongo.Migration.Tests.Startup; [TestFixture] internal class MigrationBuilderTests diff --git a/Mongo.Migration.Tests/TestcontainersContext.cs b/Mongo.Migration.Tests/TestcontainersContext.cs index fa6010c..c9b9612 100644 --- a/Mongo.Migration.Tests/TestcontainersContext.cs +++ b/Mongo.Migration.Tests/TestcontainersContext.cs @@ -2,7 +2,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Mongo.Migration.Services; -using Mongo.Migration.Startup.DotNetCore; +using Mongo.Migration.Startup; using MongoDB.Driver; using NUnit.Framework; using Testcontainers.MongoDb; diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index 08fa9e8..47c99c5 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -9,12 +9,9 @@ en - - - - + diff --git a/Mongo.Migration/Services/MigrationService.cs b/Mongo.Migration/Services/MigrationService.cs index 92717ee..55d4344 100644 --- a/Mongo.Migration/Services/MigrationService.cs +++ b/Mongo.Migration/Services/MigrationService.cs @@ -6,7 +6,7 @@ using Mongo.Migration.Documents.Serializers; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Document; -using Mongo.Migration.Startup.DotNetCore; +using Mongo.Migration.Startup; using MongoDB.Bson.Serialization; using MongoDB.Driver; diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs b/Mongo.Migration/Startup/MongoMigrationBuilder.cs similarity index 89% rename from Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs rename to Mongo.Migration/Startup/MongoMigrationBuilder.cs index a99d3fb..d080911 100644 --- a/Mongo.Migration/Startup/DotNetCore/MongoMigrationBuilder.cs +++ b/Mongo.Migration/Startup/MongoMigrationBuilder.cs @@ -6,7 +6,7 @@ using Mongo.Migration.Migrations.Locators; using Mongo.Migration.Services; -namespace Mongo.Migration.Startup.DotNetCore; +namespace Mongo.Migration.Startup; public class MongoMigrationBuilder { @@ -48,7 +48,7 @@ public MongoMigrationBuilder AddRuntimeDocumentMigration() public MongoMigrationBuilder AddStartupDocumentMigration() { AddInterceptorServices(); - + _services .AddTransient() .AddTransient(); @@ -72,11 +72,11 @@ public MongoMigrationBuilder AddDatabaseMigration() public void AddAllMigrationsIfNothingWasAdded() { - if (_mongoMigrationStartupSettings is {RuntimeMigrationEnabled: false, StartupDocumentMigrationEnabled: false, DatabaseMigrationEnabled: false}) + if (_mongoMigrationStartupSettings is { RuntimeMigrationEnabled: false, StartupDocumentMigrationEnabled: false, DatabaseMigrationEnabled: false }) { - AddRuntimeDocumentMigration(); - AddDatabaseMigration(); - AddStartupDocumentMigration(); + AddRuntimeDocumentMigration(); + AddDatabaseMigration(); + AddStartupDocumentMigration(); } } diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs b/Mongo.Migration/Startup/MongoMigrationExtensions.cs similarity index 65% rename from Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs rename to Mongo.Migration/Startup/MongoMigrationExtensions.cs index 9449918..2c6dfd9 100644 --- a/Mongo.Migration/Startup/DotNetCore/MongoMigrationExtensions.cs +++ b/Mongo.Migration/Startup/MongoMigrationExtensions.cs @@ -1,7 +1,6 @@ -using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Mongo.Migration.Services; -namespace Mongo.Migration.Startup.DotNetCore; +namespace Mongo.Migration.Startup; public static class MongoMigrationExtensions { @@ -18,9 +17,8 @@ public static IServiceCollection AddMigration( return services; } - public static async Task InitializeAndMigrateAsync(this IApplicationBuilder app, string databaseName, string? targetDatabaseVersion) + public static async Task InitializeAndMigrateAsync(this IMigrationService migrationService, string databaseName, string? targetDatabaseVersion) { - IMigrationService migrationService = app.ApplicationServices.GetRequiredService(); migrationService.RegisterBsonStatics(); await migrationService.MigrateAsync(databaseName, targetDatabaseVersion); diff --git a/Mongo.Migration/Startup/DotNetCore/MongoMigrationStartupSettings.cs b/Mongo.Migration/Startup/MongoMigrationStartupSettings.cs similarity index 81% rename from Mongo.Migration/Startup/DotNetCore/MongoMigrationStartupSettings.cs rename to Mongo.Migration/Startup/MongoMigrationStartupSettings.cs index 80c13ed..13f63c3 100644 --- a/Mongo.Migration/Startup/DotNetCore/MongoMigrationStartupSettings.cs +++ b/Mongo.Migration/Startup/MongoMigrationStartupSettings.cs @@ -1,4 +1,4 @@ -namespace Mongo.Migration.Startup.DotNetCore; +namespace Mongo.Migration.Startup; internal class MongoMigrationStartupSettings { From a1a2ab963e75adfb316c76a946f8f9aac1dec575 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Tue, 21 Jan 2025 15:53:54 +0100 Subject: [PATCH 18/42] all async --- ...baseMigrationRunner_when_migrating_down.cs | 4 +-- ...tabaseMigrationRunner_when_migrating_up.cs | 6 ++-- .../Performance/PerformanceOnStartup.cs | 2 +- .../Database/TestDatabaseMigration_0_0_1.cs | 8 ++--- .../Database/TestDatabaseMigration_0_0_2.cs | 8 ++--- .../Database/TestDatabaseMigration_0_0_3.cs | 8 ++--- .../Migrations/Database/DatabaseMigration.cs | 4 +-- .../Database/DatabaseMigrationRunner.cs | 29 +++++++++--------- .../Migrations/Database/IDatabaseMigration.cs | 4 +-- .../Database/IDatabaseMigrationRunner.cs | 2 +- .../IStartUpDocumentMigrationRunner.cs | 2 +- .../StartUpDocumentMigrationRunner.cs | 8 ++--- .../Services/DatabaseVersionService.cs | 30 ++++++++++++------- .../Services/IDatabaseVersionService.cs | 6 ++-- Mongo.Migration/Services/IMigrationService.cs | 2 +- Mongo.Migration/Services/MigrationService.cs | 14 ++++----- .../Startup/MongoMigrationExtensions.cs | 7 +++-- 17 files changed, 72 insertions(+), 72 deletions(-) diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs index e2c4066..8c69b60 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs @@ -25,7 +25,7 @@ public async Task When_database_has_migrations_Then_down_all_migrations() }); // Act - runner.Run(Db, DocumentVersion.Default); + await runner.RunAsync(Db, DocumentVersion.Default); // Assert var migrations = GetMigrationHistory(); @@ -48,7 +48,7 @@ public async Task When_database_has_migrations_Then_down_to_selected_migration() }); // Act - runner.Run(Db, new DocumentVersion(0, 0, 1)); + await runner.RunAsync(Db, new DocumentVersion(0, 0, 1)); // Assert List migrations = GetMigrationHistory(); diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs index 2b347e6..8e766ce 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs @@ -17,7 +17,7 @@ public async Task When_database_has_no_migrations_Then_all_migrations_are_used() IDatabaseMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); // Act - runner.Run(Db, DocumentVersion.Empty); + await runner.RunAsync(Db, DocumentVersion.Empty); // Assert var migrations = GetMigrationHistory(); @@ -36,7 +36,7 @@ public async Task When_database_has_migrations_Then_latest_migrations_are_used() InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration001(), new TestDatabaseMigration002() }); // Act - runner.Run(Db, DocumentVersion.Empty); + await runner.RunAsync(Db, DocumentVersion.Empty); // Assert var migrations = GetMigrationHistory(); @@ -53,7 +53,7 @@ public async Task When_database_has_latest_version_Then_nothing_happens() InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration001(), new TestDatabaseMigration002(), new TestDatabaseMigration003() }); // Act - runner.Run(Db, DocumentVersion.Empty); + await runner.RunAsync(Db, DocumentVersion.Empty, CancellationToken.None); // Assert var migrations = GetMigrationHistory(); diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index 17d5d35..b3043bd 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -46,7 +46,7 @@ public async Task When_migrating_number_of_documents() IStartUpDocumentMigrationRunner documentMigrationRunner = TestcontainersContext.Provider.GetRequiredService(); - documentMigrationRunner.RunAll(client.GetDatabase(DatabaseName)); + await documentMigrationRunner.RunAllAsync(client.GetDatabase(DatabaseName), CancellationToken.None); swWithMigration.Stop(); ClearCollection(); diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs index ec64f3c..9fa2b76 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs @@ -10,11 +10,7 @@ public TestDatabaseMigration001() { } - public override void Up(IMongoDatabase db) - { - } + public override Task UpAsync(IMongoDatabase db, CancellationToken cancellationToken) => Task.CompletedTask; - public override void Down(IMongoDatabase db) - { - } + public override Task DownAsync(IMongoDatabase db, CancellationToken cancellationToken) => Task.CompletedTask; } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs index d8b85cf..f4a5b8e 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs @@ -10,11 +10,7 @@ public TestDatabaseMigration002() { } - public override void Up(IMongoDatabase db) - { - } + public override Task UpAsync(IMongoDatabase db, CancellationToken cancellationToken) => Task.CompletedTask; - public override void Down(IMongoDatabase db) - { - } + public override Task DownAsync(IMongoDatabase db, CancellationToken cancellationToken) => Task.CompletedTask; } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs index 2e2e935..c295fc3 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs @@ -10,11 +10,7 @@ public TestDatabaseMigration003() { } - public override void Up(IMongoDatabase db) - { - } + public override Task UpAsync(IMongoDatabase db, CancellationToken cancellationToken) => Task.CompletedTask; - public override void Down(IMongoDatabase db) - { - } + public override Task DownAsync(IMongoDatabase db, CancellationToken cancellationToken) => Task.CompletedTask; } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/DatabaseMigration.cs b/Mongo.Migration/Migrations/Database/DatabaseMigration.cs index a558e60..b7a26a4 100644 --- a/Mongo.Migration/Migrations/Database/DatabaseMigration.cs +++ b/Mongo.Migration/Migrations/Database/DatabaseMigration.cs @@ -15,7 +15,7 @@ protected DatabaseMigration(string version) public Type Type => typeof(DatabaseMigration); - public abstract void Up(IMongoDatabase db); + public abstract Task UpAsync(IMongoDatabase db, CancellationToken cancellationToken); - public abstract void Down(IMongoDatabase db); + public abstract Task DownAsync(IMongoDatabase db, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs index fd64250..a0dfeb1 100644 --- a/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/DatabaseMigrationRunner.cs @@ -26,37 +26,38 @@ public DatabaseMigrationRunner( _logger = logger; } - public void Run(IMongoDatabase db, in DocumentVersion? targetVersion = null) + public async Task RunAsync(IMongoDatabase db, DocumentVersion? targetVersion = null, CancellationToken cancellationToken = default) { _logger.LogInformation("Database migration started."); - DocumentVersion databaseVersion = _databaseVersionService.GetLatestDatabaseVersion(db); + DocumentVersion databaseVersion = await _databaseVersionService.GetLatestDatabaseVersionAsync(db, cancellationToken); DocumentVersion currentOrLatest = targetVersion is not null && targetVersion > DocumentVersion.Empty ? targetVersion.Value : _databaseVersionService.GetLatestMigrationVersion(); if (databaseVersion != currentOrLatest) { - MigrateUpOrDown(db, databaseVersion, currentOrLatest); + await MigrateUpOrDownAsync(db, databaseVersion, currentOrLatest, cancellationToken); } _logger.LogInformation("Database migration finished."); } - private void MigrateUpOrDown( + private async Task MigrateUpOrDownAsync( IMongoDatabase db, - in DocumentVersion databaseVersion, - in DocumentVersion to) + DocumentVersion databaseVersion, + DocumentVersion to, + CancellationToken cancellationToken) { if (databaseVersion > to) { - MigrateDown(db, databaseVersion, to); + await MigrateDownAsync(db, databaseVersion, to, cancellationToken); return; } - MigrateUp(db, databaseVersion, to); + await MigrateUpAsync(db, databaseVersion, to, cancellationToken); } - private void MigrateUp(IMongoDatabase db, in DocumentVersion currentVersion, in DocumentVersion toVersion) + private async Task MigrateUpAsync(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion, CancellationToken cancellationToken) { var migrations = _migrationLocator .GetMigrationsFromTo(_databaseMigrationType, currentVersion, toVersion); @@ -65,14 +66,14 @@ private void MigrateUp(IMongoDatabase db, in DocumentVersion currentVersion, in { _logger.LogInformation("Database Migration Up: {Type}:{Version} ", currentVersion.GetType(), migration.Version); - migration.Up(db); - _databaseVersionService.Save(db, migration); + await migration.UpAsync(db, cancellationToken); + await _databaseVersionService.SaveAsync(db, migration, cancellationToken); _logger.LogInformation("Database Migration Up finished successful: {Type}:{Version} ", migration.GetType(), migration.Version); } } - private void MigrateDown(IMongoDatabase db, in DocumentVersion currentVersion, in DocumentVersion toVersion) + private async Task MigrateDownAsync(IMongoDatabase db, DocumentVersion currentVersion, DocumentVersion toVersion, CancellationToken cancellationToken) { var migrations = _migrationLocator .GetMigrationsFromToDown(_databaseMigrationType, currentVersion, toVersion); @@ -81,8 +82,8 @@ private void MigrateDown(IMongoDatabase db, in DocumentVersion currentVersion, i { _logger.LogInformation("Database Migration Down: {Type}:{Version} ", migration.GetType(), migration.Version); - migration.Down(db); - _databaseVersionService.Remove(db, migration); + await migration.DownAsync(db, cancellationToken); + await _databaseVersionService.RemoveAsync(db, migration, cancellationToken); _logger.LogInformation("Database Migration Down finished successful: {Type}:{Version} ", migration.GetType(), migration.Version); } diff --git a/Mongo.Migration/Migrations/Database/IDatabaseMigration.cs b/Mongo.Migration/Migrations/Database/IDatabaseMigration.cs index 95c0dfa..b6a79ad 100644 --- a/Mongo.Migration/Migrations/Database/IDatabaseMigration.cs +++ b/Mongo.Migration/Migrations/Database/IDatabaseMigration.cs @@ -4,7 +4,7 @@ namespace Mongo.Migration.Migrations.Database; public interface IDatabaseMigration : IMigration { - void Up(IMongoDatabase db); + Task UpAsync(IMongoDatabase db, CancellationToken cancellationToken); - void Down(IMongoDatabase db); + Task DownAsync(IMongoDatabase db, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs b/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs index 953ae42..1d87b8e 100644 --- a/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Database/IDatabaseMigrationRunner.cs @@ -5,5 +5,5 @@ namespace Mongo.Migration.Migrations.Database; public interface IDatabaseMigrationRunner { - void Run(IMongoDatabase db, in DocumentVersion? targetVersion = null); + Task RunAsync(IMongoDatabase db, DocumentVersion? targetVersion = null, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs index 597cf43..cdd7cb8 100644 --- a/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/IStartUpDocumentMigrationRunner.cs @@ -4,5 +4,5 @@ namespace Mongo.Migration.Migrations.Document; internal interface IStartUpDocumentMigrationRunner { - void RunAll(IMongoDatabase database); + Task RunAllAsync(IMongoDatabase database, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs index 363ecec..86b07a3 100644 --- a/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs +++ b/Mongo.Migration/Migrations/Document/StartUpDocumentMigrationRunner.cs @@ -23,7 +23,7 @@ public StartUpDocumentMigrationRunner( _migrationRunner = migrationRunner; } - public void RunAll(IMongoDatabase database) + public async Task RunAllAsync(IMongoDatabase database, CancellationToken cancellationToken) { var locations = _collectionLocator.GetLocatesOrEmpty(); @@ -39,9 +39,9 @@ public void RunAll(IMongoDatabase database) var query = CreateQueryForRelevantDocuments(type); - using (var cursor = collection.FindSync(query)) + using (var cursor = await collection.FindAsync(query, cancellationToken: cancellationToken)) { - while (cursor.MoveNext()) + while (await cursor.MoveNextAsync(cancellationToken)) { var batch = cursor.Current; foreach (var document in batch) @@ -60,7 +60,7 @@ public void RunAll(IMongoDatabase database) if (bulk.Count > 0) { - collection.BulkWrite(bulk); + await collection.BulkWriteAsync(bulk, cancellationToken: cancellationToken); } } } diff --git a/Mongo.Migration/Services/DatabaseVersionService.cs b/Mongo.Migration/Services/DatabaseVersionService.cs index 6e7320d..393419e 100644 --- a/Mongo.Migration/Services/DatabaseVersionService.cs +++ b/Mongo.Migration/Services/DatabaseVersionService.cs @@ -21,9 +21,12 @@ public DocumentVersion GetLatestMigrationVersion() return _migrationLocator.GetLatestVersion(typeof(DatabaseMigration)); } - public DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db) + public async Task GetLatestDatabaseVersionAsync(IMongoDatabase db, CancellationToken cancellationToken) { - var migrations = GetMigrationsCollection(db).Find(m => true).ToList(); + var cursor = await GetMigrationsCollection(db) + .FindAsync(m => true, cancellationToken: cancellationToken); + var migrations = await cursor.ToListAsync(cancellationToken); + if (migrations is { Count: 0 }) { return DocumentVersion.Default; @@ -32,19 +35,24 @@ public DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db) return migrations.Max(m => m.Version); } - public void Save(IMongoDatabase db, IDatabaseMigration migration) + public async Task SaveAsync(IMongoDatabase db, IDatabaseMigration migration, CancellationToken cancellationToken) { - GetMigrationsCollection(db).InsertOne( - new() - { - MigrationId = migration.GetType().ToString(), - Version = migration.Version - }); + await GetMigrationsCollection(db) + .InsertOneAsync( + new() + { + MigrationId = migration.GetType().ToString(), + Version = migration.Version + }, + cancellationToken: cancellationToken); } - public void Remove(IMongoDatabase db, IDatabaseMigration migration) + public async Task RemoveAsync(IMongoDatabase db, IDatabaseMigration migration, CancellationToken cancellationToken) { - GetMigrationsCollection(db).DeleteOne(Builders.Filter.Eq(mh => mh.MigrationId, migration.GetType().ToString())); + await GetMigrationsCollection(db) + .DeleteOneAsync( + Builders.Filter.Eq(mh => mh.MigrationId, migration.GetType().ToString()), + cancellationToken: cancellationToken); } private static IMongoCollection GetMigrationsCollection(IMongoDatabase db) diff --git a/Mongo.Migration/Services/IDatabaseVersionService.cs b/Mongo.Migration/Services/IDatabaseVersionService.cs index c12c11c..f3e68cf 100644 --- a/Mongo.Migration/Services/IDatabaseVersionService.cs +++ b/Mongo.Migration/Services/IDatabaseVersionService.cs @@ -9,9 +9,9 @@ public interface IDatabaseVersionService { DocumentVersion GetLatestMigrationVersion(); - DocumentVersion GetLatestDatabaseVersion(IMongoDatabase db); + Task GetLatestDatabaseVersionAsync(IMongoDatabase db, CancellationToken cancellationToken); - void Save(IMongoDatabase db, IDatabaseMigration migration); + Task SaveAsync(IMongoDatabase db, IDatabaseMigration migration, CancellationToken cancellationToken); - void Remove(IMongoDatabase db, IDatabaseMigration migration); + Task RemoveAsync(IMongoDatabase db, IDatabaseMigration migration, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/Mongo.Migration/Services/IMigrationService.cs b/Mongo.Migration/Services/IMigrationService.cs index c19ea03..af7263a 100644 --- a/Mongo.Migration/Services/IMigrationService.cs +++ b/Mongo.Migration/Services/IMigrationService.cs @@ -4,5 +4,5 @@ public interface IMigrationService { void RegisterBsonStatics(); - Task MigrateAsync(string databaseName, string? targetDatabaseVersion); + Task MigrateAsync(string databaseName, string? targetDatabaseVersion, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/Mongo.Migration/Services/MigrationService.cs b/Mongo.Migration/Services/MigrationService.cs index 55d4344..55802e2 100644 --- a/Mongo.Migration/Services/MigrationService.cs +++ b/Mongo.Migration/Services/MigrationService.cs @@ -42,20 +42,20 @@ public void RegisterBsonStatics() } } - public async Task MigrateAsync(string databaseName, string? targetDatabaseVersion) + public async Task MigrateAsync(string databaseName, string? targetDatabaseVersion, CancellationToken cancellationToken) { if (_startupSettings.DatabaseMigrationEnabled) { - await ExecuteDatabaseMigrationAsync(databaseName, targetDatabaseVersion); + await ExecuteDatabaseMigrationAsync(databaseName, targetDatabaseVersion, cancellationToken); } if (_startupSettings.StartupDocumentMigrationEnabled) { - await ExecuteDocumentMigrationAsync(databaseName); + await ExecuteDocumentMigrationAsync(databaseName, cancellationToken); } } - private async Task ExecuteDatabaseMigrationAsync(string databaseName, string? targetVersion) + private async Task ExecuteDatabaseMigrationAsync(string databaseName, string? targetVersion, CancellationToken cancellationToken) { Stopwatch sw = Stopwatch.StartNew(); @@ -71,12 +71,12 @@ private async Task ExecuteDatabaseMigrationAsync(string databaseName, string? ta IMongoDatabase database = _client.GetDatabase(databaseName); IDatabaseMigrationRunner runner = scope.ServiceProvider.GetRequiredService(); - runner.Run(database, typedTargetVersion); + await runner.RunAsync(database, typedTargetVersion, cancellationToken); _logger.LogInformation("Database migration done in {ElapsedMs} ms", sw.ElapsedMilliseconds); } - private async Task ExecuteDocumentMigrationAsync(string databaseName) + private async Task ExecuteDocumentMigrationAsync(string databaseName, CancellationToken cancellationToken) { Stopwatch sw = Stopwatch.StartNew(); _logger.LogInformation("Executing document migration..."); @@ -84,7 +84,7 @@ private async Task ExecuteDocumentMigrationAsync(string databaseName) IMongoDatabase database = _client.GetDatabase(databaseName); IStartUpDocumentMigrationRunner runner = scope.ServiceProvider.GetRequiredService(); - runner.RunAll(database); + await runner.RunAllAsync(database, cancellationToken); _logger.LogInformation("Database migration done in {ElapsedMs} ms", sw.ElapsedMilliseconds); } diff --git a/Mongo.Migration/Startup/MongoMigrationExtensions.cs b/Mongo.Migration/Startup/MongoMigrationExtensions.cs index 2c6dfd9..cb1395c 100644 --- a/Mongo.Migration/Startup/MongoMigrationExtensions.cs +++ b/Mongo.Migration/Startup/MongoMigrationExtensions.cs @@ -17,10 +17,13 @@ public static IServiceCollection AddMigration( return services; } - public static async Task InitializeAndMigrateAsync(this IMigrationService migrationService, string databaseName, string? targetDatabaseVersion) + public static async Task InitializeAndMigrateAsync(this IMigrationService migrationService, + string databaseName, + string? targetDatabaseVersion, + CancellationToken cancellationToken) { migrationService.RegisterBsonStatics(); - await migrationService.MigrateAsync(databaseName, targetDatabaseVersion); + await migrationService.MigrateAsync(databaseName, targetDatabaseVersion, cancellationToken); } } \ No newline at end of file From 66d0cabf5c4e96bb862ffcea1c8a020231447109 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Tue, 21 Jan 2025 15:55:03 +0100 Subject: [PATCH 19/42] remove nsubstitute (not used) --- Mongo.Migration.Tests/Mongo.Migration.Tests.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj index ae07939..4b15db7 100644 --- a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj +++ b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj @@ -16,7 +16,6 @@ - all From f4a4f3f63adf2147ebb6df0a3973d9837316374f Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Mon, 27 Jan 2025 10:21:28 +0100 Subject: [PATCH 20/42] Add possibility to declares anemic models Various improvements --- .../AttributeMigrationLocator_when_locate.cs | 4 +- .../DocumentMigration_when_migrating.cs | 28 ++++++ .../Interceptor/InterceptorTests.cs | 82 ++++++++++++++- .../Mongo.Migration.Tests.csproj | 2 +- .../MongoDB/MongoRegistryTests.cs | 2 +- .../Performance/PerformanceOnStartup.cs | 2 +- .../PerformanceRuntimeMigration.cs | 4 +- ...grationInterceptorFactory_when_creating.cs | 17 +++- ...InterceptorProvider_when_get_serializer.cs | 15 ++- .../{TestClass.cs => TestClassNoMigration.cs} | 2 +- .../TestClassWithTwoMigrationMiddleVersion.cs | 48 +++++++++ .../TestDocumentWithOneMigration.cs | 4 +- .../TestDocumentWithOneMigration_0_0_1.cs | 2 +- .../TestDocumentWithTwoMigration.cs | 2 +- ...tDocumentWithTwoMigrationHighestVersion.cs | 2 +- ...entWithTwoMigrationHighestVersion_0_0_1.cs | 2 +- ...entWithTwoMigrationHighestVersion_0_0_2.cs | 2 +- ...stDocumentWithTwoMigrationMiddleVersion.cs | 2 +- ...mentWithTwoMigrationMiddleVersion_0_0_1.cs | 2 +- ...mentWithTwoMigrationMiddleVersion_0_0_2.cs | 2 +- .../TestDocumentWithTwoMigration_0_0_1.cs | 2 +- .../TestDocumentWithTwoMigration_0_0_2.cs | 2 +- .../TestcontainersContext.cs | 11 ++- .../Bson/BaseMigrationSerializer.cs | 52 ++++++++++ .../Bson/MigrationBsonSerializerProvider.cs | 28 +++--- .../Bson/MigrationDocumentSerializer.cs | 18 ++++ .../Bson/MigrationReflexionSerializer.cs | 33 +++++++ Mongo.Migration/Bson/MigrationSerializer.cs | 59 ----------- ...tion.cs => CollectionLocationAttribute.cs} | 4 +- ...pVersion.cs => RuntimeVersionAttribute.cs} | 4 +- ...eVersion.cs => StartUpVersionAttribute.cs} | 4 +- .../Documents/Locators/AbstractLocator.cs | 11 +++ .../Documents/Locators/CollectionLocator.cs | 19 +--- .../Locators/RuntimeVersionLocator.cs | 40 ++++---- .../Locators/StartUpVersionLocator.cs | 21 +--- .../Exceptions/DuplicateVersionException.cs | 2 +- .../RuntimeVersionDefinitionException.cs | 14 +++ .../Migrations/Document/DocumentMigration.cs | 1 - Mongo.Migration/Mongo.Migration.csproj | 2 +- .../Services/DocumentVersionService.cs | 3 +- .../Services/IDocumentVersionService.cs | 1 - .../Startup/MongoMigrationBuilder.cs | 99 ------------------- .../Startup/MongoMigrationConfigurator.cs | 77 +++++++++++++++ .../Startup/MongoMigrationExtensions.cs | 60 ++++++++++- 44 files changed, 527 insertions(+), 266 deletions(-) rename Mongo.Migration.Tests/TestDoubles/{TestClass.cs => TestClassNoMigration.cs} (85%) create mode 100644 Mongo.Migration.Tests/TestDoubles/TestClassWithTwoMigrationMiddleVersion.cs create mode 100644 Mongo.Migration/Bson/BaseMigrationSerializer.cs create mode 100644 Mongo.Migration/Bson/MigrationDocumentSerializer.cs create mode 100644 Mongo.Migration/Bson/MigrationReflexionSerializer.cs delete mode 100644 Mongo.Migration/Bson/MigrationSerializer.cs rename Mongo.Migration/Documents/Attributes/{CollectionLocation.cs => CollectionLocationAttribute.cs} (69%) rename Mongo.Migration/Documents/Attributes/{StartUpVersion.cs => RuntimeVersionAttribute.cs} (67%) rename Mongo.Migration/Documents/Attributes/{RuntimeVersion.cs => StartUpVersionAttribute.cs} (67%) create mode 100644 Mongo.Migration/Exceptions/RuntimeVersionDefinitionException.cs delete mode 100644 Mongo.Migration/Startup/MongoMigrationBuilder.cs create mode 100644 Mongo.Migration/Startup/MongoMigrationConfigurator.cs diff --git a/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs index 8a09c20..be8d6dd 100644 --- a/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Documents/Locators/AttributeMigrationLocator_when_locate.cs @@ -11,7 +11,7 @@ internal class VersionLocatorWhenLocate public void Then_find_current_version_of_document() { // Arrange - var locator = new RuntimeVersionLocator(); + var locator = new RuntimeVersionLocator([]); // Act var currentVersion = locator.GetLocateOrNull(typeof(TestDocumentWithOneMigration)); @@ -24,7 +24,7 @@ public void Then_find_current_version_of_document() public void When_document_has_no_attribute_Then_return_null() { // Arrange - var locator = new RuntimeVersionLocator(); + var locator = new RuntimeVersionLocator([]); // Act var currentVersion = locator.GetLocateOrNull(typeof(TestDocumentWithoutAttribute)); diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs index 915cc9f..f15b66d 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_migrating.cs @@ -34,4 +34,32 @@ public void When_migrating_up_Then_document_changes() // Assert Assert.That(document, Is.EquivalentTo(new BsonDocument { { "Doors", 3 } })); } + + [Test] + public void When_version_as_string_migrating_down_Then_document_changes() + { + // Arrange + var migration = new TestClassWithTwoMigrationMiddleVersion001(); + var document = new BsonDocument { { "Doors1", 3 } }; + + // Act + migration.Down(document); + + // Assert + Assert.That(document, Is.EquivalentTo(new BsonDocument { { "Doors0", 3 } })); + } + + [Test] + public void When_version_as_string_migrating_up_Then_document_changes() + { + // Arrange + var migration = new TestClassWithTwoMigrationMiddleVersion001(); + var document = new BsonDocument { { "Doors0", 3 } }; + + // Act + migration.Up(document); + + // Assert + Assert.That(document, Is.EquivalentTo(new BsonDocument { { "Doors1", 3 } })); + } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs b/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs index 88b9f8b..31f2e2d 100644 --- a/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs +++ b/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs @@ -42,17 +42,21 @@ await untypedCollection.InsertManyAsync(new[] { new BsonDocument { - new("Doors0", new BsonInt32(0)), + new("Doors0", new BsonInt32(0)) + }, + new BsonDocument + { + new("Doors0", new BsonInt32(1)), new("Version", new BsonString("0.0.0")) }, new BsonDocument { - new("Doors1", new BsonInt32(1)), + new("Doors1", new BsonInt32(2)), new("Version", new BsonString("0.0.1")) }, new BsonDocument { - new("Doors2", new BsonInt32(2)), + new("Doors2", new BsonInt32(3)), new("Version", new BsonString("0.0.2")) } }); @@ -63,7 +67,7 @@ await untypedCollection.InsertManyAsync(new[] Assert.Multiple(() => { - Assert.That(documents, Has.Count.EqualTo(3)); + Assert.That(documents, Has.Count.EqualTo(4)); Assert.That( documents.Select(d => d.Version.ToString()), Is.All.EqualTo("0.0.1")); @@ -71,9 +75,79 @@ await untypedCollection.InsertManyAsync(new[] Assert.That(documents[0].Doors1, Is.EqualTo(0)); Assert.That(documents[1].Doors1, Is.EqualTo(1)); Assert.That(documents[2].Doors1, Is.EqualTo(2)); + Assert.That(documents[3].Doors1, Is.EqualTo(3)); }); } + [Test] + public async Task TestSerializationVersionAsStringIntercepted() + { + IMongoCollection untypedCollection = GetCollection(); + IMongoCollection testDocumentCollection = + GetCollection(); + + await testDocumentCollection.InsertOneAsync(new TestClassWithTwoMigrationMiddleVersion + { + Doors1 = 42 + }); + + BsonDocument? documentInserted = await untypedCollection + .Find(Builders.Filter.Eq("Doors1", 42)) + .FirstOrDefaultAsync(); + + Assert.That(documentInserted, Is.Not.Null); + Assert.That(documentInserted["Version"].AsString, Is.EqualTo("0.0.1")); + } + + [Test] + public async Task TestDeserializationVersionAsStringIntercepted() + { + IMongoCollection untypedCollection = GetCollection(); + IMongoCollection testDocumentCollection = + GetCollection(); + + await untypedCollection.InsertManyAsync(new[] + { + new BsonDocument + { + new("Doors0", new BsonInt32(0)) + }, + new BsonDocument + { + new("Doors0", new BsonInt32(1)), + new("Version", new BsonString("0.0.0")) + }, + new BsonDocument + { + new("Doors1", new BsonInt32(2)), + new("Version", new BsonString("0.0.1")) + }, + new BsonDocument + { + new("Doors2", new BsonInt32(3)), + new("Version", new BsonString("0.0.2")) + } + }); + + var asyncCursor = await testDocumentCollection + .FindAsync(FilterDefinition.Empty); + List documents = await asyncCursor.ToListAsync(); + + Assert.Multiple(() => + { + Assert.That(documents, Has.Count.EqualTo(4)); + Assert.That( + documents.Select(d => d.Version.ToString()), + Is.All.EqualTo("0.0.1")); + + Assert.That(documents[0].Doors1, Is.EqualTo(0)); + Assert.That(documents[1].Doors1, Is.EqualTo(1)); + Assert.That(documents[2].Doors1, Is.EqualTo(2)); + Assert.That(documents[3].Doors1, Is.EqualTo(3)); + }); + } + + [SetUp] public void SetUpLocal() { diff --git a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj index 4b15db7..67687a9 100644 --- a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj +++ b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj @@ -1,7 +1,7 @@  - net7.0;net8.0 + net8.0 enable enable false diff --git a/Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs b/Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs index 1e7cf69..d93ca03 100644 --- a/Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs +++ b/Mongo.Migration.Tests/MongoDB/MongoRegistryTests.cs @@ -29,7 +29,7 @@ public void MongoSerializerProviderIsRegistered() { Assert.That( BsonSerializer.SerializerRegistry.GetSerializer(), - Is.TypeOf>()); + Is.TypeOf>()); } [Test] diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index b3043bd..d36f6d9 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -88,7 +88,7 @@ private static async Task QueryAllAsync(bool withVersion) return; } var collection = client.GetDatabase(DatabaseName) - .GetCollection(CollectionName); + .GetCollection(CollectionName); var result = await (await collection.FindAsync(_ => true)).ToListAsync(); } diff --git a/Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs b/Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs index 0e6cf5c..677ad1c 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs @@ -49,9 +49,9 @@ public async Task MeasureVanillaRead(int documentCount, long msDurationThreshold { "Version", BsonString.Create("0.0.0") } }); - IMongoCollection collection = GetCollection(); + IMongoCollection collection = GetCollection(); Stopwatch sw = Stopwatch.StartNew(); - List results = await (await collection.FindAsync(FilterDefinition.Empty)).ToListAsync(); + List results = await (await collection.FindAsync(FilterDefinition.Empty)).ToListAsync(); sw.Stop(); await TestContext.Out.WriteLineAsync($"Elapsed {sw.ElapsedMilliseconds} ms to read {results.Count} documents"); diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs index 79c4ec6..779bd08 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs @@ -19,7 +19,7 @@ public void If_type_is_assignable_to_document_Then_interceptor_is_created() IBsonSerializer serializer = serializerProvider.GetSerializer(typeof(TestDocumentWithOneMigration)); // Assert - Assert.That(serializer, Is.TypeOf(typeof(MigrationSerializer))); + Assert.That(serializer, Is.TypeOf(typeof(MigrationDocumentSerializer))); } [Test] @@ -29,9 +29,22 @@ public void If_type_is_not_assignable_to_document_Then_null_returned() var serializerProvider = TestcontainersContext.Provider.GetRequiredService(); // Act - IBsonSerializer serializer = serializerProvider.GetSerializer(typeof(TestClass)); + IBsonSerializer serializer = serializerProvider.GetSerializer(typeof(TestClassNoMigration)); // Assert Assert.That(serializer, Is.Null); } + + [Test] + public void If_type_is_not_assignable_to_document_but_manually_added_Then_interceptor_created() + { + // Arrange + var serializerProvider = TestcontainersContext.Provider.GetRequiredService(); + + // Act + IBsonSerializer serializer = serializerProvider.GetSerializer(typeof(TestClassWithTwoMigrationMiddleVersion)); + + // Assert + Assert.That(serializer, Is.TypeOf(typeof(MigrationReflexionSerializer))); + } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs index 54c4a0c..64533de 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorProvider_when_get_serializer.cs @@ -28,9 +28,22 @@ public void When_entity_is_not_document_Then_provide_null() var serializationProvider = TestcontainersContext.Provider.GetRequiredService(); // Act - var serializer = serializationProvider.GetSerializer(typeof(TestClass)); + var serializer = serializationProvider.GetSerializer(typeof(TestClassNoMigration)); // Assert Assert.That(serializer, Is.Null); } + + [Test] + public void When_entity_is_not_document_but_manually_added_Then_provide_serializer() + { + // Arrange + var serializationProvider = TestcontainersContext.Provider.GetRequiredService(); + + // Act + var serializer = serializationProvider.GetSerializer(typeof(TestClassWithTwoMigrationMiddleVersion)); + + // Assert + Assert.That(serializer.ValueType, Is.EqualTo(typeof(TestClassWithTwoMigrationMiddleVersion))); + } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestClass.cs b/Mongo.Migration.Tests/TestDoubles/TestClassNoMigration.cs similarity index 85% rename from Mongo.Migration.Tests/TestDoubles/TestClass.cs rename to Mongo.Migration.Tests/TestDoubles/TestClassNoMigration.cs index b4029b2..37fe744 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestClass.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestClassNoMigration.cs @@ -2,7 +2,7 @@ namespace Mongo.Migration.Tests.TestDoubles; -public class TestClass +public class TestClassNoMigration { public ObjectId Id { get; set; } diff --git a/Mongo.Migration.Tests/TestDoubles/TestClassWithTwoMigrationMiddleVersion.cs b/Mongo.Migration.Tests/TestDoubles/TestClassWithTwoMigrationMiddleVersion.cs new file mode 100644 index 0000000..4bd6e38 --- /dev/null +++ b/Mongo.Migration.Tests/TestDoubles/TestClassWithTwoMigrationMiddleVersion.cs @@ -0,0 +1,48 @@ +using Mongo.Migration.Migrations.Document; +using MongoDB.Bson; + +namespace Mongo.Migration.Tests.TestDoubles; +public class TestClassWithTwoMigrationMiddleVersion +{ + public ObjectId Id { get; set; } + public int Doors1 { get; set; } + public string Version { get; set; } = "0.0.0"; +} + +public class TestClassWithTwoMigrationMiddleVersion001 : DocumentMigration +{ + public TestClassWithTwoMigrationMiddleVersion001() : base("0.0.1") { } + + public override void Up(BsonDocument document) + { + var doors = document["Doors0"].ToInt32(); + document.Add("Doors1", doors); + document.Remove("Doors0"); + } + + public override void Down(BsonDocument document) + { + var doors = document["Doors1"].ToInt32(); + document.Add("Doors0", doors); + document.Remove("Doors1"); + } +} + +public class TestClassWithTwoMigrationMiddleVersion002 : DocumentMigration +{ + public TestClassWithTwoMigrationMiddleVersion002() : base("0.0.2") { } + + public override void Up(BsonDocument document) + { + var doors = document["Doors1"].ToInt32(); + document.Add("Doors2", doors); + document.Remove("Doors1"); + } + + public override void Down(BsonDocument document) + { + var doors = document["Doors2"].ToInt32(); + document.Add("Doors1", doors); + document.Remove("Doors2"); + } +} \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs index 07d1143..5d3afb3 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration.cs @@ -5,13 +5,13 @@ namespace Mongo.Migration.Tests.TestDoubles; [RuntimeVersion("0.0.1")] -internal class TestDocumentWithOneMigration : Document +public class TestDocumentWithOneMigration : Document { public ObjectId Id { get; set; } public int Doors { get; set; } } -internal class TestDocumentWithoutAttribute : Document +public class TestDocumentWithoutAttribute : Document { public ObjectId Id { get; set; } public int Doors { get; set; } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs index da5ec18..9f9f6d1 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithOneMigration_0_0_1.cs @@ -3,7 +3,7 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithOneMigration001 : DocumentMigration +public class TestDocumentWithOneMigration001 : DocumentMigration { public TestDocumentWithOneMigration001() : base("0.0.1") diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs index 16b5c23..53a0696 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration.cs @@ -5,7 +5,7 @@ namespace Mongo.Migration.Tests.TestDoubles; [RuntimeVersion("0.0.0")] -internal class TestDocumentWithTwoMigration : Document +public class TestDocumentWithTwoMigration : Document { public ObjectId Id { get; set; } public int Dors { get; set; } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs index 3b7d06f..9beff38 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion.cs @@ -6,7 +6,7 @@ namespace Mongo.Migration.Tests.TestDoubles; [RuntimeVersion("0.0.2")] [CollectionLocation("Test")] -internal class TestDocumentWithTwoMigrationHighestVersion : Document +public class TestDocumentWithTwoMigrationHighestVersion : Document { public ObjectId Id { get; set; } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs index f0a2cad..17435ab 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_1.cs @@ -3,7 +3,7 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigrationHighestVersion001 : DocumentMigration +public class TestDocumentWithTwoMigrationHighestVersion001 : DocumentMigration { public TestDocumentWithTwoMigrationHighestVersion001() : base("0.0.1") diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs index fac98ef..360c613 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationHighestVersion_0_0_2.cs @@ -3,7 +3,7 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigrationHighestVersion002 : DocumentMigration +public class TestDocumentWithTwoMigrationHighestVersion002 : DocumentMigration { public TestDocumentWithTwoMigrationHighestVersion002() : base("0.0.2") diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs index f56b759..f43f1c4 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion.cs @@ -5,7 +5,7 @@ namespace Mongo.Migration.Tests.TestDoubles; [RuntimeVersion("0.0.1")] -internal class TestDocumentWithTwoMigrationMiddleVersion : Document +public class TestDocumentWithTwoMigrationMiddleVersion : Document { public ObjectId Id { get; set; } public int Doors1 { get; set; } diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs index 5f35e47..7b92906 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_1.cs @@ -3,7 +3,7 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigrationMiddleVersion001 : DocumentMigration +public class TestDocumentWithTwoMigrationMiddleVersion001 : DocumentMigration { public TestDocumentWithTwoMigrationMiddleVersion001() : base("0.0.1") diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs index 485d532..8ca4714 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigrationMiddleVersion_0_0_2.cs @@ -3,7 +3,7 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigrationMiddleVersion002 : DocumentMigration +public class TestDocumentWithTwoMigrationMiddleVersion002 : DocumentMigration { public TestDocumentWithTwoMigrationMiddleVersion002() : base("0.0.2") diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs index 98c1e17..789c8fb 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_1.cs @@ -3,7 +3,7 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigration001 : DocumentMigration +public class TestDocumentWithTwoMigration001 : DocumentMigration { public TestDocumentWithTwoMigration001() : base("0.0.1") diff --git a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs index 6ec0b8f..2f81e3b 100644 --- a/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/TestDocumentWithTwoMigration_0_0_2.cs @@ -3,7 +3,7 @@ namespace Mongo.Migration.Tests.TestDoubles; -internal class TestDocumentWithTwoMigration002 : DocumentMigration +public class TestDocumentWithTwoMigration002 : DocumentMigration { public TestDocumentWithTwoMigration002() : base("0.0.2") diff --git a/Mongo.Migration.Tests/TestcontainersContext.cs b/Mongo.Migration.Tests/TestcontainersContext.cs index c9b9612..be9f0ef 100644 --- a/Mongo.Migration.Tests/TestcontainersContext.cs +++ b/Mongo.Migration.Tests/TestcontainersContext.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.Logging.Abstractions; using Mongo.Migration.Services; using Mongo.Migration.Startup; +using Mongo.Migration.Tests.TestDoubles; using MongoDB.Driver; using NUnit.Framework; using Testcontainers.MongoDb; @@ -30,7 +31,15 @@ public async Task OneTimeSetup() services .AddLogging(builder => builder.AddProvider(NullLoggerProvider.Instance)) .AddSingleton(new MongoClient(s_mongoDbContainer.GetConnectionString())) - .AddMigration(); + .AddMigration(builder => + { + builder + .AddDocumentMigratedType("0.0.1"); + + builder.AddRuntimeDocumentMigration() + .AddStartupDocumentMigration() + .AddDatabaseMigration(); + }); s_provider = services.BuildServiceProvider(); diff --git a/Mongo.Migration/Bson/BaseMigrationSerializer.cs b/Mongo.Migration/Bson/BaseMigrationSerializer.cs new file mode 100644 index 0000000..8304e97 --- /dev/null +++ b/Mongo.Migration/Bson/BaseMigrationSerializer.cs @@ -0,0 +1,52 @@ +using MongoDB.Bson.IO; +using MongoDB.Bson.Serialization; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Serializers; +using Mongo.Migration.Migrations.Document; +using Mongo.Migration.Services; +using Mongo.Migration.Documents; + +namespace Mongo.Migration.Bson; +internal abstract class BaseMigrationSerializer : SerializerBase +{ + private static readonly Type s_tDocumentType = typeof(TDocument); + + private readonly IDocumentMigrationRunner _migrationRunner; + + protected string VersionFieldName { get; } + + protected DocumentVersion RuntimeVersion { get; } + + protected string RuntimeVersionString { get; } + + protected BsonClassMapSerializer InnerSerializer { get; } + + protected BaseMigrationSerializer(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) + { + _migrationRunner = migrationRunner; + VersionFieldName = documentVersionService.GetVersionFieldName(); + RuntimeVersion = documentVersionService.GetCurrentOrLatestMigrationVersion(s_tDocumentType); + RuntimeVersionString = RuntimeVersion.ToString(); + BsonClassMap classMap = BsonClassMap.LookupClassMap(s_tDocumentType); + InnerSerializer = new BsonClassMapSerializer(classMap); + } + + public override TDocument Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + BsonReaderBookmark bookmark = context.Reader.GetBookmark(); + + context.Reader.ReadStartDocument(); + string currentVersion = context.Reader.FindStringElement(VersionFieldName); + context.Reader.ReturnToBookmark(bookmark); + + if (RuntimeVersionString == currentVersion) + { + return InnerSerializer.Deserialize(context, args); + } + + BsonDocument document = BsonDocumentSerializer.Instance.Deserialize(context); + _migrationRunner.Run(s_tDocumentType, document, RuntimeVersion); + var migratedContext = BsonDeserializationContext.CreateRoot(new BsonDocumentReader(document)); + return InnerSerializer.Deserialize(migratedContext, args); + } +} diff --git a/Mongo.Migration/Bson/MigrationBsonSerializerProvider.cs b/Mongo.Migration/Bson/MigrationBsonSerializerProvider.cs index 25957fd..804407a 100644 --- a/Mongo.Migration/Bson/MigrationBsonSerializerProvider.cs +++ b/Mongo.Migration/Bson/MigrationBsonSerializerProvider.cs @@ -1,4 +1,5 @@ using Mongo.Migration.Documents; +using Mongo.Migration.Documents.Locators; using Mongo.Migration.Migrations.Document; using Mongo.Migration.Services; using MongoDB.Bson.Serialization; @@ -7,15 +8,19 @@ namespace Mongo.Migration.Bson; internal sealed class MigrationBsonSerializerProvider : IRegistryAwareBsonSerializationProvider { - private static readonly Type s_migrationSerializerGenericType = typeof(MigrationSerializer<>); + private static readonly Type s_migrationDocumentSerializerGenericType = typeof(MigrationDocumentSerializer<>); private static readonly Type s_iDocumentType = typeof(IDocument); + private static readonly Type s_migrationReflexionSerializerGenericType = typeof(MigrationReflexionSerializer<>); + private readonly IRuntimeVersionLocator _runtimeVersionLocator; private readonly object[] _constructorParameters; public MigrationBsonSerializerProvider(IDocumentMigrationRunner migrationRunner, - IDocumentVersionService documentVersionService) + IDocumentVersionService documentVersionService, + IRuntimeVersionLocator runtimeVersionLocator) { - _constructorParameters = new object[] { migrationRunner, documentVersionService }; + _runtimeVersionLocator = runtimeVersionLocator; + _constructorParameters = [migrationRunner, documentVersionService]; } public IBsonSerializer GetSerializer(Type type) @@ -25,17 +30,18 @@ public IBsonSerializer GetSerializer(Type type) public IBsonSerializer GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry) { - if (!ShouldBeMigrated(type)) + if (type.GetInterfaces().Contains(s_iDocumentType)) { - return null!; + var genericType = s_migrationDocumentSerializerGenericType.MakeGenericType(type); + return (IBsonSerializer)Activator.CreateInstance(genericType, _constructorParameters)!; } - var genericType = s_migrationSerializerGenericType.MakeGenericType(type); - return (IBsonSerializer)Activator.CreateInstance(genericType, _constructorParameters)!; - } + if (_runtimeVersionLocator.GetLocateOrNull(type) is not null) + { + var genericType = s_migrationReflexionSerializerGenericType.MakeGenericType(type); + return (IBsonSerializer)Activator.CreateInstance(genericType, _constructorParameters)!; + } - private static bool ShouldBeMigrated(Type type) - { - return type.GetInterfaces().Contains(s_iDocumentType); + return null!; } } \ No newline at end of file diff --git a/Mongo.Migration/Bson/MigrationDocumentSerializer.cs b/Mongo.Migration/Bson/MigrationDocumentSerializer.cs new file mode 100644 index 0000000..aef62f3 --- /dev/null +++ b/Mongo.Migration/Bson/MigrationDocumentSerializer.cs @@ -0,0 +1,18 @@ +using Mongo.Migration.Documents; +using Mongo.Migration.Migrations.Document; +using MongoDB.Bson.Serialization; +using Mongo.Migration.Services; + +namespace Mongo.Migration.Bson; +internal sealed class MigrationDocumentSerializer : BaseMigrationSerializer + where TDocument : IDocument +{ + public MigrationDocumentSerializer(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) + : base(migrationRunner, documentVersionService) { } + + public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TDocument value) + { + value.Version = RuntimeVersion; + InnerSerializer.Serialize(context, args, value); + } +} diff --git a/Mongo.Migration/Bson/MigrationReflexionSerializer.cs b/Mongo.Migration/Bson/MigrationReflexionSerializer.cs new file mode 100644 index 0000000..09620b5 --- /dev/null +++ b/Mongo.Migration/Bson/MigrationReflexionSerializer.cs @@ -0,0 +1,33 @@ +using Mongo.Migration.Migrations.Document; +using Mongo.Migration.Services; +using MongoDB.Bson.Serialization; +using System.Linq.Expressions; + +namespace Mongo.Migration.Bson; +internal sealed class MigrationReflexionSerializer : BaseMigrationSerializer +{ + private readonly Action _versionSetter; + + public MigrationReflexionSerializer(IDocumentMigrationRunner migrationRunner, + IDocumentVersionService documentVersionService) + : base(migrationRunner, documentVersionService) + { + _versionSetter = CreateSetter(VersionFieldName); + } + + public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TDocument value) + { + _versionSetter.Invoke(value, RuntimeVersion); + InnerSerializer.Serialize(context, args, value); + } + + private static Action CreateSetter(string propertyName) + { + var objParam = Expression.Parameter(typeof(T), "x"); + var valueParam = Expression.Parameter(typeof(TProperty), "value"); + var property = Expression.Property(objParam, propertyName); + var assign = Expression.Assign(property, valueParam); + var lambda = Expression.Lambda>(assign, objParam, valueParam); + return lambda.Compile(); + } +} diff --git a/Mongo.Migration/Bson/MigrationSerializer.cs b/Mongo.Migration/Bson/MigrationSerializer.cs deleted file mode 100644 index 9a8a7a2..0000000 --- a/Mongo.Migration/Bson/MigrationSerializer.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Mongo.Migration.Documents; -using Mongo.Migration.Migrations.Document; -using MongoDB.Bson.IO; -using MongoDB.Bson; -using MongoDB.Bson.Serialization; -using MongoDB.Bson.Serialization.Serializers; -using Mongo.Migration.Services; - -namespace Mongo.Migration.Bson; -internal sealed class MigrationSerializer : SerializerBase - where TDocument : IDocument -{ - private static readonly Type s_tDocumentType = typeof(TDocument); - - private readonly IDocumentMigrationRunner _migrationRunner; - - private readonly IDocumentVersionService _documentVersionService; - - private readonly DocumentVersion _runtimeVersion; - - private readonly string _runtimeVersionString; - - private readonly BsonClassMapSerializer _innerSerializer; - - public MigrationSerializer(IDocumentMigrationRunner migrationRunner, IDocumentVersionService documentVersionService) - { - _migrationRunner = migrationRunner; - _documentVersionService = documentVersionService; - _runtimeVersion = _documentVersionService.GetCurrentOrLatestMigrationVersion(s_tDocumentType); - _runtimeVersionString = _runtimeVersion.ToString(); - BsonClassMap classMap = BsonClassMap.LookupClassMap(s_tDocumentType); - _innerSerializer = new BsonClassMapSerializer(classMap); - } - - public override TDocument Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) - { - BsonReaderBookmark bookmark = context.Reader.GetBookmark(); - - context.Reader.ReadStartDocument(); - string currentVersion = context.Reader.FindStringElement(_documentVersionService.GetVersionFieldName()); - context.Reader.ReturnToBookmark(bookmark); - - if (_runtimeVersionString == currentVersion) - { - return _innerSerializer.Deserialize(context, args); - } - - BsonDocument document = BsonDocumentSerializer.Instance.Deserialize(context); - _migrationRunner.Run(s_tDocumentType, document, _runtimeVersion); - var migratedContext = BsonDeserializationContext.CreateRoot(new BsonDocumentReader(document)); - return _innerSerializer.Deserialize(migratedContext, args); - } - - public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TDocument value) - { - value.Version = _runtimeVersion; - _innerSerializer.Serialize(context, args, value); - } -} diff --git a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs b/Mongo.Migration/Documents/Attributes/CollectionLocationAttribute.cs similarity index 69% rename from Mongo.Migration/Documents/Attributes/CollectionLocation.cs rename to Mongo.Migration/Documents/Attributes/CollectionLocationAttribute.cs index 055d59e..28efb9b 100644 --- a/Mongo.Migration/Documents/Attributes/CollectionLocation.cs +++ b/Mongo.Migration/Documents/Attributes/CollectionLocationAttribute.cs @@ -1,11 +1,11 @@ namespace Mongo.Migration.Documents.Attributes; [AttributeUsage(AttributeTargets.Class)] -public class CollectionLocation : Attribute +public class CollectionLocationAttribute : Attribute { public CollectionLocationInformation CollectionInformation { get; } - public CollectionLocation(string collectionName) + public CollectionLocationAttribute(string collectionName) { CollectionInformation = new CollectionLocationInformation(collectionName); } diff --git a/Mongo.Migration/Documents/Attributes/StartUpVersion.cs b/Mongo.Migration/Documents/Attributes/RuntimeVersionAttribute.cs similarity index 67% rename from Mongo.Migration/Documents/Attributes/StartUpVersion.cs rename to Mongo.Migration/Documents/Attributes/RuntimeVersionAttribute.cs index a9fae64..3c58e75 100644 --- a/Mongo.Migration/Documents/Attributes/StartUpVersion.cs +++ b/Mongo.Migration/Documents/Attributes/RuntimeVersionAttribute.cs @@ -1,11 +1,11 @@ namespace Mongo.Migration.Documents.Attributes; [AttributeUsage(AttributeTargets.Class)] -public class StartUpVersion : Attribute +public class RuntimeVersionAttribute : Attribute { public DocumentVersion Version { get; } - public StartUpVersion(string version) + public RuntimeVersionAttribute(string version) { Version = DocumentVersion.Parse(version.AsSpan()); } diff --git a/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs b/Mongo.Migration/Documents/Attributes/StartUpVersionAttribute.cs similarity index 67% rename from Mongo.Migration/Documents/Attributes/RuntimeVersion.cs rename to Mongo.Migration/Documents/Attributes/StartUpVersionAttribute.cs index fd0d882..0958949 100644 --- a/Mongo.Migration/Documents/Attributes/RuntimeVersion.cs +++ b/Mongo.Migration/Documents/Attributes/StartUpVersionAttribute.cs @@ -1,11 +1,11 @@ namespace Mongo.Migration.Documents.Attributes; [AttributeUsage(AttributeTargets.Class)] -public class RuntimeVersion : Attribute +public class StartUpVersionAttribute : Attribute { public DocumentVersion Version { get; } - public RuntimeVersion(string version) + public StartUpVersionAttribute(string version) { Version = DocumentVersion.Parse(version.AsSpan()); } diff --git a/Mongo.Migration/Documents/Locators/AbstractLocator.cs b/Mongo.Migration/Documents/Locators/AbstractLocator.cs index c0c0138..fdd9c80 100644 --- a/Mongo.Migration/Documents/Locators/AbstractLocator.cs +++ b/Mongo.Migration/Documents/Locators/AbstractLocator.cs @@ -1,3 +1,5 @@ +using System.Reflection; + namespace Mongo.Migration.Documents.Locators; public abstract class AbstractLocator : ILocator @@ -24,4 +26,13 @@ protected IDictionary LocatesDictionary public abstract TReturnType? GetLocateOrNull(TTypeIdentifier identifier); public abstract void Locate(); + + protected IEnumerable<(Type, TAttribute)> LocateAttributes() where TAttribute : Attribute + { + return AppDomain.CurrentDomain.GetAssemblies() + .SelectMany(a => a.GetExportedTypes()) + .Select(t => (t, t.GetCustomAttributes(true).FirstOrDefault())) + .Where(tuple => tuple.Item2 is not null) + .Cast<(Type, TAttribute)>(); + } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/CollectionLocator.cs b/Mongo.Migration/Documents/Locators/CollectionLocator.cs index b2e4a2f..d541d6b 100644 --- a/Mongo.Migration/Documents/Locators/CollectionLocator.cs +++ b/Mongo.Migration/Documents/Locators/CollectionLocator.cs @@ -1,4 +1,5 @@ using Mongo.Migration.Documents.Attributes; +using System.Collections.Frozen; namespace Mongo.Migration.Documents.Locators; @@ -17,22 +18,8 @@ public class CollectionLocator : AbstractLocator 0 } - select new { Type = t, Attributes = attributes.Cast() }; - - var versions = new Dictionary(); - - foreach (var type in types) - { - var version = type.Attributes.First().CollectionInformation; - versions.Add(type.Type, version); - } - - LocatesDictionary = versions; + LocatesDictionary = LocateAttributes() + .ToFrozenDictionary(pair => pair.Item1, pair => pair.Item2.CollectionInformation); } public IDictionary GetLocatesOrEmpty() diff --git a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs index d4cdb0a..7bdcca6 100644 --- a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs @@ -1,37 +1,35 @@ -using Mongo.Migration.Documents.Attributes; +using System.Collections.Frozen; +using Mongo.Migration.Documents.Attributes; namespace Mongo.Migration.Documents.Locators; internal class RuntimeVersionLocator : AbstractLocator, IRuntimeVersionLocator { + private readonly FrozenDictionary _codeDefinedDictionary; + + internal RuntimeVersionLocator(IEnumerable> alreadyDefinedRuntimeVersions) + { + _codeDefinedDictionary = alreadyDefinedRuntimeVersions.ToFrozenDictionary(); + } + public override DocumentVersion? GetLocateOrNull(Type identifier) { - if (!LocatesDictionary.ContainsKey(identifier)) + if (_codeDefinedDictionary.TryGetValue(identifier, out DocumentVersion version)) + { + return version; + } + + if (LocatesDictionary.TryGetValue(identifier, out version)) { - return null; + return version; } - LocatesDictionary.TryGetValue(identifier, out var value); - return value; + return null; } public override void Locate() { - var types = - from a in AppDomain.CurrentDomain.GetAssemblies() - from t in a.GetTypes() - let attributes = t.GetCustomAttributes(typeof(RuntimeVersion), true) - where attributes is {Length: > 0} - select new { Type = t, Attributes = attributes.Cast() }; - - var versions = new Dictionary(); - - foreach (var type in types) - { - var version = type.Attributes.First().Version; - versions.Add(type.Type, version); - } - - LocatesDictionary = versions; + LocatesDictionary = LocateAttributes() + .ToFrozenDictionary(pair => pair.Item1, pair => pair.Item2.Version); } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs index 5d3623f..2941f3a 100644 --- a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs @@ -1,4 +1,5 @@ -using Mongo.Migration.Documents.Attributes; +using System.Collections.Frozen; +using Mongo.Migration.Documents.Attributes; namespace Mongo.Migration.Documents.Locators; @@ -17,21 +18,7 @@ internal class StartUpVersionLocator : AbstractLocator, I public override void Locate() { - var types = - from a in AppDomain.CurrentDomain.GetAssemblies() - from t in a.GetTypes() - let attributes = t.GetCustomAttributes(typeof(StartUpVersion), true) - where attributes is {Length: > 0} - select new { Type = t, Attributes = attributes.Cast() }; - - var versions = new Dictionary(); - - foreach (var type in types) - { - var version = type.Attributes.First().Version; - versions.Add(type.Type, version); - } - - LocatesDictionary = versions; + LocatesDictionary = LocateAttributes() + .ToFrozenDictionary(pair => pair.Item1, pair => pair.Item2.Version); } } \ No newline at end of file diff --git a/Mongo.Migration/Exceptions/DuplicateVersionException.cs b/Mongo.Migration/Exceptions/DuplicateVersionException.cs index 5d31990..5cad71f 100644 --- a/Mongo.Migration/Exceptions/DuplicateVersionException.cs +++ b/Mongo.Migration/Exceptions/DuplicateVersionException.cs @@ -1,6 +1,6 @@ namespace Mongo.Migration.Exceptions; -internal class DuplicateVersionException : Exception +public class DuplicateVersionException : Exception { public DuplicateVersionException(string typeName, string version) : base($"Migration '{typeName}' contains duplicate version: {version}") diff --git a/Mongo.Migration/Exceptions/RuntimeVersionDefinitionException.cs b/Mongo.Migration/Exceptions/RuntimeVersionDefinitionException.cs new file mode 100644 index 0000000..d07199d --- /dev/null +++ b/Mongo.Migration/Exceptions/RuntimeVersionDefinitionException.cs @@ -0,0 +1,14 @@ +using Mongo.Migration.Documents; + +namespace Mongo.Migration.Exceptions; +public class RuntimeVersionDefinitionException : Exception +{ + internal RuntimeVersionDefinitionException( + Type type, + DocumentVersion addMigrationRuntimeVersionDefinition, + DocumentVersion attributeRuntimeVersionDefinition) + : base($"Migrated type {type.Name} runtime version definition conflict: AddMigration<{type.Name}>@{addMigrationRuntimeVersionDefinition} != RuntimeVersionAttribute({attributeRuntimeVersionDefinition})") + { + + } +} diff --git a/Mongo.Migration/Migrations/Document/DocumentMigration.cs b/Mongo.Migration/Migrations/Document/DocumentMigration.cs index 50a2b11..1985305 100644 --- a/Mongo.Migration/Migrations/Document/DocumentMigration.cs +++ b/Mongo.Migration/Migrations/Document/DocumentMigration.cs @@ -4,7 +4,6 @@ namespace Mongo.Migration.Migrations.Document; public abstract class DocumentMigration : IDocumentMigration - where TClass : IDocument { protected DocumentMigration(string version) { diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index 47c99c5..3f51483 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -1,7 +1,7 @@  - net7.0;net8.0 + net8.0 enable enable op-icon.png diff --git a/Mongo.Migration/Services/DocumentVersionService.cs b/Mongo.Migration/Services/DocumentVersionService.cs index 40b423a..6e63cfe 100644 --- a/Mongo.Migration/Services/DocumentVersionService.cs +++ b/Mongo.Migration/Services/DocumentVersionService.cs @@ -12,6 +12,7 @@ namespace Mongo.Migration.Services; internal sealed class DocumentVersionService : IDocumentVersionService { private const string DefaultVersionFieldName = "Version"; + private readonly IMigrationLocator _migrationLocator; @@ -73,7 +74,7 @@ public void DetermineVersion(TClass instance) var type = typeof(TClass); var documentVersion = instance.Version; var latestVersion = _migrationLocator.GetLatestVersion(type); - var currentVersion = _runtimeVersionLocator.GetLocateOrNull(type) ?? latestVersion; + var currentVersion = GetCurrentVersion(type) ?? latestVersion; if (documentVersion == currentVersion) { diff --git a/Mongo.Migration/Services/IDocumentVersionService.cs b/Mongo.Migration/Services/IDocumentVersionService.cs index 5243af3..27afc4e 100644 --- a/Mongo.Migration/Services/IDocumentVersionService.cs +++ b/Mongo.Migration/Services/IDocumentVersionService.cs @@ -1,5 +1,4 @@ using Mongo.Migration.Documents; -using Mongo.Migration.Migrations.Document; using MongoDB.Bson; namespace Mongo.Migration.Services; diff --git a/Mongo.Migration/Startup/MongoMigrationBuilder.cs b/Mongo.Migration/Startup/MongoMigrationBuilder.cs deleted file mode 100644 index d080911..0000000 --- a/Mongo.Migration/Startup/MongoMigrationBuilder.cs +++ /dev/null @@ -1,99 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Mongo.Migration.Bson; -using Mongo.Migration.Documents.Locators; -using Mongo.Migration.Migrations.Database; -using Mongo.Migration.Migrations.Document; -using Mongo.Migration.Migrations.Locators; -using Mongo.Migration.Services; - -namespace Mongo.Migration.Startup; - -public class MongoMigrationBuilder -{ - private readonly IServiceCollection _services; - private readonly MongoMigrationSettings _mongoMigrationSettings; - private readonly MongoMigrationStartupSettings _mongoMigrationStartupSettings; - - private bool _interceptorAdded; - - internal MongoMigrationBuilder(IServiceCollection services) - { - _services = services; - _mongoMigrationSettings = new MongoMigrationSettings(); - _mongoMigrationStartupSettings = new MongoMigrationStartupSettings(); - - _services - .AddSingleton(_mongoMigrationSettings) - .AddSingleton(_mongoMigrationStartupSettings) - .AddTransient(); - } - - public string VersionFieldName - { - get => _mongoMigrationSettings.VersionFieldName; - set => _mongoMigrationSettings.VersionFieldName = value; - } - - public MongoMigrationBuilder AddRuntimeDocumentMigration() - { - AddInterceptorServices(); - - _services - .AddSingleton(); - - _mongoMigrationStartupSettings.RuntimeMigrationEnabled = true; - return this; - } - - public MongoMigrationBuilder AddStartupDocumentMigration() - { - AddInterceptorServices(); - - _services - .AddTransient() - .AddTransient(); - - _mongoMigrationStartupSettings.StartupDocumentMigrationEnabled = true; - - return this; - } - - public MongoMigrationBuilder AddDatabaseMigration() - { - _services - .AddTransient() - .AddTransient() - .AddTransient(); - - _mongoMigrationStartupSettings.DatabaseMigrationEnabled = true; - - return this; - } - - public void AddAllMigrationsIfNothingWasAdded() - { - if (_mongoMigrationStartupSettings is { RuntimeMigrationEnabled: false, StartupDocumentMigrationEnabled: false, DatabaseMigrationEnabled: false }) - { - AddRuntimeDocumentMigration(); - AddDatabaseMigration(); - AddStartupDocumentMigration(); - } - } - - private void AddInterceptorServices() - { - if (_interceptorAdded) - { - return; - } - - _services - .AddSingleton, TypeMigrationLocator>() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton(); - - _interceptorAdded = true; - } -} \ No newline at end of file diff --git a/Mongo.Migration/Startup/MongoMigrationConfigurator.cs b/Mongo.Migration/Startup/MongoMigrationConfigurator.cs new file mode 100644 index 0000000..fabf142 --- /dev/null +++ b/Mongo.Migration/Startup/MongoMigrationConfigurator.cs @@ -0,0 +1,77 @@ +using Mongo.Migration.Documents.Attributes; +using Mongo.Migration.Documents; +using Mongo.Migration.Exceptions; +using System.Reflection; + +namespace Mongo.Migration.Startup; + +public class MongoMigrationConfigurator +{ + internal MongoMigrationSettings MongoMigrationSettings { get; } + internal MongoMigrationStartupSettings MongoMigrationStartupSettings { get; } + internal Dictionary RuntimeMigrationDictionary { get; } + + internal MongoMigrationConfigurator() + { + MongoMigrationSettings = new MongoMigrationSettings(); + MongoMigrationStartupSettings = new MongoMigrationStartupSettings(); + RuntimeMigrationDictionary = new Dictionary(); + } + + public MongoMigrationConfigurator SetVersionFieldName(string fieldName) + { + MongoMigrationSettings.VersionFieldName = fieldName; + return this; + } + + public MongoMigrationConfigurator AddRuntimeDocumentMigration() + { + MongoMigrationStartupSettings.RuntimeMigrationEnabled = true; + return this; + } + + public MongoMigrationConfigurator AddStartupDocumentMigration() + { + MongoMigrationStartupSettings.StartupDocumentMigrationEnabled = true; + return this; + } + + public MongoMigrationConfigurator AddDocumentMigratedType(DocumentVersion runtimeVersion) + { + Type t = typeof(T); + RuntimeVersionAttribute? runtimeVersionAttribute = t.GetCustomAttributes(true) + .FirstOrDefault(); + + if (runtimeVersionAttribute is null || runtimeVersionAttribute.Version == runtimeVersion) + { + RuntimeMigrationDictionary.Add(t, runtimeVersion); + } + else + { + throw new RuntimeVersionDefinitionException(t, runtimeVersion, runtimeVersionAttribute.Version); + } + + return this; + } + + public MongoMigrationConfigurator AddDocumentMigratedType(string runtimeVersion) + { + return AddDocumentMigratedType(DocumentVersion.Parse(runtimeVersion.AsSpan())); + } + + public MongoMigrationConfigurator AddDatabaseMigration() + { + MongoMigrationStartupSettings.DatabaseMigrationEnabled = true; + return this; + } + + internal void AddAllMigrationsIfNothingWasAdded() + { + if (MongoMigrationStartupSettings is { RuntimeMigrationEnabled: false, StartupDocumentMigrationEnabled: false, DatabaseMigrationEnabled: false }) + { + AddRuntimeDocumentMigration(); + AddDatabaseMigration(); + AddStartupDocumentMigration(); + } + } +} \ No newline at end of file diff --git a/Mongo.Migration/Startup/MongoMigrationExtensions.cs b/Mongo.Migration/Startup/MongoMigrationExtensions.cs index cb1395c..778b836 100644 --- a/Mongo.Migration/Startup/MongoMigrationExtensions.cs +++ b/Mongo.Migration/Startup/MongoMigrationExtensions.cs @@ -1,4 +1,9 @@ using Microsoft.Extensions.DependencyInjection; +using Mongo.Migration.Bson; +using Mongo.Migration.Documents.Locators; +using Mongo.Migration.Migrations.Database; +using Mongo.Migration.Migrations.Document; +using Mongo.Migration.Migrations.Locators; using Mongo.Migration.Services; namespace Mongo.Migration.Startup; @@ -6,17 +11,64 @@ public static class MongoMigrationExtensions { public static IServiceCollection AddMigration( this IServiceCollection services, - Action? configure = null) + Action? configure = null) { - MongoMigrationBuilder builder = new MongoMigrationBuilder(services); + MongoMigrationConfigurator configurator = new MongoMigrationConfigurator(); - configure?.Invoke(builder); + configure?.Invoke(configurator); - builder.AddAllMigrationsIfNothingWasAdded(); + configurator.AddAllMigrationsIfNothingWasAdded(); + + BuildDocumentMigration(services, configurator); + + BuildDatabaseMigration(services, configurator); + + services + .AddSingleton(configurator.MongoMigrationSettings) + .AddSingleton(configurator.MongoMigrationStartupSettings) + .AddTransient(); return services; } + private static void BuildDocumentMigration(IServiceCollection services, MongoMigrationConfigurator migrationConfigurator) + { + if (migrationConfigurator.MongoMigrationStartupSettings.RuntimeMigrationEnabled || + migrationConfigurator.MongoMigrationStartupSettings.StartupDocumentMigrationEnabled) + { + services + .AddSingleton, TypeMigrationLocator>() + .AddSingleton(new RuntimeVersionLocator(migrationConfigurator.RuntimeMigrationDictionary)) + .AddSingleton() + .AddSingleton() + .AddSingleton(); + + if (migrationConfigurator.MongoMigrationStartupSettings.RuntimeMigrationEnabled) + { + services + .AddSingleton(); + } + + if (migrationConfigurator.MongoMigrationStartupSettings.StartupDocumentMigrationEnabled) + { + services + .AddTransient() + .AddTransient(); + } + } + } + + private static void BuildDatabaseMigration(IServiceCollection services, MongoMigrationConfigurator migrationConfigurator) + { + if (migrationConfigurator.MongoMigrationStartupSettings.DatabaseMigrationEnabled) + { + services + .AddTransient() + .AddTransient() + .AddTransient(); + } + } + public static async Task InitializeAndMigrateAsync(this IMigrationService migrationService, string databaseName, string? targetDatabaseVersion, From efc16c98895c9d1e7d09835eff776a1a5a3069bf Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Wed, 26 Feb 2025 12:47:51 +0100 Subject: [PATCH 21/42] finalize --- .../Documents/DocumentVersion_When_casting.cs | 4 +- .../Documents/Document_when_creating.cs | 4 +- ...rializer_when_serialize_and_deserialize.cs | 2 +- ...baseMigrationRunner_when_migrating_down.cs | 22 +- ...tabaseMigrationRunner_when_migrating_up.cs | 41 +- ...mentMigrationRunner_when_migrating_down.cs | 14 +- ...cumentMigrationRunner_when_migrating_up.cs | 22 +- .../Mongo.Migration.Tests.csproj | 9 +- .../Performance/PerformanceOnStartup.cs | 12 +- .../PerformanceRuntimeMigration.cs | 8 +- .../TestcontainersContext.cs | 18 +- Mongo.Migration.sln | 4 +- .../Documents/Locators/CollectionLocator.cs | 9 + .../Locators/RuntimeVersionLocator.cs | 18 +- .../Locators/StartUpVersionLocator.cs | 12 +- .../Migrations/Database/MigrationHistory.cs | 8 +- .../Migrations/Locators/MigrationLocator.cs | 2 +- Mongo.Migration/Mongo.Migration.csproj | 11 +- Mongo.Migration/Services/IMigrationService.cs | 32 +- Mongo.Migration/Services/MigrationService.cs | 10 +- .../Startup/MongoMigrationExtensions.cs | 12 +- Readme.md | 595 ++++++------------ 22 files changed, 385 insertions(+), 484 deletions(-) diff --git a/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs index 9f6c401..4710144 100644 --- a/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs +++ b/Mongo.Migration.Tests/Documents/DocumentVersion_When_casting.cs @@ -9,8 +9,8 @@ public class DocumentVersionWhenCasting [Test] public void If_implicit_string_to_version_Then_cast_should_work() { - DocumentVersion version = new DocumentVersion(1,0,2); - Assert.That(version == "1.0.2", Is.True); + DocumentVersion version = new(1,0,2); + Assert.That(version.ToString(), Is.EqualTo("1.0.2")); } [Test] diff --git a/Mongo.Migration.Tests/Documents/Document_when_creating.cs b/Mongo.Migration.Tests/Documents/Document_when_creating.cs index a294c88..69f588d 100644 --- a/Mongo.Migration.Tests/Documents/Document_when_creating.cs +++ b/Mongo.Migration.Tests/Documents/Document_when_creating.cs @@ -10,7 +10,7 @@ public class DocumentWhenCreating public void Then_document_can_be_created() { // Arrange Act - IDocument document = new Document(); + Document document = new(); // Assert Assert.That(document, Is.TypeOf()); @@ -20,7 +20,7 @@ public void Then_document_can_be_created() public void Then_document_has_a_version() { // Arrange - IDocument document = new Document(); + Document document = new(); // Act var version = document.Version; diff --git a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs index 3f99e5e..7231754 100644 --- a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs +++ b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs @@ -63,7 +63,7 @@ private static BsonDocumentReader CreateVersionReader(BsonDocument document) private static BsonDocumentWriter CreateVersionWriter() { - var writer = new BsonDocumentWriter(new()); + var writer = new BsonDocumentWriter(new BsonDocument()); writer.WriteStartDocument(); writer.WriteName("version"); return writer; diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs index 8c69b60..0eef9c1 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_down.cs @@ -17,12 +17,11 @@ public async Task When_database_has_migrations_Then_down_all_migrations() // Arrange InsertMigrations( - new DatabaseMigration[] - { - new TestDatabaseMigration001(), - new TestDatabaseMigration002(), - new TestDatabaseMigration003() - }); + [ + new TestDatabaseMigration001(), + new TestDatabaseMigration002(), + new TestDatabaseMigration003() + ]); // Act await runner.RunAsync(Db, DocumentVersion.Default); @@ -40,12 +39,11 @@ public async Task When_database_has_migrations_Then_down_to_selected_migration() // Arrange InsertMigrations( - new DatabaseMigration[] - { - new TestDatabaseMigration001(), - new TestDatabaseMigration002(), - new TestDatabaseMigration003() - }); + [ + new TestDatabaseMigration001(), + new TestDatabaseMigration002(), + new TestDatabaseMigration003() + ]); // Act await runner.RunAsync(Db, new DocumentVersion(0, 0, 1)); diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs index 8e766ce..33ba1e5 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs @@ -21,10 +21,14 @@ public async Task When_database_has_no_migrations_Then_all_migrations_are_used() // Assert var migrations = GetMigrationHistory(); - Assert.That(migrations, Is.Not.Empty); - Assert.That(migrations[0].Version.ToString(), Is.EqualTo("0.0.1")); - Assert.That(migrations[1].Version.ToString(), Is.EqualTo("0.0.2")); - Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); + + Assert.Multiple(() => + { + Assert.That(migrations, Is.Not.Empty); + Assert.That(migrations[0].Version.ToString(), Is.EqualTo("0.0.1")); + Assert.That(migrations[1].Version.ToString(), Is.EqualTo("0.0.2")); + Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); + }); } [Test] @@ -33,15 +37,19 @@ public async Task When_database_has_migrations_Then_latest_migrations_are_used() // Arrange await OnSetUpAsync(); IDatabaseMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); - InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration001(), new TestDatabaseMigration002() }); + InsertMigrations([new TestDatabaseMigration001(), new TestDatabaseMigration002()]); // Act await runner.RunAsync(Db, DocumentVersion.Empty); // Assert var migrations = GetMigrationHistory(); - Assert.That(migrations, Is.Not.Empty); - Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); + + Assert.Multiple(() => + { + Assert.That(migrations, Is.Not.Empty); + Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); + }); } [Test] @@ -50,7 +58,12 @@ public async Task When_database_has_latest_version_Then_nothing_happens() // Arrange await OnSetUpAsync(); IDatabaseMigrationRunner runner = TestcontainersContext.Provider.GetRequiredService(); - InsertMigrations(new DatabaseMigration[] { new TestDatabaseMigration001(), new TestDatabaseMigration002(), new TestDatabaseMigration003() }); + InsertMigrations( + [ + new TestDatabaseMigration001(), + new TestDatabaseMigration002(), + new TestDatabaseMigration003() + ]); // Act await runner.RunAsync(Db, DocumentVersion.Empty, CancellationToken.None); @@ -58,10 +71,12 @@ public async Task When_database_has_latest_version_Then_nothing_happens() // Assert var migrations = GetMigrationHistory(); - - Assert.That(migrations, Is.Not.Empty); - Assert.That(migrations[0].Version.ToString(), Is.EqualTo("0.0.1")); - Assert.That(migrations[1].Version.ToString(), Is.EqualTo("0.0.2")); - Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); + Assert.Multiple(() => + { + Assert.That(migrations, Is.Not.Empty); + Assert.That(migrations[0].Version.ToString(), Is.EqualTo("0.0.1")); + Assert.That(migrations[1].Version.ToString(), Is.EqualTo("0.0.2")); + Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); + }); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs index 5022270..9c218a7 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs @@ -24,8 +24,11 @@ public void When_migrating_down_Then_all_migrations_are_used() runner.Run(typeof(TestDocumentWithTwoMigration), document); // Assert - Assert.That(document.Names.ToList()[1], Is.EqualTo("Dors")); - Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.0")); + Assert.Multiple(() => + { + Assert.That(document.Names.ToList()[1], Is.EqualTo("Dors")); + Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.0")); + }); } [Test] @@ -43,7 +46,10 @@ public void When_document_has_Then_all_migrations_are_used_to_that_version() runner.Run(typeof(TestDocumentWithTwoMigrationMiddleVersion), document); // Assert - Assert.That(document.Names.ToList()[1], Is.EqualTo("Doors1")); - Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.1")); + Assert.Multiple(() => + { + Assert.That(document.Names.ToList()[1], Is.EqualTo("Doors1")); + Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.1")); + }); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs index e2eed0f..a6eced9 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs @@ -24,8 +24,11 @@ public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert - Assert.That(document.Names.ToList()[1], Is.EqualTo("Door")); - Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.2")); + Assert.Multiple(() => + { + Assert.That(document.Names.ToList()[1], Is.EqualTo("Door")); + Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.2")); + }); } [Test] @@ -42,8 +45,11 @@ public void When_document_has_no_version_Then_all_migrations_are_used() runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert - Assert.That(document["Door"].AsInt32, Is.EqualTo(3)); - Assert.That(document["Version"].AsString, Is.EqualTo("0.0.2")); + Assert.Multiple(() => + { + Assert.That(document["Door"].AsInt32, Is.EqualTo(3)); + Assert.That(document["Version"].AsString, Is.EqualTo("0.0.2")); + }); } [Test] @@ -61,8 +67,10 @@ public void When_document_has_current_version_Then_nothing_happens() runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert - - Assert.That(document.Names.ToList()[1], Is.EqualTo("Door")); - Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.2")); + Assert.Multiple(() => + { + Assert.That(document.Names.ToList()[1], Is.EqualTo("Door")); + Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.2")); + }); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj index 67687a9..cfd534b 100644 --- a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj +++ b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj @@ -1,7 +1,8 @@  - net8.0 + net7.0;net8.0;net9.0 + 13.0 enable enable false @@ -16,13 +17,13 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index d36f6d9..3a2b7a4 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -11,13 +11,13 @@ namespace Mongo.Migration.Tests.Performance; [TestFixture] public class PerformanceTestOnStartup { - private const int DocumentCount = 10000; + private const int DocumentCount = 5000; private const string DatabaseName = "PerformanceTest"; private const string CollectionName = "Test"; - private const int ToleranceMs = 2800; + private const int ToleranceMs = 600; [Test] public async Task When_migrating_number_of_documents() @@ -33,7 +33,7 @@ public async Task When_migrating_number_of_documents() await InsertDocumentsAsync(DocumentCount); var sw = new Stopwatch(); sw.Start(); - await QueryAllAsync(false); + var _ = await QueryAllAsync(false); sw.Stop(); ClearCollection(); @@ -76,7 +76,7 @@ private static Task InsertDocumentsAsync(int documentCount) .InsertManyAsync(documents); } - private static async Task QueryAllAsync(bool withVersion) + private static async Task> QueryAllAsync(bool withVersion) { IMongoClient client = TestcontainersContext.MongoClient; @@ -85,11 +85,13 @@ private static async Task QueryAllAsync(bool withVersion) var versionedCollection = client.GetDatabase(DatabaseName) .GetCollection(CollectionName); var versionedResult = await (await versionedCollection.FindAsync(_ => true)).ToListAsync(); - return; + return versionedResult.Cast().ToList(); } + var collection = client.GetDatabase(DatabaseName) .GetCollection(CollectionName); var result = await (await collection.FindAsync(_ => true)).ToListAsync(); + return result.Cast().ToList(); } private static async Task AddDocumentsToCacheAsync() diff --git a/Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs b/Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs index 677ad1c..c128b4d 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceRuntimeMigration.cs @@ -20,14 +20,14 @@ public Task TearDownAsync() .DeleteManyAsync(FilterDefinition.Empty); } - private IMongoCollection GetCollection() + private static IMongoCollection GetCollection() { return TestcontainersContext.MongoClient .GetDatabase(DatabaseName) .GetCollection(CollectionName); } - private Task InsertDocumentsAsync(int documentCount, Func documentFactory) + private static Task InsertDocumentsAsync(int documentCount, Func documentFactory) { var documents = Enumerable .Range(0, documentCount) @@ -71,7 +71,7 @@ public async Task MeasureRead2Migrations(int documentCount, long msDurationThres }); IMongoCollection collection = GetCollection(); - TestDocumentWithTwoMigrationHighestVersion? initDocument = collection.AsQueryable().FirstOrDefault(); + TestDocumentWithTwoMigrationHighestVersion? _ = collection.AsQueryable().FirstOrDefault(); Stopwatch sw = Stopwatch.StartNew(); List results = await (await collection.FindAsync(FilterDefinition.Empty)).ToListAsync(); @@ -94,7 +94,7 @@ public async Task MeasureReadNoMigration(int documentCount, long msDurationThres }); IMongoCollection collection = GetCollection(); - TestDocumentWithTwoMigrationHighestVersion? initDocument = collection.AsQueryable().FirstOrDefault(); + TestDocumentWithTwoMigrationHighestVersion? _ = collection.AsQueryable().FirstOrDefault(); Stopwatch sw = Stopwatch.StartNew(); List results = await (await collection.FindAsync(FilterDefinition.Empty)).ToListAsync(); diff --git a/Mongo.Migration.Tests/TestcontainersContext.cs b/Mongo.Migration.Tests/TestcontainersContext.cs index be9f0ef..fe3db24 100644 --- a/Mongo.Migration.Tests/TestcontainersContext.cs +++ b/Mongo.Migration.Tests/TestcontainersContext.cs @@ -13,7 +13,9 @@ namespace Mongo.Migration.Tests; [SetUpFixture] public sealed class TestcontainersContext { - private static readonly MongoDbContainer s_mongoDbContainer = new MongoDbBuilder().Build(); + private static readonly Lazy s_lazyMongoDbContainer = new(() => + new MongoDbBuilder().Build() + ); private static ServiceProvider? s_provider; @@ -25,18 +27,18 @@ public sealed class TestcontainersContext [OneTimeSetUp] public async Task OneTimeSetup() { - await s_mongoDbContainer.StartAsync(); + await s_lazyMongoDbContainer.Value.StartAsync(); IServiceCollection services = new ServiceCollection(); services .AddLogging(builder => builder.AddProvider(NullLoggerProvider.Instance)) - .AddSingleton(new MongoClient(s_mongoDbContainer.GetConnectionString())) - .AddMigration(builder => + .AddSingleton(new MongoClient(s_lazyMongoDbContainer.Value.GetConnectionString())) + .AddMigration(cfg => { - builder + cfg .AddDocumentMigratedType("0.0.1"); - builder.AddRuntimeDocumentMigration() + cfg.AddRuntimeDocumentMigration() .AddStartupDocumentMigration() .AddDatabaseMigration(); }); @@ -55,7 +57,7 @@ public async Task OneTimeTearDown() await s_provider.DisposeAsync(); } - await s_mongoDbContainer.StopAsync(); - await s_mongoDbContainer.DisposeAsync(); + await s_lazyMongoDbContainer.Value.StopAsync(); + await s_lazyMongoDbContainer.Value.DisposeAsync(); } } \ No newline at end of file diff --git a/Mongo.Migration.sln b/Mongo.Migration.sln index 87f6847..2477102 100644 --- a/Mongo.Migration.sln +++ b/Mongo.Migration.sln @@ -20,8 +20,8 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Debug|Any CPU.ActiveCfg = Debug|x64 - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Debug|Any CPU.Build.0 = Debug|x64 + {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Debug|Any CPU.Build.0 = Debug|Any CPU {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Release|Any CPU.ActiveCfg = Debug|Any CPU {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Release|Any CPU.Build.0 = Debug|Any CPU {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU diff --git a/Mongo.Migration/Documents/Locators/CollectionLocator.cs b/Mongo.Migration/Documents/Locators/CollectionLocator.cs index d541d6b..ae5632f 100644 --- a/Mongo.Migration/Documents/Locators/CollectionLocator.cs +++ b/Mongo.Migration/Documents/Locators/CollectionLocator.cs @@ -1,5 +1,9 @@ using Mongo.Migration.Documents.Attributes; +#if NET8_0_OR_GREATER using System.Collections.Frozen; +#else +using System.Collections.Immutable; +#endif namespace Mongo.Migration.Documents.Locators; @@ -19,7 +23,12 @@ public class CollectionLocator : AbstractLocator() +#if NET8_0_OR_GREATER .ToFrozenDictionary(pair => pair.Item1, pair => pair.Item2.CollectionInformation); +#else + .ToImmutableDictionary(pair => pair.Item1, pair => pair.Item2.CollectionInformation); +#endif + } public IDictionary GetLocatesOrEmpty() diff --git a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs index 7bdcca6..47ea10e 100644 --- a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs @@ -1,15 +1,27 @@ -using System.Collections.Frozen; +#if NET8_0_OR_GREATER +using System.Collections.Frozen; +#else +using System.Collections.Immutable; +#endif using Mongo.Migration.Documents.Attributes; namespace Mongo.Migration.Documents.Locators; internal class RuntimeVersionLocator : AbstractLocator, IRuntimeVersionLocator { +#if NET8_0_OR_GREATER private readonly FrozenDictionary _codeDefinedDictionary; +#else + private readonly ImmutableDictionary _codeDefinedDictionary; +#endif internal RuntimeVersionLocator(IEnumerable> alreadyDefinedRuntimeVersions) { +#if NET8_0_OR_GREATER _codeDefinedDictionary = alreadyDefinedRuntimeVersions.ToFrozenDictionary(); +#else + _codeDefinedDictionary = alreadyDefinedRuntimeVersions.ToImmutableDictionary(); +#endif } public override DocumentVersion? GetLocateOrNull(Type identifier) @@ -30,6 +42,10 @@ internal RuntimeVersionLocator(IEnumerable> public override void Locate() { LocatesDictionary = LocateAttributes() +#if NET8_0_OR_GREATER .ToFrozenDictionary(pair => pair.Item1, pair => pair.Item2.Version); +#else + .ToImmutableDictionary(pair => pair.Item1, pair => pair.Item2.Version); +#endif } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs index 2941f3a..cb889ad 100644 --- a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs @@ -1,4 +1,8 @@ -using System.Collections.Frozen; +#if NET8_0_OR_GREATER +using System.Collections.Frozen; +#else +using System.Collections.Immutable; +#endif using Mongo.Migration.Documents.Attributes; namespace Mongo.Migration.Documents.Locators; @@ -19,6 +23,10 @@ internal class StartUpVersionLocator : AbstractLocator, I public override void Locate() { LocatesDictionary = LocateAttributes() - .ToFrozenDictionary(pair => pair.Item1, pair => pair.Item2.Version); +#if NET8_0_OR_GREATER + .ToFrozenDictionary(pair => pair.Item1, pair => pair.Item2.Version); +#else + .ToImmutableDictionary(pair => pair.Item1, pair => pair.Item2.Version); +#endif } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Database/MigrationHistory.cs b/Mongo.Migration/Migrations/Database/MigrationHistory.cs index cd1ed01..a003511 100644 --- a/Mongo.Migration/Migrations/Database/MigrationHistory.cs +++ b/Mongo.Migration/Migrations/Database/MigrationHistory.cs @@ -4,11 +4,11 @@ namespace Mongo.Migration.Migrations.Database; -public class MigrationHistory +public record MigrationHistory { - public ObjectId Id { get; set; } + public ObjectId Id { get; init; } - public required string MigrationId { get; set; } + public required string MigrationId { get; init; } - public DocumentVersion Version { get; set; } + public DocumentVersion Version { get; init; } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs index dba0f5a..ba45a6f 100644 --- a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs @@ -48,7 +48,7 @@ public IReadOnlyCollection GetMigrations(Type type) return migrations; } - return Array.Empty(); + return []; } public IEnumerable GetMigrationsFromTo(Type type, DocumentVersion version, DocumentVersion otherVersion) diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index 3f51483..4f6ca09 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -1,12 +1,19 @@  - net8.0 + net7.0;net8.0;net9.0 + 13.0 enable enable op-icon.png + true embedded - en + true + true + + + + 5.0.0 diff --git a/Mongo.Migration/Services/IMigrationService.cs b/Mongo.Migration/Services/IMigrationService.cs index af7263a..2608b3c 100644 --- a/Mongo.Migration/Services/IMigrationService.cs +++ b/Mongo.Migration/Services/IMigrationService.cs @@ -2,7 +2,37 @@ public interface IMigrationService { + /// + /// Register all serializer and other settings to MongoDB.Driver. + /// This enables the DocumentRuntime migration if it has been setup + /// + /// Must be called once, before any mongo interaction void RegisterBsonStatics(); - Task MigrateAsync(string databaseName, string? targetDatabaseVersion, CancellationToken cancellationToken); + /// + /// Immediately execute all migration setup + /// Don't do anything if only document runtime migration added + /// + /// The target database + /// The expected database version (latest of null) + /// + /// + Task ExecuteMigrationsAsync(string databaseName, string? targetDatabaseVersion, CancellationToken cancellationToken); + + /// + /// Immediately execute the database migrations + /// + /// The target database + /// The expected database version (latest of null) + /// + /// + Task ExecuteDatabaseMigrationAsync(string databaseName, string? targetVersion, CancellationToken cancellationToken); + + /// + /// Immediately execute the document migrations + /// + /// The target database + /// + /// + Task ExecuteDocumentMigrationAsync(string databaseName, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/Mongo.Migration/Services/MigrationService.cs b/Mongo.Migration/Services/MigrationService.cs index 55802e2..c4f04f7 100644 --- a/Mongo.Migration/Services/MigrationService.cs +++ b/Mongo.Migration/Services/MigrationService.cs @@ -31,6 +31,7 @@ public MigrationService( _provider = provider; } + /// public void RegisterBsonStatics() { BsonSerializer.RegisterSerializer(new DocumentVersionSerializer()); @@ -42,7 +43,8 @@ public void RegisterBsonStatics() } } - public async Task MigrateAsync(string databaseName, string? targetDatabaseVersion, CancellationToken cancellationToken) + /// + public async Task ExecuteMigrationsAsync(string databaseName, string? targetDatabaseVersion, CancellationToken cancellationToken) { if (_startupSettings.DatabaseMigrationEnabled) { @@ -55,7 +57,8 @@ public async Task MigrateAsync(string databaseName, string? targetDatabaseVersio } } - private async Task ExecuteDatabaseMigrationAsync(string databaseName, string? targetVersion, CancellationToken cancellationToken) + /// + public async Task ExecuteDatabaseMigrationAsync(string databaseName, string? targetVersion, CancellationToken cancellationToken) { Stopwatch sw = Stopwatch.StartNew(); @@ -76,7 +79,8 @@ private async Task ExecuteDatabaseMigrationAsync(string databaseName, string? ta _logger.LogInformation("Database migration done in {ElapsedMs} ms", sw.ElapsedMilliseconds); } - private async Task ExecuteDocumentMigrationAsync(string databaseName, CancellationToken cancellationToken) + /// + public async Task ExecuteDocumentMigrationAsync(string databaseName, CancellationToken cancellationToken) { Stopwatch sw = Stopwatch.StartNew(); _logger.LogInformation("Executing document migration..."); diff --git a/Mongo.Migration/Startup/MongoMigrationExtensions.cs b/Mongo.Migration/Startup/MongoMigrationExtensions.cs index 778b836..1538193 100644 --- a/Mongo.Migration/Startup/MongoMigrationExtensions.cs +++ b/Mongo.Migration/Startup/MongoMigrationExtensions.cs @@ -13,7 +13,7 @@ public static IServiceCollection AddMigration( this IServiceCollection services, Action? configure = null) { - MongoMigrationConfigurator configurator = new MongoMigrationConfigurator(); + MongoMigrationConfigurator configurator = new(); configure?.Invoke(configurator); @@ -68,14 +68,4 @@ private static void BuildDatabaseMigration(IServiceCollection services, MongoMig .AddTransient(); } } - - public static async Task InitializeAndMigrateAsync(this IMigrationService migrationService, - string databaseName, - string? targetDatabaseVersion, - CancellationToken cancellationToken) - { - migrationService.RegisterBsonStatics(); - - await migrationService.MigrateAsync(databaseName, targetDatabaseVersion, cancellationToken); - } } \ No newline at end of file diff --git a/Readme.md b/Readme.md index 5898e93..152d073 100644 --- a/Readme.md +++ b/Readme.md @@ -13,458 +13,263 @@ Mongo.Migration is designed for the [MongoDB C# Driver](https://github.com/mongodb/mongo-csharp-driver) to migrate your documents easily and on-the-fly. No more downtime for schema-migrations. Just write small and simple `migrations`. -`**Edit**` - -With version 3.0.0 of Mongo.Migration I added the possibility to run migrations on StartUp. In order to keep the core of Mongo.Migration in focus, it is still possible to run migrations at runtime (on-the-fly). In addition, there is now the option of executing migrations at the start of the application. - -`**PLEASE NOTE**` If you use on-the-fly migration updates, aggregation pipeline and projections are not handled, because they don’t use serialization. You have to handle them yourself. - -With version 4.0.0 of Mongo.Migration was added the possibility to run database migrations on StartUp. -Now exist additional option of executing migrations which can manipulate the mongo database insert documents, rename collections and other operations that you need. It's more generic operations than only manipulate document when exists. +Version 5.0.0 of Mongo.Migration is a code modernization and simplification release. It also has a strong focus on performance. + +The library is still based on the official [MongoDB.Driver](https://www.mongodb.com/docs/drivers/csharp/) (3.0.0+) and supports the following 3 types of migration: +- **Runtime document migration:** + This kind of migration is executed at serialization/deserialization process. It allows your application to consume data serialized at another version +- **Startup document migration:** + This kind of migration can be executed on demand (generally at startup) and execute the same document migrations using bulk writes. + This migration is slow and memory consuming, but it could be enough for small data sets +- **Database migration:** + This kind of migration give access to the entire database and allows to write much faster migrations. They also allow to manage indexes, rights, or any other maintenance of the database. + +**Notes:** +A robust application will probably use two kind of migrations. +- The database migration executed by the continuous integration +- The runtime document migration executed by the runtime to prevent any error during the database migration # Installation Install via nuget https://www.nuget.org/packages/Mongo.Migration +**Note:** The package isn't maintained since a while, so for now it's preferable to compile it locally +```shell +dotnet add package Mongo.Migration ``` -PM> Install-Package Mongo.Migration -``` - -# Document migrations quick Start - -#### .Net Framework -1. Initialize `MongoMigration` behind the `MongoClient`. ([Mongo2Go](https://github.com/Mongo2Go/Mongo2Go)) - -```csharp -// Init MongoDB -var runner = MongoDbRunner.Start(); // Mongo2Go -var client = new MongoClient(runner.ConnectionString); - -// Init MongoMigration -MongoMigrationClient.Initialize(client); -``` - -#### .Net Core - -1.1 Add `MongoMigration` with the StartupFilter (`IMongoClient` has to be registered at the DI-container before) - -```csharp -public void ConfigureServices(IServiceCollection services) -{ - services.AddMvc(); - - _client = new MongoClient( _configuration.GetSection("MongoDb:ConnectionString").Value); - - services.AddSingleton(_client); - - services.AddMigration(); -} -``` -1.2 Add `MongoMigration` with the StartupFilter add connection setting to use separate client -```csharp -public void ConfigureServices(IServiceCollection services) -{ - services.AddMvc(); - - _client = new MongoClient( _configuration.GetSection("MongoDb:ConnectionString").Value); - - services.AddSingleton(_client); - - services.AddMigration(new MongoMigrationSettings +# Register migration services + +```c# +string myConnectionString = "..."; +IServiceCollection services = new ServiceCollection(); +services + .AddLogging(builder => builder.AddProvider(NullLoggerProvider.Instance)) // Require logging + .AddSingleton(new MongoClient(myConnectionString) // Require IMongoClient + .AddMigration(builder => // Configure the migration (null => all migration types enabled) { - ConnectionString = _configuration.GetSection("MongoDb:ConnectionString").Value, - Database = _configuration.GetSection("MongoDb:Database").Value, - VersionFieldName = "TestVersionName" // Optional + builder + .AddDocumentMigratedType("0.0.1") // Declare POCO outside assembly for runtime migration (requires an existing string Version property) + .AddRuntimeDocumentMigration() + .AddStartupDocumentMigration() + .AddDatabaseMigration() }); -} ``` - -2. Implement `IDocument` or add `Document` to your entities to provide the `DocumentVersion`. (Optional) Add the `RuntimeVersion` attribute to mark the current version of the document. So you have the possibility to downgrade in case of a rollback. +# Execute migrations +```c# +IServiceProvider provider = services.BuildServiceProvider(); -```csharp -[RuntimeVersion("0.0.1")] -public class Car : IDocument -{ - public ObjectId Id { get; set; } +IMigrationService migrationService = provider + .GetRequiredService(); - public string Type { get; set; } +// Register serializers in MongoDb.Driver and enable runtime migration if setup +// Must be called once before any mongo call +migrationService.RegisterBsonStatics(); - public int Doors { get; set; } +// Execute the migrations +await migrationService + .ExecuteDatabaseMigrationAsync("my-database", "1.0.0"); - public DocumentVersion Version { get; set; } -} +await migrationService + .ExecuteDocumentMigrationAsync("my-database"); ``` -3. Create a migration by extending the abstract class `DocumentMigration`. Best practice for the version is to use [Semantic Versioning](http://semver.org/) but ultimately it is up to you. You could simply use the patch version to count the number of migrations. If there is a duplicate for a specific type an exception is thrown on initialization. -```csharp -public class M001_RenameDorsToDoors : DocumentMigration -{ - public M001_RenameDorsToDoors() - : base("0.0.1") - { - } - - public override void Up(BsonDocument document) - { - var doors = document["Dors"].ToInt32(); - document.Add("Doors", doors); - document.Remove("Dors"); - } - - public override void Down(BsonDocument document) - { - var doors = document["Doors"].ToInt32(); - document.Add("Dors", doors); - document.Remove("Doors"); - } -} -``` -4. `(Optional)` If you choose to put your migrations into an extra project, -add the suffix `".MongoMigrations"` to the name and make sure it is referenced in the main project. By convention Mongo.Migration collects all .dlls named like that in your bin folder. - -Compile, run and enjoy! - -## How to use document migration - -With version 3.0.0 of Mongo.Migration I added the possibility to run migrations on StartUp. -In order to keep the core of Mongo.Migration in focus, it is still possible to run migrations at runtime (on-the-fly). -In addition, there is now the option of executing migrations at the start of the application. - -#### Document migration at runtime - -See `Quick Start ` - -#### Document migration on startup - -If you want to run migrations on StartUp, the only thing you have to do is add the attribute `CollectionLocation`. -Now all migrations you add for a `IDocument` will be executed at StartUp. - -```csharp - [CollectionLocation("Car", "TestCars")] - public class Car : IDocument - { - public ObjectId Id { get; set; } - - public string Type { get; set; } - - public int Doors { get; set; } - - public DocumentVersion Version { get; set; } - } -``` - -Additionally you can fix the version of the document with `StartUpVersion` - -```csharp - [StartUpVersion("0.1.1")] - [CollectionLocation("Car", "TestCars")] - public class Car : IDocument - { - public ObjectId Id { get; set; } - - public string Type { get; set; } - - public int Doors { get; set; } - - public DocumentVersion Version { get; set; } - } -``` - -`**PLEASE NOTE**` -Mongo.Migration uses the IStartUpFilter for .net core. -Maybe you want to read this [article](https://andrewlock.net/running-async-tasks-on-app-startup-in-asp-net-core-part-1/), to check if there is a better option to migrate with Mongo.Migration at StartUp. - -#### Document migration on startup and at runtime - -This is an example how you can use both. -At startup the version will be 0.0.1 and at runtime, when a document will be deserialized the version will be migrated to 0.1.1 +# Document migrations quick Start +Document migrations first usage is to be executed at runtime on POCO serialize/deserialize. +You can still execute them at startup to migrate your database but this **is not efficient** and should only be done for **very small volumes of data**. -```csharp - [RuntimeVersion("0.1.1")] - [StartUpVersion("0.0.1")] - [CollectionLocation("Car", "TestCars")] +1. Implement `IDocument` or add `Document` to your entities to provide the `DocumentVersion`. (Optional) Add the `RuntimeVersion` attribute to mark the current version of the document. So you have the possibility to downgrade in case of a rollback. + ```csharp + [RuntimeVersion("0.0.1")] public class Car : IDocument { public ObjectId Id { get; set; } - + public string Type { get; set; } - + public int Doors { get; set; } - + public DocumentVersion Version { get; set; } } -``` - - -### Annotations - -#### RuntimeVersion -Add `RuntimeVersion` attribute to mark the current version of the document. So you have the possibility to downgrade in case of a rollback. -If you do not set the `RuntimeVersion`, all migrations will be applied. - -```csharp -[RuntimeVersion("0.0.1")] -public class Car : IDocument -... -``` -#### CollectionLocation -Add `CollectionLocation` attribute if you want to migrate your collections at startup. This attribute tells Mongo.Migration where to find your Collections. - -```csharp -[CollectionLocation("Car", "TestCars")] -public class Car : IDocument -... -``` -#### StartUpVersion -Add `StartUpVersion` attribute to set the version you want to migrate to at startup. This attribute limits the migrations to be performed on startup - -```csharp -[StartUpVersion("0.0.1")] -public class Car : IDocument -... -``` - -# Database migrations quick start - -#### .Net Framework -1. Initialize `MongoMigration` behind the `MongoClient`. ([Mongo2Go](https://github.com/Mongo2Go/Mongo2Go)) - -```csharp -// Init MongoDB -var runner = MongoDbRunner.Start(); // Mongo2Go -var client = new MongoClient(runner.ConnectionString); - -// Init MongoMigration - MongoMigrationClient.Initialize( - client, - new MongoMigrationSettings() - { - ConnectionString = runner.ConnectionString, - Database = "TestCars" - }, - new LightInjectAdapter(new LightInject.ServiceContainer())) -``` - -#### .Net Core - -1.1 Add `MongoMigration` with the StartupFilter (`IMongoClient` has to be registered at the DI-container before) - -```csharp -public void ConfigureServices(IServiceCollection services) -{ - services.AddMvc(); - - _client = new MongoClient( _configuration.GetSection("MongoDb:ConnectionString").Value); - - services.AddSingleton(_client); - - services.AddMigration(new MongoMigrationSettings() - { - ConnectionString = runner.ConnectionString, - Database = "TestCars" - }); -} - -``` -1.2 Add `MongoMigration` with the StartupFilter add connection setting to use separate client -```csharp -public void ConfigureServices(IServiceCollection services) -{ - services.AddMvc(); - - services.AddMigration(new MongoMigrationSettings - { - ConnectionString = _configuration.GetSection("MongoDb:ConnectionString").Value, - Database = _configuration.GetSection("MongoDb:Database").Value, - DatabaseMigrationVersion = new DocumentVersion(2,0,0) // Optional - }); -} -``` - - -2. Create a migration by extending the abstract class `DatabaseMigration`. Best practice for the version is to use [Semantic Versioning](http://semver.org/) but ultimately it is up to you. You could simply use the patch version to count the number of migrations. All database migrations you add for a database will be executed at StartUp. - -```csharp - public class M100_AddNewCar : DatabaseMigration + ``` +2. Create a migration by extending the abstract class `DocumentMigration`. Best practice for the version is to use [Semantic Versioning,](http://semver.org/) but ultimately it is up to you. You could simply use the patch version to count the number of migrations. If there is a duplicate for a specific type an exception is thrown on initialization. + ```csharp + public class M001_RenameDorsToDoors : DocumentMigration { - public M100_AddNewCar() - : base("1.0.0") + public M001_RenameDorsToDoors() + : base("0.0.1") { } - - public override void Up(IMongoDatabase db) + + public override void Up(BsonDocument document) { - var collection = db.GetCollection("Car"); - collection.InsertOne(new Car - { - Doors = 123, - Type = "AddedInMigration" - }); + var doors = document["Dors"].ToInt32(); + document.Add("Doors", doors); + document.Remove("Dors"); } - - public override void Down(IMongoDatabase db) + + public override void Down(BsonDocument document) { - var collection = db.GetCollection("Car"); - collection.DeleteOne(Builders.Filter.Eq(c => c.Type, "AddedInMigration")); + var doors = document["Doors"].ToInt32(); + document.Add("Dors", doors); + document.Remove("Doors"); } } -``` - -### Annotations -#### CollectionLocation -`CollectionLocation` attribute if you not specify database in MongoMigrationSettings then database from attribure will be use at startup. - -#### Setup current database version -Database will downgrade to current version using database migrations -```csharp -new MongoMigrationSettings() -{ - ... - DatabaseMigrationVersion = new DocumentVersion(2,0,0) -} -``` - -## Dependency injection -With the latest update (3.0.94) I added a requested feature to `Mongo.Migration`. `Migration` can be injected with dependencies from now on. - -#### .NetCore -It is pitty simple with .NetCore. `Mongo.Migration` uses the `IServiceProvider` to resolve all used dependencies. So you have access to all registered dependencies. + ``` +3`(Optional)` If you choose to put your migrations into an extra project, +add the suffix `".MongoMigrations"` to the name and make sure it is referenced in the main project. By convention Mongo.Migration collects all .dlls named like that in your bin folder. + +Compile, run and enjoy! -#### .Net Framework -When you initialize `Mongo.Migration` you can now add a `IContainerAdapter`. At the moment following Containers can be used out of the box: -- LightInject -- .NetCore ServiceProvider -- ... more planned in the future. +# Database migrations quick start +Database migrations are very efficient to migrate large volume of data, and it allows to manage indexes or whatever you need. +Here are some tips to implement your migrations: +- Do not create transactions +- Try to write atomic updates as most as possible +- Create many small migrations +- Also migrate your documents and update their runtime version +- Write the most robust migrations possible (specially atomicity isn't guaranteed) +- Do not depend on your data model (it will change, you migrations shouldn't) + +1. Create a migration by extending the abstract class `DatabaseMigration`. Best practice for the version is to use [Semantic Versioning,](http://semver.org/) but ultimately it is up to you. You could simply use the patch version to count the number of migrations. All database migrations you add for a database will be executed at StartUp. + ```csharp + public class M110AddNewWheels : DatabaseMigration + { + private const string PreviousCarVersion = "3.5.0"; + private const string NewCarVersion = "3.6.0"; + + public M110AddNewWheels() : base("1.1.0") { } + + public override async Task UpAsync(IMongoDatabase db, CancellationToken cancellationToken) + { + var collection = db.GetCollection("Car"); + await collection.UpdateManyAsync( + Builders.Filter.Eq("Version", PreviousCarVersion), // update only previous documents + Builders.Update + .Set("Wheels", 4) + .Set(nameof(IDocument.Version), NewCarVersion), // updates in atomic operation + null, + cancellationToken + ); + } + + public override async Task DownAsync(IMongoDatabase db, CancellationToken cancellationToken) + { + var collection = db.GetCollection("Car"); + await collection.UpdateManyAsync( + Builders.Filter.Eq("Version", NewCarVersion), // update only new documents + Builders.Update + .Unset("Wheels") + .Set(nameof(IDocument.Version), PreviousCarVersion), + null, + cancellationToken + ); + } + } + ``` -If you use an other Container, you have to implement the interface yourself. As an example, see `LightInjectAdapter`. +# Attributes -When that is done, you can pass the Adapter as a parameter to initialize `Mongo.Migration`. +## RuntimeVersion +Add `RuntimeVersion` attribute to mark the current version of the document. So you have the possibility to downgrade in case of a rollback. +If you do not set the `RuntimeVersion`, all migrations will be applied. ```csharp - // Your Container - var conatiner = ServiceContainer() - ontainer.Register(); - - // Init MongoDB - var runner = MongoDbRunner.Start(); // Mongo2Go - var client = new MongoClient(runner.ConnectionString); - - // Your Adapter implementation to abstract the container - var adapter = new LightInjectAdapter(container) - - // Init MongoMigration - MongoMigrationClient.Initialize(client, adapter); +[RuntimeVersion("0.0.1")] +public class Car : IDocument { } ``` -```csharp - public class M001_RenameDorsToDoors : DocumentMigration - { - private readonly IYourDependency _service; +## CollectionLocation - public M001_RenameDorsToDoors(IYourDependency service) - : base("0.0.1") - { - _service = service; - } +Add `CollectionLocation` attribute if you want to migrate your collections at startup with document migration. +This attribute tells Mongo.Migration where to find your Collections. - ... +```csharp +[CollectionLocation("Car")] +public class Car : IDocument { } ``` +## StartUpVersion +Add `StartUpVersion` attribute to set the version you want to migrate to at startup with document migration. +This attribute limits the migrations to be performed on startup. -## Document migrations demo - -Inside of the repository you can find a [Mongo.Migration.Demo]( https://github.com/SRoddis/Mongo.Migration/tree/master/Mongo.Migration.Demo) which is a simple demo to show how to use Mongo.Migration. - -1. Compile and run the demo application. -2. Now you should see the following output in the console. - -```bash - Migrate from: - { "_id" : ObjectId("59624d5beb5bb330386cd859"), "Dors" : 3, "Type" : "Cabrio", "UnnecessaryField" : "" } - - { "_id" : ObjectId("59624d5beb5bb330386cd85a"), "Dors" : 5, "Type" : "Combi", "UnnecessaryField" : "" } - - { "_id" : ObjectId("59624d5beb5bb330386cd85b"), "Doors" : 3, "Type" : "Truck", "UnnecessaryField" : "", "Version" : "0.0.1" } - - { "_id" : ObjectId("59624d5beb5bb330386cd85c"), "Doors" : 5, "Type" : "Van", "Version" : "0.1.1" } - - To: - { "_id" : ObjectId("59624d5beb5bb330386cd859"), "Type" : "Cabrio", "Doors" : 3, "Version" : "0.1.1" } - - { "_id" : ObjectId("59624d5beb5bb330386cd85a"), "Type" : "Combi", "Doors" : 5, "Version" : "0.1.1" } - - { "_id" : ObjectId("59624d5beb5bb330386cd85b"), "Type" : "Truck", "Doors" : 3, "Version" : "0.1.1" } - - { "_id" : ObjectId("59624d5beb5bb330386cd85c"), "Type" : "Van", "Doors" : 5, "Version" : "0.1.1" } - - New Car was created with version: 0.1.1 - - Press any Key to exit... +```csharp +[StartUpVersion("0.0.1")] +public class Car : IDocument { } ``` -3. `(Optional)` Run [Mongo.Migration.Demo.Performance.Console]( https://github.com/SRoddis/Mongo.Migration/tree/master/Mongo.Migration.Demo.Performance.Console) - +# Suggestions -## Database migrations demo +Deploy the migrations in a separate artifact. Otherwise, you lose the ability to downgrade in case of a rollback. -Inside of the repository you can find a [Mongo.Migration.Database.Demo]( https://github.com/SRoddis/Mongo.Migration/tree/master/Mongo.Migration.Database.Demo) which is a simple demo to show how to use database Mongo.Migration. +# Performance -1. Compile and run the demo application. -2. Now you should see the following output in the console. +The performance is measured on every push to the repository with a small performance-test. +It measures the time MongoDB needs to insert and read `n documents` (5000) with and without Mongo.Migration. The difference is asserted and should be not higher than a given tolerance (150ms). +Example output of the automated test: ```bash -Apply database migrations: - - -{ "_id" : ObjectId("5ead80b68f9c4c402c35ebb9"), "MigrationId" : "Mongo.Migration.Database.Demo.Migrations.M100_AddNewCar", "Version" : "1.0.0" } - -{ "_id" : ObjectId("5ead80b68f9c4c402c35ebba"), "MigrationId" : "Mongo.Migration.Database.Demo.Migrations.M200_UpdateNewCar", "Version" : "2.0.0" } - -{ "_id" : ObjectId("5ead80b78f9c4c402c35ebbb"), "MigrationId" : "Mongo.Migration.Database.Demo.Migrations.M300_AddSparePartsCollection", "Version" : "3.0.0" } - -New Car was added and updated in database migrations: -{ "_id" : ObjectId("5ead80b68f9c4c402c35ebb8"), "Type" : "AddedInMigration", "Doors" : 222 } - -New collection was added in database: -SparePart - - - -Press any Key to exit... +MongoDB: 21ms, Mongo.Migration: 210ms, Diff: 189ms (Tolerance: 600ms), Documents: 5000, Migrations per Document: 2 ``` +After bigger changes the code is analyzed with profiling tools to check for performance or memory problems. -## Suggestions - -Deploy the migrations in a separate artifact. Otherwise you lose the ability to downgrade in case of a rollback. - -## Performance - -The performance is measured on every push to the repository with a small performance-test. It measures the time MongoDB needs to insert and read `n documents` (5000) with and without Mongo.Migration. The difference is asserted and should be not higher than a given tolerance (150ms). - +Performance is also measured manually for runtime migration which has benefited from a big performance gain since version 5.0.0. Example output of the automated test: ```bash -MongoDB: 73ms, Mongo.Migration: 168ms, Diff: 95ms (Tolerance: 150ms), Documents: 5000, Migrations per Document: 2 - -MongoDB: 88ms, Mongo.Migration: 109ms, Diff: 21ms (Tolerance: 70ms), Documents: 1500, Migrations per Document: 2 - -MongoDB: 62ms, Mongo.Migration: 63ms, Diff: 1ms (Tolerance: 40ms), Documents: 100, Migrations per Document: 2 - -MongoDB: 48ms, Mongo.Migration: 50ms, Diff: 2ms (Tolerance: 10ms), Documents: 10, Migrations per Document: 2 - +vanilla +- 1_000 => 15 ms +- 10_000 => 45 ms +- 50_000 => 168 ms + +no migration: +- 1_000 => 13 ms +- 10_000 => 77 ms +- 50_000 => 157 ms + +2 migrations: +- 1_000 => 34 ms +- 10_000 => 258 ms +- 50_000 => 883 ms ``` -After bigger changes the code is analyzed with profiling tools to check for performance or memory problems. - -## Next Feature/Todo - - 1. Intercept updates, aggregation pipeline and projections. - -## Copyright - -Copyright © 2018 Sean Roddis - -## License +**Note:** These performance tests are not benchmark and results could vary. +They should rely on BenchMarkDotNet and use in memory streams instead of mongo docker image, but it's indicative. + +# Release notes + +## v5.0.0 +This could be not 100% exhaustive but v5.0.0 did a lot of changes comparing to older versions. +Consider also there was a lot of changes between the last 3.1.4 officially published version and the source code. + +### Updates +- .Net version update (.net6_0, .net8_0, .net9_0) +- MongDB.Driver@3.0.0+ +- Dependency updates +- Remove Mongo2Go in favor of Testcontainers +- Refactoring initialisation + - Can migrate multiple database + - Remove CollectionLocationAttribute `Database` property + - Can enable separately all migration types + - Add extension method to initialize before app startup +- Use span for DocumentVersion parsing +- Use mongo bookmark when no migration needed +- A lot of cleanup and optimization +- Documentation rewriting +- More tests + +### Breaking changes +- Remove .Net framework support +- MongoDB.Driver@3.0.0 +- DatabaseMigration now use async methods for UpAsync and DownAsync +- CollectionLocationAttribute Database property removed +- Refactoring initialisation + +# Next Feature/Todo + +1. Create startup setting to limit database migrations ran at startup on fresh database +2. Remove .net6_0 support + +# License Mongo.Migration is licensed under [MIT](http://www.opensource.org/licenses/mit-license.php "Read more about the MIT license form"). Refer to license.txt for more information. From 44c0861fe33a848dae6afdef067495d436281f54 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Wed, 26 Feb 2025 17:47:03 +0100 Subject: [PATCH 22/42] Add pipeline --- .github/workflows/build.yaml | 22 ++++++++++++++++ .github/workflows/publish.yaml | 35 ++++++++++++++++++++++++++ Mongo.Migration/Mongo.Migration.csproj | 8 ++++-- Readme.md | 14 +++++------ 4 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/build.yaml create mode 100644 .github/workflows/publish.yaml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..a1ee28a --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,22 @@ +name: Build and test + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + - name: Restore dependencies + run: dotnet restore + - name: Build + run: dotnet build -c Release --no-restore + - name: Test + run: dotnet test -c Release --no-build diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 0000000..7687d4f --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,35 @@ +name: Publish + +on: + push: + branches: + - master + tags: + - "v[0-9]+.[0-9]+.[0-9]+(-preview[0-9]+)?" + +jobs: + publish: + runs-on: ubuntu-latest + environment: production + permissions: + packages: write + contents: read + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + - name: Set VERSION variable from tag + run: echo "VERSION=${GITHUB_REF/refs\/tags\/v/}" >> $GITHUB_ENV + - name: Build + run: dotnet build -c Release /p:Version=${VERSION} + - name: Test + run: dotnet test -c Release /p:Version=${VERSION} --no-build + - name: Pack + run: dotnet pack -c Release /p:Version=${VERSION} --no-build --output . + - name: Push + with: + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + env: + NUGET_SOURCE: ${{ secretes.NUGET_SOURCE }} + run: dotnet nuget push Mongo.Migration.${VERSION}.nupkg --source ${NUGET_SOURCE} --api-key ${NUGET_API_KEY} diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index 4f6ca09..7d30abf 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -13,13 +13,17 @@ - 5.0.0 + Mongo.Migration + git + https://github.com/rpallares/Mongo.Migration + SRoddis;delepster;pleveille333;etiennelepagel;rpallares + Mongo.Migration is designed for the MongoDB.Driver to migrate documents easily and on-the-fly - + diff --git a/Readme.md b/Readme.md index 152d073..087c098 100644 --- a/Readme.md +++ b/Readme.md @@ -1,12 +1,10 @@ -[![.NET](https://github.com/SRoddis/Mongo.Migration/actions/workflows/dotnet.yml/badge.svg)](https://github.com/SRoddis/Mongo.Migration/actions/workflows/dotnet.yml) -[![Coverage Status](https://coveralls.io/repos/github/SRoddis/Mongo.Migration/badge.svg)](https://coveralls.io/github/SRoddis/Mongo.Migration) -[![NuGet](https://img.shields.io/nuget/dt/Mongo.Migration.svg)](https://www.nuget.org/packages/Mongo.Migration/) -[![NuGet](https://img.shields.io/nuget/v/Mongo.Migration.svg)](https://www.nuget.org/packages/Mongo.Migration/) -![GitHub last commit](https://img.shields.io/github/last-commit/sroddis/Mongo.Migration.svg) +![GitHub License](https://img.shields.io/github/license/rpallares/Mongo.Migration) +![NuGet Downloads](https://img.shields.io/nuget/dt/Mongo.Migration) +![NuGet](https://img.shields.io/nuget/v/Mongo.Migration) +![GitHub last commit](https://img.shields.io/github/last-commit/rpallares/Mongo.Migration) # Mongo.Migration - ![](https://media.giphy.com/media/10tLOFXDFDjgQM/giphy.gif) @@ -243,7 +241,7 @@ This could be not 100% exhaustive but v5.0.0 did a lot of changes comparing to o Consider also there was a lot of changes between the last 3.1.4 officially published version and the source code. ### Updates -- .Net version update (.net6_0, .net8_0, .net9_0) +- .Net version update (.net7_0, .net8_0, .net9_0) - MongDB.Driver@3.0.0+ - Dependency updates - Remove Mongo2Go in favor of Testcontainers @@ -268,7 +266,7 @@ Consider also there was a lot of changes between the last 3.1.4 officially publi # Next Feature/Todo 1. Create startup setting to limit database migrations ran at startup on fresh database -2. Remove .net6_0 support +2. Remove .net7_0 support # License From 04accd6b83485c1424f83e40ad9840b193a30b77 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Wed, 26 Feb 2025 17:57:36 +0100 Subject: [PATCH 23/42] dummy empty line --- Readme.md | 1 - 1 file changed, 1 deletion(-) diff --git a/Readme.md b/Readme.md index 087c098..35e318a 100644 --- a/Readme.md +++ b/Readme.md @@ -7,7 +7,6 @@ ![](https://media.giphy.com/media/10tLOFXDFDjgQM/giphy.gif) - Mongo.Migration is designed for the [MongoDB C# Driver](https://github.com/mongodb/mongo-csharp-driver) to migrate your documents easily and on-the-fly. No more downtime for schema-migrations. Just write small and simple `migrations`. From bda763b8836937d1f1e8d75d3f3645bf4e2816ab Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Wed, 26 Feb 2025 18:01:08 +0100 Subject: [PATCH 24/42] another try --- .github/workflows/build.yaml | 2 +- Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index a1ee28a..96d2d79 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -19,4 +19,4 @@ jobs: - name: Build run: dotnet build -c Release --no-restore - name: Test - run: dotnet test -c Release --no-build + run: dotnet test -c Release --no-build --framework net9.0 diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index 3a2b7a4..41e62f5 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -17,7 +17,7 @@ public class PerformanceTestOnStartup private const string CollectionName = "Test"; - private const int ToleranceMs = 600; + private const int ToleranceMs = 2000; [Test] public async Task When_migrating_number_of_documents() From 44136b384d41861b9169da95725788fd5f0bdf63 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Thu, 27 Feb 2025 11:29:50 +0100 Subject: [PATCH 25/42] fix ci --- .github/workflows/publish.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 7687d4f..38f8723 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -31,5 +31,5 @@ jobs: with: NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} env: - NUGET_SOURCE: ${{ secretes.NUGET_SOURCE }} + NUGET_SOURCE: ${{ secrets.NUGET_SOURCE }} run: dotnet nuget push Mongo.Migration.${VERSION}.nupkg --source ${NUGET_SOURCE} --api-key ${NUGET_API_KEY} From 3f471a1f6fe636f180760f4d8a1684fb734be346 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Thu, 27 Feb 2025 11:48:18 +0100 Subject: [PATCH 26/42] again --- .github/workflows/publish.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 38f8723..6202648 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -28,8 +28,7 @@ jobs: - name: Pack run: dotnet pack -c Release /p:Version=${VERSION} --no-build --output . - name: Push - with: - NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} env: NUGET_SOURCE: ${{ secrets.NUGET_SOURCE }} + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} run: dotnet nuget push Mongo.Migration.${VERSION}.nupkg --source ${NUGET_SOURCE} --api-key ${NUGET_API_KEY} From b57703d92b93ff653ca1c0b84a5e86e453d7b668 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Thu, 27 Feb 2025 12:33:57 +0100 Subject: [PATCH 27/42] Imrpove ci and nuget hygiene --- .github/workflows/build.yaml | 5 +++-- .github/workflows/publish.yaml | 7 +++---- Mongo.Migration/Mongo.Migration.csproj | 8 +++++++- Readme.md => README.md | 0 global.json | 6 ++++++ 5 files changed, 19 insertions(+), 7 deletions(-) rename Readme.md => README.md (100%) create mode 100644 global.json diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 96d2d79..8bfd3bc 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -6,14 +6,15 @@ on: pull_request: branches: [ "master" ] +env: + DOTNET_NOLOGO: true + jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 9.0.x - name: Restore dependencies run: dotnet restore - name: Build diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 6202648..3565834 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -2,11 +2,12 @@ name: Publish on: push: - branches: - - master tags: - "v[0-9]+.[0-9]+.[0-9]+(-preview[0-9]+)?" +env: + DOTNET_NOLOGO: true + jobs: publish: runs-on: ubuntu-latest @@ -17,8 +18,6 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 9.0.x - name: Set VERSION variable from tag run: echo "VERSION=${GITHUB_REF/refs\/tags\/v/}" >> $GITHUB_ENV - name: Build diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index 7d30abf..75f2b21 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -6,10 +6,12 @@ enable enable op-icon.png - true embedded true true + True + + $(NoWarn);CS1591 @@ -18,12 +20,16 @@ https://github.com/rpallares/Mongo.Migration SRoddis;delepster;pleveille333;etiennelepagel;rpallares Mongo.Migration is designed for the MongoDB.Driver to migrate documents easily and on-the-fly + mongo, library, migration + MIT + README.md + diff --git a/Readme.md b/README.md similarity index 100% rename from Readme.md rename to README.md diff --git a/global.json b/global.json new file mode 100644 index 0000000..3f285f0 --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "rollForward": "feature", + "version": "9.0.103" + } +} \ No newline at end of file From 3f632380698ba9cf7a1a88b1e14754a7cf358166 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Thu, 27 Feb 2025 12:49:30 +0100 Subject: [PATCH 28/42] tweak tag pattern (#4) Co-authored-by: Rafael Pallares --- .github/workflows/publish.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 3565834..30b96b0 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -3,7 +3,8 @@ name: Publish on: push: tags: - - "v[0-9]+.[0-9]+.[0-9]+(-preview[0-9]+)?" + - "v[0-9]+.[0-9]+.[0-9]+" + - "v[0-9]+.[0-9]+.[0-9]+-[a-z][0-9]+" env: DOTNET_NOLOGO: true From 619e2abcf9ba338758e1104a474802cbb297d3b6 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Thu, 27 Feb 2025 12:54:01 +0100 Subject: [PATCH 29/42] fix trigger wildcard (#5) Co-authored-by: Rafael Pallares --- .github/workflows/publish.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 30b96b0..c7540b1 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -4,7 +4,7 @@ on: push: tags: - "v[0-9]+.[0-9]+.[0-9]+" - - "v[0-9]+.[0-9]+.[0-9]+-[a-z][0-9]+" + - "v[0-9]+.[0-9]+.[0-9]+-[a-z]+[0-9]+" env: DOTNET_NOLOGO: true From 62c2b29a0be330941fdac54a0e033b618ad1be1f Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Thu, 27 Feb 2025 13:07:31 +0100 Subject: [PATCH 30/42] too fast (#7) Co-authored-by: Rafael Pallares --- .github/workflows/publish.yaml | 2 +- Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index c7540b1..7d69baf 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -24,7 +24,7 @@ jobs: - name: Build run: dotnet build -c Release /p:Version=${VERSION} - name: Test - run: dotnet test -c Release /p:Version=${VERSION} --no-build + run: dotnet test -c Release /p:Version=${VERSION} --no-build --framework net9.0 - name: Pack run: dotnet pack -c Release /p:Version=${VERSION} --no-build --output . - name: Push diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index 41e62f5..bcb45ce 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -17,7 +17,7 @@ public class PerformanceTestOnStartup private const string CollectionName = "Test"; - private const int ToleranceMs = 2000; + private const int ToleranceMs = 2800; [Test] public async Task When_migrating_number_of_documents() From 4774c1b2376334bd661d3df97b697a9aeb77f749 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Thu, 27 Feb 2025 14:41:57 +0100 Subject: [PATCH 31/42] try another ci fix (#8) Co-authored-by: Rafael Pallares --- .github/workflows/publish.yaml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 7d69baf..aba4526 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -12,7 +12,6 @@ env: jobs: publish: runs-on: ubuntu-latest - environment: production permissions: packages: write contents: read @@ -28,7 +27,4 @@ jobs: - name: Pack run: dotnet pack -c Release /p:Version=${VERSION} --no-build --output . - name: Push - env: - NUGET_SOURCE: ${{ secrets.NUGET_SOURCE }} - NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} - run: dotnet nuget push Mongo.Migration.${VERSION}.nupkg --source ${NUGET_SOURCE} --api-key ${NUGET_API_KEY} + run: dotnet nuget push Mongo.Migration.${VERSION}.nupkg --source $NUGET_SOURCE --api-key "${{ secrets.NUGET_API_KEY }}" From 4096d61cb27bf0555bbd5127f696494ac32442f4 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Thu, 27 Feb 2025 15:17:34 +0100 Subject: [PATCH 32/42] pompompom (#9) Co-authored-by: Rafael Pallares --- .github/workflows/publish.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index aba4526..39402da 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -27,4 +27,7 @@ jobs: - name: Pack run: dotnet pack -c Release /p:Version=${VERSION} --no-build --output . - name: Push - run: dotnet nuget push Mongo.Migration.${VERSION}.nupkg --source $NUGET_SOURCE --api-key "${{ secrets.NUGET_API_KEY }}" + env: + NUGET_SOURCE: ${{ vars.NUGET_SOURCE }} + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + run: dotnet nuget push Mongo.Migration.${VERSION}.nupkg --source $NUGET_SOURCE --api-key "$NUGET_API_KEY" From a3ee96cb365ccbd18d787e47b5f19cf8b1aaefce Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Mon, 3 Mar 2025 11:27:11 +0100 Subject: [PATCH 33/42] fix: Fix does not represent members as fields exception in queryable usage (#10) Co-authored-by: Rafael Pallares --- .../MongoDB/VariousCrudOperations.cs | 130 ++++++++++++++++++ .../Bson/BaseMigrationSerializer.cs | 18 ++- 2 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 Mongo.Migration.Tests/MongoDB/VariousCrudOperations.cs diff --git a/Mongo.Migration.Tests/MongoDB/VariousCrudOperations.cs b/Mongo.Migration.Tests/MongoDB/VariousCrudOperations.cs new file mode 100644 index 0000000..9a8386c --- /dev/null +++ b/Mongo.Migration.Tests/MongoDB/VariousCrudOperations.cs @@ -0,0 +1,130 @@ +using MongoDB.Bson; +using MongoDB.Driver; +using NUnit.Framework; +using Mongo.Migration.Tests.TestDoubles; +using MongoDB.Driver.Linq; + +namespace Mongo.Migration.Tests.MongoDB; + +[TestFixture] +public class VariousCrudOperations +{ + private const string DatabaseName = "CrudTest"; + private const string CollectionName = "TestDocumentWithOneMigration"; + private IMongoCollection? _collection; + + private IMongoCollection Collection => _collection ?? throw new InvalidOperationException(); + + [SetUp] + public void SetUp() + { + IMongoClient client = TestcontainersContext.MongoClient; + _collection = client.GetDatabase(DatabaseName) + .GetCollection(CollectionName); + } + + [Test] + public async Task TestCreate() + { + var id = ObjectId.GenerateNewId(); + var document = new TestDocumentWithOneMigration + { + Id = id, + Doors = 1 + }; + + await Collection.InsertOneAsync(document); + + var documentCreated = Collection.AsQueryable() + .Where(d => d.Id == id) + .Single(); + + Assert.That(documentCreated.Id, Is.EqualTo(id)); + } + + [Test] + public async Task TestRead() + { + var id = ObjectId.GenerateNewId(); + var document = new TestDocumentWithOneMigration + { + Id = id, + Doors = 99 + }; + + await Collection.InsertOneAsync(document); + + var documentById = Collection.AsQueryable() + .Where(d => d.Id == id) + .Single(); + + var documentByExpression = Collection.AsQueryable() + .Where(d => d.Doors >= 98) + .Single(); + + Assert.That(documentById.Id, Is.EqualTo(id)); + Assert.That(documentByExpression.Id, Is.EqualTo(id)); + } + + [Test] + public async Task TestUpdate() + { + var id = ObjectId.GenerateNewId(); + var document = new TestDocumentWithOneMigration + { + Id = id, + Doors = 7 + }; + + await Collection.InsertOneAsync(document); + + var documentCreated = Collection.AsQueryable() + .Where(d => d.Id == id) + .Single(); + + Assert.That(documentCreated.Id, Is.EqualTo(id)); + + var updateResult = await Collection.UpdateOneAsync( + Builders.Filter.Where(d => d.Id == id && d.Doors == 7), + Builders.Update + .Set(d => d.Doors, 8)); + + Assert.That(updateResult.MatchedCount, Is.EqualTo(1)); + + var documentUpdated = Collection.AsQueryable() + .Where(d => d.Id == id) + .Single(); + + Assert.That(documentUpdated.Id, Is.EqualTo(id)); + Assert.That(documentUpdated.Doors, Is.EqualTo(8)); + } + + [Test] + public async Task TestDelete() + { + var id = ObjectId.GenerateNewId(); + var document = new TestDocumentWithOneMigration + { + Id = id, + Doors = 9 + }; + + await Collection.InsertOneAsync(document); + + var documentCreated = Collection.AsQueryable() + .Where(d => d.Id == id) + .Single(); + + Assert.That(documentCreated.Id, Is.EqualTo(id)); + + var deleteResult = await Collection.DeleteOneAsync(d => d.Id == id); + + Assert.That(deleteResult.DeletedCount, Is.EqualTo(1)); + + var searchResult = await Collection.AsQueryable() + .Where(d => d.Id == id) + .ToListAsync(); + + Assert.That(searchResult, Is.Empty); + } +} diff --git a/Mongo.Migration/Bson/BaseMigrationSerializer.cs b/Mongo.Migration/Bson/BaseMigrationSerializer.cs index 8304e97..40f70a5 100644 --- a/Mongo.Migration/Bson/BaseMigrationSerializer.cs +++ b/Mongo.Migration/Bson/BaseMigrationSerializer.cs @@ -5,9 +5,10 @@ using Mongo.Migration.Migrations.Document; using Mongo.Migration.Services; using Mongo.Migration.Documents; +using MongoDB.Bson.Serialization.Conventions; namespace Mongo.Migration.Bson; -internal abstract class BaseMigrationSerializer : SerializerBase +internal abstract class BaseMigrationSerializer : SerializerBase, IBsonIdProvider, IBsonDocumentSerializer, IBsonPolymorphicSerializer, IHasDiscriminatorConvention { private static readonly Type s_tDocumentType = typeof(TDocument); @@ -49,4 +50,19 @@ public override TDocument Deserialize(BsonDeserializationContext context, BsonDe var migratedContext = BsonDeserializationContext.CreateRoot(new BsonDocumentReader(document)); return InnerSerializer.Deserialize(migratedContext, args); } + + public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializationInfo serializationInfo) + => InnerSerializer.TryGetMemberSerializationInfo(memberName, out serializationInfo); + + public bool GetDocumentId(object document, out object id, out Type idNominalType, out IIdGenerator idGenerator) + => InnerSerializer.GetDocumentId(document, out id, out idNominalType, out idGenerator); + + public void SetDocumentId(object document, object id) + => InnerSerializer.SetDocumentId(document, id); + + public bool IsDiscriminatorCompatibleWithObjectSerializer + => InnerSerializer.IsDiscriminatorCompatibleWithObjectSerializer; + + public IDiscriminatorConvention DiscriminatorConvention + => InnerSerializer.DiscriminatorConvention; } From 46112a497318a729f0169cbd3d8647fa0c94f1ba Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Sat, 19 Apr 2025 14:58:01 +0200 Subject: [PATCH 34/42] update: Update testing dependencies (use MTP) (#13) --- .../Mongo.Migration.Tests.csproj | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj index cfd534b..e99abf9 100644 --- a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj +++ b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj @@ -1,12 +1,15 @@  - net7.0;net8.0;net9.0 + net8.0;net9.0 13.0 enable enable false true + true + Exe + true @@ -14,16 +17,16 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + From 9a4fc69c6ea854586f3497ec65571f00f2ddd292 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Sat, 19 Apr 2025 15:15:42 +0200 Subject: [PATCH 35/42] Change package id (#11) * change package id * fix publish * remove icon to worakourd nuget outage * improvement: Better initialization (#12) - Make all migration locator thread safe - Early init runtime migration - Make all attribute locator thread safe - Remove code duplication - remove .net7 support - Force migrations to be public Co-authored-by: Rafael Pallares * update readme * cleanup authors --------- Co-authored-by: Rafael Pallares --- .github/workflows/publish.yaml | 2 +- .../TypeMigrationLocator_when_locate.cs | 21 +++-- .../Database/TestDatabaseMigration_0_0_1.cs | 7 +- .../Database/TestDatabaseMigration_0_0_2.cs | 7 +- .../Database/TestDatabaseMigration_0_0_3.cs | 7 +- Mongo.Migration.sln | 6 ++ .../Documents/Locators/AbstractLocator.cs | 45 +++++----- .../Documents/Locators/CollectionLocator.cs | 23 ++--- .../Documents/Locators/ILocator.cs | 2 - .../Locators/RuntimeVersionLocator.cs | 38 ++------- .../Locators/StartUpVersionLocator.cs | 29 +------ .../Extensions/EnumerableExtensions.cs | 33 +++----- .../Migrations/Document/DocumentMigration.cs | 9 +- .../DatabaseTypeMigrationDependencyLocator.cs | 17 ---- ...IDatabaseTypeMigrationDependencyLocator.cs | 4 +- .../Migrations/Locators/IMigrationLocator.cs | 2 +- .../Migrations/Locators/MigrationLocator.cs | 84 +++++++++++++------ .../TypeMigrationDependencyLocator.cs | 57 +------------ .../Locators/TypeMigrationLocator.cs | 18 +--- Mongo.Migration/Mongo.Migration.csproj | 8 +- Mongo.Migration/Services/MigrationService.cs | 4 + README.md | 29 ++++--- 22 files changed, 173 insertions(+), 279 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 39402da..648fa69 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -30,4 +30,4 @@ jobs: env: NUGET_SOURCE: ${{ vars.NUGET_SOURCE }} NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} - run: dotnet nuget push Mongo.Migration.${VERSION}.nupkg --source $NUGET_SOURCE --api-key "$NUGET_API_KEY" + run: dotnet nuget push Mongo.RuntimeMigration.${VERSION}.nupkg --source $NUGET_SOURCE --api-key "$NUGET_API_KEY" diff --git a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs index aed02e3..3c5669f 100644 --- a/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs +++ b/Mongo.Migration.Tests/Migrations/Locators/TypeMigrationLocator_when_locate.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging.Abstractions; using Mongo.Migration.Documents; using Mongo.Migration.Migrations.Locators; using Mongo.Migration.Tests.TestDoubles; @@ -7,15 +8,15 @@ namespace Mongo.Migration.Tests.Migrations.Locators; [TestFixture] -public class TypeMigrationLocatorWhenLocate +public class TypeMigrationLocatorWhenLocate : IDisposable { - private TypeMigrationLocator _locator; + private readonly TypeMigrationLocator _locator; + private readonly ServiceProvider _serviceProvider; - [OneTimeSetUp] - public void OneTimeSetUp() + public TypeMigrationLocatorWhenLocate() { - // Arrange - _locator = new TypeMigrationLocator(NullLogger.Instance); + _serviceProvider = new ServiceCollection().BuildServiceProvider(); + _locator = new TypeMigrationLocator(NullLogger.Instance, _serviceProvider); } [Test] @@ -71,4 +72,10 @@ public void When_get_migrations_from_to_down() Assert.That(result, Has.Count.EqualTo(1)); Assert.That(result[0], Is.TypeOf()); } + + public void Dispose() + { + _serviceProvider.Dispose(); + GC.SuppressFinalize(this); + } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs index 9fa2b76..efe02d9 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_1.cs @@ -3,12 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles.Database; -internal class TestDatabaseMigration001 : DatabaseMigration +public class TestDatabaseMigration001 : DatabaseMigration { - public TestDatabaseMigration001() - : base("0.0.1") - { - } + public TestDatabaseMigration001() : base("0.0.1") { } public override Task UpAsync(IMongoDatabase db, CancellationToken cancellationToken) => Task.CompletedTask; diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs index f4a5b8e..7471e05 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_2.cs @@ -3,12 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles.Database; -internal class TestDatabaseMigration002 : DatabaseMigration +public class TestDatabaseMigration002 : DatabaseMigration { - public TestDatabaseMigration002() - : base("0.0.2") - { - } + public TestDatabaseMigration002() : base("0.0.2") { } public override Task UpAsync(IMongoDatabase db, CancellationToken cancellationToken) => Task.CompletedTask; diff --git a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs index c295fc3..441b2e1 100644 --- a/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs +++ b/Mongo.Migration.Tests/TestDoubles/Database/TestDatabaseMigration_0_0_3.cs @@ -3,12 +3,9 @@ namespace Mongo.Migration.Tests.TestDoubles.Database; -internal class TestDatabaseMigration003 : DatabaseMigration +public class TestDatabaseMigration003 : DatabaseMigration { - public TestDatabaseMigration003() - : base("0.0.3") - { - } + public TestDatabaseMigration003() : base("0.0.3") { } public override Task UpAsync(IMongoDatabase db, CancellationToken cancellationToken) => Task.CompletedTask; diff --git a/Mongo.Migration.sln b/Mongo.Migration.sln index 2477102..b4a4326 100644 --- a/Mongo.Migration.sln +++ b/Mongo.Migration.sln @@ -10,6 +10,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Git", "Git", "{CB26356F-6A6 Readme.md = Readme.md EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{E7B1F839-44B5-46BE-9CAB-AEBC376EB100}" + ProjectSection(SolutionItems) = preProject + .github\workflows\build.yaml = .github\workflows\build.yaml + .github\workflows\publish.yaml = .github\workflows\publish.yaml + EndProjectSection +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo.Migration", "Mongo.Migration\Mongo.Migration.csproj", "{8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo.Migration.Tests", "Mongo.Migration.Tests\Mongo.Migration.Tests.csproj", "{1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}" diff --git a/Mongo.Migration/Documents/Locators/AbstractLocator.cs b/Mongo.Migration/Documents/Locators/AbstractLocator.cs index fdd9c80..b00d04c 100644 --- a/Mongo.Migration/Documents/Locators/AbstractLocator.cs +++ b/Mongo.Migration/Documents/Locators/AbstractLocator.cs @@ -1,38 +1,43 @@ +using System.Collections.Frozen; using System.Reflection; namespace Mongo.Migration.Documents.Locators; -public abstract class AbstractLocator : ILocator +public abstract class AbstractLocator : ILocator where TReturnType : struct - where TTypeIdentifier : class + where TAttributeType : Attribute { - private IDictionary? _locatesDictionary; + private readonly Lazy> _lazyLocateDictionary; - protected IDictionary LocatesDictionary + protected AbstractLocator() { - get - { - if (_locatesDictionary == null) - { - Locate(); - } + _lazyLocateDictionary = new Lazy>( + LoadLocateDictionary, + LazyThreadSafetyMode.PublicationOnly); + } - return _locatesDictionary!; - } + protected abstract TReturnType GetAttributeValue(TAttributeType attribute); - set => _locatesDictionary = value; - } + protected IDictionary LocatesDictionary => _lazyLocateDictionary.Value; - public abstract TReturnType? GetLocateOrNull(TTypeIdentifier identifier); + public virtual TReturnType? GetLocateOrNull(Type identifier) + { + if (LocatesDictionary.TryGetValue(identifier, out TReturnType returnType)) + { + return returnType; + } - public abstract void Locate(); + return null; + } - protected IEnumerable<(Type, TAttribute)> LocateAttributes() where TAttribute : Attribute + private FrozenDictionary LoadLocateDictionary() { return AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetExportedTypes()) - .Select(t => (t, t.GetCustomAttributes(true).FirstOrDefault())) - .Where(tuple => tuple.Item2 is not null) - .Cast<(Type, TAttribute)>(); + .Select(t => (t, t.GetCustomAttribute())) + .Where(t => t.Item2 is not null) + .ToFrozenDictionary( + pair => pair.t, + pair => GetAttributeValue(pair.Item2!)); } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/CollectionLocator.cs b/Mongo.Migration/Documents/Locators/CollectionLocator.cs index ae5632f..52c3b47 100644 --- a/Mongo.Migration/Documents/Locators/CollectionLocator.cs +++ b/Mongo.Migration/Documents/Locators/CollectionLocator.cs @@ -1,14 +1,14 @@ using Mongo.Migration.Documents.Attributes; -#if NET8_0_OR_GREATER -using System.Collections.Frozen; -#else -using System.Collections.Immutable; -#endif namespace Mongo.Migration.Documents.Locators; -public class CollectionLocator : AbstractLocator, ICollectionLocator +public class CollectionLocator : AbstractLocator, ICollectionLocator { + protected override CollectionLocationInformation GetAttributeValue(CollectionLocationAttribute attribute) + { + return attribute.CollectionInformation; + } + public override CollectionLocationInformation? GetLocateOrNull(Type identifier) { if (!LocatesDictionary.ContainsKey(identifier)) @@ -20,17 +20,6 @@ public class CollectionLocator : AbstractLocator() -#if NET8_0_OR_GREATER - .ToFrozenDictionary(pair => pair.Item1, pair => pair.Item2.CollectionInformation); -#else - .ToImmutableDictionary(pair => pair.Item1, pair => pair.Item2.CollectionInformation); -#endif - - } - public IDictionary GetLocatesOrEmpty() { return LocatesDictionary; diff --git a/Mongo.Migration/Documents/Locators/ILocator.cs b/Mongo.Migration/Documents/Locators/ILocator.cs index afc587c..c79677a 100644 --- a/Mongo.Migration/Documents/Locators/ILocator.cs +++ b/Mongo.Migration/Documents/Locators/ILocator.cs @@ -5,6 +5,4 @@ public interface ILocator where TTypeIdentifier : class { TReturnType? GetLocateOrNull(TTypeIdentifier identifier); - - void Locate(); } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs index 47ea10e..47785e0 100644 --- a/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/RuntimeVersionLocator.cs @@ -1,27 +1,20 @@ -#if NET8_0_OR_GREATER -using System.Collections.Frozen; -#else -using System.Collections.Immutable; -#endif +using System.Collections.Frozen; using Mongo.Migration.Documents.Attributes; namespace Mongo.Migration.Documents.Locators; -internal class RuntimeVersionLocator : AbstractLocator, IRuntimeVersionLocator +internal class RuntimeVersionLocator : AbstractLocator, IRuntimeVersionLocator { -#if NET8_0_OR_GREATER private readonly FrozenDictionary _codeDefinedDictionary; -#else - private readonly ImmutableDictionary _codeDefinedDictionary; -#endif internal RuntimeVersionLocator(IEnumerable> alreadyDefinedRuntimeVersions) { -#if NET8_0_OR_GREATER _codeDefinedDictionary = alreadyDefinedRuntimeVersions.ToFrozenDictionary(); -#else - _codeDefinedDictionary = alreadyDefinedRuntimeVersions.ToImmutableDictionary(); -#endif + } + + protected override DocumentVersion GetAttributeValue(RuntimeVersionAttribute attribute) + { + return attribute.Version; } public override DocumentVersion? GetLocateOrNull(Type identifier) @@ -31,21 +24,6 @@ internal RuntimeVersionLocator(IEnumerable> return version; } - if (LocatesDictionary.TryGetValue(identifier, out version)) - { - return version; - } - - return null; - } - - public override void Locate() - { - LocatesDictionary = LocateAttributes() -#if NET8_0_OR_GREATER - .ToFrozenDictionary(pair => pair.Item1, pair => pair.Item2.Version); -#else - .ToImmutableDictionary(pair => pair.Item1, pair => pair.Item2.Version); -#endif + return base.GetLocateOrNull(identifier); } } \ No newline at end of file diff --git a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs index cb889ad..5ef96c4 100644 --- a/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs +++ b/Mongo.Migration/Documents/Locators/StartUpVersionLocator.cs @@ -1,32 +1,11 @@ -#if NET8_0_OR_GREATER -using System.Collections.Frozen; -#else -using System.Collections.Immutable; -#endif -using Mongo.Migration.Documents.Attributes; +using Mongo.Migration.Documents.Attributes; namespace Mongo.Migration.Documents.Locators; -internal class StartUpVersionLocator : AbstractLocator, IStartUpVersionLocator +internal class StartUpVersionLocator : AbstractLocator, IStartUpVersionLocator { - public override DocumentVersion? GetLocateOrNull(Type identifier) + protected override DocumentVersion GetAttributeValue(StartUpVersionAttribute attribute) { - if (!LocatesDictionary.ContainsKey(identifier)) - { - return null; - } - - LocatesDictionary.TryGetValue(identifier, out var value); - return value; - } - - public override void Locate() - { - LocatesDictionary = LocateAttributes() -#if NET8_0_OR_GREATER - .ToFrozenDictionary(pair => pair.Item1, pair => pair.Item2.Version); -#else - .ToImmutableDictionary(pair => pair.Item1, pair => pair.Item2.Version); -#endif + return attribute.Version; } } \ No newline at end of file diff --git a/Mongo.Migration/Extensions/EnumerableExtensions.cs b/Mongo.Migration/Extensions/EnumerableExtensions.cs index e331d8d..ea936f1 100644 --- a/Mongo.Migration/Extensions/EnumerableExtensions.cs +++ b/Mongo.Migration/Extensions/EnumerableExtensions.cs @@ -1,4 +1,6 @@ -using Mongo.Migration.Documents; +using System.Collections.Frozen; +using System.Collections.ObjectModel; +using Mongo.Migration.Documents; using Mongo.Migration.Exceptions; using Mongo.Migration.Migrations; @@ -23,29 +25,16 @@ private static IEnumerable CheckForDuplicates(th } } - internal static IDictionary> ToMigrationDictionary( + internal static IDictionary> ToMigrationDictionary( this IEnumerable migrations) where TMigrationType : IMigration { - var dictionary = new Dictionary>(); - var list = migrations.ToList(); - var types = (from m in list select m.Type).Distinct(); - - foreach (var type in types) - { - if (dictionary.ContainsKey(type)) - { - continue; - } - - var uniqueMigrations = list - .Where(m => m.Type == type) - .CheckForDuplicates() - .OrderBy(m => m.Version) - .ToList(); - dictionary.Add(type, uniqueMigrations); - } - - return dictionary; + return migrations + .GroupBy(m => m.Type) + .ToFrozenDictionary( + g => g.Key, + g => g + .CheckForDuplicates() + .OrderBy(m => m.Version).ToList().AsReadOnly()); } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Document/DocumentMigration.cs b/Mongo.Migration/Migrations/Document/DocumentMigration.cs index 1985305..31f8392 100644 --- a/Mongo.Migration/Migrations/Document/DocumentMigration.cs +++ b/Mongo.Migration/Migrations/Document/DocumentMigration.cs @@ -5,14 +5,17 @@ namespace Mongo.Migration.Migrations.Document; public abstract class DocumentMigration : IDocumentMigration { - protected DocumentMigration(string version) + protected DocumentMigration(DocumentVersion version) { - Version = DocumentVersion.Parse(version.AsSpan()); + Version = version; } + protected DocumentMigration(ReadOnlySpan span) + : this(DocumentVersion.Parse(span)) { } + public DocumentVersion Version { get; } - public Type Type => typeof(TClass); + public Type Type { get; } = typeof(TClass); public abstract void Up(BsonDocument document); diff --git a/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs index 6185ee9..e9a8c01 100644 --- a/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/DatabaseTypeMigrationDependencyLocator.cs @@ -5,23 +5,6 @@ namespace Mongo.Migration.Migrations.Locators; internal class DatabaseTypeMigrationDependencyLocator : TypeMigrationDependencyLocator, IDatabaseTypeMigrationDependencyLocator { - private IDictionary>? _migrations; public DatabaseTypeMigrationDependencyLocator(ILogger logger, IServiceProvider serviceProvider) : base(logger, serviceProvider) { } - - protected override IDictionary> Migrations - { - get - { - if (_migrations == null) - { - Locate(); - } - - return _migrations!; - } - set => _migrations = value; - } - - } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/IDatabaseTypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/IDatabaseTypeMigrationDependencyLocator.cs index 8cd8dca..3b9f22d 100644 --- a/Mongo.Migration/Migrations/Locators/IDatabaseTypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/IDatabaseTypeMigrationDependencyLocator.cs @@ -2,6 +2,4 @@ namespace Mongo.Migration.Migrations.Locators; -internal interface IDatabaseTypeMigrationDependencyLocator : IMigrationLocator -{ -} \ No newline at end of file +internal interface IDatabaseTypeMigrationDependencyLocator : IMigrationLocator; \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs index ee0a8e8..6b45799 100644 --- a/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/IMigrationLocator.cs @@ -13,5 +13,5 @@ public interface IMigrationLocator DocumentVersion GetLatestVersion(Type type); - void Locate(); + void Initialize(); } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs index ba45a6f..f5b5700 100644 --- a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs @@ -1,7 +1,9 @@ -using System.Collections.Immutable; +using System.Collections.ObjectModel; using System.Reflection; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Mongo.Migration.Documents; +using Mongo.Migration.Extensions; namespace Mongo.Migration.Migrations.Locators; @@ -10,36 +12,21 @@ public abstract class MigrationLocator : IMigrationLocator> _logger; - private readonly List _assemblies; + private readonly IServiceProvider _serviceProvider; - private IDictionary>? _migrations; + private readonly Lazy>> _lazyMigrations; - protected MigrationLocator(ILogger> logger) + protected MigrationLocator(ILogger> logger, IServiceProvider serviceProvider) { _logger = logger; - _assemblies = GetAssemblies(); + _serviceProvider = serviceProvider; + _lazyMigrations = new Lazy>>( + LoadMigrations, + LazyThreadSafetyMode.PublicationOnly); } - protected IEnumerable Assemblies => _assemblies; - - protected virtual IDictionary> Migrations - { - get - { - if (_migrations is null) - { - Locate(); - } - - if (_migrations is null || _migrations.Count <= 0) - { - _logger.LogWarning("No migration found"); - } - - return _migrations ?? ImmutableDictionary>.Empty; - } - set => _migrations = value; - } + protected virtual IDictionary> Migrations + => _lazyMigrations.Value; public IReadOnlyCollection GetMigrations(Type type) { @@ -73,7 +60,32 @@ public DocumentVersion GetLatestVersion(Type type) : DocumentVersion.Default; } - public abstract void Locate(); + public void Initialize() + { + if (!_lazyMigrations.IsValueCreated) + { + var migrations = _lazyMigrations.Value; + _logger.LogDebug("Migration locator initialized and loaded {Count} migrations", migrations.Count); + } + } + + private IDictionary> LoadMigrations() + { + Type migrationType = typeof(TMigrationType); + + List assemblies = GetAssemblies(); + + var migrationTypes = assemblies + .SelectMany(a => a.GetExportedTypes()) + .Where(type => !type.IsAbstract && migrationType.IsAssignableFrom(type)) + .DistinctBy(t => t.AssemblyQualifiedName) + .Select(GetMigrationInstance) + .ToMigrationDictionary(); + + _logger.LogDebug("{Count} {MigrationType} migrations found", migrationTypes.Count, migrationType.Name); + + return migrationTypes; + } private static List GetAssemblies() { @@ -92,4 +104,24 @@ private static List GetAssemblies() return assemblies; } + + private TMigrationType GetMigrationInstance(Type type) + { + ConstructorInfo[] constructors = type.GetConstructors(); + + if (constructors.Length > 0) + { + var args = constructors + .First() + .GetParameters() + .Select(parameterInfo => _serviceProvider.GetRequiredService(parameterInfo.ParameterType)) + .ToArray(); + + return Activator.CreateInstance(type, args) as TMigrationType + ?? throw new InvalidOperationException($"Cannot create {type} migration"); + } + + return Activator.CreateInstance(type) as TMigrationType + ?? throw new InvalidOperationException($"Cannot create {type} migration"); + } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs index c628fcc..967ea5c 100644 --- a/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs +++ b/Mongo.Migration/Migrations/Locators/TypeMigrationDependencyLocator.cs @@ -1,63 +1,10 @@ -using System.Reflection; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Mongo.Migration.Extensions; +using Microsoft.Extensions.Logging; namespace Mongo.Migration.Migrations.Locators; internal class TypeMigrationDependencyLocator : MigrationLocator where TMigrationType : class, IMigration { - private readonly IServiceProvider _serviceProvider; - public TypeMigrationDependencyLocator(ILogger> logger, IServiceProvider serviceProvider) - : base(logger) - { - _serviceProvider = serviceProvider; - } - - public override void Locate() - { - var migrationTypes = - (from assembly in Assemblies - from type in assembly.GetTypes() - where typeof(TMigrationType).IsAssignableFrom(type) && !type.IsAbstract - select type).Distinct(new TypeComparer()); - - Migrations = migrationTypes.Select(GetMigrationInstance).ToMigrationDictionary(); - } - - private TMigrationType GetMigrationInstance(Type type) - { - ConstructorInfo[] constructors = type.GetConstructors(); - - if (constructors.Length > 0) - { - var args = constructors - .First() - .GetParameters() - .Select(parameterInfo => _serviceProvider.GetRequiredService(parameterInfo.ParameterType)) - .ToArray(); - - return Activator.CreateInstance(type, args) as TMigrationType - ?? throw new InvalidOperationException($"Cannot create {type} migration"); - } - - return Activator.CreateInstance(type) as TMigrationType - ?? throw new InvalidOperationException($"Cannot create {type} migration"); - } - - private class TypeComparer : IEqualityComparer - { - public bool Equals(Type? x, Type? y) - { - return x?.AssemblyQualifiedName == y?.AssemblyQualifiedName; - } - - public int GetHashCode(Type obj) - { - return obj.AssemblyQualifiedName?.GetHashCode() - ?? throw new InvalidOperationException($"Cannot get AssemblyQualifiedName from {obj}"); - } - } + : base(logger, serviceProvider) { } } \ No newline at end of file diff --git a/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs b/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs index 2b0d495..4caf514 100644 --- a/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/TypeMigrationLocator.cs @@ -1,25 +1,9 @@ using Microsoft.Extensions.Logging; -using Mongo.Migration.Extensions; using Mongo.Migration.Migrations.Document; namespace Mongo.Migration.Migrations.Locators; internal class TypeMigrationLocator : MigrationLocator { - public TypeMigrationLocator(ILogger logger) : base(logger) { } - - public override void Locate() - { - var migrationTypes = - (from assembly in Assemblies - from type in assembly.GetTypes() - where typeof(IDocumentMigration).IsAssignableFrom(type) && !type.IsAbstract - select type).Distinct(); - - Migrations = migrationTypes - .Select(t => - Activator.CreateInstance(t) as IDocumentMigration - ?? throw new InvalidOperationException($"Cannot create {t} document migration")) - .ToMigrationDictionary(); - } + public TypeMigrationLocator(ILogger logger, IServiceProvider serviceProvider) : base(logger, serviceProvider) { } } \ No newline at end of file diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index 75f2b21..e16246d 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -1,11 +1,10 @@  - net7.0;net8.0;net9.0 + net8.0;net9.0 13.0 enable enable - op-icon.png embedded true true @@ -15,10 +14,10 @@ - Mongo.Migration + Mongo.RuntimeMigration git https://github.com/rpallares/Mongo.Migration - SRoddis;delepster;pleveille333;etiennelepagel;rpallares + rpallares Mongo.Migration is designed for the MongoDB.Driver to migrate documents easily and on-the-fly mongo, library, migration MIT @@ -28,7 +27,6 @@ - diff --git a/Mongo.Migration/Services/MigrationService.cs b/Mongo.Migration/Services/MigrationService.cs index c4f04f7..104d717 100644 --- a/Mongo.Migration/Services/MigrationService.cs +++ b/Mongo.Migration/Services/MigrationService.cs @@ -6,6 +6,7 @@ using Mongo.Migration.Documents.Serializers; using Mongo.Migration.Migrations.Database; using Mongo.Migration.Migrations.Document; +using Mongo.Migration.Migrations.Locators; using Mongo.Migration.Startup; using MongoDB.Bson.Serialization; using MongoDB.Driver; @@ -40,6 +41,9 @@ public void RegisterBsonStatics() { MigrationBsonSerializerProvider migrationSerializerProvider = _provider.GetRequiredService(); BsonSerializer.RegisterSerializationProvider(migrationSerializerProvider); + + var documentMigrationLocator = _provider.GetRequiredService>(); + documentMigrationLocator.Initialize(); } } diff --git a/README.md b/README.md index 35e318a..112c9be 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ ![GitHub License](https://img.shields.io/github/license/rpallares/Mongo.Migration) -![NuGet Downloads](https://img.shields.io/nuget/dt/Mongo.Migration) -![NuGet](https://img.shields.io/nuget/v/Mongo.Migration) +![NuGet Downloads](https://img.shields.io/nuget/dt/Mongo.RuntimeMigration) +![NuGet](https://img.shields.io/nuget/v/Mongo.RuntimeMigration) ![GitHub last commit](https://img.shields.io/github/last-commit/rpallares/Mongo.Migration) -# Mongo.Migration +# Mongo.RuntimeMigration ![](https://media.giphy.com/media/10tLOFXDFDjgQM/giphy.gif) -Mongo.Migration is designed for the [MongoDB C# Driver](https://github.com/mongodb/mongo-csharp-driver) to migrate your documents easily and on-the-fly. +Mongo.RuntimeMigration is designed for the [MongoDB C# Driver](https://github.com/mongodb/mongo-csharp-driver) to migrate your documents easily and on-the-fly. No more downtime for schema-migrations. Just write small and simple `migrations`. -Version 5.0.0 of Mongo.Migration is a code modernization and simplification release. It also has a strong focus on performance. +Version 5.0.0 of Mongo.RuntimeMigration is a code modernization and simplification release. It also has a strong focus on performance. The library is still based on the official [MongoDB.Driver](https://www.mongodb.com/docs/drivers/csharp/) (3.0.0+) and supports the following 3 types of migration: - **Runtime document migration:** @@ -28,11 +28,11 @@ A robust application will probably use two kind of migrations. # Installation -Install via nuget https://www.nuget.org/packages/Mongo.Migration +Install via nuget https://www.nuget.org/packages/Mongo.RuntimeMigration **Note:** The package isn't maintained since a while, so for now it's preferable to compile it locally ```shell -dotnet add package Mongo.Migration +dotnet add package Mongo.RuntimeMigration ``` # Register migration services @@ -114,7 +114,7 @@ You can still execute them at startup to migrate your database but this **is not } ``` 3`(Optional)` If you choose to put your migrations into an extra project, -add the suffix `".MongoMigrations"` to the name and make sure it is referenced in the main project. By convention Mongo.Migration collects all .dlls named like that in your bin folder. +add the suffix `".MongoMigrations"` to the name and make sure it is referenced in the main project. By convention Mongo.RuntimeMigration collects all .dlls named like that in your bin folder. Compile, run and enjoy! @@ -180,7 +180,7 @@ public class Car : IDocument { } ## CollectionLocation Add `CollectionLocation` attribute if you want to migrate your collections at startup with document migration. -This attribute tells Mongo.Migration where to find your Collections. +This attribute tells Mongo.RuntimeMigration where to find your Collections. ```csharp [CollectionLocation("Car")] @@ -202,11 +202,11 @@ Deploy the migrations in a separate artifact. Otherwise, you lose the ability to # Performance The performance is measured on every push to the repository with a small performance-test. -It measures the time MongoDB needs to insert and read `n documents` (5000) with and without Mongo.Migration. The difference is asserted and should be not higher than a given tolerance (150ms). +It measures the time MongoDB needs to insert and read `n documents` (5000) with and without Mongo.RuntimeMigration. The difference is asserted and should be not higher than a given tolerance (150ms). Example output of the automated test: ```bash -MongoDB: 21ms, Mongo.Migration: 210ms, Diff: 189ms (Tolerance: 600ms), Documents: 5000, Migrations per Document: 2 +MongoDB: 21ms, Mongo.RuntimeMigration: 210ms, Diff: 189ms (Tolerance: 600ms), Documents: 5000, Migrations per Document: 2 ``` After bigger changes the code is analyzed with profiling tools to check for performance or memory problems. @@ -240,7 +240,7 @@ This could be not 100% exhaustive but v5.0.0 did a lot of changes comparing to o Consider also there was a lot of changes between the last 3.1.4 officially published version and the source code. ### Updates -- .Net version update (.net7_0, .net8_0, .net9_0) +- .Net version update (.net8_0, .net9_0) - MongDB.Driver@3.0.0+ - Dependency updates - Remove Mongo2Go in favor of Testcontainers @@ -268,5 +268,8 @@ Consider also there was a lot of changes between the last 3.1.4 officially publi 2. Remove .net7_0 support # License +Mongo.RuntimeMigration is licensed under [MIT](http://www.opensource.org/licenses/mit-license.php "Read more about the MIT license form"). Refer to license.txt for more information. -Mongo.Migration is licensed under [MIT](http://www.opensource.org/licenses/mit-license.php "Read more about the MIT license form"). Refer to license.txt for more information. +It has been forked from [SRoddis/Mongo.Migration](https://github.com/SRoddis/Mongo.Migration) that is no longer maintained. +That's why the nuget name is `Mongo.RuntimeMigration` whereas namespace is still `Mongo.Migration`. +Thanks to SRoddis for that library. From 6c59ee6320fd7385368e9db3014861c026f5f5bb Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Tue, 17 Jun 2025 15:36:19 +0200 Subject: [PATCH 36/42] improvement: Create migration instance using ActivatorUtilities (#14) --- .../Migrations/Locators/MigrationLocator.cs | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs index f5b5700..8895cd4 100644 --- a/Mongo.Migration/Migrations/Locators/MigrationLocator.cs +++ b/Mongo.Migration/Migrations/Locators/MigrationLocator.cs @@ -107,21 +107,7 @@ private static List GetAssemblies() private TMigrationType GetMigrationInstance(Type type) { - ConstructorInfo[] constructors = type.GetConstructors(); - - if (constructors.Length > 0) - { - var args = constructors - .First() - .GetParameters() - .Select(parameterInfo => _serviceProvider.GetRequiredService(parameterInfo.ParameterType)) - .ToArray(); - - return Activator.CreateInstance(type, args) as TMigrationType - ?? throw new InvalidOperationException($"Cannot create {type} migration"); - } - - return Activator.CreateInstance(type) as TMigrationType + return ActivatorUtilities.CreateInstance(_serviceProvider, type) as TMigrationType ?? throw new InvalidOperationException($"Cannot create {type} migration"); } } \ No newline at end of file From 0d8f2c23beae1aaafee6e4874954762dcf1c2e37 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Sat, 10 Jan 2026 16:02:06 +0100 Subject: [PATCH 37/42] update(chore): .net 10 update (#15) Co-authored-by: Rafael Pallares --- .github/workflows/build.yaml | 6 +- .github/workflows/publish.yaml | 6 +- LICENSE.txt => LICENSE.md | 4 +- ...rializer_when_serialize_and_deserialize.cs | 2 +- Mongo.Migration.Tests/IntegrationTest.cs | 2 +- .../Database/DatabaseIntegrationTest.cs | 2 +- ...tabaseMigrationRunner_when_migrating_up.cs | 12 ++-- ...mentMigrationRunner_when_migrating_down.cs | 8 +-- ...cumentMigrationRunner_when_migrating_up.cs | 12 ++-- .../DocumentMigration_when_creating.cs | 2 +- .../Interceptor/InterceptorTests.cs | 64 ++++++++----------- .../Mongo.Migration.Tests.csproj | 18 +++--- .../MongoDB/VariousCrudOperations.cs | 14 ++-- .../Performance/PerformanceOnStartup.cs | 4 +- ...grationInterceptorFactory_when_creating.cs | 4 +- .../Startup/MigrationBuilderTests.cs | 16 ++--- .../TestcontainersContext.cs | 4 +- Mongo.Migration.sln | 44 ------------- Mongo.Migration.slnx | 13 ++++ Mongo.Migration/Mongo.Migration.csproj | 6 +- .../Startup/MongoMigrationConfigurator.cs | 2 +- README.md | 58 ++++++++++------- global.json | 7 +- 23 files changed, 144 insertions(+), 166 deletions(-) rename LICENSE.txt => LICENSE.md (95%) delete mode 100644 Mongo.Migration.sln create mode 100644 Mongo.Migration.slnx diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 8bfd3bc..4f08da3 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -13,11 +13,11 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v4 + - uses: actions/checkout@v6 + - uses: actions/setup-dotnet@v5 - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build -c Release --no-restore - name: Test - run: dotnet test -c Release --no-build --framework net9.0 + run: dotnet test -c Release --no-build --framework net10.0 diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 648fa69..be99135 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -16,14 +16,14 @@ jobs: packages: write contents: read steps: - - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v4 + - uses: actions/checkout@v6 + - uses: actions/setup-dotnet@v5 - name: Set VERSION variable from tag run: echo "VERSION=${GITHUB_REF/refs\/tags\/v/}" >> $GITHUB_ENV - name: Build run: dotnet build -c Release /p:Version=${VERSION} - name: Test - run: dotnet test -c Release /p:Version=${VERSION} --no-build --framework net9.0 + run: dotnet test -c Release /p:Version=${VERSION} --no-build --framework net10.0 - name: Pack run: dotnet pack -c Release /p:Version=${VERSION} --no-build --output . - name: Push diff --git a/LICENSE.txt b/LICENSE.md similarity index 95% rename from LICENSE.txt rename to LICENSE.md index 6442aad..cfd64ed 100644 --- a/LICENSE.txt +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 Sean Roddis +Copyright (c) 2026 Rafael Pallares Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs index 7231754..5a89afe 100644 --- a/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs +++ b/Mongo.Migration.Tests/Documents/Serializers/DocumentVersionSerializer_when_serialize_and_deserialize.cs @@ -63,7 +63,7 @@ private static BsonDocumentReader CreateVersionReader(BsonDocument document) private static BsonDocumentWriter CreateVersionWriter() { - var writer = new BsonDocumentWriter(new BsonDocument()); + var writer = new BsonDocumentWriter([]); writer.WriteStartDocument(); writer.WriteName("version"); return writer; diff --git a/Mongo.Migration.Tests/IntegrationTest.cs b/Mongo.Migration.Tests/IntegrationTest.cs index 518feab..00ce512 100644 --- a/Mongo.Migration.Tests/IntegrationTest.cs +++ b/Mongo.Migration.Tests/IntegrationTest.cs @@ -5,7 +5,7 @@ namespace Mongo.Migration.Tests; [TestFixture] -public class IntegrationTest +public abstract class IntegrationTest { private const string DatabaseName = "IntegrationTest"; private const string CollectionName = "Test"; diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs index cecabb3..f1d6172 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseIntegrationTest.cs @@ -6,7 +6,7 @@ namespace Mongo.Migration.Tests.Migrations.Database; [TestFixture] -internal class DatabaseIntegrationTest +internal abstract class DatabaseIntegrationTest { private const string MigrationsCollectionName = "_migrations"; diff --git a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs index 33ba1e5..bea4bd8 100644 --- a/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Database/DatabaseMigrationRunner_when_migrating_up.cs @@ -22,13 +22,13 @@ public async Task When_database_has_no_migrations_Then_all_migrations_are_used() // Assert var migrations = GetMigrationHistory(); - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(migrations, Is.Not.Empty); Assert.That(migrations[0].Version.ToString(), Is.EqualTo("0.0.1")); Assert.That(migrations[1].Version.ToString(), Is.EqualTo("0.0.2")); Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); - }); + } } [Test] @@ -45,11 +45,11 @@ public async Task When_database_has_migrations_Then_latest_migrations_are_used() // Assert var migrations = GetMigrationHistory(); - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(migrations, Is.Not.Empty); Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); - }); + } } [Test] @@ -71,12 +71,12 @@ public async Task When_database_has_latest_version_Then_nothing_happens() // Assert var migrations = GetMigrationHistory(); - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(migrations, Is.Not.Empty); Assert.That(migrations[0].Version.ToString(), Is.EqualTo("0.0.1")); Assert.That(migrations[1].Version.ToString(), Is.EqualTo("0.0.2")); Assert.That(migrations[2].Version.ToString(), Is.EqualTo("0.0.3")); - }); + } } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs index 9c218a7..ce7ed76 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_down.cs @@ -24,11 +24,11 @@ public void When_migrating_down_Then_all_migrations_are_used() runner.Run(typeof(TestDocumentWithTwoMigration), document); // Assert - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(document.Names.ToList()[1], Is.EqualTo("Dors")); Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.0")); - }); + } } [Test] @@ -46,10 +46,10 @@ public void When_document_has_Then_all_migrations_are_used_to_that_version() runner.Run(typeof(TestDocumentWithTwoMigrationMiddleVersion), document); // Assert - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(document.Names.ToList()[1], Is.EqualTo("Doors1")); Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.1")); - }); + } } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs index a6eced9..1d775b0 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigrationRunner_when_migrating_up.cs @@ -24,11 +24,11 @@ public void When_migrate_up_the_lowest_version_Then_all_migrations_are_used() runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(document.Names.ToList()[1], Is.EqualTo("Door")); Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.2")); - }); + } } [Test] @@ -45,11 +45,11 @@ public void When_document_has_no_version_Then_all_migrations_are_used() runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(document["Door"].AsInt32, Is.EqualTo(3)); Assert.That(document["Version"].AsString, Is.EqualTo("0.0.2")); - }); + } } [Test] @@ -67,10 +67,10 @@ public void When_document_has_current_version_Then_nothing_happens() runner.Run(typeof(TestDocumentWithTwoMigrationHighestVersion), document); // Assert - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(document.Names.ToList()[1], Is.EqualTo("Door")); Assert.That(document.Values.ToList()[0].AsString, Is.EqualTo("0.0.2")); - }); + } } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs index 9acc13c..d32c488 100644 --- a/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs +++ b/Mongo.Migration.Tests/Migrations/Document/DocumentMigration_when_creating.cs @@ -33,6 +33,6 @@ public void Then_migration_should_be_created() var migration = new TestDocumentWithOneMigration001(); // Assert - Assert.That(migration, Is.TypeOf(typeof(TestDocumentWithOneMigration001))); + Assert.That(migration, Is.TypeOf()); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs b/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs index 31f2e2d..36442e1 100644 --- a/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs +++ b/Mongo.Migration.Tests/Migrations/Interceptor/InterceptorTests.cs @@ -38,45 +38,41 @@ public async Task TestDeserializationIntercepted() IMongoCollection testDocumentCollection = GetCollection(); - await untypedCollection.InsertManyAsync(new[] - { - new BsonDocument - { + await untypedCollection.InsertManyAsync( + [ + [ new("Doors0", new BsonInt32(0)) - }, - new BsonDocument - { + ], + [ new("Doors0", new BsonInt32(1)), new("Version", new BsonString("0.0.0")) - }, - new BsonDocument - { + ], + [ new("Doors1", new BsonInt32(2)), new("Version", new BsonString("0.0.1")) - }, - new BsonDocument - { + ], + [ new("Doors2", new BsonInt32(3)), new("Version", new BsonString("0.0.2")) - } - }); + ] + ]); var asyncCursor = await testDocumentCollection .FindAsync(FilterDefinition.Empty); List documents = await asyncCursor.ToListAsync(); - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(documents, Has.Count.EqualTo(4)); Assert.That( documents.Select(d => d.Version.ToString()), Is.All.EqualTo("0.0.1")); - Assert.That(documents[0].Doors1, Is.EqualTo(0)); + Assert.That(documents[0].Doors1, Is.Zero); Assert.That(documents[1].Doors1, Is.EqualTo(1)); Assert.That(documents[2].Doors1, Is.EqualTo(2)); Assert.That(documents[3].Doors1, Is.EqualTo(3)); - }); + } } [Test] @@ -106,45 +102,41 @@ public async Task TestDeserializationVersionAsStringIntercepted() IMongoCollection testDocumentCollection = GetCollection(); - await untypedCollection.InsertManyAsync(new[] - { - new BsonDocument - { + await untypedCollection.InsertManyAsync( + [ + [ new("Doors0", new BsonInt32(0)) - }, - new BsonDocument - { + ], + [ new("Doors0", new BsonInt32(1)), new("Version", new BsonString("0.0.0")) - }, - new BsonDocument - { + ], + [ new("Doors1", new BsonInt32(2)), new("Version", new BsonString("0.0.1")) - }, - new BsonDocument - { + ], + [ new("Doors2", new BsonInt32(3)), new("Version", new BsonString("0.0.2")) - } - }); + ] + ]); var asyncCursor = await testDocumentCollection .FindAsync(FilterDefinition.Empty); List documents = await asyncCursor.ToListAsync(); - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(documents, Has.Count.EqualTo(4)); Assert.That( documents.Select(d => d.Version.ToString()), Is.All.EqualTo("0.0.1")); - Assert.That(documents[0].Doors1, Is.EqualTo(0)); + Assert.That(documents[0].Doors1, Is.Zero); Assert.That(documents[1].Doors1, Is.EqualTo(1)); Assert.That(documents[2].Doors1, Is.EqualTo(2)); Assert.That(documents[3].Doors1, Is.EqualTo(3)); - }); + } } diff --git a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj index e99abf9..706aaf7 100644 --- a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj +++ b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj @@ -1,8 +1,8 @@  - net8.0;net9.0 - 13.0 + net10.0;net9.0;net8.0 + 14.0 enable enable false @@ -17,16 +17,16 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/Mongo.Migration.Tests/MongoDB/VariousCrudOperations.cs b/Mongo.Migration.Tests/MongoDB/VariousCrudOperations.cs index 9a8386c..9e1a044 100644 --- a/Mongo.Migration.Tests/MongoDB/VariousCrudOperations.cs +++ b/Mongo.Migration.Tests/MongoDB/VariousCrudOperations.cs @@ -62,8 +62,11 @@ public async Task TestRead() .Where(d => d.Doors >= 98) .Single(); - Assert.That(documentById.Id, Is.EqualTo(id)); - Assert.That(documentByExpression.Id, Is.EqualTo(id)); + using (Assert.EnterMultipleScope()) + { + Assert.That(documentById.Id, Is.EqualTo(id)); + Assert.That(documentByExpression.Id, Is.EqualTo(id)); + } } [Test] @@ -95,8 +98,11 @@ public async Task TestUpdate() .Where(d => d.Id == id) .Single(); - Assert.That(documentUpdated.Id, Is.EqualTo(id)); - Assert.That(documentUpdated.Doors, Is.EqualTo(8)); + using (Assert.EnterMultipleScope()) + { + Assert.That(documentUpdated.Id, Is.EqualTo(id)); + Assert.That(documentUpdated.Doors, Is.EqualTo(8)); + } } [Test] diff --git a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs index bcb45ce..7581fbc 100644 --- a/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs +++ b/Mongo.Migration.Tests/Performance/PerformanceOnStartup.cs @@ -85,13 +85,13 @@ private static async Task> QueryAllAsync(bool withVersion) var versionedCollection = client.GetDatabase(DatabaseName) .GetCollection(CollectionName); var versionedResult = await (await versionedCollection.FindAsync(_ => true)).ToListAsync(); - return versionedResult.Cast().ToList(); + return [.. versionedResult.Cast()]; } var collection = client.GetDatabase(DatabaseName) .GetCollection(CollectionName); var result = await (await collection.FindAsync(_ => true)).ToListAsync(); - return result.Cast().ToList(); + return [.. result.Cast()]; } private static async Task AddDocumentsToCacheAsync() diff --git a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs index 779bd08..1bf0cc3 100644 --- a/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs +++ b/Mongo.Migration.Tests/Services/Interceptors/MigrationInterceptorFactory_when_creating.cs @@ -19,7 +19,7 @@ public void If_type_is_assignable_to_document_Then_interceptor_is_created() IBsonSerializer serializer = serializerProvider.GetSerializer(typeof(TestDocumentWithOneMigration)); // Assert - Assert.That(serializer, Is.TypeOf(typeof(MigrationDocumentSerializer))); + Assert.That(serializer, Is.TypeOf>()); } [Test] @@ -45,6 +45,6 @@ public void If_type_is_not_assignable_to_document_but_manually_added_Then_interc IBsonSerializer serializer = serializerProvider.GetSerializer(typeof(TestClassWithTwoMigrationMiddleVersion)); // Assert - Assert.That(serializer, Is.TypeOf(typeof(MigrationReflexionSerializer))); + Assert.That(serializer, Is.TypeOf>()); } } \ No newline at end of file diff --git a/Mongo.Migration.Tests/Startup/MigrationBuilderTests.cs b/Mongo.Migration.Tests/Startup/MigrationBuilderTests.cs index 22948bb..ae22427 100644 --- a/Mongo.Migration.Tests/Startup/MigrationBuilderTests.cs +++ b/Mongo.Migration.Tests/Startup/MigrationBuilderTests.cs @@ -26,12 +26,12 @@ public void AllMigrationsEnabledWhenNotSet() MongoMigrationStartupSettings startupSettings = provider.GetRequiredService(); - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(startupSettings.RuntimeMigrationEnabled, Is.True); Assert.That(startupSettings.DatabaseMigrationEnabled, Is.True); Assert.That(startupSettings.StartupDocumentMigrationEnabled, Is.True); - }); + } } [Test] @@ -45,7 +45,7 @@ public void RuntimeMigrationOnlyRequiredRegistered() MongoMigrationStartupSettings startupSettings = provider.GetRequiredService(); - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(startupSettings.RuntimeMigrationEnabled, Is.True); Assert.That(startupSettings.DatabaseMigrationEnabled, Is.False); @@ -57,7 +57,7 @@ public void RuntimeMigrationOnlyRequiredRegistered() Assert.Throws(() => provider.GetRequiredService()); Assert.Throws(() => provider.GetRequiredService()); Assert.Throws(() => provider.GetRequiredService()); - }); + } } [Test] @@ -71,7 +71,7 @@ public void DatabaseMigrationOnlyRequiredRegistered() MongoMigrationStartupSettings startupSettings = provider.GetRequiredService(); - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(startupSettings.RuntimeMigrationEnabled, Is.False); Assert.That(startupSettings.DatabaseMigrationEnabled, Is.True); @@ -87,7 +87,7 @@ public void DatabaseMigrationOnlyRequiredRegistered() Assert.Throws(() => provider.GetRequiredService()); Assert.Throws(() => provider.GetRequiredService()); Assert.Throws(() => provider.GetRequiredService()); - }); + } } [Test] @@ -101,7 +101,7 @@ public void DocumentStartupMigrationOnlyRequiredRegistered() MongoMigrationStartupSettings startupSettings = provider.GetRequiredService(); - Assert.Multiple(() => + using (Assert.EnterMultipleScope()) { Assert.That(startupSettings.RuntimeMigrationEnabled, Is.False); Assert.That(startupSettings.DatabaseMigrationEnabled, Is.False); @@ -116,7 +116,7 @@ public void DocumentStartupMigrationOnlyRequiredRegistered() Assert.Throws(() => provider.GetRequiredService()); Assert.Throws(() => provider.GetRequiredService()); - }); + } } private static IServiceCollection CreateEmptyServiceCollection() diff --git a/Mongo.Migration.Tests/TestcontainersContext.cs b/Mongo.Migration.Tests/TestcontainersContext.cs index fe3db24..249684a 100644 --- a/Mongo.Migration.Tests/TestcontainersContext.cs +++ b/Mongo.Migration.Tests/TestcontainersContext.cs @@ -13,9 +13,7 @@ namespace Mongo.Migration.Tests; [SetUpFixture] public sealed class TestcontainersContext { - private static readonly Lazy s_lazyMongoDbContainer = new(() => - new MongoDbBuilder().Build() - ); + private static readonly Lazy s_lazyMongoDbContainer = new(() => new MongoDbBuilder("mongo:8").Build()); private static ServiceProvider? s_provider; diff --git a/Mongo.Migration.sln b/Mongo.Migration.sln deleted file mode 100644 index b4a4326..0000000 --- a/Mongo.Migration.sln +++ /dev/null @@ -1,44 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.4.33122.133 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Git", "Git", "{CB26356F-6A6A-4B13-BD95-672A8AF24518}" - ProjectSection(SolutionItems) = preProject - .gitignore = .gitignore - LICENSE.txt = LICENSE.txt - Readme.md = Readme.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{E7B1F839-44B5-46BE-9CAB-AEBC376EB100}" - ProjectSection(SolutionItems) = preProject - .github\workflows\build.yaml = .github\workflows\build.yaml - .github\workflows\publish.yaml = .github\workflows\publish.yaml - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo.Migration", "Mongo.Migration\Mongo.Migration.csproj", "{8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo.Migration.Tests", "Mongo.Migration.Tests\Mongo.Migration.Tests.csproj", "{1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Release|Any CPU.ActiveCfg = Debug|Any CPU - {8DFFD615-1E1A-4BED-8A96-CAF4C3637E81}.Release|Any CPU.Build.0 = Debug|Any CPU - {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Release|Any CPU.ActiveCfg = Debug|Any CPU - {1EEC8464-61D1-4FA3-97D4-21A35A45F3FE}.Release|Any CPU.Build.0 = Debug|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {141CC212-9A27-4082-94E7-A80340DFDF4C} - EndGlobalSection -EndGlobal diff --git a/Mongo.Migration.slnx b/Mongo.Migration.slnx new file mode 100644 index 0000000..13f16be --- /dev/null +++ b/Mongo.Migration.slnx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index e16246d..9b6d526 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -1,8 +1,8 @@  - net8.0;net9.0 - 13.0 + net10.0;net9.0;net8.0 + 14.0 enable enable embedded @@ -25,7 +25,7 @@ - + diff --git a/Mongo.Migration/Startup/MongoMigrationConfigurator.cs b/Mongo.Migration/Startup/MongoMigrationConfigurator.cs index fabf142..1be0f20 100644 --- a/Mongo.Migration/Startup/MongoMigrationConfigurator.cs +++ b/Mongo.Migration/Startup/MongoMigrationConfigurator.cs @@ -15,7 +15,7 @@ internal MongoMigrationConfigurator() { MongoMigrationSettings = new MongoMigrationSettings(); MongoMigrationStartupSettings = new MongoMigrationStartupSettings(); - RuntimeMigrationDictionary = new Dictionary(); + RuntimeMigrationDictionary = []; } public MongoMigrationConfigurator SetVersionFieldName(string fieldName) diff --git a/README.md b/README.md index 112c9be..19431cf 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -![GitHub License](https://img.shields.io/github/license/rpallares/Mongo.Migration) -![NuGet Downloads](https://img.shields.io/nuget/dt/Mongo.RuntimeMigration) -![NuGet](https://img.shields.io/nuget/v/Mongo.RuntimeMigration) -![GitHub last commit](https://img.shields.io/github/last-commit/rpallares/Mongo.Migration) +[![GitHub License](https://img.shields.io/github/license/rpallares/Mongo.Migration)]() +[![NuGet Downloads](https://img.shields.io/nuget/dt/Mongo.RuntimeMigration)](https://www.nuget.org/packages/Mongo.RuntimeMigration/) +[![NuGet](https://img.shields.io/nuget/v/Mongo.RuntimeMigration)](https://www.nuget.org/packages/Mongo.RuntimeMigration/) +[![GitHub last commit](https://img.shields.io/github/last-commit/rpallares/Mongo.Migration)](https://github.com/rpallares/Mongo.Migration/commits/master/) # Mongo.RuntimeMigration @@ -10,9 +10,10 @@ Mongo.RuntimeMigration is designed for the [MongoDB C# Driver](https://github.com/mongodb/mongo-csharp-driver) to migrate your documents easily and on-the-fly. No more downtime for schema-migrations. Just write small and simple `migrations`. -Version 5.0.0 of Mongo.RuntimeMigration is a code modernization and simplification release. It also has a strong focus on performance. +Version Mongo.RuntimeMigration is a code modernization and simplification release of [SRoddis/Mongo.Migration](https://github.com/SRoddis/Mongo.Migration). It also has a strong focus on performance. + +The library is still based on the official [MongoDB.Driver](https://www.mongodb.com/docs/drivers/csharp/) (3.5.2+) and supports the following 3 types of migration: -The library is still based on the official [MongoDB.Driver](https://www.mongodb.com/docs/drivers/csharp/) (3.0.0+) and supports the following 3 types of migration: - **Runtime document migration:** This kind of migration is executed at serialization/deserialization process. It allows your application to consume data serialized at another version - **Startup document migration:** @@ -21,19 +22,19 @@ The library is still based on the official [MongoDB.Driver](https://www.mongodb. - **Database migration:** This kind of migration give access to the entire database and allows to write much faster migrations. They also allow to manage indexes, rights, or any other maintenance of the database. -**Notes:** -A robust application will probably use two kind of migrations. +**Notes:** A robust application will probably use two kind of migrations. + - The database migration executed by the continuous integration - The runtime document migration executed by the runtime to prevent any error during the database migration # Installation -Install via nuget https://www.nuget.org/packages/Mongo.RuntimeMigration -**Note:** The package isn't maintained since a while, so for now it's preferable to compile it locally +Install via nuget [Mongo.RuntimeMigration](https://www.nuget.org/packages/Mongo.RuntimeMigration): ```shell dotnet add package Mongo.RuntimeMigration ``` + # Register migration services ```c# @@ -53,6 +54,7 @@ services ``` # Execute migrations + ```c# IServiceProvider provider = services.BuildServiceProvider(); @@ -113,13 +115,13 @@ You can still execute them at startup to migrate your database but this **is not } } ``` -3`(Optional)` If you choose to put your migrations into an extra project, +3. `(Optional)` If you choose to put your migrations into an extra project, add the suffix `".MongoMigrations"` to the name and make sure it is referenced in the main project. By convention Mongo.RuntimeMigration collects all .dlls named like that in your bin folder. Compile, run and enjoy! - # Database migrations quick start + Database migrations are very efficient to migrate large volume of data, and it allows to manage indexes or whatever you need. Here are some tips to implement your migrations: - Do not create transactions @@ -169,6 +171,7 @@ Here are some tips to implement your migrations: # Attributes ## RuntimeVersion + Add `RuntimeVersion` attribute to mark the current version of the document. So you have the possibility to downgrade in case of a rollback. If you do not set the `RuntimeVersion`, all migrations will be applied. @@ -215,19 +218,19 @@ Performance is also measured manually for runtime migration which has benefited Example output of the automated test: ```bash vanilla -- 1_000 => 15 ms -- 10_000 => 45 ms -- 50_000 => 168 ms +- 1_000 => 19 ms +- 10_000 => 38 ms +- 50_000 => 159 ms no migration: -- 1_000 => 13 ms -- 10_000 => 77 ms -- 50_000 => 157 ms +- 1_000 => 30 ms +- 10_000 => 95 ms +- 50_000 => 175 ms 2 migrations: -- 1_000 => 34 ms -- 10_000 => 258 ms -- 50_000 => 883 ms +- 1_000 => 68 ms +- 10_000 => 196 ms +- 50_000 => 768 ms ``` **Note:** These performance tests are not benchmark and results could vary. @@ -235,6 +238,13 @@ They should rely on BenchMarkDotNet and use in memory streams instead of mongo d # Release notes +## v5.1.0 +This version mostly introduce .Net 10 support. + +### Updates +- .Net version update (.net10.0, .net9.0, .net8.0) +- MongoDB.Driver@3.5.2 (required for .Net 10) + ## v5.0.0 This could be not 100% exhaustive but v5.0.0 did a lot of changes comparing to older versions. Consider also there was a lot of changes between the last 3.1.4 officially published version and the source code. @@ -265,11 +275,11 @@ Consider also there was a lot of changes between the last 3.1.4 officially publi # Next Feature/Todo 1. Create startup setting to limit database migrations ran at startup on fresh database -2. Remove .net7_0 support +2. Add real benchmark for runtime migrations # License -Mongo.RuntimeMigration is licensed under [MIT](http://www.opensource.org/licenses/mit-license.php "Read more about the MIT license form"). Refer to license.txt for more information. +Mongo.RuntimeMigration is licensed under [MIT](http://www.opensource.org/licenses/mit-license.php "Read more about the MIT license form"). Refer to [LICENSE.md](LICENSE.md) for more information. It has been forked from [SRoddis/Mongo.Migration](https://github.com/SRoddis/Mongo.Migration) that is no longer maintained. That's why the nuget name is `Mongo.RuntimeMigration` whereas namespace is still `Mongo.Migration`. -Thanks to SRoddis for that library. +Thanks to @SRoddis for that library. diff --git a/global.json b/global.json index 3f285f0..11fd6aa 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,9 @@ { "sdk": { - "rollForward": "feature", - "version": "9.0.103" + "version": "10.0.101", + "rollForward": "latestMajor" + }, + "test": { + "runner": "Microsoft.Testing.Platform" } } \ No newline at end of file From c433391a02b0c41e7dbf272649c6598283ab6c9f Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Sat, 17 Jan 2026 10:15:19 +0100 Subject: [PATCH 38/42] Update README according repo rename (#16) --- README.md | 40 +++------------------------------------- 1 file changed, 3 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 19431cf..8556413 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -[![GitHub License](https://img.shields.io/github/license/rpallares/Mongo.Migration)]() +[![GitHub License](https://img.shields.io/github/license/rpallares/Mongo.RuntimeMigration)](https://github.com/rpallares/Mongo.RuntimeMigration/tree/master?tab=MIT-1-ov-file) [![NuGet Downloads](https://img.shields.io/nuget/dt/Mongo.RuntimeMigration)](https://www.nuget.org/packages/Mongo.RuntimeMigration/) [![NuGet](https://img.shields.io/nuget/v/Mongo.RuntimeMigration)](https://www.nuget.org/packages/Mongo.RuntimeMigration/) -[![GitHub last commit](https://img.shields.io/github/last-commit/rpallares/Mongo.Migration)](https://github.com/rpallares/Mongo.Migration/commits/master/) +[![GitHub last commit](https://img.shields.io/github/last-commit/rpallares/Mongo.RuntimeMigration)](https://github.com/rpallares/Mongo.RuntimeMigration/commits/master/) # Mongo.RuntimeMigration @@ -10,7 +10,7 @@ Mongo.RuntimeMigration is designed for the [MongoDB C# Driver](https://github.com/mongodb/mongo-csharp-driver) to migrate your documents easily and on-the-fly. No more downtime for schema-migrations. Just write small and simple `migrations`. -Version Mongo.RuntimeMigration is a code modernization and simplification release of [SRoddis/Mongo.Migration](https://github.com/SRoddis/Mongo.Migration). It also has a strong focus on performance. +Version Mongo.RuntimeMigration is a code modernization and simplification release of [SRoddis/Mongo.Migration](https://github.com/SRoddis/Mongo.Migration). The library is still based on the official [MongoDB.Driver](https://www.mongodb.com/docs/drivers/csharp/) (3.5.2+) and supports the following 3 types of migration: @@ -202,40 +202,6 @@ public class Car : IDocument { } Deploy the migrations in a separate artifact. Otherwise, you lose the ability to downgrade in case of a rollback. -# Performance - -The performance is measured on every push to the repository with a small performance-test. -It measures the time MongoDB needs to insert and read `n documents` (5000) with and without Mongo.RuntimeMigration. The difference is asserted and should be not higher than a given tolerance (150ms). - -Example output of the automated test: -```bash -MongoDB: 21ms, Mongo.RuntimeMigration: 210ms, Diff: 189ms (Tolerance: 600ms), Documents: 5000, Migrations per Document: 2 -``` - -After bigger changes the code is analyzed with profiling tools to check for performance or memory problems. - -Performance is also measured manually for runtime migration which has benefited from a big performance gain since version 5.0.0. -Example output of the automated test: -```bash -vanilla -- 1_000 => 19 ms -- 10_000 => 38 ms -- 50_000 => 159 ms - -no migration: -- 1_000 => 30 ms -- 10_000 => 95 ms -- 50_000 => 175 ms - -2 migrations: -- 1_000 => 68 ms -- 10_000 => 196 ms -- 50_000 => 768 ms -``` - -**Note:** These performance tests are not benchmark and results could vary. -They should rely on BenchMarkDotNet and use in memory streams instead of mongo docker image, but it's indicative. - # Release notes ## v5.1.0 From 8aac69fd9635b4f20507a66a04cf207ba4c5987e Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Sat, 17 Jan 2026 10:23:07 +0100 Subject: [PATCH 39/42] Fix repository URL in project file (#17) --- Mongo.Migration/Mongo.Migration.csproj | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index 9b6d526..5899c9f 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -16,9 +16,9 @@ Mongo.RuntimeMigration git - https://github.com/rpallares/Mongo.Migration + https://github.com/rpallares/Mongo.RuntimeMigration/ rpallares - Mongo.Migration is designed for the MongoDB.Driver to migrate documents easily and on-the-fly + Mongo.RuntimeMigration is designed for the MongoDB.Driver to migrate documents easily and on-the-fly mongo, library, migration MIT README.md @@ -33,4 +33,5 @@ - \ No newline at end of file + + From 9bea651b1958a309141a205d53695a49ed65efc6 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Mon, 20 Apr 2026 18:11:50 +0200 Subject: [PATCH 40/42] Merge back rename to Mongo.Migration --- .github/workflows/publish.yaml | 2 +- .../Mongo.Migration.Tests.csproj | 2 +- Mongo.Migration/Mongo.Migration.csproj | 10 +++---- README.md | 28 ++++++++----------- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index be99135..ebf65ac 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -30,4 +30,4 @@ jobs: env: NUGET_SOURCE: ${{ vars.NUGET_SOURCE }} NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} - run: dotnet nuget push Mongo.RuntimeMigration.${VERSION}.nupkg --source $NUGET_SOURCE --api-key "$NUGET_API_KEY" + run: dotnet nuget push Mongo.Migration.${VERSION}.nupkg --source $NUGET_SOURCE --api-key "$NUGET_API_KEY" diff --git a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj index 706aaf7..69bc721 100644 --- a/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj +++ b/Mongo.Migration.Tests/Mongo.Migration.Tests.csproj @@ -1,7 +1,7 @@  - net10.0;net9.0;net8.0 + net10.0;net8.0 14.0 enable enable diff --git a/Mongo.Migration/Mongo.Migration.csproj b/Mongo.Migration/Mongo.Migration.csproj index 5899c9f..d3f56a7 100644 --- a/Mongo.Migration/Mongo.Migration.csproj +++ b/Mongo.Migration/Mongo.Migration.csproj @@ -1,7 +1,7 @@  - net10.0;net9.0;net8.0 + net10.0;net8.0 14.0 enable enable @@ -14,11 +14,11 @@ - Mongo.RuntimeMigration + Mongo.Migration git - https://github.com/rpallares/Mongo.RuntimeMigration/ - rpallares - Mongo.RuntimeMigration is designed for the MongoDB.Driver to migrate documents easily and on-the-fly + https://github.com/sroddis/Mongo.Migration/ + sroddis,rpallares + Mongo.Migration is designed for the MongoDB.Driver to migrate documents easily and on-the-fly mongo, library, migration MIT README.md diff --git a/README.md b/README.md index 8556413..630b12d 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,15 @@ -[![GitHub License](https://img.shields.io/github/license/rpallares/Mongo.RuntimeMigration)](https://github.com/rpallares/Mongo.RuntimeMigration/tree/master?tab=MIT-1-ov-file) -[![NuGet Downloads](https://img.shields.io/nuget/dt/Mongo.RuntimeMigration)](https://www.nuget.org/packages/Mongo.RuntimeMigration/) -[![NuGet](https://img.shields.io/nuget/v/Mongo.RuntimeMigration)](https://www.nuget.org/packages/Mongo.RuntimeMigration/) -[![GitHub last commit](https://img.shields.io/github/last-commit/rpallares/Mongo.RuntimeMigration)](https://github.com/rpallares/Mongo.RuntimeMigration/commits/master/) +[![GitHub License](https://img.shields.io/github/license/sroddis/Mongo.Migration)](https://github.com/sroddis/Mongo.Migration/tree/master?tab=MIT-1-ov-file) +[![NuGet Downloads](https://img.shields.io/nuget/dt/Mongo.Migration)](https://www.nuget.org/packages/Mongo.Migration/) +[![NuGet](https://img.shields.io/nuget/v/Mongo.Migration)](https://www.nuget.org/packages/Mongo.Migration/) +[![GitHub last commit](https://img.shields.io/github/last-commit/sroddis/Mongo.Migration)](https://github.com/sroddis/Mongo.Migration/commits/master/) -# Mongo.RuntimeMigration +# Mongo.Migration ![](https://media.giphy.com/media/10tLOFXDFDjgQM/giphy.gif) -Mongo.RuntimeMigration is designed for the [MongoDB C# Driver](https://github.com/mongodb/mongo-csharp-driver) to migrate your documents easily and on-the-fly. +Mongo.Migration is designed for the [MongoDB C# Driver](https://github.com/mongodb/mongo-csharp-driver) to migrate your documents easily and on-the-fly. No more downtime for schema-migrations. Just write small and simple `migrations`. -Version Mongo.RuntimeMigration is a code modernization and simplification release of [SRoddis/Mongo.Migration](https://github.com/SRoddis/Mongo.Migration). - The library is still based on the official [MongoDB.Driver](https://www.mongodb.com/docs/drivers/csharp/) (3.5.2+) and supports the following 3 types of migration: - **Runtime document migration:** @@ -29,10 +27,10 @@ The library is still based on the official [MongoDB.Driver](https://www.mongodb. # Installation -Install via nuget [Mongo.RuntimeMigration](https://www.nuget.org/packages/Mongo.RuntimeMigration): +Install via nuget [Mongo.Migration](https://www.nuget.org/packages/Mongo.Migration): ```shell -dotnet add package Mongo.RuntimeMigration +dotnet add package Mongo.Migration ``` # Register migration services @@ -116,7 +114,7 @@ You can still execute them at startup to migrate your database but this **is not } ``` 3. `(Optional)` If you choose to put your migrations into an extra project, -add the suffix `".MongoMigrations"` to the name and make sure it is referenced in the main project. By convention Mongo.RuntimeMigration collects all .dlls named like that in your bin folder. +add the suffix `".MongoMigrations"` to the name and make sure it is referenced in the main project. By convention Mongo.Migration collects all .dlls named like that in your bin folder. Compile, run and enjoy! @@ -183,7 +181,7 @@ public class Car : IDocument { } ## CollectionLocation Add `CollectionLocation` attribute if you want to migrate your collections at startup with document migration. -This attribute tells Mongo.RuntimeMigration where to find your Collections. +This attribute tells Mongo.Migration where to find your Collections. ```csharp [CollectionLocation("Car")] @@ -244,8 +242,4 @@ Consider also there was a lot of changes between the last 3.1.4 officially publi 2. Add real benchmark for runtime migrations # License -Mongo.RuntimeMigration is licensed under [MIT](http://www.opensource.org/licenses/mit-license.php "Read more about the MIT license form"). Refer to [LICENSE.md](LICENSE.md) for more information. - -It has been forked from [SRoddis/Mongo.Migration](https://github.com/SRoddis/Mongo.Migration) that is no longer maintained. -That's why the nuget name is `Mongo.RuntimeMigration` whereas namespace is still `Mongo.Migration`. -Thanks to @SRoddis for that library. +Mongo.Migration is licensed under [MIT](http://www.opensource.org/licenses/mit-license.php "Read more about the MIT license form"). Refer to [LICENSE.md](LICENSE.md) for more information. From 6890c96816465e409c6b4066e79f5a0141a4e020 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Sat, 2 May 2026 14:38:12 +0200 Subject: [PATCH 41/42] Merge/sroddis master (#18) * allow initialization without a MongoConnector when ConnectionString and Database have been provided in IMongoMigrationSettings * fixed downward migrations - skip downward migrations of versions that are > current databse version --------- Co-authored-by: Stephan Steiner Co-authored-by: Sean Roddis Co-authored-by: Rafael Pallares From f9329c77ed1dd8a4fe0b131172bc3986330329b3 Mon Sep 17 00:00:00 2001 From: Rafael Pallares Date: Sat, 2 May 2026 15:04:03 +0200 Subject: [PATCH 42/42] Merge/sroddis master (#19) * allow initialization without a MongoConnector when ConnectionString and Database have been provided in IMongoMigrationSettings * fixed downward migrations - skip downward migrations of versions that are > current databse version --------- Co-authored-by: Stephan Steiner Co-authored-by: Sean Roddis Co-authored-by: Rafael Pallares