mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
252 lines
7.1 KiB
252 lines
7.1 KiB
import { test } from '@playwright/test'; |
|
import { DashboardPage } from '../pages/Dashboard'; |
|
import { SettingsPage, SettingTab } from '../pages/Dashboard/Settings'; |
|
import setup, { NcContext } from '../setup'; |
|
import { isSqlite, mysqlExec, sqliteExec } from '../setup/db'; |
|
|
|
// todo: Enable when view bug is fixed |
|
test.describe("Meta sync", () => { |
|
let dashboard: DashboardPage; |
|
let settings: SettingsPage; |
|
let context: NcContext; |
|
let dbExec; |
|
let projectPrefix; |
|
|
|
test.beforeEach(async ({ page }) => { |
|
context = await setup({ page }); |
|
dashboard = new DashboardPage(page, context.project); |
|
settings = dashboard.settings; |
|
|
|
switch (context.dbType) { |
|
case "sqlite": |
|
dbExec = sqliteExec; |
|
break; |
|
case "mysql": |
|
dbExec = mysqlExec; |
|
break; |
|
} |
|
|
|
projectPrefix = isSqlite(context) ? context.project.prefix : ""; |
|
}); |
|
|
|
test("Meta sync", async () => { |
|
test.setTimeout(process.env.CI ? 100000 : 70000); |
|
|
|
await dashboard.gotoSettings(); |
|
await settings.selectTab({tab: SettingTab.ProjectMetadata}); |
|
|
|
await dbExec( |
|
`CREATE TABLE ${projectPrefix}table1 (id INT NOT NULL, col1 INT NULL, PRIMARY KEY (id))` |
|
); |
|
await dbExec( |
|
`CREATE TABLE ${projectPrefix}table2 (id INT NOT NULL, col1 INT NULL, PRIMARY KEY (id))` |
|
); |
|
|
|
await settings.metaData.clickReload(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: `${projectPrefix}table1`, |
|
state: "New table", |
|
}); |
|
await settings.metaData.verifyRow({ |
|
index: 17, |
|
model: `${projectPrefix}table2`, |
|
state: "New table", |
|
}); |
|
|
|
await settings.metaData.sync(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: "Table1", |
|
state: "No change identified", |
|
}); |
|
await settings.metaData.verifyRow({ |
|
index: 17, |
|
model: "Table2", |
|
state: "No change identified", |
|
}); |
|
|
|
if (!isSqlite(context)) { |
|
// Add relation |
|
await dbExec( |
|
`ALTER TABLE ${projectPrefix}table1 ADD INDEX fk1_idx (col1 ASC) VISIBLE` |
|
); |
|
await dbExec( |
|
`ALTER TABLE ${projectPrefix}table1 ADD CONSTRAINT fk1 FOREIGN KEY (col1) REFERENCES ${projectPrefix}table2 (id) ON DELETE NO ACTION ON UPDATE NO ACTION` |
|
); |
|
await settings.metaData.clickReload(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: "Table1", |
|
state: "New relation added", |
|
}); |
|
|
|
//verify after sync |
|
await settings.metaData.sync(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: "Table1", |
|
state: "No change identified", |
|
}); |
|
|
|
// Remove relation |
|
await dbExec(`ALTER TABLE ${projectPrefix}table1 DROP FOREIGN KEY fk1`); |
|
await dbExec(`ALTER TABLE ${projectPrefix}table1 DROP INDEX fk1_idx`); |
|
await settings.metaData.clickReload(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: "Table1", |
|
state: "Relation removed", |
|
}); |
|
|
|
//verify after sync |
|
await settings.metaData.sync(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: "Table1", |
|
state: "No change identified", |
|
}); |
|
} |
|
|
|
// Add column |
|
await dbExec( |
|
isSqlite(context) |
|
? `ALTER TABLE ${projectPrefix}table1 ADD COLUMN newCol TEXT NULL` |
|
: `ALTER TABLE ${projectPrefix}table1 ADD COLUMN newCol VARCHAR(45) NULL AFTER id` |
|
); |
|
await settings.metaData.clickReload(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: `Table1`, |
|
state: "New column(newCol)", |
|
}); |
|
|
|
//verify after sync |
|
await settings.metaData.sync(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: "Table1", |
|
state: "No change identified", |
|
}); |
|
|
|
// Edit column |
|
await dbExec( |
|
isSqlite(context) |
|
? `ALTER TABLE ${projectPrefix}table1 RENAME COLUMN newCol TO newColName` |
|
: `ALTER TABLE ${projectPrefix}table1 CHANGE COLUMN newCol newColName VARCHAR(45) NULL DEFAULT NULL` |
|
); |
|
await settings.metaData.clickReload(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: `Table1`, |
|
state: "New column(newColName), Column removed(newCol)", |
|
}); |
|
|
|
//verify after sync |
|
await settings.metaData.sync(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: "Table1", |
|
state: "No change identified", |
|
}); |
|
|
|
// Delete column |
|
// todo: Add for sqlite |
|
if (!isSqlite(context)) { |
|
await dbExec(`ALTER TABLE ${projectPrefix}table1 DROP COLUMN newColName`); |
|
await settings.metaData.clickReload(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: `Table1`, |
|
state: "Column removed(newColName)", |
|
}); |
|
|
|
//verify after sync |
|
await settings.metaData.sync(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: "Table1", |
|
state: "No change identified", |
|
}); |
|
} |
|
|
|
// Delete table |
|
await dbExec(`DROP TABLE ${projectPrefix}table1`); |
|
await dbExec(`DROP TABLE ${projectPrefix}table2`); |
|
await settings.metaData.clickReload(); |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: `${projectPrefix}table1`, |
|
state: "Table removed", |
|
}); |
|
await settings.metaData.verifyRow({ |
|
index: 17, |
|
model: `${projectPrefix}table2`, |
|
state: "Table removed", |
|
}); |
|
|
|
//verify after sync |
|
await settings.metaData.sync(); |
|
|
|
if (isSqlite(context)) { |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: "CustomerList", |
|
state: "No change identified", |
|
}); |
|
await settings.metaData.verifyRow({ |
|
index: 17, |
|
model: "FilmList", |
|
state: "No change identified", |
|
}); |
|
} else { |
|
await settings.metaData.verifyRow({ |
|
index: 16, |
|
model: "ActorInfo", |
|
state: "No change identified", |
|
}); |
|
await settings.metaData.verifyRow({ |
|
index: 17, |
|
model: "CustomerList", |
|
state: "No change identified", |
|
}); |
|
} |
|
}); |
|
|
|
test("Hide, filter, sort", async () => { |
|
await dbExec( |
|
`CREATE TABLE ${projectPrefix}table1 (id INT NOT NULL, col1 INT NULL, col2 INT NULL, col3 INT NULL, col4 INT NULL, PRIMARY KEY (id))` |
|
); |
|
await dbExec( |
|
`INSERT INTO ${projectPrefix}table1 (id, col1, col2, col3, col4) VALUES (1,1,1,1,1), (2,2,2,2,2), (3,3,3,3,3), (4,4,4,4,4), (5,5,5,5,5), (6,6,6,6,6), (7,7,7,7,7), (8,8,8,8,8), (9,9,9,9,9);` |
|
); |
|
|
|
await dashboard.gotoSettings(); |
|
await settings.selectTab({tab: SettingTab.ProjectMetadata}); |
|
|
|
await settings.metaData.clickReload(); |
|
await settings.metaData.sync(); |
|
await settings.close(); |
|
|
|
await dashboard.treeView.openTable({ title: "Table1" }); |
|
|
|
await dashboard.grid.toolbar.clickFields(); |
|
await dashboard.grid.toolbar.fields.click({ title: "Col1" }); |
|
await dashboard.grid.toolbar.clickFields(); |
|
|
|
await dashboard.grid.toolbar.sort.addSort({ |
|
columnTitle: "Col1", |
|
isAscending: false, |
|
isLocallySaved: false |
|
}); |
|
|
|
await dashboard.grid.toolbar.filter.addNew({ |
|
columnTitle: "Col1", |
|
opType: ">=", |
|
value: "5", |
|
isLocallySaved: false |
|
}); |
|
|
|
await dashboard.grid.verifyRowCount({ count: 5 }); |
|
}); |
|
});
|
|
|