UNPKG

eslint-plugin-jest

Version:
153 lines (149 loc) 4.37 kB
'use strict'; const _require = require('eslint'), RuleTester = _require.RuleTester; const rule = require('../no-large-snapshots'); const noLargeSnapshots = rule.create; const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 2015 } }); ruleTester.run('no-large-snapshots', rule, { valid: [{ filename: 'mock.js', code: `expect(something).toMatchInlineSnapshot(\`\n${'line\n'.repeat(2)}\`);` }, { filename: 'mock.js', code: `expect(something).toThrowErrorMatchingInlineSnapshot(\`\n${'line\n'.repeat(2)}\`);` }], invalid: [{ filename: 'mock.js', code: `expect(something).toMatchInlineSnapshot(\`\n${'line\n'.repeat(50)}\`);`, errors: [{ messageId: 'tooLongSnapshots', data: { lineLimit: 50, lineCount: 51 } }] }, { filename: 'mock.js', code: `expect(something).toThrowErrorMatchingInlineSnapshot(\`\n${'line\n'.repeat(50)}\`);`, errors: [{ messageId: 'tooLongSnapshots', data: { lineLimit: 50, lineCount: 51 } }] }] }); // was not able to use https://eslint.org/docs/developer-guide/nodejs-api#ruletester for these because there is no way to configure RuleTester to run non .js files describe('no-large-snapshots', () => { it('should return an empty object for non snapshot files', () => { const mockContext = { getFilename: () => 'mock-component.jsx', options: [] }; const result = noLargeSnapshots(mockContext); expect(result).toEqual({}); }); it('should return an object with an ExpressionStatement function for snapshot files', () => { const mockContext = { getFilename: () => 'mock-component.jsx.snap', options: [] }; const result = noLargeSnapshots(mockContext); expect(result).toMatchObject({ ExpressionStatement: expect.any(Function) }); }); describe('ExpressionStatement function', () => { it('should report if node has more than 50 lines of code and no sizeThreshold option is passed', () => { const mockReport = jest.fn(); const mockContext = { getFilename: () => 'mock-component.jsx.snap', options: [], report: mockReport }; const mockNode = { loc: { start: { line: 1 }, end: { line: 53 } } }; noLargeSnapshots(mockContext).ExpressionStatement(mockNode); expect(mockReport).toHaveBeenCalledTimes(1); expect(mockReport.mock.calls[0]).toMatchSnapshot(); }); it('should report if node has more lines of code than number given in sizeThreshold option', () => { const mockReport = jest.fn(); const mockContext = { getFilename: () => 'mock-component.jsx.snap', options: [{ maxSize: 70 }], report: mockReport }; const mockNode = { loc: { start: { line: 20 }, end: { line: 103 } } }; noLargeSnapshots(mockContext).ExpressionStatement(mockNode); expect(mockReport).toHaveBeenCalledTimes(1); expect(mockReport.mock.calls[0]).toMatchSnapshot(); }); it('should report if maxSize is zero', () => { const mockReport = jest.fn(); const mockContext = { getFilename: () => 'mock-component.jsx.snap', options: [{ maxSize: 0 }], report: mockReport }; const mockNode = { loc: { start: { line: 1 }, end: { line: 2 } } }; noLargeSnapshots(mockContext).ExpressionStatement(mockNode); expect(mockReport).toHaveBeenCalledTimes(1); expect(mockReport.mock.calls[0]).toMatchSnapshot(); }); it('should not report if node has fewer lines of code than limit', () => { const mockReport = jest.fn(); const mockContext = { getFilename: () => 'mock-component.jsx.snap', options: [], report: mockReport }; const mockNode = { loc: { start: { line: 1 }, end: { line: 18 } } }; noLargeSnapshots(mockContext).ExpressionStatement(mockNode); expect(mockReport).not.toHaveBeenCalled(); }); }); });