check-packages
Version:
CLI tool to check your npm dependencies against a list of allowed/forbidden packages.
140 lines (119 loc) • 3.97 kB
JavaScript
;
const readChecklistFile = require('./read-checklist-file');
const readDependencies = require('./read-dependencies');
const analyzeDependencies = require('./analyze-dependencies');
jest.mock('./read-checklist-file', () => jest.fn());
jest.mock('./read-dependencies', () => jest.fn());
const exampleDependencyTree = {
name: 'A',
version: '1.0.0',
dependencies: {
AA: {
version: '1.1.0',
dependencies: {
AAA: {
version: '1.1.1',
dependencies: {
AB: {
version: '1.1.5'
}
}
}
}
},
AB: {
version: '1.1.1',
dependencies: {
AABB: {
version: '1.1.3'
}
}
}
}
};
describe('analyzeDependencies', () => {
beforeEach(() => {
readChecklistFile.mockReset();
readDependencies.mockReset();
});
it('does not crash when options null', () => {
const expected = { error: 'Options must not be null or undefined.', unallowedPackages: [], warning: '' };
const actual = analyzeDependencies(null);
expect(actual).toEqual(expected);
});
it('does not crash when reading of checklist file failed', () => {
readChecklistFile.mockImplementation(() => {
throw new Error('File not found!');
});
const options = {
pathToChecklistFile: './path/to/whitelist.json'
};
const expected = { error: 'Reading checklist failed! Error: File not found!', unallowedPackages: [], warning: '' };
const actual = analyzeDependencies(options);
expect(actual).toEqual(expected);
});
it('does not crash when reading of installed packages failed', () => {
readDependencies.mockImplementation(() => {
throw new Error('Fatal npm ls error.');
});
const options = {
pathToChecklistFile: './path/to/whitelist.json'
};
const expected = { error: 'Reading installed packages failed! Error: Fatal npm ls error.', unallowedPackages: [], warning: '' };
const actual = analyzeDependencies(options);
expect(actual).toEqual(expected);
});
it('takes warnings from readDependencies', () => {
readChecklistFile.mockImplementation(() => []);
readDependencies.mockImplementation(() => ({
tree: {},
problems: 'peer dependencies missing!'
}));
const options = {
pathToChecklistFile: './path/to/whitelist.json'
};
const expected = {
error: '',
unallowedPackages: [],
verboseOutput: '',
warning: 'peer dependencies missing!'
};
const actual = analyzeDependencies(options);
expect(actual).toEqual(expected);
});
it('returns expected object when packages whitelisting analyzed successfully', () => {
readChecklistFile.mockImplementation(() => [{ packageName: 'A' }, { packageName: 'AA' }]);
readDependencies.mockImplementation(() => ({
tree: exampleDependencyTree
}));
const options = {
pathToChecklistFile: './path/to/whitelist.json'
};
const expected = {
error: '',
unallowedPackages: [ 'AAA', 'AABB', 'AB' ],
verboseOutput: '- AAA [1.1.1]\n- AABB [1.1.3]\n- AB [1.1.1, 1.1.5]',
warning: ''
};
const actual = analyzeDependencies(options);
expect(actual).toEqual(expected);
});
it('returns expected object when packages blacklisting analyzed successfully', () => {
readChecklistFile.mockImplementation(() => [{ packageName: 'AAA' }, { packageName: 'AABB' }, { packageName: 'AB' }]);
readDependencies.mockImplementation(() => ({
tree: exampleDependencyTree
}));
const options = {
pathToChecklistFile: './path/to/whitelist.json',
blacklist: true
};
const expected = {
error: '',
unallowedPackages: [ 'AAA', 'AABB', 'AB' ],
verboseOutput: '- AAA [1.1.1]\n- AABB [1.1.3]\n- AB [1.1.1, 1.1.5]',
warning: ''
};
const actual = analyzeDependencies(options);
expect(actual).toEqual(expected);
});
});