@shopify/theme-language-server-common
Version:
<h1 align="center" style="position: relative;" > <br> <img src="https://github.com/Shopify/theme-check-vscode/blob/main/images/shopify_glyph.png?raw=true" alt="logo" width="141" height="160"> <br> Theme Language Server </h1>
164 lines (153 loc) • 4.88 kB
text/typescript
import { describe, it, expect, assert, beforeEach } from 'vitest';
import { JSONLanguageService } from '../../JSONLanguageService';
import { DocumentManager } from '../../../documents';
import {
getRequestParams,
isCompletionList,
mockJSONLanguageService,
} from '../../test/test-helpers';
describe('Unit: BlockSettingsPropertyCompletionProvider', () => {
const rootUri = 'file:///root/';
let jsonLanguageService: JSONLanguageService;
let documentManager: DocumentManager;
beforeEach(async () => {
documentManager = new DocumentManager(
undefined, // don't need a fs
undefined, // don't need a connection
undefined, // don't need client capabilities
async () => 'theme', // 'theme' mode
async () => false, // schema is invalid for tests
);
jsonLanguageService = mockJSONLanguageService(
rootUri,
documentManager,
async (_uri: string) => ({
general: {
fake: 'Fake Setting',
},
}),
);
await jsonLanguageService.setup({
textDocument: {
completion: {
contextSupport: true,
completionItem: {
snippetSupport: true,
commitCharactersSupport: true,
documentationFormat: ['markdown'],
deprecatedSupport: true,
preselectSupport: true,
},
},
},
});
});
describe('section file with valid schema', () => {
const tests = [
{
label: 'presets',
schemaTemplate: (referencedBlock: object) => {
return {
presets: [
{
blocks: [referencedBlock],
},
],
};
},
},
{
label: 'default',
schemaTemplate: (referencedBlock: object) => {
return {
default: {
blocks: [referencedBlock],
},
};
},
},
];
for (const test of tests) {
describe(`${test.label} block settings`, () => {
beforeEach(() => {
const testBlockSchema = {
settings: [
{ id: 'custom-setting', label: 'Custom Setting' },
{ id: 'fake-setting', label: 't:general.fake' },
{ id: 'no-label' },
{ nope: 'no-id' },
],
};
documentManager.open(`${rootUri}/blocks/test-block.liquid`, toSource(testBlockSchema), 1);
documentManager.open(`${rootUri}/blocks/no-settings-block.liquid`, toSource({}), 1);
});
it(`completes ${test.label} block settings property when settings exist`, async () => {
const schema = {
...test.schemaTemplate({
type: 'test-block',
settings: {
'█': '',
},
}),
};
const params = getRequestParams(
documentManager,
'sections/section.liquid',
toSource(schema),
);
const completions = await jsonLanguageService.completions(params);
assert(isCompletionList(completions));
expect(completions.items).to.have.lengthOf(3);
expect(completions.items).toContainEqual(
expect.objectContaining({
insertText: `"custom-setting"`,
documentation: expect.objectContaining({
value: 'Custom Setting',
}),
}),
);
expect(completions.items).toContainEqual(
expect.objectContaining({
insertText: `"fake-setting"`,
documentation: expect.objectContaining({
value: 'Fake Setting',
}),
}),
);
expect(completions.items).toContainEqual(
expect.objectContaining({
insertText: `"no-label"`,
documentation: expect.objectContaining({
value: '',
}),
}),
);
});
it(`offers no suggestions for ${test.label} block settings property when there are no settings`, async () => {
const schema = {
...test.schemaTemplate({
type: 'no-settings-block',
settings: {
'█': '',
},
}),
};
const source = `
{% schema %}
${JSON.stringify(schema)}
{% endschema %}
`;
const params = getRequestParams(documentManager, 'sections/section.liquid', source);
const completions = await jsonLanguageService.completions(params);
assert(isCompletionList(completions));
expect(completions.items).to.have.lengthOf(0);
});
});
}
});
});
function toSource(schema: object) {
return `{% schema %}
${JSON.stringify(schema)}
{% endschema %}`;
}