73 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* global describe it expect beforeEach */
 | |
| 
 | |
| const { isObject } = require('lodash');
 | |
| 
 | |
| const mockAST = require('../__fixtures__/ast-yaml-challenge.json');
 | |
| const processFrontmatter = require('./add-frontmatter');
 | |
| 
 | |
| describe('process-frontmatter plugin', () => {
 | |
|   const plugin = processFrontmatter();
 | |
|   let file = { data: {} };
 | |
|   beforeEach(() => {
 | |
|     file = { data: {} };
 | |
|   });
 | |
| 
 | |
|   it('should return a plugin which is a function', () => {
 | |
|     expect(typeof plugin).toEqual('function');
 | |
|   });
 | |
| 
 | |
|   it('should maintain an object for the `file.data` property', () => {
 | |
|     plugin(mockAST, file);
 | |
|     expect(isObject(file.data)).toBe(true);
 | |
|   });
 | |
| 
 | |
|   // And no others. The AST includes some yaml code, and this also
 | |
|   // checks that none of those keys get parsed
 | |
|   it('should add all keys from frontmatter to the `file.data` property', () => {
 | |
|     const expectedKeys = [
 | |
|       'id',
 | |
|       'title',
 | |
|       'challengeType',
 | |
|       'videoUrl',
 | |
|       'forumTopicId'
 | |
|     ];
 | |
|     plugin(mockAST, file);
 | |
|     const actualKeys = Object.keys(file.data);
 | |
|     expect(actualKeys).toEqual(expectedKeys);
 | |
|   });
 | |
| 
 | |
|   it('should not mutate any type held in the frontmatter', () => {
 | |
|     expect.assertions(5);
 | |
|     plugin(mockAST, file);
 | |
|     const { id, title, challengeType, videoUrl, forumTopicId } = file.data;
 | |
|     expect(typeof id).toEqual('string');
 | |
|     expect(typeof title).toEqual('string');
 | |
|     expect(typeof challengeType).toEqual('number');
 | |
|     expect(typeof videoUrl).toEqual('string');
 | |
|     expect(typeof forumTopicId).toEqual('number');
 | |
|   });
 | |
| 
 | |
|   it('should trim extra whitespace from keys and values', () => {
 | |
|     expect.assertions(8);
 | |
|     plugin(mockAST, file);
 | |
|     const whitespaceRE = /(^\s\S+|\S\s$)/;
 | |
|     const keys = Object.keys(file.data);
 | |
|     keys.forEach(key => expect(whitespaceRE.test(key)).toBe(false));
 | |
|     const values = keys.map(key => file.data[key]);
 | |
|     values
 | |
|       .filter(value => typeof value === 'string')
 | |
|       .forEach(value => expect(whitespaceRE.test(value)).toBe(false));
 | |
|   });
 | |
| 
 | |
|   it('should not mutate url strings', () => {
 | |
|     const expectedUrl = 'https://scrimba.com/p/pVMPUv/cE8Gpt2';
 | |
|     plugin(mockAST, file);
 | |
|     expect(file.data.videoUrl).toEqual(expectedUrl);
 | |
|   });
 | |
| 
 | |
|   it('should have an output to match the snapshot', () => {
 | |
|     plugin(mockAST, file);
 | |
|     expect(file.data).toMatchSnapshot();
 | |
|   });
 | |
| });
 |