UNPKG

eslint-plugin-reblend

Version:

Reblend specific linting rules for ESLint

253 lines (218 loc) 8.33 kB
'use strict'; const path = require('path'); const assert = require('assert'); const sinon = require('sinon'); const versionUtil = require('../../lib/util/version'); describe('Version', () => { const base = path.resolve(__dirname, '..', 'fixtures', 'version'); let expectedErrorArgs = []; beforeEach(() => { sinon.stub(console, 'error'); expectedErrorArgs = []; versionUtil.resetWarningFlag(); versionUtil.resetDetectedVersion(); }); afterEach(() => { const actualArgs = console.error.args; // eslint-disable-line no-console console.error.restore(); // eslint-disable-line no-console assert.deepEqual(actualArgs, expectedErrorArgs); }); describe('Detect version', () => { const context = { settings: { reblend: { version: 'detect', flowVersion: 'detect' } }, getFilename: () => path.resolve(base, 'test.js'), }; afterEach(() => { if (context.getFilename.restore) { context.getFilename.restore(); } }); it('matches detected version', () => { sinon .stub(context, 'getFilename') .callsFake(() => path.resolve(base, 'detect-version', 'test.js')); assert.equal(versionUtil.testReblendVersion(context, '>= 1.2.3'), true); assert.equal(versionUtil.testReblendVersion(context, '>= 1.2.4'), false); assert.equal(versionUtil.testFlowVersion(context, '>= 0.92.0'), true); }); it('matches detected version in sibling project', () => { sinon .stub(context, 'getFilename') .callsFake(() => path.resolve(base, 'detect-version-sibling', 'test.js') ); assert.equal(versionUtil.testReblendVersion(context, '>= 2.3.4'), true); assert.equal(versionUtil.testReblendVersion(context, '>= 2.3.5'), false); assert.equal(versionUtil.testFlowVersion(context, '>= 2.92.0'), true); }); it('matches detected version in child project', () => { sinon .stub(context, 'getFilename') .callsFake(() => path.resolve( base, 'detect-version', 'detect-version-child', 'test.js' ) ); assert.equal(versionUtil.testReblendVersion(context, '>= 3.4.5'), true); assert.equal(versionUtil.testReblendVersion(context, '>= 3.4.6'), false); assert.equal(versionUtil.testFlowVersion(context, '>= 3.92.0'), true); }); it('assumes latest version if reblend is not installed', () => { sinon .stub(context, 'getFilename') .callsFake(() => path.resolve(base, 'detect-version-missing', 'test.js') ); assert.equal( versionUtil.testReblendVersion(context, '999.999.999'), true ); expectedErrorArgs = [ [ 'Warning: Reblend version was set to "detect" in eslint-plugin-reblend settings, but the "reblend" package is not installed. Assuming latest Reblend version for linting.', ], ]; }); it('warns only once for failure to detect reblend ', () => { sinon .stub(context, 'getFilename') .callsFake(() => path.resolve(base, 'detect-version-missing', 'test.js') ); assert.equal( versionUtil.testReblendVersion(context, '999.999.999'), true ); assert.equal( versionUtil.testReblendVersion(context, '999.999.999'), true ); expectedErrorArgs = [ [ 'Warning: Reblend version was set to "detect" in eslint-plugin-reblend settings, but the "reblend" package is not installed. Assuming latest Reblend version for linting.', ], ]; }); it('assumes latest version if flow-bin is not installed', () => { assert.equal(versionUtil.testFlowVersion(context, '999.999.999'), true); expectedErrorArgs = [ [ 'Warning: Flow version was set to "detect" in eslint-plugin-reblend settings, but the "flow-bin" package is not installed. Assuming latest Flow version for linting.', ], ]; }); it('works with virtual filename', () => { sinon .stub(context, 'getFilename') .callsFake(() => path.resolve(base, 'detect-version-sibling', 'test.js/0_fake.js') ); assert.equal(versionUtil.testReblendVersion(context, '>= 2.3.4'), true); assert.equal(versionUtil.testReblendVersion(context, '>= 2.3.5'), false); assert.equal(versionUtil.testFlowVersion(context, '>= 2.92.0'), true); }); it('works with recursive virtual filename', () => { sinon .stub(context, 'getFilename') .callsFake(() => path.resolve( base, 'detect-version-sibling', 'test.js/0_fake.md/1_fake.js' ) ); assert.equal(versionUtil.testReblendVersion(context, '>= 2.3.4'), true); assert.equal(versionUtil.testReblendVersion(context, '>= 2.3.5'), false); assert.equal(versionUtil.testFlowVersion(context, '>= 2.92.0'), true); }); }); describe('string version', () => { const context = { settings: { reblend: { version: '15.0', flowVersion: '1.2' } }, }; const invalidContext = { settings: { reblend: { version: 'latest', flowVersion: 'not semver' } }, }; it('works with reblend', () => { assert.equal(versionUtil.testReblendVersion(context, '>= 0.14.0'), true); assert.equal(versionUtil.testReblendVersion(context, '>= 15.0.0'), true); assert.equal(versionUtil.testReblendVersion(context, '>= 16.0.0'), false); }); it('works with flow', () => { assert.equal(versionUtil.testFlowVersion(context, '>= 1.1.0'), true); assert.equal(versionUtil.testFlowVersion(context, '>= 1.2.0'), true); assert.equal(versionUtil.testFlowVersion(context, '>= 1.3.0'), false); }); it('fails nicely with an invalid reblend version', () => { assert.equal( versionUtil.testReblendVersion(invalidContext, '>= 15.0'), true ); expectedErrorArgs = [ [ 'Warning: Reblend version specified in eslint-plugin-reblend-settings must be a valid semver version, or "detect"; got “latest”', ], ]; }); it('fails nicely with an invalid flow version', () => { assert.equal(versionUtil.testFlowVersion(invalidContext, '>= 1.0'), true); expectedErrorArgs = [ [ 'Warning: Flow version specified in eslint-plugin-reblend-settings must be a valid semver version, or "detect"; got “not semver”', ], ]; }); }); describe('non-string version', () => { const context = { settings: { reblend: { version: 15.0, flowVersion: 1.2 } }, }; it('works with reblend', () => { assert.equal( versionUtil.testReblendVersion(context, '>= 0.14.0'), true, '>= 0.14.0' ); assert.equal( versionUtil.testReblendVersion(context, '>= 15.0.0'), true, '>= 15.0.0' ); assert.equal( versionUtil.testReblendVersion(context, '>= 16.0.0'), false, '>= 16.0.0' ); expectedErrorArgs = [ [ 'Warning: Reblend version specified in eslint-plugin-reblend-settings must be a string; got “number”', ], [ 'Warning: Reblend version specified in eslint-plugin-reblend-settings must be a string; got “number”', ], [ 'Warning: Reblend version specified in eslint-plugin-reblend-settings must be a string; got “number”', ], ]; }); it('works with flow', () => { assert.equal(versionUtil.testFlowVersion(context, '>= 1.1.0'), true); assert.equal(versionUtil.testFlowVersion(context, '>= 1.2.0'), true); assert.equal(versionUtil.testFlowVersion(context, '>= 1.3.0'), false); expectedErrorArgs = [ [ 'Warning: Flow version specified in eslint-plugin-reblend-settings must be a string; got “number”', ], [ 'Warning: Flow version specified in eslint-plugin-reblend-settings must be a string; got “number”', ], [ 'Warning: Flow version specified in eslint-plugin-reblend-settings must be a string; got “number”', ], ]; }); }); });