@neo4j-cypher/react-codemirror 2.0.0-next.4 → 2.0.0-next.41
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 +370 -0
- package/README.md +3 -2
- package/dist/src/CypherEditor.d.ts +245 -0
- package/dist/src/CypherEditor.js +513 -0
- package/dist/src/CypherEditor.js.map +1 -0
- package/dist/src/CypherEditor.test.js +162 -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/diffView.d.ts +13 -0
- package/dist/src/diffView.js +11 -0
- package/dist/src/diffView.js.map +1 -0
- package/dist/src/e2e_tests/autoCompletion.spec.js +334 -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 +64 -0
- package/dist/src/e2e_tests/sanityChecks.spec.js.map +1 -0
- package/dist/src/e2e_tests/signatureHelp.spec.js +226 -0
- package/dist/src/e2e_tests/signatureHelp.spec.js.map +1 -0
- package/dist/src/e2e_tests/snippets.spec.js +14 -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 +129 -0
- package/dist/src/e2e_tests/syntaxValidation.spec.js.map +1 -0
- package/dist/src/editorActions.d.ts +17 -0
- package/dist/src/editorActions.js +259 -0
- package/dist/src/editorActions.js.map +1 -0
- package/dist/{types/history-navigation.d.ts → src/historyNavigation.d.ts} +1 -1
- package/dist/src/historyNavigation.js +163 -0
- package/dist/src/historyNavigation.js.map +1 -0
- package/dist/src/hostCallbacks.d.ts +9 -0
- package/dist/src/hostCallbacks.js +2 -0
- package/dist/src/hostCallbacks.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 +6 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/inlinePanel.d.ts +27 -0
- package/dist/src/inlinePanel.js +86 -0
- package/dist/src/inlinePanel.js.map +1 -0
- package/dist/src/lang-cypher/autocomplete.d.ts +6 -0
- package/dist/src/lang-cypher/autocomplete.js +116 -0
- package/dist/src/lang-cypher/autocomplete.js.map +1 -0
- package/dist/{types → src}/lang-cypher/constants.d.ts +15 -2
- package/dist/src/lang-cypher/constants.js +74 -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/{types/lang-cypher/create-cypher-theme.d.ts → src/lang-cypher/createCypherTheme.d.ts} +14 -3
- package/dist/src/lang-cypher/createCypherTheme.js +202 -0
- package/dist/src/lang-cypher/createCypherTheme.js.map +1 -0
- package/dist/src/lang-cypher/langCypher.d.ts +15 -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 +2039 -0
- package/dist/src/lang-cypher/parser-adapter.d.ts +21 -0
- package/dist/src/lang-cypher/parser-adapter.js +115 -0
- package/dist/src/lang-cypher/parser-adapter.js.map +1 -0
- package/dist/src/lang-cypher/prism-global.d.ts +1 -0
- package/dist/src/lang-cypher/prism-global.js +7 -0
- package/dist/src/lang-cypher/prism-global.js.map +1 -0
- package/dist/src/lang-cypher/signatureHelp.d.ts +4 -0
- package/dist/src/lang-cypher/signatureHelp.js +108 -0
- package/dist/src/lang-cypher/signatureHelp.js.map +1 -0
- package/dist/src/lang-cypher/syntaxValidation.d.ts +4 -0
- package/dist/src/lang-cypher/syntaxValidation.js +65 -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/src/themes.d.ts +5 -0
- package/dist/src/themes.js +107 -0
- package/dist/src/themes.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +64 -62
- package/src/CypherEditor.test.tsx +211 -0
- package/src/CypherEditor.tsx +586 -59
- package/src/constants.ts +1 -0
- package/src/diffView.ts +24 -0
- package/src/e2e_tests/autoCompletion.spec.tsx +576 -0
- package/src/e2e_tests/configuration.spec.tsx +111 -0
- package/src/e2e_tests/debounce.spec.tsx +102 -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} +138 -19
- package/src/e2e_tests/performanceTest.spec.tsx +163 -0
- package/src/e2e_tests/{sanity-checks.spec.tsx → sanityChecks.spec.tsx} +28 -20
- package/src/e2e_tests/signatureHelp.spec.tsx +442 -0
- package/src/e2e_tests/snippets.spec.tsx +19 -0
- package/src/e2e_tests/{syntax-highlighting.spec.tsx → syntaxHighlighting.spec.tsx} +26 -24
- package/src/e2e_tests/syntaxValidation.spec.tsx +252 -0
- package/src/editorActions.ts +334 -0
- package/src/{history-navigation.ts → historyNavigation.ts} +6 -4
- package/src/hostCallbacks.ts +9 -0
- package/src/icons.ts +3 -0
- package/src/index.ts +4 -2
- package/src/inlinePanel.ts +140 -0
- package/src/lang-cypher/autocomplete.ts +96 -19
- package/src/lang-cypher/constants.ts +35 -2
- package/src/lang-cypher/contants.test.ts +7 -3
- package/src/lang-cypher/{create-cypher-theme.ts → createCypherTheme.ts} +97 -33
- package/src/lang-cypher/langCypher.ts +44 -0
- package/src/lang-cypher/lintWorker.mjs +2039 -0
- package/src/lang-cypher/parser-adapter.ts +146 -0
- package/src/lang-cypher/prism-global.ts +7 -0
- package/src/lang-cypher/signatureHelp.ts +154 -0
- package/src/lang-cypher/syntaxValidation.ts +81 -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} +79 -18
- package/src/richClipboardCopier.test.ts +67 -0
- package/src/richClipboardCopier.ts +99 -0
- package/src/themes.ts +63 -71
- package/src/viteEnv.d.ts +1 -0
- package/dist/cjs/index.cjs +0 -1441
- package/dist/cjs/index.cjs.map +0 -7
- package/dist/esm/index.mjs +0 -1464
- package/dist/esm/index.mjs.map +0 -7
- package/dist/types/CypherEditor.d.ts +0 -113
- 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/lang-cypher/syntax-validation.d.ts +0 -3
- package/dist/types/ndl-tokens-copy.d.ts +0 -379
- package/dist/types/neo4j-setup.d.ts +0 -2
- package/dist/types/themes.d.ts +0 -11
- 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/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,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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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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 { CypherEditorPage } from './e2eUtils';
|
|
5
|
+
test('can add extra keybinding statically', async ({ mount, page }) => {
|
|
6
|
+
const editorPage = new CypherEditorPage(page);
|
|
7
|
+
let hasRun = false;
|
|
8
|
+
const component = await mount(_jsx(CypherEditor, { extraKeybindings: [
|
|
9
|
+
{
|
|
10
|
+
key: 'a',
|
|
11
|
+
preventDefault: true,
|
|
12
|
+
run: () => {
|
|
13
|
+
hasRun = true;
|
|
14
|
+
return true;
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
] }));
|
|
18
|
+
await editorPage.getEditor().press('a');
|
|
19
|
+
await expect(component).not.toHaveText('a');
|
|
20
|
+
expect(hasRun).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
test('can add extra keybinding dymanically', async ({ mount, page }) => {
|
|
23
|
+
const editorPage = new CypherEditorPage(page);
|
|
24
|
+
let hasRun = false;
|
|
25
|
+
const component = await mount(_jsx(CypherEditor, {}));
|
|
26
|
+
await editorPage.getEditor().press('a');
|
|
27
|
+
await editorPage.getEditor().press('Escape');
|
|
28
|
+
await expect(component).toContainText('a');
|
|
29
|
+
await component.update(_jsx(CypherEditor, { extraKeybindings: [
|
|
30
|
+
{
|
|
31
|
+
key: 'a',
|
|
32
|
+
preventDefault: true,
|
|
33
|
+
run: () => {
|
|
34
|
+
hasRun = true;
|
|
35
|
+
return true;
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
] }));
|
|
39
|
+
await editorPage.getEditor().press('a');
|
|
40
|
+
await expect(component).not.toContainText('aa');
|
|
41
|
+
expect(hasRun).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=extraKeybindings.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraKeybindings.spec.js","sourceRoot":"","sources":["../../../src/e2e_tests/extraKeybindings.spec.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,IAAI,CAAC,qCAAqC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;IACpE,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,SAAS,GAAG,MAAM,KAAK,CAC3B,KAAC,YAAY,IACX,gBAAgB,EAAE;YAChB;gBACE,GAAG,EAAE,GAAG;gBACR,cAAc,EAAE,IAAI;gBACpB,GAAG,EAAE,GAAG,EAAE;oBACR,MAAM,GAAG,IAAI,CAAC;oBACd,OAAO,IAAI,CAAC;gBACd,CAAC;aACF;SACF,GACD,CACH,CAAC;IAEF,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAExC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sCAAsC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;IACrE,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC;IAChD,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAE3C,MAAM,SAAS,CAAC,MAAM,CACpB,KAAC,YAAY,IACX,gBAAgB,EAAE;YAChB;gBACE,GAAG,EAAE,GAAG;gBACR,cAAc,EAAE,IAAI;gBACpB,GAAG,EAAE,GAAG,EAAE;oBACR,MAAM,GAAG,IAAI,CAAC;oBACd,OAAO,IAAI,CAAC;gBACd,CAAC;aACF;SACF,GACD,CACH,CAAC;IAEF,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,227 @@
|
|
|
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 { CypherEditorPage } from './e2eUtils';
|
|
5
|
+
test('respects preloaded history', async ({ page, mount }) => {
|
|
6
|
+
const editorPage = new CypherEditorPage(page);
|
|
7
|
+
const initialValue = 'MATCH (n) RETURN n;';
|
|
8
|
+
await mount(_jsx(CypherEditor, { value: initialValue, history: ['first', 'second'], onExecute: () => {
|
|
9
|
+
/* needed to turn on history movements */
|
|
10
|
+
} }));
|
|
11
|
+
await editorPage.getEditor().press('ArrowUp');
|
|
12
|
+
await expect(page.getByText('first')).toBeVisible();
|
|
13
|
+
// First arrow up is to get to start of line
|
|
14
|
+
await editorPage.getEditor().press('ArrowUp');
|
|
15
|
+
await editorPage.getEditor().press('ArrowUp');
|
|
16
|
+
await expect(page.getByText('second')).toBeVisible();
|
|
17
|
+
// First arrow down is to get to end of line
|
|
18
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
19
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
20
|
+
await expect(page.getByText('first')).toBeVisible();
|
|
21
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
22
|
+
await expect(page.getByText(initialValue)).toBeVisible();
|
|
23
|
+
});
|
|
24
|
+
test('can add new lines without onExecute', async ({ page, mount }) => {
|
|
25
|
+
const editorPage = new CypherEditorPage(page);
|
|
26
|
+
const editorComponent = await mount(_jsx(CypherEditor, {}));
|
|
27
|
+
// Ctrl-Enter does nothing when onExecute is false
|
|
28
|
+
await editorPage.getEditor().press('Control+Enter');
|
|
29
|
+
await expect(editorComponent).toHaveText('1\n', {
|
|
30
|
+
useInnerText: true,
|
|
31
|
+
});
|
|
32
|
+
// Enter adds new lines
|
|
33
|
+
await editorPage.getEditor().fill('Brock');
|
|
34
|
+
await editorPage.getEditor().press('Enter');
|
|
35
|
+
await editorPage.getEditor().press('Enter');
|
|
36
|
+
await expect(editorComponent).toHaveText('1\n2\n3\nBrock', {
|
|
37
|
+
useInnerText: true,
|
|
38
|
+
});
|
|
39
|
+
// Shift-Enter adds new lines
|
|
40
|
+
await editorPage.getEditor().press('Shift+Enter');
|
|
41
|
+
await editorPage.getEditor().press('Shift+Enter');
|
|
42
|
+
await expect(editorComponent).toHaveText('1\n2\n3\n4\n5\nBrock', {
|
|
43
|
+
useInnerText: true,
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
test('can add new lines with newLineOnEnter and without onExecute', async ({ page, mount, }) => {
|
|
47
|
+
const editorPage = new CypherEditorPage(page);
|
|
48
|
+
const editorComponent = await mount(_jsx(CypherEditor, { newLineOnEnter: true }));
|
|
49
|
+
// Ctrl-Enter does nothing when onExecute is false
|
|
50
|
+
await editorPage.getEditor().press('Control+Enter');
|
|
51
|
+
await expect(editorComponent).toHaveText('1\n', {
|
|
52
|
+
useInnerText: true,
|
|
53
|
+
});
|
|
54
|
+
// Enter adds new lines
|
|
55
|
+
await editorPage.getEditor().fill('Brock');
|
|
56
|
+
await editorPage.getEditor().press('Enter');
|
|
57
|
+
await editorPage.getEditor().press('Enter');
|
|
58
|
+
await expect(editorComponent).toHaveText('1\n2\n3\nBrock', {
|
|
59
|
+
useInnerText: true,
|
|
60
|
+
});
|
|
61
|
+
// Shift-Enter adds new lines
|
|
62
|
+
await editorPage.getEditor().press('Shift+Enter');
|
|
63
|
+
await editorPage.getEditor().press('Shift+Enter');
|
|
64
|
+
await expect(editorComponent).toHaveText('1\n2\n3\n4\n5\nBrock', {
|
|
65
|
+
useInnerText: true,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
test('can execute queries and see them in history with newLineOnEnter', async ({ page, mount, }) => {
|
|
69
|
+
const editorPage = new CypherEditorPage(page);
|
|
70
|
+
const initialValue = `MATCH (n)
|
|
71
|
+
RETURN n;`;
|
|
72
|
+
const history = [];
|
|
73
|
+
const onExecute = (cmd) => {
|
|
74
|
+
history.unshift(cmd);
|
|
75
|
+
};
|
|
76
|
+
const editor = await mount(_jsx(CypherEditor, { value: initialValue, history: history, onExecute: onExecute, newLineOnEnter: true }));
|
|
77
|
+
// Execute initial query
|
|
78
|
+
await editorPage.getEditor().press('Control+Enter');
|
|
79
|
+
await editorPage.getEditor().press('Meta+Enter');
|
|
80
|
+
expect(history.length).toBe(1);
|
|
81
|
+
// Ensure query execution doesn't fire if the query is only whitespace
|
|
82
|
+
await editorPage.getEditor().fill(' ');
|
|
83
|
+
await editorPage.getEditor().press('Control+Enter');
|
|
84
|
+
await editorPage.getEditor().press('Meta+Enter');
|
|
85
|
+
expect(history.length).toBe(1);
|
|
86
|
+
// Ensure cmd+enter is required in multiline
|
|
87
|
+
await editorPage.getEditor().fill('multiline');
|
|
88
|
+
await editorPage.getEditor().press('Enter');
|
|
89
|
+
await editorPage.getEditor().press('Enter');
|
|
90
|
+
await editorPage.getEditor().press('Enter');
|
|
91
|
+
await editorPage.getEditor().press('Shift+Enter');
|
|
92
|
+
await page.keyboard.type('entry');
|
|
93
|
+
expect(history.length).toBe(1);
|
|
94
|
+
await editorPage.getEditor().press('Control+Enter');
|
|
95
|
+
await editorPage.getEditor().press('Meta+Enter');
|
|
96
|
+
expect(history.length).toBe(2);
|
|
97
|
+
// rerender with new history
|
|
98
|
+
await editor.update(_jsx(CypherEditor, { value: initialValue, history: history, onExecute: onExecute }));
|
|
99
|
+
// type a new query and make sure it's not lost when navigating history
|
|
100
|
+
await editorPage.getEditor().fill('draft');
|
|
101
|
+
await expect(page.getByText('draft')).toBeVisible();
|
|
102
|
+
expect(history.length).toBe(2);
|
|
103
|
+
// Navigate to the top of the editor before navigating history
|
|
104
|
+
await editorPage.getEditor().press('ArrowLeft');
|
|
105
|
+
await editorPage.getEditor().press('ArrowLeft');
|
|
106
|
+
await editorPage.getEditor().press('ArrowLeft');
|
|
107
|
+
await editorPage.getEditor().press('ArrowLeft');
|
|
108
|
+
await editorPage.getEditor().press('ArrowLeft');
|
|
109
|
+
await editorPage.getEditor().press('ArrowUp');
|
|
110
|
+
// Ensure moving down in the editor doesn't navigate history
|
|
111
|
+
await expect(page.getByText('multiline')).toBeVisible();
|
|
112
|
+
// arrow movements don't matter until bottom is hit
|
|
113
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
114
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
115
|
+
await editorPage.getEditor().press('ArrowUp');
|
|
116
|
+
await editorPage.getEditor().press('ArrowUp');
|
|
117
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
118
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
119
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
120
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
121
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
122
|
+
// editor still multiline
|
|
123
|
+
await expect(page.getByText('multiline')).toBeVisible();
|
|
124
|
+
// until you hit the end where have the draft we created earlier
|
|
125
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
126
|
+
await expect(page.getByText('draft')).toBeVisible();
|
|
127
|
+
});
|
|
128
|
+
test('can execute queries without newLineOnEnter', async ({ page, mount }) => {
|
|
129
|
+
const editorPage = new CypherEditorPage(page);
|
|
130
|
+
const initialValue = 'Brock';
|
|
131
|
+
const history = [];
|
|
132
|
+
const onExecute = (cmd) => {
|
|
133
|
+
history.unshift(cmd);
|
|
134
|
+
};
|
|
135
|
+
const editorComponent = await mount(_jsx(CypherEditor, { value: initialValue, onExecute: onExecute }));
|
|
136
|
+
// Cmd/Control still executes initial query
|
|
137
|
+
await editorPage.getEditor().press('Control+Enter');
|
|
138
|
+
await editorPage.getEditor().press('Meta+Enter');
|
|
139
|
+
expect(history.length).toBe(1);
|
|
140
|
+
// Ensure query execution doesn't fire if the query is only whitespace
|
|
141
|
+
await editorPage.getEditor().fill(' ');
|
|
142
|
+
await editorPage.getEditor().press('Control+Enter');
|
|
143
|
+
await editorPage.getEditor().press('Meta+Enter');
|
|
144
|
+
await editorPage.getEditor().press('Enter');
|
|
145
|
+
expect(history.length).toBe(1);
|
|
146
|
+
// Ensure enter executes query when in single line
|
|
147
|
+
await editorPage.getEditor().fill('Misty');
|
|
148
|
+
await editorPage.getEditor().press('Enter');
|
|
149
|
+
expect(history.length).toBe(2);
|
|
150
|
+
expect(history).toEqual(['Misty', 'Brock']);
|
|
151
|
+
// Ensure cmd+enter is required in multiline
|
|
152
|
+
await editorPage.getEditor().fill('multiline');
|
|
153
|
+
await editorPage.getEditor().press('Shift+Enter');
|
|
154
|
+
await editorPage.getEditor().press('Enter');
|
|
155
|
+
await editorPage.getEditor().press('A');
|
|
156
|
+
// line numbers and the text
|
|
157
|
+
await expect(editorComponent).toHaveText('1\n2\n3\nmultiline\nA', {
|
|
158
|
+
useInnerText: true,
|
|
159
|
+
});
|
|
160
|
+
await editorPage.getEditor().press('Enter');
|
|
161
|
+
await editorPage.getEditor().press('Enter');
|
|
162
|
+
await editorPage.getEditor().press('Enter');
|
|
163
|
+
await editorPage.getEditor().press('Enter');
|
|
164
|
+
expect(history.length).toBe(2);
|
|
165
|
+
await editorPage.getEditor().press('Control+Enter');
|
|
166
|
+
await editorPage.getEditor().press('Meta+Enter');
|
|
167
|
+
expect(history.length).toBe(3);
|
|
168
|
+
});
|
|
169
|
+
test('can navigate with cmd+up as well', async ({ page, mount }) => {
|
|
170
|
+
const editorPage = new CypherEditorPage(page);
|
|
171
|
+
const isMac = process.platform === 'darwin';
|
|
172
|
+
const metaUp = isMac ? 'Meta+ArrowUp' : 'Control+ArrowUp';
|
|
173
|
+
const metaDown = isMac ? 'Meta+ArrowDown' : 'Control+ArrowDown';
|
|
174
|
+
const initialValue = 'MATCH (n) RETURN n;';
|
|
175
|
+
await mount(_jsx(CypherEditor, { value: initialValue, history: [
|
|
176
|
+
'first',
|
|
177
|
+
`one
|
|
178
|
+
multiline
|
|
179
|
+
entry
|
|
180
|
+
.`,
|
|
181
|
+
], onExecute: () => {
|
|
182
|
+
/* needed to turn on history movements */
|
|
183
|
+
} }));
|
|
184
|
+
await editorPage.getEditor().press(metaUp);
|
|
185
|
+
await expect(page.getByText('first')).toBeVisible();
|
|
186
|
+
// move in history
|
|
187
|
+
await editorPage.getEditor().press(metaUp);
|
|
188
|
+
await expect(page.getByText('multiline')).toBeVisible();
|
|
189
|
+
// Single meta down moves all the way to top of editor on mac
|
|
190
|
+
if (isMac) {
|
|
191
|
+
await editorPage.getEditor().press(metaDown);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
195
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
196
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
197
|
+
await editorPage.getEditor().press('ArrowDown');
|
|
198
|
+
}
|
|
199
|
+
await editorPage.getEditor().press(metaDown);
|
|
200
|
+
await expect(page.getByText('first')).toBeVisible();
|
|
201
|
+
});
|
|
202
|
+
test('test onExecute', async ({ page, mount }) => {
|
|
203
|
+
const editorPage = new CypherEditorPage(page);
|
|
204
|
+
const isMac = process.platform === 'darwin';
|
|
205
|
+
const execButton = isMac ? 'Meta+Enter' : 'Control+Enter';
|
|
206
|
+
const initialValue = 'MATCH (n) RETURN n;';
|
|
207
|
+
const history = [];
|
|
208
|
+
const onExecute = (cmd) => {
|
|
209
|
+
history.unshift(cmd);
|
|
210
|
+
};
|
|
211
|
+
const cypherEditor = await mount(_jsx(CypherEditor, { value: initialValue, onExecute: onExecute }));
|
|
212
|
+
await editorPage.getEditor().press(execButton);
|
|
213
|
+
expect(history).toEqual([initialValue]);
|
|
214
|
+
await editorPage.getEditor().press(execButton);
|
|
215
|
+
expect(history).toEqual([initialValue, initialValue]);
|
|
216
|
+
// can update onExecute
|
|
217
|
+
let newExecRan = false;
|
|
218
|
+
const newOnExecute = () => {
|
|
219
|
+
newExecRan = true;
|
|
220
|
+
};
|
|
221
|
+
await cypherEditor.update(_jsx(CypherEditor, { value: initialValue, onExecute: newOnExecute }));
|
|
222
|
+
await editorPage.getEditor().press(execButton);
|
|
223
|
+
expect(newExecRan).toEqual(true);
|
|
224
|
+
// old value should still be only 2
|
|
225
|
+
expect(history).toEqual([initialValue, initialValue]);
|
|
226
|
+
});
|
|
227
|
+
//# sourceMappingURL=historyNavigation.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historyNavigation.spec.js","sourceRoot":"","sources":["../../../src/e2e_tests/historyNavigation.spec.tsx"],"names":[],"mappings":"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"}
|