gristlabs_grist-core/test/nbrowser/FieldConfigTab.ntest.js
Paul Fitzpatrick bcbf57d590 (core) bump mocha version to allow parallel tests; move more tests to core
Summary:
This uses a newer version of mocha in grist-core so that tests can be run in parallel. That allows more tests to be moved without slowing things down overall. Tests moved are venerable browser tests; only the ones that "just work" or worked without too much trouble to are moved, in order to keep the diff from growing too large. Will wrestle with more in follow up.

Parallelism is at the file level, rather than the individual test.

The newer version of mocha isn't needed for grist-saas repo; tests are parallelized in our internal CI by other means. I've chosen to allocate files to workers in a cruder way than our internal CI, based on initial characters rather than an automated process. The automated process would need some reworking to be compatible with mocha running in parallel mode.

Test Plan: this diff was tested first on grist-core, then ported to grist-saas so saas repo history will correctly track history of moved files.

Reviewers: jarek

Reviewed By: jarek

Subscribers: jarek

Differential Revision: https://phab.getgrist.com/D3927
2023-06-27 02:55:34 -04:00

196 lines
8.7 KiB
JavaScript

import { assert } from 'mocha-webdriver';
import { $, gu, test } from 'test/nbrowser/gristUtil-nbrowser';
describe('FieldConfigTab.ntest', function() {
const cleanup = test.setupTestSuite(this);
before(async function() {
await gu.supportOldTimeyTestCode();
await gu.useFixtureDoc(cleanup, "Hello.grist", true);
});
afterEach(function() {
return gu.checkForErrors();
});
it("should stay open when switching between columns or views", async function() {
// Add another table to the document.
await gu.actions.addNewTable();
await gu.actions.selectTabView('Table1');
await gu.openSidePane('field');
var fieldLabel = await $(".test-field-label").wait(assert.isDisplayed).elem();
await assert.isDisplayed(fieldLabel);
assert.equal(await fieldLabel.val(), "A");
// Move cursor to a different column.
await $("$GridView_columnLabel:nth-child(2)").click();
assert.equal(await fieldLabel.val(), "B");
// Switch to another view. The first column should be selected.
await gu.actions.selectTabView('Table2');
fieldLabel = $(".test-field-label").elem();
await assert.isDisplayed(fieldLabel);
assert.equal(await fieldLabel.val(), "A");
});
it("should support changing the column label and id together", async function() {
await gu.actions.selectTabView('Table1');
var fieldLabel = await $(".test-field-label").elem();
await gu.clickCellRC(0, 0); // Move back to the first cell.
assert.equal(await fieldLabel.val(), "A");
await $(".test-field-label").sendNewText("foo");
await gu.waitForServer();
// Check that both the label and colId changed in the side pane.
assert.equal(await fieldLabel.val(), "foo");
await $(".test-field-col-id").wait(async function(el) { return assert.equal(await el.val(), "$foo"); });
// Check that the label changed among column headers.
assert.equal(await $("$GridView_columnLabel:nth-child(1)").text(), "foo");
});
it("should support changing the column label and id separately", async function() {
await gu.actions.selectTabView('Table1');
await $("$GridView_columnLabel:nth-child(2)").click();
var fieldLabel = $(".test-field-label");
assert.equal(await fieldLabel.val(), "B");
// Uncheck the "derive id" checkbox.
var deriveIdCheckbox = $(".test-field-derive-id");
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
await deriveIdCheckbox.click();
await gu.waitForServer();
assert.isFalse(await deriveIdCheckbox.is('[class*=-selected]'));
// Check that only the label changed in the side pane.
await fieldLabel.sendNewText("bar");
await gu.waitForServer();
assert.equal(await fieldLabel.val(), "bar");
await $("$GridView_columnLabel:nth-child(2)").wait(async function(el) { return assert.equal(await el.text(), "bar"); });
// Id should be unchanged, but we should be able to change it now.
assert.deepEqual(await gu.getGridValues({ rowNums: [1, 2, 3, 4], cols: [1] }),
['', 'world', '', '']);
assert(await $(".test-field-col-id").val(), "B");
await $(".test-field-col-id").sendNewText("baz");
assert(await $(".test-field-col-id").val(), "baz");
assert.equal(await fieldLabel.val(), "bar");
assert.equal(await $("$GridView_columnLabel:nth-child(1)").text(), "foo");
assert.equal(await $("$GridView_columnLabel:nth-child(2)").text(), "bar");
// Make sure the changing Ids does not effect the data in the column
assert.deepEqual(await gu.getGridValues({ rowNums: [1, 2, 3, 4], cols: [1] }),
['', 'world', '', '']);
await assert.hasClass(gu.getCell(0, 1).find('.field_clip'), 'invalid', false);
});
describe('Duplicate Labels', async function() {
let fieldLabel, deriveIdCheckbox;
beforeEach(() => {
fieldLabel = $(".test-field-label");
deriveIdCheckbox = $(".test-field-derive-id");
});
it('should allow duplicate labels with underived colIds', async function() {
// Change column 4 to have the same label as column 1
await $("$GridView_columnLabel:nth-child(4)").click();
assert.equal(await fieldLabel.val(), "D");
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
await deriveIdCheckbox.click();
await gu.waitForServer();
assert.isFalse(await deriveIdCheckbox.is('[class*=-selected]'));
await fieldLabel.sendNewText("foo");
// Columns 1 and 4 should both be named foo
await $("$GridView_columnLabel:nth-child(1)").wait(async function(el) { return assert.equal(await el.text(), "foo"); });
await $("$GridView_columnLabel:nth-child(4)").wait(async function(el) { return assert.equal(await el.text(), "foo"); });
// But colId should be unchanged
assert(await $(".test-field-col-id").val(), "D");
});
it('should allow duplicate labels with derived colIds', async function() {
// Now clicking the derive box should be leave the labels the same
// but the conflicting Id should be sanitized
await deriveIdCheckbox.click();
await gu.waitForServer();
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
await deriveIdCheckbox.click();
await gu.waitForServer();
assert.isFalse(await deriveIdCheckbox.is('[class*=-selected]'));
await $("$GridView_columnLabel:nth-child(1)").scrollIntoView({inline: "end"}).click();
await $("$GridView_columnLabel:nth-child(1)").wait(async function(el) { return assert.equal(await el.text(), "foo"); });
assert(await $(".test-field-col-id").val(), "foo");
await $("$GridView_columnLabel:nth-child(4)").click();
await $("$GridView_columnLabel:nth-child(4)").wait(async function(el) { return assert.equal(await el.text(), "foo"); });
assert(await $(".test-field-col-id").val(), "foo2");
});
it('should not change the derived id unnecessarly', async function() {
// Toggling the box should not change the derived Id
await deriveIdCheckbox.click();
await gu.waitForServer();
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
await deriveIdCheckbox.click();
await gu.waitForServer();
assert.isFalse(await deriveIdCheckbox.is('[class*=-selected]'));
assert(await $(".test-field-col-id").val(), "foo2");
});
it('should not automatically modify the derived checkbox', async function() {
// When derived labels are changed to an existing Id, the derived box should remain checked
// even if the id and label are different
await $("$GridView_columnLabel:nth-child(1)").scrollIntoView({inline: "end"}).click();
await $("$GridView_columnLabel:nth-child(1)").wait(async function(el) { return assert.equal(await el.text(), "foo"); });
assert(await $(".test-field-col-id").val(), "foo");
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
await fieldLabel.sendNewText("foo2");
await gu.waitForServer();
assert.equal(await fieldLabel.val(), "foo2");
assert(await $(".test-field-col-id").val(), "foo2_2");
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
});
it('should allow out of sync colIds to still derive from labels', async function() {
// Entering a new label should still sync the Id
await fieldLabel.sendNewText("foobar");
await gu.waitForServer();
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
await deriveIdCheckbox.click();
assert(await $(".test-field-col-id").val(), "foobar");
});
});
it("should allow editing column data after column rename", async function() {
await gu.actions.selectTabView('Table1');
await $("$GridView_columnLabel:nth-child(3)").click();
assert.equal(await $(".test-field-label").val(), "C");
// Switch type to numeric. This makes it easier to tell whether the value actually gets
// processed by the server.
await gu.setType('Numeric');
await $('.test-type-transform-apply').wait().click();
await gu.waitForServer();
var cell = await gu.getCellRC(0, 2);
await cell.click(); // row index 0, column index 2
await gu.sendKeys('17', $.ENTER);
await gu.waitForServer();
assert.equal(await cell.text(), '17');
await assert.hasClass(cell.find('.field_clip'), 'invalid', false);
// Rename the column, make sure we can still type into it, and get results from the server.
await $(".test-field-label").sendNewText("c2");
await gu.waitForServer();
assert.equal(await $("$GridView_columnLabel:nth-child(3)").text(), "c2");
await gu.waitForServer();
cell = await gu.getCellRC(0, 2);
await cell.click(); // row index 0, column index 2
await gu.sendKeys('23', $.ENTER);
await gu.waitForServer();
assert.equal(await cell.text(), '23');
await assert.hasClass(cell.find('.field_clip'), 'invalid', false);
});
});