Skip to content

Commit c0a030b

Browse files
author
Marius Conjeaud
committed
Write tests for array render method
1 parent 54528c8 commit c0a030b

File tree

5 files changed

+217
-44
lines changed

5 files changed

+217
-44
lines changed

cypress/e2e/render/array.cy.js

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import { stringArrayCypherQuery, intArrayCypherQuery, pathArrayCypherQuery } from '../../fixtures/cypher_queries';
2+
import {
3+
enableReportActions,
4+
createReportOfType,
5+
closeSettings,
6+
toggleTableTranspose,
7+
openReportActionsMenu,
8+
} from '../utils';
9+
10+
const WAITING_TIME = 20000;
11+
const CARD_SELECTOR = 'main .react-grid-item:eq(2)';
12+
// Ignore warnings that may appear when using the Cypress dev server
13+
Cypress.on('uncaught:exception', (err, runnable) => {
14+
console.log(err, runnable);
15+
return false;
16+
});
17+
18+
describe('Testing array rendering', () => {
19+
beforeEach('open neodash', () => {
20+
cy.viewport(1920, 1080);
21+
cy.visit('/', {
22+
onBeforeLoad(win) {
23+
win.localStorage.clear();
24+
},
25+
});
26+
27+
cy.get('#form-dialog-title', { WAITING_TIME: WAITING_TIME })
28+
.should('contain', 'NeoDash - Neo4j Dashboard Builder')
29+
.click();
30+
31+
cy.get('#form-dialog-title').then(($div) => {
32+
const text = $div.text();
33+
if (text == 'NeoDash - Neo4j Dashboard Builder') {
34+
cy.wait(500);
35+
// Create new dashboard
36+
cy.contains('New Dashboard').click();
37+
}
38+
});
39+
40+
cy.get('#form-dialog-title', { WAITING_TIME: WAITING_TIME }).should('contain', 'Connect to Neo4j');
41+
42+
cy.get('#url').clear().type('localhost');
43+
cy.get('#dbusername').clear().type('neo4j');
44+
cy.get('#dbpassword').type('test1234');
45+
cy.get('button').contains('Connect').click();
46+
cy.wait(100);
47+
});
48+
49+
it('creates a table that contains string arrays', () => {
50+
cy.checkInitialState();
51+
enableReportActions();
52+
createReportOfType('Table', stringArrayCypherQuery, true, true);
53+
54+
// Standard array, displays strings joined with comma and whitespace
55+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`).should('have.text', 'initial, list');
56+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', 'other, list');
57+
58+
// Now, transpose the table
59+
toggleTableTranspose(CARD_SELECTOR, true);
60+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-columnHeaderTitle:eq(1)`, { timeout: WAITING_TIME }).should(
61+
'have.text',
62+
'initial,list'
63+
);
64+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', 'other, list');
65+
66+
// Transpose back
67+
// And add a report action
68+
toggleTableTranspose(CARD_SELECTOR, false);
69+
openReportActionsMenu(CARD_SELECTOR);
70+
cy.get('.ndl-modal').find('button[aria-label="add"]').click();
71+
cy.get('.ndl-modal').find('input:eq(2)').type('column');
72+
cy.get('.ndl-modal').find('input:eq(5)').type('test_param');
73+
cy.get('.ndl-modal').find('input:eq(6)').type('column');
74+
cy.get('.ndl-modal').find('button').contains('Save').click();
75+
closeSettings(CARD_SELECTOR);
76+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`)
77+
.find('button')
78+
.should('be.visible')
79+
.should('have.text', 'initial, list')
80+
.click();
81+
82+
// Previous step's click set a parameter from the array
83+
// Test that parameter rendering works
84+
cy.get(`${CARD_SELECTOR} .MuiCardHeader-root`).find('input').type('$neodash_test_param').blur();
85+
cy.get(`${CARD_SELECTOR} .MuiCardHeader-root`).find('input').should('have.value', 'initial, list');
86+
});
87+
88+
it.skip('creates a table that contains int arrays', () => {
89+
cy.checkInitialState();
90+
createReportOfType('Table', intArrayCypherQuery, true, true);
91+
92+
// Standard array, displays strings joined with comma and whitespace
93+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`).should('have.text', '1, 2');
94+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', '3, 4');
95+
96+
// Now, transpose the table
97+
toggleTableTranspose(CARD_SELECTOR, true);
98+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-columnHeaderTitle:eq(1)`, { timeout: WAITING_TIME }).should(
99+
'have.text',
100+
'1,2'
101+
);
102+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', '3, 4');
103+
});
104+
105+
it.skip('creates a table that contains nodes and rels', () => {
106+
cy.checkInitialState();
107+
createReportOfType('Table', pathArrayCypherQuery, true, true);
108+
109+
// Standard array, displays a path with two nodes and a relationship
110+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`).should('have.text', 'PersonACTED_INMovie');
111+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0) button`).should('have.length', 2);
112+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0) button:eq(0)`).should('have.text', 'Person');
113+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0) button:eq(1)`).should('have.text', 'Movie');
114+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0) .MuiChip-root`).should('have.length', 1);
115+
cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0) .MuiChip-root`).should('have.text', 'ACTED_IN');
116+
});
117+
118+
it.skip('creates a single value report which is an array', () => {
119+
cy.checkInitialState();
120+
createReportOfType('Single Value', stringArrayCypherQuery, true, true);
121+
cy.get(CARD_SELECTOR).should('have.text', 'initial, list');
122+
});
123+
});

cypress/e2e/start_page.cy.js

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
gaugeChartCypherQuery,
1111
formCypherQuery,
1212
} from '../fixtures/cypher_queries';
13+
import { createReportOfType, selectReportOfType, enableAdvancedVisualizations, enableFormsExtension } from './utils';
1314

1415
const WAITING_TIME = 20000;
1516
// Ignore warnings that may appear when using the Cypress dev server
@@ -293,46 +294,3 @@ describe('NeoDash E2E Tests', () => {
293294
}
294295
});
295296
});
296-
297-
function enableAdvancedVisualizations() {
298-
cy.get('main button[aria-label="Extensions').should('be.visible').click();
299-
cy.get('#checkbox-advanced-charts').should('be.visible').click();
300-
cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click();
301-
cy.wait(200);
302-
}
303-
304-
function enableFormsExtension() {
305-
cy.get('main button[aria-label="Extensions').should('be.visible').click();
306-
cy.get('#checkbox-forms').scrollIntoView();
307-
cy.get('#checkbox-forms').should('be.visible').click();
308-
cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click();
309-
cy.wait(200);
310-
}
311-
312-
function selectReportOfType(type) {
313-
cy.get('main .react-grid-item button[aria-label="add report"]').should('be.visible').click();
314-
cy.get('main .react-grid-item')
315-
.contains('No query specified.')
316-
.parentsUntil('.react-grid-item')
317-
.find('button[aria-label="settings"]', { timeout: 2000 })
318-
.should('be.visible')
319-
.click();
320-
cy.get('main .react-grid-item:eq(2) #type', { timeout: 2000 }).should('be.visible').click();
321-
cy.contains(type).click();
322-
cy.wait(100);
323-
}
324-
325-
function createReportOfType(type, query, fast = false, run = true) {
326-
selectReportOfType(type);
327-
if (fast) {
328-
cy.get('main .react-grid-item:eq(2) .ReactCodeMirror').type(query, { delay: 1, parseSpecialCharSequences: false });
329-
} else {
330-
cy.get('main .react-grid-item:eq(2) .ReactCodeMirror').type(query, { parseSpecialCharSequences: false });
331-
}
332-
cy.wait(400);
333-
334-
cy.get('main .react-grid-item:eq(2)').contains('Advanced settings').click();
335-
if (run) {
336-
cy.get('main .react-grid-item:eq(2) button[aria-label="run"]').click();
337-
}
338-
}

cypress/e2e/utils.js

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
export function enableReportActions() {
2+
cy.get('main button[aria-label="Extensions').should('be.visible').click();
3+
cy.get('#checkbox-actions').scrollIntoView();
4+
cy.get('#checkbox-actions').should('be.visible').click();
5+
cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click();
6+
cy.wait(200);
7+
}
8+
9+
export function enableAdvancedVisualizations() {
10+
cy.get('main button[aria-label="Extensions').should('be.visible').click();
11+
cy.get('#checkbox-advanced-charts').should('be.visible').click();
12+
cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click();
13+
cy.wait(200);
14+
}
15+
16+
export function enableFormsExtension() {
17+
cy.get('main button[aria-label="Extensions').should('be.visible').click();
18+
cy.get('#checkbox-forms').scrollIntoView();
19+
cy.get('#checkbox-forms').should('be.visible').click();
20+
cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click();
21+
cy.wait(200);
22+
}
23+
24+
export function selectReportOfType(type) {
25+
cy.get('main .react-grid-item button[aria-label="add report"]').should('be.visible').click();
26+
cy.get('main .react-grid-item')
27+
.contains('No query specified.')
28+
.parentsUntil('.react-grid-item')
29+
.find('button[aria-label="settings"]', { timeout: 2000 })
30+
.should('be.visible')
31+
.click();
32+
cy.get('main .react-grid-item:eq(2) #type', { timeout: 2000 }).should('be.visible').click();
33+
cy.contains(type).click();
34+
cy.wait(100);
35+
}
36+
37+
export function createReportOfType(type, query, fast = false, run = true) {
38+
selectReportOfType(type);
39+
if (fast) {
40+
cy.get('main .react-grid-item:eq(2) .ReactCodeMirror').type(query, { delay: 1, parseSpecialCharSequences: false });
41+
} else {
42+
cy.get('main .react-grid-item:eq(2) .ReactCodeMirror').type(query, { parseSpecialCharSequences: false });
43+
}
44+
cy.wait(400);
45+
46+
if (run) {
47+
closeSettings('main .react-grid-item:eq(2)');
48+
}
49+
}
50+
51+
export function openSettings(cardSelector) {
52+
cy.get(cardSelector).find('button[aria-label="settings"]', { WAITING_TIME: 2000 }).click();
53+
}
54+
55+
export function closeSettings(cardSelector) {
56+
cy.get(`${cardSelector} button[aria-label="run"]`).click();
57+
}
58+
59+
export function openAdvancedSettings(cardSelector) {
60+
openSettings(cardSelector);
61+
cy.get(cardSelector).contains('Advanced settings').click();
62+
}
63+
64+
export function closeAdvancedSettings(cardSelector) {
65+
cy.get(cardSelector).contains('Advanced settings').click();
66+
closeSettings(cardSelector);
67+
}
68+
69+
export function openReportActionsMenu(cardSelector) {
70+
openSettings(cardSelector);
71+
cy.get(cardSelector).find('button[aria-label="custom actions"]').click();
72+
}
73+
74+
export function updateDropdownAdvancedSetting(cardSelector, settingLabel, targetValue) {
75+
openAdvancedSettings(cardSelector);
76+
cy.get(`${cardSelector} .ndl-dropdown`).contains(settingLabel).siblings('div').click();
77+
cy.contains(targetValue).click();
78+
closeAdvancedSettings(cardSelector);
79+
}
80+
81+
export function toggleTableTranspose(cardSelector, enable) {
82+
let transpose = enable ? 'on' : 'off';
83+
updateDropdownAdvancedSetting(cardSelector, 'Transpose Rows & Columns', transpose);
84+
}

cypress/fixtures/cypher_queries.js

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/report/ReportRecordProcessing.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ function RenderArray(value, transposedTable = false) {
275275
return (
276276
<span key={String(`k${i}`) + v}>
277277
{RenderSubValue(v)}
278-
{i < value.length - 1 && !valueIsNode(v) && !valueIsRelationship(v) ? <span>,&nbsp;</span> : <></>}
278+
{i < value.length - 1 && !valueIsNode(v) && !valueIsRelationship(v) ? <span>, </span> : <></>}
279279
</span>
280280
);
281281
});

0 commit comments

Comments
 (0)