@neo4j-cypher/react-codemirror 2.0.0-canary-89dc5bb → 2.0.0-canary-5acfe46
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/dist/CypherEditor.d.ts +1 -1
- package/dist/CypherEditor.js +2 -1
- package/dist/CypherEditor.js.map +1 -1
- package/dist/e2e_tests/autoCompletion.spec.js +62 -37
- package/dist/e2e_tests/autoCompletion.spec.js.map +1 -1
- package/dist/e2e_tests/e2eUtils.js +7 -5
- package/dist/e2e_tests/e2eUtils.js.map +1 -1
- package/dist/e2e_tests/signatureHelp.spec.js +59 -13
- package/dist/e2e_tests/signatureHelp.spec.js.map +1 -1
- package/dist/e2e_tests/snippets.spec.js +2 -2
- package/dist/e2e_tests/snippets.spec.js.map +1 -1
- package/dist/e2e_tests/syntaxValidation.spec.js +13 -4
- package/dist/e2e_tests/syntaxValidation.spec.js.map +1 -1
- package/dist/lang-cypher/langCypher.d.ts +1 -0
- package/dist/lang-cypher/langCypher.js.map +1 -1
- package/dist/lang-cypher/lintWorker.d.ts +1 -0
- package/dist/lang-cypher/lintWorker.js +3 -0
- package/dist/lang-cypher/lintWorker.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/CypherEditor.tsx +8 -2
- package/src/e2e_tests/autoCompletion.spec.tsx +83 -56
- package/src/e2e_tests/e2eUtils.ts +7 -5
- package/src/e2e_tests/signatureHelp.spec.tsx +74 -13
- package/src/e2e_tests/snippets.spec.tsx +2 -2
- package/src/e2e_tests/syntaxValidation.spec.tsx +32 -4
- package/src/lang-cypher/langCypher.ts +1 -0
- package/src/lang-cypher/lintWorker.ts +4 -1
- package/dist/e2e_tests/helpers.spec.d.ts +0 -1
- package/dist/e2e_tests/helpers.spec.js +0 -12
- package/dist/e2e_tests/helpers.spec.js.map +0 -1
- package/src/e2e_tests/helpers.spec.tsx +0 -17
|
@@ -194,7 +194,10 @@ test('can complete rel types', async ({ page, mount }) => {
|
|
|
194
194
|
await expect(component).toContainText('MATCH (n)-[:KNOWS');
|
|
195
195
|
});
|
|
196
196
|
|
|
197
|
-
test('can complete YIELD clauses without manual trigger', async ({
|
|
197
|
+
test('can complete YIELD clauses without manual trigger', async ({
|
|
198
|
+
page,
|
|
199
|
+
mount,
|
|
200
|
+
}) => {
|
|
198
201
|
const component = await mount(
|
|
199
202
|
<CypherEditor
|
|
200
203
|
schema={{
|
|
@@ -213,7 +216,10 @@ test('can complete YIELD clauses without manual trigger', async ({ page, mount }
|
|
|
213
216
|
await expect(component).toContainText('CALL dbms.components() YIELD edition');
|
|
214
217
|
});
|
|
215
218
|
|
|
216
|
-
test('automatic yield trigger is not case sensitive', async ({
|
|
219
|
+
test('automatic yield trigger is not case sensitive', async ({
|
|
220
|
+
page,
|
|
221
|
+
mount,
|
|
222
|
+
}) => {
|
|
217
223
|
const component = await mount(
|
|
218
224
|
<CypherEditor
|
|
219
225
|
schema={{
|
|
@@ -237,9 +243,11 @@ test('can complete functions', async ({ page, mount }) => {
|
|
|
237
243
|
<CypherEditor
|
|
238
244
|
schema={{
|
|
239
245
|
functions: {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
246
|
+
'CYPHER 5': {
|
|
247
|
+
function123: {
|
|
248
|
+
...testData.emptyFunction,
|
|
249
|
+
name: 'function123',
|
|
250
|
+
},
|
|
243
251
|
},
|
|
244
252
|
},
|
|
245
253
|
}}
|
|
@@ -265,7 +273,9 @@ test('can complete procedures', async ({ page, mount }) => {
|
|
|
265
273
|
<CypherEditor
|
|
266
274
|
schema={{
|
|
267
275
|
procedures: {
|
|
268
|
-
'
|
|
276
|
+
'CYPHER 5': {
|
|
277
|
+
'db.ping': { ...testData.emptyProcedure, name: 'db.ping' },
|
|
278
|
+
},
|
|
269
279
|
},
|
|
270
280
|
}}
|
|
271
281
|
/>,
|
|
@@ -346,16 +356,9 @@ test('shows signature help information on auto-completion for procedures', async
|
|
|
346
356
|
page,
|
|
347
357
|
mount,
|
|
348
358
|
}) => {
|
|
349
|
-
await mount(
|
|
350
|
-
<CypherEditor
|
|
351
|
-
schema={testData.mockSchema}
|
|
352
|
-
featureFlags={{
|
|
353
|
-
signatureInfoOnAutoCompletions: true,
|
|
354
|
-
}}
|
|
355
|
-
/>,
|
|
356
|
-
);
|
|
359
|
+
await mount(<CypherEditor schema={testData.mockSchema} />);
|
|
357
360
|
const procName = 'apoc.periodic.iterate';
|
|
358
|
-
const procedure = testData.mockSchema.procedures[procName];
|
|
361
|
+
const procedure = testData.mockSchema.procedures['CYPHER 5'][procName];
|
|
359
362
|
|
|
360
363
|
const textField = page.getByRole('textbox');
|
|
361
364
|
await textField.fill('CALL apoc.periodic.');
|
|
@@ -371,16 +374,9 @@ test('shows signature help information on auto-completion for functions', async
|
|
|
371
374
|
page,
|
|
372
375
|
mount,
|
|
373
376
|
}) => {
|
|
374
|
-
await mount(
|
|
375
|
-
<CypherEditor
|
|
376
|
-
schema={testData.mockSchema}
|
|
377
|
-
featureFlags={{
|
|
378
|
-
signatureInfoOnAutoCompletions: true,
|
|
379
|
-
}}
|
|
380
|
-
/>,
|
|
381
|
-
);
|
|
377
|
+
await mount(<CypherEditor schema={testData.mockSchema} />);
|
|
382
378
|
const fnName = 'apoc.coll.combinations';
|
|
383
|
-
const fn = testData.mockSchema.functions[fnName];
|
|
379
|
+
const fn = testData.mockSchema.functions['CYPHER 5'][fnName];
|
|
384
380
|
|
|
385
381
|
const textField = page.getByRole('textbox');
|
|
386
382
|
await textField.fill('RETURN apoc.coll.');
|
|
@@ -401,10 +397,11 @@ test('shows deprecated procedures as strikethrough on auto-completion', async ({
|
|
|
401
397
|
await mount(
|
|
402
398
|
<CypherEditor
|
|
403
399
|
schema={{
|
|
404
|
-
procedures: {
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
400
|
+
procedures: {
|
|
401
|
+
'CYPHER 5': {
|
|
402
|
+
[procName]: testData.mockSchema.procedures['CYPHER 5'][procName],
|
|
403
|
+
},
|
|
404
|
+
},
|
|
408
405
|
}}
|
|
409
406
|
/>,
|
|
410
407
|
);
|
|
@@ -425,10 +422,11 @@ test('shows deprecated function as strikethrough on auto-completion', async ({
|
|
|
425
422
|
await mount(
|
|
426
423
|
<CypherEditor
|
|
427
424
|
schema={{
|
|
428
|
-
functions: {
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
425
|
+
functions: {
|
|
426
|
+
'CYPHER 5': {
|
|
427
|
+
[fnName]: testData.mockSchema.functions['CYPHER 5'][fnName],
|
|
428
|
+
},
|
|
429
|
+
},
|
|
432
430
|
}}
|
|
433
431
|
/>,
|
|
434
432
|
);
|
|
@@ -444,14 +442,7 @@ test('does not signature help information on auto-completion if docs and signatu
|
|
|
444
442
|
page,
|
|
445
443
|
mount,
|
|
446
444
|
}) => {
|
|
447
|
-
await mount(
|
|
448
|
-
<CypherEditor
|
|
449
|
-
schema={testData.mockSchema}
|
|
450
|
-
featureFlags={{
|
|
451
|
-
signatureInfoOnAutoCompletions: true,
|
|
452
|
-
}}
|
|
453
|
-
/>,
|
|
454
|
-
);
|
|
445
|
+
await mount(<CypherEditor schema={testData.mockSchema} />);
|
|
455
446
|
|
|
456
447
|
const textField = page.getByRole('textbox');
|
|
457
448
|
await textField.fill('C');
|
|
@@ -468,17 +459,16 @@ test('shows signature help information on auto-completion if description is not
|
|
|
468
459
|
<CypherEditor
|
|
469
460
|
schema={{
|
|
470
461
|
procedures: {
|
|
471
|
-
'
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
462
|
+
'CYPHER 5': {
|
|
463
|
+
'db.ping': {
|
|
464
|
+
...testData.emptyProcedure,
|
|
465
|
+
description: 'foo',
|
|
466
|
+
signature: '',
|
|
467
|
+
name: 'db.ping',
|
|
468
|
+
},
|
|
476
469
|
},
|
|
477
470
|
},
|
|
478
471
|
}}
|
|
479
|
-
featureFlags={{
|
|
480
|
-
signatureInfoOnAutoCompletions: true,
|
|
481
|
-
}}
|
|
482
472
|
/>,
|
|
483
473
|
);
|
|
484
474
|
|
|
@@ -497,17 +487,16 @@ test('shows signature help information on auto-completion if signature is not em
|
|
|
497
487
|
<CypherEditor
|
|
498
488
|
schema={{
|
|
499
489
|
procedures: {
|
|
500
|
-
'
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
490
|
+
'CYPHER 5': {
|
|
491
|
+
'db.ping': {
|
|
492
|
+
...testData.emptyProcedure,
|
|
493
|
+
description: '',
|
|
494
|
+
signature: 'foo',
|
|
495
|
+
name: 'db.ping',
|
|
496
|
+
},
|
|
505
497
|
},
|
|
506
498
|
},
|
|
507
499
|
}}
|
|
508
|
-
featureFlags={{
|
|
509
|
-
signatureInfoOnAutoCompletions: true,
|
|
510
|
-
}}
|
|
511
500
|
/>,
|
|
512
501
|
);
|
|
513
502
|
|
|
@@ -517,3 +506,41 @@ test('shows signature help information on auto-completion if signature is not em
|
|
|
517
506
|
await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
|
|
518
507
|
await expect(page.locator('.cm-completionInfo')).toBeVisible();
|
|
519
508
|
});
|
|
509
|
+
|
|
510
|
+
test('completions depend on the Cypher version', async ({ page, mount }) => {
|
|
511
|
+
await mount(
|
|
512
|
+
<CypherEditor
|
|
513
|
+
schema={{
|
|
514
|
+
functions: {
|
|
515
|
+
'CYPHER 5': {
|
|
516
|
+
cypher5Function: {
|
|
517
|
+
...testData.emptyFunction,
|
|
518
|
+
name: 'cypher5Function',
|
|
519
|
+
},
|
|
520
|
+
},
|
|
521
|
+
'CYPHER 25': {
|
|
522
|
+
cypher25Function: {
|
|
523
|
+
...testData.emptyFunction,
|
|
524
|
+
name: 'cypher25Function',
|
|
525
|
+
},
|
|
526
|
+
},
|
|
527
|
+
},
|
|
528
|
+
}}
|
|
529
|
+
featureFlags={{ cypher25: true }}
|
|
530
|
+
/>,
|
|
531
|
+
);
|
|
532
|
+
|
|
533
|
+
const textField = page.getByRole('textbox');
|
|
534
|
+
|
|
535
|
+
await textField.fill('CYPHER 5 RETURN cypher');
|
|
536
|
+
|
|
537
|
+
await expect(
|
|
538
|
+
page.locator('.cm-tooltip-autocomplete').getByText('cypher5Function'),
|
|
539
|
+
).toBeVisible();
|
|
540
|
+
|
|
541
|
+
await textField.fill('CYPHER 25 RETURN cypher');
|
|
542
|
+
|
|
543
|
+
await expect(
|
|
544
|
+
page.locator('.cm-tooltip-autocomplete').getByText('cypher25Function'),
|
|
545
|
+
).toBeVisible();
|
|
546
|
+
});
|
|
@@ -60,12 +60,12 @@ export class CypherEditorPage {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
async checkNoNotificationMessage(type: 'error' | 'warning') {
|
|
63
|
-
await this.page.waitForTimeout(
|
|
63
|
+
await this.page.waitForTimeout(10000);
|
|
64
64
|
await expect(this.page.locator('.cm-lintRange-' + type)).toHaveCount(0, {
|
|
65
|
-
timeout:
|
|
65
|
+
timeout: 10000,
|
|
66
66
|
});
|
|
67
67
|
await expect(this.page.locator('.cm-lintPoint-' + type)).toHaveCount(0, {
|
|
68
|
-
timeout:
|
|
68
|
+
timeout: 10000,
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
71
|
|
|
@@ -75,11 +75,13 @@ export class CypherEditorPage {
|
|
|
75
75
|
expectedMsg: string,
|
|
76
76
|
) {
|
|
77
77
|
await expect(this.page.locator('.cm-lintRange-' + type).last()).toBeVisible(
|
|
78
|
-
{ timeout:
|
|
78
|
+
{ timeout: 10000 },
|
|
79
79
|
);
|
|
80
80
|
|
|
81
81
|
await this.page.getByText(queryChunk, { exact: true }).hover();
|
|
82
|
-
await expect(this.page.locator('.cm-tooltip-hover').last()).toBeVisible(
|
|
82
|
+
await expect(this.page.locator('.cm-tooltip-hover').last()).toBeVisible({
|
|
83
|
+
timeout: 10000,
|
|
84
|
+
});
|
|
83
85
|
await expect(this.page.getByText(expectedMsg)).toBeVisible();
|
|
84
86
|
/* Return the mouse to the beginning of the query and
|
|
85
87
|
This is because if for example we have an overlay with a
|
|
@@ -11,7 +11,8 @@ type TooltipExpectations = {
|
|
|
11
11
|
excludes?: string[];
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
-
const importCsvProc =
|
|
14
|
+
const importCsvProc =
|
|
15
|
+
testData.mockSchema.procedures['CYPHER 5']['apoc.import.csv'];
|
|
15
16
|
|
|
16
17
|
function testTooltip(tooltip: Locator, expectations: TooltipExpectations) {
|
|
17
18
|
const includes = expectations.includes ?? [];
|
|
@@ -20,7 +21,7 @@ function testTooltip(tooltip: Locator, expectations: TooltipExpectations) {
|
|
|
20
21
|
const included = Promise.all(
|
|
21
22
|
includes.map((text) => {
|
|
22
23
|
return expect(tooltip).toContainText(text, {
|
|
23
|
-
timeout:
|
|
24
|
+
timeout: 10000,
|
|
24
25
|
});
|
|
25
26
|
}),
|
|
26
27
|
);
|
|
@@ -28,7 +29,7 @@ function testTooltip(tooltip: Locator, expectations: TooltipExpectations) {
|
|
|
28
29
|
const excluded = Promise.all(
|
|
29
30
|
excludes.map((text) => {
|
|
30
31
|
return expect(tooltip).not.toContainText(text, {
|
|
31
|
-
timeout:
|
|
32
|
+
timeout: 10000,
|
|
32
33
|
});
|
|
33
34
|
}),
|
|
34
35
|
);
|
|
@@ -48,7 +49,7 @@ test('Signature help works for functions', async ({ page, mount }) => {
|
|
|
48
49
|
);
|
|
49
50
|
|
|
50
51
|
await expect(page.locator('.cm-signature-help-panel')).toBeVisible({
|
|
51
|
-
timeout:
|
|
52
|
+
timeout: 10000,
|
|
52
53
|
});
|
|
53
54
|
});
|
|
54
55
|
|
|
@@ -64,7 +65,7 @@ test('Signature help works for procedures', async ({ page, mount }) => {
|
|
|
64
65
|
);
|
|
65
66
|
|
|
66
67
|
await expect(page.locator('.cm-signature-help-panel')).toBeVisible({
|
|
67
|
-
timeout:
|
|
68
|
+
timeout: 10000,
|
|
68
69
|
});
|
|
69
70
|
});
|
|
70
71
|
|
|
@@ -86,9 +87,9 @@ test('Signature help shows the description for the first argument', async ({
|
|
|
86
87
|
|
|
87
88
|
await testTooltip(tooltip, {
|
|
88
89
|
includes: [
|
|
89
|
-
testData.mockSchema.procedures['apoc.import.csv']
|
|
90
|
-
.description,
|
|
91
|
-
testData.mockSchema.procedures['apoc.import.csv'].description,
|
|
90
|
+
testData.mockSchema.procedures['CYPHER 5']['apoc.import.csv']
|
|
91
|
+
.argumentDescription[0].description,
|
|
92
|
+
testData.mockSchema.procedures['CYPHER 5']['apoc.import.csv'].description,
|
|
92
93
|
],
|
|
93
94
|
});
|
|
94
95
|
});
|
|
@@ -289,7 +290,7 @@ test('Signature help does not show any help when method finished', async ({
|
|
|
289
290
|
);
|
|
290
291
|
|
|
291
292
|
await expect(page.locator('.cm-signature-help-panel')).not.toBeVisible({
|
|
292
|
-
timeout:
|
|
293
|
+
timeout: 10000,
|
|
293
294
|
});
|
|
294
295
|
});
|
|
295
296
|
|
|
@@ -308,7 +309,7 @@ test('Signature help does not blow up on empty query', async ({
|
|
|
308
309
|
);
|
|
309
310
|
|
|
310
311
|
await expect(page.locator('.cm-signature-help-panel')).not.toBeVisible({
|
|
311
|
-
timeout:
|
|
312
|
+
timeout: 10000,
|
|
312
313
|
});
|
|
313
314
|
});
|
|
314
315
|
|
|
@@ -331,7 +332,7 @@ test('Signature help is shown below the text by default', async ({
|
|
|
331
332
|
await expect(
|
|
332
333
|
page.locator('.cm-signature-help-panel.cm-tooltip-below'),
|
|
333
334
|
).toBeVisible({
|
|
334
|
-
timeout:
|
|
335
|
+
timeout: 10000,
|
|
335
336
|
});
|
|
336
337
|
});
|
|
337
338
|
|
|
@@ -355,7 +356,7 @@ test('Setting showSignatureTooltipBelow to true shows the signature help above t
|
|
|
355
356
|
await expect(
|
|
356
357
|
page.locator('.cm-signature-help-panel.cm-tooltip-below'),
|
|
357
358
|
).toBeVisible({
|
|
358
|
-
timeout:
|
|
359
|
+
timeout: 10000,
|
|
359
360
|
});
|
|
360
361
|
});
|
|
361
362
|
|
|
@@ -379,6 +380,66 @@ test('Setting showSignatureTooltipBelow to false shows the signature help above
|
|
|
379
380
|
await expect(
|
|
380
381
|
page.locator('.cm-signature-help-panel.cm-tooltip-above'),
|
|
381
382
|
).toBeVisible({
|
|
382
|
-
timeout:
|
|
383
|
+
timeout: 10000,
|
|
384
|
+
});
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
test('Signature help depends on the Cypher version', async ({
|
|
388
|
+
page,
|
|
389
|
+
mount,
|
|
390
|
+
}) => {
|
|
391
|
+
const cypher5ArgDescription = 'The Cypher 5 statement to run.';
|
|
392
|
+
const cypher25ArgDescription = 'The Cypher 25 statement to run.';
|
|
393
|
+
|
|
394
|
+
await mount(
|
|
395
|
+
<CypherEditor
|
|
396
|
+
schema={{
|
|
397
|
+
functions: {
|
|
398
|
+
'CYPHER 5': {
|
|
399
|
+
cypher5Function: {
|
|
400
|
+
...testData.emptyFunction,
|
|
401
|
+
argumentDescription: [
|
|
402
|
+
{
|
|
403
|
+
isDeprecated: false,
|
|
404
|
+
description: cypher5ArgDescription,
|
|
405
|
+
name: 'statement',
|
|
406
|
+
type: 'STRING',
|
|
407
|
+
},
|
|
408
|
+
],
|
|
409
|
+
name: 'cypher5Function',
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
'CYPHER 25': {
|
|
413
|
+
cypher25Function: {
|
|
414
|
+
...testData.emptyFunction,
|
|
415
|
+
argumentDescription: [
|
|
416
|
+
{
|
|
417
|
+
isDeprecated: false,
|
|
418
|
+
description: cypher25ArgDescription,
|
|
419
|
+
name: 'statement',
|
|
420
|
+
type: 'STRING',
|
|
421
|
+
},
|
|
422
|
+
],
|
|
423
|
+
name: 'cypher25Function',
|
|
424
|
+
},
|
|
425
|
+
},
|
|
426
|
+
},
|
|
427
|
+
}}
|
|
428
|
+
featureFlags={{ cypher25: true }}
|
|
429
|
+
/>,
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
const textField = page.getByRole('textbox');
|
|
433
|
+
await textField.fill('CYPHER 5 RETURN cypher5Function(');
|
|
434
|
+
const tooltip = page.locator('.cm-signature-help-panel');
|
|
435
|
+
|
|
436
|
+
await testTooltip(tooltip, {
|
|
437
|
+
includes: [cypher5ArgDescription],
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
await textField.fill('CYPHER 25 RETURN cypher25Function(');
|
|
441
|
+
|
|
442
|
+
await testTooltip(tooltip, {
|
|
443
|
+
includes: [cypher25ArgDescription],
|
|
383
444
|
});
|
|
384
445
|
});
|
|
@@ -65,11 +65,11 @@ test('can accept completion inside pattern snippet', async ({
|
|
|
65
65
|
page.locator('.cm-tooltip-autocomplete').getByText('City'),
|
|
66
66
|
).toBeVisible();
|
|
67
67
|
|
|
68
|
-
await textField.press('Tab');
|
|
68
|
+
await textField.press('Tab', { delay: 300 });
|
|
69
69
|
await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
|
|
70
70
|
|
|
71
71
|
// tab out of the snippet
|
|
72
|
-
await textField.press('Tab');
|
|
72
|
+
await textField.press('Tab', { delay: 300 });
|
|
73
73
|
|
|
74
74
|
await expect(textField).toHaveText('MATCH ()-[]->()-[ ]->(:City)');
|
|
75
75
|
});
|
|
@@ -13,7 +13,7 @@ test('Prop lint set to false disables syntax validation', async ({
|
|
|
13
13
|
await mount(<CypherEditor value={query} lint={false} />);
|
|
14
14
|
|
|
15
15
|
await expect(page.locator('.cm-lintRange-error').last()).not.toBeVisible({
|
|
16
|
-
timeout:
|
|
16
|
+
timeout: 10000,
|
|
17
17
|
});
|
|
18
18
|
});
|
|
19
19
|
|
|
@@ -24,7 +24,7 @@ test('Can turn linting back on', async ({ page, mount }) => {
|
|
|
24
24
|
const component = await mount(<CypherEditor value={query} lint={false} />);
|
|
25
25
|
|
|
26
26
|
await expect(page.locator('.cm-lintRange-error').last()).not.toBeVisible({
|
|
27
|
-
timeout:
|
|
27
|
+
timeout: 10000,
|
|
28
28
|
});
|
|
29
29
|
|
|
30
30
|
await component.update(<CypherEditor value={query} lint={true} />);
|
|
@@ -192,7 +192,7 @@ test('Strikethroughs are shown for deprecated functions', async ({
|
|
|
192
192
|
await mount(<CypherEditor value={query} schema={testData.mockSchema} />);
|
|
193
193
|
await expect(
|
|
194
194
|
editorPage.page.locator('.cm-deprecated-element').last(),
|
|
195
|
-
).toBeVisible({ timeout:
|
|
195
|
+
).toBeVisible({ timeout: 10000 });
|
|
196
196
|
await editorPage.checkWarningMessage('id', 'Function id is deprecated.');
|
|
197
197
|
});
|
|
198
198
|
|
|
@@ -206,10 +206,38 @@ test('Strikethroughs are shown for deprecated procedures', async ({
|
|
|
206
206
|
await mount(<CypherEditor value={query} schema={testData.mockSchema} />);
|
|
207
207
|
await expect(
|
|
208
208
|
editorPage.page.locator('.cm-deprecated-element').last(),
|
|
209
|
-
).toBeVisible({ timeout:
|
|
209
|
+
).toBeVisible({ timeout: 10000 });
|
|
210
210
|
|
|
211
211
|
await editorPage.checkWarningMessage(
|
|
212
212
|
'apoc.create.uuids',
|
|
213
213
|
'Procedure apoc.create.uuids is deprecated.',
|
|
214
214
|
);
|
|
215
215
|
});
|
|
216
|
+
|
|
217
|
+
test('Syntax validation depends on the Cypher version', async ({
|
|
218
|
+
page,
|
|
219
|
+
mount,
|
|
220
|
+
}) => {
|
|
221
|
+
await mount(
|
|
222
|
+
<CypherEditor
|
|
223
|
+
schema={testData.mockSchema}
|
|
224
|
+
featureFlags={{ cypher25: true }}
|
|
225
|
+
/>,
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
const editorPage = new CypherEditorPage(page);
|
|
229
|
+
const textField = page.getByRole('textbox');
|
|
230
|
+
await textField.fill('CYPHER 5 CALL apoc.create.uuids(5)');
|
|
231
|
+
|
|
232
|
+
await editorPage.checkWarningMessage(
|
|
233
|
+
'apoc.create.uuids',
|
|
234
|
+
'Procedure apoc.create.uuids is deprecated.',
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
await textField.fill('CYPHER 25 CALL apoc.create.uuids(5)');
|
|
238
|
+
|
|
239
|
+
await editorPage.checkErrorMessage(
|
|
240
|
+
'apoc.create.uuids',
|
|
241
|
+
'Procedure apoc.create.uuids is not present in the database.',
|
|
242
|
+
);
|
|
243
|
+
});
|
|
@@ -8,12 +8,15 @@ import workerpool from 'workerpool';
|
|
|
8
8
|
function lintCypherQuery(
|
|
9
9
|
query: string,
|
|
10
10
|
dbSchema: DbSchema,
|
|
11
|
-
featureFlags: { consoleCommands?: boolean } = {},
|
|
11
|
+
featureFlags: { consoleCommands?: boolean; cypher25?: boolean } = {},
|
|
12
12
|
) {
|
|
13
13
|
// We allow to override the consoleCommands feature flag
|
|
14
14
|
if (featureFlags.consoleCommands !== undefined) {
|
|
15
15
|
_internalFeatureFlags.consoleCommands = featureFlags.consoleCommands;
|
|
16
16
|
}
|
|
17
|
+
if (featureFlags.cypher25 !== undefined) {
|
|
18
|
+
_internalFeatureFlags.cypher25 = featureFlags.cypher25;
|
|
19
|
+
}
|
|
17
20
|
return _lintCypherQuery(query, dbSchema);
|
|
18
21
|
}
|
|
19
22
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { test } from '@playwright/experimental-ct-react';
|
|
3
|
-
import { CypherEditor } from '../CypherEditor';
|
|
4
|
-
import { CypherEditorPage } from './e2eUtils';
|
|
5
|
-
test.use({ viewport: { width: 1000, height: 500 } });
|
|
6
|
-
test.fail('checkNoNotification fails on query with error', async ({ page, mount }) => {
|
|
7
|
-
const editorPage = new CypherEditorPage(page);
|
|
8
|
-
const query = 'METCH (n) RETURN n';
|
|
9
|
-
await mount(_jsx(CypherEditor, { value: query }));
|
|
10
|
-
await editorPage.checkNoNotificationMessage('error');
|
|
11
|
-
});
|
|
12
|
-
//# sourceMappingURL=helpers.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.spec.js","sourceRoot":"","sources":["../../src/e2e_tests/helpers.spec.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mCAAmC,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;AAErD,IAAI,CAAC,IAAI,CACP,+CAA+C,EAC/C,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;IACxB,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,oBAAoB,CAAC;IACnC,MAAM,KAAK,CAAC,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC,CAAC;IAE5C,MAAM,UAAU,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;AACvD,CAAC,CACF,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { test } from '@playwright/experimental-ct-react';
|
|
2
|
-
import { CypherEditor } from '../CypherEditor';
|
|
3
|
-
import { CypherEditorPage } from './e2eUtils';
|
|
4
|
-
|
|
5
|
-
test.use({ viewport: { width: 1000, height: 500 } });
|
|
6
|
-
|
|
7
|
-
test.fail(
|
|
8
|
-
'checkNoNotification fails on query with error',
|
|
9
|
-
async ({ page, mount }) => {
|
|
10
|
-
const editorPage = new CypherEditorPage(page);
|
|
11
|
-
|
|
12
|
-
const query = 'METCH (n) RETURN n';
|
|
13
|
-
await mount(<CypherEditor value={query} />);
|
|
14
|
-
|
|
15
|
-
await editorPage.checkNoNotificationMessage('error');
|
|
16
|
-
},
|
|
17
|
-
);
|