From ab6f90aa78b5ff5b4643f9b3ac97ae4ff6b0b589 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Fri, 1 Jan 2021 17:04:38 +0100 Subject: [PATCH] nix: Add postgrest-with-* tools to run with temporary databases of different versions --- .circleci/config.yml | 16 +++---- nix/README.md | 44 ++++++++++------- nix/devtools.nix | 2 +- nix/tests.nix | 110 +++++++++++++++++++++++++------------------ shell.nix | 7 +++ 5 files changed, 107 insertions(+), 72 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 69832948f..7454c6c43 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -200,30 +200,26 @@ jobs: when: on_fail - run: name: Run the spec tests against PostgreSQL 9.5 - command: postgrest-test-spec-postgresql-9.5 + command: postgrest-with-postgresql-9.5 postgrest-test-spec when: always - run: name: Run the spec tests against PostgreSQL 9.6 - command: postgrest-test-spec-postgresql-9.6 + command: postgrest-with-postgresql-9.6 postgrest-test-spec when: always - run: name: Run the spec tests against PostgreSQL 10 - command: postgrest-test-spec-postgresql-10 + command: postgrest-with-postgresql-10 postgrest-test-spec when: always - run: name: Run the spec tests against PostgreSQL 11 - command: postgrest-test-spec-postgresql-11 + command: postgrest-with-postgresql-11 postgrest-test-spec when: always - run: name: Run the spec tests against PostgreSQL 12 - command: postgrest-test-spec-postgresql-12 + command: postgrest-with-postgresql-12 postgrest-test-spec when: always - run: - name: Run the spec tests against PostgreSQL 13 - command: postgrest-test-spec-postgresql-13 - when: always - - run: - name: Check the spec tests for idempotence + name: Check the spec tests for idempotence against PostgreSQL 13 command: postgrest-test-spec-idempotence when: always - run: diff --git a/nix/README.md b/nix/README.md index 5da08b9d7..5399565ac 100644 --- a/nix/README.md +++ b/nix/README.md @@ -73,12 +73,15 @@ The PostgREST utilities available in `nix-shell` all have names that begin with ```bash # Note: The utilities listed here might not be up to date. [nix-shell]$ postgrest- -postgrest-lint postgrest-test-spec-postgresql-11 -postgrest-style postgrest-test-spec-postgresql-12 -postgrest-style-check postgrest-test-spec-postgresql-13 -postgrest-test-spec postgrest-test-spec-postgresql-9.5 -postgrest-test-spec-all postgrest-test-spec-postgresql-9.6 -postgrest-test-spec-postgresql-10 +postgrest-build postgrest-test-spec +postgrest-check postgrest-watch +postgrest-clean postgrest-with-all +postgrest-coverage postgrest-with-postgresql-10 +postgrest-lint postgrest-with-postgresql-11 +postgrest-run postgrest-with-postgresql-12 +postgrest-style postgrest-with-postgresql-13 +postgrest-style-check postgrest-with-postgresql-9.5 +postgrest-test-io postgrest-with-postgresql-9.6 ... [nix-shell]$ @@ -94,12 +97,16 @@ is not used. You can activate those by passing a flag to `nix-shell` with ```bash $ nix-shell --arg memoryTests true [nix-shell]$ postgrest- -postgrest-lint postgrest-test-spec-postgresql-10 -postgrest-style postgrest-test-spec-postgresql-11 -postgrest-style-check postgrest-test-spec-postgresql-12 -postgrest-test-memory postgrest-test-spec-postgresql-13 -postgrest-test-spec postgrest-test-spec-postgresql-9.5 -postgrest-test-spec-all postgrest-test-spec-postgresql-9.6 +postgrest-build postgrest-test-spec +postgrest-check postgrest-watch +postgrest-clean postgrest-with-all +postgrest-coverage postgrest-with-postgresql-10 +postgrest-lint postgrest-with-postgresql-11 +postgrest-run postgrest-with-postgresql-12 +postgrest-style postgrest-with-postgresql-13 +postgrest-style-check postgrest-with-postgresql-9.5 +postgrest-test-io postgrest-with-postgresql-9.6 +postgrest-test-memory ... ``` @@ -156,11 +163,11 @@ temporary test databases: $ nix-shell --run postgrest-test-spec # Run the tests against all supported versions of PostgreSQL: -$ nix-shell --run postgrest-test-spec-all +$ nix-shell --run "postgrest-with-all postgrest-test-spec" # Run the tests against a specific version of PostgreSQL (use tab-completion in # nix-shell to see all available versions): -$ nix-shell --run postgrest-test-spec-postgresql-13 +$ nix-shell --run "postgrest-with-postgresql-13 postgrest-test-spec" ``` @@ -202,9 +209,14 @@ Tools like `postgrest-build`, `postgrest-run` etc. are simple wrappers around also run in CI, with the exception of the IO and Memory checks that need to be run separately. +`postgrest-with-postgresql-*` take a command as an argument and will run it +with a temporary database. `postgrest-with-all` will run the command against +all supported PostgreSQL versions. Tests run without `postgrest-with-*` are +run against the latest PostgreSQL version by default. + `postgrest-watch` takes a command as an argument that it will re-run if any source -file is changed. For example, `postgrest-watch postgrest-test-spec-all` will re-run -the full spec test suite against all PostgreSQL versions on every change. +file is changed. For example, `postgrest-watch postgrest-with-all postgrest-test-spec` +will re-run the full spec test suite against all PostgreSQL versions on every change. ## Tour diff --git a/nix/devtools.nix b/nix/devtools.nix index 55aa773c3..f272bfb24 100644 --- a/nix/devtools.nix +++ b/nix/devtools.nix @@ -90,7 +90,7 @@ let inRootDir = true; } '' - ${tests}/bin/postgrest-test-spec-all + ${tests}/bin/postgrest-with-all ${tests}/bin/postgrest-test-spec ${tests}/bin/postgrest-test-spec-idempotence ${tests}/bin/postgrest-test-io ${style}/bin/postgrest-lint diff --git a/nix/tests.nix b/nix/tests.nix index a52078c94..078b29459 100644 --- a/nix/tests.nix +++ b/nix/tests.nix @@ -30,42 +30,84 @@ let inRootDir = true; } '' - export PATH=${postgresql}/bin:"$PATH" + # avoid starting multiple layers of with_tmp_db + if test ! -v PGRST_DB_URI; then + export PATH=${postgresql}/bin:"$PATH" - exec test/with_tmp_db "$@" + exec test/with_tmp_db "$@" + else + "$@" + fi ''; - # Script to run the Haskell test suite against a specific version of - # PostgreSQL. + # Create a `withPostgresql` for each PostgreSQL version that we want to test + # against. + withPostgresqlVersions = + builtins.map + ({ name, postgresql }: + (checkedShellScript + { + name = "postgrest-with-${name}"; + docs = "Run the given command in a temporary database with ${name}"; + inRootDir = false; + } + '' + ${withTmpDb postgresql} "$@" + '' + ).bin + ) + postgresqlVersions; + + # Helper script for running a command against all PostgreSQL versions. + withAllVersions = + name: + let + runners = + builtins.map + ({ name, postgresql }: + '' + cat << EOF + + Running against ${name}... + + EOF + + trap 'echo "Failed on ${name}"' exit + + ${withTmpDb postgresql} "$@" + + trap "" exit + + cat << EOF + + Done running against ${name}. + + EOF + '') + postgresqlVersions; + in + checkedShellScript + { + inherit name; + docs = "Run command against all supported PostgreSQL versions."; + inRootDir = true; + } + (lib.concatStringsSep "\n\n" runners); + + # Script to run the Haskell test suite testSpec = name: postgresql: checkedShellScript { inherit name; - docs = "Run the Haskell test suite against ${postgresql.name}."; + docs = "Run the Haskell test suite"; inRootDir = true; } '' env="$(cat ${postgrest.env})" export PATH="$env/bin:$PATH" - cat << EOF - - Running spec against ${postgresql.name}... - - EOF - - trap 'echo "Failed on ${postgresql.name}"' exit - ${withTmpDb postgresql} ${cabal-install}/bin/cabal v2-test ${devCabalOptions} - - trap "" exit - - cat << EOF - - Done running spec against ${postgresql.name}. - - EOF ''; testSpecIdempotence = @@ -85,28 +127,6 @@ let ${cabal-install}/bin/cabal v2-test ${devCabalOptions}" ''; - # Create a `testSpec` for each PostgreSQL version that we want to test - # against. - testSpecVersions = - builtins.map - ({ name, postgresql }: - (testSpec "postgrest-test-spec-${name}" postgresql).bin) - postgresqlVersions; - - # Helper script for running the tests against all PostgreSQL versions. - testSpecAllVersions = - let - testRunners = - map (test: "${test}/bin/${test.name}") testSpecVersions; - in - checkedShellScript - { - name = "postgrest-test-spec-all"; - docs = "Run the Haskell tests against all supported PostgreSQL versions."; - inRootDir = true; - } - (lib.concatStringsSep "\n" testRunners); - ioTestPython = python3.withPackages (ps: [ ps.pyjwt @@ -262,12 +282,12 @@ buildEnv [ (testSpec "postgrest-test-spec" postgresql).bin (testSpecIdempotence "postgrest-test-spec-idempotence" postgresql).bin - testSpecAllVersions.bin (testIO "postgrest-test-io" postgresql).bin (dumpSchema "postgrest-dump-schema" postgresql).bin (coverage "postgrest-coverage" postgresql).bin (coverageDraftOverlay "postgrest-coverage-draft-overlay").bin - ] ++ testSpecVersions; + (withAllVersions "postgrest-with-all").bin + ] ++ withPostgresqlVersions; } # The memory tests have large dependencies (a profiled build of PostgREST) # and are run less often than the spec tests, so we don't include them in diff --git a/shell.nix b/shell.nix index 5021fc6d0..6952d54b0 100644 --- a/shell.nix +++ b/shell.nix @@ -40,6 +40,13 @@ lib.overrideDerivation postgrest.env ( '' source ${pkgs.bashCompletion}/etc/profile.d/bash_completion.sh complete -F _command postgrest-watch + complete -F _command postgrest-with-all + complete -F _command postgrest-with-postgresql-13 + complete -F _command postgrest-with-postgresql-12 + complete -F _command postgrest-with-postgresql-11 + complete -F _command postgrest-with-postgresql-10 + complete -F _command postgrest-with-postgresql-9.6 + complete -F _command postgrest-with-postgresql-9.5 ''; } )