Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions nix/tools/tests.nix
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ let
checkedShellScript
{
name = "postgrest-test-io";
docs = "Run the pytest-based IO tests.";
docs = "Run the pytest-based IO tests. Add -k to run tests that match a given expression.";
args = [ "ARG_LEFTOVERS([pytest arguments])" ];
inRootDir = true;
withEnv = postgrest.env;
Expand Down Expand Up @@ -151,7 +151,7 @@ let
HPCTIXFILE="$tmpdir"/io.tix \
${withTools.withPg} -f test/io/fixtures.sql ${cabal-install}/bin/cabal v2-exec ${devCabalOptions} -- \
${ioTestPython}/bin/pytest -v test/io

HPCTIXFILE="$tmpdir"/spec.tix \
${withTools.withPg} ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec

Expand Down
8 changes: 8 additions & 0 deletions test/io/fixtures.sql
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,11 @@ create function reload_pgrst_config() returns void as $_$
begin
perform pg_notify('pgrst', 'reload config');
end $_$ language plpgsql ;

create or replace function sleep(seconds double precision) returns void as $$
select pg_sleep(seconds);
$$ language sql;

create or replace function hello() returns text as $$
select 'hello';
$$ language sql;
50 changes: 50 additions & 0 deletions test/io/test_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -943,6 +943,56 @@ def test_log_level(level, has_output, defaultenv):
)


def test_no_pool_connection_required_on_bad_http_logic(defaultenv):
"no pool connection should be consumed for failing on invalid http logic"

env = {
**defaultenv,
"PGRST_DB_POOL": "1",
}

with run(env=env) as postgrest:
# First we retain the only pool connection available
# The try/except is a hack for not waiting for the response, taken from https://stackoverflow.com/a/45601591/4692662
try:
postgrest.session.get("/rpc/sleep?seconds=50", timeout=0.1)
except requests.exceptions.ReadTimeout:
pass

# Then the following requests should succeed rapidly

# not found nested route shouldn't require opening a connection
response = postgrest.session.head("/path/notfound")
assert response.status_code == 404

# an invalid http method on a resource shouldn't require opening a connection
response = postgrest.session.request("TRACE", "/projects")
assert response.status_code == 405
response = postgrest.session.patch("/rpc/hello")
assert response.status_code == 405


def test_no_pool_connection_required_on_bad_jwt_claim(defaultenv):
"no pool connection should be consumed for failing on invalid jwt"

env = {**defaultenv, "PGRST_DB_POOL": "1", "PGRST_JWT_SECRET": SECRET}

with run(env=env) as postgrest:
# First we retain the only pool connection available
# The try/except is a hack for not waiting for the response, taken from https://stackoverflow.com/a/45601591/4692662
try:
postgrest.session.get("/rpc/sleep?seconds=50", timeout=0.1)
except requests.exceptions.ReadTimeout:
pass

# Then the following requests should succeed rapidly

# A JWT with an invalid signature shouldn't open a connection
headers = jwtauthheader({"role": "postgrest_test_author"}, "Wrong Secret")
response = postgrest.session.get("/projects", headers=headers)
assert response.status_code == 401


# TODO: This test fails now because of https://github.com/PostgREST/postgrest/pull/2122
# The stack size of 1K(-with-rtsopts=-K1K) is not enough and this fails with "stack overflow"
# A stack size of 200K seems to be enough for succeess
Expand Down