mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
152 lines
5.7 KiB
JavaScript
152 lines
5.7 KiB
JavaScript
|
import { assert } from 'mocha-webdriver';
|
||
|
import { $, gu, test } from 'test/nbrowser/gristUtil-nbrowser';
|
||
|
|
||
|
describe('Properties.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("webdriver should handle parens and other keys", async function() {
|
||
|
// This isn't a test of properties really, but a test of Selenium: speficically that the
|
||
|
// workaround for Selenium bugs in gu.sendKeys actually works.
|
||
|
await $("$GridView_columnLabel").first().click();
|
||
|
|
||
|
// We'll undo afterwards, and verify that we got the same text back.
|
||
|
var text = await gu.getCellRC(0, 0).text();
|
||
|
|
||
|
var specialChars = "()[]{}~!@#$%^&*-_=+/?><.,'\";:";
|
||
|
await gu.sendKeys(specialChars + specialChars, $.ENTER);
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await gu.getCellRC(0, 0).text(), specialChars + specialChars);
|
||
|
|
||
|
// Undo and compare to previous value.
|
||
|
await gu.sendKeys([$.MOD, 'z']);
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await gu.getCellRC(0, 0).text(), text);
|
||
|
});
|
||
|
|
||
|
it("cells should indicate when conversion fails for a value", async function() {
|
||
|
await $("$GridView_columnLabel:nth-child(2)").click();
|
||
|
|
||
|
// Fill in a column of values, some numeric, some not.
|
||
|
await gu.enterGridValues(0, 1, [["17", "foo", "", "-100"]]);
|
||
|
await gu.waitForServer();
|
||
|
|
||
|
assert.deepEqual(await gu.getVisibleGridCells(1, [1, 2, 3, 4]),
|
||
|
["17", "foo", "", "-100"]);
|
||
|
await $("$GridView_columnLabel:nth-child(2)").click();
|
||
|
|
||
|
// Convert the column to Numeric.
|
||
|
await gu.openSidePane('field');
|
||
|
assert.equal(await $(".test-field-label").val(), 'B');
|
||
|
await gu.setType('Numeric');
|
||
|
await $('.test-type-transform-apply').wait().click();
|
||
|
|
||
|
assert.deepEqual(await gu.getVisibleGridCells(1, [1, 2, 3, 4]),
|
||
|
["17", "foo", "", "-100"]);
|
||
|
|
||
|
// Undo of conversion should restore old values.
|
||
|
await gu.undo();
|
||
|
await $(".test-fbuilder-type-select .test-select-row:contains(Text)").wait();
|
||
|
assert.deepEqual(await gu.getVisibleGridCells(1, [1, 2, 3, 4]),
|
||
|
["17", "foo", "", "-100"]);
|
||
|
|
||
|
// Redo should work too.
|
||
|
await $(".test-redo").click();
|
||
|
await $(".test-fbuilder-type-select .test-select-row:contains(Numeric)").wait();
|
||
|
await gu.waitForServer();
|
||
|
assert.deepEqual(await gu.getVisibleGridCells(1, [1, 2, 3, 4]),
|
||
|
["17", "foo", "", "-100"]);
|
||
|
});
|
||
|
|
||
|
it("cells should indicate when new value is wrong type", async function() {
|
||
|
// Go to column "c", and change type to Numeric.
|
||
|
await $("$GridView_columnLabel:nth-child(3)").click();
|
||
|
assert.equal(await $(".test-field-label").val(), 'C');
|
||
|
await gu.setType('Numeric');
|
||
|
await $('.test-type-transform-apply').wait().click();
|
||
|
await gu.waitForServer();
|
||
|
|
||
|
// Remove focus from FieldBuilder type dropdown, so that sentKeys go to the main app.
|
||
|
await $("body").click();
|
||
|
|
||
|
// Fill in a column of values, some numeric, some not.
|
||
|
await gu.enterGridValues(0, 2, [["25", "", "bar", "-123"]]);
|
||
|
await gu.waitForServer();
|
||
|
|
||
|
// TODO: The 0.00 might be wrong behavior: we probably want an empty cell here, although when
|
||
|
// converting an empty text cell to numeric, we want it to become 0. In other words, not all
|
||
|
// conversions are the same.
|
||
|
assert.deepEqual(await gu.getVisibleGridCells(2, [1, 2, 3, 4]),
|
||
|
["25", "", "bar", "-123"]);
|
||
|
assert.deepEqual(await gu.getVisibleGridCells({
|
||
|
col: 2,
|
||
|
rowNums: [1, 2, 3, 4],
|
||
|
mapper: e => e.find('.field_clip').hasClass('invalid'),
|
||
|
}), [false, false, true, false]);
|
||
|
|
||
|
// Select the column again, and type in values in a different order. Ensure the cells change
|
||
|
// appropriately.
|
||
|
await $("$GridView_columnLabel:nth-child(3)").click();
|
||
|
await gu.enterGridValues(0, 2, [["", "bar", "-123", "25"]]);
|
||
|
await gu.waitForServer();
|
||
|
|
||
|
// TODO: The first cell might be wrong behavior; we probably want an empty cell after DELETE.
|
||
|
assert.deepEqual(await gu.getVisibleGridCells(2, [1, 2, 3, 4]),
|
||
|
["", "bar", "-123", "25"]);
|
||
|
assert.deepEqual(await gu.getVisibleGridCells({
|
||
|
col: 2,
|
||
|
rowNums: [1, 2, 3, 4],
|
||
|
mapper: e => e.find('.field_clip').hasClass('invalid')
|
||
|
}), [false, true, false, false]);
|
||
|
});
|
||
|
|
||
|
it("formula errors should be indicated", async function() {
|
||
|
// Go to column "E", and change formula to eval column "D".
|
||
|
await $("$GridView_columnLabel:nth-child(5)").click();
|
||
|
await gu.sendKeys("eval($D)", $.ENTER);
|
||
|
// Fill in a bunch of formula text for the "eval" formula to try. This is a way to get a whole
|
||
|
// bunch of different errors in one columns.
|
||
|
await $("$GridView_columnLabel:nth-child(4)").click();
|
||
|
assert.equal(await $(".test-field-label").val(), 'D');
|
||
|
await gu.setType('Text');
|
||
|
|
||
|
await gu.enterGridValues(0, 3, [[
|
||
|
"25",
|
||
|
"",
|
||
|
"asdf",
|
||
|
"ValueError()",
|
||
|
"__import__('sys').exit(3)",
|
||
|
'u"résumé 三"',
|
||
|
"12/(2-1-1)",
|
||
|
"[1,2,3]"]]);
|
||
|
await gu.waitForServer();
|
||
|
|
||
|
assert.deepEqual(await gu.getVisibleGridCells(4, [1, 2, 3, 4, 5, 6, 7, 8]), [
|
||
|
"25",
|
||
|
"#SyntaxError",
|
||
|
"#NameError",
|
||
|
"ValueError()",
|
||
|
"#SystemExit",
|
||
|
'résumé 三',
|
||
|
"#DIV/0!",
|
||
|
"1, 2, 3",
|
||
|
]);
|
||
|
|
||
|
assert.deepEqual(
|
||
|
await gu.getVisibleGridCells({
|
||
|
col: 4,
|
||
|
rowNums: [1, 2, 3, 4, 5, 6, 7, 8],
|
||
|
mapper: e => e.find('.field_clip').hasClass("invalid")
|
||
|
}),
|
||
|
// Last one (list) is valid because lists are a supported type of value.
|
||
|
[false, true, true, true, true, false, true, false]);
|
||
|
});
|
||
|
});
|