mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
119 lines
5.1 KiB
TypeScript
119 lines
5.1 KiB
TypeScript
|
/**
|
||
|
* Test for action bundling, e.g. when changing column type. Before the action is finalized, the
|
||
|
* user has a chance to make further changes that are part of the bundle. If any change is
|
||
|
* attempted that doesn't belong in the bundle, the bundle should be finalized before the change
|
||
|
* is appled.
|
||
|
*/
|
||
|
import {assert, driver, Key} from 'mocha-webdriver';
|
||
|
import * as gu from 'test/nbrowser/gristUtils';
|
||
|
import {setupTestSuite} from 'test/nbrowser/testUtils';
|
||
|
|
||
|
describe('BundleActions', function() {
|
||
|
this.timeout(30000);
|
||
|
const cleanup = setupTestSuite();
|
||
|
|
||
|
before(async function() {
|
||
|
const mainSession = await gu.session().login();
|
||
|
await mainSession.tempNewDoc(cleanup, 'TransformBug');
|
||
|
|
||
|
// Import a file
|
||
|
await gu.importFileDialog('./uploads/UploadedData1.csv');
|
||
|
assert.equal(await driver.findWait('.test-importer-preview', 2000).isPresent(), true);
|
||
|
await driver.find('.test-modal-confirm').click();
|
||
|
await gu.waitForServer();
|
||
|
});
|
||
|
|
||
|
it('should complete transform if column is added during it', async function() {
|
||
|
// Start a transform.
|
||
|
await gu.getCell({col: 'Name', rowNum: 1}).click();
|
||
|
// This does not include a click on the "Apply" button.
|
||
|
await gu.setType(/Reference/);
|
||
|
assert.equal(await gu.getCell({col: 'Name', rowNum: 1}).matches('.transform_field'), true);
|
||
|
|
||
|
// Add a column while inside the transform.
|
||
|
await driver.find('body').sendKeys(Key.chord(Key.ALT, Key.SHIFT, '='));
|
||
|
await gu.waitForServer();
|
||
|
|
||
|
// Check there are no user-visible errors at this point.
|
||
|
assert.equal(await driver.find('.test-notifier-toast-message').isPresent(), false);
|
||
|
await gu.checkForErrors();
|
||
|
|
||
|
// Close column-rename textbox.
|
||
|
await driver.sendKeys(Key.ESCAPE);
|
||
|
|
||
|
// Check the Name column is no longer being transformed. Cells are invalid because it's now an
|
||
|
// invalid reference.
|
||
|
let cell = gu.getCell({col: 'Name', rowNum: 1});
|
||
|
assert.equal(await cell.matches('.transform_field'), false);
|
||
|
assert.equal(await cell.find('.field_clip').matches('.invalid'), true);
|
||
|
|
||
|
// Do something with the new column.
|
||
|
await driver.sendKeys("HELLO", Key.ENTER);
|
||
|
await gu.waitForServer();
|
||
|
assert.deepEqual(await gu.getVisibleGridCells({col: 'A', rowNums: [1, 2, 3]}), ['HELLO', '', '']);
|
||
|
await gu.enterFormula('str($Name).upper()');
|
||
|
assert.deepEqual(await gu.getVisibleGridCells({col: 'A', rowNums: [1, 2, 3]}), ['LILY', 'KATHY', 'KAREN']);
|
||
|
|
||
|
await gu.checkForErrors();
|
||
|
|
||
|
// Undo the column changes and the column addition.
|
||
|
await gu.undo(3);
|
||
|
|
||
|
// The transform result is still applied
|
||
|
cell = gu.getCell({col: 'Name', rowNum: 1});
|
||
|
assert.equal(await cell.find('.field_clip').matches('.invalid'), true);
|
||
|
assert.equal(await cell.matches('.transform_field'), false);
|
||
|
assert.equal(await driver.find('.test-fbuilder-type-select').getText(), "Reference");
|
||
|
|
||
|
// Undo the transform now.
|
||
|
await gu.undo();
|
||
|
|
||
|
cell = gu.getCell({col: 'Name', rowNum: 1});
|
||
|
assert.equal(await cell.find('.field_clip').matches('.invalid'), false);
|
||
|
assert.equal(await cell.matches('.transform_field'), false);
|
||
|
assert.deepEqual(await gu.getVisibleGridCells({col: 'Name', rowNums: [1, 2, 3]}), ['Lily', 'Kathy', 'Karen']);
|
||
|
assert.equal(await driver.find('.test-fbuilder-type-select').getText(), "Text");
|
||
|
await gu.checkForErrors();
|
||
|
|
||
|
// For good measure, check that REDO works too.
|
||
|
await gu.redo(4);
|
||
|
assert.deepEqual(await gu.getVisibleGridCells({col: 'A', rowNums: [1, 2, 3]}), ['LILY', 'KATHY', 'KAREN']);
|
||
|
cell = gu.getCell({col: 'Name', rowNum: 1});
|
||
|
assert.equal(await cell.find('.field_clip').matches('.invalid'), true);
|
||
|
assert.equal(await cell.matches('.transform_field'), false);
|
||
|
await cell.click();
|
||
|
assert.equal(await driver.find('.test-fbuilder-type-select').getText(), "Reference");
|
||
|
await gu.checkForErrors();
|
||
|
|
||
|
// And back to where we started.
|
||
|
await gu.undo(4);
|
||
|
});
|
||
|
|
||
|
it('should complete transform if a page widget is added during it', async function() {
|
||
|
// Start a transform.
|
||
|
await gu.getCell({col: 'Name', rowNum: 1}).click();
|
||
|
await gu.setType(/Reference/); // This does not include a click on the "Apply" button.
|
||
|
assert.equal(await gu.getCell({col: 'Name', rowNum: 1}).matches('.transform_field'), true);
|
||
|
|
||
|
await gu.addNewSection(/Table/, /New Table/);
|
||
|
|
||
|
// Check there are no user-visible errors at this point.
|
||
|
assert.equal(await driver.find('.test-notifier-toast-message').isPresent(), false);
|
||
|
await gu.checkForErrors();
|
||
|
|
||
|
// Check that we see two sections.
|
||
|
assert.deepEqual(await gu.getSectionTitles(), ['UPLOADEDDATA1', 'TABLE2']);
|
||
|
await gu.getCell({col: 'Name', rowNum: 1, section: "UPLOADEDDATA1"}).click();
|
||
|
assert.equal(await driver.find('.test-fbuilder-type-select').getText(), "Reference");
|
||
|
|
||
|
// Undo both actions.
|
||
|
await gu.undo(2);
|
||
|
assert.deepEqual(await gu.getSectionTitles(), ['UPLOADEDDATA1']);
|
||
|
await gu.getCell({col: 'Name', rowNum: 1, section: "UPLOADEDDATA1"}).click();
|
||
|
assert.equal(await driver.find('.test-fbuilder-type-select').getText(), "Text");
|
||
|
|
||
|
assert.equal(await driver.find('.test-notifier-toast-message').isPresent(), false);
|
||
|
await gu.checkForErrors();
|
||
|
});
|
||
|
});
|