freeCodeCamp/tools/challenge-helper-scripts/utils.test.js

140 lines
3.2 KiB
JavaScript

const fs = require('fs');
const ObjectID = require('bson-objectid');
const glob = require('glob');
const mock = require('mock-fs');
// NOTE:
// Use `console.log()` before mocking the filesystem or use
// `process.stdout.write()` instead. There are issues when using `mock-fs` and
// `require`.
jest.mock('bson-objectid', () => {
return jest.fn(() => mockChallengeId);
});
jest.mock('./helpers/get-step-template', () => {
return {
getStepTemplate: jest.fn(() => 'Mock template...')
};
});
jest.mock('./helpers/get-project-meta-path', () => {
return {
getProjectMetaPath: jest.fn(() => '_meta/project/meta.json')
};
});
jest.mock('./helpers/get-project-path', () => {
return {
getProjectPath: jest.fn(() => 'project/')
};
});
jest.mock('gray-matter', () => {
return {
read: jest.fn(() => ({
data: { id: mockChallengeId },
stringify: jest.fn(() => 'Lorem ipsum...')
}))
};
});
jest.mock(
'../challenge-helper-scripts/helpers/get-project-path-metadata',
() => ({
getMetaData: jest.fn(() => ({
id: 'mock-id'
}))
})
);
const mockChallengeId = '60d35cf3fe32df2ce8e31b03';
const { getStepTemplate } = require('./helpers/get-step-template');
const { createStepFile, reorderSteps } = require('./utils');
describe('Challenge utils helper scripts', () => {
describe('createStepFile util', () => {
it('should create next step and return its identifier', () => {
mock({
'project/': {
'step-001.md': 'Lorem ipsum...',
'step-002.md': 'Lorem ipsum...'
}
});
const step = createStepFile({
projectPath: 'project/',
stepNum: 3
});
expect(step).toEqual(mockChallengeId);
expect(ObjectID).toHaveBeenCalledTimes(1);
// Internal tasks
// - Should generate a template for the step that is being created
expect(getStepTemplate).toHaveBeenCalledTimes(1);
// - Should write a file with a given name and template
const files = glob.sync(`project/*.md`);
expect(files).toEqual([
`project/step-001.md`,
`project/step-002.md`,
`project/step-003.md`
]);
mock.restore();
});
});
describe('reorderSteps util', () => {
it('should sort files found in given path', () => {
mock({
'_meta/project/': {
'meta.json': 'Lorem ipsum meta content...'
},
'project/': {
'step-001.md': 'Lorem ipsum 1...',
'step-002.md': 'Lorem ipsum 2...',
'step-002b.md': 'Lorem ipsum 3...'
}
});
reorderSteps();
// - Should write a file with a given name and template
const files = glob.sync(`project/*.md`);
expect(files).toEqual([
'project/step-001.md',
'project/step-002.md',
'project/step-003.md'
]);
const result = fs.readFileSync('_meta/project/meta.json', 'utf8');
const expectedResult = `{
"id": "mock-id",
"challengeOrder": [
[
"60d35cf3fe32df2ce8e31b03",
"Step 1"
],
[
"60d35cf3fe32df2ce8e31b03",
"Step 2"
],
[
"60d35cf3fe32df2ce8e31b03",
"Step 3"
]
]
}`;
expect(result).toEqual(expectedResult);
mock.restore();
});
});
});