@neo4j-cypher/language-support
Version:
Cypher language support
248 lines (225 loc) • 6.47 kB
text/typescript
import { CompletionItemKind } from 'vscode-languageserver-types';
import { DbSchema } from '../../dbSchema';
import { testData } from '../testData';
import { testCompletions } from './completionAssertionHelpers';
describe('Procedures auto-completion', () => {
const dbSchema: DbSchema = {
procedures: {
'tx.getMetaData': { ...testData.emptyProcedure, name: 'tx.getMetaData' },
'jwt.security.requestAccess': {
...testData.emptyProcedure,
name: 'jwt.security.requestAccess',
},
'db.index.fulltext.awaitEventuallyConsistentIndexRefresh': {
...testData.emptyProcedure,
name: 'db.index.fulltext.awaitEventuallyConsistentIndexRefresh',
},
'db.ping': { ...testData.emptyProcedure, name: 'db.ping' },
'db.stats.retrieve': {
...testData.emptyProcedure,
name: 'db.stats.retrieve',
},
'db.stats.collect': {
...testData.emptyProcedure,
name: 'db.stats.collect',
},
'db.stats.clear': { ...testData.emptyProcedure, name: 'db.stats.clear' },
},
};
test('Correctly completes CALL in standalone', () => {
const query = 'C';
testCompletions({
query,
expected: [{ label: 'CALL', kind: CompletionItemKind.Keyword }],
});
});
test('Correctly completes CALL in subquery', () => {
const query = 'MATCH (n) C';
testCompletions({
query,
expected: [{ label: 'CALL', kind: CompletionItemKind.Keyword }],
});
});
test('Correctly completes YIELD', () => {
const query = 'CALL proc() Y';
testCompletions({
query,
expected: [{ label: 'YIELD', kind: CompletionItemKind.Keyword }],
});
});
test('Correctly completes procedure name in CALL', () => {
const query = 'CALL db';
testCompletions({
query,
dbSchema,
expected: [
{
label: 'tx.getMetaData',
kind: CompletionItemKind.Method,
detail: '(procedure)',
},
{
label: 'jwt.security.requestAccess',
kind: CompletionItemKind.Method,
detail: '(procedure)',
},
],
});
});
test('Correctly limits procedure completions by one namespace', () => {
const query = 'CALL db.';
testCompletions({
query,
dbSchema,
expected: [
{
label: 'stats',
kind: CompletionItemKind.Method,
detail: '(namespace)',
},
{
label: 'ping',
kind: CompletionItemKind.Method,
detail: '(procedure)',
},
],
excluded: [
{ label: 'jwt.security.requestAccess' },
{ label: 'jwt' },
{ label: 'security' },
],
});
});
test('Correctly limits procedure completions by double namespace', () => {
const query = 'CALL db.stats.';
testCompletions({
query,
dbSchema,
expected: [
{
label: 'retrieve',
kind: CompletionItemKind.Method,
detail: '(procedure)',
},
{
label: 'collect',
kind: CompletionItemKind.Method,
detail: '(procedure)',
},
{
label: 'clear',
kind: CompletionItemKind.Method,
detail: '(procedure)',
},
],
excluded: [
{ label: 'tx.getMetaData' },
{ label: 'getMetaData' },
{ label: 'jwt.security.requestAccess' },
{ label: 'jwt' },
{ label: 'security' },
{ label: 'requestAccess' },
{ label: 'db.index.fulltext.awaitEventuallyConsistentIndexRefresh' },
{ label: 'index' },
{ label: 'db.index' },
{ label: 'db.ping' },
{ label: 'db.stats.retrieve' },
{ label: 'db.stats.collect' },
{ label: 'db.stats.clear' },
],
});
});
test('Correctly completes multiline procedure completion', () => {
const query = `CALL db
.stats
.`;
testCompletions({
query,
dbSchema,
expected: [
{
label: 'retrieve',
kind: CompletionItemKind.Method,
detail: '(procedure)',
},
{
label: 'collect',
kind: CompletionItemKind.Method,
detail: '(procedure)',
},
{
label: 'clear',
kind: CompletionItemKind.Method,
detail: '(procedure)',
},
],
excluded: [
{ label: 'tx.getMetaData' },
{ label: 'getMetaData' },
{ label: 'jwt.security.requestAccess' },
{ label: 'jwt' },
{ label: 'security' },
{ label: 'requestAccess' },
{ label: 'db.index.fulltext.awaitEventuallyConsistentIndexRefresh' },
{ label: 'index' },
{ label: 'db.index' },
{ label: 'db.ping' },
{ label: 'db.stats.retrieve' },
{ label: 'db.stats.collect' },
{ label: 'db.stats.clear' },
],
});
});
test('Correctly filters out all procedures when namespace is incorrect', () => {
const query = 'CALL badnamespace.';
testCompletions({
query,
dbSchema,
excluded: [{ kind: CompletionItemKind.Method }],
});
});
test('Correctly filters out all procedures when procedure name is treated as namespace', () => {
const query = 'CALL db.ping.';
testCompletions({
query,
dbSchema,
excluded: [{ kind: CompletionItemKind.Method }],
});
});
test('Does not suggest procedures when only valid character is dot', () => {
const query = 'CALL apoc ';
testCompletions({
query,
dbSchema,
excluded: [{ kind: CompletionItemKind.Method }],
});
});
test('Does not suggest procedures when only valid character is dot - namespaced edition', () => {
const query = 'CALL apoc . coll ';
testCompletions({
query,
dbSchema,
excluded: [{ kind: CompletionItemKind.Method }],
});
});
test('Allows space after dot in procedure', () => {
const query = 'CALL db . ';
testCompletions({
query,
dbSchema,
expected: [
{
label: 'ping',
kind: CompletionItemKind.Method,
detail: '(procedure)',
},
{
label: 'stats',
kind: CompletionItemKind.Method,
detail: '(namespace)',
},
],
excluded: [{ label: 'db' }, { label: 'db.ping' }],
});
});
});