Skip to content

Commit

Permalink
feat(api): add tabletSupport in module details
Browse files Browse the repository at this point in the history
  • Loading branch information
yannbertrand committed Aug 19, 2024
1 parent 544e2ef commit 841aa13
Show file tree
Hide file tree
Showing 20 changed files with 96 additions and 12 deletions.
4 changes: 3 additions & 1 deletion api/src/devcomp/domain/models/module/Details.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { assertNotNullOrUndefined } from '../../../../shared/domain/models/asserts.js';

class Details {
constructor({ image, description, duration, level, objectives }) {
constructor({ image, description, duration, level, tabletSupport, objectives }) {
assertNotNullOrUndefined(image, 'The image is required for module details');
assertNotNullOrUndefined(description, 'The description is required for module details');
assertNotNullOrUndefined(duration, 'The duration is required for module details');
assertNotNullOrUndefined(level, 'The level is required for module details');
assertNotNullOrUndefined(tabletSupport, 'The tabletSupport is required for module details');
assertNotNullOrUndefined(objectives, 'The objectives are required for module details');
this.#assertObjectivesIsAnArray(objectives);
this.#assertObjectivesHasMinimumLength(objectives);
Expand All @@ -14,6 +15,7 @@ class Details {
this.description = description;
this.duration = duration;
this.level = level;
this.tabletSupport = tabletSupport;
this.objectives = objectives;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"description": "Découvrez dans ce module ce qu'est une adresse IP publique et les informations et les traces numériques qu'elle porte.",
"duration": 10,
"level": "Intermédiaire",
"tabletSupport": "comfortable",
"objectives": [
"Connaître les traces numériques portées par l'adresse IP publique",
"Localiser une adresse IP publique",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"description": "Bien écrire son adresse mail est important. Dans ce module, vous allez apprendre à écrire correctement une adresse e-mail pour mieux communiquer et éviter les erreurs courantes.",
"duration": 12,
"level": "Débutant",
"tabletSupport": "comfortable",
"objectives": [
"Connaître les différentes parties d’une adresse mail et les identifier sur des exemples",
"Comprendre les fonctions de chaque partie d’une adresse mail",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"description": "Les Large Language Model (LLM) sont des systèmes d'intelligence artificielle générative. Ils donnent l'impression de parler toutes les langues mais, du fait de leurs biais, leurs productions sont parfois stéréotypées ou discriminantes. Dans ce module, vous allez découvrir les origines de ces biais et interroger directement des LLM pour les repérer !",
"duration": 10,
"level": "Avancé",
"tabletSupport": "inconvenient",
"objectives": [
"Connaître les origines des biais des LLM",
"Générer et analyser des résultats biaisés de LLM",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"description": "Découvrez avec ce didacticiel comment fonctionne Modulix !",
"duration": 5,
"level": "Débutant",
"tabletSupport": "inconvenient",
"objectives": ["Naviguer dans Modulix", "Découvrir les leçons et les activités"]
},
"transitionTexts": [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"description": "Sur internet, de nombreuses informations circulent. Certaines sont vraies, d'autres sont fausses. Dans ce module, vous allez découvrir une méthode pour analyser l'information et aiguiser votre esprit critique !",
"duration": 15,
"level": "Intermédiaire",
"tabletSupport": "comfortable",
"objectives": [
"Connaître une méthode de vérification d'informations",
"Repérer une fausse information sur internet",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"description": "Aujourd'hui, on utilise des mots de passe pour tout : son téléphone, son adresse mail, ses réseaux sociaux. Dans ce module, vous allez découvrir pourquoi et comment créer des mots de passe solides.",
"duration": 12,
"level": "Débutant",
"tabletSupport": "comfortable",
"objectives": [
"Comprendre l'intérêt d'avoir des mots de passe solides",
"Connaître les principaux risques liés aux mots de passe",
Expand Down Expand Up @@ -69,9 +70,7 @@
"placeholder": "",
"ariaLabel": "Mot de passe",
"defaultValue": "",
"tolerances": [
"t1"
],
"tolerances": ["t1"],
"solutions": [
"123456",
"123456789",
Expand Down Expand Up @@ -168,9 +167,7 @@
"placeholder": "",
"ariaLabel": "Mot de passe d'Austin",
"defaultValue": "",
"tolerances": [
"t1"
],
"tolerances": ["t1"],
"solutions": [
"Bill15111984",
"15111984Bill",
Expand Down Expand Up @@ -458,10 +455,7 @@
"valid": "<span class=\"feedback__state\">Correct.</span><p> Un mot de passe long est plus solide. Se servir d'une phrase permet de mieux s'en souvenir. </p>",
"invalid": "<span class=\"feedback__state\">Incorrect.</span><p> Un mot de passe long est plus solide. Se servir d'une phrase permet de mieux s'en souvenir.</p>"
},
"solutions": [
"1",
"4"
]
"solutions": ["1", "4"]
}
}
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"description": "Pour savoir ce qu'on peut brancher ou non à un ordinateur, il faut bien connaître les principaux ports de connexion !",
"duration": 10,
"level": "Débutant",
"tabletSupport": "comfortable",
"objectives": [
"Reconnaître les ports de connexion essentiels d’un ordinateur",
"Connaître la fonction de chaque port de connexion"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"description": "Wikipédia est un site très connu, que vous avez sans doute déjà utilisé. Dans ce module, vous trouverez des explications sur les principes de Wikipédia. Vous découvrirez aussi des méthodes pour l'utiliser.",
"duration": 10,
"level": "Intermédiaire",
"tabletSupport": "comfortable",
"objectives": [
"Comprendre les principes fondateurs de Wikipédia",
"Connaître certaines caractéristiques et fonctionnalités de Wikipédia",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"description": "Sur internet et les réseaux sociaux, il est parfois difficile de savoir si une information est vraie ou fausse. Dans ce module, vous allez découvrir pourquoi il est important de s’intéresser à la source d’une information pour démêler le vrai du faux.",
"duration": 10,
"level": "Débutant",
"tabletSupport": "comfortable",
"objectives": [
"Rechercher la source d’une information",
"Connaître les différents types de sources d’information",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ describe('Acceptance | Script | Get Answerable Elements as CSV', function () {
description: 'Découvrez avec ce didacticiel comment fonctionne Modulix !',
duration: 5,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: ['Naviguer dans Modulix', 'Découvrir les leçons et les activités'],
},
transitionTexts: [
Expand Down
1 change: 1 addition & 0 deletions api/tests/devcomp/acceptance/scripts/get-elements_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ describe('Acceptance | Script | Get Elements as CSV', function () {
description: 'Découvrez avec ce didacticiel comment fonctionne Modulix !',
duration: 5,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: ['Naviguer dans Modulix', 'Découvrir les leçons et les activités'],
},
transitionTexts: [
Expand Down
1 change: 1 addition & 0 deletions api/tests/devcomp/acceptance/scripts/get-modules_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ describe('Acceptance | Script | Get Modules as CSV', function () {
description: 'Découvrez avec ce didacticiel comment fonctionne Modulix !',
duration: 5,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: ['Naviguer dans Modulix', 'Découvrir les leçons et les activités'],
},
transitionTexts: [
Expand Down
1 change: 1 addition & 0 deletions api/tests/devcomp/acceptance/scripts/get-proposals_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ describe('Acceptance | Script | Get Proposals as CSV', function () {
description: 'Découvrez avec ce didacticiel comment fonctionne Modulix !',
duration: 5,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: ['Naviguer dans Modulix', 'Découvrir les leçons et les activités'],
},
transitionTexts: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ describe('Integration | DevComp | Repositories | ElementRepository', function ()
description: 'Découvrez avec ce didacticiel comment fonctionne Modulix !',
duration: 5,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: ['Naviguer dans Modulix', 'Découvrir les leçons et les activités'],
},
grains: [
Expand Down Expand Up @@ -132,6 +133,7 @@ describe('Integration | DevComp | Repositories | ElementRepository', function ()
description: 'Découvrez avec ce didacticiel comment fonctionne Modulix !',
duration: 5,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: ['Naviguer dans Modulix', 'Découvrir les leçons et les activités'],
},
grains: [
Expand Down Expand Up @@ -264,6 +266,7 @@ describe('Integration | DevComp | Repositories | ElementRepository', function ()
description: 'Découvrez avec ce didacticiel comment fonctionne Modulix !',
duration: 5,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: ['Naviguer dans Modulix', 'Découvrir les leçons et les activités'],
},
grains: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ describe('Integration | DevComp | Repositories | ModuleRepository', function ()
'Apprendre à rédiger correctement une adresse e-mail pour assurer une meilleure communication et éviter les erreurs courantes.',
duration: 12,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: [
'Écrire une adresse mail correctement, en évitant les erreurs courantes',
'Connaître les parties d’une adresse mail et les identifier sur des exemples',
Expand Down
22 changes: 21 additions & 1 deletion api/tests/devcomp/unit/domain/models/module/Details_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,18 @@ describe('Unit | Devcomp | Domain | Models | Module | Details', function () {
const description = 'Description';
const duration = 12;
const level = 'Débutant';
const tabletSupport = 'comfortable';
const objectives = ['MissionInformation #1'];

// when
const details = new Details({ image, description, duration, level, objectives });
const details = new Details({ image, description, duration, level, tabletSupport, objectives });

// then
expect(details.image).to.equal(image);
expect(details.description).to.equal(description);
expect(details.duration).to.equal(duration);
expect(details.level).to.equal(level);
expect(details.tabletSupport).to.equal(tabletSupport);
expect(details.objectives).to.equal(objectives);
});

Expand Down Expand Up @@ -52,6 +54,21 @@ describe('Unit | Devcomp | Domain | Models | Module | Details', function () {
});
});

describe('if the details do not have a tabletSupport', function () {
it('should throw an error', function () {
expect(
() =>
new Details({
image: 'https://image.com',
description: 'description',
duration: 12,
level: 'level',
objectives: ['objective1'],
}),
).to.throw('The tabletSupport is required for module details');
});
});

describe('if the details do not have objectives', function () {
it('should throw an error', function () {
expect(
Expand All @@ -61,6 +78,7 @@ describe('Unit | Devcomp | Domain | Models | Module | Details', function () {
description: 'description',
duration: 12,
level: 'level',
tabletSupport: 'comfortable',
}),
).to.throw('The objectives are required for module details');
});
Expand All @@ -75,6 +93,7 @@ describe('Unit | Devcomp | Domain | Models | Module | Details', function () {
description: 'description',
duration: 12,
level: 'level',
tabletSupport: 'comfortable',
objectives: ' not-a-list',
}),
).to.throw('The module details should contain a list of objectives');
Expand All @@ -90,6 +109,7 @@ describe('Unit | Devcomp | Domain | Models | Module | Details', function () {
description: 'description',
duration: 12,
level: 'level',
tabletSupport: 'comfortable',
objectives: [],
}),
).to.throw('The module details should contain at least one objective');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ describe('Unit | Infrastructure | Datasources | Learning Content | Module Dataso
description: 'Découvrez avec ce didacticiel comment fonctionne Modulix !',
duration: 5,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: ['Naviguer dans Modulix', 'Découvrir les leçons et les activités'],
},
grains: [
Expand Down Expand Up @@ -255,6 +256,7 @@ describe('Unit | Infrastructure | Datasources | Learning Content | Module Dataso
description: '<strong>Découvrez avec ce didacticiel</strong> comment fonctionne Modulix !',
duration: 5,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: ['Naviguer dans Modulix', 'Découvrir les leçons et les activités'],
};

Expand All @@ -275,6 +277,28 @@ describe('Unit | Infrastructure | Datasources | Learning Content | Module Dataso
description: 'Découvrez avec ce didacticiel comment fonctionne Modulix !',
duration: 5,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: ['<span>Naviguer dans Modulix<span>', 'Découvrir les leçons et les activités'],
};

try {
await moduleDetailsSchema.validateAsync(invalidModuleDetails, { abortEarly: false });
throw new Error('Joi validation should have thrown');
} catch (joiError) {
expect(joiError.message).to.deep.equal(
'"objectives[0]" failed custom validation because HTML is not allowed in this field',
);
}
});

it('should throw custom error for details.objectives fields', async function () {
// given
const invalidModuleDetails = {
image: 'https://images.pix.fr/modulix/placeholder-details.svg',
description: 'Découvrez avec ce didacticiel comment fonctionne Modulix !',
duration: 5,
level: 'Débutant',
tabletSupport: 'comfortable',
objectives: ['<span>Naviguer dans Modulix<span>', 'Découvrir les leçons et les activités'],
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const moduleDetailsSchema = Joi.object({
duration: Joi.number().integer().min(0).max(120).required(),
level: Joi.string().valid('Débutant', 'Intermédiaire', 'Avancé', 'Expert').required(),
objectives: Joi.array().items(htmlNotAllowedSchema).min(1).required(),
tabletSupport: Joi.string().valid('obstructed', 'inconvenient', 'comfortable').required(),
});

const elementSchema = Joi.alternatives().conditional('.type', {
Expand Down
Loading

0 comments on commit 841aa13

Please sign in to comment.