diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 59ffc7e5..0e408bf8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -308,72 +308,4 @@ jobs: LogLevel: Warning TZ: UTC - integration-test: - name: Tests cli - needs: - - set-version-number - - build-standalone - strategy: - # We could really like to: - # - Start each database (on another host, using Docker, or other means, e.g. Azure SQL, etc - # - On all architectures available (windows-latest, linux-latest, macos-latest, and macos-14), - # - Run command-line tests against each database. - # - # This way, we can test against all variations of each database too, e.g. Azure SQL, SQL Server "on prem" (in docker), - # hosted Oracle databases, aws databases, etc. But we need to find a way to provision these databases both very fast, - # and cheap, for each one. - matrix: - category: - - SqlServer - - PostgreSQL - - MariaDB - - Sqlite - - Oracle - os: - # We can only run tests on Linux for now, until we start the database separately somewhere (azure, something) - # and run against an external database. Because the commandline tests are also for now _dependent_ on - # TestContainers, and running the database in a container using Docker. And Docker is only available on Linux - # on Github actions. - # - name: windows-latest - # arch: win-x64 - # executable: grate.exe - - name: ubuntu-latest - arch: linux-x64 - executable: grate - # - name: macos-latest - # arch: osx-x64 - # executable: grate - # macos-14 is M1 (arm64) - # - name: macos-14 - # arch: osx-x64 - # executable: grate - - runs-on: ${{ matrix.os.name }} - steps: - - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 - with: - name: grate-${{ matrix.os.arch }}-self-contained-${{ needs.set-version-number.outputs.nuGetVersion }} - path: executables/${{ matrix.os.arch }} - - name: Setup .NET 8 - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 8.0.x - - - name: chmod u+x - run: chmod u+x $GrateExecutablePath - if: ${{ matrix.os.arch != 'win-x64' }} - env: - GrateExecutablePath: ${{ github.workspace }}/executables/${{ matrix.os.arch }}/${{ matrix.os.executable }} - - name: Test - run: > - dotnet test - unittests/CommandLine/CommandLine.${{ matrix.category }} - --logger:"xunit;LogFilePath=/tmp/test-results/${{ matrix.os.arch }}/CommandLine.${{ matrix.category }}.xml" -- - -MaxCpuCount 2 - env: - LogLevel: Warning - GrateExecutablePath: ${{ github.workspace }}/executables/${{ matrix.os.arch }}/${{ matrix.os.executable }} - TZ: UTC - diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml new file mode 100644 index 00000000..e37790ba --- /dev/null +++ b/.github/workflows/integration-tests.yml @@ -0,0 +1,339 @@ +# Heavyweight integration tests +name: Integration tests + +on: + push: + branches: + - main + paths-ignore: + - docs/ + workflow_dispatch: + +permissions: + id-token: write # This is required for requesting the JWT + contents: read # This is required for actions/checkout + + +jobs: + set-version-number: + name: Set version number + runs-on: ubuntu-latest + outputs: + nuGetVersion: ${{ steps.gitversion.outputs.nuGetVersionV2 }} + semVer: ${{ steps.gitversion.outputs.fullSemVer }} + is-release: ${{ steps.gitversion.outputs.CommitsSinceVersionSource == 0 }} + #is-release: 'true' + + steps: + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Install GitVersion + uses: gittools/actions/gitversion/setup@v0.13.4 + with: + versionSpec: '5.x' + - name: Determine Version + id: gitversion + uses: gittools/actions/gitversion/execute@v0.13.4 + + build-standalone: + name: Build cli + needs: set-version-number + + runs-on: ubuntu-latest + strategy: + matrix: + arch: + - win-x64 + # - win-x86 + # - win-arm64 + # - linux-musl-x64 + # - linux-musl-arm64 + - linux-x64 + # - linux-arm64 + - osx-x64 + steps: + - uses: actions/checkout@v4 + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Publish self-contained ${{ matrix.arch }} + run: dotnet publish ./src/grate/grate.csproj -f net8.0 -r ${{ matrix.arch }} -c release --self-contained -p:SelfContained=true -o ./publish/${{ matrix.arch }}/self-contained + env: + VERSION: ${{ needs.set-version-number.outputs.nuGetVersion }} + + - name: Upload self-contained ${{ matrix.arch }} + uses: actions/upload-artifact@v4 + with: + name: grate-${{ matrix.arch }}-self-contained-${{ needs.set-version-number.outputs.nuGetVersion }} + path: ./publish/${{ matrix.arch }}/self-contained/* + + build-standalone-mac-arm64: + name: Build cli + needs: set-version-number + + # Use macos-14 to build osx-arm64, it runs on M1, see + # https://github.blog/changelog/2024-01-30-github-actions-introducing-the-new-m1-macos-runner-available-to-open-source/ + # + # I've earlier had problems with that the trimmed, self-contained binary for osx-arm64 that was built on Linux + # did not work when opened on an actual mac with arm64. + + runs-on: macos-14 + strategy: + matrix: + arch: [ "osx-arm64" ] + + steps: + - uses: actions/checkout@v4 + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Publish self-contained ${{ matrix.arch }} + run: dotnet publish ./src/grate/grate.csproj -f net8.0 -r ${{ matrix.arch }} -c release --self-contained -p:SelfContained=true -o ./publish/${{ matrix.arch }}/self-contained + env: + VERSION: ${{ needs.set-version-number.outputs.nuGetVersion }} + + - name: Upload self-contained ${{ matrix.arch }} + uses: actions/upload-artifact@v4 + with: + name: grate-${{ matrix.arch }}-self-contained-${{ needs.set-version-number.outputs.nuGetVersion }} + path: ./publish/${{ matrix.arch }}/self-contained/* + + setup-test-environment: + name: Set up test enviroment + environment: integration-tests + runs-on: ubuntu-latest + env: + tf_actions_working_dir: "${{ github.workspace }}/test-infra/terraform/test-environment" + ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} + ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} + + defaults: + run: + working-directory: ${{ env.tf_actions_working_dir }} + + outputs: + # Need to split the connection string in two, and assemble when used, as GitHub Actions refuses to + # write anything to the outputs that have what it considers sensitive values. And, 'Pwd=' + # apparently is. + mariadb_connection_string: ${{ steps.show.outputs.mariadb_connection_string }} + mariadb_pw: ${{ steps.show.outputs.mariadb_pw }} + + steps: + - uses: actions/checkout@v4 + + - name: Log into Azure + uses: azure/login@v1 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + - name: Show account info + run: > + az account show + + - uses: hashicorp/setup-terraform@v3 + + - run: terraform init + + - name: Terraform Validate + run: terraform validate + + - name: Terraform plan + id: plan + run: terraform plan -input=false + + # - run: echo ${{ steps.plan.outputs.stdout }} + # - run: echo ${{ steps.plan.outputs.stderr }} + # - run: echo ${{ steps.plan.outputs.exitcode }} + + - name: Exit on invalid Terraform plan + if: steps.plan.outcome == 'failure' + run: exit 1 + + - name: Terraform Apply + id: apply + run: terraform apply -auto-approve + + - name: Get terraform outputs + id: show + run: | + terraform show -json > state.json + HOST=$(cat state.json | jq -r '.values.outputs | ."mariadb-fqdn".value') + PW=$(cat state.json | jq -r '.values.outputs | ."mariadb-admin-password".value') + + CONNSTR="Server=${HOST};Port=3306;Database=mysql;Uid=root" + + echo "mariadb_connection_string=${CONNSTR}" >> "$GITHUB_OUTPUT" + echo "mariadb_pw=${PW}" >> "$GITHUB_OUTPUT" + + # - run: echo ${{ steps.apply.outputs.stdout }} + # - run: echo ${{ steps.apply.outputs.stderr }} + # - run: echo ${{ steps.apply.outputs.exitcode }} + + + integration-test: + environment: integration-tests + name: ${{ matrix.database.name }}, ${{ matrix.os.name }} + #name: "${{ matrix.os.name }}: ${{ matrix.database.name }}" + needs: + - set-version-number + - build-standalone + - build-standalone-mac-arm64 + - setup-test-environment + continue-on-error: true + + strategy: + fail-fast: false + matrix: + database: + # - name: SqlServer Conn1 + # project: SqlServer + # connectionstring: "DbConn SqlServer Conn1" + # - name: SqlServer Conn2 + # project: SqlServer + # connectionstring: "DbConn SqlServer Conn2" + # - name: "PostgreSQL Conn1" + # project: PostgreSQL + # connectionstring: "DbConn PostgreSQL Conn1" + # - name: "PostgreSQL Conn2" + # project: PostgreSQL + # connectionstring: "DbConn PostgreSQL Conn2" + - name: "MariaDB ACA" + project: MariaDB + connectionstring: "${{ needs.setup-test-environment.outputs.mariadb_connection_string }};Pwd=${{ needs.setup-test-environment.outputs.mariadb_pw }}" + # - name: "MariaDB Conn2" + # project: MariaDB + # connectionstring: "DbConn MariaDB Conn2" + # - name: "Sqlite Conn1" + # project: Sqlite + # connectionstring: "DbConn Sqlite Conn1" + # - name: "Sqlite Conn2" + # project: Sqlite + # connectionstring: "DbConn Sqlite Conn2" + # - name: "Oracle Conn1" + # project: Oracle + # connectionstring: "DbConn Oracle Conn1" + # - name: "Oracle Conn2" + # project: Oracle + # connectionstring: "DbConn Oracle Conn2" + os: + - name: windows-latest + arch: win-x64 + executable: grate.exe + - name: ubuntu-latest + arch: linux-x64 + executable: grate + - name: macos-latest + arch: osx-x64 + executable: grate + #macos-14 is M1 (arm64) + - name: macos-14 + arch: osx-arm64 + executable: grate + + runs-on: ${{ matrix.os.name }} + steps: + - name: Test run info + run: | + echo "Test run info:" + echo "====================" + echo "OS: ${{ matrix.os.name }}" + echo "Arch: ${{ matrix.os.arch }}" + echo "Executable: ${{ matrix.os.executable }}" + echo "Database: ${{ matrix.database.name }}" + echo "Connection string: ${{ matrix.database.connectionstring }}" + + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: grate-${{ matrix.os.arch }}-self-contained-${{ needs.set-version-number.outputs.nuGetVersion }} + path: executables/${{ matrix.os.arch }} + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: chmod u+x + run: chmod u+x $GrateExecutablePath + if: ${{ matrix.os.arch != 'win-x64' }} + env: + GrateExecutablePath: ${{ github.workspace }}/executables/${{ matrix.os.arch }}/${{ matrix.os.executable }} + + - name: Log into Azure + uses: azure/login@v1 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + + - name: Test + run: > + dotnet test + unittests/CommandLine/CommandLine.${{ matrix.database.project }} + --logger:"xunit;LogFilePath=/tmp/test-results/${{ matrix.os.arch }}/CommandLine.${{ matrix.database.project }}.xml" -- + -MaxCpuCount 2 + env: + LogLevel: Warning + GrateExecutablePath: ${{ github.workspace }}/executables/${{ matrix.os.arch }}/${{ matrix.os.executable }} + GrateTestConfig__AdminConnectionString: ${{ matrix.database.connectionstring }} + TZ: UTC + + teardown-test-environment: + name: Tear down test enviroment + environment: integration-tests + runs-on: ubuntu-latest + needs: integration-test + if: always() + #if: false + env: + tf_actions_working_dir: "${{ github.workspace }}/test-infra/terraform/test-environment" + ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} + ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} + + defaults: + run: + working-directory: ${{ env.tf_actions_working_dir }} + + steps: + - uses: actions/checkout@v4 + + - name: Log into Azure + uses: azure/login@v1 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + - name: Show account info + run: > + az account show + + - uses: hashicorp/setup-terraform@v3 + + - run: terraform init + + - name: Terraform Validate + run: terraform validate + + - id: plan-destroy + run: terraform plan -destroy -input=false + + # - name: Terraform Plan Status + # if: steps.plan.outcome == 'failure' + # run: exit 1 + + - name: Terraform Destroy + #run: terraform apply -destroy -auto-approve + run: terraform destroy -auto-approve + diff --git a/.gitignore b/.gitignore index e6c0f944..028c82ad 100644 --- a/.gitignore +++ b/.gitignore @@ -357,3 +357,5 @@ MigrationBackup/ /grate/Properties/launchSettings.json .DS_Store +.envrc +*.tfstate \ No newline at end of file diff --git a/Directory.Packages.props b/Directory.Packages.props index 53b005ff..ced8c979 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -32,5 +32,6 @@ + \ No newline at end of file diff --git a/test-infra/terraform/.gitignore b/test-infra/terraform/.gitignore new file mode 100644 index 00000000..0696b3eb --- /dev/null +++ b/test-infra/terraform/.gitignore @@ -0,0 +1 @@ +.terraform \ No newline at end of file diff --git a/test-infra/terraform/.terraform.lock.hcl b/test-infra/terraform/.terraform.lock.hcl new file mode 100644 index 00000000..2895de99 --- /dev/null +++ b/test-infra/terraform/.terraform.lock.hcl @@ -0,0 +1,41 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/azuread" { + version = "2.31.0" + constraints = "~> 2.31.0" + hashes = [ + "h1:0D8+cQBlCyA50NiiTJwNDK9QjKfZsjuHgXTFRlhIZyg=", + "zh:02a64db03707cc6970ab28a1da00d7fa011cc54e8a7806209f31bd8aad1794e1", + "zh:077ffce8135a57544ec3c227bbe0ee5f6ca649223bd1dc0bbbd31d3fdf616830", + "zh:0a369de6132edb0f4a69f2aa472b23f9bb5c430a3d539146d1c18d4cc7b12c7f", + "zh:14bfc5f2354c1389eb7ed8bf5a5eaadc9940e18c2dd15058eb9b48ea5c37ae66", + "zh:1c3e89cf19118fc07d7b04257251fc9897e722c16e0a0df7b07fcd261f8c12e7", + "zh:5629f020ac3409ad34a39e221fb2e63f82948c3eb936508331d5a7f870556e9d", + "zh:5b419eb59fa4e0b9c520c5cd5028f236bce6d9ab701c5ccca23cc040d3d690c4", + "zh:5e7e6207fd58a3e9ba54b7333169a3e3ea693c25c8f477622536600a8a09a3f1", + "zh:a9a552ad36d7a3db4554c6fbc716cf8631328331ea6188eddb4038b4c213ff46", + "zh:aee812d33916e5fdfb4d58ce74af0f3b2a7a58dbfb5ec8e0b42b5780ceff5414", + "zh:ce46738cd1909675b980bb90b9c3d919a4d1d655b4296082b86b6622ce818f7a", + "zh:db02dbe5ce139610688b354b15eb934f9f67ab32d6c5d63690dce6f9b8d90904", + ] +} + +provider "registry.terraform.io/hashicorp/azurerm" { + version = "3.94.0" + hashes = [ + "h1:t3fM/PO8PLAA5mK3esAypp01V6Vh75kjPnNqxQeVrV0=", + "zh:20d102bc63096ade82f8da81c91afaffa858aa56fe9a7ad02f24f5ae5618bc53", + "zh:3ddb9d6173a4fdb9b2352a76324ee321976915544ae66cbb863c7a60f0593f05", + "zh:4bc6c62142f67192d2def11f4fd419c54dddd89a5448af036bfc60b15eb0509a", + "zh:4c5120c2101a51524af32c4220c5e376f97a227730dd92ec0b06ac677e4b39f2", + "zh:585fa7ab876d09899cd2d842f12bc28c34556b4d47919eceadefab6fa47f909f", + "zh:59de7ea462470dee7088fc4deeff48e1ffd286eaca1185c219be68dadde745b8", + "zh:8421a46dd3bc4bc2eb56f7eb9b91cc84a66070b72195a805862c6022adee2da0", + "zh:a2fcb5a091d5944dc50f1e51f53fa4d370810a507fbf4122920d756083d8df19", + "zh:beb6b93a2a16942625bb6ac1e52bf26878e35f5562f3173279423ca66553b6d7", + "zh:c6846892ea68f49c838d90b75793d1f3a866871dd701ccb575b1eecccd4e7051", + "zh:ddd59492b6d5ce4c83f06a5b16c520048f3e9bb898bab4f3910042f5c01ffeda", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} diff --git a/test-infra/terraform/init/.terraform.lock.hcl b/test-infra/terraform/init/.terraform.lock.hcl new file mode 100644 index 00000000..c0b579b7 --- /dev/null +++ b/test-infra/terraform/init/.terraform.lock.hcl @@ -0,0 +1,40 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/azuread" { + version = "2.47.0" + hashes = [ + "h1:g8+gBFM4QVOEQFqAEs5pR6iXpbGvgPvcEi1evHwziyw=", + "zh:1372d81eb24ef3b4b00ea350fe87219f22da51691b8e42ce91d662f6c2a8af5e", + "zh:1c3e89cf19118fc07d7b04257251fc9897e722c16e0a0df7b07fcd261f8c12e7", + "zh:1e654a74d171d6ff8f9f6f67e3ff1421d4c5e56a18607703626bf12cd23ba001", + "zh:35227fad617a0509c64ab5759a8b703b10d244877f1aa5416bfbcc100c96996f", + "zh:357f553f0d78d46a96c7b2ed06d25ee0fc60fc5be19812ccb5d969fa47d62e17", + "zh:58faa2940065137e3e87d02eba59ab5cd7137d7a18caf225e660d1788f274569", + "zh:7308eda0339620fa24f47cedd22221fc2c02cab9d5be1710c09a783aea84eb3a", + "zh:863eabf7f908a8263e28d8aa2ad1381affd6bb5c67755216781f674ef214100e", + "zh:8b95b595a7c14ed7b56194d03cdec253527e7a146c1c58961be09e6b5c50baee", + "zh:afbca6b4fac9a0a488bc22ff9e51a8f14e986137d25275068fd932f379a51d57", + "zh:c6aadec4c81a44c3ffc22c2d90ffc6706bf5a9a903a395d896477516f4be6cbb", + "zh:e54a59de7d4ef0f3a18f91fed0b54a2bce18257ae2ee1df8a88226e1023c5811", + ] +} + +provider "registry.terraform.io/hashicorp/azurerm" { + version = "3.95.0" + hashes = [ + "h1:nyThHJeS3HbYCqgZskB/GOvQRt3DmNqFKmtUmAcr0AQ=", + "zh:36e96725fb5860b68c4f86d43988eadfe13ece7abfc3368bf01b2f4e253a05f8", + "zh:3f416b574518a63793dfda0efa588dd0d2432d4cbea5908d7a479f82f0a89a01", + "zh:3f94eb8dc1717bd5af524138258b65bb2011917e05db727a0696623d4a2cdf6f", + "zh:4fd395656aeb366830eebc11f10d29b2e9652b4d74e70bbe785768b7cbcf8d5c", + "zh:58bc5bd83a984f91faebbc71f27062d3a6ca4e3abfc2fe7fcd40833d8145c5a8", + "zh:5bfedb1592056da89c3cfa2cb409cdeadedc2d336a862d39c14a9a2a4424cb8a", + "zh:6135572aa2d99e95877a28deaa864742429ba7bba8ca39b5dd8261484d384c06", + "zh:8440dbc750cd06e51a640175acd2187ab2816e080c318ea278ef9657c3000675", + "zh:9dc9e301319f49c639535da6d5ed5d938a7c8153d4467816419466d343784d01", + "zh:e5c99bc6c960d0cc4f4aab4779ccb59ec8cc6802799f2fff9c41c945f2012f85", + "zh:e9d55f63a20054c3cbb95f14dc3670c89575893b9747eb2c2ee067e1bc521c48", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} diff --git a/test-infra/terraform/init/README.md b/test-infra/terraform/init/README.md new file mode 100644 index 00000000..c1ac40cc --- /dev/null +++ b/test-infra/terraform/init/README.md @@ -0,0 +1,7 @@ +# Init + +This sets up the infrastructure in the azure subscription which is used to set up the test infrastructure on each test run. + +It creates a resource group, and a service principal with full access to that resource group, to make it easier to control access. + +This folder is typically only run once-ish. \ No newline at end of file diff --git a/test-infra/terraform/init/github.tf b/test-infra/terraform/init/github.tf new file mode 100644 index 00000000..4194e9f0 --- /dev/null +++ b/test-infra/terraform/init/github.tf @@ -0,0 +1,4 @@ +# resource "github_repository_environment" "integration-tests" { +# environment = "integration-tests" +# repository = github_repository.example.name +# } \ No newline at end of file diff --git a/test-infra/terraform/init/locals.tf b/test-infra/terraform/init/locals.tf new file mode 100644 index 00000000..bf1e8fd7 --- /dev/null +++ b/test-infra/terraform/init/locals.tf @@ -0,0 +1,4 @@ +locals { + default_audience_name = "api://AzureADTokenExchange" + github_issuer_url = "https://token.actions.githubusercontent.com" +} \ No newline at end of file diff --git a/test-infra/terraform/init/main.tf b/test-infra/terraform/init/main.tf new file mode 100644 index 00000000..8e208518 --- /dev/null +++ b/test-infra/terraform/init/main.tf @@ -0,0 +1,22 @@ +terraform { + backend "azurerm" { + resource_group_name = "grate-tests-infra" + storage_account_name = "grateconfig" + container_name = "grate-tests-infra-setup" + key = "init.tfstate" + } + + required_providers { + azurerm = { + source = "hashicorp/azurerm" + } + azuread = {} + } +} + +provider "azurerm" { + features {} +} + +provider "azuread" { +} diff --git a/test-infra/terraform/init/managed-identity.tf b/test-infra/terraform/init/managed-identity.tf new file mode 100644 index 00000000..6ee074de --- /dev/null +++ b/test-infra/terraform/init/managed-identity.tf @@ -0,0 +1,35 @@ +resource "azurerm_user_assigned_identity" "integration-tests-mi" { + location = azurerm_resource_group.grate-integration-tests.location + name = "integration-tests-mi" + resource_group_name = azurerm_resource_group.grate-integration-tests.name +} + +resource "azurerm_role_assignment" "integration-tests-rg-contributor" { + scope = azurerm_resource_group.grate-integration-tests.id + role_definition_name = "Contributor" + principal_id = azurerm_user_assigned_identity.integration-tests-mi.principal_id +} + +resource "azurerm_role_assignment" "terraform-state-contributor" { + scope = azurerm_storage_container.grate-tests-setup.resource_manager_id + role_definition_name = "Storage Blob Data Owner" + principal_id = azurerm_user_assigned_identity.integration-tests-mi.principal_id +} + +resource "azurerm_federated_identity_credential" "integration-tests" { + name = "${var.github_organisation_target}-${var.github_repository_name}-integration-tests" + resource_group_name = azurerm_resource_group.grate-integration-tests.name + audience = [local.default_audience_name] + issuer = local.github_issuer_url + parent_id = azurerm_user_assigned_identity.integration-tests-mi.id + subject = "repo:${var.github_organisation_target}/${var.github_repository_name}:environment:integration-tests" +} + +resource "azurerm_federated_identity_credential" "integration-tests2" { + name = "${var.github_organisation_target}-${var.github_repository_name}-integration-tests2" + resource_group_name = azurerm_resource_group.grate-integration-tests.name + audience = [local.default_audience_name] + issuer = local.github_issuer_url + parent_id = azurerm_user_assigned_identity.integration-tests-mi.id + subject = "repo:${var.github_organisation_target}/${var.github_repository_name}:environment:integration-tests2" +} diff --git a/test-infra/terraform/init/resource-group.tf b/test-infra/terraform/init/resource-group.tf new file mode 100644 index 00000000..f4afa7bc --- /dev/null +++ b/test-infra/terraform/init/resource-group.tf @@ -0,0 +1,8 @@ +resource "azurerm_resource_group" "grate-integration-tests" { + name = "grate-integration-tests" + location = "eastus" +} + +# data "azurerm_resource_group" "grate-tests-infra" { +# name = "grate-tests-infra" +# } \ No newline at end of file diff --git a/test-infra/terraform/init/tfstate-storage-container.tf b/test-infra/terraform/init/tfstate-storage-container.tf new file mode 100644 index 00000000..bb18154d --- /dev/null +++ b/test-infra/terraform/init/tfstate-storage-container.tf @@ -0,0 +1,9 @@ +resource "azurerm_storage_container" "grate-tests-setup" { + name = "grate-tests-setup" + storage_account_name = "grateconfig" +} + +data "azurerm_storage_account" "grateconfig" { + name = "grateconfig" + resource_group_name = "grate-tests-infra" +} diff --git a/test-infra/terraform/init/variables.tf b/test-infra/terraform/init/variables.tf new file mode 100644 index 00000000..cc52733f --- /dev/null +++ b/test-infra/terraform/init/variables.tf @@ -0,0 +1,7 @@ +variable "github_organisation_target" { + default = "erikbra" +} + +variable "github_repository_name" { + default = "grate" +} \ No newline at end of file diff --git a/test-infra/terraform/test-environment/.terraform.lock.hcl b/test-infra/terraform/test-environment/.terraform.lock.hcl new file mode 100644 index 00000000..76cd5d9e --- /dev/null +++ b/test-infra/terraform/test-environment/.terraform.lock.hcl @@ -0,0 +1,59 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/azuread" { + version = "2.47.0" + hashes = [ + "h1:g8+gBFM4QVOEQFqAEs5pR6iXpbGvgPvcEi1evHwziyw=", + "zh:1372d81eb24ef3b4b00ea350fe87219f22da51691b8e42ce91d662f6c2a8af5e", + "zh:1c3e89cf19118fc07d7b04257251fc9897e722c16e0a0df7b07fcd261f8c12e7", + "zh:1e654a74d171d6ff8f9f6f67e3ff1421d4c5e56a18607703626bf12cd23ba001", + "zh:35227fad617a0509c64ab5759a8b703b10d244877f1aa5416bfbcc100c96996f", + "zh:357f553f0d78d46a96c7b2ed06d25ee0fc60fc5be19812ccb5d969fa47d62e17", + "zh:58faa2940065137e3e87d02eba59ab5cd7137d7a18caf225e660d1788f274569", + "zh:7308eda0339620fa24f47cedd22221fc2c02cab9d5be1710c09a783aea84eb3a", + "zh:863eabf7f908a8263e28d8aa2ad1381affd6bb5c67755216781f674ef214100e", + "zh:8b95b595a7c14ed7b56194d03cdec253527e7a146c1c58961be09e6b5c50baee", + "zh:afbca6b4fac9a0a488bc22ff9e51a8f14e986137d25275068fd932f379a51d57", + "zh:c6aadec4c81a44c3ffc22c2d90ffc6706bf5a9a903a395d896477516f4be6cbb", + "zh:e54a59de7d4ef0f3a18f91fed0b54a2bce18257ae2ee1df8a88226e1023c5811", + ] +} + +provider "registry.terraform.io/hashicorp/azurerm" { + version = "3.95.0" + hashes = [ + "h1:nyThHJeS3HbYCqgZskB/GOvQRt3DmNqFKmtUmAcr0AQ=", + "zh:36e96725fb5860b68c4f86d43988eadfe13ece7abfc3368bf01b2f4e253a05f8", + "zh:3f416b574518a63793dfda0efa588dd0d2432d4cbea5908d7a479f82f0a89a01", + "zh:3f94eb8dc1717bd5af524138258b65bb2011917e05db727a0696623d4a2cdf6f", + "zh:4fd395656aeb366830eebc11f10d29b2e9652b4d74e70bbe785768b7cbcf8d5c", + "zh:58bc5bd83a984f91faebbc71f27062d3a6ca4e3abfc2fe7fcd40833d8145c5a8", + "zh:5bfedb1592056da89c3cfa2cb409cdeadedc2d336a862d39c14a9a2a4424cb8a", + "zh:6135572aa2d99e95877a28deaa864742429ba7bba8ca39b5dd8261484d384c06", + "zh:8440dbc750cd06e51a640175acd2187ab2816e080c318ea278ef9657c3000675", + "zh:9dc9e301319f49c639535da6d5ed5d938a7c8153d4467816419466d343784d01", + "zh:e5c99bc6c960d0cc4f4aab4779ccb59ec8cc6802799f2fff9c41c945f2012f85", + "zh:e9d55f63a20054c3cbb95f14dc3670c89575893b9747eb2c2ee067e1bc521c48", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} + +provider "registry.terraform.io/hashicorp/random" { + version = "3.6.0" + hashes = [ + "h1:I8MBeauYA8J8yheLJ8oSMWqB0kovn16dF/wKZ1QTdkk=", + "zh:03360ed3ecd31e8c5dac9c95fe0858be50f3e9a0d0c654b5e504109c2159287d", + "zh:1c67ac51254ba2a2bb53a25e8ae7e4d076103483f55f39b426ec55e47d1fe211", + "zh:24a17bba7f6d679538ff51b3a2f378cedadede97af8a1db7dad4fd8d6d50f829", + "zh:30ffb297ffd1633175d6545d37c2217e2cef9545a6e03946e514c59c0859b77d", + "zh:454ce4b3dbc73e6775f2f6605d45cee6e16c3872a2e66a2c97993d6e5cbd7055", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:91df0a9fab329aff2ff4cf26797592eb7a3a90b4a0c04d64ce186654e0cc6e17", + "zh:aa57384b85622a9f7bfb5d4512ca88e61f22a9cea9f30febaa4c98c68ff0dc21", + "zh:c4a3e329ba786ffb6f2b694e1fd41d413a7010f3a53c20b432325a94fa71e839", + "zh:e2699bc9116447f96c53d55f2a00570f982e6f9935038c3810603572693712d0", + "zh:e747c0fd5d7684e5bfad8aa0ca441903f15ae7a98a737ff6aca24ba223207e2c", + "zh:f1ca75f417ce490368f047b63ec09fd003711ae48487fba90b4aba2ccf71920e", + ] +} diff --git a/test-infra/terraform/test-environment/aca-env-subnets.tf b/test-infra/terraform/test-environment/aca-env-subnets.tf new file mode 100644 index 00000000..a9a8126e --- /dev/null +++ b/test-infra/terraform/test-environment/aca-env-subnets.tf @@ -0,0 +1,21 @@ +resource "azurerm_network_security_group" "aca-env" { + name = "aca-env-nsg" + location = data.azurerm_resource_group.grate-integration-tests.location + resource_group_name = data.azurerm_resource_group.grate-integration-tests.name +} + +resource "azurerm_virtual_network" "aca-env" { + name = "aca-env-vnet" + location = data.azurerm_resource_group.grate-integration-tests.location + resource_group_name = data.azurerm_resource_group.grate-integration-tests.name + address_space = ["10.1.0.0/16"] +# dns_servers = ["10.0.0.4", "10.0.0.5"] +} + +resource "azurerm_subnet" "aca-env" { + name = "aca-env-infra-subnet" + virtual_network_name = azurerm_virtual_network.aca-env.name + resource_group_name = azurerm_virtual_network.aca-env.resource_group_name + address_prefixes = [ "10.1.0.0/21" ] + #security_group = azurerm_network_security_group.aca-env.id +} \ No newline at end of file diff --git a/test-infra/terraform/test-environment/aca-env.tf b/test-infra/terraform/test-environment/aca-env.tf new file mode 100644 index 00000000..29065e6f --- /dev/null +++ b/test-infra/terraform/test-environment/aca-env.tf @@ -0,0 +1,7 @@ +resource "azurerm_container_app_environment" "grate-tests" { + name = "grate-integration-tests" + location = data.azurerm_resource_group.grate-integration-tests.location + resource_group_name = data.azurerm_resource_group.grate-integration-tests.name + + infrastructure_subnet_id = azurerm_subnet.aca-env.id +} diff --git a/test-infra/terraform/test-environment/aca-mariadb.tf b/test-infra/terraform/test-environment/aca-mariadb.tf new file mode 100644 index 00000000..00f5b408 --- /dev/null +++ b/test-infra/terraform/test-environment/aca-mariadb.tf @@ -0,0 +1,62 @@ +locals { + MARIADB_ROOT_PASSWORD = random_password.mariadb_admin.result + MARIADB_USER_PASSWORD = random_password.mariadb_user.result + MARIADB_USER = "mariadbuser" +} + +resource "azurerm_container_app" "mariadb" { + name = "mariadb-grate-tests" + container_app_environment_id = azurerm_container_app_environment.grate-tests.id + resource_group_name = data.azurerm_resource_group.grate-integration-tests.name + revision_mode = "Single" + + template { + min_replicas = 0 + max_replicas = 1 + + tcp_scale_rule { + name = "scale-on-one-request" + concurrent_requests = 1 + } + + container { + name = "mariadb" + image = "mariadb:10.10" + cpu = 0.25 + memory = "0.5Gi" + + # ref the MariaDB init script, here: https://github.com/MariaDB/mariadb-docker/blob/master/docker-entrypoint.sh#L377C2-L377C4 + env { + name = "MARIADB_USER" + value = local.MARIADB_USER + } + + env { + name = "MARIADB_PASSWORD" + value = local.MARIADB_USER_PASSWORD + } + + env { + name = "MARIADB_ROOT_HOST" + #value = azurerm_container_app_environment.grate-tests.static_ip_address + value = "%" + } + + env { + name = "MARIADB_ROOT_PASSWORD" + value = local.MARIADB_ROOT_PASSWORD + } + + } + } + ingress { + external_enabled = true + exposed_port = 3306 + target_port = 3306 + transport = "tcp" + traffic_weight { + percentage = 100 + latest_revision = true + } + } +} \ No newline at end of file diff --git a/test-infra/terraform/test-environment/db-passwords.tf b/test-infra/terraform/test-environment/db-passwords.tf new file mode 100644 index 00000000..18f345b1 --- /dev/null +++ b/test-infra/terraform/test-environment/db-passwords.tf @@ -0,0 +1,9 @@ +resource "random_password" "mariadb_admin" { + length = 16 + special = true +} + +resource "random_password" "mariadb_user" { + length = 16 + special = true +} \ No newline at end of file diff --git a/test-infra/terraform/test-environment/main.tf b/test-infra/terraform/test-environment/main.tf new file mode 100644 index 00000000..19f8699e --- /dev/null +++ b/test-infra/terraform/test-environment/main.tf @@ -0,0 +1,29 @@ +terraform { + backend "azurerm" { + resource_group_name = "grate-tests-infra" + storage_account_name = "grateconfig" + container_name = "grate-tests-setup" + key = "test-environment.tfstate" + + use_oidc = true + use_azuread_auth = true + } + + required_providers { + azurerm = { + source = "hashicorp/azurerm" + } + azuread = {} + } +} + +provider "azurerm" { + #use_oidc = true + skip_provider_registration = true + features {} +} + +provider "azuread" { +} + +data "azurerm_client_config" "current" {} diff --git a/test-infra/terraform/test-environment/outputs.tf b/test-infra/terraform/test-environment/outputs.tf new file mode 100644 index 00000000..c9dd4b6e --- /dev/null +++ b/test-infra/terraform/test-environment/outputs.tf @@ -0,0 +1,18 @@ +output "mariadb-user-password" { + value = random_password.mariadb_user.result + sensitive = true +} + +output "mariadb-admin-password" { + value = random_password.mariadb_admin.result + sensitive = true +} + + +output "aca-env-public-ip" { + value = azurerm_container_app_environment.grate-tests.static_ip_address +} + +output "mariadb-fqdn" { + value = azurerm_container_app.mariadb.latest_revision_fqdn +} \ No newline at end of file diff --git a/test-infra/terraform/test-environment/resource-group.tf b/test-infra/terraform/test-environment/resource-group.tf new file mode 100644 index 00000000..ef35850d --- /dev/null +++ b/test-infra/terraform/test-environment/resource-group.tf @@ -0,0 +1,3 @@ +data "azurerm_resource_group" "grate-integration-tests" { + name = "grate-integration-tests" +} \ No newline at end of file diff --git a/test-infra/terraform/test-environment/variables.tf b/test-infra/terraform/test-environment/variables.tf new file mode 100644 index 00000000..80182535 --- /dev/null +++ b/test-infra/terraform/test-environment/variables.tf @@ -0,0 +1,3 @@ +# variable "MARIADB_ROOT_PASSWORD" { +# sensitive = false +# } \ No newline at end of file diff --git a/unittests/Basic_tests/Startup.cs b/unittests/Basic_tests/Startup.cs new file mode 100644 index 00000000..55fac66b --- /dev/null +++ b/unittests/Basic_tests/Startup.cs @@ -0,0 +1,6 @@ +namespace Basic_tests; + +// ReSharper disable once UnusedType.Global +public class Startup +{ +} diff --git a/unittests/CommandLine/CommandLine.Common/Startup.cs b/unittests/CommandLine/CommandLine.Common/Startup.cs index 89369daf..7f5f212f 100644 --- a/unittests/CommandLine/CommandLine.Common/Startup.cs +++ b/unittests/CommandLine/CommandLine.Common/Startup.cs @@ -2,39 +2,17 @@ using grate.Configuration; using grate.Migration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using TestCommon.TestInfrastructure; namespace CommandLine.Common; // ReSharper disable once UnusedType.Global -public abstract class Startup +public abstract class Startup: TestCommon.Startup { - // ReSharper disable once UnusedMember.Global - public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + protected abstract DatabaseType DatabaseType { get; } + + protected override void ConfigureExtraServices(IServiceCollection services, HostBuilderContext context) { - services.AddLogging( - lb => lb - .AddXUnit() - .AddConsole() - .SetMinimumLevel(TestConfig.GetLogLevel()) - ); - services.AddSingleton(new CommandLineGrateMigrator(DatabaseType)); - - services.TryAddSingleton(TestContextType); - services.TryAddSingleton(TestContainerType); - - services.TryAddTransient(provider => - new CommandLineGrateTestContext( - provider.GetRequiredService(), - (IGrateTestContext) provider.GetRequiredService(TestContextType))); } - - protected abstract DatabaseType DatabaseType { get; } - protected abstract Type TestContainerType { get; } - protected abstract Type TestContextType { get; } - } diff --git a/unittests/CommandLine/CommandLine.Common/Startup_T.cs b/unittests/CommandLine/CommandLine.Common/Startup_T.cs new file mode 100644 index 00000000..4aa17ff8 --- /dev/null +++ b/unittests/CommandLine/CommandLine.Common/Startup_T.cs @@ -0,0 +1,25 @@ +using CommandLine.Common.TestInfrastructure; +using grate.Configuration; +using grate.Migration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TestCommon.TestInfrastructure; + +namespace CommandLine.Common; + +// ReSharper disable once UnusedType.Global +public abstract class Startup< + TTestContainerDatabase, + TExternalDatabase, + TGrateTestContext>: TestCommon.Startup + where TTestContainerDatabase : ITestDatabase + where TExternalDatabase : ITestDatabase + where TGrateTestContext : IGrateTestContext +{ + protected abstract DatabaseType DatabaseType { get; } + + protected override void ConfigureExtraServices(IServiceCollection services, HostBuilderContext context) + { + services.AddSingleton(new CommandLineGrateMigrator(DatabaseType)); + } +} diff --git a/unittests/CommandLine/CommandLine.Common/TestInfrastructure/CommandLineTestFramework.cs b/unittests/CommandLine/CommandLine.Common/TestInfrastructure/CommandLineTestFramework.cs deleted file mode 100644 index b900c537..00000000 --- a/unittests/CommandLine/CommandLine.Common/TestInfrastructure/CommandLineTestFramework.cs +++ /dev/null @@ -1,48 +0,0 @@ -// using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; -// using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; -// using Xunit.Abstractions; -// using Xunit.Sdk; -// -// namespace CommandLine_tests.TestInfrastructure; -// -// public class CommandLineTestFramework : XunitTestFramework -// { -// public CommandLineTestFramework(IMessageSink messageSink) -// : base(messageSink) -// { -// } -// -// protected override ITestFrameworkDiscoverer CreateDiscoverer( -// IAssemblyInfo assemblyInfo) -// => new CommandLineTestFrameworkDiscoverer( -// assemblyInfo, -// SourceInformationProvider, -// DiagnosticMessageSink); -// } -// public class CommandLineTestFrameworkDiscoverer : XunitTestFrameworkDiscoverer -// { -// public CommandLineTestFrameworkDiscoverer( -// IAssemblyInfo assemblyInfo, -// ISourceInformationProvider sourceProvider, -// IMessageSink diagnosticMessageSink, -// IXunitTestCollectionFactory? collectionFactory = null) -// : base( -// assemblyInfo, -// sourceProvider, -// diagnosticMessageSink, -// collectionFactory) -// { -// } -// -// protected override bool IsValidTestClass(ITypeInfo type) -// => base.IsValidTestClass(type) && -// FilterType(type); -// -// protected virtual bool FilterType(ITypeInfo type) -// { -// // Insert your custom filter conditions here. -// return true; -// } -// } -// -// diff --git a/unittests/CommandLine/CommandLine.Common/TestInfrastructure/CommandlineGrateTestContext.cs b/unittests/CommandLine/CommandLine.Common/TestInfrastructure/CommandlineGrateTestContext.cs deleted file mode 100644 index 88755037..00000000 --- a/unittests/CommandLine/CommandLine.Common/TestInfrastructure/CommandlineGrateTestContext.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Data; -using grate.Infrastructure; -using grate.Migration; -using TestCommon.TestInfrastructure; - -namespace CommandLine.Common.TestInfrastructure; - -public class CommandLineGrateTestContext : IGrateTestContext -{ - private readonly IGrateTestContext _testContext; - - public CommandLineGrateTestContext( - IGrateMigrator migrator, - IGrateTestContext testContext) - { - _testContext = testContext; - Migrator = migrator; - } - - public IGrateMigrator Migrator { get; } - - public string AdminConnectionString => _testContext.AdminConnectionString; - public string ConnectionString(string database) => _testContext.ConnectionString(database); - public string UserConnectionString(string database) => _testContext.UserConnectionString(database); - - public IDbConnection GetDbConnection(string connectionString) => _testContext.GetDbConnection(connectionString); - - public ISyntax Syntax => _testContext.Syntax; - public Type DbExceptionType => _testContext.DbExceptionType; - - public Type DatabaseType => _testContext.DbExceptionType; - public bool SupportsTransaction => _testContext.SupportsTransaction; - - public SqlStatements Sql => _testContext.Sql; - - public string ExpectedVersionPrefix => _testContext.ExpectedVersionPrefix; - public bool SupportsCreateDatabase => _testContext.SupportsCreateDatabase; - public bool SupportsSchemas => _testContext.SupportsSchemas; -} diff --git a/unittests/CommandLine/CommandLine.MariaDB/Running_MigrationScripts/Failing_Scripts.cs b/unittests/CommandLine/CommandLine.MariaDB/Running_MigrationScripts/Failing_Scripts.cs index 97400975..3b047124 100644 --- a/unittests/CommandLine/CommandLine.MariaDB/Running_MigrationScripts/Failing_Scripts.cs +++ b/unittests/CommandLine/CommandLine.MariaDB/Running_MigrationScripts/Failing_Scripts.cs @@ -3,9 +3,9 @@ namespace CommandLine.MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Failing_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Failing_Scripts(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Failing_Scripts(testContext, testOutput) { protected override string ExpectedErrorMessageForInvalidSql => "Not relevant"; diff --git a/unittests/CommandLine/CommandLine.MariaDB/Running_MigrationScripts/One_time_scripts.cs b/unittests/CommandLine/CommandLine.MariaDB/Running_MigrationScripts/One_time_scripts.cs index 7da55a14..7c1bd9b5 100644 --- a/unittests/CommandLine/CommandLine.MariaDB/Running_MigrationScripts/One_time_scripts.cs +++ b/unittests/CommandLine/CommandLine.MariaDB/Running_MigrationScripts/One_time_scripts.cs @@ -8,9 +8,9 @@ namespace CommandLine.MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once InconsistentNaming -public class One_time_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class One_time_scripts(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.One_time_scripts(testContext, testOutput) { diff --git a/unittests/CommandLine/CommandLine.MariaDB/Startup.cs b/unittests/CommandLine/CommandLine.MariaDB/Startup.cs index 197353f7..809ab0e0 100644 --- a/unittests/CommandLine/CommandLine.MariaDB/Startup.cs +++ b/unittests/CommandLine/CommandLine.MariaDB/Startup.cs @@ -4,9 +4,7 @@ namespace CommandLine.MariaDB; // ReSharper disable once UnusedType.Global -public class Startup: CommandLine.Common.Startup +public class Startup: CommandLine.Common.Startup { protected override DatabaseType DatabaseType => DatabaseType.MariaDB; - protected override Type TestContainerType => typeof(MariaDbTestContainer); - protected override Type TestContextType => typeof(MariaDbGrateTestContext); } diff --git a/unittests/CommandLine/CommandLine.Oracle/Running_MigrationScripts/Failing_Scripts.cs b/unittests/CommandLine/CommandLine.Oracle/Running_MigrationScripts/Failing_Scripts.cs index 0f593728..1baba08e 100644 --- a/unittests/CommandLine/CommandLine.Oracle/Running_MigrationScripts/Failing_Scripts.cs +++ b/unittests/CommandLine/CommandLine.Oracle/Running_MigrationScripts/Failing_Scripts.cs @@ -1,10 +1,10 @@ -using TestCommon.TestInfrastructure; +using Oracle.TestInfrastructure; namespace CommandLine.Oracle.Running_MigrationScripts; -[Collection(nameof(OracleTestContainer))] +[Collection(nameof(OracleGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Failing_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Failing_Scripts(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Failing_Scripts(testContext, testOutput) { protected override string ExpectedErrorMessageForInvalidSql => "Not relevant"; diff --git a/unittests/CommandLine/CommandLine.Oracle/Running_MigrationScripts/One_time_scripts.cs b/unittests/CommandLine/CommandLine.Oracle/Running_MigrationScripts/One_time_scripts.cs index 899cbbdf..ef57d4f7 100644 --- a/unittests/CommandLine/CommandLine.Oracle/Running_MigrationScripts/One_time_scripts.cs +++ b/unittests/CommandLine/CommandLine.Oracle/Running_MigrationScripts/One_time_scripts.cs @@ -2,14 +2,15 @@ using FluentAssertions; using grate.Configuration; using grate.Exceptions; +using Oracle.TestInfrastructure; using TestCommon.TestInfrastructure; using static grate.Configuration.KnownFolderKeys; namespace CommandLine.Oracle.Running_MigrationScripts; -[Collection(nameof(OracleTestContainer))] +[Collection(nameof(OracleGrateTestContext))] // ReSharper disable once InconsistentNaming -public class One_time_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class One_time_scripts(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.One_time_scripts(testContext, testOutput) { protected override string CreateView1 => base.CreateView1 + " FROM DUAL"; diff --git a/unittests/CommandLine/CommandLine.Oracle/Startup.cs b/unittests/CommandLine/CommandLine.Oracle/Startup.cs index 249b3c37..ff37bfc5 100644 --- a/unittests/CommandLine/CommandLine.Oracle/Startup.cs +++ b/unittests/CommandLine/CommandLine.Oracle/Startup.cs @@ -1,13 +1,12 @@ using grate.Configuration; +using Oraclde.TestInfrastructure; using Oracle.TestInfrastructure; using TestCommon.TestInfrastructure; namespace CommandLine.Oracle; // ReSharper disable once UnusedType.Global -public class Startup: CommandLine.Common.Startup +public class Startup: Common.Startup { protected override DatabaseType DatabaseType => DatabaseType.Oracle; - protected override Type TestContainerType => typeof(OracleTestContainer); - protected override Type TestContextType => typeof(OracleGrateTestContext); } diff --git a/unittests/CommandLine/CommandLine.PostgreSQL/Running_MigrationScripts/Failing_Scripts.cs b/unittests/CommandLine/CommandLine.PostgreSQL/Running_MigrationScripts/Failing_Scripts.cs index e06cdcde..3f793b72 100644 --- a/unittests/CommandLine/CommandLine.PostgreSQL/Running_MigrationScripts/Failing_Scripts.cs +++ b/unittests/CommandLine/CommandLine.PostgreSQL/Running_MigrationScripts/Failing_Scripts.cs @@ -1,10 +1,11 @@ -using TestCommon.TestInfrastructure; +using PostgreSQL.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace CommandLine.PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] +[Collection(nameof(PostgreSqlGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Failing_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Failing_Scripts(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Failing_Scripts(testContext, testOutput) { protected override string ExpectedErrorMessageForInvalidSql => "Not relevant"; diff --git a/unittests/CommandLine/CommandLine.PostgreSQL/Running_MigrationScripts/One_time_scripts.cs b/unittests/CommandLine/CommandLine.PostgreSQL/Running_MigrationScripts/One_time_scripts.cs index 9e7f9f8a..0145d2c8 100644 --- a/unittests/CommandLine/CommandLine.PostgreSQL/Running_MigrationScripts/One_time_scripts.cs +++ b/unittests/CommandLine/CommandLine.PostgreSQL/Running_MigrationScripts/One_time_scripts.cs @@ -2,14 +2,15 @@ using FluentAssertions; using grate.Configuration; using grate.Exceptions; +using PostgreSQL.TestInfrastructure; using TestCommon.TestInfrastructure; using static grate.Configuration.KnownFolderKeys; namespace CommandLine.PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] +[Collection(nameof(PostgreSqlGrateTestContext))] // ReSharper disable once InconsistentNaming -public class One_time_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class One_time_scripts(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.One_time_scripts(testContext, testOutput) { [Fact] diff --git a/unittests/CommandLine/CommandLine.PostgreSQL/Startup.cs b/unittests/CommandLine/CommandLine.PostgreSQL/Startup.cs index bd2731ab..f2522be9 100644 --- a/unittests/CommandLine/CommandLine.PostgreSQL/Startup.cs +++ b/unittests/CommandLine/CommandLine.PostgreSQL/Startup.cs @@ -5,9 +5,7 @@ namespace CommandLine.PostgreSQL; // ReSharper disable once UnusedType.Global -public class Startup: CommandLine.Common.Startup +public class Startup: Common.Startup { protected override DatabaseType DatabaseType => DatabaseType.PostgreSQL; - protected override Type TestContainerType => typeof(PostgreSqlTestContainer); - protected override Type TestContextType => typeof(PostgreSqlGrateTestContext); } diff --git a/unittests/CommandLine/CommandLine.SqlServer/CommandLine.SqlServer.csproj b/unittests/CommandLine/CommandLine.SqlServer/CommandLine.SqlServer.csproj index fe1ef6bf..5ac48ef8 100644 --- a/unittests/CommandLine/CommandLine.SqlServer/CommandLine.SqlServer.csproj +++ b/unittests/CommandLine/CommandLine.SqlServer/CommandLine.SqlServer.csproj @@ -28,6 +28,12 @@ + + + Imported\TestInfrastructure\SqlServerExternalDatabase.cs + + + ../../SqlServer diff --git a/unittests/CommandLine/CommandLine.SqlServer/Running_MigrationScripts/Failing_Scripts.cs b/unittests/CommandLine/CommandLine.SqlServer/Running_MigrationScripts/Failing_Scripts.cs index 23b10507..4d5ddc87 100644 --- a/unittests/CommandLine/CommandLine.SqlServer/Running_MigrationScripts/Failing_Scripts.cs +++ b/unittests/CommandLine/CommandLine.SqlServer/Running_MigrationScripts/Failing_Scripts.cs @@ -1,10 +1,11 @@ using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; namespace CommandLine.SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Failing_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Failing_Scripts(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Failing_Scripts(testContext, testOutput) { protected override string ExpectedErrorMessageForInvalidSql => "Not relevant"; diff --git a/unittests/CommandLine/CommandLine.SqlServer/Running_MigrationScripts/One_time_scripts.cs b/unittests/CommandLine/CommandLine.SqlServer/Running_MigrationScripts/One_time_scripts.cs index 0dbdb2f9..10911624 100644 --- a/unittests/CommandLine/CommandLine.SqlServer/Running_MigrationScripts/One_time_scripts.cs +++ b/unittests/CommandLine/CommandLine.SqlServer/Running_MigrationScripts/One_time_scripts.cs @@ -3,13 +3,14 @@ using grate.Configuration; using grate.Exceptions; using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; using static grate.Configuration.KnownFolderKeys; namespace CommandLine.SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class One_time_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class One_time_scripts(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.One_time_scripts(testContext, testOutput) { [Fact] diff --git a/unittests/CommandLine/CommandLine.SqlServer/Startup.cs b/unittests/CommandLine/CommandLine.SqlServer/Startup.cs index c6e7d870..962bed77 100644 --- a/unittests/CommandLine/CommandLine.SqlServer/Startup.cs +++ b/unittests/CommandLine/CommandLine.SqlServer/Startup.cs @@ -1,13 +1,10 @@ using grate.Configuration; using SqlServer.TestInfrastructure; -using TestCommon.TestInfrastructure; namespace CommandLine.SqlServer; // ReSharper disable once UnusedType.Global -public class Startup: CommandLine.Common.Startup +public class Startup: Common.Startup { protected override DatabaseType DatabaseType => DatabaseType.SQLServer; - protected override Type TestContainerType => typeof(SqlServerTestContainer); - protected override Type TestContextType => typeof(SqlServerGrateTestContext); } diff --git a/unittests/CommandLine/CommandLine.Sqlite/CommandLine.Sqlite.csproj b/unittests/CommandLine/CommandLine.Sqlite/CommandLine.Sqlite.csproj index 3550dc0d..bb81a62f 100644 --- a/unittests/CommandLine/CommandLine.Sqlite/CommandLine.Sqlite.csproj +++ b/unittests/CommandLine/CommandLine.Sqlite/CommandLine.Sqlite.csproj @@ -28,6 +28,13 @@ + + + Imported/TestInfrastructure/ + Imported\TestInfrastructure\ExternalSqliteDatabase.cs + + + ../../Sqlite diff --git a/unittests/CommandLine/CommandLine.Sqlite/Running_MigrationScripts/Failing_Scripts.cs b/unittests/CommandLine/CommandLine.Sqlite/Running_MigrationScripts/Failing_Scripts.cs index 536d9bc0..d0465a7d 100644 --- a/unittests/CommandLine/CommandLine.Sqlite/Running_MigrationScripts/Failing_Scripts.cs +++ b/unittests/CommandLine/CommandLine.Sqlite/Running_MigrationScripts/Failing_Scripts.cs @@ -1,10 +1,11 @@ -using TestCommon.TestInfrastructure; +using Sqlite.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace CommandLine.Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Failing_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Failing_Scripts(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Failing_Scripts(testContext, testOutput) { protected override string ExpectedErrorMessageForInvalidSql => "Not relevant"; diff --git a/unittests/CommandLine/CommandLine.Sqlite/Running_MigrationScripts/One_time_scripts.cs b/unittests/CommandLine/CommandLine.Sqlite/Running_MigrationScripts/One_time_scripts.cs index 408f4553..341ace1a 100644 --- a/unittests/CommandLine/CommandLine.Sqlite/Running_MigrationScripts/One_time_scripts.cs +++ b/unittests/CommandLine/CommandLine.Sqlite/Running_MigrationScripts/One_time_scripts.cs @@ -2,14 +2,15 @@ using FluentAssertions; using grate.Configuration; using grate.Exceptions; +using Sqlite.TestInfrastructure; using TestCommon.TestInfrastructure; using static grate.Configuration.KnownFolderKeys; namespace CommandLine.Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteGrateTestContext))] // ReSharper disable once InconsistentNaming -public class One_time_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class One_time_scripts(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.One_time_scripts(testContext, testOutput) { [Fact] diff --git a/unittests/CommandLine/CommandLine.Sqlite/Startup.cs b/unittests/CommandLine/CommandLine.Sqlite/Startup.cs index cc2d7a7f..ff25c77a 100644 --- a/unittests/CommandLine/CommandLine.Sqlite/Startup.cs +++ b/unittests/CommandLine/CommandLine.Sqlite/Startup.cs @@ -5,9 +5,7 @@ namespace CommandLine.Sqlite; // ReSharper disable once UnusedType.Global -public class Startup: CommandLine.Common.Startup +public class Startup: CommandLine.Common.Startup { protected override DatabaseType DatabaseType => DatabaseType.SQLite; - protected override Type TestContainerType => typeof(SqliteTestContainer); - protected override Type TestContextType => typeof(SqliteGrateTestContext); } diff --git a/unittests/MariaDB/Database.cs b/unittests/MariaDB/Database.cs index b7ddd84a..96be28f3 100644 --- a/unittests/MariaDB/Database.cs +++ b/unittests/MariaDB/Database.cs @@ -4,8 +4,8 @@ namespace MariaDB; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once UnusedType.Global -public class Database(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Database(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : GenericDatabase(testContext, testOutput); diff --git a/unittests/MariaDB/DependencyInjection/ServiceCollectionTest.cs b/unittests/MariaDB/DependencyInjection/ServiceCollectionTest.cs index 8ddf2222..1aea9546 100644 --- a/unittests/MariaDB/DependencyInjection/ServiceCollectionTest.cs +++ b/unittests/MariaDB/DependencyInjection/ServiceCollectionTest.cs @@ -2,7 +2,7 @@ using TestCommon.TestInfrastructure; namespace MariaDB.DependencyInjection; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once UnusedType.Global -public class ServiceCollectionTest(IGrateTestContext context) +public class ServiceCollectionTest(MariaDbGrateTestContext context) : TestCommon.DependencyInjection.GrateServiceCollectionTest(context); diff --git a/unittests/MariaDB/MigrationTables.cs b/unittests/MariaDB/MigrationTables.cs index 74e6f77e..1d0aee96 100644 --- a/unittests/MariaDB/MigrationTables.cs +++ b/unittests/MariaDB/MigrationTables.cs @@ -4,6 +4,6 @@ namespace MariaDB; -[Collection(nameof(MariaDbTestContainer))] -public class MigrationTables(IGrateTestContext testContext, ITestOutputHelper testOutput) : +[Collection(nameof(MariaDbGrateTestContext))] +public class MigrationTables(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : GenericMigrationTables(testContext, testOutput); diff --git a/unittests/MariaDB/Running_MigrationScripts/Anytime_scripts.cs b/unittests/MariaDB/Running_MigrationScripts/Anytime_scripts.cs index 9f6d43c6..aa8947fc 100644 --- a/unittests/MariaDB/Running_MigrationScripts/Anytime_scripts.cs +++ b/unittests/MariaDB/Running_MigrationScripts/Anytime_scripts.cs @@ -3,7 +3,7 @@ namespace MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Anytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Anytime_scripts(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Anytime_scripts(testContext, testOutput); diff --git a/unittests/MariaDB/Running_MigrationScripts/DropDatabase.cs b/unittests/MariaDB/Running_MigrationScripts/DropDatabase.cs index af99e056..a694f52e 100644 --- a/unittests/MariaDB/Running_MigrationScripts/DropDatabase.cs +++ b/unittests/MariaDB/Running_MigrationScripts/DropDatabase.cs @@ -3,7 +3,7 @@ namespace MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once UnusedType.Global -public class DropDatabase(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class DropDatabase(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.DropDatabase(testContext, testOutput); diff --git a/unittests/MariaDB/Running_MigrationScripts/Environment_scripts.cs b/unittests/MariaDB/Running_MigrationScripts/Environment_scripts.cs index 6fab9724..efe88caf 100644 --- a/unittests/MariaDB/Running_MigrationScripts/Environment_scripts.cs +++ b/unittests/MariaDB/Running_MigrationScripts/Environment_scripts.cs @@ -3,7 +3,7 @@ namespace MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Environment_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Environment_scripts(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Environment_scripts(testContext, testOutput); diff --git a/unittests/MariaDB/Running_MigrationScripts/Everytime_scripts.cs b/unittests/MariaDB/Running_MigrationScripts/Everytime_scripts.cs index 1b327643..83d8c7a2 100644 --- a/unittests/MariaDB/Running_MigrationScripts/Everytime_scripts.cs +++ b/unittests/MariaDB/Running_MigrationScripts/Everytime_scripts.cs @@ -3,7 +3,7 @@ namespace MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Everytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Everytime_scripts(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Everytime_scripts(testContext, testOutput); diff --git a/unittests/MariaDB/Running_MigrationScripts/Failing_Scripts.cs b/unittests/MariaDB/Running_MigrationScripts/Failing_Scripts.cs index ee239882..08560c1c 100644 --- a/unittests/MariaDB/Running_MigrationScripts/Failing_Scripts.cs +++ b/unittests/MariaDB/Running_MigrationScripts/Failing_Scripts.cs @@ -3,9 +3,9 @@ namespace MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Failing_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Failing_Scripts(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Failing_Scripts(testContext, testOutput) { protected override string ExpectedErrorMessageForInvalidSql => diff --git a/unittests/MariaDB/Running_MigrationScripts/One_time_scripts.cs b/unittests/MariaDB/Running_MigrationScripts/One_time_scripts.cs index 43898b5f..08c4f3bf 100644 --- a/unittests/MariaDB/Running_MigrationScripts/One_time_scripts.cs +++ b/unittests/MariaDB/Running_MigrationScripts/One_time_scripts.cs @@ -3,8 +3,8 @@ namespace MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once InconsistentNaming -public class One_time_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class One_time_scripts(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.One_time_scripts(testContext, testOutput); diff --git a/unittests/MariaDB/Running_MigrationScripts/Order_Of_Scripts.cs b/unittests/MariaDB/Running_MigrationScripts/Order_Of_Scripts.cs index 0565c9b0..78ab70ef 100644 --- a/unittests/MariaDB/Running_MigrationScripts/Order_Of_Scripts.cs +++ b/unittests/MariaDB/Running_MigrationScripts/Order_Of_Scripts.cs @@ -3,8 +3,8 @@ namespace MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Order_Of_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Order_Of_Scripts(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Order_Of_Scripts(testContext, testOutput); diff --git a/unittests/MariaDB/Running_MigrationScripts/ScriptsRun_Table.cs b/unittests/MariaDB/Running_MigrationScripts/ScriptsRun_Table.cs index c3240fb4..ff63d7d7 100644 --- a/unittests/MariaDB/Running_MigrationScripts/ScriptsRun_Table.cs +++ b/unittests/MariaDB/Running_MigrationScripts/ScriptsRun_Table.cs @@ -3,6 +3,6 @@ namespace MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] -public class ScriptsRun_Table(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(MariaDbGrateTestContext))] +public class ScriptsRun_Table(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.ScriptsRun_Table(testContext, testOutput); diff --git a/unittests/MariaDB/Running_MigrationScripts/TokenScripts.cs b/unittests/MariaDB/Running_MigrationScripts/TokenScripts.cs index 741c4a52..38714a73 100644 --- a/unittests/MariaDB/Running_MigrationScripts/TokenScripts.cs +++ b/unittests/MariaDB/Running_MigrationScripts/TokenScripts.cs @@ -3,7 +3,7 @@ namespace MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] -public class TokenScripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(MariaDbGrateTestContext))] +public class TokenScripts(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.TokenScripts(testContext, testOutput); diff --git a/unittests/MariaDB/Running_MigrationScripts/Versioning_The_Database.cs b/unittests/MariaDB/Running_MigrationScripts/Versioning_The_Database.cs index 593b41ea..b83dcc88 100644 --- a/unittests/MariaDB/Running_MigrationScripts/Versioning_The_Database.cs +++ b/unittests/MariaDB/Running_MigrationScripts/Versioning_The_Database.cs @@ -4,9 +4,9 @@ namespace MariaDB.Running_MigrationScripts; -[Collection(nameof(MariaDbTestContainer))] +[Collection(nameof(MariaDbGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Versioning_The_Database(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Versioning_The_Database(MariaDbGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Versioning_The_Database(testContext, testOutput); diff --git a/unittests/MariaDB/Startup.cs b/unittests/MariaDB/Startup.cs index 4b4acf5a..90261e11 100644 --- a/unittests/MariaDB/Startup.cs +++ b/unittests/MariaDB/Startup.cs @@ -1,34 +1,21 @@ +using grate.Configuration; using grate.DependencyInjection; using grate.mariadb.DependencyInjection; -using grate.MariaDb.Migration; using MariaDB.TestInfrastructure; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using TestCommon.TestInfrastructure; namespace MariaDB; // ReSharper disable once UnusedType.Global -public class Startup +public class Startup: TestCommon.Startup { - // ReSharper disable once UnusedMember.Global - public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + protected override void ConfigureExtraServices(IServiceCollection services, HostBuilderContext context) { - services.AddLogging( - lb => lb - .AddXUnit() - .AddConsole() - .SetMinimumLevel(TestConfig.GetLogLevel()) - ); - services .AddGrate() .UseMariaDb(); - - services.TryAddSingleton(); - services.TryAddTransient(); services.TryAddTransient(); } } diff --git a/unittests/MariaDB/TestInfrastructure/MariaDBExternalDatabase.cs b/unittests/MariaDB/TestInfrastructure/MariaDBExternalDatabase.cs new file mode 100644 index 00000000..2f84da6c --- /dev/null +++ b/unittests/MariaDB/TestInfrastructure/MariaDBExternalDatabase.cs @@ -0,0 +1,32 @@ +using MySqlConnector; +using TestCommon.TestInfrastructure; + +namespace MariaDB.TestInfrastructure; + +public class MariaDBExternalDatabase(GrateTestConfig grateTestConfig) : ITestDatabase +{ + public string AdminConnectionString { get; } = grateTestConfig.AdminConnectionString ?? throw new ArgumentNullException(nameof(grateTestConfig)); + + public string ConnectionString(string database) + { + var builder = new MySqlConnectionStringBuilder(AdminConnectionString) + { + Database = database, + ConnectionTimeout = 2 + }; + return builder.ConnectionString; + } + + public string UserConnectionString(string database) + { + var builder = new MySqlConnectionStringBuilder(AdminConnectionString) + { + Database = database, + UserID = "zoobat", + Password = "batmanZZ5", + ConnectionTimeout = 2 + }; + return builder.ConnectionString; + } + +} diff --git a/unittests/MariaDB/TestInfrastructure/MariaDbGrateTestContext.cs b/unittests/MariaDB/TestInfrastructure/MariaDbGrateTestContext.cs index 66817db5..739b98a8 100644 --- a/unittests/MariaDB/TestInfrastructure/MariaDbGrateTestContext.cs +++ b/unittests/MariaDB/TestInfrastructure/MariaDbGrateTestContext.cs @@ -8,38 +8,29 @@ namespace MariaDB.TestInfrastructure; -public class MariaDbGrateTestContext : IGrateTestContext +[CollectionDefinition(nameof(MariaDbGrateTestContext))] +public class MariaDbTestCollection : ICollectionFixture; + +public class MariaDbGrateTestContext : GrateTestContext { - private readonly MariaDbTestContainer _testContainer; - public MariaDbGrateTestContext( IGrateMigrator migrator, - MariaDbTestContainer container) + ITestDatabase testDatabase) : base(testDatabase) { Migrator = migrator; - _testContainer = container; } - public IGrateMigrator Migrator { get; } - - private string AdminPassword => _testContainer.AdminPassword; - private int? Port => _testContainer.TestContainer!.GetMappedPublicPort(_testContainer.Port); - private string Hostname => _testContainer.TestContainer!.Hostname; - - - public string AdminConnectionString => $"Server={Hostname};Port={Port};Database=mysql;Uid=root;Pwd={AdminPassword}"; - public string ConnectionString(string database) => $"Server={_testContainer.TestContainer!.Hostname};Port={Port};Database={database};Uid=root;Pwd={AdminPassword}"; - public string UserConnectionString(string database) => $"Server={_testContainer.TestContainer!.Hostname};Port={Port};Database={database};Uid={database};Pwd=mooo1213"; + public override IGrateMigrator Migrator { get; } - public IDbConnection GetDbConnection(string connectionString) => new MySqlConnection(connectionString); + public override IDbConnection GetDbConnection(string connectionString) => new MySqlConnection(connectionString); - public ISyntax Syntax { get; } = new MariaDbSyntax(); - public Type DbExceptionType => typeof(MySqlException); + public override ISyntax Syntax { get; } = new MariaDbSyntax(); + public override Type DbExceptionType => typeof(MySqlException); - public Type DatabaseType => typeof(MariaDbDatabase); - public bool SupportsTransaction => false; + public override Type DatabaseType => typeof(MariaDbDatabase); + public override bool SupportsTransaction => false; - public SqlStatements Sql => new() + public override SqlStatements Sql => new() { SelectVersion = "SELECT VERSION()", SleepTwoSeconds = "SELECT SLEEP(2);", @@ -53,7 +44,7 @@ public MariaDbGrateTestContext( }; - public string ExpectedVersionPrefix => "10.10.7-MariaDB"; - public bool SupportsCreateDatabase => true; - public bool SupportsSchemas => false; + public override string ExpectedVersionPrefix => "10.10.7-MariaDB"; + public override bool SupportsCreateDatabase => true; + public override bool SupportsSchemas => false; } diff --git a/unittests/MariaDB/TestInfrastructure/MariaDbTestContainer.cs b/unittests/MariaDB/TestInfrastructure/MariaDbTestContainer.cs deleted file mode 100644 index 998a6c4f..00000000 --- a/unittests/MariaDB/TestInfrastructure/MariaDbTestContainer.cs +++ /dev/null @@ -1,34 +0,0 @@ -using DotNet.Testcontainers.Builders; -using DotNet.Testcontainers.Configurations; -using DotNet.Testcontainers.Containers; -using Microsoft.Extensions.Logging; -using TestCommon.TestInfrastructure; -using Testcontainers.MariaDb; - -namespace MariaDB.TestInfrastructure; - -// ReSharper disable once ClassNeverInstantiated.Global -public class MariaDbTestContainer : ContainerFixture -{ - public override string DockerImage => "mariadb:10.10"; - public override int Port => 3306; - - public MariaDbTestContainer(ILogger logger) : base(logger) - { - } - - protected override MariaDbContainer InitializeTestContainer() - { - return new MariaDbBuilder() - .WithImage(DockerImage) - .WithPassword(AdminPassword) - .WithPortBinding(Port, true) - .WithCommand("--max_connections=10000") - .Build(); - } -} - -[CollectionDefinition(nameof(MariaDbTestContainer))] -public class MariaDbTestCollection : ICollectionFixture -{ -} diff --git a/unittests/MariaDB/TestInfrastructure/MariaDbTestContainerDatabase.cs b/unittests/MariaDB/TestInfrastructure/MariaDbTestContainerDatabase.cs new file mode 100644 index 00000000..64bb1a3f --- /dev/null +++ b/unittests/MariaDB/TestInfrastructure/MariaDbTestContainerDatabase.cs @@ -0,0 +1,38 @@ +using DotNet.Testcontainers.Builders; +using DotNet.Testcontainers.Configurations; +using DotNet.Testcontainers.Containers; +using Microsoft.Extensions.Logging; +using TestCommon.TestInfrastructure; +using Testcontainers.MariaDb; + +namespace MariaDB.TestInfrastructure; + +// ReSharper disable once ClassNeverInstantiated.Global +public class MariaDbTestContainerDatabase : TestContainerDatabase +{ + public override string DockerImage => "mariadb:10.10"; + protected override int InternalPort => 3306; + + public MariaDbTestContainerDatabase(ILogger logger) : base(logger) + { + } + + protected override MariaDbContainer InitializeTestContainer() + { + return new MariaDbBuilder() + .WithImage(DockerImage) + .WithPassword(AdminPassword) + .WithPortBinding(InternalPort, true) + .WithCommand("--max_connections=10000") + .Build(); + } + + private string Hostname => TestContainer.Hostname; + + public override string AdminConnectionString => $"Server={Hostname};Port={Port};Database=mysql;Uid=root;Pwd={AdminPassword}"; + public override string ConnectionString(string database) => $"Server={Hostname};Port={Port};Database={database};Uid=root;Pwd={AdminPassword}"; + public override string UserConnectionString(string database) => $"Server={Hostname};Port={Port};Database={database};Uid={database};Pwd=mooo1213"; + +} + + diff --git a/unittests/Oracle/Database.cs b/unittests/Oracle/Database.cs index 0ba4d619..8ec85067 100644 --- a/unittests/Oracle/Database.cs +++ b/unittests/Oracle/Database.cs @@ -1,8 +1,9 @@ -using TestCommon.Generic; +using Oracle.TestInfrastructure; +using TestCommon.Generic; using TestCommon.TestInfrastructure; namespace Oracle; -[Collection(nameof(OracleTestContainer))] -public class Database(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(OracleGrateTestContext))] +public class Database(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : GenericDatabase(testContext, testOutput); diff --git a/unittests/Oracle/DependencyInjection/ServiceCollectionTest.cs b/unittests/Oracle/DependencyInjection/ServiceCollectionTest.cs index ebc30ee2..961cc4b4 100644 --- a/unittests/Oracle/DependencyInjection/ServiceCollectionTest.cs +++ b/unittests/Oracle/DependencyInjection/ServiceCollectionTest.cs @@ -1,12 +1,13 @@ using grate.Infrastructure; using grate.Oracle.Migration; +using Oracle.TestInfrastructure; using TestCommon.DependencyInjection; using TestCommon.TestInfrastructure; namespace Oracle.DependencyInjection; -[Collection(nameof(OracleTestContainer))] -public class ServiceCollectionTest(IGrateTestContext testContext) +[Collection(nameof(OracleGrateTestContext))] +public class ServiceCollectionTest(OracleGrateTestContext testContext) : GrateServiceCollectionTest(testContext) { protected virtual Type DatabaseType => typeof(OracleDatabase); diff --git a/unittests/Oracle/MigrationTables.cs b/unittests/Oracle/MigrationTables.cs index b9e146bd..1be19465 100644 --- a/unittests/Oracle/MigrationTables.cs +++ b/unittests/Oracle/MigrationTables.cs @@ -1,11 +1,12 @@ using grate.Configuration; +using Oracle.TestInfrastructure; using TestCommon.Generic; using TestCommon.TestInfrastructure; namespace Oracle; -[Collection(nameof(OracleTestContainer))] -public class MigrationTables(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(OracleGrateTestContext))] +public class MigrationTables(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : GenericMigrationTables(testContext, testOutput) { diff --git a/unittests/Oracle/Running_MigrationScripts/Anytime_scripts.cs b/unittests/Oracle/Running_MigrationScripts/Anytime_scripts.cs index 7010ec07..7a4c4135 100644 --- a/unittests/Oracle/Running_MigrationScripts/Anytime_scripts.cs +++ b/unittests/Oracle/Running_MigrationScripts/Anytime_scripts.cs @@ -1,9 +1,10 @@ -using TestCommon.TestInfrastructure; +using Oracle.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace Oracle.Running_MigrationScripts; -[Collection(nameof(OracleTestContainer))] +[Collection(nameof(OracleGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Anytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Anytime_scripts(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Anytime_scripts(testContext, testOutput); diff --git a/unittests/Oracle/Running_MigrationScripts/DropDatabase.cs b/unittests/Oracle/Running_MigrationScripts/DropDatabase.cs index e59fca73..31b880fd 100644 --- a/unittests/Oracle/Running_MigrationScripts/DropDatabase.cs +++ b/unittests/Oracle/Running_MigrationScripts/DropDatabase.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using Oracle.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace Oracle.Running_MigrationScripts; // ReSharper disable once UnusedType.Global -[Collection(nameof(OracleTestContainer))] -public class DropDatabase(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(OracleGrateTestContext))] +public class DropDatabase(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.DropDatabase(testContext, testOutput); diff --git a/unittests/Oracle/Running_MigrationScripts/Environment_scripts.cs b/unittests/Oracle/Running_MigrationScripts/Environment_scripts.cs index e4a0cadb..696dcdb2 100644 --- a/unittests/Oracle/Running_MigrationScripts/Environment_scripts.cs +++ b/unittests/Oracle/Running_MigrationScripts/Environment_scripts.cs @@ -1,9 +1,10 @@ -using TestCommon.TestInfrastructure; +using Oracle.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace Oracle.Running_MigrationScripts; // ReSharper disable once UnusedType.Global -[Collection(nameof(OracleTestContainer))] -public class Environment_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(OracleGrateTestContext))] +public class Environment_scripts(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Environment_scripts(testContext, testOutput); diff --git a/unittests/Oracle/Running_MigrationScripts/Everytime_scripts.cs b/unittests/Oracle/Running_MigrationScripts/Everytime_scripts.cs index 3136c20d..0610f53c 100644 --- a/unittests/Oracle/Running_MigrationScripts/Everytime_scripts.cs +++ b/unittests/Oracle/Running_MigrationScripts/Everytime_scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using Oracle.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace Oracle.Running_MigrationScripts; -[Collection(nameof(OracleTestContainer))] -public class Everytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(OracleGrateTestContext))] +public class Everytime_scripts(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Everytime_scripts(testContext, testOutput); diff --git a/unittests/Oracle/Running_MigrationScripts/Failing_Scripts.cs b/unittests/Oracle/Running_MigrationScripts/Failing_Scripts.cs index 1b16cea7..dcbc68f4 100644 --- a/unittests/Oracle/Running_MigrationScripts/Failing_Scripts.cs +++ b/unittests/Oracle/Running_MigrationScripts/Failing_Scripts.cs @@ -1,9 +1,10 @@ -using TestCommon.TestInfrastructure; +using Oracle.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace Oracle.Running_MigrationScripts; -[Collection(nameof(OracleTestContainer))] -public class Failing_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(OracleGrateTestContext))] +public class Failing_Scripts(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Failing_Scripts(testContext, testOutput) { protected override string ExpectedErrorMessageForInvalidSql => diff --git a/unittests/Oracle/Running_MigrationScripts/One_time_scripts.cs b/unittests/Oracle/Running_MigrationScripts/One_time_scripts.cs index 229b625c..5ae77224 100644 --- a/unittests/Oracle/Running_MigrationScripts/One_time_scripts.cs +++ b/unittests/Oracle/Running_MigrationScripts/One_time_scripts.cs @@ -1,10 +1,11 @@ -using TestCommon.TestInfrastructure; +using Oracle.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace Oracle.Running_MigrationScripts; -[Collection(nameof(OracleTestContainer))] -public class One_time_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(OracleGrateTestContext))] +public class One_time_scripts(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.One_time_scripts(testContext, testOutput) { protected override string CreateView1 => base.CreateView1 + " FROM DUAL"; diff --git a/unittests/Oracle/Running_MigrationScripts/Order_Of_Scripts.cs b/unittests/Oracle/Running_MigrationScripts/Order_Of_Scripts.cs index 2e4ec3a8..84028391 100644 --- a/unittests/Oracle/Running_MigrationScripts/Order_Of_Scripts.cs +++ b/unittests/Oracle/Running_MigrationScripts/Order_Of_Scripts.cs @@ -1,7 +1,8 @@ -using TestCommon.TestInfrastructure; +using Oracle.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace Oracle.Running_MigrationScripts; -[Collection(nameof(OracleTestContainer))] -public class Order_Of_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(OracleGrateTestContext))] +public class Order_Of_Scripts(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Order_Of_Scripts(testContext, testOutput); diff --git a/unittests/Oracle/Running_MigrationScripts/ScriptsRun_Table.cs b/unittests/Oracle/Running_MigrationScripts/ScriptsRun_Table.cs index 848f9767..fda53c2f 100644 --- a/unittests/Oracle/Running_MigrationScripts/ScriptsRun_Table.cs +++ b/unittests/Oracle/Running_MigrationScripts/ScriptsRun_Table.cs @@ -1,7 +1,8 @@ -using TestCommon.TestInfrastructure; +using Oracle.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace Oracle.Running_MigrationScripts; -[Collection(nameof(OracleTestContainer))] -public class ScriptsRun_Table(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(OracleGrateTestContext))] +public class ScriptsRun_Table(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.ScriptsRun_Table(testContext, testOutput); diff --git a/unittests/Oracle/Running_MigrationScripts/TokenScripts.cs b/unittests/Oracle/Running_MigrationScripts/TokenScripts.cs index 63058594..d199ac0d 100644 --- a/unittests/Oracle/Running_MigrationScripts/TokenScripts.cs +++ b/unittests/Oracle/Running_MigrationScripts/TokenScripts.cs @@ -1,9 +1,10 @@ -using TestCommon.TestInfrastructure; +using Oracle.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace Oracle.Running_MigrationScripts; -[Collection(nameof(OracleTestContainer))] -public class TokenScripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(OracleGrateTestContext))] +public class TokenScripts(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.TokenScripts(testContext, testOutput) { protected override string CreateDatabaseName => base.CreateDatabaseName + " FROM DUAL"; diff --git a/unittests/Oracle/Running_MigrationScripts/Versioning_The_Database.cs b/unittests/Oracle/Running_MigrationScripts/Versioning_The_Database.cs index 6598ae04..b315092b 100644 --- a/unittests/Oracle/Running_MigrationScripts/Versioning_The_Database.cs +++ b/unittests/Oracle/Running_MigrationScripts/Versioning_The_Database.cs @@ -1,11 +1,12 @@ -using TestCommon.TestInfrastructure; +using Oracle.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace Oracle.Running_MigrationScripts; -[Collection(nameof(OracleTestContainer))] +[Collection(nameof(OracleGrateTestContext))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class Versioning_The_Database(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Versioning_The_Database(OracleGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Versioning_The_Database(testContext, testOutput) { [Fact(Skip = "Skip due to Oracle doesn't support dynamic database creation in runtime")] diff --git a/unittests/Oracle/Startup.cs b/unittests/Oracle/Startup.cs index 4eaf9580..97156ce2 100644 --- a/unittests/Oracle/Startup.cs +++ b/unittests/Oracle/Startup.cs @@ -1,40 +1,20 @@ -using grate.Configuration; using grate.DependencyInjection; -using grate.Infrastructure; -using grate.mariadb.DependencyInjection; -using grate.Migration; using grate.oracle.DependencyInjection; -using grate.Oracle.Infrastructure; -using grate.Oracle.Migration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; +using Oraclde.TestInfrastructure; using Oracle.TestInfrastructure; using TestCommon.TestInfrastructure; namespace Oracle; // ReSharper disable once UnusedType.Global -public class Startup +public class Startup: TestCommon.Startup { - - // ReSharper disable once UnusedMember.Global - public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + protected override void ConfigureExtraServices(IServiceCollection services, HostBuilderContext context) { - services.AddLogging( - lb => lb - .AddXUnit() - .AddConsole() - .SetMinimumLevel(TestConfig.GetLogLevel()) - ); - services .AddGrate() .UseOracle(); - - services.TryAddSingleton(); - services.TryAddTransient(); } - } diff --git a/unittests/Oracle/TestInfrastructure/OracleExternalDatabase.cs b/unittests/Oracle/TestInfrastructure/OracleExternalDatabase.cs new file mode 100644 index 00000000..2f35b726 --- /dev/null +++ b/unittests/Oracle/TestInfrastructure/OracleExternalDatabase.cs @@ -0,0 +1,30 @@ +using Oracle.ManagedDataAccess.Client; +using TestCommon.TestInfrastructure; + +namespace Oraclde.TestInfrastructure; + +public class OracleExternalDatabase(GrateTestConfig grateTestConfig) : ITestDatabase +{ + public string AdminConnectionString { get; } = grateTestConfig.AdminConnectionString ?? throw new ArgumentNullException(nameof(grateTestConfig)); + + public string ConnectionString(string database) + { + var builder = new OracleConnectionStringBuilder(AdminConnectionString) + { + UserID = database.ToUpper(), + ConnectionTimeout = 2 + }; + return builder.ConnectionString; + } + + public string UserConnectionString(string database) + { + var builder = new OracleConnectionStringBuilder(AdminConnectionString) + { + UserID = database.ToUpper(), + ConnectionTimeout = 2 + }; + return builder.ConnectionString; + } + +} diff --git a/unittests/Oracle/TestInfrastructure/OracleGrateTestContext.cs b/unittests/Oracle/TestInfrastructure/OracleGrateTestContext.cs index 2ac7bc91..0be8a750 100644 --- a/unittests/Oracle/TestInfrastructure/OracleGrateTestContext.cs +++ b/unittests/Oracle/TestInfrastructure/OracleGrateTestContext.cs @@ -1,4 +1,5 @@ using System.Data; +using Docker.DotNet.Models; using grate.Infrastructure; using grate.Migration; using grate.Oracle.Infrastructure; @@ -8,47 +9,39 @@ namespace Oracle.TestInfrastructure; -public class OracleGrateTestContext : IGrateTestContext -{ - private readonly OracleTestContainer _testContainer; +[CollectionDefinition(nameof(OracleGrateTestContext))] +public class OracleTestCollection : ICollectionFixture; + +public class OracleGrateTestContext : GrateTestContext +{ public OracleGrateTestContext( IGrateMigrator grateMigrator, - OracleTestContainer container) + ITestDatabase testDatabase) : base(testDatabase) { Migrator = grateMigrator; - _testContainer = container; } - public IGrateMigrator Migrator { get; } - - public string AdminPassword => _testContainer.AdminPassword; - public int? Port => _testContainer.TestContainer!.GetMappedPublicPort(_testContainer.Port); - + public override IGrateMigrator Migrator { get; } // public string DockerCommand(string serverName, string adminPassword) => // $"run -d --name {serverName} -p 1521 -e ORACLE_ENABLE_XDB=true -e ORACLE_PWD={adminPassword} -P container-registry.oracle.com/database/express:21.3.0-xe"; + public override IDbConnection GetDbConnection(string connectionString) => new OracleConnection(connectionString); - public string AdminConnectionString => $@"Data Source={_testContainer.TestContainer!.Hostname}:{Port}/XEPDB1;User ID=system;Password={AdminPassword};Pooling=False"; - public string ConnectionString(string database) => $@"Data Source={_testContainer.TestContainer!.Hostname}:{Port}/XEPDB1;User ID={database.ToUpper()};Password={AdminPassword};Pooling=False"; - public string UserConnectionString(string database) => $@"Data Source={_testContainer.TestContainer!.Hostname}:{Port}/XEPDB1;User ID={database.ToUpper()};Password={AdminPassword};Pooling=False"; - - public IDbConnection GetDbConnection(string connectionString) => new OracleConnection(connectionString); - - public ISyntax Syntax => new OracleSyntax(); - public Type DbExceptionType => typeof(OracleException); + public override ISyntax Syntax => new OracleSyntax(); + public override Type DbExceptionType => typeof(OracleException); - public Type DatabaseType => typeof(OracleDatabase); - public bool SupportsTransaction => false; + public override Type DatabaseType => typeof(OracleDatabase); + public override bool SupportsTransaction => false; - public SqlStatements Sql => new() + public override SqlStatements Sql => new() { SelectVersion = "SELECT * FROM v$version WHERE banner LIKE 'Oracle%'", SleepTwoSeconds = "sys.dbms_session.sleep(2);" }; - public string ExpectedVersionPrefix => "Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production"; - public bool SupportsCreateDatabase => true; - public bool SupportsSchemas => false; + public override string ExpectedVersionPrefix => "Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production"; + public override bool SupportsCreateDatabase => true; + public override bool SupportsSchemas => false; } diff --git a/unittests/Oracle/TestInfrastructure/OracleTestContainer.cs b/unittests/Oracle/TestInfrastructure/OracleTestContainer.cs deleted file mode 100644 index e34b8ed8..00000000 --- a/unittests/Oracle/TestInfrastructure/OracleTestContainer.cs +++ /dev/null @@ -1,29 +0,0 @@ -using DotNet.Testcontainers.Containers; -using Microsoft.Extensions.Logging; -using Testcontainers.Oracle; - -namespace TestCommon.TestInfrastructure; -public class OracleTestContainer : ContainerFixture -{ - public override string DockerImage => "gvenzl/oracle-xe:21.3.0-slim-faststart"; - public override int Port => 1521; - - public OracleTestContainer(ILogger logger) : base(logger) - { - } - - protected override OracleContainer InitializeTestContainer() - { - return new OracleBuilder() - .WithImage(DockerImage) - .WithEnvironment("DOCKER_DEFAULT_PLATFORM", "linux/amd64") - .WithPassword(AdminPassword) - .WithPortBinding(Port, true) - .Build(); - } -} - -[CollectionDefinition(nameof(OracleTestContainer))] -public class OracleTestCollection : ICollectionFixture -{ -} diff --git a/unittests/Oracle/TestInfrastructure/OracleTestContainerDatabase.cs b/unittests/Oracle/TestInfrastructure/OracleTestContainerDatabase.cs new file mode 100644 index 00000000..84abcbc8 --- /dev/null +++ b/unittests/Oracle/TestInfrastructure/OracleTestContainerDatabase.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.Logging; +using Testcontainers.Oracle; + +namespace TestCommon.TestInfrastructure; +public class OracleTestContainerDatabase : TestContainerDatabase +{ + public override string DockerImage => "gvenzl/oracle-xe:21.3.0-slim-faststart"; + protected override int InternalPort => 1521; + + public OracleTestContainerDatabase(ILogger logger) : base(logger) + { + } + + protected override OracleContainer InitializeTestContainer() + { + return new OracleBuilder() + .WithImage(DockerImage) + .WithEnvironment("DOCKER_DEFAULT_PLATFORM", "linux/amd64") + .WithPassword(AdminPassword) + .WithPortBinding(InternalPort, true) + .Build(); + } + + public override string AdminConnectionString => $@"Data Source={TestContainer.Hostname}:{Port}/XEPDB1;User ID=system;Password={AdminPassword};Pooling=False"; + public override string ConnectionString(string database) => $@"Data Source={TestContainer.Hostname}:{Port}/XEPDB1;User ID={database.ToUpper()};Password={AdminPassword};Pooling=False"; + public override string UserConnectionString(string database) => $@"Data Source={TestContainer.Hostname}:{Port}/XEPDB1;User ID={database.ToUpper()};Password={AdminPassword};Pooling=False"; + +} diff --git a/unittests/PostgreSQL/Database.cs b/unittests/PostgreSQL/Database.cs index 70def1ab..8354f9d0 100644 --- a/unittests/PostgreSQL/Database.cs +++ b/unittests/PostgreSQL/Database.cs @@ -1,8 +1,9 @@ -using TestCommon.Generic; +using PostgreSQL.TestInfrastructure; +using TestCommon.Generic; using TestCommon.TestInfrastructure; namespace PostgreSQL; -[Collection(nameof(PostgreSqlTestContainer))] -public class Database(IGrateTestContext testContext, ITestOutputHelper testOutput) : +[Collection(nameof(PostgreSqlGrateTestContext))] +public class Database(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : GenericDatabase(testContext, testOutput); diff --git a/unittests/PostgreSQL/DependencyInjection/ServiceCollectionTest.cs b/unittests/PostgreSQL/DependencyInjection/ServiceCollectionTest.cs index 36443175..e2cc7b3a 100644 --- a/unittests/PostgreSQL/DependencyInjection/ServiceCollectionTest.cs +++ b/unittests/PostgreSQL/DependencyInjection/ServiceCollectionTest.cs @@ -1,7 +1,8 @@ -using TestCommon.TestInfrastructure; +using PostgreSQL.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace PostgreSQL.DependencyInjection; -[Collection(nameof(PostgreSqlTestContainer))] -public class ServiceCollectionTest(IGrateTestContext context) +[Collection(nameof(PostgreSqlGrateTestContext))] +public class ServiceCollectionTest(PostgreSqlGrateTestContext context) : TestCommon.DependencyInjection.GrateServiceCollectionTest(context); diff --git a/unittests/PostgreSQL/MigrationTables.cs b/unittests/PostgreSQL/MigrationTables.cs index 721416d0..dbd5c2d4 100644 --- a/unittests/PostgreSQL/MigrationTables.cs +++ b/unittests/PostgreSQL/MigrationTables.cs @@ -1,8 +1,9 @@ -using TestCommon.Generic; +using PostgreSQL.TestInfrastructure; +using TestCommon.Generic; using TestCommon.TestInfrastructure; namespace PostgreSQL; -[Collection(nameof(PostgreSqlTestContainer))] -public class MigrationTables(IGrateTestContext testContext, ITestOutputHelper testOutput) : +[Collection(nameof(PostgreSqlGrateTestContext))] +public class MigrationTables(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : GenericMigrationTables(testContext, testOutput); diff --git a/unittests/PostgreSQL/Running_MigrationScripts/Anytime_scripts.cs b/unittests/PostgreSQL/Running_MigrationScripts/Anytime_scripts.cs index d3ff7f98..b396218e 100644 --- a/unittests/PostgreSQL/Running_MigrationScripts/Anytime_scripts.cs +++ b/unittests/PostgreSQL/Running_MigrationScripts/Anytime_scripts.cs @@ -1,9 +1,10 @@ -using TestCommon.TestInfrastructure; +using PostgreSQL.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] +[Collection(nameof(PostgreSqlGrateTestContext))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class Anytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Anytime_scripts(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Anytime_scripts(testContext, testOutput); diff --git a/unittests/PostgreSQL/Running_MigrationScripts/DropDatabase.cs b/unittests/PostgreSQL/Running_MigrationScripts/DropDatabase.cs index 5cd8d17d..61452119 100644 --- a/unittests/PostgreSQL/Running_MigrationScripts/DropDatabase.cs +++ b/unittests/PostgreSQL/Running_MigrationScripts/DropDatabase.cs @@ -1,7 +1,8 @@ -using TestCommon.TestInfrastructure; +using PostgreSQL.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] -public class DropDatabase(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(PostgreSqlGrateTestContext))] +public class DropDatabase(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.DropDatabase(testContext, testOutput); diff --git a/unittests/PostgreSQL/Running_MigrationScripts/Environment_scripts.cs b/unittests/PostgreSQL/Running_MigrationScripts/Environment_scripts.cs index 1837e178..8956ba63 100644 --- a/unittests/PostgreSQL/Running_MigrationScripts/Environment_scripts.cs +++ b/unittests/PostgreSQL/Running_MigrationScripts/Environment_scripts.cs @@ -1,9 +1,10 @@ -using TestCommon.TestInfrastructure; +using PostgreSQL.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] +[Collection(nameof(PostgreSqlGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Environment_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Environment_scripts(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Environment_scripts(testContext, testOutput); diff --git a/unittests/PostgreSQL/Running_MigrationScripts/Everytime_scripts.cs b/unittests/PostgreSQL/Running_MigrationScripts/Everytime_scripts.cs index a8cc08c1..38387203 100644 --- a/unittests/PostgreSQL/Running_MigrationScripts/Everytime_scripts.cs +++ b/unittests/PostgreSQL/Running_MigrationScripts/Everytime_scripts.cs @@ -1,14 +1,15 @@ using Dapper; using FluentAssertions; using grate.Configuration; +using PostgreSQL.TestInfrastructure; using TestCommon.TestInfrastructure; using static grate.Configuration.KnownFolderKeys; namespace PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] +[Collection(nameof(PostgreSqlGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Everytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Everytime_scripts(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Everytime_scripts(testContext, testOutput) { [Fact] diff --git a/unittests/PostgreSQL/Running_MigrationScripts/Failing_Scripts.cs b/unittests/PostgreSQL/Running_MigrationScripts/Failing_Scripts.cs index fc8043cd..479ddc3d 100644 --- a/unittests/PostgreSQL/Running_MigrationScripts/Failing_Scripts.cs +++ b/unittests/PostgreSQL/Running_MigrationScripts/Failing_Scripts.cs @@ -1,10 +1,11 @@ -using TestCommon.TestInfrastructure; +using PostgreSQL.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] +[Collection(nameof(PostgreSqlGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Failing_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Failing_Scripts(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Failing_Scripts(testContext, testOutput) { diff --git a/unittests/PostgreSQL/Running_MigrationScripts/One_time_scripts.cs b/unittests/PostgreSQL/Running_MigrationScripts/One_time_scripts.cs index c44a93dd..6222e94d 100644 --- a/unittests/PostgreSQL/Running_MigrationScripts/One_time_scripts.cs +++ b/unittests/PostgreSQL/Running_MigrationScripts/One_time_scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using PostgreSQL.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] +[Collection(nameof(PostgreSqlGrateTestContext))] // ReSharper disable once InconsistentNaming -public class One_time_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class One_time_scripts(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.One_time_scripts(testContext, testOutput); diff --git a/unittests/PostgreSQL/Running_MigrationScripts/Order_Of_Scripts.cs b/unittests/PostgreSQL/Running_MigrationScripts/Order_Of_Scripts.cs index 387bbb8b..6cb20411 100644 --- a/unittests/PostgreSQL/Running_MigrationScripts/Order_Of_Scripts.cs +++ b/unittests/PostgreSQL/Running_MigrationScripts/Order_Of_Scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using PostgreSQL.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] +[Collection(nameof(PostgreSqlGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Order_Of_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Order_Of_Scripts(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Order_Of_Scripts(testContext, testOutput); diff --git a/unittests/PostgreSQL/Running_MigrationScripts/ScriptsRun_Table.cs b/unittests/PostgreSQL/Running_MigrationScripts/ScriptsRun_Table.cs index 4612b74d..ed76e7c8 100644 --- a/unittests/PostgreSQL/Running_MigrationScripts/ScriptsRun_Table.cs +++ b/unittests/PostgreSQL/Running_MigrationScripts/ScriptsRun_Table.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using PostgreSQL.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] -public class ScriptsRun_Table(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(PostgreSqlGrateTestContext))] +public class ScriptsRun_Table(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.ScriptsRun_Table(testContext, testOutput); diff --git a/unittests/PostgreSQL/Running_MigrationScripts/TokenScripts.cs b/unittests/PostgreSQL/Running_MigrationScripts/TokenScripts.cs index b0a28de8..e16bf4f8 100644 --- a/unittests/PostgreSQL/Running_MigrationScripts/TokenScripts.cs +++ b/unittests/PostgreSQL/Running_MigrationScripts/TokenScripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using PostgreSQL.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] -public class TokenScripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(PostgreSqlGrateTestContext))] +public class TokenScripts(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.TokenScripts(testContext, testOutput); diff --git a/unittests/PostgreSQL/Running_MigrationScripts/Versioning_The_Database.cs b/unittests/PostgreSQL/Running_MigrationScripts/Versioning_The_Database.cs index e38e5a30..ca56dbd8 100644 --- a/unittests/PostgreSQL/Running_MigrationScripts/Versioning_The_Database.cs +++ b/unittests/PostgreSQL/Running_MigrationScripts/Versioning_The_Database.cs @@ -1,8 +1,9 @@ +using PostgreSQL.TestInfrastructure; using TestCommon.TestInfrastructure; namespace PostgreSQL.Running_MigrationScripts; -[Collection(nameof(PostgreSqlTestContainer))] +[Collection(nameof(PostgreSqlGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Versioning_The_Database(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Versioning_The_Database(PostgreSqlGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Versioning_The_Database(testContext, testOutput); diff --git a/unittests/PostgreSQL/Startup.cs b/unittests/PostgreSQL/Startup.cs index b16d0735..cbda6c44 100644 --- a/unittests/PostgreSQL/Startup.cs +++ b/unittests/PostgreSQL/Startup.cs @@ -1,34 +1,19 @@ using grate.DependencyInjection; using grate.postgresql.DependencyInjection; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; using PostgreSQL.TestInfrastructure; using TestCommon.TestInfrastructure; namespace PostgreSQL; // ReSharper disable once UnusedType.Global -public class Startup +public class Startup: TestCommon.Startup { - - // ReSharper disable once UnusedMember.Global - public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + protected override void ConfigureExtraServices(IServiceCollection services, HostBuilderContext context) { - services.AddLogging( - lb => lb - .AddXUnit() - .AddConsole() - .SetMinimumLevel(TestConfig.GetLogLevel()) - ); - services .AddGrate() .UsePostgreSQL(); - - services.TryAddSingleton(); - services.TryAddTransient(); } - } diff --git a/unittests/PostgreSQL/TestInfrastructure/PostgreSqlExternalDatabase.cs b/unittests/PostgreSQL/TestInfrastructure/PostgreSqlExternalDatabase.cs new file mode 100644 index 00000000..96f1d1eb --- /dev/null +++ b/unittests/PostgreSQL/TestInfrastructure/PostgreSqlExternalDatabase.cs @@ -0,0 +1,33 @@ +using Npgsql; +using TestCommon.TestInfrastructure; + +namespace PostgreSQL.TestInfrastructure; + +// ReSharper disable once ClassNeverInstantiated.Global +public class PostgreSqlExternalDatabase(GrateTestConfig grateTestConfig) : ITestDatabase +{ + public string AdminConnectionString { get; } = grateTestConfig.AdminConnectionString ?? throw new ArgumentNullException(nameof(grateTestConfig)); + + public string ConnectionString(string database) + { + var builder = new NpgsqlConnectionStringBuilder(AdminConnectionString) + { + Database = database, + Timeout = 2 + }; + return builder.ConnectionString; + } + + public string UserConnectionString(string database) + { + var builder = new NpgsqlConnectionStringBuilder(AdminConnectionString) + { + Database = database, + Username = "zorro", + Password = "batmanZZ4", + Timeout = 2 + }; + return builder.ConnectionString; + } + +} diff --git a/unittests/PostgreSQL/TestInfrastructure/PostgreSqlGrateTestContext.cs b/unittests/PostgreSQL/TestInfrastructure/PostgreSqlGrateTestContext.cs index 298e7bcb..6fb48c75 100644 --- a/unittests/PostgreSQL/TestInfrastructure/PostgreSqlGrateTestContext.cs +++ b/unittests/PostgreSQL/TestInfrastructure/PostgreSqlGrateTestContext.cs @@ -8,51 +8,37 @@ namespace PostgreSQL.TestInfrastructure; -public class PostgreSqlGrateTestContext : IGrateTestContext -{ - private readonly PostgreSqlTestContainer _testContainer; +[CollectionDefinition(nameof(PostgreSqlGrateTestContext))] +public class PostgresqlTestCollection : ICollectionFixture; + +public class PostgreSqlGrateTestContext : GrateTestContext +{ public PostgreSqlGrateTestContext( IGrateMigrator migrator, - PostgreSqlTestContainer container) + ITestDatabase testDatabase) : base(testDatabase) { - _testContainer = container; Migrator = migrator; } - public IGrateMigrator Migrator { get; } - - private string AdminPassword => _testContainer.AdminPassword; - private int? Port => _testContainer.TestContainer.GetMappedPublicPort(_testContainer.Port); - private string Hostname => _testContainer.TestContainer.Hostname; - - - public string AdminConnectionString => - $"Host={Hostname};Port={Port};Database=postgres;Username=postgres;Password={AdminPassword};Include Error Detail=true;Pooling=false"; - - - public string ConnectionString(string database) => - $"Host={_testContainer.TestContainer!.Hostname};Port={Port};Database={database};Username=postgres;Password={AdminPassword};Include Error Detail=true;Pooling=false"; - - public string UserConnectionString(string database) => - $"Host={_testContainer.TestContainer!.Hostname};Port={Port};Database={database};Username=postgres;Password={AdminPassword};Include Error Detail=true;Pooling=false"; - - public IDbConnection GetDbConnection(string connectionString) => new NpgsqlConnection(connectionString); + public override IGrateMigrator Migrator { get; } + + public override IDbConnection GetDbConnection(string connectionString) => new NpgsqlConnection(connectionString); - public ISyntax Syntax => new PostgreSqlSyntax(); - public Type DbExceptionType => typeof(PostgresException); + public override ISyntax Syntax => new PostgreSqlSyntax(); + public override Type DbExceptionType => typeof(PostgresException); - public Type DatabaseType => typeof(PostgreSqlDatabase); - public bool SupportsTransaction => true; + public override Type DatabaseType => typeof(PostgreSqlDatabase); + public override bool SupportsTransaction => true; - public SqlStatements Sql => new() + public override SqlStatements Sql => new() { SelectVersion = "SELECT version()", SleepTwoSeconds = "SELECT pg_sleep(2);" }; - public string ExpectedVersionPrefix => "PostgreSQL 16."; - public bool SupportsCreateDatabase => true; - public bool SupportsSchemas => true; + public override string ExpectedVersionPrefix => "PostgreSQL 16."; + public override bool SupportsCreateDatabase => true; + public override bool SupportsSchemas => true; } diff --git a/unittests/PostgreSQL/TestInfrastructure/PostgreSqlTestContainer.cs b/unittests/PostgreSQL/TestInfrastructure/PostgreSqlTestContainer.cs deleted file mode 100644 index 81533ae7..00000000 --- a/unittests/PostgreSQL/TestInfrastructure/PostgreSqlTestContainer.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.Extensions.Logging; - -namespace TestCommon.TestInfrastructure; -public class PostgreSqlTestContainer : ContainerFixture -{ - public override string DockerImage => "postgres:16"; - public override int Port => 5432; - - public PostgreSqlTestContainer(ILogger logger) : base(logger) - { - } - - protected override PostgreSqlContainer InitializeTestContainer() - { - return new PostgreSqlBuilder() - .WithImage(DockerImage) - .WithPassword(AdminPassword) - .WithPortBinding(Port, true) - .Build(); - } -} - -[CollectionDefinition(nameof(PostgreSqlTestContainer))] -public class PostgresqlTestCollection : ICollectionFixture -{ -} diff --git a/unittests/PostgreSQL/TestInfrastructure/PostgreSqlTestContainerDatabase.cs b/unittests/PostgreSQL/TestInfrastructure/PostgreSqlTestContainerDatabase.cs new file mode 100644 index 00000000..4a99409b --- /dev/null +++ b/unittests/PostgreSQL/TestInfrastructure/PostgreSqlTestContainerDatabase.cs @@ -0,0 +1,34 @@ +using Microsoft.Extensions.Logging; + +namespace TestCommon.TestInfrastructure; +public class PostgreSqlTestContainerDatabase : TestContainerDatabase +{ + public override string DockerImage => "postgres:16"; + protected override int InternalPort => 5432; + + public PostgreSqlTestContainerDatabase(ILogger logger) : base(logger) + { + } + + protected override PostgreSqlContainer InitializeTestContainer() + { + return new PostgreSqlBuilder() + .WithImage(DockerImage) + .WithPassword(AdminPassword) + .WithPortBinding(InternalPort, true) + .Build(); + } + + public override string AdminConnectionString => + $"Host={TestContainer.Hostname};Port={Port};Database=postgres;Username=postgres;Password={AdminPassword};Include Error Detail=true;Pooling=false"; + + + public override string ConnectionString(string database) => + $"Host={TestContainer.Hostname};Port={Port};Database={database};Username=postgres;Password={AdminPassword};Include Error Detail=true;Pooling=false"; + + public override string UserConnectionString(string database) => + $"Host={TestContainer.Hostname};Port={Port};Database={database};Username=postgres;Password={AdminPassword};Include Error Detail=true;Pooling=false"; + + +} + diff --git a/unittests/SqlServer/Database.cs b/unittests/SqlServer/Database.cs index 025715ca..700d7860 100644 --- a/unittests/SqlServer/Database.cs +++ b/unittests/SqlServer/Database.cs @@ -1,10 +1,11 @@ using FluentAssertions; +using SqlServer.TestInfrastructure; using TestCommon.TestInfrastructure; namespace SqlServer; -[Collection(nameof(SqlServerTestContainer))] -public class Database(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(SqlServerGrateTestContext))] +public class Database(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.GenericDatabase(testContext, testOutput) { diff --git a/unittests/SqlServer/DependencyInjection/ServiceCollectionTest.cs b/unittests/SqlServer/DependencyInjection/ServiceCollectionTest.cs index aab6c581..69b4a05c 100644 --- a/unittests/SqlServer/DependencyInjection/ServiceCollectionTest.cs +++ b/unittests/SqlServer/DependencyInjection/ServiceCollectionTest.cs @@ -1,7 +1,8 @@ -using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServer.DependencyInjection; -[Collection(nameof(SqlServerTestContainer))] -public class ServiceCollectionTest(IGrateTestContext context) +[Collection(nameof(SqlServerGrateTestContext))] +public class ServiceCollectionTest(SqlServerGrateTestContext context) : TestCommon.DependencyInjection.GrateServiceCollectionTest(context); diff --git a/unittests/SqlServer/MigrationTables.cs b/unittests/SqlServer/MigrationTables.cs index ce12f135..08e8e494 100644 --- a/unittests/SqlServer/MigrationTables.cs +++ b/unittests/SqlServer/MigrationTables.cs @@ -1,10 +1,11 @@ -using TestCommon.Generic; +using SqlServer.TestInfrastructure; +using TestCommon.Generic; using TestCommon.TestInfrastructure; namespace SqlServer; -[Collection(nameof(SqlServerTestContainer))] -public class MigrationTables(IGrateTestContext testContext, ITestOutputHelper testOutput) +[Collection(nameof(SqlServerGrateTestContext))] +public class MigrationTables(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : GenericMigrationTables(testContext, testOutput) { protected override string CountTableSql(string schemaName, string tableName) diff --git a/unittests/SqlServer/Running_MigrationScripts/Anytime_scripts.cs b/unittests/SqlServer/Running_MigrationScripts/Anytime_scripts.cs index 61bdb898..763cabce 100644 --- a/unittests/SqlServer/Running_MigrationScripts/Anytime_scripts.cs +++ b/unittests/SqlServer/Running_MigrationScripts/Anytime_scripts.cs @@ -1,9 +1,10 @@ -using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Anytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Anytime_scripts(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Anytime_scripts(testContext, testOutput); diff --git a/unittests/SqlServer/Running_MigrationScripts/DropDatabase.cs b/unittests/SqlServer/Running_MigrationScripts/DropDatabase.cs index ae8710ce..5da1d573 100644 --- a/unittests/SqlServer/Running_MigrationScripts/DropDatabase.cs +++ b/unittests/SqlServer/Running_MigrationScripts/DropDatabase.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class DropDatabase(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class DropDatabase(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.DropDatabase(testContext, testOutput); diff --git a/unittests/SqlServer/Running_MigrationScripts/Environment_scripts.cs b/unittests/SqlServer/Running_MigrationScripts/Environment_scripts.cs index 39e71bb0..2ff757d5 100644 --- a/unittests/SqlServer/Running_MigrationScripts/Environment_scripts.cs +++ b/unittests/SqlServer/Running_MigrationScripts/Environment_scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Environment_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Environment_scripts(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Environment_scripts(testContext, testOutput); diff --git a/unittests/SqlServer/Running_MigrationScripts/Everytime_scripts.cs b/unittests/SqlServer/Running_MigrationScripts/Everytime_scripts.cs index 2001ca88..fe1c39d4 100644 --- a/unittests/SqlServer/Running_MigrationScripts/Everytime_scripts.cs +++ b/unittests/SqlServer/Running_MigrationScripts/Everytime_scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Everytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Everytime_scripts(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Everytime_scripts(testContext, testOutput); diff --git a/unittests/SqlServer/Running_MigrationScripts/Failing_Scripts.cs b/unittests/SqlServer/Running_MigrationScripts/Failing_Scripts.cs index 0a35cb9e..df93e9d7 100644 --- a/unittests/SqlServer/Running_MigrationScripts/Failing_Scripts.cs +++ b/unittests/SqlServer/Running_MigrationScripts/Failing_Scripts.cs @@ -1,10 +1,11 @@ -using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Failing_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Failing_Scripts(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Failing_Scripts(testContext, testOutput) { diff --git a/unittests/SqlServer/Running_MigrationScripts/One_time_scripts.cs b/unittests/SqlServer/Running_MigrationScripts/One_time_scripts.cs index ef2595bd..af5260d1 100644 --- a/unittests/SqlServer/Running_MigrationScripts/One_time_scripts.cs +++ b/unittests/SqlServer/Running_MigrationScripts/One_time_scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class One_time_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class One_time_scripts(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.One_time_scripts(testContext, testOutput); diff --git a/unittests/SqlServer/Running_MigrationScripts/Order_Of_Scripts.cs b/unittests/SqlServer/Running_MigrationScripts/Order_Of_Scripts.cs index bec9acd3..ed3a3116 100644 --- a/unittests/SqlServer/Running_MigrationScripts/Order_Of_Scripts.cs +++ b/unittests/SqlServer/Running_MigrationScripts/Order_Of_Scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Order_Of_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Order_Of_Scripts(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Order_Of_Scripts(testContext, testOutput); diff --git a/unittests/SqlServer/Running_MigrationScripts/Real_world_issues.cs b/unittests/SqlServer/Running_MigrationScripts/Real_world_issues.cs index a02271ba..0aecf37f 100644 --- a/unittests/SqlServer/Running_MigrationScripts/Real_world_issues.cs +++ b/unittests/SqlServer/Running_MigrationScripts/Real_world_issues.cs @@ -1,5 +1,6 @@ using grate.Configuration; using grate.Migration; +using SqlServer.TestInfrastructure; using TestCommon.Generic.Running_MigrationScripts; using TestCommon.TestInfrastructure; using static grate.Configuration.KnownFolderKeys; @@ -11,8 +12,8 @@ namespace SqlServer.Running_MigrationScripts; /// Issues that have been encountered in the real world. /// Create tests to reproduce the issue and then fix the issue, and keep the test to ensure it doesn't regress. /// -[Collection(nameof(SqlServerTestContainer))] -public class Real_world_issues(IGrateTestContext context, ITestOutputHelper testOutput) : MigrationsScriptsBase(context, testOutput) +[Collection(nameof(SqlServerGrateTestContext))] +public class Real_world_issues(SqlServerGrateTestContext context, ITestOutputHelper testOutput) : MigrationsScriptsBase(context, testOutput) { private const string Bug232Sql = @" ALTER DATABASE {{DatabaseName}} SET ALLOW_SNAPSHOT_ISOLATION ON; diff --git a/unittests/SqlServer/Running_MigrationScripts/RestoreDatabase.cs b/unittests/SqlServer/Running_MigrationScripts/RestoreDatabase.cs index b9b26f42..6a0d63ff 100644 --- a/unittests/SqlServer/Running_MigrationScripts/RestoreDatabase.cs +++ b/unittests/SqlServer/Running_MigrationScripts/RestoreDatabase.cs @@ -1,14 +1,15 @@ using Dapper; using FluentAssertions; using grate.Configuration; +using SqlServer.TestInfrastructure; using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class RestoreDatabase(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class RestoreDatabase(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : SqlServerScriptsBase(testContext, testOutput) { diff --git a/unittests/SqlServer/Running_MigrationScripts/ScriptsRun_Table.cs b/unittests/SqlServer/Running_MigrationScripts/ScriptsRun_Table.cs index 0acf0df3..bcba435b 100644 --- a/unittests/SqlServer/Running_MigrationScripts/ScriptsRun_Table.cs +++ b/unittests/SqlServer/Running_MigrationScripts/ScriptsRun_Table.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class ScriptsRun_Table(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class ScriptsRun_Table(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.ScriptsRun_Table(testContext, testOutput); diff --git a/unittests/SqlServer/Running_MigrationScripts/SqlServerScriptsBase.cs b/unittests/SqlServer/Running_MigrationScripts/SqlServerScriptsBase.cs index 71ed0903..71e22a49 100644 --- a/unittests/SqlServer/Running_MigrationScripts/SqlServerScriptsBase.cs +++ b/unittests/SqlServer/Running_MigrationScripts/SqlServerScriptsBase.cs @@ -1,8 +1,9 @@ -using TestCommon.Generic.Running_MigrationScripts; +using SqlServer.TestInfrastructure; +using TestCommon.Generic.Running_MigrationScripts; using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -public abstract class SqlServerScriptsBase(IGrateTestContext context, ITestOutputHelper testOutput) : +public abstract class SqlServerScriptsBase(SqlServerGrateTestContext context, ITestOutputHelper testOutput) : MigrationsScriptsBase(context, testOutput); diff --git a/unittests/SqlServer/Running_MigrationScripts/TokenScripts.cs b/unittests/SqlServer/Running_MigrationScripts/TokenScripts.cs index 19288801..f0af77ad 100644 --- a/unittests/SqlServer/Running_MigrationScripts/TokenScripts.cs +++ b/unittests/SqlServer/Running_MigrationScripts/TokenScripts.cs @@ -1,10 +1,11 @@ -using TestCommon.TestInfrastructure; +using SqlServer.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class TokenScripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class TokenScripts(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.TokenScripts(testContext, testOutput); diff --git a/unittests/SqlServer/Running_MigrationScripts/Versioning_The_Database.cs b/unittests/SqlServer/Running_MigrationScripts/Versioning_The_Database.cs index 55e8f6aa..ec9372a4 100644 --- a/unittests/SqlServer/Running_MigrationScripts/Versioning_The_Database.cs +++ b/unittests/SqlServer/Running_MigrationScripts/Versioning_The_Database.cs @@ -1,8 +1,9 @@ +using SqlServer.TestInfrastructure; using TestCommon.TestInfrastructure; namespace SqlServer.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming -public class Versioning_The_Database(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Versioning_The_Database(SqlServerGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Versioning_The_Database(testContext, testOutput); diff --git a/unittests/SqlServer/Startup.cs b/unittests/SqlServer/Startup.cs index 3c328317..eef4fe45 100644 --- a/unittests/SqlServer/Startup.cs +++ b/unittests/SqlServer/Startup.cs @@ -3,33 +3,19 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; using SqlServer.TestInfrastructure; -using TestCommon.TestInfrastructure; namespace SqlServer; // ReSharper disable once UnusedType.Global -public class Startup +public class Startup: TestCommon.Startup { - - // ReSharper disable once UnusedMember.Global - public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + protected override void ConfigureExtraServices(IServiceCollection services, HostBuilderContext context) { - services.AddLogging( - lb => lb - .AddXUnit() - .AddConsole() - .SetMinimumLevel(TestConfig.GetLogLevel()) - ); - services .AddGrate() .UseSqlServer(); - - services.TryAddSingleton(); - services.TryAddTransient(); + services.TryAddTransient(); } - } diff --git a/unittests/SqlServer/TestInfrastructure/SqlServerExternalDatabase.cs b/unittests/SqlServer/TestInfrastructure/SqlServerExternalDatabase.cs new file mode 100644 index 00000000..07450075 --- /dev/null +++ b/unittests/SqlServer/TestInfrastructure/SqlServerExternalDatabase.cs @@ -0,0 +1,32 @@ +using Microsoft.Data.SqlClient; +using TestCommon.TestInfrastructure; + +namespace SqlServer.TestInfrastructure; + +public class SqlServerExternalDatabase(GrateTestConfig grateTestConfig) : ITestDatabase +{ + public string AdminConnectionString { get; } = grateTestConfig.AdminConnectionString ?? throw new ArgumentNullException(nameof(grateTestConfig)); + + public string ConnectionString(string database) + { + var builder = new SqlConnectionStringBuilder(AdminConnectionString) + { + InitialCatalog = database, + ConnectTimeout = 2 + }; + return builder.ConnectionString; + } + + public string UserConnectionString(string database) + { + var builder = new SqlConnectionStringBuilder(AdminConnectionString) + { + InitialCatalog = database, + UserID = "zorro", + Password = "batmanZZ4", + ConnectTimeout = 2 + }; + return builder.ConnectionString; + } + +} diff --git a/unittests/SqlServer/TestInfrastructure/SqlServerGrateTestContext.cs b/unittests/SqlServer/TestInfrastructure/SqlServerGrateTestContext.cs index f490084f..db6b9889 100644 --- a/unittests/SqlServer/TestInfrastructure/SqlServerGrateTestContext.cs +++ b/unittests/SqlServer/TestInfrastructure/SqlServerGrateTestContext.cs @@ -4,54 +4,42 @@ using grate.SqlServer.Infrastructure; using grate.SqlServer.Migration; using Microsoft.Data.SqlClient; -using Microsoft.Extensions.DependencyInjection; using TestCommon.TestInfrastructure; namespace SqlServer.TestInfrastructure; -class SqlServerGrateTestContext : IGrateTestContext +[CollectionDefinition(nameof(SqlServerGrateTestContext))] +public class SqlServerTestCollection : ICollectionFixture; + +public class SqlServerGrateTestContext : GrateTestContext { - public IGrateMigrator Migrator { get; } - private readonly SqlServerTestContainer _testContainer; + public override IGrateMigrator Migrator { get; } public SqlServerGrateTestContext( IGrateMigrator migrator, string serverCollation, - SqlServerTestContainer container) + ITestDatabase testDatabase) : base(testDatabase) { Migrator = migrator; - _testContainer = container; ServerCollation = serverCollation; - Syntax = new SqlServerSyntax(); } + + // ReSharper disable once UnusedMember.Global public SqlServerGrateTestContext( IGrateMigrator migrator, - SqlServerTestContainer container) : this(migrator, "Danish_Norwegian_CI_AS", container) + ITestDatabase testDatabase): this(migrator, "Danish_Norwegian_CI_AS", testDatabase) { } - public string AdminPassword => _testContainer.AdminPassword; - public int? Port => _testContainer.TestContainer!.GetMappedPublicPort(_testContainer.Port); - - public string AdminConnectionString => - $"Data Source=localhost,{Port};Initial Catalog=master;User Id=sa;Password={AdminPassword};Encrypt=false;Pooling=false"; - - public string ConnectionString(string database) => - $"Data Source=localhost,{Port};Initial Catalog={database};User Id=sa;Password={AdminPassword};Encrypt=false;Pooling=false;Connect Timeout=2"; - - public string UserConnectionString(string database) => - $"Data Source=localhost,{Port};Initial Catalog={database};User Id=zorro;Password=batmanZZ4;Encrypt=false;Pooling=false;Connect Timeout=2"; - - public IDbConnection GetDbConnection(string connectionString) => new SqlConnection(connectionString); - - + + public override IDbConnection GetDbConnection(string connectionString) => new SqlConnection(connectionString); - public ISyntax Syntax { get; init; } - public Type DbExceptionType => typeof(SqlException); + public override ISyntax Syntax { get; } = new SqlServerSyntax(); + public override Type DbExceptionType => typeof(SqlException); - public Type DatabaseType => typeof(SqlServerDatabase); - public bool SupportsTransaction => true; + public override Type DatabaseType => typeof(SqlServerDatabase); + public override bool SupportsTransaction => true; - public SqlStatements Sql => new() + public override SqlStatements Sql => new() { SelectVersion = "SELECT @@VERSION", SleepTwoSeconds = "WAITFOR DELAY '00:00:02'", @@ -68,10 +56,10 @@ public string UserConnectionString(string database) => """, }; - public string ExpectedVersionPrefix => "Microsoft SQL Server 2019"; + public override string ExpectedVersionPrefix => "Microsoft SQL Server 20"; - public bool SupportsCreateDatabase => true; - public bool SupportsSchemas => true; + public override bool SupportsCreateDatabase => true; + public override bool SupportsSchemas => true; public string ServerCollation { get; } } diff --git a/unittests/SqlServer/TestInfrastructure/SqlServerTestContainer.cs b/unittests/SqlServer/TestInfrastructure/SqlServerTestContainer.cs deleted file mode 100644 index 469056cd..00000000 --- a/unittests/SqlServer/TestInfrastructure/SqlServerTestContainer.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.Extensions.Logging; -using Testcontainers.MsSql; -namespace TestCommon.TestInfrastructure; -public class SqlServerTestContainer : ContainerFixture -{ - // Run with linux/amd86 on ARM architectures too, the docker emulation is good enough - public override string DockerImage => "mcr.microsoft.com/mssql/server:2019-latest"; - public override int Port => 1433; - - public SqlServerTestContainer(ILogger logger) : base(logger) - { - } - - protected override MsSqlContainer InitializeTestContainer() - { - return new MsSqlBuilder() - .WithImage(DockerImage) - .WithEnvironment("DOCKER_DEFAULT_PLATFORM", "linux/amd64") - .WithPassword(AdminPassword) - .WithPortBinding(Port, true) - .WithEnvironment("MSSQL_COLLATION", "Danish_Norwegian_CI_AS") - .Build(); - } -} - -[CollectionDefinition(nameof(SqlServerTestContainer))] -public class SqlServerCITestCollection : ICollectionFixture -{ -} diff --git a/unittests/SqlServer/TestInfrastructure/SqlServerTestContainerDatabase.cs b/unittests/SqlServer/TestInfrastructure/SqlServerTestContainerDatabase.cs new file mode 100644 index 00000000..fa19e8f0 --- /dev/null +++ b/unittests/SqlServer/TestInfrastructure/SqlServerTestContainerDatabase.cs @@ -0,0 +1,36 @@ +using Microsoft.Extensions.Logging; +using TestCommon.TestInfrastructure; +using Testcontainers.MsSql; + +namespace SqlServer.TestInfrastructure; +public class SqlServerTestContainerDatabase : TestContainerDatabase +{ + // Run with linux/amd86 on ARM architectures too, the docker emulation is good enough + public override string DockerImage => "mcr.microsoft.com/mssql/server:2019-latest"; + protected override int InternalPort => 1433; + + public SqlServerTestContainerDatabase(ILogger logger) : base(logger) + { + } + + protected override MsSqlContainer InitializeTestContainer() + { + return new MsSqlBuilder() + .WithImage(DockerImage) + .WithEnvironment("DOCKER_DEFAULT_PLATFORM", "linux/amd64") + .WithPassword(AdminPassword) + .WithPortBinding(InternalPort, true) + .WithEnvironment("MSSQL_COLLATION", "Danish_Norwegian_CI_AS") + .Build(); + } + + public override string AdminConnectionString => + $"Data Source=localhost,{Port};Initial Catalog=master;User Id=sa;Password={AdminPassword};Encrypt=false;Pooling=false"; + + public override string ConnectionString(string database) => + $"Data Source=localhost,{Port};Initial Catalog={database};User Id=sa;Password={AdminPassword};Encrypt=false;Pooling=false;Connect Timeout=2"; + + public override string UserConnectionString(string database) => + $"Data Source=localhost,{Port};Initial Catalog={database};User Id=zorro;Password=batmanZZ4;Encrypt=false;Pooling=false;Connect Timeout=2"; + +} diff --git a/unittests/SqlServerCaseSensitive/Database.cs b/unittests/SqlServerCaseSensitive/Database.cs index fa666238..b909852e 100644 --- a/unittests/SqlServerCaseSensitive/Database.cs +++ b/unittests/SqlServerCaseSensitive/Database.cs @@ -1,7 +1,8 @@ -using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] public class Database(IGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.GenericDatabase(testContext, testOutput); diff --git a/unittests/SqlServerCaseSensitive/DependencyInjection/ServiceCollectionTest.cs b/unittests/SqlServerCaseSensitive/DependencyInjection/ServiceCollectionTest.cs index e4aa062e..80deb40f 100644 --- a/unittests/SqlServerCaseSensitive/DependencyInjection/ServiceCollectionTest.cs +++ b/unittests/SqlServerCaseSensitive/DependencyInjection/ServiceCollectionTest.cs @@ -1,7 +1,8 @@ -using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.DependencyInjection; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] public class ServiceCollectionTest(IGrateTestContext context) : TestCommon.DependencyInjection.GrateServiceCollectionTest(context); diff --git a/unittests/SqlServerCaseSensitive/MigrationTables.cs b/unittests/SqlServerCaseSensitive/MigrationTables.cs index 8a9e7f0c..652c9dab 100644 --- a/unittests/SqlServerCaseSensitive/MigrationTables.cs +++ b/unittests/SqlServerCaseSensitive/MigrationTables.cs @@ -1,8 +1,9 @@ using TestCommon.Generic; using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; namespace SqlServerCaseSensitive; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] public class MigrationTables(IGrateTestContext testContext, ITestOutputHelper testOutput) : GenericMigrationTables(testContext, testOutput); diff --git a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Anytime_scripts.cs b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Anytime_scripts.cs index f16e2908..1b3d294f 100644 --- a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Anytime_scripts.cs +++ b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Anytime_scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming public class Anytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Anytime_scripts(testContext, testOutput); diff --git a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/DropDatabase.cs b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/DropDatabase.cs index 26880f65..851b65c7 100644 --- a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/DropDatabase.cs +++ b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/DropDatabase.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming public class DropDatabase(IGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.DropDatabase(testContext, testOutput); diff --git a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Environment_scripts.cs b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Environment_scripts.cs index 7f6e7bc6..a4718097 100644 --- a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Environment_scripts.cs +++ b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Environment_scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming public class Environment_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Environment_scripts(testContext, testOutput); diff --git a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Everytime_scripts.cs b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Everytime_scripts.cs index deba3abe..0e08c0c3 100644 --- a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Everytime_scripts.cs +++ b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Everytime_scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming public class Everytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Everytime_scripts(testContext, testOutput); diff --git a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Failing_Scripts.cs b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Failing_Scripts.cs index d997bfc2..cb940469 100644 --- a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Failing_Scripts.cs +++ b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Failing_Scripts.cs @@ -1,7 +1,8 @@ -using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming public class Failing_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Failing_Scripts(testContext, testOutput) diff --git a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/One_time_scripts.cs b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/One_time_scripts.cs index c8dba4b0..6d1cf92b 100644 --- a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/One_time_scripts.cs +++ b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/One_time_scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming public class One_time_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.One_time_scripts(testContext, testOutput); diff --git a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Order_Of_Scripts.cs b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Order_Of_Scripts.cs index e4909b4c..53d4f9a1 100644 --- a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Order_Of_Scripts.cs +++ b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Order_Of_Scripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming public class Order_Of_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Order_Of_Scripts(testContext, testOutput); diff --git a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/RestoreDatabase.cs b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/RestoreDatabase.cs index d06f7591..be0f9314 100644 --- a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/RestoreDatabase.cs +++ b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/RestoreDatabase.cs @@ -1,11 +1,12 @@ using Dapper; using FluentAssertions; using grate.Configuration; +using SqlServerCaseSensitive.TestInfrastructure; using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming public class RestoreDatabase(IGrateTestContext testContext, ITestOutputHelper testOutput) : SqlServerScriptsBase(testContext, testOutput) diff --git a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/ScriptsRun_Table.cs b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/ScriptsRun_Table.cs index fd7bcf3f..6bd0630e 100644 --- a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/ScriptsRun_Table.cs +++ b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/ScriptsRun_Table.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming public class ScriptsRun_Table(IGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.ScriptsRun_Table(testContext, testOutput); diff --git a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/TokenScripts.cs b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/TokenScripts.cs index 313094c9..a0e2f3ee 100644 --- a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/TokenScripts.cs +++ b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/TokenScripts.cs @@ -1,8 +1,9 @@ -using TestCommon.TestInfrastructure; +using SqlServerCaseSensitive.TestInfrastructure; +using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming public class TokenScripts(IGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.TokenScripts(testContext, testOutput); diff --git a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Versioning_The_Database.cs b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Versioning_The_Database.cs index 9ab85ff8..4ffa8265 100644 --- a/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Versioning_The_Database.cs +++ b/unittests/SqlServerCaseSensitive/Running_MigrationScripts/Versioning_The_Database.cs @@ -1,8 +1,9 @@ +using SqlServerCaseSensitive.TestInfrastructure; using TestCommon.TestInfrastructure; namespace SqlServerCaseSensitive.Running_MigrationScripts; -[Collection(nameof(SqlServerTestContainer))] +[Collection(nameof(SqlServerGrateTestContext))] // ReSharper disable once InconsistentNaming public class Versioning_The_Database(IGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Versioning_The_Database(testContext, testOutput); diff --git a/unittests/SqlServerCaseSensitive/Startup.cs b/unittests/SqlServerCaseSensitive/Startup.cs index 4c907358..a43db8c1 100644 --- a/unittests/SqlServerCaseSensitive/Startup.cs +++ b/unittests/SqlServerCaseSensitive/Startup.cs @@ -1,5 +1,6 @@ using grate.DependencyInjection; using grate.sqlserver.DependencyInjection; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; @@ -7,12 +8,16 @@ using SqlServerCaseSensitive.TestInfrastructure; using TestCommon.TestInfrastructure; -namespace SqlServerCaseSensitive; +namespace SqlServer; // ReSharper disable once UnusedType.Global public class Startup { - + public void ConfigureHost(IHostBuilder hostBuilder) => + hostBuilder + .ConfigureHostConfiguration(builder => builder.AddEnvironmentVariables() ) + .ConfigureAppConfiguration((context, builder) => { }); + // ReSharper disable once UnusedMember.Global public void ConfigureServices(IServiceCollection services, HostBuilderContext context) { @@ -22,13 +27,21 @@ public void ConfigureServices(IServiceCollection services, HostBuilderContext co .AddConsole() .SetMinimumLevel(TestConfig.GetLogLevel()) ); - + services .AddGrate() .UseSqlServer(); - services.TryAddSingleton(); - services.TryAddTransient(); + var adminConnectionString = context.Configuration["GrateTest_AdminConnectionString"]; + if (adminConnectionString != null) + { + services.TryAddSingleton(new SqlServerExternalDatabase(adminConnectionString)); + } + else + { + services.TryAddSingleton(); + } + services.TryAddTransient(); } diff --git a/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerExternalDatabase.cs b/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerExternalDatabase.cs new file mode 100644 index 00000000..2dddcaa4 --- /dev/null +++ b/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerExternalDatabase.cs @@ -0,0 +1,32 @@ +using Microsoft.Data.SqlClient; +using TestCommon.TestInfrastructure; + +namespace SqlServerCaseSensitive.TestInfrastructure; + +public class SqlServerExternalDatabase(string adminConnectionString) : ITestDatabase +{ + public string AdminConnectionString { get; } = adminConnectionString; + + public string ConnectionString(string database) + { + var builder = new SqlConnectionStringBuilder(AdminConnectionString) + { + InitialCatalog = database, + ConnectTimeout = 2 + }; + return builder.ConnectionString; + } + + public string UserConnectionString(string database) + { + var builder = new SqlConnectionStringBuilder(AdminConnectionString) + { + InitialCatalog = database, + UserID = "zorro", + Password = "batmanZZ4", + ConnectTimeout = 2 + }; + return builder.ConnectionString; + } + +} diff --git a/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerGrateTestContext.cs b/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerGrateTestContext.cs index c0891cde..a2a9b630 100644 --- a/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerGrateTestContext.cs +++ b/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerGrateTestContext.cs @@ -9,15 +9,18 @@ namespace SqlServerCaseSensitive.TestInfrastructure; -class SqlServerGrateTestContext : IGrateTestContext +[CollectionDefinition(nameof(SqlServerGrateTestContext))] +public class SqlServerTestCollection : ICollectionFixture; + +public class SqlServerGrateTestContext : IGrateTestContext { public IGrateMigrator Migrator { get; } - private readonly SqlServerTestContainer _testContainer; + private readonly SqlServerTestContainerDatabase _testContainer; public SqlServerGrateTestContext( IGrateMigrator migrator, string serverCollation, - SqlServerTestContainer container) + SqlServerTestContainerDatabase container) { Migrator = migrator; _testContainer = container; @@ -26,7 +29,7 @@ public SqlServerGrateTestContext( } public SqlServerGrateTestContext( IGrateMigrator migrator, - SqlServerTestContainer container) : this(migrator, "Danish_Norwegian_CI_AS", container) + SqlServerTestContainerDatabase container) : this(migrator, "Danish_Norwegian_CI_AS", container) { } public string AdminPassword => _testContainer.AdminPassword; diff --git a/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerTestContainer.cs b/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerTestContainer.cs deleted file mode 100644 index 60e515f9..00000000 --- a/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerTestContainer.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.Extensions.Logging; -using Testcontainers.MsSql; - -namespace TestCommon.TestInfrastructure; -public class SqlServerTestContainer : ContainerFixture -{ - // Run with linux/amd86 on ARM architectures too, the docker emulation is good enough - public override string DockerImage => "mcr.microsoft.com/mssql/server:2019-latest"; - public override int Port => 1433; - public SqlServerTestContainer(ILogger logger) : base(logger) - { - } - - protected override MsSqlContainer InitializeTestContainer() - { - return new MsSqlBuilder() - .WithImage(DockerImage) - .WithPassword(AdminPassword) - .WithPortBinding(Port, true) - .WithEnvironment("MSSQL_COLLATION", "Latin1_General_CS_AS") //CS == Case Sensitive - .Build(); - } - -} - -[CollectionDefinition(nameof(SqlServerTestContainer))] -public class SqlServerCITestCollection : ICollectionFixture -{ -} diff --git a/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerTestContainerDatabase.cs b/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerTestContainerDatabase.cs new file mode 100644 index 00000000..55a1eacd --- /dev/null +++ b/unittests/SqlServerCaseSensitive/TestInfrastructure/SqlServerTestContainerDatabase.cs @@ -0,0 +1,36 @@ +using Microsoft.Extensions.Logging; +using TestCommon.TestInfrastructure; +using Testcontainers.MsSql; + +namespace SqlServerCaseSensitive.TestInfrastructure; +public class SqlServerTestContainerDatabase : TestContainerDatabase +{ + // Run with linux/amd86 on ARM architectures too, the docker emulation is good enough + public override string DockerImage => "mcr.microsoft.com/mssql/server:2019-latest"; + protected override int InternalPort => 1433; + + public SqlServerTestContainerDatabase(ILogger logger) : base(logger) + { + } + + protected override MsSqlContainer InitializeTestContainer() + { + return new MsSqlBuilder() + .WithImage(DockerImage) + .WithEnvironment("DOCKER_DEFAULT_PLATFORM", "linux/amd64") + .WithPassword(AdminPassword) + .WithPortBinding(InternalPort, true) + .WithEnvironment("MSSQL_COLLATION", "Danish_Norwegian_CI_AS") + .Build(); + } + + public override string AdminConnectionString => + $"Data Source=localhost,{Port};Initial Catalog=master;User Id=sa;Password={AdminPassword};Encrypt=false;Pooling=false"; + + public override string ConnectionString(string database) => + $"Data Source=localhost,{Port};Initial Catalog={database};User Id=sa;Password={AdminPassword};Encrypt=false;Pooling=false;Connect Timeout=2"; + + public override string UserConnectionString(string database) => + $"Data Source=localhost,{Port};Initial Catalog={database};User Id=zorro;Password=batmanZZ4;Encrypt=false;Pooling=false;Connect Timeout=2"; + +} diff --git a/unittests/Sqlite/Database.cs b/unittests/Sqlite/Database.cs index cddd1fc9..63653cbe 100644 --- a/unittests/Sqlite/Database.cs +++ b/unittests/Sqlite/Database.cs @@ -4,10 +4,10 @@ namespace Sqlite; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class Database(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Database(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.GenericDatabase(testContext, testOutput) { diff --git a/unittests/Sqlite/DependencyInjection/ServiceCollectionTest.cs b/unittests/Sqlite/DependencyInjection/ServiceCollectionTest.cs index ceee1739..acff87ff 100644 --- a/unittests/Sqlite/DependencyInjection/ServiceCollectionTest.cs +++ b/unittests/Sqlite/DependencyInjection/ServiceCollectionTest.cs @@ -1,9 +1,10 @@ using grate.Infrastructure; using grate.Sqlite.Migration; +using Sqlite.TestInfrastructure; using TestCommon.TestInfrastructure; namespace Sqlite.DependencyInjection; -public class ServiceCollectionTest(IGrateTestContext context) : TestCommon.DependencyInjection.GrateServiceCollectionTest(context) +public class ServiceCollectionTest(SqliteGrateTestContext context) : TestCommon.DependencyInjection.GrateServiceCollectionTest(context) { protected virtual Type DatabaseType => typeof(SqliteDatabase); protected virtual ISyntax Syntax => SqliteDatabase.Syntax; diff --git a/unittests/Sqlite/MigrationTables.cs b/unittests/Sqlite/MigrationTables.cs index 96648528..ded0ccaf 100644 --- a/unittests/Sqlite/MigrationTables.cs +++ b/unittests/Sqlite/MigrationTables.cs @@ -3,10 +3,10 @@ namespace Sqlite; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class MigrationTables(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class MigrationTables(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.GenericMigrationTables(testContext, testOutput) { diff --git a/unittests/Sqlite/Running_MigrationScripts/Anytime_scripts.cs b/unittests/Sqlite/Running_MigrationScripts/Anytime_scripts.cs index b962c052..047cc9e6 100644 --- a/unittests/Sqlite/Running_MigrationScripts/Anytime_scripts.cs +++ b/unittests/Sqlite/Running_MigrationScripts/Anytime_scripts.cs @@ -4,8 +4,8 @@ namespace Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class Anytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Anytime_scripts(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Anytime_scripts(testContext, testOutput); diff --git a/unittests/Sqlite/Running_MigrationScripts/DropDatabase.cs b/unittests/Sqlite/Running_MigrationScripts/DropDatabase.cs index 7fbec40b..4b26114e 100644 --- a/unittests/Sqlite/Running_MigrationScripts/DropDatabase.cs +++ b/unittests/Sqlite/Running_MigrationScripts/DropDatabase.cs @@ -3,8 +3,8 @@ namespace Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class DropDatabase(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class DropDatabase(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.DropDatabase(testContext, testOutput); diff --git a/unittests/Sqlite/Running_MigrationScripts/Environment_scripts.cs b/unittests/Sqlite/Running_MigrationScripts/Environment_scripts.cs index 8dea672d..973d0cc4 100644 --- a/unittests/Sqlite/Running_MigrationScripts/Environment_scripts.cs +++ b/unittests/Sqlite/Running_MigrationScripts/Environment_scripts.cs @@ -3,9 +3,9 @@ namespace Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class Environment_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Environment_scripts(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Environment_scripts(testContext, testOutput); diff --git a/unittests/Sqlite/Running_MigrationScripts/Everytime_scripts.cs b/unittests/Sqlite/Running_MigrationScripts/Everytime_scripts.cs index 4645c28c..adb67d2a 100644 --- a/unittests/Sqlite/Running_MigrationScripts/Everytime_scripts.cs +++ b/unittests/Sqlite/Running_MigrationScripts/Everytime_scripts.cs @@ -3,8 +3,8 @@ namespace Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class Everytime_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Everytime_scripts(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Everytime_scripts(testContext, testOutput); diff --git a/unittests/Sqlite/Running_MigrationScripts/Failing_Scripts.cs b/unittests/Sqlite/Running_MigrationScripts/Failing_Scripts.cs index cc2b3ff0..b65d6c94 100644 --- a/unittests/Sqlite/Running_MigrationScripts/Failing_Scripts.cs +++ b/unittests/Sqlite/Running_MigrationScripts/Failing_Scripts.cs @@ -3,10 +3,10 @@ namespace Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class Failing_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Failing_Scripts(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Failing_Scripts(testContext, testOutput) { protected override string ExpectedErrorMessageForInvalidSql => diff --git a/unittests/Sqlite/Running_MigrationScripts/One_time_scripts.cs b/unittests/Sqlite/Running_MigrationScripts/One_time_scripts.cs index fb6ea18f..c8970ae6 100644 --- a/unittests/Sqlite/Running_MigrationScripts/One_time_scripts.cs +++ b/unittests/Sqlite/Running_MigrationScripts/One_time_scripts.cs @@ -3,8 +3,8 @@ namespace Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class One_time_scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class One_time_scripts(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.One_time_scripts(testContext, testOutput); diff --git a/unittests/Sqlite/Running_MigrationScripts/Order_Of_Scripts.cs b/unittests/Sqlite/Running_MigrationScripts/Order_Of_Scripts.cs index 67b4ad39..ff234fe8 100644 --- a/unittests/Sqlite/Running_MigrationScripts/Order_Of_Scripts.cs +++ b/unittests/Sqlite/Running_MigrationScripts/Order_Of_Scripts.cs @@ -3,8 +3,8 @@ namespace Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class Order_Of_Scripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Order_Of_Scripts(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Order_Of_Scripts(testContext, testOutput); diff --git a/unittests/Sqlite/Running_MigrationScripts/ScriptsRun_Table.cs b/unittests/Sqlite/Running_MigrationScripts/ScriptsRun_Table.cs index 770cbeab..11a266d6 100644 --- a/unittests/Sqlite/Running_MigrationScripts/ScriptsRun_Table.cs +++ b/unittests/Sqlite/Running_MigrationScripts/ScriptsRun_Table.cs @@ -3,9 +3,9 @@ namespace Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class ScriptsRun_Table(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class ScriptsRun_Table(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.ScriptsRun_Table(testContext, testOutput); diff --git a/unittests/Sqlite/Running_MigrationScripts/TokenScripts.cs b/unittests/Sqlite/Running_MigrationScripts/TokenScripts.cs index 0e171071..c391ecc1 100644 --- a/unittests/Sqlite/Running_MigrationScripts/TokenScripts.cs +++ b/unittests/Sqlite/Running_MigrationScripts/TokenScripts.cs @@ -3,9 +3,9 @@ namespace Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class TokenScripts(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class TokenScripts(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.TokenScripts(testContext, testOutput); diff --git a/unittests/Sqlite/Running_MigrationScripts/Versioning_The_Database.cs b/unittests/Sqlite/Running_MigrationScripts/Versioning_The_Database.cs index 597a1e03..a22275e8 100644 --- a/unittests/Sqlite/Running_MigrationScripts/Versioning_The_Database.cs +++ b/unittests/Sqlite/Running_MigrationScripts/Versioning_The_Database.cs @@ -4,9 +4,9 @@ namespace Sqlite.Running_MigrationScripts; -[Collection(nameof(SqliteTestContainer))] +[Collection(nameof(SqliteTestDatabase))] // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global -public class Versioning_The_Database(IGrateTestContext testContext, ITestOutputHelper testOutput) +public class Versioning_The_Database(SqliteGrateTestContext testContext, ITestOutputHelper testOutput) : TestCommon.Generic.Running_MigrationScripts.Versioning_The_Database(testContext, testOutput); diff --git a/unittests/Sqlite/Startup.cs b/unittests/Sqlite/Startup.cs index 3b18cec0..c35676f5 100644 --- a/unittests/Sqlite/Startup.cs +++ b/unittests/Sqlite/Startup.cs @@ -1,39 +1,19 @@ -using grate.Configuration; using grate.DependencyInjection; -using grate.Infrastructure; -using grate.Migration; using grate.sqlite.DependencyInjection; -using grate.Sqlite.Infrastructure; -using grate.Sqlite.Migration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; using Sqlite.TestInfrastructure; using TestCommon.TestInfrastructure; namespace Sqlite; // ReSharper disable once UnusedType.Global -public class Startup +public class Startup: TestCommon.Startup { - - // ReSharper disable once UnusedMember.Global - public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + protected override void ConfigureExtraServices(IServiceCollection services, HostBuilderContext context) { - services.AddLogging( - lb => lb - .AddXUnit() - .AddConsole() - .SetMinimumLevel(TestConfig.GetLogLevel()) - ); - services .AddGrate() .UseSqlite(); - - services.TryAddSingleton(); - services.TryAddTransient(); } - } diff --git a/unittests/Sqlite/TestInfrastructure/SqliteExternalDatabase.cs b/unittests/Sqlite/TestInfrastructure/SqliteExternalDatabase.cs new file mode 100644 index 00000000..ab0d41a6 --- /dev/null +++ b/unittests/Sqlite/TestInfrastructure/SqliteExternalDatabase.cs @@ -0,0 +1,84 @@ +// using Microsoft.Data.Sqlite; +// using Xunit.Sdk; +// namespace TestCommon.TestInfrastructure; +// public class SqliteExternalDatabase(GrateTestConfig grateTestConfig) : ITestDatabase +// { +// public string AdminConnectionString { get; } = grateTestConfig.AdminConnectionString ?? throw new ArgumentNullException(nameof(grateTestConfig)); +// +// public string ConnectionString(string database) +// { +// var builder = new SqliteConnectionStringBuilder(AdminConnectionString) +// { +// DataSource = $"{database}.db", +// DefaultTimeout = 2 +// }; +// return builder.ConnectionString; +// } +// +// public string UserConnectionString(string database) +// { +// var builder = new SqliteConnectionStringBuilder(AdminConnectionString) +// { +// DataSource = $"{database}.db", +// DefaultTimeout = 2 +// }; +// return builder.ConnectionString; +// } +// +// private readonly IMessageSink _messageSink; +// +// public SqliteExternalDatabase(IMessageSink messageSink) +// { +// _messageSink = messageSink; +// } +// public Task DisposeAsync() +// { +// SqliteConnection.ClearAllPools(); +// +// var currentDirectory = Directory.GetCurrentDirectory(); +// var dbFiles = Directory.GetFiles(currentDirectory, "*.db"); +// var message = new DiagnosticMessage("After tests. Deleting DB files."); +// _messageSink.OnMessage(message); +// foreach (var dbFile in dbFiles) +// { +// var deleteMessage = new DiagnosticMessage("File: {0}", dbFile); +// _messageSink.OnMessage(deleteMessage); +// File.Delete(dbFile); +// } +// return Task.CompletedTask; +// } +// +// public Task InitializeAsync() +// { +// var currentDirectory = Directory.GetCurrentDirectory(); +// var dbFiles = Directory.GetFiles(currentDirectory, "*.db"); +// var message = new DiagnosticMessage("Before tests. Deleting old DB files."); +// _messageSink.OnMessage(message); +// foreach (var dbFile in dbFiles) +// { +// TryDeletingFile(dbFile); +// } +// return Task.CompletedTask; +// } +// private void TryDeletingFile(string dbFile) +// { +// var i = 0; +// var sleepTime = 300; +// const int maxTries = 5; +// while (i++ < maxTries) +// { +// try +// { +// var message = new DiagnosticMessage("File: {0}", dbFile); +// _messageSink.OnMessage(message); +// File.Delete(dbFile); +// return; +// } +// catch (IOException) when (i <= maxTries) +// { +// Thread.Sleep(sleepTime); +// } +// } +// } +// +// } diff --git a/unittests/Sqlite/TestInfrastructure/SqliteGrateTestContext.cs b/unittests/Sqlite/TestInfrastructure/SqliteGrateTestContext.cs index 4287fa73..f1302763 100644 --- a/unittests/Sqlite/TestInfrastructure/SqliteGrateTestContext.cs +++ b/unittests/Sqlite/TestInfrastructure/SqliteGrateTestContext.cs @@ -9,18 +9,19 @@ namespace Sqlite.TestInfrastructure; + +[CollectionDefinition(nameof(SqliteGrateTestContext))] +public class SqliteTestCollection : ICollectionFixture; + public class SqliteGrateTestContext : IGrateTestContext { public SqliteGrateTestContext( IGrateMigrator migrator, - SqliteTestContainer _) + ITestDatabase _) { Migrator = migrator; } - public string AdminPassword { get; set; } = default!; - public int? Port { get; set; } - public string AdminConnectionString => $"Data Source=grate-sqlite.db"; public string ConnectionString(string database) => $"Data Source={database}.db"; public string UserConnectionString(string database) => $"Data Source={database}.db"; diff --git a/unittests/Sqlite/TestInfrastructure/SqliteTestContainer.cs b/unittests/Sqlite/TestInfrastructure/SqliteTestDatabase.cs similarity index 74% rename from unittests/Sqlite/TestInfrastructure/SqliteTestContainer.cs rename to unittests/Sqlite/TestInfrastructure/SqliteTestDatabase.cs index 11033fbc..b6f9ead8 100644 --- a/unittests/Sqlite/TestInfrastructure/SqliteTestContainer.cs +++ b/unittests/Sqlite/TestInfrastructure/SqliteTestDatabase.cs @@ -3,14 +3,8 @@ using Microsoft.Data.Sqlite; using Xunit.Sdk; namespace TestCommon.TestInfrastructure; -public class SqliteTestContainer : IAsyncLifetime +public class SqliteTestDatabase(IMessageSink messageSink) : ITestDatabase { - private readonly IMessageSink _messageSink; - - public SqliteTestContainer(IMessageSink messageSink) - { - _messageSink = messageSink; - } public Task DisposeAsync() { SqliteConnection.ClearAllPools(); @@ -18,11 +12,11 @@ public Task DisposeAsync() var currentDirectory = Directory.GetCurrentDirectory(); var dbFiles = Directory.GetFiles(currentDirectory, "*.db"); var message = new DiagnosticMessage("After tests. Deleting DB files."); - _messageSink.OnMessage(message); + messageSink.OnMessage(message); foreach (var dbFile in dbFiles) { var deleteMessage = new DiagnosticMessage("File: {0}", dbFile); - _messageSink.OnMessage(deleteMessage); + messageSink.OnMessage(deleteMessage); File.Delete(dbFile); } return Task.CompletedTask; @@ -33,7 +27,7 @@ public Task InitializeAsync() var currentDirectory = Directory.GetCurrentDirectory(); var dbFiles = Directory.GetFiles(currentDirectory, "*.db"); var message = new DiagnosticMessage("Before tests. Deleting old DB files."); - _messageSink.OnMessage(message); + messageSink.OnMessage(message); foreach (var dbFile in dbFiles) { TryDeletingFile(dbFile); @@ -50,7 +44,7 @@ private void TryDeletingFile(string dbFile) try { var message = new DiagnosticMessage("File: {0}", dbFile); - _messageSink.OnMessage(message); + messageSink.OnMessage(message); File.Delete(dbFile); return; } @@ -60,10 +54,8 @@ private void TryDeletingFile(string dbFile) } } } - -} - -[CollectionDefinition(nameof(SqliteTestContainer))] -public class SqliteTestCollection : ICollectionFixture -{ + + public string AdminConnectionString => $"Data Source=grate-sqlite.db"; + public string ConnectionString(string database) => $"Data Source={database}.db"; + public string UserConnectionString(string database) => $"Data Source={database}.db"; } diff --git a/unittests/TestCommon/Generic/Running_MigrationScripts/MigrationsScriptsBase.cs b/unittests/TestCommon/Generic/Running_MigrationScripts/MigrationsScriptsBase.cs index 4ff1d40e..5ab9c70a 100644 --- a/unittests/TestCommon/Generic/Running_MigrationScripts/MigrationsScriptsBase.cs +++ b/unittests/TestCommon/Generic/Running_MigrationScripts/MigrationsScriptsBase.cs @@ -7,7 +7,6 @@ namespace TestCommon.Generic.Running_MigrationScripts; public abstract class MigrationsScriptsBase(IGrateTestContext context, ITestOutputHelper testOutput) { - public static DirectoryInfo CreateRandomTempDirectory() => TestConfig.CreateRandomTempDirectory(); protected void CreateDummySql(DirectoryInfo root, MigrationsFolder? folder, string filename = "1_jalla.sql") diff --git a/unittests/TestCommon/Startup.cs b/unittests/TestCommon/Startup.cs new file mode 100644 index 00000000..6a65c659 --- /dev/null +++ b/unittests/TestCommon/Startup.cs @@ -0,0 +1,58 @@ +using grate.Configuration; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using TestCommon.TestInfrastructure; + +namespace TestCommon; + +// ReSharper disable once UnusedType.Global +public abstract class Startup +{ + public void ConfigureHost(IHostBuilder hostBuilder) => + hostBuilder + .ConfigureHostConfiguration(builder => builder.AddEnvironmentVariables() ) + .ConfigureAppConfiguration((context, builder) => { }); + + // ReSharper disable once UnusedMember.Global + public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + { + services.AddLogging( + lb => lb + .AddXUnit() + .AddConsole() + .SetMinimumLevel(TestConfig.GetLogLevel()) + ); + + + ConfigureExtraServices(services, context); + + services.TryAddSingleton(TestContextType); + RegisterTestDatabase(services, context.Configuration); + } + + protected abstract Type TestContainerDatabaseType { get; } + protected abstract Type ExternalTestDatabaseType { get; } + protected abstract Type TestContextType { get; } + + protected void RegisterTestDatabase(IServiceCollection services, IConfiguration configuration) + { + var testConfig = new GrateTestConfig(); + configuration.Bind("GrateTestConfig", testConfig); + + if (testConfig.AdminConnectionString != null) + { + services.TryAddSingleton(testConfig); + services.TryAddSingleton(typeof(ITestDatabase), ExternalTestDatabaseType); + } + else + { + services.TryAddSingleton(typeof(ITestDatabase), TestContainerDatabaseType); + } + } + + protected virtual void ConfigureExtraServices(IServiceCollection services, HostBuilderContext context) { } + +} diff --git a/unittests/TestCommon/Startup_T.cs b/unittests/TestCommon/Startup_T.cs new file mode 100644 index 00000000..dc3aac2e --- /dev/null +++ b/unittests/TestCommon/Startup_T.cs @@ -0,0 +1,16 @@ +using TestCommon.TestInfrastructure; + +namespace TestCommon; + +public abstract class Startup< + TTestContainerDatabase, + TExternalDatabase, + TGrateTestContext>: Startup + where TTestContainerDatabase : ITestDatabase + where TExternalDatabase : ITestDatabase + where TGrateTestContext : IGrateTestContext +{ + protected override Type TestContainerDatabaseType => typeof(TTestContainerDatabase); + protected override Type ExternalTestDatabaseType => typeof(TExternalDatabase); + protected override Type TestContextType => typeof(TGrateTestContext); +} diff --git a/unittests/TestCommon/TestCommon.csproj b/unittests/TestCommon/TestCommon.csproj index 5c531879..4b481bbd 100644 --- a/unittests/TestCommon/TestCommon.csproj +++ b/unittests/TestCommon/TestCommon.csproj @@ -11,11 +11,19 @@ - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + diff --git a/unittests/TestCommon/TestInfrastructure/GrateTestConfig.cs b/unittests/TestCommon/TestInfrastructure/GrateTestConfig.cs new file mode 100644 index 00000000..ee61ecd8 --- /dev/null +++ b/unittests/TestCommon/TestInfrastructure/GrateTestConfig.cs @@ -0,0 +1,6 @@ +namespace TestCommon.TestInfrastructure; + +public class GrateTestConfig +{ + public string? AdminConnectionString { get; set; } = null!; +} diff --git a/unittests/TestCommon/TestInfrastructure/GrateTestContext.cs b/unittests/TestCommon/TestInfrastructure/GrateTestContext.cs new file mode 100644 index 00000000..90ad9cbd --- /dev/null +++ b/unittests/TestCommon/TestInfrastructure/GrateTestContext.cs @@ -0,0 +1,42 @@ +using System.Data; +using grate.Infrastructure; +using grate.Migration; + +namespace TestCommon.TestInfrastructure; + +public abstract class GrateTestContext(ITestDatabase testDatabase) : IGrateTestContext, IAsyncLifetime +{ + protected ITestDatabase TestDatabase { get; } = testDatabase; + + public string AdminConnectionString => TestDatabase.AdminConnectionString; + public string ConnectionString(string database) => TestDatabase.ConnectionString(database); + public string UserConnectionString(string database) => TestDatabase.UserConnectionString(database); + + public async Task InitializeAsync() + { + if (TestDatabase is IAsyncLifetime asyncLifetime) + { + await asyncLifetime.InitializeAsync(); + } + } + + public async Task DisposeAsync() + { + if (TestDatabase is IAsyncLifetime asyncLifetime) + { + await asyncLifetime.DisposeAsync(); + } + } + + public abstract ISyntax Syntax { get; } + public abstract Type DbExceptionType { get; } + public abstract Type DatabaseType { get; } + public abstract bool SupportsTransaction { get; } + public abstract SqlStatements Sql { get; } + public abstract string ExpectedVersionPrefix { get; } + public abstract IGrateMigrator Migrator { get; } + public abstract bool SupportsCreateDatabase { get; } + public abstract bool SupportsSchemas { get; } + public abstract IDbConnection GetDbConnection(string connectionString); + +} diff --git a/unittests/TestCommon/TestInfrastructure/ITestDatabase.cs b/unittests/TestCommon/TestInfrastructure/ITestDatabase.cs new file mode 100644 index 00000000..59bc76b8 --- /dev/null +++ b/unittests/TestCommon/TestInfrastructure/ITestDatabase.cs @@ -0,0 +1,8 @@ +namespace TestCommon.TestInfrastructure; + +public interface ITestDatabase +{ + string AdminConnectionString { get; } + string ConnectionString(string database); + string UserConnectionString(string database); +} diff --git a/unittests/TestCommon/TestInfrastructure/ContainerFixture.cs b/unittests/TestCommon/TestInfrastructure/TestContainerDatabase.cs similarity index 69% rename from unittests/TestCommon/TestInfrastructure/ContainerFixture.cs rename to unittests/TestCommon/TestInfrastructure/TestContainerDatabase.cs index d46edd94..b191a2bd 100644 --- a/unittests/TestCommon/TestInfrastructure/ContainerFixture.cs +++ b/unittests/TestCommon/TestInfrastructure/TestContainerDatabase.cs @@ -3,20 +3,22 @@ using Microsoft.Extensions.Logging; namespace TestCommon.TestInfrastructure; -public abstract class ContainerFixture : IAsyncLifetime +public abstract class TestContainerDatabase : ITestDatabase, IAsyncLifetime { public abstract string DockerImage { get; } - public abstract int Port { get; } private readonly Random _random = new(); + + public string AdminPassword { get; } + public int Port => TestContainer.GetMappedPublicPort(InternalPort); + protected abstract int InternalPort { get; } + private const string LowerCase = "abcdefghijklmnopqrstuvwxyz"; private const string UpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private const string Digits = "1234567890"; - public string AdminPassword { get; private set; } - - protected ContainerFixture(ILogger logger) + protected TestContainerDatabase(ILogger logger) { AdminPassword = _random.GetString(10, UpperCase) + _random.GetString(10, LowerCase) + @@ -28,6 +30,7 @@ protected ContainerFixture(ILogger logger) } public IContainer TestContainer { get; } + public abstract string AdminConnectionString { get; } public async Task DisposeAsync() { @@ -40,4 +43,6 @@ public async Task InitializeAsync() } protected abstract IContainer InitializeTestContainer(); + public abstract string ConnectionString(string database); + public abstract string UserConnectionString(string database); } diff --git a/unittests/TestCommon/TestInfrastructure/TestDatabaseFixture.cs b/unittests/TestCommon/TestInfrastructure/TestDatabaseFixture.cs new file mode 100644 index 00000000..2430fad1 --- /dev/null +++ b/unittests/TestCommon/TestInfrastructure/TestDatabaseFixture.cs @@ -0,0 +1,22 @@ +namespace TestCommon.TestInfrastructure; + +public class TestDatabaseFixture(ITestDatabase testDatabase) : IAsyncLifetime +{ + public ITestDatabase TestDatabase { get; } = testDatabase; + + public async Task InitializeAsync() + { + if (TestDatabase is IAsyncLifetime asyncLifetime) + { + await asyncLifetime.InitializeAsync(); + } + } + + public async Task DisposeAsync() + { + if (TestDatabase is IAsyncLifetime asyncLifetime) + { + await asyncLifetime.DisposeAsync(); + } + } +}