Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled
161 lines
5.3 KiB
TypeScript
161 lines
5.3 KiB
TypeScript
import { nanoid } from 'nanoid';
|
|
|
|
import { test, expect } from '../../../fixtures/base';
|
|
|
|
test.describe('Data Table list view', {
|
|
annotation: [
|
|
{ type: 'owner', description: 'Adore' },
|
|
],
|
|
}, () => {
|
|
test.beforeEach(async ({ n8n, api }) => {
|
|
await api.enableFeature('sharing');
|
|
await api.enableFeature('folders');
|
|
await api.enableFeature('advancedPermissions');
|
|
await api.enableFeature('projectRole:admin');
|
|
await api.enableFeature('projectRole:editor');
|
|
await api.setMaxTeamProjectsQuota(-1);
|
|
await n8n.goHome();
|
|
});
|
|
|
|
test('Should correctly render project data tables in project and everything in overview', async ({
|
|
n8n,
|
|
}) => {
|
|
const TEST_PROJECTS = [
|
|
{
|
|
name: `Project ${nanoid(8)}`,
|
|
dataTable: `Data Table ${nanoid(8)}`,
|
|
},
|
|
{
|
|
name: `Project ${nanoid(8)}`,
|
|
dataTable: `Data Table ${nanoid(8)}`,
|
|
},
|
|
];
|
|
|
|
// Create projects and check that they only render their own data tables
|
|
for (const project of TEST_PROJECTS) {
|
|
await n8n.dataTableComposer.createDataTableInNewProject(
|
|
project.name,
|
|
project.dataTable,
|
|
'empty-state',
|
|
);
|
|
|
|
await expect(n8n.dataTable.getDataTableCardByName(project.dataTable)).toBeVisible();
|
|
await expect(n8n.dataTable.getDataTableCards()).toHaveCount(1);
|
|
}
|
|
|
|
// Go to overview, both data tables should be visible
|
|
await n8n.navigate.toDatatables();
|
|
for (const project of TEST_PROJECTS) {
|
|
await expect(n8n.dataTable.getDataTableCardByName(project.dataTable)).toBeVisible();
|
|
}
|
|
});
|
|
|
|
test('Should create data table in personal project when created from Overview', async ({
|
|
n8n,
|
|
}) => {
|
|
const TEST_DATA_TABLE_NAME = `Data Table ${nanoid(8)}`;
|
|
|
|
await n8n.page.goto('projects/home/datatables');
|
|
|
|
await n8n.dataTable.clickAddDataTableAction();
|
|
|
|
const newDataTableModal = n8n.dataTable.getNewDataTableModal();
|
|
await expect(newDataTableModal).toBeVisible();
|
|
|
|
await n8n.dataTableComposer.createNewDataTable(TEST_DATA_TABLE_NAME);
|
|
|
|
const dataTableDetailsContainer = n8n.dataTableDetails.getPageWrapper();
|
|
await expect(dataTableDetailsContainer).toBeVisible();
|
|
|
|
const dataTableProjectBreadcrumb = n8n.dataTableDetails.getDataTableProjectBreadcrumb();
|
|
await expect(dataTableProjectBreadcrumb).toHaveText('Personal');
|
|
|
|
const dataTableBreadcrumb = n8n.dataTableDetails.getDataTableBreadcrumb();
|
|
await expect(dataTableBreadcrumb).toContainText(TEST_DATA_TABLE_NAME);
|
|
});
|
|
|
|
test('Should create data table from project empty state', async ({ n8n }) => {
|
|
const TEST_PROJECT_NAME = `Project ${nanoid(8)}`;
|
|
const TEST_DATA_TABLE_NAME = `Data Table ${nanoid(8)}`;
|
|
|
|
await n8n.dataTableComposer.createDataTableInNewProject(
|
|
TEST_PROJECT_NAME,
|
|
TEST_DATA_TABLE_NAME,
|
|
'empty-state',
|
|
);
|
|
|
|
await expect(n8n.dataTable.getDataTableCardByName(TEST_DATA_TABLE_NAME)).toBeVisible();
|
|
});
|
|
|
|
test('Should create project data table from header dropdown', async ({ n8n }) => {
|
|
const TEST_PROJECT_NAME = `Project ${nanoid(8)}`;
|
|
const TEST_DATA_TABLE_NAME = `Data Table ${nanoid(8)}`;
|
|
|
|
await n8n.dataTableComposer.createDataTableInNewProject(
|
|
TEST_PROJECT_NAME,
|
|
TEST_DATA_TABLE_NAME,
|
|
'header-dropdown',
|
|
);
|
|
|
|
await expect(n8n.dataTable.getDataTableCardByName(TEST_DATA_TABLE_NAME)).toBeVisible();
|
|
});
|
|
|
|
test('Should create data table from workflows tab', async ({ n8n }) => {
|
|
const TEST_PROJECT_NAME = `Project ${nanoid(8)}`;
|
|
const TEST_DATA_TABLE_NAME = `Data Table ${nanoid(8)}`;
|
|
|
|
await n8n.dataTableComposer.createDataTableInNewProject(
|
|
TEST_PROJECT_NAME,
|
|
TEST_DATA_TABLE_NAME,
|
|
'header-dropdown',
|
|
false,
|
|
);
|
|
|
|
await expect(n8n.dataTable.getDataTableCardByName(TEST_DATA_TABLE_NAME)).toBeVisible();
|
|
});
|
|
|
|
test('Should delete data table from card actions', async ({ n8n }) => {
|
|
const TEST_PROJECT_NAME = `Project ${nanoid(8)}`;
|
|
const TEST_DATA_TABLE_NAME = `Data Table ${nanoid(8)}`;
|
|
|
|
await n8n.dataTableComposer.createDataTableInNewProject(
|
|
TEST_PROJECT_NAME,
|
|
TEST_DATA_TABLE_NAME,
|
|
'empty-state',
|
|
);
|
|
|
|
await n8n.dataTable.clickDataTableCardActionsButton(TEST_DATA_TABLE_NAME);
|
|
await n8n.dataTable.getDataTableCardAction('delete').click();
|
|
|
|
await expect(n8n.dataTable.getDeleteDataTableModal()).toBeVisible();
|
|
await n8n.dataTable.clickDeleteDataTableConfirmButton();
|
|
|
|
await expect(n8n.dataTable.getDataTableCardByName(TEST_DATA_TABLE_NAME)).toBeHidden();
|
|
});
|
|
|
|
test('Should paginate data table list correctly', async ({ n8n }) => {
|
|
const TEST_PROJECT_NAME = `Project ${nanoid(8)}`;
|
|
const TOTAL_DATA_TABLES = 11;
|
|
const PAGE_SIZE = 10;
|
|
|
|
const { projectId } = await n8n.projectComposer.createProject(TEST_PROJECT_NAME);
|
|
await n8n.page.goto(`projects/${projectId}/datatables`);
|
|
|
|
// Create just enough data tables to require pagination
|
|
for (let i = 0; i < TOTAL_DATA_TABLES; i++) {
|
|
await n8n.dataTable.clickAddDataTableAction();
|
|
await n8n.dataTableComposer.createNewDataTable(`Data Table ${i + 1}`);
|
|
await n8n.sideBar.clickProjectMenuItem(TEST_PROJECT_NAME);
|
|
await n8n.dataTable.clickDataTableProjectTab();
|
|
}
|
|
// Change page size to PAGE_SIZE
|
|
await n8n.dataTable.selectDataTablePageSize(PAGE_SIZE.toString());
|
|
// First page should only have PAGE_SIZE items
|
|
await expect(n8n.dataTable.getDataTableCards()).toHaveCount(PAGE_SIZE);
|
|
|
|
// Forward to next page, should show the rest
|
|
await n8n.dataTable.getPaginationNextButton().click();
|
|
await expect(n8n.dataTable.getDataTableCards()).toHaveCount(TOTAL_DATA_TABLES - PAGE_SIZE);
|
|
});
|
|
});
|