mirror of https://github.com/nocodb/nocodb
77 changed files with 1114 additions and 477 deletions
@ -1,9 +1,9 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { SharedFormPage } from '../../pages/SharedForm'; |
||||
import setup from '../../setup'; |
||||
import { AccountPage } from '../../pages/Account'; |
||||
import { AccountLicensePage } from '../../pages/Account/License'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { SharedFormPage } from '../../../pages/SharedForm'; |
||||
import setup from '../../../setup'; |
||||
import { AccountPage } from '../../../pages/Account'; |
||||
import { AccountLicensePage } from '../../../pages/Account/License'; |
||||
|
||||
test.describe('Attachment column', () => { |
||||
let dashboard: DashboardPage; |
@ -1,7 +1,7 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
|
||||
interface ExpectedBarcodeData { |
||||
referencedValue: string; |
@ -1,7 +1,7 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
import { UITypes } from 'nocodb-sdk'; |
||||
import { Api } from 'nocodb-sdk'; |
||||
let api: Api<any>; |
@ -1,6 +1,6 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
|
||||
const dateTimeData = [ |
||||
{ |
@ -1,6 +1,6 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
|
||||
// Storing one additional dummy value "10" at end of every input array
|
||||
// this will trigger update to previously committed data
|
@ -1,7 +1,7 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup, { NcContext } from '../../setup'; |
||||
import { isPg, isSqlite } from '../../setup/db'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup, { NcContext } from '../../../setup'; |
||||
import { isPg, isSqlite } from '../../../setup/db'; |
||||
|
||||
// Add formula to be verified here & store expected results for 5 rows
|
||||
// Column data from City table (Sakila DB)
|
@ -1,7 +1,7 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
|
||||
test.describe('Geo Data column', () => { |
||||
let dashboard: DashboardPage; |
@ -1,6 +1,6 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('LTAR create & update', () => { |
||||
let dashboard: DashboardPage; |
@ -1,6 +1,6 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Virtual columns', () => { |
||||
let dashboard: DashboardPage; |
@ -1,9 +1,9 @@
|
||||
import { expect, Locator, test } from '@playwright/test'; |
||||
import setup from '../../setup'; |
||||
import setup from '../../../setup'; |
||||
import { Api, UITypes } from 'nocodb-sdk'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import { getTextExcludeIconText } from '../utils/general'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
import { getTextExcludeIconText } from '../../utils/general'; |
||||
let api: Api<any>; |
||||
const recordCount = 10; |
||||
|
@ -1,6 +1,6 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
|
||||
const columns = [ |
||||
{ |
@ -1,8 +1,8 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import setup from '../../setup'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
import setup from '../../../setup'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
|
||||
test.describe('Multi select', () => { |
||||
let dashboard: DashboardPage, grid: GridPage; |
@ -1,7 +1,7 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
|
||||
type ExpectedQrCodeData = { |
||||
referencedValue: string; |
@ -1,7 +1,7 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
|
||||
test.describe('Rating - cell, filter, sort', () => { |
||||
let dashboard: DashboardPage, toolbar: ToolbarPage; |
@ -1,6 +1,6 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Relational Columns', () => { |
||||
let dashboard: DashboardPage; |
@ -1,8 +1,8 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import setup from '../../setup'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
import setup from '../../../setup'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
|
||||
test.describe('Single select', () => { |
||||
let dashboard: DashboardPage, grid: GridPage; |
@ -1,10 +1,10 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { LoginPage } from '../../pages/LoginPage'; |
||||
import { ProjectsPage } from '../../pages/ProjectsPage'; |
||||
import { getDefaultPwd } from '../utils/general'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
import { LoginPage } from '../../../pages/LoginPage'; |
||||
import { ProjectsPage } from '../../../pages/ProjectsPage'; |
||||
import { getDefaultPwd } from '../../utils/general'; |
||||
|
||||
test.describe('Shared base', () => { |
||||
let dashboard: DashboardPage; |
@ -1,9 +1,9 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { GalleryPage } from '../../pages/Dashboard/Gallery'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import setup from '../../setup'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { GalleryPage } from '../../../pages/Dashboard/Gallery'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
import setup from '../../../setup'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
|
||||
test.describe('Expanded form URL', () => { |
||||
let dashboard: DashboardPage; |
@ -1,13 +1,13 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
import { UITypes } from 'nocodb-sdk'; |
||||
import { Api } from 'nocodb-sdk'; |
||||
import { rowMixedValue } from '../../setup/xcdb-records'; |
||||
import { rowMixedValue } from '../../../setup/xcdb-records'; |
||||
import dayjs from 'dayjs'; |
||||
import { createDemoTable } from '../../setup/demoTable'; |
||||
import { isPg } from '../../setup/db'; |
||||
import { createDemoTable } from '../../../setup/demoTable'; |
||||
import { isPg } from '../../../setup/db'; |
||||
|
||||
let dashboard: DashboardPage, toolbar: ToolbarPage; |
||||
let context: any; |
@ -1,8 +1,8 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { FormPage } from '../../pages/Dashboard/Form'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
import { FormPage } from '../../../pages/Dashboard/Form'; |
||||
import setup from '../../../setup'; |
||||
|
||||
// Skip for now as it is not working in CI atm
|
||||
test.describe.skip('Find row by scanner', () => { |
@ -1,9 +1,9 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { airtableApiBase, airtableApiKey } from '../../constants'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { quickVerify } from '../../quickTests/commonTest'; |
||||
import setup from '../../setup'; |
||||
import { isPg, isSqlite } from '../../setup/db'; |
||||
import { airtableApiBase, airtableApiKey } from '../../../constants'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { quickVerify } from '../../../quickTests/commonTest'; |
||||
import setup from '../../../setup'; |
||||
import { isPg, isSqlite } from '../../../setup/db'; |
||||
|
||||
test.describe('Import', () => { |
||||
let dashboard: DashboardPage; |
@ -1,7 +1,7 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
import setup from '../../../setup'; |
||||
import { Api, UITypes } from 'nocodb-sdk'; |
||||
|
||||
let api: Api<any>; |
@ -1,8 +1,8 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { SettingsPage, SettingTab } from '../../pages/Dashboard/Settings'; |
||||
import setup, { NcContext } from '../../setup'; |
||||
import { isMysql, isPg, isSqlite, mysqlExec, pgExec, sqliteExec } from '../../setup/db'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { SettingsPage, SettingTab } from '../../../pages/Dashboard/Settings'; |
||||
import setup, { NcContext } from '../../../setup'; |
||||
import { isMysql, isPg, isSqlite, mysqlExec, pgExec, sqliteExec } from '../../../setup/db'; |
||||
|
||||
test.describe('Meta sync', () => { |
||||
let dashboard: DashboardPage; |
@ -1,8 +1,8 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { FormPage } from '../../pages/Dashboard/Form'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
import { FormPage } from '../../../pages/Dashboard/Form'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Mobile Mode', () => { |
||||
let dashboard: DashboardPage; |
@ -1,6 +1,6 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Grid pagination', () => { |
||||
let dashboard: DashboardPage; |
@ -1,7 +1,7 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Table Column Operations', () => { |
||||
let grid: GridPage, dashboard: DashboardPage; |
@ -1,12 +1,12 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { knex } from 'knex'; |
||||
import { Api, UITypes } from 'nocodb-sdk'; |
||||
import { ProjectsPage } from '../../pages/ProjectsPage'; |
||||
import { isMysql, isPg, isSqlite } from '../../setup/db'; |
||||
import { getKnexConfig } from '../utils/config'; |
||||
import { getBrowserTimezoneOffset } from '../utils/general'; |
||||
import { ProjectsPage } from '../../../pages/ProjectsPage'; |
||||
import { isMysql, isPg, isSqlite } from '../../../setup/db'; |
||||
import { getKnexConfig } from '../../utils/config'; |
||||
import { getBrowserTimezoneOffset } from '../../utils/general'; |
||||
let api: Api<any>, records: any[]; |
||||
|
||||
const columns = [ |
@ -1,11 +1,11 @@
|
||||
import { expect, Page, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { Api, UITypes } from 'nocodb-sdk'; |
||||
import { rowMixedValue } from '../../setup/xcdb-records'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { isSqlite } from '../../setup/db'; |
||||
import { rowMixedValue } from '../../../setup/xcdb-records'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
import { isSqlite } from '../../../setup/db'; |
||||
|
||||
let dashboard: DashboardPage, |
||||
grid: GridPage, |
@ -1,11 +1,11 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { Api } from 'nocodb-sdk'; |
||||
import { createDemoTable } from '../../setup/demoTable'; |
||||
import { BulkUpdatePage } from '../../pages/Dashboard/BulkUpdate'; |
||||
import { AccountLicensePage } from '../../pages/Account/License'; |
||||
import { AccountPage } from '../../pages/Account'; |
||||
import { createDemoTable } from '../../../setup/demoTable'; |
||||
import { BulkUpdatePage } from '../../../pages/Dashboard/BulkUpdate'; |
||||
import { AccountLicensePage } from '../../../pages/Account/License'; |
||||
import { AccountPage } from '../../../pages/Account'; |
||||
|
||||
let bulkUpdateForm: BulkUpdatePage; |
||||
let dashboard: DashboardPage; |
@ -0,0 +1,258 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import setup from '../../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { Api } from 'nocodb-sdk'; |
||||
import { createDemoTable } from '../../../setup/demoTable'; |
||||
import { BulkUpdatePage } from '../../../pages/Dashboard/BulkUpdate'; |
||||
|
||||
let dashboard: DashboardPage; |
||||
let context: any; |
||||
let api: Api<any>; |
||||
let table; |
||||
async function dragDrop({ firstColumn, lastColumn }: { firstColumn: string; lastColumn: string }) { |
||||
await dashboard.grid.cell.get({ index: 0, columnHeader: firstColumn }).click(); |
||||
await dashboard.rootPage.keyboard.press( |
||||
(await dashboard.grid.isMacOs()) ? 'Meta+Shift+ArrowRight' : 'Control+Shift+ArrowRight' |
||||
); |
||||
|
||||
// get fill handle locator
|
||||
const src = await dashboard.rootPage.locator(`.nc-fill-handle`); |
||||
const dst = await dashboard.grid.cell.get({ index: 3, columnHeader: lastColumn }); |
||||
|
||||
// drag and drop
|
||||
await src.dragTo(dst); |
||||
} |
||||
async function beforeEachInit({ page, tableType }: { page: any; tableType: string }) { |
||||
context = await setup({ page, isEmptyProject: true }); |
||||
dashboard = new DashboardPage(page, context.project); |
||||
|
||||
api = new Api({ |
||||
baseURL: `http://localhost:8080/`, |
||||
headers: { |
||||
'xc-auth': context.token, |
||||
}, |
||||
}); |
||||
|
||||
table = await createDemoTable({ context, type: tableType, recordCnt: 10 }); |
||||
await page.reload(); |
||||
|
||||
await dashboard.treeView.openTable({ title: tableType }); |
||||
} |
||||
|
||||
test.describe('Fill Handle', () => { |
||||
test.beforeEach(async ({ page }) => { |
||||
await beforeEachInit({ page, tableType: 'textBased' }); |
||||
}); |
||||
|
||||
test('Text based', async () => { |
||||
const fields = [ |
||||
{ title: 'SingleLineText', value: 'Afghanistan', type: 'text' }, |
||||
{ title: 'Email', value: 'jbutt@gmail.com', type: 'text' }, |
||||
{ title: 'PhoneNumber', value: '1-541-754-3010', type: 'text' }, |
||||
{ title: 'URL', value: 'https://www.google.com', type: 'text' }, |
||||
{ title: 'MultiLineText', value: 'Aberdeen, United Kingdom', type: 'longText' }, |
||||
]; |
||||
|
||||
await dragDrop({ firstColumn: 'SingleLineText', lastColumn: 'URL' }); |
||||
|
||||
// verify data on grid (verifying just two rows)
|
||||
for (let i = 0; i < fields.length; i++) { |
||||
for (let j = 0; j < 4; j++) { |
||||
await dashboard.grid.cell.verify({ index: j, columnHeader: fields[i].title, value: fields[i].value }); |
||||
} |
||||
} |
||||
|
||||
// verify api response
|
||||
const updatedRecords = (await api.dbTableRow.list('noco', context.project.id, table.id, { limit: 4 })).list; |
||||
for (let i = 0; i < updatedRecords.length; i++) { |
||||
for (let j = 0; j < fields.length; j++) { |
||||
expect(updatedRecords[i][fields[j].title]).toEqual(fields[j].value); |
||||
} |
||||
} |
||||
}); |
||||
}); |
||||
|
||||
test.describe('Fill Handle', () => { |
||||
test.beforeEach(async ({ page }) => { |
||||
await beforeEachInit({ page, tableType: 'numberBased' }); |
||||
}); |
||||
|
||||
test('Number based', async () => { |
||||
const fields = [ |
||||
{ title: 'Number', value: '33', type: 'text' }, |
||||
{ title: 'Decimal', value: '33.3', type: 'text' }, |
||||
{ title: 'Currency', value: '33.30', type: 'text' }, |
||||
{ title: 'Percent', value: '33', type: 'text' }, |
||||
{ title: 'Duration', value: '00:01', type: 'text' }, |
||||
{ title: 'Rating', value: '3', type: 'rating' }, |
||||
{ title: 'Year', value: '2023', type: 'year' }, |
||||
{ title: 'Time', value: '02:02', type: 'time' }, |
||||
]; |
||||
|
||||
// kludge: insert time from browser until mysql issue with timezone is fixed
|
||||
await dashboard.grid.cell.time.set({ index: 0, columnHeader: 'Time', value: '02:02' }); |
||||
|
||||
// set rating for first record
|
||||
await dashboard.grid.cell.rating.select({ index: 0, columnHeader: 'Rating', rating: 2 }); |
||||
|
||||
await dragDrop({ firstColumn: 'Number', lastColumn: 'Time' }); |
||||
|
||||
// verify data on grid
|
||||
for (let i = 0; i < fields.length; i++) { |
||||
for (let j = 0; j < 4; j++) { |
||||
if (fields[i].type === 'rating') { |
||||
await dashboard.grid.cell.rating.verify({ |
||||
index: j, |
||||
columnHeader: fields[i].title, |
||||
rating: +fields[i].value, |
||||
}); |
||||
} else if (fields[i].type === 'year') { |
||||
await dashboard.grid.cell.year.verify({ index: j, columnHeader: fields[i].title, value: +fields[i].value }); |
||||
} else if (fields[i].type === 'time') { |
||||
await dashboard.grid.cell.time.verify({ index: j, columnHeader: fields[i].title, value: fields[i].value }); |
||||
} else { |
||||
await dashboard.grid.cell.verify({ index: j, columnHeader: fields[i].title, value: fields[i].value }); |
||||
} |
||||
} |
||||
} |
||||
|
||||
// verify api response
|
||||
// duration in seconds
|
||||
const APIResponse = [33, 33.3, 33.3, 33, 60, 3, 2023, '02:02:00']; |
||||
const updatedRecords = (await api.dbTableRow.list('noco', context.project.id, table.id, { limit: 4 })).list; |
||||
for (let i = 0; i < updatedRecords.length; i++) { |
||||
for (let j = 0; j < fields.length; j++) { |
||||
if (fields[j].title === 'Time') { |
||||
expect(updatedRecords[i][fields[j].title]).toContain(APIResponse[j]); |
||||
} else { |
||||
expect(+updatedRecords[i][fields[j].title]).toEqual(APIResponse[j]); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
}); |
||||
|
||||
test.describe('Fill Handle', () => { |
||||
test.beforeEach(async ({ page }) => { |
||||
await beforeEachInit({ page, tableType: 'selectBased' }); |
||||
}); |
||||
|
||||
test('Select based', async () => { |
||||
const fields = [ |
||||
{ title: 'SingleSelect', value: 'jan', type: 'singleSelect' }, |
||||
{ title: 'MultiSelect', value: 'jan,feb,mar', type: 'multiSelect' }, |
||||
]; |
||||
|
||||
await dragDrop({ firstColumn: 'SingleSelect', lastColumn: 'MultiSelect' }); |
||||
|
||||
// verify data on grid
|
||||
const displayOptions = ['jan', 'feb', 'mar']; |
||||
for (let i = 0; i < fields.length; i++) { |
||||
for (let j = 0; j < 4; j++) { |
||||
if (fields[i].type === 'singleSelect') { |
||||
await dashboard.grid.cell.selectOption.verify({ |
||||
index: j, |
||||
columnHeader: fields[i].title, |
||||
option: fields[i].value, |
||||
}); |
||||
} else { |
||||
await dashboard.grid.cell.selectOption.verifyOptions({ |
||||
index: j, |
||||
columnHeader: fields[i].title, |
||||
options: displayOptions, |
||||
}); |
||||
} |
||||
} |
||||
} |
||||
|
||||
// verify api response
|
||||
const updatedRecords = (await api.dbTableRow.list('noco', context.project.id, table.id, { limit: 4 })).list; |
||||
for (let i = 0; i < updatedRecords.length; i++) { |
||||
for (let j = 0; j < fields.length; j++) { |
||||
expect(updatedRecords[i][fields[j].title]).toContain(fields[j].value); |
||||
} |
||||
} |
||||
}); |
||||
}); |
||||
|
||||
test.describe('Fill Handle', () => { |
||||
test.beforeEach(async ({ page }) => { |
||||
await beforeEachInit({ page, tableType: 'miscellaneous' }); |
||||
}); |
||||
|
||||
test('Miscellaneous (Checkbox, attachment)', async () => { |
||||
const fields = [ |
||||
{ title: 'Checkbox', value: 'true', type: 'checkbox' }, |
||||
{ title: 'Attachment', value: `${process.cwd()}/fixtures/sampleFiles/1.json`, type: 'attachment' }, |
||||
]; |
||||
|
||||
await dashboard.grid.cell.checkbox.click({ index: 0, columnHeader: 'Checkbox' }); |
||||
const filepath = [`${process.cwd()}/fixtures/sampleFiles/1.json`]; |
||||
await dashboard.grid.cell.attachment.addFile({ |
||||
index: 0, |
||||
columnHeader: 'Attachment', |
||||
filePath: filepath, |
||||
}); |
||||
await dragDrop({ firstColumn: 'Checkbox', lastColumn: 'Attachment' }); |
||||
|
||||
// verify data on grid
|
||||
for (let i = 0; i < fields.length; i++) { |
||||
for (let j = 0; j < 4; j++) { |
||||
if (fields[i].type === 'checkbox') { |
||||
await dashboard.grid.cell.checkbox.verifyChecked({ |
||||
index: j, |
||||
columnHeader: fields[i].title, |
||||
}); |
||||
} else { |
||||
await dashboard.grid.cell.attachment.verifyFileCount({ |
||||
index: j, |
||||
columnHeader: fields[i].title, |
||||
count: 1, |
||||
}); |
||||
} |
||||
} |
||||
} |
||||
|
||||
// verify api response
|
||||
const updatedRecords = (await api.dbTableRow.list('noco', context.project.id, table.id, { limit: 4 })).list; |
||||
for (let i = 0; i < updatedRecords.length; i++) { |
||||
for (let j = 0; j < fields.length; j++) { |
||||
expect(+updatedRecords[i]['Checkbox']).toBe(1); |
||||
expect(updatedRecords[i]['Attachment'][0].title).toBe('1.json'); |
||||
expect(updatedRecords[i]['Attachment'][0].mimetype).toBe('application/json'); |
||||
} |
||||
} |
||||
}); |
||||
}); |
||||
|
||||
test.describe('Fill Handle', () => { |
||||
test.beforeEach(async ({ page }) => { |
||||
await beforeEachInit({ page, tableType: 'dateTimeBased' }); |
||||
}); |
||||
|
||||
test('Date Time Based', async () => { |
||||
const row0_date = await api.dbTableRow.read('noco', context.project.id, table.id, 1); |
||||
const fields = [{ title: 'Date', value: row0_date['Date'], type: 'date' }]; |
||||
|
||||
await dragDrop({ firstColumn: 'Date', lastColumn: 'Date' }); |
||||
|
||||
// verify data on grid
|
||||
for (let i = 0; i < fields.length; i++) { |
||||
for (let j = 0; j < 4; j++) { |
||||
await dashboard.grid.cell.date.verify({ |
||||
index: j, |
||||
columnHeader: fields[i].title, |
||||
date: fields[i].value, |
||||
}); |
||||
} |
||||
} |
||||
|
||||
// verify api response
|
||||
const updatedRecords = (await api.dbTableRow.list('noco', context.project.id, table.id, { limit: 4 })).list; |
||||
for (let i = 0; i < updatedRecords.length; i++) { |
||||
for (let j = 0; j < fields.length; j++) { |
||||
expect(updatedRecords[i]['Date']).toBe(fields[j].value); |
||||
} |
||||
} |
||||
}); |
||||
}); |
@ -1,11 +1,11 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import makeServer from '../../setup/server'; |
||||
import { WebhookFormPage } from '../../pages/Dashboard/WebhookForm'; |
||||
import { isSubset } from '../utils/general'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import makeServer from '../../../setup/server'; |
||||
import { WebhookFormPage } from '../../../pages/Dashboard/WebhookForm'; |
||||
import { isSubset } from '../../utils/general'; |
||||
import { Api, UITypes } from 'nocodb-sdk'; |
||||
import { isMysql, isPg, isSqlite } from '../../setup/db'; |
||||
import { isMysql, isPg, isSqlite } from '../../../setup/db'; |
||||
|
||||
const hookPath = 'http://localhost:9090/hook'; |
||||
let api: Api<any>; |
@ -1,7 +1,7 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Verify cell selection', () => { |
||||
let dashboard: DashboardPage, grid: GridPage; |
@ -1,5 +1,5 @@
|
||||
import { test } from '@playwright/test'; |
||||
import setup from '../../setup'; |
||||
import setup from '../../../setup'; |
||||
import { UITypes } from 'nocodb-sdk'; |
||||
import { Api } from 'nocodb-sdk'; |
||||
let api: Api<any>; |
@ -1,13 +1,13 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { airtableApiBase, airtableApiKey } from '../../constants'; |
||||
import { quickVerify } from '../../quickTests/commonTest'; |
||||
import setup from '../../setup'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { ProjectsPage } from '../../pages/ProjectsPage'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { airtableApiBase, airtableApiKey } from '../../../constants'; |
||||
import { quickVerify } from '../../../quickTests/commonTest'; |
||||
import setup from '../../../setup'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
import { ProjectsPage } from '../../../pages/ProjectsPage'; |
||||
import { Api } from 'nocodb-sdk'; |
||||
import { ProjectInfo, ProjectInfoApiUtil } from '../utils/projectInfoApiUtil'; |
||||
import { deepCompare } from '../utils/objectCompareUtil'; |
||||
import { ProjectInfo, ProjectInfoApiUtil } from '../../utils/projectInfoApiUtil'; |
||||
import { deepCompare } from '../../utils/objectCompareUtil'; |
||||
|
||||
test.describe('Project operations', () => { |
||||
let dashboard: DashboardPage; |
@ -1,7 +1,7 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { GridPage } from '../../pages/Dashboard/Grid'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { GridPage } from '../../../pages/Dashboard/Grid'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Table Column Operations', () => { |
||||
let grid: GridPage, dashboard: DashboardPage; |
@ -1,10 +1,10 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { Api, TableListType, TableType } from 'nocodb-sdk'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { SettingsPage, SettingTab } from '../../pages/Dashboard/Settings'; |
||||
import { deepCompare } from '../utils/objectCompareUtil'; |
||||
import setup from '../../setup'; |
||||
import { ProjectInfoApiUtil, TableInfo } from '../utils/projectInfoApiUtil'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { SettingsPage, SettingTab } from '../../../pages/Dashboard/Settings'; |
||||
import { deepCompare } from '../../utils/objectCompareUtil'; |
||||
import setup from '../../../setup'; |
||||
import { ProjectInfoApiUtil, TableInfo } from '../../utils/projectInfoApiUtil'; |
||||
|
||||
test.describe('Table Operations', () => { |
||||
let dashboard: DashboardPage, settings: SettingsPage; |
@ -1,7 +1,7 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Toolbar operations (GRID)', () => { |
||||
let dashboard: DashboardPage, toolbar: ToolbarPage; |
@ -1,7 +1,7 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { isPg } from '../../setup/db'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { isPg } from '../../../setup/db'; |
||||
|
||||
test.describe('Grid view locked', () => { |
||||
let dashboard: DashboardPage; |
@ -1,7 +1,7 @@
|
||||
import { expect, test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Views CRUD Operations', () => { |
||||
let dashboard: DashboardPage; |
@ -1,8 +1,8 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { AccountPage } from '../../pages/Account'; |
||||
import setup from '../../setup'; |
||||
import { AccountLicensePage } from '../../pages/Account/License'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { AccountPage } from '../../../pages/Account'; |
||||
import setup from '../../../setup'; |
||||
import { AccountLicensePage } from '../../../pages/Account/License'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
|
||||
test.describe('Enterprise License', () => { |
||||
// @ts-ignore
|
@ -1,7 +1,7 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { AccountPage } from '../../pages/Account'; |
||||
import { AccountTokenPage } from '../../pages/Account/Token'; |
||||
import setup from '../../setup'; |
||||
import { AccountPage } from '../../../pages/Account'; |
||||
import { AccountTokenPage } from '../../../pages/Account/Token'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('User roles', () => { |
||||
let accountTokenPage: AccountTokenPage; |
@ -1,10 +1,10 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { AccountPage } from '../../pages/Account'; |
||||
import { AccountUsersPage } from '../../pages/Account/Users'; |
||||
import { ProjectsPage } from '../../pages/ProjectsPage'; |
||||
import { SignupPage } from '../../pages/SignupPage'; |
||||
import setup from '../../setup'; |
||||
import { getDefaultPwd } from '../utils/general'; |
||||
import { AccountPage } from '../../../pages/Account'; |
||||
import { AccountUsersPage } from '../../../pages/Account/Users'; |
||||
import { ProjectsPage } from '../../../pages/ProjectsPage'; |
||||
import { SignupPage } from '../../../pages/SignupPage'; |
||||
import setup from '../../../setup'; |
||||
import { getDefaultPwd } from '../../utils/general'; |
||||
|
||||
const roleDb = [ |
||||
{ email: 'creator@nocodb.com', role: 'Organization Level Creator', url: '' }, |
@ -1,9 +1,9 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { AccountPage } from '../../pages/Account'; |
||||
import { AccountSettingsPage } from '../../pages/Account/Settings'; |
||||
import { SignupPage } from '../../pages/SignupPage'; |
||||
import setup from '../../setup'; |
||||
import { getDefaultPwd } from '../utils/general'; |
||||
import { AccountPage } from '../../../pages/Account'; |
||||
import { AccountSettingsPage } from '../../../pages/Account/Settings'; |
||||
import { SignupPage } from '../../../pages/SignupPage'; |
||||
import setup from '../../../setup'; |
||||
import { getDefaultPwd } from '../../utils/general'; |
||||
|
||||
test.describe('App settings', () => { |
||||
let accountSettingsPage: AccountSettingsPage; |
@ -1,12 +1,12 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { LoginPage } from '../../pages/LoginPage'; |
||||
import { SettingsPage, SettingTab } from '../../pages/Dashboard/Settings'; |
||||
import { SignupPage } from '../../pages/SignupPage'; |
||||
import { ProjectsPage } from '../../pages/ProjectsPage'; |
||||
import { AccountPage } from '../../pages/Account'; |
||||
import { getDefaultPwd } from '../utils/general'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { LoginPage } from '../../../pages/LoginPage'; |
||||
import { SettingsPage, SettingTab } from '../../../pages/Dashboard/Settings'; |
||||
import { SignupPage } from '../../../pages/SignupPage'; |
||||
import { ProjectsPage } from '../../../pages/ProjectsPage'; |
||||
import { AccountPage } from '../../../pages/Account'; |
||||
import { getDefaultPwd } from '../../utils/general'; |
||||
|
||||
test.describe('Auth', () => { |
||||
let context: any; |
@ -1,10 +1,10 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { SettingsPage, SettingTab } from '../../pages/Dashboard/Settings'; |
||||
import { SignupPage } from '../../pages/SignupPage'; |
||||
import { ProjectsPage } from '../../pages/ProjectsPage'; |
||||
import { getDefaultPwd } from '../utils/general'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { SettingsPage, SettingTab } from '../../../pages/Dashboard/Settings'; |
||||
import { SignupPage } from '../../../pages/SignupPage'; |
||||
import { ProjectsPage } from '../../../pages/ProjectsPage'; |
||||
import { getDefaultPwd } from '../../utils/general'; |
||||
|
||||
const roleDb = [ |
||||
{ email: 'creator@nocodb.com', role: 'creator', url: '' }, |
@ -1,8 +1,8 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { SettingsPage, SettingTab } from '../../pages/Dashboard/Settings'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
import { SettingsPage, SettingTab } from '../../../pages/Dashboard/Settings'; |
||||
|
||||
const roles = ['Editor', 'Commenter', 'Viewer']; |
||||
|
@ -1,6 +1,6 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Super user', () => { |
||||
let dashboard: DashboardPage; |
@ -1,10 +1,10 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { FormPage } from '../../pages/Dashboard/Form'; |
||||
import { SharedFormPage } from '../../pages/SharedForm'; |
||||
import { AccountPage } from '../../pages/Account'; |
||||
import { AccountAppStorePage } from '../../pages/Account/AppStore'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { FormPage } from '../../../pages/Dashboard/Form'; |
||||
import { SharedFormPage } from '../../../pages/SharedForm'; |
||||
import { AccountPage } from '../../../pages/Account'; |
||||
import { AccountAppStorePage } from '../../../pages/Account/AppStore'; |
||||
import { Api, UITypes } from 'nocodb-sdk'; |
||||
let api: Api<any>; |
||||
|
@ -1,7 +1,7 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { SurveyFormPage } from '../../pages/Dashboard/SurveyForm'; |
||||
import setup from '../../setup'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { SurveyFormPage } from '../../../pages/Dashboard/SurveyForm'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Share form', () => { |
||||
let dashboard: DashboardPage; |
@ -1,7 +1,7 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import setup from '../../setup'; |
||||
import { isMysql, isPg, isSqlite } from '../../setup/db'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import setup from '../../../setup'; |
||||
import { isMysql, isPg, isSqlite } from '../../../setup/db'; |
||||
|
||||
test.describe('Shared view', () => { |
||||
let dashboard: DashboardPage; |
@ -1,9 +1,9 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
|
||||
import setup from '../../setup'; |
||||
import { isPg, isSqlite } from '../../setup/db'; |
||||
import setup from '../../../setup'; |
||||
import { isPg, isSqlite } from '../../../setup/db'; |
||||
|
||||
const filmRatings = ['G', 'PG', 'PG-13', 'R', 'NC-17']; |
||||
|
@ -1,8 +1,8 @@
|
||||
import { test } from '@playwright/test'; |
||||
import { DashboardPage } from '../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../pages/Dashboard/common/Toolbar'; |
||||
import { DashboardPage } from '../../../pages/Dashboard'; |
||||
import { ToolbarPage } from '../../../pages/Dashboard/common/Toolbar'; |
||||
|
||||
import setup from '../../setup'; |
||||
import setup from '../../../setup'; |
||||
|
||||
test.describe('Map View', () => { |
||||
let dashboard: DashboardPage, toolbar: ToolbarPage; |
Loading…
Reference in new issue