@neo4j-cypher/react-codemirror 2.0.0-next.3 → 2.0.0-next.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +257 -0
- package/README.md +3 -2
- package/dist/{types → src}/CypherEditor.d.ts +81 -3
- package/dist/src/CypherEditor.js +336 -0
- package/dist/src/CypherEditor.js.map +1 -0
- package/dist/src/CypherEditor.test.js +154 -0
- package/dist/src/CypherEditor.test.js.map +1 -0
- package/dist/src/constants.d.ts +1 -0
- package/dist/src/constants.js +2 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/e2e_tests/autoCompletion.spec.js +332 -0
- package/dist/src/e2e_tests/autoCompletion.spec.js.map +1 -0
- package/dist/src/e2e_tests/configuration.spec.js +83 -0
- package/dist/src/e2e_tests/configuration.spec.js.map +1 -0
- package/dist/src/e2e_tests/debounce.spec.js +66 -0
- package/dist/src/e2e_tests/debounce.spec.js.map +1 -0
- package/dist/{types/e2e_tests/e2e-utils.d.ts → src/e2e_tests/e2eUtils.d.ts} +2 -0
- package/dist/src/e2e_tests/e2eUtils.js +79 -0
- package/dist/src/e2e_tests/e2eUtils.js.map +1 -0
- package/dist/src/e2e_tests/extraKeybindings.spec.js +43 -0
- package/dist/src/e2e_tests/extraKeybindings.spec.js.map +1 -0
- package/dist/src/e2e_tests/historyNavigation.spec.js +227 -0
- package/dist/src/e2e_tests/historyNavigation.spec.js.map +1 -0
- package/dist/src/e2e_tests/performanceTest.spec.d.ts +6 -0
- package/dist/src/e2e_tests/performanceTest.spec.js +97 -0
- package/dist/src/e2e_tests/performanceTest.spec.js.map +1 -0
- package/dist/src/e2e_tests/sanityChecks.spec.js +53 -0
- package/dist/src/e2e_tests/sanityChecks.spec.js.map +1 -0
- package/dist/src/e2e_tests/signatureHelp.spec.js +228 -0
- package/dist/src/e2e_tests/signatureHelp.spec.js.map +1 -0
- package/dist/src/e2e_tests/snippets.spec.js +62 -0
- package/dist/src/e2e_tests/snippets.spec.js.map +1 -0
- package/dist/src/e2e_tests/syntaxHighlighting.spec.d.ts +1 -0
- package/dist/src/e2e_tests/syntaxHighlighting.spec.js +90 -0
- package/dist/src/e2e_tests/syntaxHighlighting.spec.js.map +1 -0
- package/dist/src/e2e_tests/syntaxValidation.spec.d.ts +1 -0
- package/dist/src/e2e_tests/syntaxValidation.spec.js +126 -0
- package/dist/src/e2e_tests/syntaxValidation.spec.js.map +1 -0
- package/dist/src/historyNavigation.js +163 -0
- package/dist/src/historyNavigation.js.map +1 -0
- package/dist/{types → src}/icons.d.ts +1 -1
- package/dist/src/icons.js +62 -0
- package/dist/src/icons.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lang-cypher/autocomplete.d.ts +6 -0
- package/dist/src/lang-cypher/autocomplete.js +113 -0
- package/dist/src/lang-cypher/autocomplete.js.map +1 -0
- package/dist/{types → src}/lang-cypher/constants.d.ts +11 -0
- package/dist/src/lang-cypher/constants.js +69 -0
- package/dist/src/lang-cypher/constants.js.map +1 -0
- package/dist/src/lang-cypher/contants.test.d.ts +1 -0
- package/dist/src/lang-cypher/contants.test.js +103 -0
- package/dist/src/lang-cypher/contants.test.js.map +1 -0
- package/dist/src/lang-cypher/createCypherTheme.js +183 -0
- package/dist/src/lang-cypher/createCypherTheme.js.map +1 -0
- package/dist/src/lang-cypher/langCypher.d.ts +13 -0
- package/dist/src/lang-cypher/langCypher.js +23 -0
- package/dist/src/lang-cypher/langCypher.js.map +1 -0
- package/dist/src/lang-cypher/lintWorker.mjs +2022 -0
- package/dist/src/lang-cypher/parser-adapter.d.ts +19 -0
- package/dist/src/lang-cypher/parser-adapter.js +113 -0
- package/dist/src/lang-cypher/parser-adapter.js.map +1 -0
- package/dist/src/lang-cypher/signatureHelp.d.ts +4 -0
- package/dist/src/lang-cypher/signatureHelp.js +109 -0
- package/dist/src/lang-cypher/signatureHelp.js.map +1 -0
- package/dist/{types/lang-cypher/syntax-validation.d.ts → src/lang-cypher/syntaxValidation.d.ts} +2 -1
- package/dist/src/lang-cypher/syntaxValidation.js +57 -0
- package/dist/src/lang-cypher/syntaxValidation.js.map +1 -0
- package/dist/src/lang-cypher/themeIcons.js +22 -0
- package/dist/src/lang-cypher/themeIcons.js.map +1 -0
- package/dist/src/lang-cypher/utils.d.ts +2 -0
- package/dist/src/lang-cypher/utils.js +10 -0
- package/dist/src/lang-cypher/utils.js.map +1 -0
- package/dist/src/ndlTokensCopy.d.ts +570 -0
- package/dist/src/ndlTokensCopy.js +571 -0
- package/dist/src/ndlTokensCopy.js.map +1 -0
- package/dist/src/ndlTokensCopy.test.d.ts +1 -0
- package/dist/src/ndlTokensCopy.test.js +12 -0
- package/dist/src/ndlTokensCopy.test.js.map +1 -0
- package/dist/src/neo4jSetup.d.ts +6 -0
- package/dist/src/neo4jSetup.js +120 -0
- package/dist/src/neo4jSetup.js.map +1 -0
- package/dist/src/richClipboardCopier.d.ts +4 -0
- package/dist/src/richClipboardCopier.js +78 -0
- package/dist/src/richClipboardCopier.js.map +1 -0
- package/dist/src/richClipboardCopier.test.d.ts +1 -0
- package/dist/src/richClipboardCopier.test.js +53 -0
- package/dist/src/richClipboardCopier.test.js.map +1 -0
- package/dist/{types → src}/themes.d.ts +1 -1
- package/dist/src/themes.js +93 -0
- package/dist/src/themes.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +43 -41
- package/src/CypherEditor.test.tsx +204 -0
- package/src/CypherEditor.tsx +316 -42
- package/src/constants.ts +1 -0
- package/src/e2e_tests/autoCompletion.spec.tsx +571 -0
- package/src/e2e_tests/configuration.spec.tsx +111 -0
- package/src/e2e_tests/debounce.spec.tsx +106 -0
- package/src/e2e_tests/{e2e-utils.ts → e2eUtils.ts} +41 -3
- package/src/e2e_tests/{extra-keybindings.spec.tsx → extraKeybindings.spec.tsx} +1 -3
- package/src/e2e_tests/{history-navigation.spec.tsx → historyNavigation.spec.tsx} +137 -18
- package/src/e2e_tests/performanceTest.spec.tsx +163 -0
- package/src/e2e_tests/{sanity-checks.spec.tsx → sanityChecks.spec.tsx} +7 -22
- package/src/e2e_tests/signatureHelp.spec.tsx +444 -0
- package/src/e2e_tests/snippets.spec.tsx +92 -0
- package/src/e2e_tests/{syntax-highlighting.spec.tsx → syntaxHighlighting.spec.tsx} +26 -24
- package/src/e2e_tests/syntaxValidation.spec.tsx +259 -0
- package/src/{history-navigation.ts → historyNavigation.ts} +1 -1
- package/src/icons.ts +3 -0
- package/src/index.ts +2 -2
- package/src/lang-cypher/autocomplete.ts +99 -18
- package/src/lang-cypher/constants.ts +27 -0
- package/src/lang-cypher/contants.test.ts +6 -2
- package/src/lang-cypher/{create-cypher-theme.ts → createCypherTheme.ts} +45 -2
- package/src/lang-cypher/langCypher.ts +42 -0
- package/src/lang-cypher/lintWorker.mjs +2022 -0
- package/src/lang-cypher/parser-adapter.ts +145 -0
- package/src/lang-cypher/signatureHelp.ts +151 -0
- package/src/lang-cypher/syntaxValidation.ts +72 -0
- package/src/lang-cypher/utils.ts +9 -0
- package/src/{ndl-tokens-copy.test.ts → ndlTokensCopy.test.ts} +2 -1
- package/src/ndlTokensCopy.ts +570 -0
- package/src/{neo4j-setup.tsx → neo4jSetup.tsx} +78 -17
- package/src/richClipboardCopier.test.ts +65 -0
- package/src/richClipboardCopier.ts +99 -0
- package/src/themes.ts +45 -70
- package/src/viteEnv.d.ts +1 -0
- package/dist/cjs/index.cjs +0 -1440
- package/dist/cjs/index.cjs.map +0 -7
- package/dist/esm/index.mjs +0 -1463
- package/dist/esm/index.mjs.map +0 -7
- package/dist/types/e2e_tests/mock-data.d.ts +0 -3779
- package/dist/types/index.d.ts +0 -4
- package/dist/types/lang-cypher/ParserAdapter.d.ts +0 -14
- package/dist/types/lang-cypher/autocomplete.d.ts +0 -3
- package/dist/types/lang-cypher/lang-cypher.d.ts +0 -7
- package/dist/types/ndl-tokens-copy.d.ts +0 -379
- package/dist/types/neo4j-setup.d.ts +0 -2
- package/dist/types/tsconfig.tsbuildinfo +0 -1
- package/src/e2e_tests/auto-completion.spec.tsx +0 -232
- package/src/e2e_tests/mock-data.ts +0 -4310
- package/src/e2e_tests/performance-test.spec.tsx +0 -71
- package/src/e2e_tests/syntax-validation.spec.tsx +0 -156
- package/src/lang-cypher/ParserAdapter.ts +0 -92
- package/src/lang-cypher/lang-cypher.ts +0 -32
- package/src/lang-cypher/syntax-validation.ts +0 -24
- package/src/ndl-tokens-copy.ts +0 -379
- /package/dist/{types/e2e_tests/auto-completion.spec.d.ts → src/CypherEditor.test.d.ts} +0 -0
- /package/dist/{types/e2e_tests/extra-keybindings.spec.d.ts → src/e2e_tests/autoCompletion.spec.d.ts} +0 -0
- /package/dist/{types/e2e_tests/history-navigation.spec.d.ts → src/e2e_tests/configuration.spec.d.ts} +0 -0
- /package/dist/{types/e2e_tests/performance-test.spec.d.ts → src/e2e_tests/debounce.spec.d.ts} +0 -0
- /package/dist/{types/e2e_tests/sanity-checks.spec.d.ts → src/e2e_tests/extraKeybindings.spec.d.ts} +0 -0
- /package/dist/{types/e2e_tests/syntax-highlighting.spec.d.ts → src/e2e_tests/historyNavigation.spec.d.ts} +0 -0
- /package/dist/{types/e2e_tests/syntax-validation.spec.d.ts → src/e2e_tests/sanityChecks.spec.d.ts} +0 -0
- /package/dist/{types/lang-cypher/contants.test.d.ts → src/e2e_tests/signatureHelp.spec.d.ts} +0 -0
- /package/dist/{types/ndl-tokens-copy.test.d.ts → src/e2e_tests/snippets.spec.d.ts} +0 -0
- /package/dist/{types/history-navigation.d.ts → src/historyNavigation.d.ts} +0 -0
- /package/dist/{types/lang-cypher/create-cypher-theme.d.ts → src/lang-cypher/createCypherTheme.d.ts} +0 -0
- /package/dist/{types/lang-cypher/theme-icons.d.ts → src/lang-cypher/themeIcons.d.ts} +0 -0
- /package/src/lang-cypher/{theme-icons.ts → themeIcons.ts} +0 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/* eslint-disable @typescript-eslint/unbound-method */
|
|
3
|
+
import { testData } from '@neo4j-cypher/language-support';
|
|
4
|
+
import { expect, test } from '@playwright/experimental-ct-react';
|
|
5
|
+
import { CypherEditor } from '../CypherEditor';
|
|
6
|
+
test.use({ viewport: { width: 1000, height: 500 } });
|
|
7
|
+
const importCsvProc = testData.mockSchema.procedures['CYPHER 5']['apoc.import.csv'];
|
|
8
|
+
function testTooltip(tooltip, expectations) {
|
|
9
|
+
const includes = expectations.includes ?? [];
|
|
10
|
+
const excludes = expectations.excludes ?? [];
|
|
11
|
+
const included = Promise.all(includes.map((text) => {
|
|
12
|
+
return expect(tooltip).toContainText(text, {
|
|
13
|
+
timeout: 10000,
|
|
14
|
+
});
|
|
15
|
+
}));
|
|
16
|
+
const excluded = Promise.all(excludes.map((text) => {
|
|
17
|
+
return expect(tooltip).not.toContainText(text, {
|
|
18
|
+
timeout: 10000,
|
|
19
|
+
});
|
|
20
|
+
}));
|
|
21
|
+
return Promise.all([included, excluded]);
|
|
22
|
+
}
|
|
23
|
+
test('Signature help works for functions', async ({ page, mount }) => {
|
|
24
|
+
const query = 'RETURN abs(';
|
|
25
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, autofocus: true }));
|
|
26
|
+
await expect(page.locator('.cm-signature-help-panel')).toBeVisible({
|
|
27
|
+
timeout: 10000,
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
test('Signature help works for procedures', async ({ page, mount }) => {
|
|
31
|
+
const query = 'CALL apoc.import.csv(';
|
|
32
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, autofocus: true }));
|
|
33
|
+
await expect(page.locator('.cm-signature-help-panel')).toBeVisible({
|
|
34
|
+
timeout: 10000,
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
test('Signature help shows the description for the first argument', async ({ page, mount, }) => {
|
|
38
|
+
const query = 'CALL apoc.import.csv(';
|
|
39
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, autofocus: true }));
|
|
40
|
+
const tooltip = page.locator('.cm-signature-help-panel');
|
|
41
|
+
await testTooltip(tooltip, {
|
|
42
|
+
includes: [
|
|
43
|
+
testData.mockSchema.procedures['CYPHER 5']['apoc.import.csv']
|
|
44
|
+
.argumentDescription[0].description,
|
|
45
|
+
testData.mockSchema.procedures['CYPHER 5']['apoc.import.csv'].description,
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
test('Signature help shows the description for the first argument when the cursor is at that position', async ({ page, mount, }) => {
|
|
50
|
+
const query = 'CALL apoc.import.csv()';
|
|
51
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, offset: 21 }));
|
|
52
|
+
const tooltip = page.locator('.cm-signature-help-panel');
|
|
53
|
+
await testTooltip(tooltip, {
|
|
54
|
+
includes: [
|
|
55
|
+
importCsvProc.argumentDescription[0].description,
|
|
56
|
+
importCsvProc.description,
|
|
57
|
+
],
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
test('Signature help shows the description for the second argument', async ({ page, mount, }) => {
|
|
61
|
+
const query = 'CALL apoc.import.csv(nodes,';
|
|
62
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, autofocus: true }));
|
|
63
|
+
const tooltip = page.locator('.cm-signature-help-panel');
|
|
64
|
+
await testTooltip(tooltip, {
|
|
65
|
+
includes: [
|
|
66
|
+
importCsvProc.argumentDescription[1].description,
|
|
67
|
+
importCsvProc.description,
|
|
68
|
+
],
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
test('Signature help shows the description for the second argument when the cursor is at that position', async ({ page, mount, }) => {
|
|
72
|
+
const query = 'CALL apoc.import.csv(nodes,)';
|
|
73
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, offset: 27 }));
|
|
74
|
+
const tooltip = page.locator('.cm-signature-help-panel');
|
|
75
|
+
await testTooltip(tooltip, {
|
|
76
|
+
includes: [
|
|
77
|
+
importCsvProc.argumentDescription[1].description,
|
|
78
|
+
importCsvProc.description,
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
test('Signature help shows the description for the second argument when the cursor is at that position, even after whitespaces', async ({ page, mount, }) => {
|
|
83
|
+
const query = 'CALL apoc.import.csv(nodes, )';
|
|
84
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, offset: 28 }));
|
|
85
|
+
const tooltip = page.locator('.cm-signature-help-panel');
|
|
86
|
+
await testTooltip(tooltip, {
|
|
87
|
+
includes: [
|
|
88
|
+
'rels :: LIST<MAP>',
|
|
89
|
+
'Imports `NODE` and `RELATIONSHIP` values with the given labels and types from the provided CSV file',
|
|
90
|
+
],
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
test('Signature help shows description for arguments with a space following a separator', async ({ page, mount, }) => {
|
|
94
|
+
const query = 'CALL apoc.import.csv(nodes, ';
|
|
95
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, autofocus: true }));
|
|
96
|
+
const tooltip = page.locator('.cm-signature-help-panel');
|
|
97
|
+
await testTooltip(tooltip, {
|
|
98
|
+
includes: [
|
|
99
|
+
'rels :: LIST<MAP>',
|
|
100
|
+
'Imports `NODE` and `RELATIONSHIP` values with the given labels and types from the provided CSV file',
|
|
101
|
+
],
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
test('Signature help shows the description for the third argument', async ({ page, mount, }) => {
|
|
105
|
+
const query = 'CALL apoc.import.csv(nodes, rels,';
|
|
106
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, autofocus: true }));
|
|
107
|
+
const tooltip = page.locator('.cm-signature-help-panel');
|
|
108
|
+
await testTooltip(tooltip, {
|
|
109
|
+
includes: [
|
|
110
|
+
'config :: MAP',
|
|
111
|
+
'Imports `NODE` and `RELATIONSHIP` values with the given labels and types from the provided CSV file',
|
|
112
|
+
],
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
test('Signature help works on multiline queries', async ({ page, mount }) => {
|
|
116
|
+
const query = `CALL apoc.import.csv(
|
|
117
|
+
nodes,
|
|
118
|
+
rels,
|
|
119
|
+
`;
|
|
120
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, autofocus: true }));
|
|
121
|
+
const tooltip = page.locator('.cm-signature-help-panel');
|
|
122
|
+
await testTooltip(tooltip, {
|
|
123
|
+
includes: [
|
|
124
|
+
'config :: MAP',
|
|
125
|
+
'Imports `NODE` and `RELATIONSHIP` values with the given labels and types from the provided CSV file',
|
|
126
|
+
],
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
test('Signature help only shows the description past the last argument', async ({ page, mount, }) => {
|
|
130
|
+
const query = 'CALL apoc.import.csv(nodes, rels, config,';
|
|
131
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, autofocus: true }));
|
|
132
|
+
1;
|
|
133
|
+
const tooltip = page.locator('.cm-signature-help-panel');
|
|
134
|
+
await testTooltip(tooltip, {
|
|
135
|
+
includes: [
|
|
136
|
+
'apoc.import.csv(nodes :: LIST<MAP>, rels :: LIST<MAP>, config :: MAP)',
|
|
137
|
+
'Imports `NODE` and `RELATIONSHIP` values with the given labels and types from the provided CSV file.',
|
|
138
|
+
],
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
test('Signature help does not show any help when method finished', async ({ page, mount, }) => {
|
|
142
|
+
const query = 'CALL apoc.import.csv(nodes, rels, config)';
|
|
143
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, autofocus: true }));
|
|
144
|
+
await expect(page.locator('.cm-signature-help-panel')).not.toBeVisible({
|
|
145
|
+
timeout: 10000,
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
test('Signature help does not blow up on empty query', async ({ page, mount, }) => {
|
|
149
|
+
const query = '';
|
|
150
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, autofocus: true }));
|
|
151
|
+
await expect(page.locator('.cm-signature-help-panel')).not.toBeVisible({
|
|
152
|
+
timeout: 10000,
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
test('Signature help is shown below the text by default', async ({ page, mount, }) => {
|
|
156
|
+
// We need to introduce new lines to make sure there's
|
|
157
|
+
// enough space to show the tooltip above
|
|
158
|
+
const query = '\n\n\n\n\n\n\nRETURN abs(';
|
|
159
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, autofocus: true }));
|
|
160
|
+
await expect(page.locator('.cm-signature-help-panel.cm-tooltip-below')).toBeVisible({
|
|
161
|
+
timeout: 10000,
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
test('Setting showSignatureTooltipBelow to true shows the signature help above the text', async ({ page, mount, }) => {
|
|
165
|
+
// We need to introduce new lines to make sure there's
|
|
166
|
+
// enough space to show the tooltip above
|
|
167
|
+
const query = '\n\n\n\n\n\n\nRETURN abs(';
|
|
168
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, showSignatureTooltipBelow: true, autofocus: true }));
|
|
169
|
+
await expect(page.locator('.cm-signature-help-panel.cm-tooltip-below')).toBeVisible({
|
|
170
|
+
timeout: 10000,
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
test('Setting showSignatureTooltipBelow to false shows the signature help above the text', async ({ page, mount, }) => {
|
|
174
|
+
// We need to introduce new lines to make sure there's
|
|
175
|
+
// enough space to show the tooltip above
|
|
176
|
+
const query = '\n\n\n\n\n\n\nRETURN abs(';
|
|
177
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema, showSignatureTooltipBelow: false, autofocus: true }));
|
|
178
|
+
await expect(page.locator('.cm-signature-help-panel.cm-tooltip-above')).toBeVisible({
|
|
179
|
+
timeout: 10000,
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
test('Signature help depends on the Cypher version', async ({ page, mount, }) => {
|
|
183
|
+
const cypher5ArgDescription = 'The Cypher 5 statement to run.';
|
|
184
|
+
const cypher25ArgDescription = 'The Cypher 25 statement to run.';
|
|
185
|
+
await mount(_jsx(CypherEditor, { schema: {
|
|
186
|
+
functions: {
|
|
187
|
+
'CYPHER 5': {
|
|
188
|
+
cypher5Function: {
|
|
189
|
+
...testData.emptyFunction,
|
|
190
|
+
argumentDescription: [
|
|
191
|
+
{
|
|
192
|
+
isDeprecated: false,
|
|
193
|
+
description: cypher5ArgDescription,
|
|
194
|
+
name: 'statement',
|
|
195
|
+
type: 'STRING',
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
name: 'cypher5Function',
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
'CYPHER 25': {
|
|
202
|
+
cypher25Function: {
|
|
203
|
+
...testData.emptyFunction,
|
|
204
|
+
argumentDescription: [
|
|
205
|
+
{
|
|
206
|
+
isDeprecated: false,
|
|
207
|
+
description: cypher25ArgDescription,
|
|
208
|
+
name: 'statement',
|
|
209
|
+
type: 'STRING',
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
name: 'cypher25Function',
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
} }));
|
|
217
|
+
const textField = page.getByRole('textbox');
|
|
218
|
+
await textField.fill('CYPHER 5 RETURN cypher5Function(');
|
|
219
|
+
const tooltip = page.locator('.cm-signature-help-panel');
|
|
220
|
+
await testTooltip(tooltip, {
|
|
221
|
+
includes: [cypher5ArgDescription],
|
|
222
|
+
});
|
|
223
|
+
await textField.fill('CYPHER 25 RETURN cypher25Function(');
|
|
224
|
+
await testTooltip(tooltip, {
|
|
225
|
+
includes: [cypher25ArgDescription],
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
//# sourceMappingURL=signatureHelp.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signatureHelp.spec.js","sourceRoot":"","sources":["../../../src/e2e_tests/signatureHelp.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { expect, test } from '@playwright/experimental-ct-react';
|
|
3
|
+
import { CypherEditor } from '../CypherEditor';
|
|
4
|
+
test('can complete pattern snippet', async ({ page, mount }) => {
|
|
5
|
+
await mount(_jsx(CypherEditor, {}));
|
|
6
|
+
const textField = page.getByRole('textbox');
|
|
7
|
+
await textField.fill('MATCH ()-[]->()');
|
|
8
|
+
await page.locator('.cm-tooltip-autocomplete').getByText('-[]->()').click();
|
|
9
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
10
|
+
await textField.press('Tab');
|
|
11
|
+
await textField.press('Tab');
|
|
12
|
+
await expect(textField).toHaveText('MATCH ()-[]->()-[ ]->( )');
|
|
13
|
+
});
|
|
14
|
+
test('can navigate snippet', async ({ page, mount }) => {
|
|
15
|
+
await mount(_jsx(CypherEditor, {}));
|
|
16
|
+
const textField = page.getByRole('textbox');
|
|
17
|
+
await textField.fill('CREATE INDEX abc FOR ()');
|
|
18
|
+
await page
|
|
19
|
+
.locator('.cm-tooltip-autocomplete')
|
|
20
|
+
.getByText('-[]-()', { exact: true })
|
|
21
|
+
.click();
|
|
22
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
23
|
+
await expect(page.locator('.cm-snippetField')).toHaveCount(2);
|
|
24
|
+
await textField.press('Tab');
|
|
25
|
+
await textField.press('Shift+Tab');
|
|
26
|
+
await expect(textField).toHaveText('CREATE INDEX abc FOR ()-[ ]-( )');
|
|
27
|
+
await textField.press('a');
|
|
28
|
+
await expect(textField).toHaveText('CREATE INDEX abc FOR ()-[a]-( )');
|
|
29
|
+
await textField.press('Escape');
|
|
30
|
+
await textField.press('Escape');
|
|
31
|
+
await expect(page.locator('.cm-snippetField')).toHaveCount(0);
|
|
32
|
+
await textField.press('Tab');
|
|
33
|
+
await expect(textField).toHaveText('CREATE INDEX abc FOR ()-[a ]-( )');
|
|
34
|
+
});
|
|
35
|
+
test('can accept completion inside pattern snippet', async ({ page, mount, }) => {
|
|
36
|
+
await mount(_jsx(CypherEditor, { schema: { labels: ['City'] } }));
|
|
37
|
+
const textField = page.getByRole('textbox');
|
|
38
|
+
await textField.fill('MATCH ()-[]->()');
|
|
39
|
+
await page.locator('.cm-tooltip-autocomplete').getByText('-[]->()').click();
|
|
40
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
41
|
+
// move to node
|
|
42
|
+
await textField.press('Tab');
|
|
43
|
+
// get & accept completion
|
|
44
|
+
await textField.press(':');
|
|
45
|
+
await expect(page.locator('.cm-tooltip-autocomplete').getByText('City')).toBeVisible();
|
|
46
|
+
await textField.press('Tab', { delay: 300 });
|
|
47
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
48
|
+
// tab out of the snippet
|
|
49
|
+
await textField.press('Tab', { delay: 300 });
|
|
50
|
+
await expect(textField).toHaveText('MATCH ()-[]->()-[ ]->(:City)');
|
|
51
|
+
});
|
|
52
|
+
test('does not automatically open completion panel for expressions after snippet trigger char', async ({ page, mount, }) => {
|
|
53
|
+
await mount(_jsx(CypherEditor, {}));
|
|
54
|
+
const textField = page.getByRole('textbox');
|
|
55
|
+
await textField.fill('RETURN (1)');
|
|
56
|
+
// expect the panel to not show up
|
|
57
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
58
|
+
// unless manually triggered
|
|
59
|
+
await textField.press('Control+ ');
|
|
60
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=snippets.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippets.spec.js","sourceRoot":"","sources":["../../../src/e2e_tests/snippets.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { expect, test } from '@playwright/experimental-ct-react';
|
|
3
|
+
import { CypherEditor } from '../CypherEditor';
|
|
4
|
+
import { darkThemeConstants, lightThemeConstants } from '../themes';
|
|
5
|
+
import { CypherEditorPage } from './e2eUtils';
|
|
6
|
+
test('light theme highlighting', async ({ page, mount }) => {
|
|
7
|
+
const editorPage = new CypherEditorPage(page);
|
|
8
|
+
const query = `
|
|
9
|
+
MATCH (variable :Label)-[:REL_TYPE]->()
|
|
10
|
+
WHERE variable.property = "String"
|
|
11
|
+
OR namespaced.function() = false
|
|
12
|
+
// comment
|
|
13
|
+
OR $parameter > 1234
|
|
14
|
+
RETURN variable;`;
|
|
15
|
+
await mount(_jsx(CypherEditor, { value: query, theme: "light" }));
|
|
16
|
+
const keywordcolors = await Promise.all(['MATCH', 'WHERE', 'RETURN'].map((kw) => editorPage.getHexColorOfLocator(page.getByText(kw))));
|
|
17
|
+
keywordcolors.every((kw) => expect(kw).toEqual(lightThemeConstants.highlightStyles.keyword.toLowerCase()));
|
|
18
|
+
const labelReltype = await Promise.all(['Label', 'REL_TYPE'].map((kw) => editorPage.getHexColorOfLocator(page.getByText(kw))));
|
|
19
|
+
labelReltype.every((kw) => expect(kw).toEqual(lightThemeConstants.highlightStyles.label.toLowerCase()));
|
|
20
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('parameter'))).toEqual(lightThemeConstants.highlightStyles.paramValue.toLowerCase());
|
|
21
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('property'))).toEqual(lightThemeConstants.highlightStyles.property.toLowerCase());
|
|
22
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('false'))).toEqual(lightThemeConstants.highlightStyles.booleanLiteral.toLowerCase());
|
|
23
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('String'))).toEqual(lightThemeConstants.highlightStyles.stringLiteral.toLowerCase());
|
|
24
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('comment'))).toEqual(lightThemeConstants.highlightStyles.comment.toLowerCase());
|
|
25
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('1234', { exact: true }))).toEqual(lightThemeConstants.highlightStyles.numberLiteral.toLowerCase());
|
|
26
|
+
expect(await editorPage.editorBackgroundIsUnset()).toEqual(false);
|
|
27
|
+
});
|
|
28
|
+
test('dark theme highlighting', async ({ page, mount }) => {
|
|
29
|
+
const editorPage = new CypherEditorPage(page);
|
|
30
|
+
const query = `
|
|
31
|
+
MATCH (variable :Label)-[:REL_TYPE]->()
|
|
32
|
+
WHERE variable.property = "String"
|
|
33
|
+
OR namespaced.function() = false
|
|
34
|
+
// comment
|
|
35
|
+
OR $parameter > 1234
|
|
36
|
+
RETURN variable;`;
|
|
37
|
+
await mount(_jsx(CypherEditor, { value: query, theme: "dark" }));
|
|
38
|
+
const keywordcolors = await Promise.all(['MATCH', 'WHERE', 'RETURN'].map((kw) => editorPage.getHexColorOfLocator(page.getByText(kw))));
|
|
39
|
+
keywordcolors.every((kw) => expect(kw).toEqual(darkThemeConstants.highlightStyles.keyword.toLowerCase()));
|
|
40
|
+
const labelReltype = await Promise.all(['Label', 'REL_TYPE'].map((kw) => editorPage.getHexColorOfLocator(page.getByText(kw))));
|
|
41
|
+
labelReltype.every((kw) => expect(kw).toEqual(darkThemeConstants.highlightStyles.label.toLowerCase()));
|
|
42
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('parameter'))).toEqual(darkThemeConstants.highlightStyles.paramValue.toLowerCase());
|
|
43
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('property'))).toEqual(darkThemeConstants.highlightStyles.property.toLowerCase());
|
|
44
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('false'))).toEqual(darkThemeConstants.highlightStyles.booleanLiteral.toLowerCase());
|
|
45
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('String'))).toEqual(darkThemeConstants.highlightStyles.stringLiteral.toLowerCase());
|
|
46
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('comment'))).toEqual(darkThemeConstants.highlightStyles.comment.toLowerCase());
|
|
47
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('1234', { exact: true }))).toEqual(darkThemeConstants.highlightStyles.numberLiteral.toLowerCase());
|
|
48
|
+
expect(await editorPage.editorBackgroundIsUnset()).toEqual(false);
|
|
49
|
+
});
|
|
50
|
+
test('can live switch theme ', async ({ page, mount }) => {
|
|
51
|
+
const editorPage = new CypherEditorPage(page);
|
|
52
|
+
const component = await mount(_jsx(CypherEditor, { theme: "light", value: "RETURN" }));
|
|
53
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('RETURN', { exact: true }))).toEqual(lightThemeConstants.highlightStyles.keyword.toLowerCase());
|
|
54
|
+
await component.update(_jsx(CypherEditor, { theme: "dark", value: "RETURN" }));
|
|
55
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('RETURN', { exact: true }))).toEqual(darkThemeConstants.highlightStyles.keyword.toLowerCase());
|
|
56
|
+
});
|
|
57
|
+
test('respects prop to allow overriding bkg color', async ({ page, mount }) => {
|
|
58
|
+
const editorPage = new CypherEditorPage(page);
|
|
59
|
+
await mount(_jsx(CypherEditor, { theme: "light", value: "text", overrideThemeBackgroundColor: true }));
|
|
60
|
+
expect(await editorPage.editorBackgroundIsUnset()).toEqual(true);
|
|
61
|
+
});
|
|
62
|
+
test('highlights multiline string literal correctly', async ({ page, mount, }) => {
|
|
63
|
+
const editorPage = new CypherEditorPage(page);
|
|
64
|
+
const query = `
|
|
65
|
+
RETURN "
|
|
66
|
+
multilinestring";`;
|
|
67
|
+
await mount(_jsx(CypherEditor, { theme: "light", value: query }));
|
|
68
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('multilinestring'))).toEqual(lightThemeConstants.highlightStyles.stringLiteral.toLowerCase());
|
|
69
|
+
});
|
|
70
|
+
test('highlights multiline label correctly', async ({ page, mount }) => {
|
|
71
|
+
const editorPage = new CypherEditorPage(page);
|
|
72
|
+
const query = `
|
|
73
|
+
MATCH (v:\`
|
|
74
|
+
|
|
75
|
+
Label\`)
|
|
76
|
+
`;
|
|
77
|
+
await mount(_jsx(CypherEditor, { theme: "light", value: query }));
|
|
78
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('Label'))).toEqual(lightThemeConstants.highlightStyles.label.toLowerCase());
|
|
79
|
+
});
|
|
80
|
+
test('highlights multiline comment correctly', async ({ page, mount }) => {
|
|
81
|
+
const editorPage = new CypherEditorPage(page);
|
|
82
|
+
const query = `
|
|
83
|
+
/*
|
|
84
|
+
|
|
85
|
+
comment
|
|
86
|
+
*/";`;
|
|
87
|
+
await mount(_jsx(CypherEditor, { theme: "light", value: query }));
|
|
88
|
+
expect(await editorPage.getHexColorOfLocator(page.getByText('comment'))).toEqual(lightThemeConstants.highlightStyles.comment.toLowerCase());
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=syntaxHighlighting.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntaxHighlighting.spec.js","sourceRoot":"","sources":["../../../src/e2e_tests/syntaxHighlighting.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { testData } from '@neo4j-cypher/language-support';
|
|
3
|
+
import { expect, test } from '@playwright/experimental-ct-react';
|
|
4
|
+
import { CypherEditor } from '../CypherEditor';
|
|
5
|
+
import { CypherEditorPage } from './e2eUtils';
|
|
6
|
+
test.use({ viewport: { width: 1000, height: 500 } });
|
|
7
|
+
test('Prop lint set to false disables syntax validation', async ({ page, mount, }) => {
|
|
8
|
+
const query = 'METCH (n) RETURN n';
|
|
9
|
+
await mount(_jsx(CypherEditor, { value: query, lint: false }));
|
|
10
|
+
await expect(page.locator('.cm-lintRange-error').last()).not.toBeVisible({
|
|
11
|
+
timeout: 10000,
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
test('Can turn linting back on', async ({ page, mount }) => {
|
|
15
|
+
const editorPage = new CypherEditorPage(page);
|
|
16
|
+
const query = 'METCH (n) RETURN n';
|
|
17
|
+
const component = await mount(_jsx(CypherEditor, { value: query, lint: false }));
|
|
18
|
+
await expect(page.locator('.cm-lintRange-error').last()).not.toBeVisible({
|
|
19
|
+
timeout: 10000,
|
|
20
|
+
});
|
|
21
|
+
await component.update(_jsx(CypherEditor, { value: query, lint: true }));
|
|
22
|
+
await editorPage.getEditor().fill('METCH (n) RETURN n');
|
|
23
|
+
await editorPage.checkErrorMessage('METCH', `Invalid input 'METCH': expected 'ALTER', 'ORDER BY', 'CALL', 'USING PERIODIC COMMIT', 'CREATE', 'LOAD CSV', 'START DATABASE', 'STOP DATABASE', 'DEALLOCATE', 'DELETE', 'DENY', 'DETACH', 'DROP', 'DRYRUN', 'FINISH', 'FOREACH', 'GRANT', 'INSERT', 'LIMIT', 'MATCH', 'MERGE', 'NODETACH', 'OFFSET', 'OPTIONAL', 'REALLOCATE', 'REMOVE', 'RENAME', 'RETURN', 'REVOKE', 'ENABLE SERVER', 'SET', 'SHOW', 'SKIP', 'TERMINATE', 'UNWIND', 'USE' or 'WITH'`);
|
|
24
|
+
});
|
|
25
|
+
test('Syntactic errors are surfaced', async ({ page, mount }) => {
|
|
26
|
+
const editorPage = new CypherEditorPage(page);
|
|
27
|
+
const query = 'METCH (n) RETURN n';
|
|
28
|
+
await mount(_jsx(CypherEditor, { value: query }));
|
|
29
|
+
await editorPage.checkErrorMessage('METCH', `Invalid input 'METCH': expected 'ALTER', 'ORDER BY', 'CALL', 'USING PERIODIC COMMIT', 'CREATE', 'LOAD CSV', 'START DATABASE', 'STOP DATABASE', 'DEALLOCATE', 'DELETE', 'DENY', 'DETACH', 'DROP', 'DRYRUN', 'FINISH', 'FOREACH', 'GRANT', 'INSERT', 'LIMIT', 'MATCH', 'MERGE', 'NODETACH', 'OFFSET', 'OPTIONAL', 'REALLOCATE', 'REMOVE', 'RENAME', 'RETURN', 'REVOKE', 'ENABLE SERVER', 'SET', 'SHOW', 'SKIP', 'TERMINATE', 'UNWIND', 'USE' or 'WITH'`);
|
|
30
|
+
});
|
|
31
|
+
test('Does not trigger syntax errors for backticked parameters in parameter creation', async ({ page, mount, }) => {
|
|
32
|
+
const editorPage = new CypherEditorPage(page);
|
|
33
|
+
const query = ':param x => "abc"';
|
|
34
|
+
await mount(_jsx(CypherEditor, { value: query }));
|
|
35
|
+
await editorPage.checkNoNotificationMessage('error');
|
|
36
|
+
});
|
|
37
|
+
test('Errors for undefined labels are surfaced', async ({ page, mount }) => {
|
|
38
|
+
const editorPage = new CypherEditorPage(page);
|
|
39
|
+
const query = 'MATCH (n: Person) RETURN n';
|
|
40
|
+
await mount(_jsx(CypherEditor, { value: query, schema: { labels: ['Movie'], relationshipTypes: [] } }));
|
|
41
|
+
await editorPage.checkWarningMessage('Person', "Label Person is not present in the database. Make sure you didn't misspell it or that it is available when you run this statement in your application");
|
|
42
|
+
});
|
|
43
|
+
test('Errors for multiline undefined labels are highlighted correctly', async ({ page, mount, }) => {
|
|
44
|
+
const editorPage = new CypherEditorPage(page);
|
|
45
|
+
const query = `MATCH (n:\`Foo
|
|
46
|
+
Bar\`) RETURN n`;
|
|
47
|
+
const expectedMsg = `Label \`Foo
|
|
48
|
+
Bar\` is not present in the database. Make sure you didn't misspell it or that it is available when you run this statement in your application`;
|
|
49
|
+
await mount(_jsx(CypherEditor, { value: query, schema: { labels: ['Movie'], relationshipTypes: [] } }));
|
|
50
|
+
await editorPage.checkWarningMessage('`Foo', expectedMsg);
|
|
51
|
+
await editorPage.checkWarningMessage('Bar`', expectedMsg);
|
|
52
|
+
});
|
|
53
|
+
test('Semantic errors work in firefox', async ({ browserName, page, mount, }) => {
|
|
54
|
+
test.skip(browserName !== 'firefox');
|
|
55
|
+
const editorPage = new CypherEditorPage(page);
|
|
56
|
+
const query = 'MATCH (n:OperationalPoint)--(m:OperationalPoint) RETURN s,m,n';
|
|
57
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema }));
|
|
58
|
+
await editorPage.checkErrorMessage('s,m,n', 'Variable `s` not defined');
|
|
59
|
+
});
|
|
60
|
+
test('Semantic errors are surfaced when there are no syntactic errors', async ({ page, mount, }) => {
|
|
61
|
+
const editorPage = new CypherEditorPage(page);
|
|
62
|
+
const query = 'MATCH (n) RETURN m';
|
|
63
|
+
await mount(_jsx(CypherEditor, { value: query }));
|
|
64
|
+
await editorPage.checkErrorMessage('m', 'Variable `m` not defined');
|
|
65
|
+
});
|
|
66
|
+
test('Semantic errors are correctly accumulated', async ({ page, mount }) => {
|
|
67
|
+
const editorPage = new CypherEditorPage(page);
|
|
68
|
+
const query = 'CALL { MATCH (n) } IN TRANSACTIONS OF -1 ROWS';
|
|
69
|
+
await mount(_jsx(CypherEditor, { value: query }));
|
|
70
|
+
await editorPage.checkErrorMessage('MATCH (n)', 'Query cannot conclude with MATCH (must be a RETURN clause, a FINISH clause, an update clause, a unit subquery call, or a procedure call with no YIELD).');
|
|
71
|
+
await editorPage.checkErrorMessage('-1', "Invalid input. '-1' is not a valid value. Must be a positive integer.");
|
|
72
|
+
});
|
|
73
|
+
test('Multiline errors are correctly placed', async ({ page, mount }) => {
|
|
74
|
+
const editorPage = new CypherEditorPage(page);
|
|
75
|
+
const query = `CALL {
|
|
76
|
+
MATCH (n)
|
|
77
|
+
} IN TRANSACTIONS
|
|
78
|
+
OF -1 ROWS`;
|
|
79
|
+
await mount(_jsx(CypherEditor, { value: query }));
|
|
80
|
+
await editorPage.checkErrorMessage('MATCH (n)', 'Query cannot conclude with MATCH (must be a RETURN clause, a FINISH clause, an update clause, a unit subquery call, or a procedure call with no YIELD).');
|
|
81
|
+
await editorPage.checkErrorMessage('-1', "Invalid input. '-1' is not a valid value. Must be a positive integer.");
|
|
82
|
+
});
|
|
83
|
+
test('Validation errors are correctly overlapped', async ({ page, mount }) => {
|
|
84
|
+
const editorPage = new CypherEditorPage(page);
|
|
85
|
+
const query = `CALL { MATCH (n)
|
|
86
|
+
RETURN n
|
|
87
|
+
} IN TRANSACTIONS
|
|
88
|
+
OF -1 ROWS`;
|
|
89
|
+
await mount(_jsx(CypherEditor, { value: query }));
|
|
90
|
+
await editorPage.checkErrorMessage('-1', 'Query cannot conclude with CALL (must be a RETURN clause, a FINISH clause, an update clause, a unit subquery call, or a procedure call with no YIELD).');
|
|
91
|
+
await editorPage.checkErrorMessage('-1', "Invalid input. '-1' is not a valid value. Must be a positive integer.");
|
|
92
|
+
});
|
|
93
|
+
test('Syntax highlighting works as expected with multiple separate linting messages', async ({ page, mount }) => {
|
|
94
|
+
const editorPage = new CypherEditorPage(page);
|
|
95
|
+
const query = `MATCH (n)--(m) CALL (n) {RETURN id(n) AS b} RETURN apoc.create.uuid(), a`;
|
|
96
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema }));
|
|
97
|
+
await expect(editorPage.page.locator('.cm-deprecated-element').last()).toBeVisible({ timeout: 10000 });
|
|
98
|
+
await editorPage.checkWarningMessage('id', 'Function id is deprecated.');
|
|
99
|
+
await editorPage.checkWarningMessage('id', `The query used a deprecated function. ('id' has been replaced by 'elementId or consider using an application-generated id')`);
|
|
100
|
+
await editorPage.checkWarningMessage('apoc.create.uuid', 'Function apoc.create.uuid is deprecated. Alternative: Neo4j randomUUID() function');
|
|
101
|
+
await editorPage.checkErrorMessage('a', 'Variable `a` not defined');
|
|
102
|
+
});
|
|
103
|
+
test('Strikethroughs are shown for deprecated functions', async ({ page, mount, }) => {
|
|
104
|
+
const editorPage = new CypherEditorPage(page);
|
|
105
|
+
const query = `RETURN id(1)`;
|
|
106
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema }));
|
|
107
|
+
await expect(editorPage.page.locator('.cm-deprecated-element').last()).toBeVisible({ timeout: 10000 });
|
|
108
|
+
await editorPage.checkWarningMessage('id', 'Function id is deprecated.');
|
|
109
|
+
});
|
|
110
|
+
test('Strikethroughs are shown for deprecated procedures', async ({ page, mount, }) => {
|
|
111
|
+
const editorPage = new CypherEditorPage(page);
|
|
112
|
+
const query = `CALL apoc.create.uuids(5)`;
|
|
113
|
+
await mount(_jsx(CypherEditor, { value: query, schema: testData.mockSchema }));
|
|
114
|
+
await expect(editorPage.page.locator('.cm-deprecated-element').last()).toBeVisible({ timeout: 10000 });
|
|
115
|
+
await editorPage.checkWarningMessage('apoc.create.uuids', "Procedure apoc.create.uuids is deprecated. Alternative: Neo4j's randomUUID() function can be used as a replacement, for example: `UNWIND range(0,$count) AS row RETURN row, randomUUID() AS uuid`");
|
|
116
|
+
});
|
|
117
|
+
test('Syntax validation depends on the Cypher version', async ({ page, mount, }) => {
|
|
118
|
+
await mount(_jsx(CypherEditor, { schema: testData.mockSchema }));
|
|
119
|
+
const editorPage = new CypherEditorPage(page);
|
|
120
|
+
const textField = page.getByRole('textbox');
|
|
121
|
+
await textField.fill('CYPHER 5 CALL apoc.create.uuids(5)');
|
|
122
|
+
await editorPage.checkWarningMessage('apoc.create.uuids', "Procedure apoc.create.uuids is deprecated. Alternative: Neo4j's randomUUID() function can be used as a replacement, for example: `UNWIND range(0,$count) AS row RETURN row, randomUUID() AS uuid`");
|
|
123
|
+
await textField.fill('CYPHER 25 CALL apoc.create.uuids(5)');
|
|
124
|
+
await editorPage.checkErrorMessage('apoc.create.uuids', `Procedure apoc.create.uuids is not present in the database. Make sure you didn't misspell it or that it is available when you run this statement in your application`);
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=syntaxValidation.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntaxValidation.spec.js","sourceRoot":"","sources":["../../../src/e2e_tests/syntaxValidation.spec.tsx"],"names":[],"mappings":"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"}
|