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
2 changes: 1 addition & 1 deletion e2e_tests/api/server.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import GrafanaHelper from '@helpers/grafana.helper';
import { Timeouts } from '@helpers/timeouts';
import apiEndpoints from '@helpers/apiEndpoints';

interface PmmVersion {
export interface PmmVersion {
major: number;
minor: number;
patch: number;
Expand Down
30 changes: 21 additions & 9 deletions e2e_tests/fixtures/pmmTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ import SettingsPage from '@pages/ha/settings.page';
import HighAvailabilityPage from '@pages/ha/highAvailability.page';
import UpdatesPage from '@pages/updates.page';
import DownloadsPage from '@pages/downloads.page';
import { serverVersionBelow } from '@helpers/version.helper';
import ServerApi from '@api/server.api';
import { getServerVersion, serverVersionBelow } from '@helpers/version.helper';
import { minPmmVersion } from '@helpers/versionGates';

const pmmTest = base.extend<{
Expand All @@ -52,6 +53,7 @@ const pmmTest = base.extend<{
nodesPage: NodesPage;
realTimeAnalyticsPage: RealTimeAnalyticsPage;
vacuumDashboardPage: VacuumDashboard;
versionGate: undefined;
updatesPage: UpdatesPage;
downloadsPage: DownloadsPage;
}>({
Expand Down Expand Up @@ -168,14 +170,24 @@ const pmmTest = base.extend<{
await use(urlHelper);
},
vacuumDashboardPage: async ({ page }, use) => await use(new VacuumDashboard(page)),
});

pmmTest.beforeEach(async ({ api }, testInfo) => {
const testId = testInfo.title.match(/PMM-T\d+/)?.[0];
const minVersion = testId ? minPmmVersion[testId] : undefined;
if (!minVersion) return;

pmmTest.skip(serverVersionBelow(await api.serverApi.getPmmVersion(), minVersion), `Requires PMM Server ${minVersion}+`);
// Registering this as a beforeEach hook would only gate the first spec file that imports this
// module, since the module is evaluated once and the hook attaches to the file loading at that
// moment. An auto fixture applies to every test instead.
versionGate: [
async ({ request }, use, testInfo) => {
const testId = testInfo.title.match(/PMM-T\d+/)?.[0];
const minVersion = testId ? minPmmVersion[testId] : undefined;

if (minVersion) {
const version = await getServerVersion(new ServerApi(request));

testInfo.skip(serverVersionBelow(version, minVersion), `Requires PMM Server ${minVersion}+`);
}

await use(undefined);
},
{ auto: true },
],
});

export default pmmTest;
17 changes: 17 additions & 0 deletions e2e_tests/helpers/version.helper.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
import ServerApi, { PmmVersion } from '@api/server.api';

let cachedVersion: Promise<PmmVersion> | undefined;

// One request per worker process: the promise is cached, so parallel tests share the same
// in-flight call instead of each hitting the server. A failed lookup is not cached, otherwise
// one transient error would fail every gated test in the worker.
export const getServerVersion = (serverApi: ServerApi): Promise<PmmVersion> => {
cachedVersion ??= serverApi.getPmmVersion().catch((error: unknown) => {
cachedVersion = undefined;

throw error;
});

return cachedVersion;
};

export const serverVersionBelow = (
version: { major: number; minor: number; patch: number },
minVersion: string,
Expand Down
1 change: 1 addition & 0 deletions e2e_tests/helpers/versionGates.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// Specs keyed by their PMM-T id skip when the running server is below this version.
export const minPmmVersion: Record<string, string> = {
'PMM-T2029': '3.10.0',
'PMM-T2202': '3.10.0',
'PMM-T2262': '3.10.0',
'PMM-T2263': '3.10.0',
Expand Down
Loading