From 0932e84b7f90a9552c2a2c152fac01065aeb6612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julia=20Kr=C3=BCger?= Date: Thu, 15 Mar 2018 12:43:53 +0100 Subject: [PATCH] feat(validate-greenkeeper-json): validation with joi --- lib/validate-greenkeeper-json.js | 19 ++---- test/lib/validate-greenkeeper-json.js | 86 +++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 13 deletions(-) diff --git a/lib/validate-greenkeeper-json.js b/lib/validate-greenkeeper-json.js index da77f218..520e611b 100644 --- a/lib/validate-greenkeeper-json.js +++ b/lib/validate-greenkeeper-json.js @@ -3,24 +3,17 @@ const Joi = require('joi') // a package path is either the term 'package.json' or // a releative path that ends in package.json // alternitive regex: ^([^/]|p).*ackage\.json$ -// const packagePathSchema = Joi.string().regex(/^(\w+\/[\w/]*)?package\.json$/) -// -// const packagesSchema = Joi.object().keys({ -// packages: Joi.array().items( -// Joi.string().regex(/^(\w+\/[\w/]*)?package\.json$/) -// ) -// }) +const packagePathSchema = Joi.string().regex(/^(\w+\/[\w/]*)?package\.json$/) const schema = Joi.object().keys({ - groups: Joi.object().pattern(/[a-zA-Z0-9_]+/, + groups: Joi.object().pattern(/^[a-zA-Z0-9_]+$/, Joi.object().keys({ - packages: Joi.array().items( - Joi.string().regex(/^(\w+\/[\w/]*)?package\.json$/) - ) - }) + packages: Joi.array().items(packagePathSchema).required(), + ignore: Joi.array() + }).optionalKeys(['ignore']) ).required(), ignore: Joi.array() -}) +}).optionalKeys(['ignore']) function validate (file) { return Joi.validate(file, schema) diff --git a/test/lib/validate-greenkeeper-json.js b/test/lib/validate-greenkeeper-json.js index 91e086ca..59aed237 100644 --- a/test/lib/validate-greenkeeper-json.js +++ b/test/lib/validate-greenkeeper-json.js @@ -20,6 +20,90 @@ test('valid', () => { expect(result.error).toBeFalsy() }) +test('valid with subgroup level ignore', () => { + const file = { + groups: { + frontend: { + ignore: [ + 'lodash' + ], + packages: [ + 'packages/frontend/package.json', + 'packages/lalalalala/package.json' + ] + }, + backend: { + packages: [ + 'packages/backend/package.json' + ] + } + } + } + const result = validate(file) + expect(result.error).toBeFalsy() +}) + +test('invalid: groupname has invalid characters', () => { + const file = { + groups: { + 'front-end': { + ignore: [ + 'lodash' + ], + packages: [ + 'packages/frontend/package.json', + 'packages/lalalalala/package.json' + ] + }, + backend: { + packages: [ + 'packages/backend/package.json' + ] + } + } + } + const result = validate(file) + expect(result.error).toBeTruthy() + expect(result.error.details[0].message).toMatch(/"front-end" is not allowed/) +}) + +test('invalid: absolute paths are not allowed', () => { + const file = { + groups: { + frontend: { + packages: [ + '/packages/frontend/package.json' + ] + } + } + } + const result = validate(file) + expect(result.error).toBeTruthy() + expect(result.error.name).toEqual('ValidationError') + expect(result.error.details[0].path).toEqual([ 'groups', 'frontend', 'packages', 0 ]) + expect(result.error.details[0].context.value).toEqual('/packages/frontend/package.json') + expect(result.error.details[0].message).toMatch(/fails to match the required pattern/) +}) + +test('invalid: path is not ending on `package.json`', () => { + const file = { + groups: { + frontend: { + packages: [ + 'packages/frontend/package.json', + 'packages/frontend/' + ] + } + } + } + const result = validate(file) + expect(result.error).toBeTruthy() + expect(result.error.name).toEqual('ValidationError') + expect(result.error.details[0].path).toEqual([ 'groups', 'frontend', 'packages', 1 ]) + expect(result.error.details[0].context.value).toEqual('packages/frontend/') + expect(result.error.details[0].message).toMatch(/fails to match the required pattern/) +}) + test('invalid: no group/s', () => { const file = { frontend: { @@ -58,4 +142,6 @@ test('invalid: no packages', () => { } const result = validate(file) expect(result.error).toBeTruthy() + expect(result.error.name).toEqual('ValidationError') + expect(result.error.details[0].message).toMatch(/"packages" is required/) })