mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
162 lines
6.4 KiB
JavaScript
162 lines
6.4 KiB
JavaScript
|
/* global window */
|
||
|
|
||
|
import { assert, driver } from 'mocha-webdriver';
|
||
|
import { $, gu, test } from 'test/nbrowser/gristUtil-nbrowser';
|
||
|
|
||
|
describe('NewDocument.ntest', function() {
|
||
|
test.setupTestSuite(this);
|
||
|
|
||
|
before(async function() {
|
||
|
await gu.supportOldTimeyTestCode();
|
||
|
});
|
||
|
|
||
|
afterEach(function() {
|
||
|
return gu.checkForErrors();
|
||
|
});
|
||
|
|
||
|
it('should create new Untitled document', async function() {
|
||
|
this.timeout(10000);
|
||
|
await gu.actions.createNewDoc('Untitled');
|
||
|
assert.equal(await gu.actions.getDocTitle(), 'Untitled');
|
||
|
assert.equal(await driver.getTitle(), 'Untitled - Grist');
|
||
|
assert.equal(await $('.active_section .test-viewsection-title').wait().text(), 'TABLE1');
|
||
|
await gu.waitForServer();
|
||
|
});
|
||
|
|
||
|
it('should start with a 1x3 grid', async function() {
|
||
|
await $('.record.record-add').wait();
|
||
|
assert.lengthOf(await $('.grid_view_data .record:not(.column_names)').array(), 1, 'should have 1 row ("add" row)');
|
||
|
assert.lengthOf(await $('.column_names .column_name').array(), 4, 'should have 3 columns and 1 "add" column');
|
||
|
});
|
||
|
|
||
|
it('should have first cell selected', async function() {
|
||
|
assert.isDisplayed(await gu.getCellRC(0, 0).find('.active_cursor'));
|
||
|
});
|
||
|
|
||
|
it('should open notify toasts on errors', async function() {
|
||
|
// Verify that uncaught exceptions and errors from server cause the notifications box to open.
|
||
|
|
||
|
// For a plain browser error, we attach an error-throwing handler to click-on-logo.
|
||
|
await driver.executeScript(
|
||
|
'setTimeout(() => window.gristApp.testTriggerError("Our fake error"))', 0);
|
||
|
|
||
|
// Wait for the notifications window to open and check it has the error we expect.
|
||
|
await $('.test-notifier-toast-message').wait(1, assert.isDisplayed);
|
||
|
assert.match(await $('.test-notifier-toast-message').last().text(), /Our fake error/);
|
||
|
|
||
|
// Close the notifications window.
|
||
|
await $(".test-notifier-toast-close").click();
|
||
|
await assert.isPresent($('.test-notifier-toast-message'), false);
|
||
|
|
||
|
// Try a server command that should fail. We need a reasonble timeout for executeAsyncScript.
|
||
|
await driver.manage().setTimeouts({script: 500});
|
||
|
let result = await driver.executeAsyncScript(() => {
|
||
|
var cb = arguments[arguments.length - 1];
|
||
|
window.gristApp.comm.getDocList()
|
||
|
.then(
|
||
|
newName => cb("unexpected success"),
|
||
|
err => { cb(err.toString()); throw err; }
|
||
|
);
|
||
|
});
|
||
|
assert.match(result, /Unknown method getDocList/);
|
||
|
|
||
|
// Now make sure the notifications window is open and has the error we expect.
|
||
|
await assert.isDisplayed($('.test-notifier-toast-message'));
|
||
|
assert.match(await $('.test-notifier-toast-message').last().text(), /Unknown method getDocList/);
|
||
|
|
||
|
// Close the notifications window.
|
||
|
await $(".test-notifier-toast-close").click();
|
||
|
await assert.isPresent($('.test-notifier-toast-message'), false);
|
||
|
|
||
|
assert.deepEqual(await driver.executeScript(() => window.getAppErrors()),
|
||
|
['Our fake error', 'Unknown method getDocList']);
|
||
|
await driver.executeScript(
|
||
|
'setTimeout(() => window.gristApp.topAppModel.notifier.clearAppErrors())');
|
||
|
});
|
||
|
|
||
|
describe('Cell editing', function() {
|
||
|
|
||
|
it('should add rows on entering new data', async function() {
|
||
|
assert.equal(await gu.getGridRowCount(), 1);
|
||
|
await gu.getCellRC(0, 0).click();
|
||
|
await gu.sendKeys('hello', $.ENTER);
|
||
|
await gu.waitForServer();
|
||
|
await gu.getCellRC(1, 1).click();
|
||
|
await gu.sendKeys('world', $.ENTER);
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await gu.getGridRowCount(), 3);
|
||
|
});
|
||
|
|
||
|
it('should edit on Enter, cancel on Escape, save on Enter', async function() {
|
||
|
var cell_1_b = gu.getCellRC(0, 1);
|
||
|
assert.equal(await cell_1_b.text(), '');
|
||
|
await cell_1_b.click();
|
||
|
|
||
|
await gu.sendKeys($.ENTER);
|
||
|
await $('.test-widget-text-editor').wait();
|
||
|
await gu.sendKeys('foo', $.ESCAPE);
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await cell_1_b.text(), '');
|
||
|
|
||
|
await gu.sendKeys($.ENTER);
|
||
|
await $('.test-widget-text-editor').wait();
|
||
|
await gu.sendKeys('bar', $.ENTER);
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await cell_1_b.text(), 'bar');
|
||
|
});
|
||
|
|
||
|
it('should append to cell with content on Enter', async function() {
|
||
|
var cell_1_a = gu.getCellRC(0, 0);
|
||
|
assert.equal(await cell_1_a.text(), 'hello');
|
||
|
await cell_1_a.click();
|
||
|
|
||
|
await gu.sendKeys($.ENTER);
|
||
|
await $('.test-widget-text-editor').wait();
|
||
|
assert.equal(await $('.test-widget-text-editor textarea').val(), 'hello');
|
||
|
await gu.sendKeys(', world!', $.ENTER);
|
||
|
await gu.waitForServer();
|
||
|
|
||
|
assert.equal(await cell_1_a.text(), 'hello, world!');
|
||
|
});
|
||
|
|
||
|
it('should clear data in selected cells on Backspace and Delete', async function() {
|
||
|
let testDelete = async function(delKey) {
|
||
|
// should clear a single cell
|
||
|
var cell_1_a = gu.getCellRC(0, 0);
|
||
|
await cell_1_a.click();
|
||
|
await gu.sendKeys('A1', $.ENTER);
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await cell_1_a.text(), 'A1');
|
||
|
await cell_1_a.click();
|
||
|
await gu.sendKeys(delKey);
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await cell_1_a.text(), '');
|
||
|
|
||
|
// should clear a selection of cells
|
||
|
await gu.enterGridValues(0, 0, [['A1', 'A2'], ['B1', 'B2']]);
|
||
|
await gu.waitForServer();
|
||
|
assert.deepEqual(await gu.getGridValues({ rowNums: [1, 2], cols: [0, 1] }), ['A1', 'B1', 'A2', 'B2']);
|
||
|
await cell_1_a.click();
|
||
|
await gu.sendKeys([$.SHIFT, $.RIGHT], [$.SHIFT, $.DOWN], delKey);
|
||
|
await gu.waitForServer();
|
||
|
assert.deepEqual(await gu.getGridValues({ rowNums: [1, 2], cols: [0, 1] }), ['', '', '', '']);
|
||
|
|
||
|
// should clear a selection of cells with a formula column
|
||
|
await gu.enterGridValues(0, 0, [['A1', 'A2'], ['B1', 'B2']]);
|
||
|
await gu.clickCellRC(0, 2);
|
||
|
await gu.sendKeys('=', '$A', $.ENTER);
|
||
|
await gu.waitForServer();
|
||
|
assert.deepEqual(await gu.getGridValues({ rowNums: [1, 2], cols: [0, 1, 2] }),
|
||
|
['A1', 'B1', 'A1', 'A2', 'B2', 'A2']);
|
||
|
await gu.clickCellRC(0, 1);
|
||
|
await gu.sendKeys([$.SHIFT, $.RIGHT], [$.SHIFT, $.DOWN], delKey);
|
||
|
await gu.waitForServer();
|
||
|
assert.deepEqual(await gu.getGridValues({ rowNums: [1, 2], cols: [0, 1, 2] }),
|
||
|
[ 'A1', '', 'A1', 'A2', '', 'A2' ]);
|
||
|
};
|
||
|
await testDelete($.BACK_SPACE);
|
||
|
await testDelete($.DELETE);
|
||
|
});
|
||
|
});
|
||
|
});
|