chore(curriculum, tools): improve external curricula data validation (#59541)

This commit is contained in:
Huyen Nguyen
2025-04-10 22:05:07 +07:00
committed by GitHub
parent 67f8c2868a
commit 9d2701b1ab
3 changed files with 42 additions and 10 deletions
+5 -1
View File
@@ -28,7 +28,11 @@ const schema = Joi.object()
'review', 'review',
'quiz', 'quiz',
'exam' 'exam'
), ).when('superBlock', {
is: 'full-stack-developer',
then: Joi.required(),
otherwise: Joi.optional()
}),
isUpcomingChange: Joi.boolean().required(), isUpcomingChange: Joi.boolean().required(),
dashedName: Joi.string().regex(slugRE).required(), dashedName: Joi.string().regex(slugRE).required(),
superBlock: Joi.string() superBlock: Joi.string()
@@ -88,4 +88,16 @@ ${result.error.message}`);
publicSuperBlockNames.length 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);
});
}); });
+25 -9
View File
@@ -3,11 +3,11 @@ const Joi = require('joi');
const blockSchema = Joi.object({}).keys({ const blockSchema = Joi.object({}).keys({
desc: Joi.array().min(1), desc: Joi.array().min(1),
challenges: Joi.object({}).keys({ challenges: Joi.object({}).keys({
name: Joi.string(), name: Joi.string().required(),
isUpcomingChange: Joi.bool(), isUpcomingChange: Joi.bool().required(),
usesMultifileEditor: Joi.bool().optional(), usesMultifileEditor: Joi.bool().optional(),
hasEditableBoundaries: Joi.bool().optional(), hasEditableBoundaries: Joi.bool().optional(),
dashedName: Joi.string(), dashedName: Joi.string().required(),
helpCategory: Joi.valid( helpCategory: Joi.valid(
'JavaScript', 'JavaScript',
'HTML-CSS', 'HTML-CSS',
@@ -18,13 +18,25 @@ const blockSchema = Joi.object({}).keys({
'Odin', 'Odin',
'Euler', 'Euler',
'Rosetta' 'Rosetta'
), ).required(),
order: Joi.number(), order: Joi.number().when('superBlock', {
time: Joi.string().allow(''), is: 'full-stack-developer',
then: Joi.forbidden(),
otherwise: Joi.required()
}),
template: Joi.string().allow(''), template: Joi.string().allow(''),
required: Joi.array(), required: Joi.array(),
superBlock: Joi.string(), superBlock: Joi.string().required(),
blockLayout: Joi.string(), blockLayout: Joi.valid(
'challenge-list',
'challenge-grid',
'dialogue-grid',
'link',
'project-list',
'legacy-challenge-list',
'legacy-link',
'legacy-challenge-grid'
).required(),
blockType: Joi.valid( blockType: Joi.valid(
'lecture', 'lecture',
'workshop', 'workshop',
@@ -32,7 +44,11 @@ const blockSchema = Joi.object({}).keys({
'review', 'review',
'quiz', 'quiz',
'exam' 'exam'
), ).when('superBlock', {
is: 'full-stack-developer',
then: Joi.required(),
otherwise: Joi.optional()
}),
challengeOrder: Joi.array().items( challengeOrder: Joi.array().items(
Joi.object({}).keys({ Joi.object({}).keys({
id: Joi.string(), id: Joi.string(),