From 29aacb9ed354eb1302485e1ea90fd79ba6011c52 Mon Sep 17 00:00:00 2001 From: Diana Janickova Date: Fri, 9 Jan 2026 10:07:30 +0100 Subject: [PATCH 1/8] test: unskip annotator test to see CI output Signed-off-by: Diana Janickova --- .../playwright/e2e/scaffolder-backend-module-annotator.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/e2e-tests/playwright/e2e/scaffolder-backend-module-annotator.spec.ts b/e2e-tests/playwright/e2e/scaffolder-backend-module-annotator.spec.ts index 73d3ef69c9..0b1d119422 100644 --- a/e2e-tests/playwright/e2e/scaffolder-backend-module-annotator.spec.ts +++ b/e2e-tests/playwright/e2e/scaffolder-backend-module-annotator.spec.ts @@ -9,7 +9,6 @@ import { runAccessibilityTests } from "../utils/accessibility"; let page: Page; test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => { - test.skip(true, "Disabled on Backstage 1.45 update"); test.skip(() => process.env.JOB_NAME.includes("osd-gcp")); // skipping due to RHIDP-5704 on OSD Env let uiHelper: UIhelper; let common: Common; From a4e6babf4f1575c336f3a5d4b95a5be9b638b2ce Mon Sep 17 00:00:00 2001 From: Diana Janickova Date: Fri, 9 Jan 2026 15:00:45 +0100 Subject: [PATCH 2/8] fix: create catalogGraphApiFactory Signed-off-by: Diana Janickova --- packages/app/src/apis.ts | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/app/src/apis.ts b/packages/app/src/apis.ts index 125c7dbd56..8b43c180ba 100644 --- a/packages/app/src/apis.ts +++ b/packages/app/src/apis.ts @@ -21,6 +21,12 @@ import { scmIntegrationsApiRef, } from '@backstage/integration-react'; import { UserSettingsStorage } from '@backstage/plugin-user-settings'; +import { + ALL_RELATIONS, + ALL_RELATION_PAIRS, + catalogGraphApiRef, + DefaultCatalogGraphApi, +} from '@backstage/plugin-catalog-graph'; import { auth0AuthApiRef, @@ -32,6 +38,10 @@ import { learningPathApiRef, } from './api/LearningPathApiClient'; +// Custom relations from @backstage-community/plugin-catalog-backend-module-scaffolder-relation-processor +const RELATION_SCAFFOLDED_FROM = 'scaffoldedFrom'; +const RELATION_SCAFFOLDER_OF = 'scaffolderOf'; + export const apis: AnyApiFactory[] = [ createApiFactory({ api: storageApiRef, @@ -94,6 +104,23 @@ export const apis: AnyApiFactory[] = [ factory: ({ discoveryApi, configApi, identityApi }) => new LearningPathApiClient({ discoveryApi, configApi, identityApi }), }), + // Catalog Graph API with custom scaffolder relations + createApiFactory({ + api: catalogGraphApiRef, + deps: {}, + factory: () => + new DefaultCatalogGraphApi({ + knownRelations: [ + ...ALL_RELATIONS, + RELATION_SCAFFOLDED_FROM, + RELATION_SCAFFOLDER_OF, + ], + knownRelationPairs: [ + ...ALL_RELATION_PAIRS, + [RELATION_SCAFFOLDER_OF, RELATION_SCAFFOLDED_FROM], + ], + }), + }), // OIDC createApiFactory({ api: oidcAuthApiRef, @@ -159,4 +186,4 @@ export const apis: AnyApiFactory[] = [ environment: configApi.getOptionalString('auth.environment'), }), }), -]; +]; \ No newline at end of file From 3cfe763ef5795f54a8926909dfeee0ac69885653 Mon Sep 17 00:00:00 2001 From: Diana Janickova Date: Fri, 16 Jan 2026 10:39:16 +0100 Subject: [PATCH 3/8] test: refactor tests for the annotator plugin Signed-off-by: Diana Janickova --- e2e-tests/playwright.config.ts | 6 +- .../annotator.spec.ts} | 109 +++--------- .../scaffolder-relation-processor.spec.ts | 163 ++++++++++++++++++ packages/app/src/apis.ts | 1 + 4 files changed, 188 insertions(+), 91 deletions(-) rename e2e-tests/playwright/e2e/{scaffolder-backend-module-annotator.spec.ts => plugins/scaffolder-backend-module-annotator/annotator.spec.ts} (57%) create mode 100644 e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts diff --git a/e2e-tests/playwright.config.ts b/e2e-tests/playwright.config.ts index ffc07f9654..42625678f2 100644 --- a/e2e-tests/playwright.config.ts +++ b/e2e-tests/playwright.config.ts @@ -117,7 +117,8 @@ export default defineConfig({ "**/playwright/e2e/auth-providers/**/*.spec.ts", "**/playwright/e2e/plugins/bulk-import.spec.ts", "**/playwright/e2e/plugins/tekton/tekton.spec.ts", - "**/playwright/e2e/scaffolder-backend-module-annotator.spec.ts", + "**/playwright/e2e/plugins/scaffolder-backend-module-annotator/**/*.spec.ts", + "**/playwright/e2e/plugins/scaffolder-relation-processor/**/*.spec.ts", "**/playwright/e2e/plugins/ocm.spec.ts", "**/playwright/e2e/audit-log/**/*.spec.ts", "**/playwright/e2e/external-database/verify-tls-config-with-external-rds.spec.ts", @@ -149,7 +150,8 @@ export default defineConfig({ "**/playwright/e2e/auth-providers/**/*.spec.ts", "**/playwright/e2e/plugins/bulk-import.spec.ts", "**/playwright/e2e/plugins/tekton/tekton.spec.ts", - "**/playwright/e2e/scaffolder-backend-module-annotator.spec.ts", + "**/playwright/e2e/plugins/scaffolder-backend-module-annotator/**/*.spec.ts", + "**/playwright/e2e/plugins/scaffolder-relation-processor/**/*.spec.ts", "**/playwright/e2e/audit-log/**/*.spec.ts", "**/playwright/e2e/external-database/verify-tls-config-with-external-rds.spec.ts", "**/playwright/e2e/external-database/verify-tls-config-with-external-azure-db.spec.ts", diff --git a/e2e-tests/playwright/e2e/scaffolder-backend-module-annotator.spec.ts b/e2e-tests/playwright/e2e/plugins/scaffolder-backend-module-annotator/annotator.spec.ts similarity index 57% rename from e2e-tests/playwright/e2e/scaffolder-backend-module-annotator.spec.ts rename to e2e-tests/playwright/e2e/plugins/scaffolder-backend-module-annotator/annotator.spec.ts index 0b1d119422..a8032fa450 100644 --- a/e2e-tests/playwright/e2e/scaffolder-backend-module-annotator.spec.ts +++ b/e2e-tests/playwright/e2e/plugins/scaffolder-backend-module-annotator/annotator.spec.ts @@ -1,15 +1,16 @@ -import { expect, Page, test } from "@playwright/test"; -import { UIhelper } from "../utils/ui-helper"; -import { Common, setupBrowser } from "../utils/common"; -import { CatalogImport } from "../support/pages/catalog-import"; -import { APIHelper } from "../utils/api-helper"; -import { GITHUB_API_ENDPOINTS } from "../utils/api-endpoints"; -import { runAccessibilityTests } from "../utils/accessibility"; +import { Page, test } from "@playwright/test"; +import { UIhelper } from "../../../utils/ui-helper"; +import { Common, setupBrowser } from "../../../utils/common"; +import { CatalogImport } from "../../../support/pages/catalog-import"; +import { APIHelper } from "../../../utils/api-helper"; +import { GITHUB_API_ENDPOINTS } from "../../../utils/api-endpoints"; +import { runAccessibilityTests } from "../../../utils/accessibility"; let page: Page; -test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => { +test.describe.serial("Test Scaffolder Backend Module Annotator", () => { test.skip(() => process.env.JOB_NAME.includes("osd-gcp")); // skipping due to RHIDP-5704 on OSD Env + let uiHelper: UIhelper; let common: Common; let catalogImport: CatalogImport; @@ -19,12 +20,11 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => { const reactAppDetails = { owner: "janus-qe/maintainers", - componentName: `test-scaffoldedfromlink-${Date.now()}`, - componentPartialName: `test-scaffoldedfromlink-`, - description: "react app using template", + componentName: `test-annotator-${Date.now()}`, + description: "react app for annotator test", label: "some-label", annotation: "some-annotation", - repo: `test-scaffolded-${Date.now()}`, + repo: `test-annotator-${Date.now()}`, repoOwner: Buffer.from( process.env.GITHUB_ORG || "amFudXMtcWU=", "base64", @@ -34,7 +34,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => { test.beforeAll(async ({ browser }, testInfo) => { test.info().annotations.push({ type: "component", - description: "core", + description: "plugins", }); page = (await setupBrowser(browser, testInfo)).page; @@ -46,7 +46,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => { await common.loginAsGuest(); }); - test("Register a Template", async ({}, testInfo) => { + test("Register the annotator template", async ({}, testInfo) => { await uiHelper.openSidebar("Catalog"); await uiHelper.verifyText("Name"); @@ -57,7 +57,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => { await catalogImport.registerExistingComponent(template, false); }); - test("Create a React App using the newly registered Template", async () => { + test("Scaffold a component using the annotator template", async () => { test.setTimeout(130000); await uiHelper.openSidebar("Catalog"); await uiHelper.clickButton("Self-service"); @@ -108,68 +108,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => { await uiHelper.clickLink("Open in catalog"); }); - test("Verify Scaffolded link in components Dependencies and scaffoldedFrom relation in entity Raw Yaml ", async () => { - await uiHelper.openCatalogSidebar("Component"); - - await uiHelper.searchInputPlaceholder("scaffoldedfromlink-\n"); - await clickOnScaffoldedFromLink(); - - await uiHelper.clickTab("Dependencies"); - - // Define selectors for labels and nodes - const labelSelector = 'g[data-testid="label"]'; // Selector for labels - const nodeSelector = 'g[data-testid="node"]'; // Selector for nodes - - // Verify text inside the 'label' selector - await uiHelper.verifyTextInSelector(labelSelector, "ownerOf"); - await uiHelper.verifyTextInSelector(labelSelector, "/ ownedBy"); - await uiHelper.verifyTextInSelector(labelSelector, "scaffoldedFrom"); - - // Verify text inside the 'node' selector - await uiHelper.verifyPartialTextInSelector( - nodeSelector, - reactAppDetails.componentPartialName, - ); - - await uiHelper.verifyTextInSelector( - nodeSelector, - "Create React App Template", - ); - - // Verify the scaffoldedFrom relation in the YAML view of the entity - await catalogImport.inspectEntityAndVerifyYaml( - `relations: - - type: ownedBy - targetRef: group:janus-qe/maintainers - - type: scaffoldedFrom - targetRef: template:default/create-react-app-template-with-timestamp-entityref - spec: - type: website - lifecycle: experimental - owner: group:janus-qe/maintainers - scaffoldedFrom: template:default/create-react-app-template-with-timestamp-entityref`, - ); - }); - - test("Verify Registered Template and scaffolderOf relation in entity Raw Yaml", async () => { - await uiHelper.openSidebar("Catalog"); - await uiHelper.selectMuiBox("Kind", "Template"); - - await uiHelper.searchInputPlaceholder("Create React App Template\n"); - await uiHelper.verifyRowInTableByUniqueText("Create React App Template", [ - "website", - ]); - await uiHelper.clickLink("Create React App Template"); - - await catalogImport.inspectEntityAndVerifyYaml( - `- type: scaffolderOf\n targetRef: component:default/${reactAppDetails.componentName}\n`, - ); - - await uiHelper.clickLink("Launch Template"); - await uiHelper.verifyText("Provide some simple information"); - }); - - test("Verify Registered Component has templated label in entity Raw Yaml", async () => { + test("Verify custom label is added to scaffolded component", async () => { await uiHelper.openCatalogSidebar("Component"); await uiHelper.searchInputPlaceholder(reactAppDetails.componentName); @@ -184,7 +123,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => { ); }); - test("Verify Registered Component has templated annotation in entity Raw Yaml", async () => { + test("Verify custom annotation is added to scaffolded component", async () => { await uiHelper.openCatalogSidebar("Component"); await uiHelper.searchInputPlaceholder(reactAppDetails.componentName); @@ -199,7 +138,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => { ); }); - test("Verify Registered Component has templated version in entity Raw Yaml", async () => { + test("Verify template version annotation is added to scaffolded component", async () => { await uiHelper.openCatalogSidebar("Component"); await uiHelper.searchInputPlaceholder(reactAppDetails.componentName); @@ -214,7 +153,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => { ); }); - test("Verify Registered Template has templated version in entity Raw Yaml", async () => { + test("Verify template version annotation is present on the template", async () => { await uiHelper.openSidebar("Catalog"); await uiHelper.selectMuiBox("Kind", "Template"); @@ -239,13 +178,5 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => { ); await page.close(); }); - - async function clickOnScaffoldedFromLink() { - const selector = - 'a[href*="/catalog/default/component/test-scaffoldedfromlink-"]'; - await page.locator(selector).first().waitFor({ state: "visible" }); - const link = page.locator(selector).first(); - await expect(link).toBeVisible(); - await link.click(); - } }); + diff --git a/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts b/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts new file mode 100644 index 0000000000..3d6d7f8b46 --- /dev/null +++ b/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts @@ -0,0 +1,163 @@ +import { expect, Page, test } from "@playwright/test"; +import { UIhelper } from "../../../utils/ui-helper"; +import { Common, setupBrowser } from "../../../utils/common"; +import { CatalogImport } from "../../../support/pages/catalog-import"; +import { APIHelper } from "../../../utils/api-helper"; +import { GITHUB_API_ENDPOINTS } from "../../../utils/api-endpoints"; + +let page: Page; + +test.describe.serial("Test Scaffolder Relation Processor Plugin", () => { + test.skip(() => process.env.JOB_NAME.includes("osd-gcp")); // skipping due to RHIDP-5704 on OSD Env + + let uiHelper: UIhelper; + let common: Common; + let catalogImport: CatalogImport; + + const template = + "https://github.com/backstage/community-plugins/blob/main/workspaces/scaffolder-backend-module-annotator/plugins/scaffolder-backend-module-annotator/examples/templates/01-scaffolder-template.yaml"; + + const reactAppDetails = { + owner: "janus-qe/maintainers", + componentName: `test-relation-${Date.now()}`, + componentPartialName: `test-relation-`, + description: "react app for relation processor test", + label: "test-label", + annotation: "test-annotation", + repo: `test-relation-${Date.now()}`, + repoOwner: Buffer.from( + process.env.GITHUB_ORG || "amFudXMtcWU=", + "base64", + ).toString("utf8"), // Default repoOwner janus-qe + }; + + test.beforeAll(async ({ browser }, testInfo) => { + test.info().annotations.push({ + type: "component", + description: "plugins", + }); + + page = (await setupBrowser(browser, testInfo)).page; + + common = new Common(page); + uiHelper = new UIhelper(page); + catalogImport = new CatalogImport(page); + + await common.loginAsGuest(); + }); + + test("Register the template for scaffolder relation processor", async () => { + await uiHelper.openSidebar("Catalog"); + await uiHelper.verifyText("Name"); + + await uiHelper.clickButton("Self-service"); + await uiHelper.clickButton("Import an existing Git repository"); + await catalogImport.registerExistingComponent(template, false); + }); + + test("Scaffold a component to test relation processing", async () => { + test.setTimeout(130000); + await uiHelper.openSidebar("Catalog"); + await uiHelper.clickButton("Self-service"); + await uiHelper.searchInputPlaceholder("Create React App Template"); + await uiHelper.verifyText("Create React App Template"); + await uiHelper.waitForTextDisappear("Add ArgoCD to an existing project"); + await uiHelper.clickButton("Choose"); + + await uiHelper.fillTextInputByLabel("Name", reactAppDetails.componentName); + await uiHelper.fillTextInputByLabel( + "Description", + reactAppDetails.description, + ); + await uiHelper.fillTextInputByLabel("Owner", reactAppDetails.owner); + await uiHelper.fillTextInputByLabel("Label", reactAppDetails.label); + await uiHelper.fillTextInputByLabel( + "Annotation", + reactAppDetails.annotation, + ); + await uiHelper.clickButton("Next"); + + await uiHelper.fillTextInputByLabel("Owner", reactAppDetails.repoOwner); + await uiHelper.fillTextInputByLabel("Repository", reactAppDetails.repo); + await uiHelper.pressTab(); + await uiHelper.clickButton("Review"); + + await uiHelper.clickButton("Create"); + await page.waitForTimeout(5000); + await uiHelper.clickLink("Open in catalog"); + }); + + test("Verify scaffoldedFrom relation in dependency graph and raw YAML", async () => { + // Verify the scaffoldedFrom relation in the YAML view of the entity + await catalogImport.inspectEntityAndVerifyYaml( + `relations: + - type: ownedBy + targetRef: group:janus-qe/maintainers + - type: scaffoldedFrom + targetRef: template:default/create-react-app-template-with-timestamp-entityref + spec: + type: website + lifecycle: experimental + owner: group:janus-qe/maintainers + scaffoldedFrom: template:default/create-react-app-template-with-timestamp-entityref`, + ); + + await uiHelper.openCatalogSidebar("Component"); + await uiHelper.searchInputPlaceholder("test-relation-\n"); + await clickOnRelationTestComponent(); + + await uiHelper.clickTab("Dependencies"); + + // Verify custom relation label in the dependency graph rendered by the catalog-graph plugin + const labelSelector = 'g[data-testid="label"]'; + const nodeSelector = 'g[data-testid="node"]'; + + await uiHelper.verifyTextInSelector(labelSelector, "scaffoldedFrom"); + + await uiHelper.verifyPartialTextInSelector( + nodeSelector, + reactAppDetails.componentPartialName, + ); + }); + + test("Verify scaffolderOf relation on the template", async () => { + await uiHelper.openSidebar("Catalog"); + await uiHelper.selectMuiBox("Kind", "Template"); + + await uiHelper.searchInputPlaceholder("Create React App Template\n"); + await uiHelper.verifyRowInTableByUniqueText("Create React App Template", [ + "website", + ]); + await uiHelper.clickLink("Create React App Template"); + + // Verify the scaffolderOf relation in the YAML view + await catalogImport.inspectEntityAndVerifyYaml( + `- type: scaffolderOf\n targetRef: component:default/${reactAppDetails.componentName}\n`, + ); + + // Verify the template is still functional + await uiHelper.clickLink("Launch Template"); + await uiHelper.verifyText("Provide some simple information"); + }); + + test.afterAll(async () => { + await APIHelper.githubRequest( + "DELETE", + GITHUB_API_ENDPOINTS.deleteRepo( + reactAppDetails.repoOwner, + reactAppDetails.repo, + ), + ); + await page.close(); + }); + + async function clickOnRelationTestComponent() { + const selector = + 'a[href*="/catalog/default/component/test-relation-"]'; + await page.locator(selector).first().waitFor({ state: "visible" }); + const link = page.locator(selector).first(); + await expect(link).toBeVisible(); + await link.click(); + } +}); + diff --git a/packages/app/src/apis.ts b/packages/app/src/apis.ts index 8b43c180ba..5c43ead79b 100644 --- a/packages/app/src/apis.ts +++ b/packages/app/src/apis.ts @@ -119,6 +119,7 @@ export const apis: AnyApiFactory[] = [ ...ALL_RELATION_PAIRS, [RELATION_SCAFFOLDER_OF, RELATION_SCAFFOLDED_FROM], ], + defaultRelationTypes: { exclude: [] } }), }), // OIDC From bcc4f3da141ee2735b8dd31a61bebe089ec49b8a Mon Sep 17 00:00:00 2001 From: Diana Janickova Date: Fri, 16 Jan 2026 10:46:50 +0100 Subject: [PATCH 4/8] chore: fix prettier Signed-off-by: Diana Janickova --- packages/app/src/apis.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/app/src/apis.ts b/packages/app/src/apis.ts index 5c43ead79b..7745ef6a76 100644 --- a/packages/app/src/apis.ts +++ b/packages/app/src/apis.ts @@ -20,13 +20,13 @@ import { ScmIntegrationsApi, scmIntegrationsApiRef, } from '@backstage/integration-react'; -import { UserSettingsStorage } from '@backstage/plugin-user-settings'; import { - ALL_RELATIONS, ALL_RELATION_PAIRS, + ALL_RELATIONS, catalogGraphApiRef, DefaultCatalogGraphApi, } from '@backstage/plugin-catalog-graph'; +import { UserSettingsStorage } from '@backstage/plugin-user-settings'; import { auth0AuthApiRef, @@ -119,7 +119,7 @@ export const apis: AnyApiFactory[] = [ ...ALL_RELATION_PAIRS, [RELATION_SCAFFOLDER_OF, RELATION_SCAFFOLDED_FROM], ], - defaultRelationTypes: { exclude: [] } + defaultRelationTypes: { exclude: [] }, }), }), // OIDC @@ -187,4 +187,4 @@ export const apis: AnyApiFactory[] = [ environment: configApi.getOptionalString('auth.environment'), }), }), -]; \ No newline at end of file +]; From e3e5ac965abff8468f49fb5c1a6dc235c1aecf1f Mon Sep 17 00:00:00 2001 From: Diana Janickova Date: Fri, 16 Jan 2026 10:53:46 +0100 Subject: [PATCH 5/8] chore: run prettier against tests Signed-off-by: Diana Janickova --- .../scaffolder-backend-module-annotator/annotator.spec.ts | 1 - .../scaffolder-relation-processor.spec.ts | 8 +++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/e2e-tests/playwright/e2e/plugins/scaffolder-backend-module-annotator/annotator.spec.ts b/e2e-tests/playwright/e2e/plugins/scaffolder-backend-module-annotator/annotator.spec.ts index a8032fa450..c7e6f9d87e 100644 --- a/e2e-tests/playwright/e2e/plugins/scaffolder-backend-module-annotator/annotator.spec.ts +++ b/e2e-tests/playwright/e2e/plugins/scaffolder-backend-module-annotator/annotator.spec.ts @@ -179,4 +179,3 @@ test.describe.serial("Test Scaffolder Backend Module Annotator", () => { await page.close(); }); }); - diff --git a/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts b/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts index 3d6d7f8b46..4d902e0c99 100644 --- a/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts +++ b/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts @@ -90,7 +90,7 @@ test.describe.serial("Test Scaffolder Relation Processor Plugin", () => { test("Verify scaffoldedFrom relation in dependency graph and raw YAML", async () => { // Verify the scaffoldedFrom relation in the YAML view of the entity await catalogImport.inspectEntityAndVerifyYaml( - `relations: + `relations: - type: ownedBy targetRef: group:janus-qe/maintainers - type: scaffoldedFrom @@ -100,7 +100,7 @@ test.describe.serial("Test Scaffolder Relation Processor Plugin", () => { lifecycle: experimental owner: group:janus-qe/maintainers scaffoldedFrom: template:default/create-react-app-template-with-timestamp-entityref`, - ); + ); await uiHelper.openCatalogSidebar("Component"); await uiHelper.searchInputPlaceholder("test-relation-\n"); @@ -152,12 +152,10 @@ test.describe.serial("Test Scaffolder Relation Processor Plugin", () => { }); async function clickOnRelationTestComponent() { - const selector = - 'a[href*="/catalog/default/component/test-relation-"]'; + const selector = 'a[href*="/catalog/default/component/test-relation-"]'; await page.locator(selector).first().waitFor({ state: "visible" }); const link = page.locator(selector).first(); await expect(link).toBeVisible(); await link.click(); } }); - From 7c44cf9a63a1c136c8e7e517e80571c315a10ccb Mon Sep 17 00:00:00 2001 From: Diana Janickova Date: Tue, 20 Jan 2026 10:57:26 +0100 Subject: [PATCH 6/8] fix: use verifyPartialTextInSelector Signed-off-by: Diana Janickova --- .../scaffolder-relation-processor.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts b/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts index 4d902e0c99..73e3b99bea 100644 --- a/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts +++ b/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts @@ -112,7 +112,7 @@ test.describe.serial("Test Scaffolder Relation Processor Plugin", () => { const labelSelector = 'g[data-testid="label"]'; const nodeSelector = 'g[data-testid="node"]'; - await uiHelper.verifyTextInSelector(labelSelector, "scaffoldedFrom"); + await uiHelper.verifyPartialTextInSelector(labelSelector, "scaffoldedFrom"); await uiHelper.verifyPartialTextInSelector( nodeSelector, From 9ecf97f8c95594cc77cb777ab4d47e47d35c6708 Mon Sep 17 00:00:00 2001 From: Diana Janickova Date: Wed, 21 Jan 2026 09:16:44 +0100 Subject: [PATCH 7/8] ref: use a more precise selector Signed-off-by: Diana Janickova --- .../scaffolder-relation-processor.spec.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts b/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts index 73e3b99bea..fc1384a6ad 100644 --- a/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts +++ b/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts @@ -108,11 +108,10 @@ test.describe.serial("Test Scaffolder Relation Processor Plugin", () => { await uiHelper.clickTab("Dependencies"); - // Verify custom relation label in the dependency graph rendered by the catalog-graph plugin const labelSelector = 'g[data-testid="label"]'; const nodeSelector = 'g[data-testid="node"]'; - await uiHelper.verifyPartialTextInSelector(labelSelector, "scaffoldedFrom"); + await uiHelper.verifyTextInSelector(labelSelector, "scaffolderOf / scaffoldedFrom"); await uiHelper.verifyPartialTextInSelector( nodeSelector, From 2b43ecae4f4ac5a41a49a0a388a42cc54f94d05b Mon Sep 17 00:00:00 2001 From: Diana Janickova Date: Wed, 21 Jan 2026 10:06:39 +0100 Subject: [PATCH 8/8] fix: run prettier Signed-off-by: Diana Janickova --- .../scaffolder-relation-processor.spec.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts b/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts index fc1384a6ad..6b88f71c0f 100644 --- a/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts +++ b/e2e-tests/playwright/e2e/plugins/scaffolder-relation-processor/scaffolder-relation-processor.spec.ts @@ -111,7 +111,10 @@ test.describe.serial("Test Scaffolder Relation Processor Plugin", () => { const labelSelector = 'g[data-testid="label"]'; const nodeSelector = 'g[data-testid="node"]'; - await uiHelper.verifyTextInSelector(labelSelector, "scaffolderOf / scaffoldedFrom"); + await uiHelper.verifyTextInSelector( + labelSelector, + "scaffolderOf / scaffoldedFrom", + ); await uiHelper.verifyPartialTextInSelector( nodeSelector,