Skip to content

Commit 7dcf1d6

Browse files
committed
e2e(FR-759): add delete and delete-forever test case (#3445)
resolves #3450 (FR-759) # Refactor VFolder E2E Tests with Improved Test Utilities This PR adds new utility functions for VFolder operations in E2E tests: 1. Added `verifyVFolder` utility function to check folder visibility in the data view 2. Replaced `deleteVFolderAndVerify` with two more specific functions: - `moveToTrashAndVerify`: Moves a folder to trash and verifies it appears there - `deleteForeverAndVerifyFromTrash`: Permanently deletes a folder from trash and verifies it's gone The new functions better reflect the actual user workflow of first moving items to trash before permanent deletion, and use the new UI components rather than the old Vaadin grid elements. All existing test cases have been updated to use these new utility functions, making the tests more maintainable and accurate. **Checklist:** - [ ] Documentation - [ ] Minium required manager version - [ ] Specific setting for review (eg., KB link, endpoint or how to setup) - [ ] Minimum requirements to check during review - [ ] Test case(s) to demonstrate the difference of before/after
1 parent 8fea3fc commit 7dcf1d6

2 files changed

Lines changed: 84 additions & 53 deletions

File tree

e2e/test-util.ts

Lines changed: 68 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,44 @@ export async function fillOutVaadinGridCellFilter(
122122
await nameInput.fill(inputValue);
123123
}
124124

125+
async function removeSearchButton(page: Page, folderName: string) {
126+
await page
127+
.getByTestId('vfolder-filter')
128+
.locator('div')
129+
.filter({ hasText: `Name: ${folderName}` })
130+
.locator('svg')
131+
.first()
132+
.click();
133+
}
134+
135+
export async function verifyVFolder(
136+
page: Page,
137+
folderName: string,
138+
statusTab: 'Created' | 'Trash' = 'Created',
139+
) {
140+
await page.getByRole('link', { name: 'Data' }).click();
141+
await page.getByRole('tab', { name: statusTab }).click();
142+
await page.getByTestId('vfolder-filter').locator('div').nth(2).click();
143+
await page.getByRole('option', { name: 'Name' }).locator('div').click();
144+
const searchInput = page.locator('#rc_select_8');
145+
await searchInput.fill(folderName);
146+
await page.getByRole('button', { name: 'search' }).click();
147+
await expect(
148+
page
149+
.getByRole('cell', { name: `VFolder Identicon ${folderName}` })
150+
.filter({ hasText: folderName }),
151+
).toBeVisible();
152+
await removeSearchButton(page, folderName);
153+
}
154+
125155
export async function createVFolderAndVerify(
126156
page: Page,
127157
folderName: string,
128158
usageMode: 'general' | 'model' = 'general',
129159
type: 'user' | 'project' = 'user',
130160
permission: 'rw' | 'ro' = 'rw',
131161
) {
132-
await navigateTo(page, 'data');
162+
await page.getByRole('link', { name: 'Data' }).click();
133163

134164
await page.getByRole('button', { name: 'Create Folder' }).nth(1).click();
135165
await page.getByRole('textbox', { name: 'Folder name' }).fill(folderName);
@@ -140,63 +170,55 @@ export async function createVFolderAndVerify(
140170
await page.getByTestId(`${permission}-permission`).click();
141171

142172
await page.getByRole('button', { name: 'Create', exact: true }).click();
143-
await page.reload();
173+
await verifyVFolder(page, folderName);
174+
}
175+
176+
export async function moveToTrashAndVerify(page: Page, folderName: string) {
177+
await page.getByRole('link', { name: 'Data' }).click();
144178
await page.getByTestId('vfolder-filter').locator('div').nth(2).click();
145179
await page.getByRole('option', { name: 'Name' }).locator('div').click();
146-
await page.locator('#rc_select_8').fill(folderName);
180+
const searchInput = page.locator('#rc_select_8');
181+
await searchInput.fill(folderName);
147182
await page.getByRole('button', { name: 'search' }).click();
148-
await page.getByRole('link', { name: folderName }).click();
149-
await expect(
150-
page
151-
.getByRole('cell', { name: `VFolder Identicon ${folderName}` })
152-
.filter({ hasText: folderName }),
153-
).toBeVisible();
183+
await page
184+
.getByRole('row', { name: 'VFolder Identicon e2e-test-' })
185+
.getByRole('button')
186+
.nth(1)
187+
.click();
188+
await page.getByRole('button', { name: 'Move' }).click();
189+
await removeSearchButton(page, folderName);
190+
await verifyVFolder(page, folderName, 'Trash');
154191
}
155192

156-
export async function deleteVFolderAndVerify(page: Page, folderName: string) {
157-
await navigateTo(page, 'data');
158-
const nameInput = page
159-
.locator('#general-folder-storage vaadin-grid-cell-content')
160-
.filter({ hasText: 'Name' })
161-
.locator('vaadin-text-field')
162-
.nth(1)
163-
.locator('input');
164-
await nameInput.click();
165-
await nameInput.fill(folderName);
166-
await page.waitForTimeout(1000);
167-
await page.getByRole('button', { name: 'delete' }).first().click();
193+
export async function deleteForeverAndVerifyFromTrash(
194+
page: Page,
195+
folderName: string,
196+
) {
197+
await page.getByRole('link', { name: 'Data' }).click();
198+
await page.getByRole('tab', { name: 'Trash' }).click();
199+
const searchInput = page.locator('#rc_select_8');
200+
await searchInput.fill(folderName);
201+
await page.getByRole('button', { name: 'search' }).click();
202+
// Delete forever
168203
await page
169-
.locator('#delete-without-confirm-button')
170-
.getByLabel('delete')
171-
.click();
172-
await page.waitForLoadState('networkidle');
173-
await page.getByRole('tab', { name: 'delete' }).click();
174-
const nameInputInTrash = page
175-
.locator('#trash-bin-folder-storage vaadin-grid-cell-content')
176-
.filter({ hasText: 'Name' })
177-
.locator('vaadin-text-field')
204+
.getByRole('row', { name: 'VFolder Identicon e2e-test-' })
205+
.getByRole('button')
178206
.nth(1)
179-
.locator('input');
180-
await nameInputInTrash.fill(folderName);
181-
// after filling the input, the vaadin-grid will be updated asynchronously. So we need to wait for the grid to be updated.
182-
await page.waitForTimeout(1000);
183-
await page
184-
.locator('vaadin-grid-cell-content')
185-
.filter({ hasText: folderName })
186-
.locator('//following-sibling::*[7]')
187-
.getByRole('button', { name: 'delete_forever' })
188207
.click();
189-
await page
190-
.getByRole('textbox', { name: 'Type folder name to delete' })
191-
.fill(folderName);
208+
await page.locator('#confirmText').click();
209+
await page.locator('#confirmText').fill(folderName);
192210
await page.getByRole('button', { name: 'Delete forever' }).click();
211+
// Verify
212+
await page.getByTestId('vfolder-filter').locator('div').nth(2).click();
213+
await page.getByRole('option', { name: 'Name' }).locator('div').click();
214+
await searchInput.fill(folderName);
215+
await page.getByRole('button', { name: 'search' }).click();
193216
await expect(
194217
page
195-
.locator('vaadin-grid-cell-content')
196-
.filter({ hasText: folderName })
197-
.locator(':visible'),
218+
.getByRole('cell', { name: `VFolder Identicon ${folderName}` })
219+
.filter({ hasText: folderName }),
198220
).toHaveCount(0);
199-
await nameInputInTrash.fill('');
221+
await removeSearchButton(page, folderName);
200222
}
201223

202224
export async function createSession(page: Page, sessionName: string) {

e2e/vfolder.test.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
import {
22
createVFolderAndVerify,
3-
deleteVFolderAndVerify,
3+
deleteForeverAndVerifyFromTrash,
44
fillOutVaadinGridCellFilter,
55
loginAsUser,
66
loginAsUser2,
77
logout,
8+
moveToTrashAndVerify,
89
navigateTo,
910
userInfo,
1011
} from './test-util';
1112
import { test, expect } from '@playwright/test';
1213

1314
test.describe('VFolder ', () => {
14-
test('User can create and delete vFolder', async ({ page }) => {
15+
test.beforeEach(async ({ page }) => {
1516
await loginAsUser(page);
16-
const folderName = 'e2e-test-folder-user-creation' + new Date().getTime();
17+
});
18+
const folderName = 'e2e-test-folder-user-creation' + new Date().getTime();
19+
test('User can create and delete, delete forever vFolder', async ({
20+
page,
21+
}) => {
1722
await createVFolderAndVerify(page, folderName);
18-
await deleteVFolderAndVerify(page, folderName);
23+
await moveToTrashAndVerify(page, folderName);
24+
await deleteForeverAndVerifyFromTrash(page, folderName);
1925
});
2026
});
2127

@@ -89,7 +95,8 @@ test.describe('VFolder sharing', () => {
8995
await page2.getByLabel('Type folder name to leave').fill(sharingFolderName);
9096
await page2.getByRole('button', { name: 'Leave' }).click();
9197
// delete folder
92-
await deleteVFolderAndVerify(page, sharingFolderName);
98+
await moveToTrashAndVerify(page, sharingFolderName);
99+
await deleteForeverAndVerifyFromTrash(page, sharingFolderName);
93100
await page.close();
94101
await page2.close();
95102
});
@@ -129,7 +136,8 @@ test.describe('VFolder sharing', () => {
129136
.filter({ hasText: sharingFolderName }),
130137
).toBeVisible();
131138
// Delete folder as User before User2 accept the invitation
132-
await deleteVFolderAndVerify(page, sharingFolderName);
139+
await moveToTrashAndVerify(page, sharingFolderName);
140+
await deleteForeverAndVerifyFromTrash(page, sharingFolderName);
133141
// check the invitation is disappeared
134142
await page2.reload();
135143
await expect(
@@ -181,7 +189,8 @@ test.describe('VFolder sharing', () => {
181189
.filter({ hasText: sharingFolderName }),
182190
).toBeVisible();
183191
// User delete the folder when User2 is trying to accept
184-
await deleteVFolderAndVerify(page, sharingFolderName);
192+
await moveToTrashAndVerify(page, sharingFolderName);
193+
await deleteForeverAndVerifyFromTrash(page, sharingFolderName);
185194
// User2 accept the invitation
186195
await page2
187196
.getByText(`From ${userInfo.user.email}`)

0 commit comments

Comments
 (0)