diff options
Diffstat (limited to 'spec/frontend/editor/source_editor_ci_schema_ext_spec.js')
-rw-r--r-- | spec/frontend/editor/source_editor_ci_schema_ext_spec.js | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/spec/frontend/editor/source_editor_ci_schema_ext_spec.js b/spec/frontend/editor/source_editor_ci_schema_ext_spec.js new file mode 100644 index 00000000000..07ac080fe08 --- /dev/null +++ b/spec/frontend/editor/source_editor_ci_schema_ext_spec.js @@ -0,0 +1,108 @@ +import { languages } from 'monaco-editor'; +import { TEST_HOST } from 'helpers/test_constants'; +import { EXTENSION_CI_SCHEMA_FILE_NAME_MATCH } from '~/editor/constants'; +import { CiSchemaExtension } from '~/editor/extensions/source_editor_ci_schema_ext'; +import SourceEditor from '~/editor/source_editor'; + +const mockRef = 'AABBCCDD'; + +describe('~/editor/editor_ci_config_ext', () => { + const defaultBlobPath = '.gitlab-ci.yml'; + + let editor; + let instance; + let editorEl; + let originalGitlabUrl; + + const createMockEditor = ({ blobPath = defaultBlobPath } = {}) => { + setFixtures('<div id="editor"></div>'); + editorEl = document.getElementById('editor'); + editor = new SourceEditor(); + instance = editor.createInstance({ + el: editorEl, + blobPath, + blobContent: '', + }); + instance.use(new CiSchemaExtension()); + }; + + beforeAll(() => { + originalGitlabUrl = gon.gitlab_url; + gon.gitlab_url = TEST_HOST; + }); + + afterAll(() => { + gon.gitlab_url = originalGitlabUrl; + }); + + beforeEach(() => { + createMockEditor(); + }); + + afterEach(() => { + instance.dispose(); + editorEl.remove(); + }); + + describe('registerCiSchema', () => { + beforeEach(() => { + jest.spyOn(languages.yaml.yamlDefaults, 'setDiagnosticsOptions'); + }); + + describe('register validations options with monaco for yaml language', () => { + const mockProjectNamespace = 'namespace1'; + const mockProjectPath = 'project1'; + + const getConfiguredYmlSchema = () => { + return languages.yaml.yamlDefaults.setDiagnosticsOptions.mock.calls[0][0].schemas[0]; + }; + + it('with expected basic validation configuration', () => { + instance.registerCiSchema({ + projectNamespace: mockProjectNamespace, + projectPath: mockProjectPath, + }); + + const expectedOptions = { + validate: true, + enableSchemaRequest: true, + hover: true, + completion: true, + }; + + expect(languages.yaml.yamlDefaults.setDiagnosticsOptions).toHaveBeenCalledTimes(1); + expect(languages.yaml.yamlDefaults.setDiagnosticsOptions).toHaveBeenCalledWith( + expect.objectContaining(expectedOptions), + ); + }); + + it('with an schema uri that contains project and ref', () => { + instance.registerCiSchema({ + projectNamespace: mockProjectNamespace, + projectPath: mockProjectPath, + ref: mockRef, + }); + + expect(getConfiguredYmlSchema()).toEqual({ + uri: `${TEST_HOST}/${mockProjectNamespace}/${mockProjectPath}/-/schema/${mockRef}/${EXTENSION_CI_SCHEMA_FILE_NAME_MATCH}`, + fileMatch: [defaultBlobPath], + }); + }); + + it('with an alternative file name match', () => { + createMockEditor({ blobPath: 'dir1/dir2/another-ci-filename.yml' }); + + instance.registerCiSchema({ + projectNamespace: mockProjectNamespace, + projectPath: mockProjectPath, + ref: mockRef, + }); + + expect(getConfiguredYmlSchema()).toEqual({ + uri: `${TEST_HOST}/${mockProjectNamespace}/${mockProjectPath}/-/schema/${mockRef}/${EXTENSION_CI_SCHEMA_FILE_NAME_MATCH}`, + fileMatch: ['another-ci-filename.yml'], + }); + }); + }); + }); +}); |