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();
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 |