Skip to content
This repository was archived by the owner on Sep 11, 2025. It is now read-only.

Commit 4a3748c

Browse files
committed
Scripts to Add Labels to SBOM
Signed-off-by: mrrajan <86094767+mrrajan@users.noreply.github.com.>
1 parent 3daf686 commit 4a3748c

File tree

4 files changed

+129
-2
lines changed

4 files changed

+129
-2
lines changed

tests/ui/features/@sbom-explorer/sbom-explorer.feature

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,21 @@ Feature: SBOM Explorer - View SBOM details
124124
# Bug: https://issues.redhat.com/browse/TC-2598
125125
Examples:
126126
| sbomName |
127-
| quarkus-bom |
127+
| quarkus-bom |
128+
129+
Scenario Outline: Add Labels to SBOM from SBOM List Page
130+
Given An ingested SBOM "<sbomName>" is available
131+
When User Adds Labels "<Labels>" to "<sbomName>" SBOM from List Page
132+
Then The Label list "<Labels>" added to the SBOM "<sbomName>" on List Page
133+
Examples:
134+
| sbomName | Labels |
135+
| quarkus-bom | env=test, list_page, qe_sbom_test |
136+
137+
Scenario Outline: Add Labels to SBOM from SBOM Explorer Page
138+
Given An ingested SBOM "<sbomName>" is available
139+
When User visits SBOM details Page of "<sbomName>"
140+
When User Adds Labels "<Labels>" to "<sbomName>" SBOM from Explorer Page
141+
Then The Label list "<Labels>" added to the SBOM "<sbomName>" on Explorer Page
142+
Examples:
143+
| sbomName | Labels |
144+
| quarkus-bom | env1=test1, explorer_page, qe_sbom_test1 |

tests/ui/features/@sbom-explorer/sbom-explorer.step.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export const { Given, When, Then } = createBdd();
88

99
const PACKAGE_TABLE_NAME = "Package table";
1010
const VULN_TABLE_NAME = "Vulnerability table";
11+
const SBOM_TABLE_NAME = "sbom-table";
1112

1213
Given("An ingested SBOM {string} is available", async ({ page }, sbomName) => {
1314
const searchPage = new SearchPage(page, "SBOMs");
@@ -187,3 +188,40 @@ Then("Sorting of {string} Columns Works", async ({ page }, columnHeaders) => {
187188
const vulnTableTopPagination = `xpath=//div[@id="vulnerability-table-pagination-top"]`;
188189
await toolbarTable.verifySorting(vulnTableTopPagination, headers);
189190
});
191+
192+
When(
193+
"User Adds Labels {string} to {string} SBOM from List Page",
194+
async ({ page }, labelList, sbomName) => {
195+
const toolbarTable = new ToolbarTable(page, SBOM_TABLE_NAME);
196+
await toolbarTable.editLabelsListPage(sbomName);
197+
const detailsPage = new DetailsPage(page);
198+
await detailsPage.addLabels(labelList);
199+
}
200+
);
201+
202+
Then(
203+
"The Label list {string} added to the SBOM {string} on List Page",
204+
async ({ page }, labelList, sbomName) => {
205+
const detailsPage = new DetailsPage(page);
206+
await detailsPage.verifyLabels(labelList, sbomName);
207+
}
208+
);
209+
210+
When(
211+
"User Adds Labels {string} to {string} SBOM from Explorer Page",
212+
async ({ page }, labelList, sbomName) => {
213+
const detailsPage = new DetailsPage(page);
214+
await detailsPage.editLabelsDetailsPage();
215+
await detailsPage.addLabels(labelList);
216+
}
217+
);
218+
219+
Then(
220+
"The Label list {string} added to the SBOM {string} on Explorer Page",
221+
async ({ page }, labelList, sbomName) => {
222+
const detailsPage = new DetailsPage(page);
223+
await detailsPage.selectTab(`Info`);
224+
let infoSection = page.locator("#refTabInfoSection");
225+
detailsPage.verifyLabels(labelList, sbomName, infoSection);
226+
}
227+
);

tests/ui/helpers/DetailsPage.ts

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { expect, Page } from "@playwright/test";
1+
import { expect, Locator, Page } from "@playwright/test";
22

33
/**
44
* Describes the Details of an Entity. E.g. SBOM Details Page.
@@ -153,4 +153,63 @@ export class DetailsPage {
153153
}
154154
return counts;
155155
}
156+
157+
/**
158+
* To click on Edit labels button on Details page
159+
*/
160+
async editLabelsDetailsPage() {
161+
await this.selectTab(`Info`);
162+
await this.page.getByRole("button", { name: "Edit" }).click();
163+
}
164+
165+
/**
166+
* To add labels to edit model window
167+
* @param labels List of labels to add to the entity
168+
*/
169+
async addLabels(labelList: string) {
170+
let labels = labelList.split(",").map((label) => label.trim());
171+
await this.page.getByText("Edit labels").isVisible();
172+
for (let label of labels) {
173+
await this.page.getByPlaceholder("Add label").fill(label);
174+
await this.page.getByPlaceholder("Add label").press("Enter");
175+
}
176+
await this.page.getByLabel("submit").click();
177+
}
178+
179+
/**
180+
* To verify the given labels exist with the Entity
181+
* @param labels List of expected labels
182+
* @param entity Entity name to which the Labels needs to be verified
183+
* @param parentElem Parent element to identify the Labels element - Defaults to List page table rows
184+
*/
185+
async verifyLabels(
186+
labelList: string,
187+
entity: string = "",
188+
parentElem: Locator | undefined = undefined
189+
) {
190+
let labels = labelList.split(",").map((label) => label.trim());
191+
if (!parentElem) {
192+
parentElem = this.page.locator(`xpath=//td[.='${entity}']/parent::tr/td`);
193+
}
194+
//Waiting for Edit label modal window to close
195+
let editLabels = await this.page.getByText("Edit labels");
196+
await editLabels.waitFor({ state: "hidden", timeout: 5000 });
197+
let moreElem = await parentElem.getByRole("button", { name: "more" });
198+
if (await moreElem.isVisible()) {
199+
await moreElem.click();
200+
}
201+
let labelText = `xpath=//ul[@aria-label='Label group category']/li`;
202+
let labelElement0 = await parentElem.locator(
203+
`xpath=//ul[@aria-label='Label group category']/li[.="${labels[0]}"]`
204+
);
205+
await labelElement0.waitFor({ state: "visible", timeout: 5000 });
206+
let labelElements = await parentElem.locator(labelText).all();
207+
for (let elem of labelElements) {
208+
let labelUI = await elem.innerText();
209+
labels = labels.filter((label) => label !== labelUI);
210+
}
211+
expect(labels.length, `Labels missing from the given list ${labels}`).toBe(
212+
0
213+
);
214+
}
156215
}

tests/ui/helpers/ToolbarTable.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,19 @@ export class ToolbarTable {
449449
}
450450
}
451451

452+
/**
453+
* To Add given labels to an SBOM from list page
454+
* @param entity Target SBOM
455+
* @param labels List of Labels
456+
*/
457+
async editLabelsListPage(entity: string) {
458+
await this.waitForTableContent();
459+
let sbomAction = `xpath=//td[.='${entity}']/parent::tr/td/button`;
460+
let table = this.getTable();
461+
await table.locator(sbomAction).click();
462+
await this._page.getByRole("menuitem", { name: "Edit labels" }).click();
463+
}
464+
452465
private getTable() {
453466
return this._page.locator(`table[aria-label="${this._tableName}"]`);
454467
}

0 commit comments

Comments
 (0)