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

Commit 4b2f4b6

Browse files
Add more tests
1 parent 6c5e8d8 commit 4b2f4b6

36 files changed

+779
-26
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { expect, Page } from "@playwright/test";
2+
import { DetailsPageLayout } from "../DetailsPageLayout";
3+
import { Navigation } from "../Navigation";
4+
import { VulnerabilityListPage } from "../vulnerability-list/VulnerabilityListPage";
5+
import { PackageListPage } from "../package-list/PackageListPage";
6+
7+
export class PackageDetailsPage {
8+
private readonly _page: Page;
9+
_layout: DetailsPageLayout;
10+
11+
private constructor(page: Page, layout: DetailsPageLayout) {
12+
this._page = page;
13+
this._layout = layout;
14+
}
15+
16+
static async build(page: Page, packageName: string) {
17+
const navigation = await Navigation.build(page);
18+
await navigation.goToSidebar("Packages");
19+
20+
const listPage = await PackageListPage.build(page);
21+
const toolbar = await listPage.getToolbar();
22+
const table = await listPage.getTable();
23+
24+
await toolbar.applyTextFilter("Filter text", packageName);
25+
await table.waitUntilDataIsLoaded();
26+
await table.verifyColumnContainsText("Name", packageName);
27+
28+
await page.getByRole("link", { name: packageName, exact: true }).click();
29+
30+
const layout = await DetailsPageLayout.build(page);
31+
await expect(
32+
page.getByRole("heading", { name: packageName })
33+
).toBeVisible();
34+
35+
return new PackageDetailsPage(page, layout);
36+
}
37+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// @ts-check
2+
3+
import { test } from "@playwright/test";
4+
5+
import { login } from "../../../helpers/Auth";
6+
import { PackageDetailsPage } from "../PackageDetailsPage";
7+
8+
test.describe("Info Tab validations", { tag: "@tier1" }, () => {
9+
test.beforeEach(async ({ page }) => {
10+
await login(page);
11+
});
12+
13+
test("Labels", async ({ page }) => {
14+
await PackageDetailsPage.build(page, "keycloak-core");
15+
// Verify
16+
});
17+
});
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { Page } from "@playwright/test";
2+
import { PackageDetailsPage } from "../PackageDetailsPage";
3+
import { Toolbar } from "../../Toolbar";
4+
import { Table } from "../../Table";
5+
import { Pagination } from "../../Pagination";
6+
7+
export class SbomsTab {
8+
private readonly _page: Page;
9+
_detailsPage: PackageDetailsPage;
10+
11+
private constructor(page: Page, layout: PackageDetailsPage) {
12+
this._page = page;
13+
this._detailsPage = layout;
14+
}
15+
16+
static async build(page: Page, packageName: string) {
17+
const detailsPage = await PackageDetailsPage.build(page, packageName);
18+
await detailsPage._layout.selectTab("SBOMs using package");
19+
20+
return new SbomsTab(page, detailsPage);
21+
}
22+
23+
async getToolbar() {
24+
return await Toolbar.build(this._page, "SBOM toolbar");
25+
}
26+
27+
async getTable() {
28+
return await Table.build(this._page, "SBOM table");
29+
}
30+
31+
async getPagination(top: boolean = true) {
32+
return await Pagination.build(
33+
this._page,
34+
`sbom-table-pagination-${top ? "top" : "bottom"}`
35+
);
36+
}
37+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// @ts-check
2+
3+
import { expect, test } from "@playwright/test";
4+
5+
import { login } from "../../../helpers/Auth";
6+
import { SbomsTab } from "./SbomsTab";
7+
8+
test.describe("Columns validations", { tag: "@tier1" }, () => {
9+
test.beforeEach(async ({ page }) => {
10+
await login(page);
11+
});
12+
13+
test("Columns", async ({ page }) => {
14+
const sbomTab = await SbomsTab.build(page, "keycloak-core");
15+
const table = await sbomTab.getTable();
16+
17+
const ids = await table._table
18+
.locator(`td[data-label="Name"]`)
19+
.allInnerTexts();
20+
const idIndex = ids.indexOf("quarkus-bom");
21+
expect(idIndex).not.toBe(-1);
22+
23+
// Name
24+
await expect(
25+
table._table.locator(`td[data-label="Name"]`).nth(idIndex)
26+
).toContainText("quarkus-bom");
27+
28+
// Version
29+
await expect(
30+
table._table.locator(`td[data-label="Version"]`).nth(idIndex)
31+
).toContainText("2.13.8.Final-redhat-00004");
32+
33+
// Supplier
34+
await expect(
35+
table._table.locator(`td[data-label="Supplier"]`).nth(idIndex)
36+
).toContainText("Organization: Red Hat");
37+
});
38+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// @ts-check
2+
3+
import { test } from "@playwright/test";
4+
5+
import { login } from "../../../helpers/Auth";
6+
import { SbomsTab } from "./SbomsTab";
7+
8+
// Tables does not have filters
9+
test.describe.skip("Filter validations", { tag: "@tier1" }, () => {
10+
test.beforeEach(async ({ page }) => {
11+
await login(page);
12+
});
13+
14+
test("Filters", async ({ page }) => {
15+
await SbomsTab.build(page, "keycloak-core");
16+
});
17+
});
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// @ts-check
2+
3+
import { test } from "@playwright/test";
4+
5+
import { login } from "../../../helpers/Auth";
6+
import { SbomsTab } from "./SbomsTab";
7+
8+
// Number of items in table are below single page to be able to test
9+
// Inf a Vulnerability that contains significant number of impacted SBOMs
10+
test.describe.skip("Pagination validations", { tag: "@tier1" }, () => {
11+
test.beforeEach(async ({ page }) => {
12+
await login(page);
13+
});
14+
15+
test("Navigation button validations", async ({ page }) => {
16+
const sbomTab = await SbomsTab.build(page, "keycloak-core");
17+
const pagination = await sbomTab.getPagination();
18+
19+
await pagination.validatePagination();
20+
});
21+
22+
test("Items per page validations", async ({ page }) => {
23+
const sbomTab = await SbomsTab.build(page, "keycloak-core");
24+
25+
const pagination = await sbomTab.getPagination();
26+
const table = await sbomTab.getTable();
27+
28+
await pagination.validateItemsPerPage("Name", table);
29+
});
30+
});
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// @ts-check
2+
3+
import { test } from "@playwright/test";
4+
5+
import { login } from "../../../helpers/Auth";
6+
import { SbomsTab } from "./SbomsTab";
7+
import { expectSort } from "../../Constants";
8+
9+
test.describe("Sort validations", { tag: "@tier1" }, () => {
10+
test.beforeEach(async ({ page }) => {
11+
await login(page);
12+
});
13+
14+
test("Sort", async ({ page }) => {
15+
const sbomTab = await SbomsTab.build(page, "keycloak-core");
16+
const table = await sbomTab.getTable();
17+
18+
const columnNameSelector = table._table.locator(`td[data-label="Name"]`);
19+
20+
const ascList = await columnNameSelector.allInnerTexts();
21+
expectSort(ascList, true);
22+
23+
// Reverse sorting
24+
await table.clickSortBy("Name");
25+
const descList = await columnNameSelector.allInnerTexts();
26+
expectSort(descList, false);
27+
});
28+
});
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { Page } from "@playwright/test";
2+
import { PackageDetailsPage } from "../PackageDetailsPage";
3+
import { Toolbar } from "../../Toolbar";
4+
import { Table } from "../../Table";
5+
import { Pagination } from "../../Pagination";
6+
7+
export class VulnerabilitiesTab {
8+
private readonly _page: Page;
9+
_detailsPage: PackageDetailsPage;
10+
11+
private constructor(page: Page, layout: PackageDetailsPage) {
12+
this._page = page;
13+
this._detailsPage = layout;
14+
}
15+
16+
static async build(page: Page, packageName: string) {
17+
const detailsPage = await PackageDetailsPage.build(page, packageName);
18+
await detailsPage._layout.selectTab("Vulnerabilities");
19+
20+
return new VulnerabilitiesTab(page, detailsPage);
21+
}
22+
23+
async getToolbar() {
24+
return await Toolbar.build(this._page, "vulnerability toolbar");
25+
}
26+
27+
async getTable() {
28+
return await Table.build(this._page, "vulnerability table");
29+
}
30+
31+
async getPagination(top: boolean = true) {
32+
return await Pagination.build(
33+
this._page,
34+
`vulnerability-table-pagination-${top ? "top" : "bottom"}`
35+
);
36+
}
37+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// @ts-check
2+
3+
import { expect, test } from "@playwright/test";
4+
5+
import { login } from "../../../helpers/Auth";
6+
import { VulnerabilitiesTab } from "./VulnerabilitiesTab";
7+
8+
test.describe("Columns validations", { tag: "@tier1" }, () => {
9+
test.beforeEach(async ({ page }) => {
10+
await login(page);
11+
});
12+
13+
test("Columns", async ({ page }) => {
14+
const vulnerabilitiesTab = await VulnerabilitiesTab.build(
15+
page,
16+
"keycloak-core"
17+
);
18+
const table = await vulnerabilitiesTab.getTable();
19+
20+
const ids = await table._table
21+
.locator(`td[data-label="ID"]`)
22+
.allInnerTexts();
23+
const idIndex = ids.indexOf("CVE-2023-1664");
24+
expect(idIndex).not.toBe(-1);
25+
26+
// Name
27+
await expect(
28+
table._table.locator(`td[data-label="ID"]`).nth(idIndex)
29+
).toContainText("CVE-2023-1664");
30+
31+
// Title
32+
await expect(
33+
table._table.locator(`td[data-label="CVSS"]`).nth(idIndex)
34+
).toContainText("Medium(6.5)");
35+
});
36+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// @ts-check
2+
3+
import { test } from "@playwright/test";
4+
5+
import { login } from "../../../helpers/Auth";
6+
import { VulnerabilitiesTab } from "./VulnerabilitiesTab";
7+
8+
// Tables does not have filters
9+
test.describe.skip("Filter validations", { tag: "@tier1" }, () => {
10+
test.beforeEach(async ({ page }) => {
11+
await login(page);
12+
});
13+
14+
test("Filters", async ({ page }) => {
15+
await VulnerabilitiesTab.build(page, "keycloak-core");
16+
});
17+
});

0 commit comments

Comments
 (0)