rhdh-e2e-test-utils 1.1.8 → 1.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,8 +7,8 @@ import { resolve } from "path";
7
7
  export const baseConfig = {
8
8
  testDir: "./tests",
9
9
  forbidOnly: !!process.env.CI,
10
- retries: process.env.CI ? 1 : 0,
11
- workers: "50%",
10
+ retries: Number(process.env.PLAYWRIGHT_RETRIES ?? 0),
11
+ workers: process.env.PLAYWRIGHT_WORKERS || "50%",
12
12
  outputDir: "node_modules/.cache/e2e-test-results",
13
13
  timeout: 90_000,
14
14
  reporter: [
@@ -22,8 +22,8 @@ export const baseConfig = {
22
22
  screenshot: "only-on-failure",
23
23
  viewport: { width: 1920, height: 1080 },
24
24
  video: {
25
- mode: "on",
26
- size: { width: 1920, height: 1080 },
25
+ mode: "retain-on-failure",
26
+ size: { width: 1280, height: 720 },
27
27
  },
28
28
  actionTimeout: 10_000,
29
29
  navigationTimeout: 50_000,
@@ -52,7 +52,7 @@ export declare function getMetadataDirectory(metadataPath?: string): string | nu
52
52
  * @param filePath Path to the metadata YAML file
53
53
  * @returns PluginMetadata if valid, null otherwise
54
54
  */
55
- export declare function parseMetadataFile(filePath: string): Promise<PluginMetadata | null>;
55
+ export declare function parseMetadataFile(filePath: string): Promise<PluginMetadata>;
56
56
  /**
57
57
  * Parses all metadata files in a directory and builds a map of plugin name to config.
58
58
  * The plugin name is extracted from the dynamicArtifact path for flexible matching.
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-metadata.d.ts","sourceRoot":"","sources":["../../src/utils/plugin-metadata.ts"],"names":[],"mappings":"AAuHA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAgBD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAmBpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AAEnD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,GAAE,MAA8B,GAC3C,MAAM,GAAG,IAAI,CAUf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA4BhC;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CA2BtC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,oBAAoB,EAAE,oBAAoB,EAC1C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GACvC,oBAAoB,CAsCtB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,wCAAwC,CAC5D,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,oBAAoB,CAAC,CA0F/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC/C,oBAAoB,EAAE,oBAAoB,EAC1C,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,oBAAoB,CAAC,CA4B/B"}
1
+ {"version":3,"file":"plugin-metadata.d.ts","sourceRoot":"","sources":["../../src/utils/plugin-metadata.ts"],"names":[],"mappings":"AA8HA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAgBD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAmBpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AAEnD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,GAAE,MAA8B,GAC3C,MAAM,GAAG,IAAI,CAUf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CA0BzB;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAwBtC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA4CD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,oBAAoB,EAAE,oBAAoB,EAC1C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GACvC,oBAAoB,CAsCtB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,wCAAwC,CAC5D,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,oBAAoB,CAAC,CAsD/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC/C,oBAAoB,EAAE,oBAAoB,EAC1C,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,oBAAoB,CAAC,CAuC/B"}
@@ -32,13 +32,13 @@ async function getOCIUrlsForPR(workspacePath, prNumber) {
32
32
  throw new Error(`[PluginMetadata] Failed to parse GitHub repo from source.json: ${repo}`);
33
33
  }
34
34
  const ownerRepo = match[1];
35
- // Read plugins list
36
- const pluginsList = await fs.readFile(pluginsListPath, "utf-8");
37
- const pluginPaths = pluginsList
38
- .trim()
39
- .split("\n")
40
- .map((l) => l.replace(/:$/, "").trim())
41
- .filter(Boolean);
35
+ // Parse plugins-list.yaml as YAML and extract keys (plugin paths)
36
+ const pluginsListContent = await fs.readFile(pluginsListPath, "utf-8");
37
+ const pluginsListData = yaml.load(pluginsListContent);
38
+ if (!pluginsListData || typeof pluginsListData !== "object") {
39
+ throw new Error(`[PluginMetadata] plugins-list.yaml is empty or invalid: ${pluginsListPath}`);
40
+ }
41
+ const pluginPaths = Object.keys(pluginsListData);
42
42
  const workspaceName = path.basename(workspacePath);
43
43
  console.log(`[PluginMetadata] Fetching versions for ${pluginPaths.length} plugins from source...`);
44
44
  for (const pluginPath of pluginPaths) {
@@ -142,28 +142,23 @@ export function getMetadataDirectory(metadataPath = DEFAULT_METADATA_PATH) {
142
142
  * @returns PluginMetadata if valid, null otherwise
143
143
  */
144
144
  export async function parseMetadataFile(filePath) {
145
- try {
146
- const content = await fs.readFile(filePath, "utf8");
147
- const parsed = yaml.load(content);
148
- const packagePath = parsed?.spec?.dynamicArtifact;
149
- const packageName = parsed?.spec?.packageName;
150
- const pluginConfig = parsed?.spec?.appConfigExamples?.[0]?.content;
151
- if (!packagePath) {
152
- console.log(`[PluginMetadata] Skipping ${filePath}: no spec.dynamicArtifact`);
153
- return null;
154
- }
155
- console.log(`[PluginMetadata] Loaded metadata for: ${packagePath}`);
156
- return {
157
- packagePath,
158
- pluginConfig: pluginConfig || {},
159
- packageName: packageName || "",
160
- sourceFile: filePath,
161
- };
145
+ const content = await fs.readFile(filePath, "utf8");
146
+ const parsed = yaml.load(content);
147
+ const packagePath = parsed?.spec?.dynamicArtifact;
148
+ const packageName = parsed?.spec?.packageName;
149
+ const pluginConfig = parsed?.spec?.appConfigExamples?.[0]?.content;
150
+ if (!packagePath) {
151
+ throw new Error(`[PluginMetadata] Missing required field spec.dynamicArtifact in ${filePath}`);
162
152
  }
163
- catch (error) {
164
- console.error(`[PluginMetadata] Error parsing ${filePath}:`, error);
165
- return null;
153
+ if (!packageName) {
154
+ throw new Error(`[PluginMetadata] Missing required field spec.packageName in ${filePath}`);
166
155
  }
156
+ return {
157
+ packagePath,
158
+ pluginConfig: pluginConfig || {},
159
+ packageName,
160
+ sourceFile: filePath,
161
+ };
167
162
  }
168
163
  /**
169
164
  * Parses all metadata files in a directory and builds a map of plugin name to config.
@@ -179,16 +174,46 @@ export async function parseAllMetadataFiles(metadataDir) {
179
174
  const metadataMap = new Map();
180
175
  for (const file of files) {
181
176
  const metadata = await parseMetadataFile(file);
182
- if (metadata) {
183
- // Use extracted plugin name as key for flexible matching
184
- const pluginName = extractPluginName(metadata.packagePath);
185
- metadataMap.set(pluginName, metadata);
186
- console.log(`[PluginMetadata] Mapped plugin: ${pluginName} <- ${metadata.packagePath}`);
187
- }
177
+ const pluginName = extractPluginName(metadata.packagePath);
178
+ metadataMap.set(pluginName, metadata);
179
+ console.log(`[PluginMetadata] Mapped plugin: ${pluginName} <- ${metadata.packagePath}`);
188
180
  }
189
181
  console.log(`[PluginMetadata] Successfully parsed ${metadataMap.size} plugin metadata entries`);
190
182
  return metadataMap;
191
183
  }
184
+ /**
185
+ * Replaces local package paths with OCI URLs for plugins that have matching metadata.
186
+ * Only applies to plugins with metadata (workspace plugins). Plugins without metadata
187
+ * (e.g., keycloak, bulk-import from auth defaults) keep their original paths.
188
+ *
189
+ * @param plugins The plugin entries to process
190
+ * @param metadataMap Map of plugin names to plugin metadata
191
+ * @param metadataPath Path to the metadata directory (used to resolve workspace root)
192
+ * @returns Plugin entries with OCI URLs replaced where applicable
193
+ */
194
+ async function replaceWithOCIUrls(plugins, metadataMap, metadataPath) {
195
+ const prNumber = process.env.GIT_PR_NUMBER;
196
+ if (!prNumber) {
197
+ return plugins;
198
+ }
199
+ console.log(`[PluginMetadata] PR build detected (PR #${prNumber}), fetching OCI URLs...`);
200
+ const workspacePath = path.resolve(metadataPath, "..");
201
+ const ociUrls = await getOCIUrlsForPR(workspacePath, prNumber);
202
+ return plugins.map((plugin) => {
203
+ const pluginName = extractPluginName(plugin.package);
204
+ const metadata = metadataMap.get(pluginName);
205
+ if (!metadata?.packageName)
206
+ return plugin;
207
+ const displayName = metadata.packageName
208
+ .replace(/^@/, "")
209
+ .replace(/\//g, "-");
210
+ const ociUrl = ociUrls.get(displayName);
211
+ if (!ociUrl)
212
+ return plugin;
213
+ console.log(`[PluginMetadata] Replacing ${plugin.package} with ${ociUrl}`);
214
+ return { ...plugin, package: ociUrl };
215
+ });
216
+ }
192
217
  /**
193
218
  * Injects plugin configurations from metadata into a dynamic plugins config.
194
219
  * Metadata config serves as the base, user-provided pluginConfig overrides it.
@@ -255,43 +280,18 @@ export async function generateDynamicPluginsConfigFromMetadata(metadataPath = DE
255
280
  if (metadataMap.size === 0) {
256
281
  throw new Error(`[PluginMetadata] Cannot generate dynamic-plugins config: no valid metadata files found in ${metadataDir}`);
257
282
  }
258
- // If PR number is set, fetch OCI URLs
259
- const prNumber = process.env.GIT_PR_NUMBER;
260
- let ociUrls = null;
261
- if (prNumber) {
262
- console.log(`[PluginMetadata] PR build detected (PR #${prNumber}), fetching OCI URLs...`);
263
- const workspacePath = path.resolve(metadataPath, "..");
264
- ociUrls = await getOCIUrlsForPR(workspacePath, prNumber);
265
- }
266
283
  // Build plugin entries from metadata
267
- const plugins = [];
284
+ let plugins = [];
268
285
  for (const [pluginName, metadata] of metadataMap) {
269
- let packageRef = metadata.packagePath;
270
- // Replace with OCI URL if available (required for PR builds)
271
- if (ociUrls) {
272
- if (!metadata.packageName) {
273
- throw new Error(`[PluginMetadata] PR build requires packageName in metadata but not found for: ${pluginName}\n` +
274
- ` Source file: ${metadata.sourceFile}`);
275
- }
276
- const displayName = metadata.packageName
277
- .replace(/^@/, "")
278
- .replace(/\//g, "-");
279
- const ociUrl = ociUrls.get(displayName);
280
- if (!ociUrl) {
281
- throw new Error(`[PluginMetadata] PR build requires OCI URL but not found for: ${displayName}\n` +
282
- ` Package name: ${metadata.packageName}\n` +
283
- ` Source file: ${metadata.sourceFile}`);
284
- }
285
- console.log(`[PluginMetadata] Replacing ${packageRef} with ${ociUrl}`);
286
- packageRef = ociUrl;
287
- }
288
- console.log(`[PluginMetadata] Adding plugin: ${pluginName} (${packageRef})`);
286
+ console.log(`[PluginMetadata] Adding plugin: ${pluginName} (${metadata.packagePath})`);
289
287
  plugins.push({
290
- package: packageRef,
288
+ package: metadata.packagePath,
291
289
  disabled: false,
292
290
  pluginConfig: metadata.pluginConfig,
293
291
  });
294
292
  }
293
+ // Replace local paths with OCI URLs for PR builds
294
+ plugins = await replaceWithOCIUrls(plugins, metadataMap, metadataPath);
295
295
  console.log(`[PluginMetadata] Generated dynamic-plugins config with ${plugins.length} plugins`);
296
296
  return { plugins };
297
297
  }
@@ -321,5 +321,10 @@ export async function loadAndInjectPluginMetadata(dynamicPluginsConfig, metadata
321
321
  throw new Error(`[PluginMetadata] PR build requires plugin metadata but no valid metadata files found in ${metadataDir}`);
322
322
  }
323
323
  // Inject metadata configs into the dynamic plugins config
324
- return injectMetadataConfig(dynamicPluginsConfig, metadataMap);
324
+ const result = injectMetadataConfig(dynamicPluginsConfig, metadataMap);
325
+ // Replace local paths with OCI URLs for PR builds
326
+ if (result.plugins) {
327
+ result.plugins = await replaceWithOCIUrls(result.plugins, metadataMap, metadataPath);
328
+ }
329
+ return result;
325
330
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rhdh-e2e-test-utils",
3
- "version": "1.1.8",
3
+ "version": "1.1.10",
4
4
  "description": "Test utilities for RHDH E2E tests",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",