monaco-yaml/test/schemaValidation.test.ts
2018-12-21 17:33:07 +08:00

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);
});
});
});
});