Skip to content

Commit c566a30

Browse files
authored
Merge branch 'release-1.9' into cherry-pick-4003-to-release-1.9
2 parents 9504401 + 803dcd2 commit c566a30

File tree

5 files changed

+298
-109
lines changed

5 files changed

+298
-109
lines changed

e2e-tests/playwright.config.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ export default defineConfig({
117117
"**/playwright/e2e/auth-providers/**/*.spec.ts",
118118
"**/playwright/e2e/plugins/bulk-import.spec.ts",
119119
"**/playwright/e2e/plugins/tekton/tekton.spec.ts",
120-
"**/playwright/e2e/scaffolder-backend-module-annotator.spec.ts",
120+
"**/playwright/e2e/plugins/scaffolder-backend-module-annotator/**/*.spec.ts",
121+
"**/playwright/e2e/plugins/scaffolder-relation-processor/**/*.spec.ts",
121122
"**/playwright/e2e/plugins/ocm.spec.ts",
122123
"**/playwright/e2e/audit-log/**/*.spec.ts",
123124
"**/playwright/e2e/external-database/verify-tls-config-with-external-rds.spec.ts",
@@ -149,7 +150,8 @@ export default defineConfig({
149150
"**/playwright/e2e/auth-providers/**/*.spec.ts",
150151
"**/playwright/e2e/plugins/bulk-import.spec.ts",
151152
"**/playwright/e2e/plugins/tekton/tekton.spec.ts",
152-
"**/playwright/e2e/scaffolder-backend-module-annotator.spec.ts",
153+
"**/playwright/e2e/plugins/scaffolder-backend-module-annotator/**/*.spec.ts",
154+
"**/playwright/e2e/plugins/scaffolder-relation-processor/**/*.spec.ts",
153155
"**/playwright/e2e/audit-log/**/*.spec.ts",
154156
"**/playwright/e2e/external-database/verify-tls-config-with-external-rds.spec.ts",
155157
"**/playwright/e2e/external-database/verify-tls-config-with-external-azure-db.spec.ts",

e2e-tests/playwright/e2e/scaffolder-backend-module-annotator.spec.ts renamed to e2e-tests/playwright/e2e/plugins/scaffolder-backend-module-annotator/annotator.spec.ts

Lines changed: 19 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
import { expect, Page, test } from "@playwright/test";
2-
import { UIhelper } from "../utils/ui-helper";
3-
import { Common, setupBrowser } from "../utils/common";
4-
import { CatalogImport } from "../support/pages/catalog-import";
5-
import { APIHelper } from "../utils/api-helper";
6-
import { GITHUB_API_ENDPOINTS } from "../utils/api-endpoints";
7-
import { runAccessibilityTests } from "../utils/accessibility";
1+
import { Page, test } from "@playwright/test";
2+
import { UIhelper } from "../../../utils/ui-helper";
3+
import { Common, setupBrowser } from "../../../utils/common";
4+
import { CatalogImport } from "../../../support/pages/catalog-import";
5+
import { APIHelper } from "../../../utils/api-helper";
6+
import { GITHUB_API_ENDPOINTS } from "../../../utils/api-endpoints";
7+
import { runAccessibilityTests } from "../../../utils/accessibility";
88

99
let page: Page;
1010

11-
test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => {
12-
test.skip(true, "Disabled on Backstage 1.45 update");
11+
test.describe.serial("Test Scaffolder Backend Module Annotator", () => {
1312
test.skip(() => process.env.JOB_NAME.includes("osd-gcp")); // skipping due to RHIDP-5704 on OSD Env
13+
1414
let uiHelper: UIhelper;
1515
let common: Common;
1616
let catalogImport: CatalogImport;
@@ -20,12 +20,11 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => {
2020

2121
const reactAppDetails = {
2222
owner: "janus-qe/maintainers",
23-
componentName: `test-scaffoldedfromlink-${Date.now()}`,
24-
componentPartialName: `test-scaffoldedfromlink-`,
25-
description: "react app using template",
23+
componentName: `test-annotator-${Date.now()}`,
24+
description: "react app for annotator test",
2625
label: "some-label",
2726
annotation: "some-annotation",
28-
repo: `test-scaffolded-${Date.now()}`,
27+
repo: `test-annotator-${Date.now()}`,
2928
repoOwner: Buffer.from(
3029
process.env.GITHUB_ORG || "amFudXMtcWU=",
3130
"base64",
@@ -35,7 +34,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => {
3534
test.beforeAll(async ({ browser }, testInfo) => {
3635
test.info().annotations.push({
3736
type: "component",
38-
description: "core",
37+
description: "plugins",
3938
});
4039

4140
page = (await setupBrowser(browser, testInfo)).page;
@@ -47,7 +46,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => {
4746
await common.loginAsGuest();
4847
});
4948

50-
test("Register a Template", async ({}, testInfo) => {
49+
test("Register the annotator template", async ({}, testInfo) => {
5150
await uiHelper.openSidebar("Catalog");
5251
await uiHelper.verifyText("Name");
5352

@@ -58,7 +57,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => {
5857
await catalogImport.registerExistingComponent(template, false);
5958
});
6059

61-
test("Create a React App using the newly registered Template", async () => {
60+
test("Scaffold a component using the annotator template", async () => {
6261
test.setTimeout(130000);
6362
await uiHelper.openSidebar("Catalog");
6463
await uiHelper.clickButton("Self-service");
@@ -109,68 +108,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => {
109108
await uiHelper.clickLink("Open in catalog");
110109
});
111110

112-
test("Verify Scaffolded link in components Dependencies and scaffoldedFrom relation in entity Raw Yaml ", async () => {
113-
await uiHelper.openCatalogSidebar("Component");
114-
115-
await uiHelper.searchInputPlaceholder("scaffoldedfromlink-\n");
116-
await clickOnScaffoldedFromLink();
117-
118-
await uiHelper.clickTab("Dependencies");
119-
120-
// Define selectors for labels and nodes
121-
const labelSelector = 'g[data-testid="label"]'; // Selector for labels
122-
const nodeSelector = 'g[data-testid="node"]'; // Selector for nodes
123-
124-
// Verify text inside the 'label' selector
125-
await uiHelper.verifyTextInSelector(labelSelector, "ownerOf");
126-
await uiHelper.verifyTextInSelector(labelSelector, "/ ownedBy");
127-
await uiHelper.verifyTextInSelector(labelSelector, "scaffoldedFrom");
128-
129-
// Verify text inside the 'node' selector
130-
await uiHelper.verifyPartialTextInSelector(
131-
nodeSelector,
132-
reactAppDetails.componentPartialName,
133-
);
134-
135-
await uiHelper.verifyTextInSelector(
136-
nodeSelector,
137-
"Create React App Template",
138-
);
139-
140-
// Verify the scaffoldedFrom relation in the YAML view of the entity
141-
await catalogImport.inspectEntityAndVerifyYaml(
142-
`relations:
143-
- type: ownedBy
144-
targetRef: group:janus-qe/maintainers
145-
- type: scaffoldedFrom
146-
targetRef: template:default/create-react-app-template-with-timestamp-entityref
147-
spec:
148-
type: website
149-
lifecycle: experimental
150-
owner: group:janus-qe/maintainers
151-
scaffoldedFrom: template:default/create-react-app-template-with-timestamp-entityref`,
152-
);
153-
});
154-
155-
test("Verify Registered Template and scaffolderOf relation in entity Raw Yaml", async () => {
156-
await uiHelper.openSidebar("Catalog");
157-
await uiHelper.selectMuiBox("Kind", "Template");
158-
159-
await uiHelper.searchInputPlaceholder("Create React App Template\n");
160-
await uiHelper.verifyRowInTableByUniqueText("Create React App Template", [
161-
"website",
162-
]);
163-
await uiHelper.clickLink("Create React App Template");
164-
165-
await catalogImport.inspectEntityAndVerifyYaml(
166-
`- type: scaffolderOf\n targetRef: component:default/${reactAppDetails.componentName}\n`,
167-
);
168-
169-
await uiHelper.clickLink("Launch Template");
170-
await uiHelper.verifyText("Provide some simple information");
171-
});
172-
173-
test("Verify Registered Component has templated label in entity Raw Yaml", async () => {
111+
test("Verify custom label is added to scaffolded component", async () => {
174112
await uiHelper.openCatalogSidebar("Component");
175113
await uiHelper.searchInputPlaceholder(reactAppDetails.componentName);
176114

@@ -185,7 +123,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => {
185123
);
186124
});
187125

188-
test("Verify Registered Component has templated annotation in entity Raw Yaml", async () => {
126+
test("Verify custom annotation is added to scaffolded component", async () => {
189127
await uiHelper.openCatalogSidebar("Component");
190128
await uiHelper.searchInputPlaceholder(reactAppDetails.componentName);
191129

@@ -200,7 +138,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => {
200138
);
201139
});
202140

203-
test("Verify Registered Component has templated version in entity Raw Yaml", async () => {
141+
test("Verify template version annotation is added to scaffolded component", async () => {
204142
await uiHelper.openCatalogSidebar("Component");
205143
await uiHelper.searchInputPlaceholder(reactAppDetails.componentName);
206144

@@ -215,7 +153,7 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => {
215153
);
216154
});
217155

218-
test("Verify Registered Template has templated version in entity Raw Yaml", async () => {
156+
test("Verify template version annotation is present on the template", async () => {
219157
await uiHelper.openSidebar("Catalog");
220158
await uiHelper.selectMuiBox("Kind", "Template");
221159

@@ -240,13 +178,4 @@ test.describe.serial("Test Scaffolder Backend Module Annotator Actions", () => {
240178
);
241179
await page.close();
242180
});
243-
244-
async function clickOnScaffoldedFromLink() {
245-
const selector =
246-
'a[href*="/catalog/default/component/test-scaffoldedfromlink-"]';
247-
await page.locator(selector).first().waitFor({ state: "visible" });
248-
const link = page.locator(selector).first();
249-
await expect(link).toBeVisible();
250-
await link.click();
251-
}
252181
});
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
import { expect, Page, test } from "@playwright/test";
2+
import { UIhelper } from "../../../utils/ui-helper";
3+
import { Common, setupBrowser } from "../../../utils/common";
4+
import { CatalogImport } from "../../../support/pages/catalog-import";
5+
import { APIHelper } from "../../../utils/api-helper";
6+
import { GITHUB_API_ENDPOINTS } from "../../../utils/api-endpoints";
7+
8+
let page: Page;
9+
10+
test.describe.serial("Test Scaffolder Relation Processor Plugin", () => {
11+
test.skip(() => process.env.JOB_NAME.includes("osd-gcp")); // skipping due to RHIDP-5704 on OSD Env
12+
13+
let uiHelper: UIhelper;
14+
let common: Common;
15+
let catalogImport: CatalogImport;
16+
17+
const template =
18+
"https://github.com/backstage/community-plugins/blob/main/workspaces/scaffolder-backend-module-annotator/plugins/scaffolder-backend-module-annotator/examples/templates/01-scaffolder-template.yaml";
19+
20+
const reactAppDetails = {
21+
owner: "janus-qe/maintainers",
22+
componentName: `test-relation-${Date.now()}`,
23+
componentPartialName: `test-relation-`,
24+
description: "react app for relation processor test",
25+
label: "test-label",
26+
annotation: "test-annotation",
27+
repo: `test-relation-${Date.now()}`,
28+
repoOwner: Buffer.from(
29+
process.env.GITHUB_ORG || "amFudXMtcWU=",
30+
"base64",
31+
).toString("utf8"), // Default repoOwner janus-qe
32+
};
33+
34+
test.beforeAll(async ({ browser }, testInfo) => {
35+
test.info().annotations.push({
36+
type: "component",
37+
description: "plugins",
38+
});
39+
40+
page = (await setupBrowser(browser, testInfo)).page;
41+
42+
common = new Common(page);
43+
uiHelper = new UIhelper(page);
44+
catalogImport = new CatalogImport(page);
45+
46+
await common.loginAsGuest();
47+
});
48+
49+
test("Register the template for scaffolder relation processor", async () => {
50+
await uiHelper.openSidebar("Catalog");
51+
await uiHelper.verifyText("Name");
52+
53+
await uiHelper.clickButton("Self-service");
54+
await uiHelper.clickButton("Import an existing Git repository");
55+
await catalogImport.registerExistingComponent(template, false);
56+
});
57+
58+
test("Scaffold a component to test relation processing", async () => {
59+
test.setTimeout(130000);
60+
await uiHelper.openSidebar("Catalog");
61+
await uiHelper.clickButton("Self-service");
62+
await uiHelper.searchInputPlaceholder("Create React App Template");
63+
await uiHelper.verifyText("Create React App Template");
64+
await uiHelper.waitForTextDisappear("Add ArgoCD to an existing project");
65+
await uiHelper.clickButton("Choose");
66+
67+
await uiHelper.fillTextInputByLabel("Name", reactAppDetails.componentName);
68+
await uiHelper.fillTextInputByLabel(
69+
"Description",
70+
reactAppDetails.description,
71+
);
72+
await uiHelper.fillTextInputByLabel("Owner", reactAppDetails.owner);
73+
await uiHelper.fillTextInputByLabel("Label", reactAppDetails.label);
74+
await uiHelper.fillTextInputByLabel(
75+
"Annotation",
76+
reactAppDetails.annotation,
77+
);
78+
await uiHelper.clickButton("Next");
79+
80+
await uiHelper.fillTextInputByLabel("Owner", reactAppDetails.repoOwner);
81+
await uiHelper.fillTextInputByLabel("Repository", reactAppDetails.repo);
82+
await uiHelper.pressTab();
83+
await uiHelper.clickButton("Review");
84+
85+
await uiHelper.clickButton("Create");
86+
await page.waitForTimeout(5000);
87+
await uiHelper.clickLink("Open in catalog");
88+
});
89+
90+
test("Verify scaffoldedFrom relation in dependency graph and raw YAML", async () => {
91+
// Verify the scaffoldedFrom relation in the YAML view of the entity
92+
await catalogImport.inspectEntityAndVerifyYaml(
93+
`relations:
94+
- type: ownedBy
95+
targetRef: group:janus-qe/maintainers
96+
- type: scaffoldedFrom
97+
targetRef: template:default/create-react-app-template-with-timestamp-entityref
98+
spec:
99+
type: website
100+
lifecycle: experimental
101+
owner: group:janus-qe/maintainers
102+
scaffoldedFrom: template:default/create-react-app-template-with-timestamp-entityref`,
103+
);
104+
105+
await uiHelper.openCatalogSidebar("Component");
106+
await uiHelper.searchInputPlaceholder("test-relation-\n");
107+
await clickOnRelationTestComponent();
108+
109+
await uiHelper.clickTab("Dependencies");
110+
111+
const labelSelector = 'g[data-testid="label"]';
112+
const nodeSelector = 'g[data-testid="node"]';
113+
114+
await uiHelper.verifyTextInSelector(
115+
labelSelector,
116+
"scaffolderOf / scaffoldedFrom",
117+
);
118+
119+
await uiHelper.verifyPartialTextInSelector(
120+
nodeSelector,
121+
reactAppDetails.componentPartialName,
122+
);
123+
});
124+
125+
test("Verify scaffolderOf relation on the template", async () => {
126+
await uiHelper.openSidebar("Catalog");
127+
await uiHelper.selectMuiBox("Kind", "Template");
128+
129+
await uiHelper.searchInputPlaceholder("Create React App Template\n");
130+
await uiHelper.verifyRowInTableByUniqueText("Create React App Template", [
131+
"website",
132+
]);
133+
await uiHelper.clickLink("Create React App Template");
134+
135+
// Verify the scaffolderOf relation in the YAML view
136+
await catalogImport.inspectEntityAndVerifyYaml(
137+
`- type: scaffolderOf\n targetRef: component:default/${reactAppDetails.componentName}\n`,
138+
);
139+
140+
// Verify the template is still functional
141+
await uiHelper.clickLink("Launch Template");
142+
await uiHelper.verifyText("Provide some simple information");
143+
});
144+
145+
test.afterAll(async () => {
146+
await APIHelper.githubRequest(
147+
"DELETE",
148+
GITHUB_API_ENDPOINTS.deleteRepo(
149+
reactAppDetails.repoOwner,
150+
reactAppDetails.repo,
151+
),
152+
);
153+
await page.close();
154+
});
155+
156+
async function clickOnRelationTestComponent() {
157+
const selector = 'a[href*="/catalog/default/component/test-relation-"]';
158+
await page.locator(selector).first().waitFor({ state: "visible" });
159+
const link = page.locator(selector).first();
160+
await expect(link).toBeVisible();
161+
await link.click();
162+
}
163+
});

0 commit comments

Comments
 (0)