gristlabs_grist-core/test/nbrowser/SelectBySummaryRef.ts

189 lines
7.8 KiB
TypeScript
Raw Normal View History

import {addToRepl, assert, driver, Key} from 'mocha-webdriver';
import * as gu from 'test/nbrowser/gristUtils';
import {server, setupTestSuite} from 'test/nbrowser/testUtils';
describe('SelectBySummaryRef', function() {
this.timeout(20000);
setupTestSuite();
addToRepl('gu2', gu);
before(async function(){
await server.simulateLogin("Chimpy", "chimpy@getgrist.com", 'nasa');
const doc = await gu.importFixturesDoc('chimpy', 'nasa', 'Horizon',
'SelectBySummaryRef.grist', false);
await driver.get(`${server.getHost()}/o/nasa/doc/${doc.id}`);
await gu.waitForDocToLoad();
});
it('should give correct options when linking with a summary table with ref/reflist columns', async () => {
/*
The doc has 3 tables on one page with these columns:
1. Source:
- 'Other ref' is a reflist to 'Other'
2. Summary (a summary table of Source):
- 'Other ref' is the groupby column, so now it's a *ref* to 'Other', hence the column name in Source
- 'Source ref' is a ref to Source
- 'Source reflist' is a reflist to Source
- 'group' is the usual group column in summary tables (a reflist to Source) which is hidden from the options.
3. Other:
- 'Text' which won't be mentioned again since it's not a reference or anything.
- 'Source ref' is a ref to Source
*/
const sourceOptions = [
'Other',
'Other • Source ref',
'Summary',
'Summary • Other ref',
'Summary • Source ref',
'Summary • Source reflist',
];
const summaryOptions = [
'Source → Source ref',
'Source → Source reflist',
'Source • Other ref',
'Other',
'Other • Source ref → Source ref',
'Other • Source ref → Source reflist',
];
const otherOptions = [
'Source',
'Source • Other ref',
'Summary • Other ref',
'Summary → Source ref',
'Summary • Source ref',
'Summary • Source reflist',
];
await checkRightPanelSelectByOptions('Source', sourceOptions);
await checkRightPanelSelectByOptions('Other', otherOptions);
await checkRightPanelSelectByOptions('Summary', summaryOptions);
// Detach the summary table
await driver.find('.test-detach-button').click();
await gu.waitForServer();
// Each widget now has an option to select by the `group` reflist column of Summary
// in place of selecting by 'summaryness'.
const sourceOptionsWithGroup = [...sourceOptions, 'Summary • group'];
assert.deepEqual(sourceOptionsWithGroup.splice(2, 1), ['Summary']);
const otherOptionsWithGroup = [...otherOptions, 'Summary • group'];
assert.deepEqual(otherOptionsWithGroup.splice(3, 1), ['Summary → Source ref']);
// The summary table has also gained new options to select by the group column.
// There were no corresponding 'summaryness' options before because a summary table can't select by its source table
// (based purely on summaryness), only the other way around.
// Same for selecting by a reference to the source table.
// Such options are theoretically possible but are disabled because they're a bit weird,
// usually filter linking to a single row when cursor linking would make more sense and still not be very useful.
const summaryOptionsWithGroup = [...summaryOptions, 'Other • Source ref → group'];
summaryOptionsWithGroup.splice(2, 0, 'Source → group');
await checkRightPanelSelectByOptions('Source', sourceOptionsWithGroup);
await checkRightPanelSelectByOptions('Other', otherOptionsWithGroup);
await checkRightPanelSelectByOptions('Summary', summaryOptionsWithGroup);
// Undo detaching the summary table
await gu.undo();
});
it('should give correct options when adding a new summary table', async () => {
// Go to the second page in the document, which only has a widget for the 'Other' table
await gu.getPageItem("Other").click();
await gu.openAddWidgetToPage();
// Sanity check for the select by options of the plain table
await gu.selectWidget('Table', 'Other', {dontAdd: true});
await checkAddWidgetSelectByOptions([
'Other',
'Other • Source ref',
]);
// Select by options for summary tables of Other only exist when grouping by Source ref
await gu.selectWidget('Table', 'Other', {dontAdd: true, summarize: []});
await checkAddWidgetSelectByOptions(null);
await gu.selectWidget('Table', 'Other', {dontAdd: true, summarize: ['Text']});
await checkAddWidgetSelectByOptions(null);
await gu.selectWidget('Table', 'Other', {dontAdd: true, summarize: ['Source ref']});
// Note that in this case we are inferring options for a table that doesn't exist anywhere yet
await checkAddWidgetSelectByOptions([
'Other • Source ref',
]);
// Actually add the summary table in the last case above, selected by the only option
await gu.selectWidget('Table', 'Other',
{selectBy: 'Other • Source ref', summarize: ['Source ref']});
// Check that the link is actually there in the right panel and that the options are the same as when adding.
await checkCurrentSelectBy('Other • Source ref');
await checkRightPanelSelectByOptions('OTHER [by Source ref]', [
'Other • Source ref',
]);
// Undo adding the summary table
await gu.undo();
});
it('should give correct options when adding an existing summary table', async () => {
// Go to the second page in the document, which only has a widget for the 'Other' table
await gu.getPageItem("Other").click();
await gu.openAddWidgetToPage();
// Sanity check for the select by options of the plain table
await gu.selectWidget('Table', 'Source', {dontAdd: true});
await checkAddWidgetSelectByOptions([
'Other',
'Other • Source ref',
]);
// No select by options for summary table without groupby columns
await gu.selectWidget('Table', 'Source', {dontAdd: true, summarize: []});
await checkAddWidgetSelectByOptions(null);
// This summary table already exists on the first page.
// '→ Source ref' and '→ Source reflist' refer to formula columns in the summary table that
// don't exist by default.
await gu.selectWidget('Table', 'Source', {dontAdd: true, summarize: ['Other ref']});
await checkAddWidgetSelectByOptions([
'Other',
'Other • Source ref → Source ref',
'Other • Source ref → Source reflist',
]);
// Actually add the summary table in the last case above, selected by the second option
await gu.selectWidget('Table', 'Source',
{selectBy: 'Other • Source ref → Source ref', summarize: ['Other ref']});
// Check that the link is actually there in the right panel and that the options are the same as when adding.
await checkCurrentSelectBy('Other • Source ref → Source ref');
await checkRightPanelSelectByOptions('SOURCE [by Other ref]', [
'Other',
'Other • Source ref → Source ref',
'Other • Source ref → Source reflist',
]);
});
});
// Check that the 'Select by' menu in the right panel for the section has the expected options
async function checkRightPanelSelectByOptions(section: string, expected: string[]) {
await gu.openSelectByForSection(section);
const actual = await driver.findAll('.test-select-menu .test-select-row', (e) => e.getText());
assert.deepEqual(actual, ['Select Widget', ...expected]);
await gu.sendKeys(Key.ESCAPE);
}
async function checkAddWidgetSelectByOptions(expected: string[]|null) {
const actual = await driver.findAll('.test-wselect-selectby option', (e) => e.getText());
assert.deepEqual(actual, expected === null ? [] : ['', 'Select Widget', ...expected]);
}
async function checkCurrentSelectBy(expected: string) {
const actual = await driver.find('.test-right-select-by').getText();
assert.equal(actual, expected);
}