Skip to content

Commit 99efeb0

Browse files
test(tables): update e2e tests for added column order and sorting on table entity
AI-assistant: GitHub Copilot v0.43.0 (Claude Sonnet 4.6) Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
1 parent 3e89d2b commit 99efeb0

3 files changed

Lines changed: 101 additions & 3 deletions

File tree

cypress/e2e/tables-table.cy.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ describe('Manage a table', () => {
7171
// Updating the title is flaky, so skipping it for now
7272
// cy.get('[data-cy="editTableModal"] [data-cy="editTableTitleInput"]').should('be.visible').should('be.enabled')
7373
// cy.get('[data-cy="editTableModal"] [data-cy="editTableTitleInput"]').clear().type('ToDo list')
74-
cy.get('.modal__content #description-editor .tiptap.ProseMirror').type('Updated ToDo List description')
74+
cy.get('#description-editor .tiptap.ProseMirror').type('Updated ToDo List description')
7575
cy.get('[data-cy="editTableSaveBtn"]').should('be.enabled').click()
7676

7777
cy.wait(10).get('.toastify.toast-success').should('be.visible')

playwright/e2e/tables-import-export-scheme.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ interface SchemeColumnSetting {
2525
mandatory?: boolean
2626
}
2727

28+
interface SchemeColumnOrderEntry {
29+
columnId: number
30+
order?: number
31+
}
32+
2833
interface SchemeSort {
2934
columnId: number
3035
mode: string
@@ -51,6 +56,8 @@ interface TableScheme extends Record<string, unknown> {
5156
columns: SchemeColumn[]
5257
views: SchemeView[]
5358
tablesVersion?: string
59+
columnOrder?: SchemeColumnOrderEntry[]
60+
sort?: SchemeSort[]
5461
}
5562

5663
async function getTutorialScheme(page: Page): Promise<TableScheme> {
@@ -110,6 +117,18 @@ function normalizeViews(views: SchemeView[], columns: SchemeColumn[]) {
110117
}))
111118
}
112119

120+
function normalizeTableLevelFields(scheme: TableScheme, columns: SchemeColumn[]) {
121+
const columnTitleById = new Map(columns.map((column) => [column.id, column.title]))
122+
scheme.columnOrder = (scheme.columnOrder ?? []).map((entry) => ({
123+
title: columnTitleById.get(entry.columnId) ?? entry.columnId,
124+
order: entry.order,
125+
})) as unknown as SchemeColumnOrderEntry[]
126+
scheme.sort = (scheme.sort ?? []).map((sort) => ({
127+
title: columnTitleById.get(sort.columnId) ?? sort.columnId,
128+
mode: sort.mode,
129+
})) as unknown as SchemeSort[]
130+
}
131+
113132
function formatOperatorLabel(operator: string) {
114133
return operator
115134
.replaceAll('-', ' ')
@@ -287,6 +306,8 @@ test.describe('Import Export Scheme', () => {
287306
content.columns = omitSubFields(content.columns, columnFieldsToIgnore) as SchemeColumn[]
288307
sourceScheme.views = normalizeViews(sourceScheme.views, sourceColumns) as SchemeView[]
289308
content.views = normalizeViews(content.views, contentColumns) as SchemeView[]
309+
normalizeTableLevelFields(sourceScheme, sourceColumns)
310+
normalizeTableLevelFields(content, contentColumns)
290311
content.tablesVersion = ''
291312
sourceScheme.tablesVersion = ''
292313

playwright/e2e/tables-table.spec.ts

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { test, expect } from '../support/fixtures'
77
import { createRandomUser } from '../support/api'
8-
import { createTable, deleteTable, loadTable } from '../support/commands'
8+
import { createTable, createTextLineColumn, deleteTable, loadTable } from '../support/commands'
99
import { login } from '../support/login'
1010

1111
test.describe('Manage a table', () => {
@@ -42,7 +42,7 @@ test.describe('Manage a table', () => {
4242
await page.getByRole('menuitem', { name: 'Edit table' }).click()
4343

4444
await expect(page.locator('[data-cy="editTableModal"]')).toBeVisible()
45-
await page.locator('.modal__content #description-editor .tiptap.ProseMirror').fill('Updated ToDo List description')
45+
await page.locator('#description-editor .tiptap.ProseMirror').fill('Updated ToDo List description')
4646
await expect(page.locator('[data-cy="editTableSaveBtn"]')).toBeEnabled()
4747
await page.locator('[data-cy="editTableSaveBtn"]').click()
4848

@@ -110,4 +110,81 @@ test.describe('Manage a table', () => {
110110
await page.goto('/index.php/apps/tables')
111111
await expect(page.locator('.app-navigation__list').filter({ hasText: 'test table' })).toBeVisible()
112112
})
113+
114+
test('Set column order in Edit Table modal', async ({ userPage: { page } }) => {
115+
await page.goto('/index.php/apps/tables')
116+
await createTable(page, 'Column order test table')
117+
await createTextLineColumn(page, 'colFirst', '', '', true)
118+
await createTextLineColumn(page, 'colSecond', '', '', false)
119+
120+
const tableItem = page.locator('[data-cy="navigationTableItem"]').filter({ hasText: 'Column order test table' }).first()
121+
await tableItem.getByRole('button', { name: /Actions|Open menu/i }).click({ force: true })
122+
await page.getByRole('menuitem', { name: 'Edit table' }).click()
123+
124+
await expect(page.locator('[data-cy="editTableModal"]')).toBeVisible()
125+
126+
const columnOrderSection = page.locator('#settings-section_column-order')
127+
await columnOrderSection.scrollIntoViewIfNeeded()
128+
129+
const columnEntries = columnOrderSection.locator('.column-entry')
130+
await expect(columnEntries.filter({ hasText: 'colFirst' })).toBeVisible()
131+
await expect(columnEntries.filter({ hasText: 'colSecond' })).toBeVisible()
132+
133+
// Move colFirst down so colSecond becomes first
134+
const colFirstEntry = columnEntries.filter({ hasText: 'colFirst' })
135+
await colFirstEntry.hover()
136+
await colFirstEntry.getByRole('button', { name: 'Move down' }).click()
137+
138+
await expect(columnEntries.nth(0)).toContainText('colSecond')
139+
await expect(columnEntries.nth(1)).toContainText('colFirst')
140+
141+
const updateReqPromise = page.waitForResponse(
142+
(response) => response.url().includes('/apps/tables/api/2/tables/') && response.request().method() === 'PUT',
143+
)
144+
await page.locator('[data-cy="editTableSaveBtn"]').click()
145+
const updateResponse = await updateReqPromise
146+
expect(updateResponse.ok()).toBeTruthy()
147+
const body = await updateResponse.json()
148+
expect(body.ocs.data.columnOrder).toHaveLength(2)
149+
150+
await expect(page.locator('.toastify.toast-success').first()).toBeVisible()
151+
})
152+
153+
test('Set default sort in Edit Table modal', async ({ userPage: { page } }) => {
154+
await page.goto('/index.php/apps/tables')
155+
await createTable(page, 'Default sort test table')
156+
await createTextLineColumn(page, 'name', '', '', true)
157+
158+
const tableItem = page.locator('[data-cy="navigationTableItem"]').filter({ hasText: 'Default sort test table' }).first()
159+
await tableItem.getByRole('button', { name: /Actions|Open menu/i }).click({ force: true })
160+
await page.getByRole('menuitem', { name: 'Edit table' }).click()
161+
162+
await expect(page.locator('[data-cy="editTableModal"]')).toBeVisible()
163+
164+
const defaultSortSection = page.locator('#settings-section_default-sort')
165+
await defaultSortSection.scrollIntoViewIfNeeded()
166+
167+
await defaultSortSection.getByRole('button', { name: 'Add new sorting rule' }).click()
168+
169+
const sortEntry = defaultSortSection.locator('.sort-entry').first()
170+
await sortEntry.locator('.select-field').click()
171+
await page.locator('ul.vs__dropdown-menu li span[title="name"]').click()
172+
173+
await expect(sortEntry.locator('.checkbox-radio-switch__input[value="ASC"]')).toBeChecked()
174+
175+
await sortEntry.locator('.checkbox-radio-switch__label').filter({ hasText: 'Descending' }).click()
176+
await expect(sortEntry.locator('.checkbox-radio-switch__input[value="DESC"]')).toBeChecked()
177+
178+
const updateReqPromise = page.waitForResponse(
179+
(response) => response.url().includes('/apps/tables/api/2/tables/') && response.request().method() === 'PUT',
180+
)
181+
await page.locator('[data-cy="editTableSaveBtn"]').click()
182+
const updateResponse = await updateReqPromise
183+
expect(updateResponse.ok()).toBeTruthy()
184+
const body = await updateResponse.json()
185+
expect(body.ocs.data.sort).toHaveLength(1)
186+
expect(body.ocs.data.sort[0].mode).toBe('DESC')
187+
188+
await expect(page.locator('.toastify.toast-success').first()).toBeVisible()
189+
})
113190
})

0 commit comments

Comments
 (0)