Skip to content

Commit 8a67955

Browse files
committed
address refactoring suggestion to use pom and fixtures
1 parent 1ab1926 commit 8a67955

File tree

4 files changed

+286
-86
lines changed

4 files changed

+286
-86
lines changed

portal-ui/e2e/lifecycle.spec.ts

Lines changed: 70 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -14,116 +14,100 @@
1414
// You should have received a copy of the GNU Affero General Public License
1515
// along with this program. If not, see <http://www.gnu.org/licenses/>.
1616

17-
import { expect } from "@playwright/test";
18-
import { test } from "./fixtures/baseFixture";
17+
import { expect, Page } from "@playwright/test";
18+
import { test as baseTest } from "./fixtures/baseFixture";
1919
import { minioadminFile } from "./consts";
20-
import { BUCKET_LIST_PAGE } from "./consts";
20+
import { BucketsListPage } from "./pom/BucketsListPage";
21+
import { CreateBucketPage } from "./pom/CreateBucketPage";
22+
import { BucketSummaryPage } from "./pom/BucketSummaryPage";
23+
24+
type LifeCycleObjectVersionFx = {
25+
activeBucketName: string;
26+
bucketsListPage: BucketsListPage;
27+
createBucketPage: CreateBucketPage;
28+
bucketSummaryPage: any;
29+
};
30+
31+
const test = baseTest.extend<LifeCycleObjectVersionFx>({
32+
activeBucketName: "",
33+
bucketListPage: async ({ page }: { page: Page }, use: any) => {
34+
let bucketListPage = new BucketsListPage(page);
35+
await bucketListPage.loadPage();
36+
await bucketListPage.goToCreateBucket();
37+
await use(bucketListPage);
38+
},
39+
createBucketPage: async ({ page }: { page: Page }, use: any) => {
40+
let createBucketPage = new CreateBucketPage(page);
41+
await use(createBucketPage);
42+
},
43+
//bucket name is dynamic in parallel test runs.
44+
bucketSummaryPage: async ({ page }: { page: Page }, use: any) => {
45+
await use((bucketName: string) => {
46+
return new BucketSummaryPage(page, bucketName);
47+
});
48+
},
49+
});
2150

2251
test.use({ storageState: minioadminFile });
2352

24-
const bucketListLocPrefix = "#manageBucket";
2553
const versionedBucketName = "versioned-bucket";
2654
const nonVersionedBucketName = "non-versioned-bucket";
2755

