UNPKG

jest-ex

Version:

A runner and a transformer to simplify (a little bit) your work with Jest.

196 lines (183 loc) 6.53 kB
/* eslint-disable global-require */ jest.mock('../../src/babel.js', () => require('../mocks/mock.babel')); jest.mock('glob', () => ({ sync: jest.fn() })); jest.mock('html-loader', () => jest.fn((code) => code)); jest.mock('fs', () => ({ readFileSync: jest.fn() })); jest.unmock('path'); jest.unmock('../../src/tools/transformer'); jest.unmock('../../src/utils/functions'); import path from 'path'; import glob from 'glob'; import fs from 'fs'; import htmlLoader from 'html-loader'; import babel from '../mocks/mock.babel'; import JestExTransformer from '../../src/tools/transformer'; import 'jasmine-expect'; describe('JestExTransformer', () => { beforeEach(() => { fs.readFileSync.mockReset(); }); it('should create a new instance of the transformer and set the default properties', () => { // Given let sut = null; // When sut = new JestExTransformer(); // Then expect(sut).toBeInstanceOf(JestExTransformer); expect(sut.invisibleLines).toBeArray(); expect(sut.ignoreLineComment).toBeString(); }); it('should process a file with Babel', () => { // Given const code = 'some-code'; const fpath = 'some/file.js'; let sut = null; let result = null; // When sut = new JestExTransformer(); result = sut.process(code, fpath); // Then expect(result).toBe(code); expect(babel.transform).toHaveBeenCalledTimes(1); expect(babel.transform).toHaveBeenCalledWith(code, expect.any(Object)); }); it('should process an HTML file', () => { // Given const code = '<strong>some-code</strong>'; const fpath = 'some/file.html'; fs.readFileSync.mockImplementation(() => code); let sut = null; let result = null; // When sut = new JestExTransformer(); result = sut.process(code, fpath); // Then expect(result).toBe(code); expect(fs.readFileSync).toHaveBeenCalledTimes(1); expect(fs.readFileSync).toHaveBeenCalledWith(fpath, 'utf-8'); expect(htmlLoader).toHaveBeenCalledTimes(1); expect(htmlLoader).toHaveBeenCalledWith(code); }); it('should format the special paths Jest-Ex allows', () => { // Given const rootPath = path .relative(__dirname, process.cwd()) .replace(/\\/g, '/'); const cases = [ { original: 'import file from \'/src/folder/file\';', expected: `import file from '${rootPath}/src/folder/file';`, }, { original: 'import {\nutil,\ntool\n} from \'/src/folder/file\';', expected: `import {\nutil,\ntool\n} from '${rootPath}/src/folder/file';`, }, { original: 'jest.unmock(\'/src/folder/file\');', expected: `jest.unmock('${rootPath}/src/folder/file');`, }, { original: 'jest.mock(\'/src/folder/file\', () => {});', expected: `jest.mock('${rootPath}/src/folder/file', () => {});`, }, { original: 'jest.setMock(\'/src/folder/file\', () => {});', expected: `jest.setMock('${rootPath}/src/folder/file', () => {});`, }, { original: 'jest.require(\'/src/folder/file\');', expected: `jest.require('${rootPath}/src/folder/file');`, }, ]; const separator = '\n\n'; const code = cases.map((testCase) => testCase.original).join(separator); let sut = null; let result = null; // When sut = new JestExTransformer(); result = sut.process(code, __filename); // Then result.split(separator).forEach((line, i) => { expect(line).toBe(cases[i].expected); }); }); it('should expand globs on \'unmock\' calls', () => { // Given const code = 'jest.unmock(\'/src/tools/**\')'; const relative = '../../src/tools'; const thispath = path.join(__dirname, relative); const files = ['A', 'B']; glob.sync.mockReturnValueOnce(files.map((file) => path.join(thispath, `file${file}.js`))); let sut = null; let result = null; // When sut = new JestExTransformer(); result = sut.process(code, __filename); // Then result.trim().split('\n').forEach((line, i) => { const linepath = path.join(relative, `file${files[i]}.js`); expect(line).toBe(`jest.unmock('${linepath}');`); }); }); it('should expand an \'unmock\' glob with an ignore pattern', () => { // Given const code = 'jest.unmock(\'/src/tools/**!A\')'; const relative = '../../src/tools'; const thispath = path.join(__dirname, relative); const files = ['A', 'B']; glob.sync.mockReturnValueOnce(files.map((file) => path.join(thispath, `file${file}.js`))); let sut = null; let result = null; // When sut = new JestExTransformer(); result = sut.process(code, __filename); // Then const fpath = path.join(relative, 'fileB.js'); expect(result.trim()).toBe(`jest.unmock('${fpath}');`); }); it('should expand an \'unmock\' glob with an invalid ignore pattern', () => { // Given const code = 'jest.unmock(\'/src/tools/**!\')'; const relative = '../../src/tools'; const thispath = path.join(__dirname, relative); const files = ['A', 'B']; glob.sync.mockReturnValueOnce(files.map((file) => path.join(thispath, `file${file}.js`))); let sut = null; let result = null; // When sut = new JestExTransformer(); result = sut.process(code, __filename); // Then result.trim().split('\n').forEach((line, i) => { const linepath = path.join(relative, `file${files[i]}.js`); expect(line).toBe(`jest.unmock('${linepath}');`); }); }); it('should expand an \'unmock\' glob with an ignore pattern list', () => { // Given const code = 'jest.unmock(\'/src/tools/**!fileA,fileC\')'; const relative = '../../src/tools'; const thispath = path.join(__dirname, relative); const files = ['A', 'B', 'C']; glob.sync.mockReturnValueOnce(files.map((file) => path.join(thispath, `file${file}.js`))); let sut = null; let result = null; const expectedFilepath = path.join(relative, 'fileB.js'); // When sut = new JestExTransformer(); result = sut.process(code, __filename).trim(); // Then expect(result).toBe(`jest.unmock('${expectedFilepath}');`); }); it('should ignore a file if it doesn\'t have a javascript extension', () => { // Given const code = 'jest.unmock(\'/src/tools/**!\')'; let sut = null; let result = null; // When sut = new JestExTransformer(); result = sut.process(code, 'file.css'); // Then expect(result).toBe(code); }); });