From 30001e5ab0287fcad4211f41822472ca289c5d89 Mon Sep 17 00:00:00 2001 From: Yevhen Vydolob Date: Thu, 18 Mar 2021 11:23:06 +0200 Subject: [PATCH] #413 fix validation for empty file Signed-off-by: Yevhen Vydolob --- .../handlers/validationHandlers.ts | 5 -- .../services/yamlValidation.ts | 7 ++- test/schemaValidation.test.ts | 58 +++++++++++++++++++ 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/languageserver/handlers/validationHandlers.ts b/src/languageserver/handlers/validationHandlers.ts index 43ba36f6..78f1c7d0 100644 --- a/src/languageserver/handlers/validationHandlers.ts +++ b/src/languageserver/handlers/validationHandlers.ts @@ -49,11 +49,6 @@ export class ValidationHandler { return; } - if (textDocument.getText().length === 0) { - this.connection.sendDiagnostics({ uri: textDocument.uri, diagnostics: [] }); - return; - } - return this.languageService .doValidation(textDocument, isKubernetesAssociatedDocument(textDocument, this.yamlSettings.specificValidatorPaths)) .then( diff --git a/src/languageservice/services/yamlValidation.ts b/src/languageservice/services/yamlValidation.ts index 85ec6267..0c1c3557 100644 --- a/src/languageservice/services/yamlValidation.ts +++ b/src/languageservice/services/yamlValidation.ts @@ -57,7 +57,12 @@ export class YAMLValidation { return Promise.resolve([]); } - const yamlDocument: YAMLDocument = parseYAML(textDocument.getText(), this.customTags); + let text = textDocument.getText(); + // if text is contains only whitespace wrap all text in object to force schema selection + if (!/\S/.test(text)) { + text = `{${text}}`; + } + const yamlDocument: YAMLDocument = parseYAML(text, this.customTags); const validationResult = []; let index = 0; diff --git a/test/schemaValidation.test.ts b/test/schemaValidation.test.ts index a111107c..895c6791 100644 --- a/test/schemaValidation.test.ts +++ b/test/schemaValidation.test.ts @@ -15,6 +15,7 @@ import { BlockMappingEntryError, DuplicateKeyError, propertyIsNotAllowed, + MissingRequiredPropWarning, } from './utils/errorMessages'; import * as assert from 'assert'; import * as path from 'path'; @@ -1198,4 +1199,61 @@ describe('Validation Tests', () => { ]); }); }); + + describe('Empty document validation', () => { + it('should provide validation for empty document', async () => { + languageService.addSchema(SCHEMA_ID, { + type: 'object', + properties: { + scripts: { + type: 'string', + }, + }, + required: ['scripts'], + }); + const content = ''; + const result = await parseSetup(content); + assert.strictEqual(result.length, 1); + assert.deepStrictEqual( + result[0], + createDiagnosticWithData( + MissingRequiredPropWarning.replace('{0}', 'scripts'), + 0, + 0, + 0, + 0, + DiagnosticSeverity.Error, + `yaml-schema: file:///${SCHEMA_ID}`, + `file:///${SCHEMA_ID}` + ) + ); + }); + + it('should provide validation for document which contains only whitespaces', async () => { + languageService.addSchema(SCHEMA_ID, { + type: 'object', + properties: { + scripts: { + type: 'string', + }, + }, + required: ['scripts'], + }); + const content = ' \n \n'; + const result = await parseSetup(content); + assert.deepStrictEqual( + result[0], + createDiagnosticWithData( + MissingRequiredPropWarning.replace('{0}', 'scripts'), + 0, + 0, + 0, + 1, + DiagnosticSeverity.Error, + `yaml-schema: file:///${SCHEMA_ID}`, + `file:///${SCHEMA_ID}` + ) + ); + }); + }); });