Skip to content

Commit 3221f98

Browse files
jfrochesamrose
authored andcommitted
feat: run pg_regress tests for pgjwt extension
Reuse the existing test library for postgresql extensions to run pg_regress tests
1 parent 83a175f commit 3221f98

File tree

1 file changed

+61
-28
lines changed

1 file changed

+61
-28
lines changed

nix/ext/tests/pgjwt.nix

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ let
1515
postgresql
1616
postgresql.lib
1717
(installedExtension majorVersion)
18-
self.packages.${pkgs.system}."psql_${majorVersion}/exts/hypopg" # dependency
1918
];
2019
passthru = {
2120
inherit (postgresql) version psqlSchema;
@@ -36,6 +35,8 @@ let
3635
};
3736
in
3837
pkg;
38+
psql_15 = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15;
39+
psql_17 = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_17;
3940
in
4041
self.inputs.nixpkgs.lib.nixos.runTest {
4142
name = pname;
@@ -55,12 +56,17 @@ self.inputs.nixpkgs.lib.nixos.runTest {
5556

5657
services.postgresql = {
5758
enable = true;
58-
package = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15;
59+
package = psql_15;
60+
# pg_regress test for pgjwt rely on the "extensions" schema to be present
61+
initialScript = pkgs.writeText "init-postgres-with-schema" ''
62+
CREATE SCHEMA IF NOT EXISTS extensions;
63+
CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA extensions;
64+
'';
5965
};
6066

6167
specialisation.postgresql17.configuration = {
6268
services.postgresql = {
63-
package = lib.mkForce (postgresqlWithExtension self.packages.${pkgs.system}.postgresql_17);
69+
package = lib.mkForce psql_17;
6470
};
6571

6672
systemd.services.postgresql-migrate = {
@@ -74,8 +80,8 @@ self.inputs.nixpkgs.lib.nixos.runTest {
7480
};
7581
script =
7682
let
77-
oldPostgresql = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15;
78-
newPostgresql = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_17;
83+
oldPostgresql = psql_15;
84+
newPostgresql = psql_17;
7985
oldDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${oldPostgresql.psqlSchema}";
8086
newDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${newPostgresql.psqlSchema}";
8187
in
@@ -103,45 +109,72 @@ self.inputs.nixpkgs.lib.nixos.runTest {
103109
pg17-configuration = "${nodes.server.system.build.toplevel}/specialisation/postgresql17";
104110
in
105111
''
112+
from pathlib import Path
106113
versions = {
107114
"15": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "15"))}],
108115
"17": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "17"))}],
109116
}
117+
extension_name = "${pname}"
118+
support_upgrade = False
119+
pg17_configuration = "${pg17-configuration}"
120+
ext_has_background_worker = ${
121+
if (installedExtension "15") ? hasBackgroundWorker then "True" else "False"
122+
}
123+
sql_test_directory = Path("${../../tests}")
124+
pg_regress_test_name = "${(installedExtension "15").pgRegressTestName or pname}"
110125
111-
def run_sql(query):
112-
return server.succeed(f"""sudo -u postgres psql -t -A -F\",\" -c \"{query}\" """).strip()
113-
114-
def check_upgrade_path(pg_version):
115-
with subtest("Check ${pname} upgrade path"):
116-
firstVersion = versions[pg_version][0]
117-
server.succeed("sudo -u postgres psql -c 'DROP EXTENSION IF EXISTS ${pname};'")
118-
run_sql(f"""CREATE EXTENSION ${pname} WITH VERSION '{firstVersion}' CASCADE;""")
119-
installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = '${pname}';""")
120-
assert installed_version == firstVersion, f"Expected ${pname} version {firstVersion}, but found {installed_version}"
121-
for version in versions[pg_version][1:]:
122-
run_sql(f"""ALTER EXTENSION ${pname} UPDATE TO '{version}';""")
123-
installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = '${pname}';""")
124-
assert installed_version == version, f"Expected ${pname} version {version}, but found {installed_version}"
126+
${builtins.readFile ./lib.py}
125127
126128
start_all()
127129
128130
server.wait_for_unit("multi-user.target")
129131
server.wait_for_unit("postgresql.service")
130132
131-
check_upgrade_path("15")
133+
test = PostgresExtensionTest(server, extension_name, versions, sql_test_directory, support_upgrade)
134+
135+
with subtest("Check upgrade path with postgresql 15"):
136+
test.check_upgrade_path("15")
137+
138+
with subtest("Check pg_regress with postgresql 15 after extension upgrade"):
139+
# We need to uninstall the extension before running pg_regress
140+
test.drop_extension()
141+
test.check_pg_regress(Path("${psql_15}/lib/pgxs/src/test/regress/pg_regress"), "15", pg_regress_test_name)
142+
143+
last_version = None
144+
with subtest("Check the install of the last version of the extension"):
145+
last_version = test.check_install_last_version("15")
132146
133-
with subtest("Check ${pname} latest extension version"):
134-
server.succeed("sudo -u postgres psql -c 'DROP EXTENSION ${pname};'")
135-
server.succeed("sudo -u postgres psql -c 'CREATE EXTENSION ${pname} CASCADE;'")
136-
installed_extensions=run_sql(r"""SELECT extname, extversion FROM pg_extension;""")
137-
latestVersion = versions["15"][-1]
138-
assert f"${pname},{latestVersion}" in installed_extensions
147+
if ext_has_background_worker:
148+
with subtest("Test switch_${pname}_version"):
149+
test.check_switch_extension_with_background_worker(Path("${psql_15}/lib/${pname}.so"), "15")
150+
151+
with subtest("Check pg_regress with postgresql 15 after installing the last version"):
152+
# We need to uninstall the extension before running pg_regress
153+
test.drop_extension()
154+
test.check_pg_regress(Path("${psql_15}/lib/pgxs/src/test/regress/pg_regress"), "15", pg_regress_test_name)
139155
140156
with subtest("switch to postgresql 17"):
141157
server.succeed(
142-
"${pg17-configuration}/bin/switch-to-configuration test >&2"
158+
f"{pg17_configuration}/bin/switch-to-configuration test >&2"
143159
)
144160
145-
check_upgrade_path("17")
161+
with subtest("Check last version of the extension after postgresql upgrade"):
162+
test.assert_version_matches(last_version)
163+
164+
with subtest("Check upgrade path with postgresql 17"):
165+
test.check_upgrade_path("17")
166+
167+
with subtest("Check pg_regress with postgresql 17 after extension upgrade"):
168+
# We need to uninstall the extension before running pg_regress
169+
test.drop_extension()
170+
test.check_pg_regress(Path("${psql_17}/lib/pgxs/src/test/regress/pg_regress"), "17", pg_regress_test_name)
171+
172+
with subtest("Check the install of the last version of the extension"):
173+
test.check_install_last_version("17")
174+
175+
with subtest("Check pg_regress with postgresql 17 after installing the last version"):
176+
# We need to uninstall the extension before running pg_regress
177+
test.drop_extension()
178+
test.check_pg_regress(Path("${psql_17}/lib/pgxs/src/test/regress/pg_regress"), "17", pg_regress_test_name)
146179
'';
147180
}

0 commit comments

Comments
 (0)