freeCodeCamp/shared/config/superblocks.test.ts

126 lines
4.1 KiB
TypeScript

import { Languages } from './i18n';
import {
SuperBlocks,
SuperBlockStages,
superBlockOrder,
notAuditedSuperBlocks,
createSuperBlockMap,
createFlatSuperBlockMap,
getAuditedSuperBlocks,
getFirstNotAuditedSuperBlock
} from './superblocks';
describe('superBlockOrder', () => {
it('should contain all SuperBlocks', () => {
const allSuperBlocks = Object.values(SuperBlocks);
const superBlockOrderValues = Object.values(superBlockOrder).flat();
expect(superBlockOrderValues).toHaveLength(allSuperBlocks.length);
expect(superBlockOrderValues).toEqual(
expect.arrayContaining(allSuperBlocks)
);
});
});
describe('createSuperBlockMap', () => {
it('should return an object with New and Upcoming when { showNewCurriculum: true, showUpcomingChanges: true }', () => {
const result = createSuperBlockMap({
showNewCurriculum: true,
showUpcomingChanges: true
});
expect(result[SuperBlockStages.New]).toHaveLength(
superBlockOrder[SuperBlockStages.New].length
);
expect(result[SuperBlockStages.Upcoming]).toHaveLength(
superBlockOrder[SuperBlockStages.Upcoming].length
);
});
it('should return an object without New and Upcoming when { showNewCurriculum: false, showUpcomingChanges: false }', () => {
const result = createSuperBlockMap({
showNewCurriculum: false,
showUpcomingChanges: false
});
expect(result[SuperBlockStages.New]).toHaveLength(0);
expect(result[SuperBlockStages.Upcoming]).toHaveLength(0);
});
});
describe('createFlatSuperBlockMap', () => {
it('should return an array of SuperBlocks object with New and Upcoming when { showNewCurriculum: true, showUpcomingChanges: true }', () => {
const result = createFlatSuperBlockMap({
showNewCurriculum: true,
showUpcomingChanges: true
});
expect(result).toHaveLength(Object.values(superBlockOrder).flat().length);
});
it('should return an array of SuperBlocks without New and Upcoming when { showNewCurriculum: false, showUpcomingChanges: false }', () => {
const result = createFlatSuperBlockMap({
showNewCurriculum: false,
showUpcomingChanges: false
});
const tempSuperBlockMap = { ...superBlockOrder };
tempSuperBlockMap[SuperBlockStages.New] = [];
tempSuperBlockMap[SuperBlockStages.Upcoming] = [];
expect(result).toHaveLength(Object.values(tempSuperBlockMap).flat().length);
});
});
describe('firstNotAuditedSuperBlock', () => {
it("should return 'null' when language is 'english'", () => {
const result = getFirstNotAuditedSuperBlock({
language: Languages.English,
showNewCurriculum: false,
showUpcomingChanges: false
});
expect(result).toBeNull();
});
it("should return a SuperBlock when language is 'chinese'", () => {
const result = getFirstNotAuditedSuperBlock({
language: Languages.Chinese,
showNewCurriculum: false,
showUpcomingChanges: false
});
expect(result).toEqual(SuperBlocks.FoundationalCSharp);
});
});
describe('Immutability of superBlockOrder, notAuditedSuperBlocks, and flatSuperBlockMap', () => {
it('should not allow modification of superBlockOrder', () => {
expect(() => {
superBlockOrder[SuperBlockStages.FrontEnd] = [];
}).toThrowError(TypeError);
});
it('should not allow modification of notAuditedSuperBlocks', () => {
expect(() => {
notAuditedSuperBlocks[Languages.English] = [];
}).toThrowError(TypeError);
});
it('should not allow modification of flatSuperBlockMap', () => {
expect(() => {
notAuditedSuperBlocks[Languages.English] = [];
}).toThrowError(TypeError);
});
});
describe('getAuditedSuperBlocks', () => {
Object.keys(notAuditedSuperBlocks).forEach(language => {
it(`should return only audited SuperBlocks for ${language}`, () => {
const auditedSuperBlocks = getAuditedSuperBlocks({
showNewCurriculum: true,
showUpcomingChanges: true,
language
});
auditedSuperBlocks.forEach(superblock => {
expect(notAuditedSuperBlocks[language as Languages]).not.toContain(
superblock
);
});
});
});
});