diff --git a/curriculum/schema/meta-schema.js b/curriculum/schema/meta-schema.js index 5b960a47c40..a1bcb63bd58 100644 --- a/curriculum/schema/meta-schema.js +++ b/curriculum/schema/meta-schema.js @@ -28,7 +28,11 @@ const schema = Joi.object() 'review', 'quiz', 'exam' - ), + ).when('superBlock', { + is: 'full-stack-developer', + then: Joi.required(), + otherwise: Joi.optional() + }), isUpcomingChange: Joi.boolean().required(), dashedName: Joi.string().regex(slugRE).required(), superBlock: Joi.string() diff --git a/tools/scripts/build/build-external-curricula-data.test.ts b/tools/scripts/build/build-external-curricula-data.test.ts index bb7caae2f53..2a4d15401c7 100644 --- a/tools/scripts/build/build-external-curricula-data.test.ts +++ b/tools/scripts/build/build-external-curricula-data.test.ts @@ -88,4 +88,16 @@ ${result.error.message}`); publicSuperBlockNames.length ); }); + + test('challenge files should be created and in the correct directory', () => { + expect( + fs.existsSync(`${clientStaticPath}/curriculum-data/${VERSION}/challenges`) + ).toBe(true); + + expect( + fs.readdirSync( + `${clientStaticPath}/curriculum-data/${VERSION}/challenges` + ).length + ).toBeGreaterThan(0); + }); }); diff --git a/tools/scripts/build/external-data-schema.js b/tools/scripts/build/external-data-schema.js index ecf9b279bc7..deb0417d9c5 100644 --- a/tools/scripts/build/external-data-schema.js +++ b/tools/scripts/build/external-data-schema.js @@ -3,11 +3,11 @@ const Joi = require('joi'); const blockSchema = Joi.object({}).keys({ desc: Joi.array().min(1), challenges: Joi.object({}).keys({ - name: Joi.string(), - isUpcomingChange: Joi.bool(), + name: Joi.string().required(), + isUpcomingChange: Joi.bool().required(), usesMultifileEditor: Joi.bool().optional(), hasEditableBoundaries: Joi.bool().optional(), - dashedName: Joi.string(), + dashedName: Joi.string().required(), helpCategory: Joi.valid( 'JavaScript', 'HTML-CSS', @@ -18,13 +18,25 @@ const blockSchema = Joi.object({}).keys({ 'Odin', 'Euler', 'Rosetta' - ), - order: Joi.number(), - time: Joi.string().allow(''), + ).required(), + order: Joi.number().when('superBlock', { + is: 'full-stack-developer', + then: Joi.forbidden(), + otherwise: Joi.required() + }), template: Joi.string().allow(''), required: Joi.array(), - superBlock: Joi.string(), - blockLayout: Joi.string(), + superBlock: Joi.string().required(), + blockLayout: Joi.valid( + 'challenge-list', + 'challenge-grid', + 'dialogue-grid', + 'link', + 'project-list', + 'legacy-challenge-list', + 'legacy-link', + 'legacy-challenge-grid' + ).required(), blockType: Joi.valid( 'lecture', 'workshop', @@ -32,7 +44,11 @@ const blockSchema = Joi.object({}).keys({ 'review', 'quiz', 'exam' - ), + ).when('superBlock', { + is: 'full-stack-developer', + then: Joi.required(), + otherwise: Joi.optional() + }), challengeOrder: Joi.array().items( Joi.object({}).keys({ id: Joi.string(),