{ buildToolbox , cabal-install , checkedShellScript , devCabalOptions , ghc , glibcLocales ? null , gnugrep , hpc-codecov , hostPlatform , jq , lib , postgrest , python3 , runtimeShell , stdenv , weeder , withTools }: let testSpec = checkedShellScript { name = "postgrest-test-spec"; docs = "Run the Haskell test suite. Use --match PATTERN for running individual specs"; args = [ "ARG_LEFTOVERS([hspec arguments])" ]; workingDir = "/"; withEnv = postgrest.env; } '' ${withTools.withPg} -f test/spec/fixtures/load.sql \ ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec -- "''${_arg_leftovers[@]}" ''; testDoctests = checkedShellScript { name = "postgrest-test-doctests"; docs = "Run the Haskell doctest test suite"; workingDir = "/"; withEnv = postgrest.env; } '' # This makes nix-env -iA tests.doctests.bin work. export NIX_GHC=${postgrest.env.NIX_GHC} ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:doctests ''; testSpecIdempotence = checkedShellScript { name = "postgrest-test-spec-idempotence"; docs = "Check that the Haskell tests can be run multiple times against the same db."; workingDir = "/"; withEnv = postgrest.env; } '' ${withTools.withPg} -f test/spec/fixtures/load.sql \ ${runtimeShell} -c " \ ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec && \ ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec" ''; ioTestPython = python3.withPackages (ps: [ ps.pyjwt ps.pytest ps.pytest-xdist ps.pyyaml ps.requests ps.requests-unixsocket ps.syrupy ]); testIO = checkedShellScript { name = "postgrest-test-io"; docs = "Run the pytest-based IO tests. Add -k to run tests that match a given expression."; args = [ "ARG_LEFTOVERS([pytest arguments])" ]; workingDir = "/"; withEnv = postgrest.env; } '' ${cabal-install}/bin/cabal v2-build ${devCabalOptions} ${cabal-install}/bin/cabal v2-exec -- ${withTools.withPg} -f test/io/fixtures.sql \ ${ioTestPython}/bin/pytest --ignore=test/io/test_big_schema.py --ignore=test/io/test_replica.py -v test/io "''${_arg_leftovers[@]}" ''; testBigSchema = checkedShellScript { name = "postgrest-test-big-schema"; docs = "Run a pytest-based IO test on a big schema. Add -k to run tests that match a given expression."; args = [ "ARG_LEFTOVERS([pytest arguments])" ]; workingDir = "/"; withEnv = postgrest.env; } '' ${cabal-install}/bin/cabal v2-build ${devCabalOptions} ${cabal-install}/bin/cabal v2-exec -- ${withTools.withPg} -f test/io/big_schema.sql \ ${ioTestPython}/bin/pytest -v test/io/test_big_schema.py "''${_arg_leftovers[@]}" ''; testReplica = checkedShellScript { name = "postgrest-test-replica"; docs = "Run a pytest-based IO test on a replica. Add -k to run tests that match a given expression."; args = [ "ARG_LEFTOVERS([pytest arguments])" ]; workingDir = "/"; withEnv = postgrest.env; } '' ${cabal-install}/bin/cabal v2-build ${devCabalOptions} ${cabal-install}/bin/cabal v2-exec -- ${withTools.withPg} --replica -f test/io/replica.sql \ ${ioTestPython}/bin/pytest -v test/io/test_replica.py "''${_arg_leftovers[@]}" ''; dumpSchema = checkedShellScript { name = "postgrest-dump-schema"; docs = "Dump the loaded schema's SchemaCache in JSON format."; workingDir = "/"; withEnv = postgrest.env; withPath = [ jq ]; } '' ${withTools.withPg} -f test/spec/fixtures/load.sql \ ${cabal-install}/bin/cabal v2-run ${devCabalOptions} --verbose=0 -- \ postgrest --dump-schema ''; coverage = checkedShellScript { name = "postgrest-coverage"; docs = "Run spec and io tests while collecting hpc coverage data. First runs weeder to detect dead code."; args = [ "ARG_LEFTOVERS([hpc report arguments])" ]; workingDir = "/"; redirectTixFiles = false; withEnv = postgrest.env; withTmpDir = true; } ( # required for `hpc markup` in CI; glibcLocales is not available e.g. on Darwin lib.optionalString (stdenv.isLinux && hostPlatform.libc == "glibc") '' export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive" '' + '' # clean up previous coverage reports mkdir -p coverage rm -rf coverage/* # build once before running all the tests ${cabal-install}/bin/cabal v2-build ${devCabalOptions} exe:postgrest lib:postgrest test:spec ( trap 'echo Found dead code: Check file list above.' ERR ; ${weeder}/bin/weeder --config=./test/weeder.toml ) # collect all tests HPCTIXFILE="$tmpdir"/io.tix \ ${withTools.withPg} -f test/io/fixtures.sql \ ${cabal-install}/bin/cabal v2-exec ${devCabalOptions} -- ${ioTestPython}/bin/pytest --ignore=test/io/test_big_schema.py --ignore=test/io/test_replica.py -v test/io HPCTIXFILE="$tmpdir"/big_schema.tix \ ${withTools.withPg} -f test/io/big_schema.sql \ ${cabal-install}/bin/cabal v2-exec ${devCabalOptions} -- ${ioTestPython}/bin/pytest -v test/io/test_big_schema.py HPCTIXFILE="$tmpdir"/replica.tix \ ${withTools.withPg} --replica -f test/io/replica.sql \ ${cabal-install}/bin/cabal v2-exec ${devCabalOptions} -- ${ioTestPython}/bin/pytest -v test/io/test_replica.py HPCTIXFILE="$tmpdir"/spec.tix \ ${withTools.withPg} -f test/spec/fixtures/load.sql \ ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec # Note: No coverage for doctests, as doctests leverage GHCi and GHCi does not support hpc # collect all the tix files ${ghc}/bin/hpc sum --union --exclude=Paths_postgrest --output="$tmpdir"/tests.tix \ "$tmpdir"/io*.tix "$tmpdir"/big_schema*.tix "$tmpdir"/replica*.tix "$tmpdir"/spec.tix # prepare the overlay ${ghc}/bin/hpc overlay --output="$tmpdir"/overlay.tix test/coverage.overlay ${ghc}/bin/hpc sum --union --output="$tmpdir"/tests-overlay.tix "$tmpdir"/tests.tix "$tmpdir"/overlay.tix # check nothing in the overlay is actually tested ${ghc}/bin/hpc map --function=inv --output="$tmpdir"/inverted.tix "$tmpdir"/tests.tix ${ghc}/bin/hpc combine --function=sub \ --output="$tmpdir"/check.tix "$tmpdir"/overlay.tix "$tmpdir"/inverted.tix # returns zero exit code if any count="" lines are found, i.e. # something is covered by both the overlay and the tests if ${ghc}/bin/hpc report --xml "$tmpdir"/check.tix | ${gnugrep}/bin/grep -qP 'count="[^0]' then ${ghc}/bin/hpc markup --highlight-covered --destdir=coverage/overlay "$tmpdir"/overlay.tix || true ${ghc}/bin/hpc markup --highlight-covered --destdir=coverage/check "$tmpdir"/check.tix || true echo "ERROR: Something is covered by both the tests and the overlay:" echo "postgrest-coverage: To see the results, visit file://$(pwd)/coverage/check/hpc_index.html" exit 1 else # copy the result .tix file to the coverage/ dir to make it available to postgrest-coverage-draft-overlay, too cp "$tmpdir"/tests-overlay.tix coverage/postgrest.tix # prepare codecov json report ${hpc-codecov}/bin/hpc-codecov --mix=.hpc --out=coverage/codecov.json coverage/postgrest.tix # create html and stdout reports ${ghc}/bin/hpc markup --destdir=coverage coverage/postgrest.tix echo "postgrest-coverage: To see the results, visit file://$(pwd)/coverage/hpc_index.html" ${ghc}/bin/hpc report coverage/postgrest.tix "''${_arg_leftovers[@]}" fi '' ); coverageDraftOverlay = checkedShellScript { name = "postgrest-coverage-draft-overlay"; docs = "Create a draft overlay from current coverage report."; workingDir = "/"; } '' ${ghc}/bin/hpc draft --output=test/coverage.overlay coverage/postgrest.tix sed -i 's|^module \(.*\):|module \1/|g' test/coverage.overlay ''; in buildToolbox { name = "postgrest-tests"; tools = { inherit testSpec testDoctests testSpecIdempotence testIO testBigSchema testReplica dumpSchema coverage coverageDraftOverlay; }; }