diff --git a/curriculum/build-curriculum.js b/curriculum/build-curriculum.js index cd1282b0f5a..9cafeb4f764 100644 --- a/curriculum/build-curriculum.js +++ b/curriculum/build-curriculum.js @@ -1,7 +1,7 @@ const fs = require('fs'); const path = require('path'); -const { isEmpty } = require('lodash'); +const { isEmpty, isUndefined } = require('lodash'); const debug = require('debug')('fcc:build-curriculum'); const { @@ -11,7 +11,7 @@ const { } = require('./build-superblock'); const { buildCertification } = require('./build-certification'); -const { applyFilters, closestFilters } = require('./utils'); +const { applyFilters, closestFilters, getSuperOrder } = require('./utils'); const { getContentDir, getLanguageConfig, @@ -330,7 +330,18 @@ async function buildCurriculum(lang, filters) { const fullCurriculum = { certifications: { blocks: {} } }; - for (const superblock of fullSuperblockList) { + const liveSuperblocks = fullSuperblockList.filter(({ name }) => { + const superOrder = getSuperOrder(name); + const upcomingSuperOrder = getSuperOrder(name, true); + + // If a superblock is not in either order list it should not exist. + if (isUndefined(superOrder) && isUndefined(upcomingSuperOrder)) { + throw Error(`Invalid superBlock: ${name}`); + } + return !isUndefined(superOrder); + }); + + for (const superblock of liveSuperblocks) { fullCurriculum[superblock.name] = await builder.processSuperblock(superblock); } diff --git a/curriculum/utils.js b/curriculum/utils.js index ccf12b9ab86..1d900de1add 100644 --- a/curriculum/utils.js +++ b/curriculum/utils.js @@ -2,10 +2,7 @@ const path = require('path'); const comparison = require('string-similarity'); -const { - SuperBlocks, - generateSuperBlockList -} = require('../shared-dist/config/curriculum'); +const { generateSuperBlockList } = require('../shared-dist/config/curriculum'); require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); @@ -27,15 +24,6 @@ exports.testedLang = function testedLang() { }; function createSuperOrder(superBlocks) { - if (!Array.isArray(superBlocks)) { - throw Error(`superBlocks must be an Array`); - } - superBlocks.forEach(superBlock => { - if (!Object.values(SuperBlocks).includes(superBlock)) { - throw Error(`Invalid superBlock: ${superBlock}`); - } - }); - const superOrder = {}; superBlocks.forEach((superBlock, i) => { @@ -45,19 +33,16 @@ function createSuperOrder(superBlocks) { return superOrder; } -const flatSuperBlockMap = generateSuperBlockList({ - showUpcomingChanges: process.env.SHOW_UPCOMING_CHANGES === 'true' -}); -const superOrder = createSuperOrder(flatSuperBlockMap); +function getSuperOrder( + superblock, + showUpcomingChanges = process.env.SHOW_UPCOMING_CHANGES === 'true' +) { + const flatSuperBlockMap = generateSuperBlockList({ + showUpcomingChanges + }); -// gets the superOrder of a superBlock from the object created above -function getSuperOrder(superblock) { - if (typeof superblock !== 'string') - throw Error(`superblock ${JSON.stringify(superblock)} must be a string`); - const order = superOrder[superblock]; - if (typeof order === 'undefined') - throw Error(`${superblock} is not a valid superblock`); - return order; + const superOrder = createSuperOrder(flatSuperBlockMap); + return superOrder[superblock]; } /** diff --git a/curriculum/utils.test.ts b/curriculum/utils.test.ts index 27c0167f23c..282335dbbf3 100644 --- a/curriculum/utils.test.ts +++ b/curriculum/utils.test.ts @@ -67,62 +67,41 @@ describe('createSuperOrder', () => { }); it('throws when not given an array of SuperBlocks', () => { - expect.assertions(4); - expect(() => getSuperOrder()).toThrow(); - expect(() => getSuperOrder(null)).toThrow(); - expect(() => getSuperOrder('')).toThrow(); - expect(() => getSuperOrder(['respansive-wib-desoin'])).toThrow(); + expect(() => createSuperOrder()).toThrow(); + expect(() => createSuperOrder(null)).toThrow(); + expect(() => createSuperOrder('')).toThrow(); }); }); describe('getSuperOrder', () => { it('returns a number for valid curriculum', () => { - expect.assertions(1); expect(typeof getSuperOrder('responsive-web-design')).toBe('number'); }); - it('throws for unknown curriculum', () => { - expect.assertions(4); - expect(() => getSuperOrder()).toThrow(); - expect(() => getSuperOrder(null)).toThrow(); - expect(() => getSuperOrder('')).toThrow(); - expect(() => getSuperOrder('respansive-wib-desoin')).toThrow(); + it('returns undefined for unknown curriculum', () => { + expect(getSuperOrder()).toBeUndefined(); + expect(getSuperOrder(null)).toBeUndefined(); + expect(getSuperOrder('')).toBeUndefined(); + expect(getSuperOrder('respansive-wib-desoin')).toBeUndefined(); + expect(getSuperOrder('certifications')).toBeUndefined(); }); - it('throws for "certifications"', () => { - expect.assertions(1); - expect(() => getSuperOrder('certifications')).toThrow(); + it('returns numbers for all current curriculum', () => { + const superBlocks = Object.values(SuperBlocks); + + const superOrderValues = superBlocks.map(sb => getSuperOrder(sb, true)); + const definedValues = superOrderValues.filter(v => typeof v === 'number'); + + expect(definedValues.length).toBe(superBlocks.length); }); - it.skip('returns unique numbers for all current curriculum', () => { - if (process.env.SHOW_UPCOMING_CHANGES !== 'true') { - expect.assertions(17); - } else { - expect.assertions(19); - } + it('returns unique numbers for all current curriculum', () => { + const superBlocks = Object.values(SuperBlocks); - expect(getSuperOrder(SuperBlocks.RespWebDesignNew)).toBe(0); - expect(getSuperOrder(SuperBlocks.JsAlgoDataStructNew)).toBe(1); - expect(getSuperOrder(SuperBlocks.FrontEndDevLibs)).toBe(2); - expect(getSuperOrder(SuperBlocks.DataVis)).toBe(3); - expect(getSuperOrder(SuperBlocks.RelationalDb)).toBe(4); - expect(getSuperOrder(SuperBlocks.BackEndDevApis)).toBe(5); - expect(getSuperOrder(SuperBlocks.QualityAssurance)).toBe(6); - expect(getSuperOrder(SuperBlocks.SciCompPy)).toBe(7); - expect(getSuperOrder(SuperBlocks.DataAnalysisPy)).toBe(8); - expect(getSuperOrder(SuperBlocks.InfoSec)).toBe(9); - expect(getSuperOrder(SuperBlocks.MachineLearningPy)).toBe(10); - expect(getSuperOrder(SuperBlocks.CollegeAlgebraPy)).toBe(11); - expect(getSuperOrder(SuperBlocks.FoundationalCSharp)).toBe(12); - expect(getSuperOrder(SuperBlocks.CodingInterviewPrep)).toBe(13); - expect(getSuperOrder(SuperBlocks.ProjectEuler)).toBe(14); - expect(getSuperOrder(SuperBlocks.RespWebDesign)).toBe(15); - expect(getSuperOrder(SuperBlocks.JsAlgoDataStruct)).toBe(16); + const superOrderValues = superBlocks.map(sb => getSuperOrder(sb, true)); + const uniqueValues = Array.from(new Set(superOrderValues)); - if (process.env.SHOW_UPCOMING_CHANGES === 'true') { - expect(getSuperOrder(SuperBlocks.TheOdinProject)).toBe(17); - expect(getSuperOrder(SuperBlocks.FullStackDeveloper)).toBe(18); - } + expect(uniqueValues.length).toBe(superBlocks.length); }); });