mirror of
https://github.com/danbulant/monaco-yaml
synced 2026-05-24 20:31:58 +00:00
374 lines
12 KiB
TypeScript
374 lines
12 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Red Hat. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
import { TextDocument } from 'vscode-languageserver';
|
|
import { parse as parseYAML } from '../src/languageservice/parser/yamlParser';
|
|
import { getLanguageService } from '../src/languageservice/yamlLanguageService';
|
|
import { schemaRequestService, workspaceContext } from './testHelper';
|
|
const assert = require('assert');
|
|
|
|
const languageService = getLanguageService(
|
|
schemaRequestService,
|
|
workspaceContext,
|
|
[]
|
|
);
|
|
|
|
const uri = 'http://json.schemastore.org/bowerrc';
|
|
const languageSettings = {
|
|
schemas: [],
|
|
validate: true,
|
|
customTags: [],
|
|
};
|
|
const fileMatch = ['*.yml', '*.yaml'];
|
|
languageSettings.schemas.push({ uri, fileMatch });
|
|
languageSettings.customTags.push('!Test');
|
|
languageSettings.customTags.push('!Ref sequence');
|
|
languageService.configure(languageSettings);
|
|
|
|
describe('Validation Tests', () => {
|
|
// Tests for validator
|
|
describe('Validation', function() {
|
|
function setup(content: string) {
|
|
return TextDocument.create(
|
|
'file://~/Desktop/vscode-k8s/test.yaml',
|
|
'yaml',
|
|
0,
|
|
content
|
|
);
|
|
}
|
|
|
|
function parseSetup(content: string) {
|
|
const testTextDocument = setup(content);
|
|
const yDoc = parseYAML(
|
|
testTextDocument.getText(),
|
|
languageSettings.customTags
|
|
);
|
|
return languageService.doValidation(testTextDocument, yDoc);
|
|
}
|
|
|
|
// Validating basic nodes
|
|
describe('Test that validation does not throw errors', function() {
|
|
it('Basic test', done => {
|
|
const content = `analytics: true`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Test that boolean value in quotations is not interpreted as boolean i.e. it errors', done => {
|
|
const content = `analytics: "no"`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
assert.notEqual(result.length, 0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Test that boolean value without quotations is valid', done => {
|
|
const content = `analytics: no`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Test that boolean is valid when inside strings', done => {
|
|
const content = `cwd: "no"`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Test that boolean is invalid when no strings present and schema wants string', done => {
|
|
const content = `cwd: no`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
assert.notEqual(result.length, 0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Basic test', done => {
|
|
const content = `analytics: true`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Basic test on nodes with children', done => {
|
|
const content = `scripts:\n preinstall: test1\n postinstall: test2`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Advanced test on nodes with children', done => {
|
|
const content = `analytics: true\ncwd: this\nscripts:\n preinstall: test1\n postinstall: test2`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Type string validates under children', done => {
|
|
const content = `registry:\n register: http://test_url.com`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Include with value should not error', done => {
|
|
const content = `customize: !include customize.yaml`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Null scalar value should be treated as null', done => {
|
|
const content = `cwd: Null`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(1);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Anchor should not not error', done => {
|
|
const content = `default: &DEFAULT\n name: Anchor\nanchor_test:\n <<: *DEFAULT`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Anchor with multiple references should not not error', done => {
|
|
const content = `default: &DEFAULT\n name: Anchor\nanchor_test:\n <<: *DEFAULT\nanchor_test2:\n <<: *DEFAULT`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Multiple Anchor in array of references should not not error', done => {
|
|
const content = `default: &DEFAULT\n name: Anchor\ncustomname: &CUSTOMNAME\n custom_name: Anchor\nanchor_test:\n <<: [*DEFAULT, *CUSTOMNAME]`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Multiple Anchors being referenced in same level at same time', done => {
|
|
const content = `
|
|
default: &DEFAULT
|
|
name: Anchor
|
|
customname: &CUSTOMNAME
|
|
custom_name: Anchor
|
|
anchor_test:
|
|
<<: *DEFAULT
|
|
<<: *CUSTOMNAME
|
|
`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Custom Tags without type', done => {
|
|
const content = `analytics: !Test false`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Custom Tags with type', done => {
|
|
const content = `resolvers: !Ref\n - test`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
describe('Type tests', function() {
|
|
it('Type String does not error on valid node', done => {
|
|
const content = `cwd: this`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Type Boolean does not error on valid node', done => {
|
|
const content = `analytics: true`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Type Number does not error on valid node', done => {
|
|
const content = `timeout: 60000`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Type Object does not error on valid node', done => {
|
|
const content = `registry:\n search: http://test_url.com`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Type Array does not error on valid node', done => {
|
|
const content = `resolvers:\n - test\n - test\n - test`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Do not error when there are multiple types in schema and theyre valid', done => {
|
|
const content = `license: MIT`;
|
|
const validator = parseSetup(content);
|
|
validator.then(function(result) {
|
|
expect(result.length).toEqual(0);
|
|
});
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('Test that validation DOES throw errors', function() {
|
|
it('Error when theres a finished untyped item', done => {
|
|
const content = `cwd: hello\nan`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
assert.notEqual(result.length, 0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Error when theres no value for a node', done => {
|
|
const content = `cwd:`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
assert.notEqual(result.length, 0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Error on incorrect value type (number)', done => {
|
|
const content = `cwd: 100000`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
assert.notEqual(result.length, 0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Error on incorrect value type (boolean)', done => {
|
|
const content = `cwd: False`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
assert.notEqual(result.length, 0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Error on incorrect value type (string)', done => {
|
|
const content = `analytics: hello`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
assert.notEqual(result.length, 0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Error on incorrect value type (object)', done => {
|
|
const content = `scripts: test`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
assert.notEqual(result.length, 0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Error on incorrect value type (array)', done => {
|
|
const content = `resolvers: test`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
assert.notEqual(result.length, 0);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
|
|
it('Include without value should error', done => {
|
|
const content = `customize: !include`;
|
|
const validator = parseSetup(content);
|
|
validator
|
|
.then(function(result) {
|
|
expect(result.length).toEqual(1);
|
|
})
|
|
.then(done, done);
|
|
});
|
|
});
|
|
});
|
|
});
|