license-check-and-add
Version:
A tool to enable the checking, inserting and removal of licenses
273 lines (209 loc) • 9.69 kB
text/typescript
import * as chai from 'chai';
import * as fs from 'fs-extra';
import * as mockery from 'mockery';
import { EOL } from 'os';
import * as path from 'path';
import * as sinon from 'sinon';
import sinonChai from 'sinon-chai';
import { DEFAULT_FORMATS } from '../constants';
import { TrailingWhitespaceMode } from './config-parser';
import { IFormatCollection, ILicenseFormat, LicenseFormatter } from './license-formatter';
const expect = chai.expect;
chai.use(sinonChai);
describe ('#LicenseFormatter', () => {
const mockDefaultFormat: ILicenseFormat = {
append: 'DEFAULT ',
prepend: 'DEFAULT ',
};
const mockFormats: IFormatCollection = {
css: {
eachLine: {
append: ' */',
prepend: '/*',
},
prepend: ' * ',
},
js: {
eachLine: {
append: ' */',
prepend: '/*',
},
prepend: ' * ',
},
sh: {
eachLine: {
prepend: '# ',
},
},
};
let sandbox: sinon.SinonSandbox;
let separateStub: sinon.SinonStub;
beforeEach (() => {
sandbox = sinon.createSandbox();
});
afterEach(() => {
sandbox.restore();
});
describe ('constructor', () => {
beforeEach (() => {
separateStub = sandbox.stub(LicenseFormatter.prototype as any, 'separateFileTypesInFormat').onFirstCall().returns(mockFormats);
});
it ('should configure all values and set default formats as the license formats', () => {
const lf: LicenseFormatter = new LicenseFormatter(mockDefaultFormat, TrailingWhitespaceMode.TRIM);
expect(separateStub.callCount).to.equal(1);
expect(separateStub).to.have.been.calledOnceWithExactly(DEFAULT_FORMATS);
expect(lf.defaultFormat).to.deep.equal(mockDefaultFormat);
expect(lf.stripTrailingWhitespace).to.equal(true);
expect(lf.licenseFormats).to.deep.equal(mockFormats);
});
it ('should configure all values and set default formats as the license formats combined with passed formats', () => {
const declaredFormats = {
html: {
append: '-->',
prepend: '<!--',
},
js: {
eachLine: {
prepend: '// ',
},
},
};
separateStub.onSecondCall().returns(declaredFormats);
const lf: LicenseFormatter = new LicenseFormatter(mockDefaultFormat, TrailingWhitespaceMode.TRIM, declaredFormats);
expect(separateStub.callCount).to.equal(2);
expect(separateStub.getCall(0).args).to.deep.equal([DEFAULT_FORMATS]);
expect(separateStub.getCall(1).args).to.deep.equal([declaredFormats]);
expect(lf.defaultFormat).to.deep.equal(mockDefaultFormat);
expect(lf.stripTrailingWhitespace).to.equal(true);
expect(lf.licenseFormats).to.deep.equal(Object.assign(mockFormats, declaredFormats));
expect(lf.licenseFormats.js).to.deep.equal(declaredFormats.js);
});
});
describe ('formatLicenseForFile', () => {
beforeEach (() => {
separateStub = sandbox.stub(LicenseFormatter.prototype as any, 'separateFileTypesInFormat').onFirstCall().returns(mockFormats);
});
const mockLicenseText = fs.readFileSync(path.resolve(__dirname, '../../test/non-regex/original-files/LICENSE'), 'utf-8');
it ('should use an already formatted license file when one specified', () => {
mockery.enable({
warnOnReplace: false,
warnOnUnregistered: false,
});
const fsReadFileStub = sandbox.stub().returns('some license');
mockery.registerMock('fs-extra', { readFileSync: fsReadFileStub });
delete require.cache[require.resolve('./license-formatter')];
const mockeriedLicenseFormatter = require('./license-formatter').LicenseFormatter;
separateStub = sandbox.stub(mockeriedLicenseFormatter.prototype as any, 'separateFileTypesInFormat').onFirstCall()
.returns(mockFormats);
const lf: LicenseFormatter = new mockeriedLicenseFormatter(mockDefaultFormat, TrailingWhitespaceMode.TRIM);
(lf as any).defaultFormat = {
file: 'some file',
};
const formatted = lf.formatLicenseForFile('ext', mockLicenseText);
expect(formatted).to.deep.equal('some license');
mockery.disable();
delete require.cache[require.resolve('./license-formatter')];
});
it ('should prepend a license', () => {
const testDefaultFormat: ILicenseFormat = {
prepend: '###',
};
const lf: LicenseFormatter = new LicenseFormatter(testDefaultFormat, TrailingWhitespaceMode.DEFAULT);
const formatted = lf.formatLicenseForFile('ext', mockLicenseText);
expect(formatted).to.deep.equal(`###\n${mockLicenseText}`);
});
it ('should append a license', () => {
const testDefaultFormat: ILicenseFormat = {
append: '~~~',
};
const lf: LicenseFormatter = new LicenseFormatter(testDefaultFormat, TrailingWhitespaceMode.DEFAULT);
const formatted = lf.formatLicenseForFile('ext', mockLicenseText);
expect(formatted).to.deep.equal(`${mockLicenseText}\n~~~`);
});
it ('should prepend and append a license', () => {
const testDefaultFormat: ILicenseFormat = {
append: '~~~',
prepend: '###',
};
const lf: LicenseFormatter = new LicenseFormatter(testDefaultFormat, TrailingWhitespaceMode.DEFAULT);
const formatted = lf.formatLicenseForFile('ext', mockLicenseText);
expect(formatted).to.deep.equal(`###\n${mockLicenseText}\n~~~`);
});
it ('should prepend each line', () => {
const testDefaultFormat: ILicenseFormat = {
eachLine: {
prepend: '### ',
},
};
const lf: LicenseFormatter = new LicenseFormatter(testDefaultFormat, TrailingWhitespaceMode.DEFAULT);
const formatted = lf.formatLicenseForFile('ext', mockLicenseText);
expect(formatted).to.deep.equal(mockLicenseText.split(/\r\n|\n/).map((line) => '### ' + line).join(EOL));
});
it ('should append each line', () => {
const testDefaultFormat: ILicenseFormat = {
eachLine: {
append: '~~~',
},
};
const lf: LicenseFormatter = new LicenseFormatter(testDefaultFormat, TrailingWhitespaceMode.DEFAULT);
const formatted = lf.formatLicenseForFile('ext', mockLicenseText);
expect(formatted).to.deep.equal(mockLicenseText.split(/\r\n|\n/).map((line) => line + '~~~').join(EOL));
});
it ('should prepend and append each line of a license', () => {
const testDefaultFormat: ILicenseFormat = {
eachLine: {
append: '~~~',
prepend: '### ',
},
};
const lf: LicenseFormatter = new LicenseFormatter(testDefaultFormat, TrailingWhitespaceMode.DEFAULT);
const formatted = lf.formatLicenseForFile('ext', mockLicenseText);
expect(formatted).to.deep.equal(mockLicenseText.split(/\r\n|\n/).map((line) => '### ' + line + '~~~').join(EOL));
});
it ('should remove trailing whitespace on lines', () => {
const testDefaultFormat: ILicenseFormat = {
eachLine: {
prepend: '# ',
},
};
const lf: LicenseFormatter = new LicenseFormatter(testDefaultFormat, TrailingWhitespaceMode.TRIM);
const formatted = lf.formatLicenseForFile('ext', `license
with
blank
lines`);
expect(formatted).to.deep.equal(`# license
# with
#
# blank
# lines`);
});
it ('should select matching formatting from specified formats', () => {
const lf: LicenseFormatter = new LicenseFormatter(mockDefaultFormat, TrailingWhitespaceMode.DEFAULT);
(lf as any).licenseFormats = mockFormats;
const formatted = lf.formatLicenseForFile('sh', mockLicenseText);
expect(formatted).to.deep.equal(mockLicenseText.split(/\r\n|\n/).map((line) => '# ' + line).join(EOL));
});
});
describe ('separateFileTypesInFormat', () => {
const lf: LicenseFormatter = new LicenseFormatter(mockDefaultFormat, TrailingWhitespaceMode.DEFAULT);
it ('should split keys on pipe symbol and not include a dot for those starting with ^', () => {
const prependVal: ILicenseFormat = {
prepend: 'this',
};
const appendVal: ILicenseFormat = {
prepend: 'this',
};
const obj: IFormatCollection = {
'some|^delimitted': prependVal,
'useful|keys': appendVal,
};
const splitObj = (lf as any).separateFileTypesInFormat(obj);
expect(splitObj).to.deep.equal({
'.keys': appendVal,
'.some': prependVal,
'.useful': appendVal,
delimitted: prependVal,
});
});
});
});