2856
test.describe("Add Lifecycle Rule Modal in bucket settings tests for object version ", () => {
29-
test.beforeEach(async ({ page }) => {
30-
await page.goto(BUCKET_LIST_PAGE);
31-
});
32-
3357
test("Test if Object Version selector is present in Lifecycle rule modal", async ({
3458
page,
59+
bucketListPage,
60+
createBucketPage,
61+
bucketSummaryPage,
3562
}) => {
36-
const bucketLocatorEl = `${bucketListLocPrefix}-${versionedBucketName}`;
37-
38-
await test.step(`Create bucket`, async () => {
39-
await page.locator("#create-bucket").click();
40-
await page.getByLabel("Bucket Name*").click();
41-
await page.getByLabel("Bucket Name*").type(versionedBucketName);
42-
await page.locator("#versioned").check();
43-
await page.getByRole("button", { name: "Create Bucket" }).click();
44-
});
45-
46-
await test.step("Navigate to manage bucket", async () => {
47-
await page.locator(bucketLocatorEl).click();
48-
await page.getByRole("tab", { name: "Lifecycle" }).click();
49-
});
50-
51-
const result =
52-
await test.step("Trigger Add Lifecycle Rule Modal and verify", async () => {
53-
await page.getByRole("button", { name: "Add Lifecycle Rule" }).click();
54-
return await page.locator("#object_version");
55-
});
56-
57-
await expect(result).toBeTruthy();
58-
59-
await test.step("Close confirm Modal", async () => {
60-
await page.locator("#close").click();
63+
await test.step("Create Versioned Bucket", async () => {
64+
await createBucketPage.createVersionedBucket(versionedBucketName);
65+
await bucketListPage.clickOnBucketRow(versionedBucketName);
66+
bucketSummaryPage = bucketSummaryPage(versionedBucketName);
67+
await bucketSummaryPage.clickOnTab("Lifecycle"); //Tab Text is used.
6168
});
6269

63-
await test.step("List Bucket", async () => {
64-
await page.goto(BUCKET_LIST_PAGE);
65-
await page.locator(bucketLocatorEl).click();
70+
await test.step("Check if object version option is available on a versioned bucket", async () => {
71+
const objectVersionsEl = await bucketSummaryPage.getObjectVersionOption();
72+
await expect(await objectVersionsEl).toHaveText("Current Version");
73+
await expect(await objectVersionsEl).toBeTruthy();
74+
await bucketSummaryPage.getLocator("#close").click();
6675
});
6776

68-
await test.step("Click on delete bucket and confirm", async () => {
69-
await page.locator("#delete-bucket-button").click();
70-
await page.locator("#confirm-ok").click();
77+
await test.step("Clean up bucket and verify the clean up", async () => {
78+
await bucketSummaryPage.confirmDeleteBucket();
79+
const existBukCount = await bucketListPage.isBucketExist(
80+
versionedBucketName
81+
);
82+
await expect(existBukCount).toEqual(0);
7183
});
72-
73-
const bucketListItemCount =
74-
await test.step("Verify the bucket deletion ", async () => {
75-
const listItemsCount = await page.locator(bucketLocatorEl);
76-
return listItemsCount.count();
77-
});
78-
79-
await expect(bucketListItemCount).toEqual(0);
8084
});
8185

82-
test("Test if Object Version selector is not present when bucket is not versioned", async ({
86+
test("Test if Object Version selector is NOT present in Lifecycle rule modal", async ({
8387
page,
88+
createBucketPage,
89+
bucketListPage,
90+
bucketSummaryPage,
8491
}) => {
85-
const bucketLocatorEl = `${bucketListLocPrefix}-${nonVersionedBucketName}`;
86-
87-
await test.step(`Create bucket`, async () => {
88-
await page.locator("#create-bucket").click();
89-
await page.getByLabel("Bucket Name*").click();
90-
await page.getByLabel("Bucket Name*").type(nonVersionedBucketName);
91-
await page.getByRole("button", { name: "Create Bucket" }).click();
92+
await test.step("Create NON Versioned Bucket and navigate to lifecycle settings in summary page", async () => {
93+
await createBucketPage.createBucket(nonVersionedBucketName);
94+
await bucketListPage.clickOnBucketRow(nonVersionedBucketName);
95+
bucketSummaryPage = bucketSummaryPage(versionedBucketName);
96+
await bucketSummaryPage.clickOnTab("Lifecycle");
9297
});
9398

94-
await test.step("Navigate to manage bucket", async () => {
95-
await page.locator(bucketLocatorEl).click();
96-
await page.getByRole("tab", { name: "Lifecycle" }).click();
99+
await test.step("Check if object version option is NOT available on a non versioned bucket", async () => {
100+
const objectVersionsEl = await bucketSummaryPage.getObjectVersionOption();
101+
await expect(await objectVersionsEl.count()).toEqual(0);
102+
await bucketSummaryPage.getLocator("#close").click();
97103
});
98104

99-
const result =
100-
await test.step("Trigger Add Lifecycle Rule Modal and verify", async () => {
101-
await page.getByRole("button", { name: "Add Lifecycle Rule" }).click();
102-
return await page.locator("#object_version").count();
103-
});
104-
105-
await expect(result).toEqual(0);
106-
107-
await test.step("Close confirm Modal", async () => {
108-
await page.locator("#close").click();
105+
await test.step("Clean up bucket and verify the clean up", async () => {
106+
await bucketSummaryPage.confirmDeleteBucket();
107+
const existBukCount = await bucketListPage.isBucketExist(
108+
nonVersionedBucketName
109+
);
110+
await expect(existBukCount).toEqual(0);
109111
});
110-
111-
await test.step("List bucket", async () => {
112-
await page.goto(BUCKET_LIST_PAGE);
113-
await page.locator(bucketLocatorEl).click();
114-
});
115-
116-
await test.step("Delete bucket ", async () => {
117-
await page.locator("#delete-bucket-button").click();
118-
await page.locator("#confirm-ok").click();
119-
});
120-
121-
const bucketListItemCount =
122-
await test.step("Verify the bucket deletion ", async () => {
123-
const listItemsCount = await page.locator(bucketLocatorEl);
124-
return listItemsCount.count();
125-
});
126-
127-
await expect(bucketListItemCount).toEqual(0);
128112
});
129113
});
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { Page, Locator } from "@playwright/test";
2+
3+
export class BucketSummaryPage {
4+
page: Page;
5+
bucketName: string;
6+
7+
/* Locators */
8+
deleteBucketBtn: Locator | undefined;
9+
10+
constructor(page: Page, bucketName: string) {
11+
this.page = page;
12+
this.bucketName = bucketName;
13+
14+
this.initLocators();
15+
}
16+
getLocator(selector: string): Locator {
17+
const page = this.page;
18+
const locator: Locator = page.locator(`${selector}`);
19+
return locator;
20+
}
21+
22+
initLocators() {
23+
this.deleteBucketBtn = this.getLocator("#delete-bucket-button");
24+
}
25+
26+
async loadPage() {
27+
await this.clickOnTab(`Summary`);
28+
}
29+
30+
async clickOnTab(tabName: string) {
31+
const page = this.page;
32+
await page.getByRole("tab", { name: tabName }).click();
33+
34+
// await page.goto(`${BUCKET_LIST_PAGE}/${this.bucketName}/admin/${tabName}`);
35+
}
36+
37+
async confirmDeleteBucket() {
38+
await this.getLocator("#delete-bucket-button").click();
39+
await this.getLocator("#confirm-ok").click();
40+
}
41+
42+
async getObjectVersionOption() {
43+
await this.page.getByRole("button", { name: "Add Lifecycle Rule" }).click();
44+
return this.getLocator("#object_version");
45+
}
46+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { Page, Locator } from "@playwright/test";
2+
import { BUCKET_LIST_PAGE } from "../consts";
3+
4+
export class BucketsListPage {
5+
page: Page;
6+
7+
/* Locators */
8+
9+
createBucketBtn: Locator | undefined;
10+
refreshBucketsBtn: Locator | undefined;
11+
setReplicationBtn: Locator | undefined;
12+
13+
bucketListItemPrefix = "#manageBucket-";
14+
15+
constructor(page: Page) {
16+
this.page = page;
17+
this.initLocators();
18+
}
19+
getLocator(selector: string): Locator {
20+
const page = this.page;
21+
const locator: Locator = page.locator(`${selector}`);
22+
return locator;
23+
}
24+
25+
initLocators() {
26+
this.createBucketBtn = this.getLocator("#create-bucket");
27+
this.refreshBucketsBtn = this.getLocator("#refresh-buckets");
28+
this.setReplicationBtn = this.getLocator("#set-replication");
29+
}
30+
31+
locateBucket(bucketName: string): Locator {
32+
const bucketRow = this.getLocator(
33+
`${this.bucketListItemPrefix}${bucketName}`
34+
);
35+
return bucketRow;
36+
}
37+
38+
async clickOnBucketRow(bucketName: string) {
39+
const bucketRow = this.locateBucket(bucketName);
40+
await bucketRow.click();
41+
}
42+
async goToCreateBucket() {
43+
await this.createBucketBtn?.click();
44+
}
45+
46+
async isBucketExist(bucketName: string) {
47+
const existBukCount = await this.locateBucket(bucketName).count();
48+
49+
return existBukCount;
50+
}
51+
52+
async loadPage() {
53+
const page = this.page;
54+
await page.goto(BUCKET_LIST_PAGE);
55+
}
56+
}

0 commit comments

Comments
 (0)