To make schema cache loading wait tests robust it is necessary to provide three separate internal config variables: * "internal-schema-cache-query-sleep" - introduces delay in schema queries execution * "internal-schema-cache-load-sleep" - introduces delay between schema queries execution and processing their results * "internal-schema-cache-relationship-load-sleep" - introduces delay in processing relationship query results Thanks to these changes it is now possible to test various schema loading scenarios with the right granularity robustly (eg. make sure requests wait for schema loading but not for relationship loading).
96 lines
2.6 KiB
Python
96 lines
2.6 KiB
Python
import os
|
|
import pytest
|
|
from syrupy.extensions.json import SingleFileSnapshotExtension
|
|
from postgrest import run
|
|
|
|
|
|
@pytest.fixture
|
|
def dburi():
|
|
"Postgres database connection URI."
|
|
dbname = os.environ["PGDATABASE"]
|
|
host = os.environ["PGHOST"]
|
|
user = os.environ["PGUSER"]
|
|
return f"postgresql://?dbname={dbname}&host={host}&user={user}".encode()
|
|
|
|
|
|
@pytest.fixture
|
|
def baseenv():
|
|
"Base environment to connect to PostgreSQL"
|
|
return {
|
|
"PGDATABASE": os.environ["PGDATABASE"],
|
|
"PGHOST": os.environ["PGHOST"],
|
|
"PGUSER": os.environ["PGUSER"],
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def defaultenv(baseenv):
|
|
"Default environment for PostgREST."
|
|
return {
|
|
**baseenv,
|
|
"PGRST_DB_CONFIG": "true",
|
|
"PGRST_LOG_LEVEL": "info",
|
|
"PGRST_DB_POOL": "1",
|
|
"PGRST_NOT_EXISTING": "should not break any tests",
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def replicaenv(defaultenv):
|
|
"Default environment for a PostgREST replica."
|
|
conf = {
|
|
"PGRST_DB_ANON_ROLE": "postgrest_test_anonymous",
|
|
"PGRST_DB_SCHEMAS": "replica",
|
|
}
|
|
return {
|
|
"primary": {
|
|
**defaultenv,
|
|
**conf,
|
|
},
|
|
"replica": {
|
|
**defaultenv,
|
|
**conf,
|
|
"PGHOST": os.environ["PGREPLICAHOST"] + "," + os.environ["PGHOST"],
|
|
"PGREPLICASLOT": os.environ["PGREPLICASLOT"],
|
|
},
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def slow_schema_cache_env(defaultenv):
|
|
"Slow schema cache load environment PostgREST."
|
|
return {
|
|
**defaultenv,
|
|
"PGRST_INTERNAL_SCHEMA_CACHE_QUERY_SLEEP": "1000", # this does a pg_sleep internally, it will cause the schema cache query to be slow
|
|
# the slow schema cache query will keep using one pool connection until it finishes
|
|
# to prevent requests waiting for PGRST_DB_POOL_ACQUISITION_TIMEOUT we'll increase the pool size (must be >= 2)
|
|
"PGRST_DB_POOL": "2",
|
|
"PGRST_DB_CHANNEL_ENABLED": "true",
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def metapostgrest():
|
|
"A shared postgrest instance to use for interacting with the database independently of the instance under test"
|
|
role = "meta_authenticator"
|
|
env = {
|
|
"PGDATABASE": os.environ["PGDATABASE"],
|
|
"PGHOST": os.environ["PGHOST"],
|
|
"PGUSER": role,
|
|
"PGRST_DB_ANON_ROLE": role,
|
|
"PGRST_DB_CONFIG": "true",
|
|
"PGRST_LOG_LEVEL": "info",
|
|
"PGRST_DB_POOL": "1",
|
|
}
|
|
with run(env=env) as postgrest:
|
|
yield postgrest
|
|
|
|
|
|
class YamlSnapshotExtension(SingleFileSnapshotExtension):
|
|
_file_extension = "yaml"
|
|
|
|
|
|
@pytest.fixture
|
|
def snapshot_yaml(snapshot):
|
|
return snapshot.use_extension(YamlSnapshotExtension)
|