131 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | /* global describe it expect */ | ||
|  | const mockAST = require('../__fixtures__/ast-simple.json'); | ||
|  | // eslint-disable-next-line max-len
 | ||
|  | const incorrectMarkersAST = require('../__fixtures__/ast-incorrect-markers.json'); | ||
|  | const realisticAST = require('../__fixtures__/ast-realistic.json'); | ||
|  | const addText = require('./add-text'); | ||
|  | 
 | ||
|  | describe('add-text', () => { | ||
|  |   const descriptionId = 'description'; | ||
|  |   const instructionsId = 'instructions'; | ||
|  |   // const unexpectedField = 'does-not-exist';
 | ||
|  |   let file = { data: {} }; | ||
|  | 
 | ||
|  |   beforeEach(() => { | ||
|  |     file = { data: {} }; | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should return a function', () => { | ||
|  |     const plugin = addText(['section']); | ||
|  | 
 | ||
|  |     expect(typeof plugin).toEqual('function'); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('throws when no argument or the incorrect argument is supplied', () => { | ||
|  |     expect.assertions(5); | ||
|  |     const expectedError = 'addText must have an array of section ids supplied'; | ||
|  |     expect(() => { | ||
|  |       addText(); | ||
|  |     }).toThrow(expectedError); | ||
|  |     expect(() => { | ||
|  |       addText(''); | ||
|  |     }).toThrow(expectedError); | ||
|  |     expect(() => { | ||
|  |       addText({}); | ||
|  |     }).toThrow(expectedError); | ||
|  |     expect(() => { | ||
|  |       addText(1); | ||
|  |     }).toThrow(expectedError); | ||
|  |     expect(() => { | ||
|  |       addText([]); | ||
|  |     }).toThrow(expectedError); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should add a string relating to the section id to `file.data`', () => { | ||
|  |     const plugin = addText([descriptionId]); | ||
|  |     plugin(mockAST, file); | ||
|  |     const expectedText = 'Paragraph 1'; | ||
|  |     expect(file.data[descriptionId]).toEqual( | ||
|  |       expect.stringContaining(expectedText) | ||
|  |     ); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should not add a string relating a different id to `file.data`', () => { | ||
|  |     const plugin = addText([descriptionId]); | ||
|  |     plugin(mockAST, file); | ||
|  |     // the following text is in the AST, but is associated with a different
 | ||
|  |     // marker (instructions)
 | ||
|  |     const expectedText = 'Paragraph 0'; | ||
|  |     expect(file.data[descriptionId]).not.toEqual( | ||
|  |       expect.stringContaining(expectedText) | ||
|  |     ); | ||
|  |   }); | ||
|  | 
 | ||
|  |   // TODO: do we need to add the ids to the section tags? Why not just have
 | ||
|  |   // <section>?
 | ||
|  |   it('should embed the text in sections with appropriate ids', () => { | ||
|  |     const plugin = addText([descriptionId, instructionsId]); | ||
|  |     plugin(mockAST, file); | ||
|  |     // the following text is in the AST, but is associated with a different
 | ||
|  |     // marker (instructions)
 | ||
|  |     const descriptionSectionText = `<section id="description">
 | ||
|  | <p>Paragraph 1</p> | ||
|  | <pre><code class="language-html">code example | ||
|  | </code></pre> | ||
|  | </section>`; | ||
|  |     expect(file.data[descriptionId]).toEqual(descriptionSectionText); | ||
|  |     const instructionsSectionText = `<section id="instructions">
 | ||
|  | <p>Paragraph 0</p> | ||
|  | <pre><code class="language-html">code example 0 | ||
|  | </code></pre> | ||
|  | </section>`; | ||
|  |     expect(file.data[instructionsId]).toBe(instructionsSectionText); | ||
|  |   }); | ||
|  | 
 | ||
|  |   // eslint-disable-next-line max-len
 | ||
|  |   it('should add nothing if a section id does not appear in the md', () => { | ||
|  |     const plugin = addText([descriptionId]); | ||
|  |     plugin(incorrectMarkersAST, file); | ||
|  |     expect(file.data[descriptionId]).toBeUndefined(); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should not escape html', () => { | ||
|  |     const plugin = addText([descriptionId]); | ||
|  |     plugin(realisticAST, file); | ||
|  |     const expected = `last <code>h2</code> element`; | ||
|  |     expect(file.data[descriptionId]).toEqual(expect.stringContaining(expected)); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should preserve nested html', () => { | ||
|  |     const plugin = addText([descriptionId]); | ||
|  |     plugin(realisticAST, file); | ||
|  |     const expected = `<blockquote>
 | ||
|  |   <p>Some text in a blockquote</p> | ||
|  |   <p> | ||
|  |     Some text in a blockquote, with <code>code</code> | ||
|  |   </p> | ||
|  | </blockquote>`; | ||
|  |     expect(file.data[descriptionId]).toEqual(expect.stringContaining(expected)); | ||
|  |   }); | ||
|  | 
 | ||
|  |   // eslint-disable-next-line max-len
 | ||
|  |   it('should not add paragraphs when html elements are separated by whitespace', () => { | ||
|  |     const plugin = addText([instructionsId]); | ||
|  |     plugin(realisticAST, file); | ||
|  |     const expectedText1 = `<code>code</code> <tag>with more after a space</tag>`; | ||
|  |     const expectedText2 = `another pair of <strong>elements</strong> <em>with a space</em>`; | ||
|  |     expect(file.data[instructionsId]).toEqual( | ||
|  |       expect.stringContaining(expectedText1) | ||
|  |     ); | ||
|  |     expect(file.data[instructionsId]).toEqual( | ||
|  |       expect.stringContaining(expectedText2) | ||
|  |     ); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('should have an output to match the snapshot', () => { | ||
|  |     const plugin = addText([descriptionId, instructionsId]); | ||
|  |     plugin(mockAST, file); | ||
|  |     expect(file.data).toMatchSnapshot(); | ||
|  |   }); | ||
|  | }); |