@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,332 @@
|
|
|
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('hello world end 2 end test', async ({ mount }) => {
|
|
7
|
+
const component = await mount(_jsx(CypherEditor, { value: "hello world" }));
|
|
8
|
+
await expect(component).toContainText('hello world');
|
|
9
|
+
await component.update(_jsx(CypherEditor, { value: "RETURN 123" }));
|
|
10
|
+
await expect(component).toContainText('RETURN 123');
|
|
11
|
+
});
|
|
12
|
+
test('can complete in the middle of statement', async ({ mount, page }) => {
|
|
13
|
+
const component = await mount(_jsx(CypherEditor, { value: `MATCH ()
|
|
14
|
+
WHER true
|
|
15
|
+
RETURN n;` }));
|
|
16
|
+
// Move into the statement and trigger autocompletion
|
|
17
|
+
const textField = page.getByRole('textbox');
|
|
18
|
+
await textField.focus();
|
|
19
|
+
await textField.press('ArrowDown');
|
|
20
|
+
await textField.press('ArrowRight');
|
|
21
|
+
await textField.press('ArrowRight');
|
|
22
|
+
await textField.press('ArrowRight');
|
|
23
|
+
await textField.press('ArrowRight');
|
|
24
|
+
await textField.press('Control+ ');
|
|
25
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
|
|
26
|
+
await page.locator('.cm-tooltip-autocomplete').getByText('WHERE', { exact: true }).click();
|
|
27
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
28
|
+
await expect(component).toContainText('WHERE true');
|
|
29
|
+
});
|
|
30
|
+
test('get completions when typing and can accept completions with tab', async ({ mount, page, }) => {
|
|
31
|
+
const component = await mount(_jsx(CypherEditor, {}));
|
|
32
|
+
const textField = page.getByRole('textbox');
|
|
33
|
+
await textField.fill('RETU');
|
|
34
|
+
await expect(page.locator('.cm-tooltip-autocomplete').getByText('RETURN')).toBeVisible();
|
|
35
|
+
// We need to wait for the editor to realise there is a completion open
|
|
36
|
+
// so that it does not just indent with tab key
|
|
37
|
+
await page.waitForTimeout(500);
|
|
38
|
+
await textField.press('Tab');
|
|
39
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
40
|
+
await expect(component).toContainText('RETURN');
|
|
41
|
+
});
|
|
42
|
+
test('get completions when typing in controlled component', async ({ mount, page, }) => {
|
|
43
|
+
let value = '';
|
|
44
|
+
const onChange = (val) => {
|
|
45
|
+
value = val;
|
|
46
|
+
void component.update(_jsx(CypherEditor, { value: val, onChange: onChange }));
|
|
47
|
+
};
|
|
48
|
+
const component = await mount(_jsx(CypherEditor, { value: value, onChange: onChange }));
|
|
49
|
+
const textField = page.getByRole('textbox');
|
|
50
|
+
await textField.fill('RETU');
|
|
51
|
+
await page.waitForTimeout(500); // wait for debounce
|
|
52
|
+
await expect(page.locator('.cm-tooltip-autocomplete').getByText('RETURN')).toBeVisible();
|
|
53
|
+
// We need to wait for the editor to realise there is a completion open
|
|
54
|
+
// so that it does not just indent with tab key
|
|
55
|
+
await page.waitForTimeout(500);
|
|
56
|
+
await textField.press('Tab');
|
|
57
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
58
|
+
await expect(component).toContainText('RETURN');
|
|
59
|
+
});
|
|
60
|
+
test('can complete labels', async ({ mount, page }) => {
|
|
61
|
+
const component = await mount(_jsx(CypherEditor, { schema: {
|
|
62
|
+
labels: ['Pokemon'],
|
|
63
|
+
} }));
|
|
64
|
+
const textField = page.getByRole('textbox');
|
|
65
|
+
await textField.fill('MATCH (n :P');
|
|
66
|
+
await page.locator('.cm-tooltip-autocomplete').getByText('Pokemon').click();
|
|
67
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
68
|
+
await expect(component).toContainText('MATCH (n :Pokemon');
|
|
69
|
+
});
|
|
70
|
+
test('can complete properties with backticks', async ({ mount, page }) => {
|
|
71
|
+
const component = await mount(_jsx(CypherEditor, { schema: {
|
|
72
|
+
propertyKeys: ['foo bar'],
|
|
73
|
+
} }));
|
|
74
|
+
const textField = page.getByRole('textbox');
|
|
75
|
+
await textField.fill('MATCH (n) RETURN n.foo');
|
|
76
|
+
await textField.press('Escape');
|
|
77
|
+
await textField.press('Control+ ');
|
|
78
|
+
await page.locator('.cm-tooltip-autocomplete').getByText('foo bar').click();
|
|
79
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
80
|
+
await expect(component).toContainText('MATCH (n) RETURN n.`foo bar`');
|
|
81
|
+
});
|
|
82
|
+
test('can update dbschema', async ({ mount, page }) => {
|
|
83
|
+
const component = await mount(_jsx(CypherEditor, { schema: {
|
|
84
|
+
labels: ['Pokemon'],
|
|
85
|
+
} }));
|
|
86
|
+
const textField = page.getByRole('textbox');
|
|
87
|
+
await textField.fill('MATCH (n :');
|
|
88
|
+
await expect(page.locator('.cm-tooltip-autocomplete').getByText('Pokemon')).toBeVisible();
|
|
89
|
+
await textField.press('Escape');
|
|
90
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
91
|
+
await component.update(_jsx(CypherEditor, { schema: {
|
|
92
|
+
labels: ['Pokemon', 'Digimon'],
|
|
93
|
+
} }));
|
|
94
|
+
await textField.press('Control+ ');
|
|
95
|
+
await expect(page.locator('.cm-tooltip-autocomplete').getByText('Pokemon')).toBeVisible();
|
|
96
|
+
await expect(page.locator('.cm-tooltip-autocomplete').getByText('Digimon')).toBeVisible();
|
|
97
|
+
});
|
|
98
|
+
test('can complete rel types', async ({ page, mount }) => {
|
|
99
|
+
const component = await mount(_jsx(CypherEditor, { schema: {
|
|
100
|
+
relationshipTypes: ['KNOWS'],
|
|
101
|
+
} }));
|
|
102
|
+
const textField = page.getByRole('textbox');
|
|
103
|
+
await textField.fill('MATCH (n)-[:');
|
|
104
|
+
await page.locator('.cm-tooltip-autocomplete').getByText('KNOWS').click();
|
|
105
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
106
|
+
await expect(component).toContainText('MATCH (n)-[:KNOWS');
|
|
107
|
+
});
|
|
108
|
+
test('can complete YIELD clauses without manual trigger', async ({ page, mount, }) => {
|
|
109
|
+
const component = await mount(_jsx(CypherEditor, { schema: {
|
|
110
|
+
procedures: testData.mockSchema.procedures,
|
|
111
|
+
} }));
|
|
112
|
+
const textField = page.getByRole('textbox');
|
|
113
|
+
await textField.fill('CALL dbms.components() YIELD ');
|
|
114
|
+
await page.locator('.cm-tooltip-autocomplete').getByText('edition').click();
|
|
115
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
116
|
+
await expect(component).toContainText('CALL dbms.components() YIELD edition');
|
|
117
|
+
});
|
|
118
|
+
test('automatic yield trigger is not case sensitive', async ({ page, mount, }) => {
|
|
119
|
+
const component = await mount(_jsx(CypherEditor, { schema: {
|
|
120
|
+
procedures: testData.mockSchema.procedures,
|
|
121
|
+
} }));
|
|
122
|
+
const textField = page.getByRole('textbox');
|
|
123
|
+
await textField.fill('CALL dbms.components() yIeLd ');
|
|
124
|
+
await page.locator('.cm-tooltip-autocomplete').getByText('edition').click();
|
|
125
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
126
|
+
await expect(component).toContainText('CALL dbms.components() yIeLd edition');
|
|
127
|
+
});
|
|
128
|
+
test('can complete functions', async ({ page, mount }) => {
|
|
129
|
+
const component = await mount(_jsx(CypherEditor, { schema: {
|
|
130
|
+
functions: {
|
|
131
|
+
'CYPHER 5': {
|
|
132
|
+
function123: {
|
|
133
|
+
...testData.emptyFunction,
|
|
134
|
+
name: 'function123',
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
} }));
|
|
139
|
+
const textField = page.getByRole('textbox');
|
|
140
|
+
await textField.fill('RETURN func');
|
|
141
|
+
await page
|
|
142
|
+
.locator('.cm-tooltip-autocomplete')
|
|
143
|
+
.getByText('function123')
|
|
144
|
+
.click();
|
|
145
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
146
|
+
await expect(component).toContainText('RETURN function123');
|
|
147
|
+
});
|
|
148
|
+
test('can complete procedures', async ({ page, mount }) => {
|
|
149
|
+
const component = await mount(_jsx(CypherEditor, { schema: {
|
|
150
|
+
procedures: {
|
|
151
|
+
'CYPHER 5': {
|
|
152
|
+
'db.ping': { ...testData.emptyProcedure, name: 'db.ping' },
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
} }));
|
|
156
|
+
const textField = page.getByRole('textbox');
|
|
157
|
+
await textField.fill('CALL d');
|
|
158
|
+
await page.locator('.cm-tooltip-autocomplete').getByText('db.ping').click();
|
|
159
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
160
|
+
await expect(component).toContainText('CALL db.ping');
|
|
161
|
+
});
|
|
162
|
+
test('can complete parameters', async ({ page, mount }) => {
|
|
163
|
+
const component = await mount(_jsx(CypherEditor, { schema: {
|
|
164
|
+
parameters: { parameter: { type: 'string' } },
|
|
165
|
+
} }));
|
|
166
|
+
const textField = page.getByRole('textbox');
|
|
167
|
+
await textField.fill('RETURN $p');
|
|
168
|
+
await page.locator('.cm-tooltip-autocomplete').getByText('parameter').click();
|
|
169
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
170
|
+
await expect(component).toContainText('RETURN $parameter');
|
|
171
|
+
});
|
|
172
|
+
test('completes allShortestPaths correctly', async ({ page, mount }) => {
|
|
173
|
+
await mount(_jsx(CypherEditor, { schema: {
|
|
174
|
+
parameters: { parameter: { type: 'string' } },
|
|
175
|
+
} }));
|
|
176
|
+
const textField = page.getByRole('textbox');
|
|
177
|
+
// The first query contains errors on purpose so the
|
|
178
|
+
// syntax errors get triggered before the auto-completion
|
|
179
|
+
await textField.fill('MATCH (n) REURN n; MATCH a');
|
|
180
|
+
await page
|
|
181
|
+
.locator('.cm-tooltip-autocomplete')
|
|
182
|
+
.getByText('allShortestPaths')
|
|
183
|
+
.click();
|
|
184
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
185
|
+
expect(await textField.textContent()).toEqual('MATCH (n) REURN n; MATCH allShortestPaths');
|
|
186
|
+
});
|
|
187
|
+
async function getInfoTooltip(page, methodName) {
|
|
188
|
+
const infoTooltip = page.locator('.cm-completionInfo');
|
|
189
|
+
const firstOption = page.locator('li[aria-selected="true"]');
|
|
190
|
+
let selectedOption = firstOption;
|
|
191
|
+
while (!(await infoTooltip.textContent()).includes(methodName)) {
|
|
192
|
+
await page.keyboard.press('ArrowDown');
|
|
193
|
+
const currentSelected = page.locator('li[aria-selected="true"]');
|
|
194
|
+
expect(currentSelected).not.toBe(selectedOption);
|
|
195
|
+
expect(currentSelected).not.toBe(firstOption);
|
|
196
|
+
selectedOption = currentSelected;
|
|
197
|
+
}
|
|
198
|
+
return infoTooltip;
|
|
199
|
+
}
|
|
200
|
+
test('shows signature help information on auto-completion for procedures', async ({ page, mount, }) => {
|
|
201
|
+
await mount(_jsx(CypherEditor, { schema: testData.mockSchema }));
|
|
202
|
+
const procName = 'apoc.periodic.iterate';
|
|
203
|
+
const procedure = testData.mockSchema.procedures['CYPHER 5'][procName];
|
|
204
|
+
const textField = page.getByRole('textbox');
|
|
205
|
+
await textField.fill('CALL apoc.periodic.');
|
|
206
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
|
|
207
|
+
const infoTooltip = await getInfoTooltip(page, procName);
|
|
208
|
+
await expect(infoTooltip).toContainText(procedure.signature);
|
|
209
|
+
await expect(infoTooltip).toContainText(procedure.description);
|
|
210
|
+
});
|
|
211
|
+
test('shows signature help information on auto-completion for functions', async ({ page, mount, }) => {
|
|
212
|
+
await mount(_jsx(CypherEditor, { schema: testData.mockSchema }));
|
|
213
|
+
const fnName = 'apoc.coll.combinations';
|
|
214
|
+
const fn = testData.mockSchema.functions['CYPHER 5'][fnName];
|
|
215
|
+
const textField = page.getByRole('textbox');
|
|
216
|
+
await textField.fill('RETURN apoc.coll.');
|
|
217
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
|
|
218
|
+
const infoTooltip = await getInfoTooltip(page, fnName);
|
|
219
|
+
await expect(infoTooltip).toContainText(fn.signature);
|
|
220
|
+
await expect(infoTooltip).toContainText(fn.description);
|
|
221
|
+
});
|
|
222
|
+
test('shows deprecated procedures as strikethrough on auto-completion', async ({ page, mount, }) => {
|
|
223
|
+
const procName = 'apoc.trigger.resume';
|
|
224
|
+
await mount(_jsx(CypherEditor, { schema: {
|
|
225
|
+
procedures: {
|
|
226
|
+
'CYPHER 5': {
|
|
227
|
+
[procName]: testData.mockSchema.procedures['CYPHER 5'][procName],
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
} }));
|
|
231
|
+
const textField = page.getByRole('textbox');
|
|
232
|
+
await textField.fill('CALL apoc.trigger.');
|
|
233
|
+
// We need to assert on the element having the right class
|
|
234
|
+
// and trusting the CSS is making this truly strikethrough
|
|
235
|
+
await expect(page.locator('.cm-deprecated-element')).toBeVisible();
|
|
236
|
+
});
|
|
237
|
+
test('shows deprecated function as strikethrough on auto-completion', async ({ page, mount, }) => {
|
|
238
|
+
const fnName = 'apoc.create.uuid';
|
|
239
|
+
await mount(_jsx(CypherEditor, { schema: {
|
|
240
|
+
functions: {
|
|
241
|
+
'CYPHER 5': {
|
|
242
|
+
[fnName]: testData.mockSchema.functions['CYPHER 5'][fnName],
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
} }));
|
|
246
|
+
const textField = page.getByRole('textbox');
|
|
247
|
+
await textField.fill('RETURN apoc.create.');
|
|
248
|
+
// We need to assert on the element having the right class
|
|
249
|
+
// and trusting the CSS is making this truly strikethrough
|
|
250
|
+
await expect(page.locator('.cm-deprecated-element')).toBeVisible();
|
|
251
|
+
});
|
|
252
|
+
test('does not signature help information on auto-completion if docs and signature are empty', async ({ page, mount, }) => {
|
|
253
|
+
await mount(_jsx(CypherEditor, { schema: testData.mockSchema }));
|
|
254
|
+
const textField = page.getByRole('textbox');
|
|
255
|
+
await textField.fill('C');
|
|
256
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
|
|
257
|
+
await expect(page.locator('.cm-completionInfo')).not.toBeVisible();
|
|
258
|
+
});
|
|
259
|
+
test('shows signature help information on auto-completion if description is not empty, signature is', async ({ page, mount, }) => {
|
|
260
|
+
await mount(_jsx(CypherEditor, { schema: {
|
|
261
|
+
procedures: {
|
|
262
|
+
'CYPHER 5': {
|
|
263
|
+
'db.ping': {
|
|
264
|
+
...testData.emptyProcedure,
|
|
265
|
+
description: 'foo',
|
|
266
|
+
signature: '',
|
|
267
|
+
name: 'db.ping',
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
} }));
|
|
272
|
+
const textField = page.getByRole('textbox');
|
|
273
|
+
await textField.fill('CALL db.');
|
|
274
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
|
|
275
|
+
await expect(page.locator('.cm-completionInfo')).toBeVisible();
|
|
276
|
+
});
|
|
277
|
+
test('shows signature help information on auto-completion if signature is not empty, description is', async ({ page, mount, }) => {
|
|
278
|
+
await mount(_jsx(CypherEditor, { schema: {
|
|
279
|
+
procedures: {
|
|
280
|
+
'CYPHER 5': {
|
|
281
|
+
'db.ping': {
|
|
282
|
+
...testData.emptyProcedure,
|
|
283
|
+
description: '',
|
|
284
|
+
signature: 'foo',
|
|
285
|
+
name: 'db.ping',
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
} }));
|
|
290
|
+
const textField = page.getByRole('textbox');
|
|
291
|
+
await textField.fill('CALL db.');
|
|
292
|
+
await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
|
|
293
|
+
await expect(page.locator('.cm-completionInfo')).toBeVisible();
|
|
294
|
+
});
|
|
295
|
+
test('completions depend on the Cypher version', async ({ page, mount }) => {
|
|
296
|
+
await mount(_jsx(CypherEditor, { schema: {
|
|
297
|
+
functions: {
|
|
298
|
+
'CYPHER 5': {
|
|
299
|
+
cypher5Function: {
|
|
300
|
+
...testData.emptyFunction,
|
|
301
|
+
name: 'cypher5Function',
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
'CYPHER 25': {
|
|
305
|
+
cypher25Function: {
|
|
306
|
+
...testData.emptyFunction,
|
|
307
|
+
name: 'cypher25Function',
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
} }));
|
|
312
|
+
const textField = page.getByRole('textbox');
|
|
313
|
+
await textField.fill('CYPHER 5 RETURN cypher');
|
|
314
|
+
await expect(page.locator('.cm-tooltip-autocomplete').getByText('cypher5Function')).toBeVisible();
|
|
315
|
+
await textField.fill('CYPHER 25 RETURN cypher');
|
|
316
|
+
await expect(page.locator('.cm-tooltip-autocomplete').getByText('cypher25Function')).toBeVisible();
|
|
317
|
+
});
|
|
318
|
+
test('does not complete properties for non node / relationship variables', async ({ page, mount }) => {
|
|
319
|
+
await mount(_jsx(CypherEditor, { schema: {
|
|
320
|
+
propertyKeys: ["nodeProperty"]
|
|
321
|
+
} }));
|
|
322
|
+
const textField = page.getByRole('textbox');
|
|
323
|
+
await textField.fill('MATCH (n) RETURN n.');
|
|
324
|
+
await expect(page.locator('.cm-tooltip-autocomplete').getByText('nodeProperty')).toBeVisible();
|
|
325
|
+
await textField.fill('WITH 1 AS x RETURN x.');
|
|
326
|
+
// This could be flaky if the semantic analysis takes too long
|
|
327
|
+
await page.waitForTimeout(500);
|
|
328
|
+
await textField.press('Escape');
|
|
329
|
+
await textField.press('Control+ ');
|
|
330
|
+
await expect(page.locator('.cm-tooltip-autocomplete').getByText('nodeProperty')).not.toBeVisible();
|
|
331
|
+
});
|
|
332
|
+
//# sourceMappingURL=autoCompletion.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoCompletion.spec.js","sourceRoot":"","sources":["../../../src/e2e_tests/autoCompletion.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
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('prompt shows up', async ({ mount, page }) => {
|
|
5
|
+
const component = await mount(_jsx(CypherEditor, { prompt: "neo4j>" }));
|
|
6
|
+
await expect(component).toContainText('neo4j>');
|
|
7
|
+
await component.update(_jsx(CypherEditor, { prompt: "test>" }));
|
|
8
|
+
await expect(component).toContainText('test>');
|
|
9
|
+
const textField = page.getByRole('textbox');
|
|
10
|
+
await textField.press('a');
|
|
11
|
+
await expect(textField).toHaveText('a');
|
|
12
|
+
});
|
|
13
|
+
test('line numbers can be turned on/off', async ({ mount }) => {
|
|
14
|
+
const component = await mount(_jsx(CypherEditor, { lineNumbers: true }));
|
|
15
|
+
await expect(component).toContainText('1');
|
|
16
|
+
await component.update(_jsx(CypherEditor, { lineNumbers: false }));
|
|
17
|
+
await expect(component).not.toContainText('1');
|
|
18
|
+
});
|
|
19
|
+
test('can configure readonly', async ({ mount, page }) => {
|
|
20
|
+
const component = await mount(_jsx(CypherEditor, { readonly: true }));
|
|
21
|
+
const textField = page.getByRole('textbox');
|
|
22
|
+
await textField.press('a');
|
|
23
|
+
await expect(textField).not.toHaveText('a');
|
|
24
|
+
await component.update(_jsx(CypherEditor, { readonly: false }));
|
|
25
|
+
await textField.press('b');
|
|
26
|
+
await expect(textField).toHaveText('b');
|
|
27
|
+
});
|
|
28
|
+
test('can set placeholder ', async ({ mount, page }) => {
|
|
29
|
+
const component = await mount(_jsx(CypherEditor, { placeholder: "bulbasaur" }));
|
|
30
|
+
const textField = page.getByRole('textbox');
|
|
31
|
+
await expect(textField).toHaveText('bulbasaur');
|
|
32
|
+
await component.update(_jsx(CypherEditor, { placeholder: "venusaur" }));
|
|
33
|
+
await expect(textField).not.toHaveText('bulbasaur');
|
|
34
|
+
await expect(textField).toHaveText('venusaur');
|
|
35
|
+
await textField.fill('abc');
|
|
36
|
+
await expect(textField).not.toHaveText('venusaur');
|
|
37
|
+
await expect(textField).toHaveText('abc');
|
|
38
|
+
});
|
|
39
|
+
test('can set/unset onFocus/onBlur', async ({ mount, page }) => {
|
|
40
|
+
const component = await mount(_jsx(CypherEditor, {}));
|
|
41
|
+
let focusFireCount = 0;
|
|
42
|
+
let blurFireCount = 0;
|
|
43
|
+
const focus = () => {
|
|
44
|
+
focusFireCount += 1;
|
|
45
|
+
};
|
|
46
|
+
const blur = () => {
|
|
47
|
+
blurFireCount += 1;
|
|
48
|
+
};
|
|
49
|
+
await component.update(_jsx(CypherEditor, { domEventHandlers: { blur, focus } }));
|
|
50
|
+
const textField = page.getByRole('textbox');
|
|
51
|
+
await textField.click();
|
|
52
|
+
await expect(textField).toBeFocused();
|
|
53
|
+
// this is to give the events time to fire
|
|
54
|
+
await expect(() => {
|
|
55
|
+
expect(focusFireCount).toBe(1);
|
|
56
|
+
expect(blurFireCount).toBe(0);
|
|
57
|
+
}).toPass();
|
|
58
|
+
await textField.blur();
|
|
59
|
+
await expect(() => {
|
|
60
|
+
expect(focusFireCount).toBe(1);
|
|
61
|
+
expect(blurFireCount).toBe(1);
|
|
62
|
+
}).toPass();
|
|
63
|
+
await component.update(_jsx(CypherEditor, {}));
|
|
64
|
+
await textField.click();
|
|
65
|
+
await expect(textField).toBeFocused();
|
|
66
|
+
await textField.blur();
|
|
67
|
+
await expect(() => {
|
|
68
|
+
expect(focusFireCount).toBe(1);
|
|
69
|
+
expect(blurFireCount).toBe(1);
|
|
70
|
+
}).toPass();
|
|
71
|
+
});
|
|
72
|
+
test('aria-label is not set by default', async ({ mount, page }) => {
|
|
73
|
+
await mount(_jsx(CypherEditor, {}));
|
|
74
|
+
const textField = page.getByRole('textbox');
|
|
75
|
+
expect(await textField.getAttribute('aria-label')).toBeNull();
|
|
76
|
+
});
|
|
77
|
+
test('can set aria-label', async ({ mount, page }) => {
|
|
78
|
+
const ariaLabel = 'Cypher Editor';
|
|
79
|
+
await mount(_jsx(CypherEditor, { ariaLabel: ariaLabel }));
|
|
80
|
+
const textField = page.getByRole('textbox');
|
|
81
|
+
expect(await textField.getAttribute('aria-label')).toEqual(ariaLabel);
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=configuration.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration.spec.js","sourceRoot":"","sources":["../../../src/e2e_tests/configuration.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { expect, test } from '@playwright/experimental-ct-react';
|
|
3
|
+
import { DEBOUNCE_TIME } from '../constants';
|
|
4
|
+
import { CypherEditor } from '../CypherEditor';
|
|
5
|
+
import { CypherEditorPage } from './e2eUtils';
|
|
6
|
+
const DEBOUNCE_TIME_WITH_MARGIN = DEBOUNCE_TIME + 100;
|
|
7
|
+
// value updates from outside onExecute are overwritten by pending updates
|
|
8
|
+
test.fail('external updates should override debounced updates', async ({ mount, page }) => {
|
|
9
|
+
const editorPage = new CypherEditorPage(page);
|
|
10
|
+
let value = '';
|
|
11
|
+
const onChange = (val) => {
|
|
12
|
+
value = val;
|
|
13
|
+
void component.update(_jsx(CypherEditor, { value: val, onChange: onChange }));
|
|
14
|
+
};
|
|
15
|
+
const component = await mount(_jsx(CypherEditor, { value: value, onChange: onChange }));
|
|
16
|
+
await editorPage.getEditor().pressSequentially('RETURN 1');
|
|
17
|
+
onChange('foo');
|
|
18
|
+
await page.waitForTimeout(DEBOUNCE_TIME_WITH_MARGIN);
|
|
19
|
+
await expect(component).toContainText('foo');
|
|
20
|
+
});
|
|
21
|
+
// TODO Fix this test
|
|
22
|
+
test.fixme('onExecute updates should override debounce updates', async ({ mount, page }) => {
|
|
23
|
+
const editorPage = new CypherEditorPage(page);
|
|
24
|
+
let value = '';
|
|
25
|
+
const onExecute = () => {
|
|
26
|
+
value = '';
|
|
27
|
+
void component.update(_jsx(CypherEditor, { value: value, onChange: onChange, onExecute: onExecute }));
|
|
28
|
+
};
|
|
29
|
+
const onChange = (val) => {
|
|
30
|
+
value = val;
|
|
31
|
+
void component.update(_jsx(CypherEditor, { value: val, onChange: onChange, onExecute: onExecute }));
|
|
32
|
+
};
|
|
33
|
+
const component = await mount(_jsx(CypherEditor, { value: value, onChange: onChange, onExecute: onExecute }));
|
|
34
|
+
await editorPage.getEditor().pressSequentially('RETURN 1');
|
|
35
|
+
await editorPage.getEditor().press('Enter');
|
|
36
|
+
await page.waitForTimeout(DEBOUNCE_TIME_WITH_MARGIN);
|
|
37
|
+
await expect(component).not.toContainText('RETURN 1');
|
|
38
|
+
await editorPage.getEditor().pressSequentially('RETURN 1');
|
|
39
|
+
await editorPage.getEditor().pressSequentially('');
|
|
40
|
+
await editorPage.getEditor().pressSequentially('RETURN 1');
|
|
41
|
+
await editorPage.getEditor().press('Enter');
|
|
42
|
+
await page.waitForTimeout(DEBOUNCE_TIME_WITH_MARGIN);
|
|
43
|
+
await expect(component).not.toContainText('RETURN 1');
|
|
44
|
+
});
|
|
45
|
+
test('onExecute should fire after debounced updates', async ({ mount, page, }) => {
|
|
46
|
+
const editorPage = new CypherEditorPage(page);
|
|
47
|
+
let value = '';
|
|
48
|
+
let executedCommand = '';
|
|
49
|
+
const onExecute = (cmd) => {
|
|
50
|
+
executedCommand = cmd;
|
|
51
|
+
void component.update(_jsx(CypherEditor, { value: value, onChange: onChange, onExecute: onExecute }));
|
|
52
|
+
};
|
|
53
|
+
const onChange = (val) => {
|
|
54
|
+
value = val;
|
|
55
|
+
void component.update(_jsx(CypherEditor, { value: val, onChange: onChange, onExecute: onExecute }));
|
|
56
|
+
};
|
|
57
|
+
const component = await mount(_jsx(CypherEditor, { value: value, onChange: onChange, onExecute: onExecute }));
|
|
58
|
+
await editorPage.getEditor().fill('RETURN 1');
|
|
59
|
+
await editorPage.getEditor().press('Enter');
|
|
60
|
+
await editorPage.getEditor().fill('RETURN 2');
|
|
61
|
+
await editorPage.getEditor().press('Enter');
|
|
62
|
+
await page.waitForTimeout(DEBOUNCE_TIME_WITH_MARGIN);
|
|
63
|
+
await expect(component).toContainText('RETURN 2');
|
|
64
|
+
expect(executedCommand).toBe('RETURN 2');
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=debounce.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debounce.spec.js","sourceRoot":"","sources":["../../../src/e2e_tests/debounce.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,7 @@ export declare class CypherEditorPage {
|
|
|
8
8
|
getHexColorOfLocator(locator: Locator): Promise<string>;
|
|
9
9
|
checkErrorMessage(queryChunk: string, expectedMsg: string): Promise<void>;
|
|
10
10
|
checkWarningMessage(queryChunk: string, expectedMsg: string): Promise<void>;
|
|
11
|
+
checkNoNotificationMessage(type: 'error' | 'warning'): Promise<void>;
|
|
11
12
|
private checkNotificationMessage;
|
|
13
|
+
private checkHoverMessage;
|
|
12
14
|
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { expect } from '@playwright/experimental-ct-react';
|
|
2
|
+
export class CypherEditorPage {
|
|
3
|
+
page;
|
|
4
|
+
constructor(page) {
|
|
5
|
+
this.page = page;
|
|
6
|
+
}
|
|
7
|
+
getEditor() {
|
|
8
|
+
return this.page.getByRole('textbox');
|
|
9
|
+
}
|
|
10
|
+
async focusEditor() {
|
|
11
|
+
await this.getEditor().focus();
|
|
12
|
+
}
|
|
13
|
+
editorBackgroundIsUnset() {
|
|
14
|
+
return this.page.locator('.cm-editor').evaluate((e) => {
|
|
15
|
+
const browserDefaultBackgroundColor = 'rgba(0, 0, 0, 0)';
|
|
16
|
+
return (window.getComputedStyle(e).getPropertyValue('background-color') ===
|
|
17
|
+
browserDefaultBackgroundColor);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
getHexColorOfLocator(locator) {
|
|
21
|
+
return locator.evaluate((e) => {
|
|
22
|
+
// https://stackoverflow.com/questions/49974145/how-to-convert-rgba-to-hex-color-code-using-javascript
|
|
23
|
+
function RGBAToHexA(rgba, forceRemoveAlpha = false) {
|
|
24
|
+
return ('#' +
|
|
25
|
+
rgba
|
|
26
|
+
.replace(/^rgba?\(|\s+|\)$/g, '')
|
|
27
|
+
.split(',')
|
|
28
|
+
.filter((string, index) => !forceRemoveAlpha || index !== 3)
|
|
29
|
+
.map((string) => parseFloat(string))
|
|
30
|
+
.map((number, index) => index === 3 ? Math.round(number * 255) : number)
|
|
31
|
+
.map((number) => number.toString(16))
|
|
32
|
+
.map((string) => (string.length === 1 ? '0' + string : string))
|
|
33
|
+
.join(''));
|
|
34
|
+
}
|
|
35
|
+
const color = window.getComputedStyle(e).getPropertyValue('color');
|
|
36
|
+
return RGBAToHexA(color);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async checkErrorMessage(queryChunk, expectedMsg) {
|
|
40
|
+
return this.checkNotificationMessage('error', queryChunk, expectedMsg);
|
|
41
|
+
}
|
|
42
|
+
async checkWarningMessage(queryChunk, expectedMsg) {
|
|
43
|
+
return this.checkNotificationMessage('warning', queryChunk, expectedMsg);
|
|
44
|
+
}
|
|
45
|
+
async checkNoNotificationMessage(type) {
|
|
46
|
+
await this.page.waitForTimeout(10000);
|
|
47
|
+
await expect(this.page.locator('.cm-lintRange-' + type)).toHaveCount(0, {
|
|
48
|
+
timeout: 10000,
|
|
49
|
+
});
|
|
50
|
+
await expect(this.page.locator('.cm-lintPoint-' + type)).toHaveCount(0, {
|
|
51
|
+
timeout: 10000,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async checkNotificationMessage(type, queryChunk, expectedMsg) {
|
|
55
|
+
await expect(this.page.locator('.cm-lintRange-' + type).last()).toBeVisible({ timeout: 10000 });
|
|
56
|
+
await this.page.getByText(queryChunk, { exact: true }).hover();
|
|
57
|
+
await expect(this.page.locator('.cm-tooltip-hover').last()).toBeVisible({
|
|
58
|
+
timeout: 10000,
|
|
59
|
+
});
|
|
60
|
+
await this.checkHoverMessage(expectedMsg, type);
|
|
61
|
+
/* Return the mouse to the beginning of the query and
|
|
62
|
+
This is because if for example we have an overlay with a
|
|
63
|
+
first interaction that covers the element we want to perform
|
|
64
|
+
the second interaction on, we won't be able to see that second element
|
|
65
|
+
*/
|
|
66
|
+
await this.page.mouse.move(0, 0);
|
|
67
|
+
// Make sure the tooltip closed
|
|
68
|
+
await expect(this.page.locator('.cm-tooltip-hover').last()).not.toBeVisible();
|
|
69
|
+
}
|
|
70
|
+
async checkHoverMessage(expectedMsg, type) {
|
|
71
|
+
const locator = type === 'error'
|
|
72
|
+
? 'li.cm-diagnostic.cm-diagnostic-error'
|
|
73
|
+
: 'li.cm-diagnostic.cm-diagnostic-warning';
|
|
74
|
+
const tooltips = await this.page.locator(locator).all();
|
|
75
|
+
const tooltipTexts = await Promise.all(tooltips.map((t) => t.textContent()));
|
|
76
|
+
expect(tooltipTexts).toContain(expectedMsg);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=e2eUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2eUtils.js","sourceRoot":"","sources":["../../../src/e2e_tests/e2eUtils.ts"],"names":[],"mappings":"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"}
|