@interaktiv/dia-scripts
Version:
CLI toolbox with common scripts for most sort of projects at DIA
150 lines (121 loc) • 4.44 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _path = _interopRequireDefault(require("path"));
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _tempy = _interopRequireDefault(require("tempy"));
var _serializers = require("./__tests__/helpers/serializers");
expect.addSnapshotSerializer(_serializers.unquoteSerializer);
expect.addSnapshotSerializer(_serializers.winPathSerializer);
jest.mock('read-pkg-up', () => ({
sync: jest.fn(() => ({
package: {
name: 'dia-scripts-test'
},
path: '/blah/package.json'
}))
}));
jest.mock('is-ci', () => false);
let originalArgv, originalEnv, originalExit, crossSpawnSyncMock, originalConsoleLog, readPkgUpSyncMock, testDirectory, consoleLogMock;
describe('run git', () => {
beforeEach(() => {
({
sync: crossSpawnSyncMock
} = require('cross-spawn'));
readPkgUpSyncMock = require('read-pkg-up').sync;
originalConsoleLog = console.log;
originalEnv = process.env;
originalArgv = process.argv;
originalExit = process.exit;
console.log = jest.fn();
process.exit = jest.fn();
consoleLogMock = console.log;
testDirectory = _tempy.default.directory();
process.env.INIT_CWD = testDirectory;
});
afterEach(() => {
console.log = originalConsoleLog;
process.exit = originalExit;
process.env = originalEnv;
process.argv = originalArgv;
if (testDirectory != null) {
_fsExtra.default.removeSync(testDirectory);
testDirectory = null;
}
jest.resetModules();
});
function mockPkg({
pkg = {
name: 'dia-scripts-test'
},
pkgPath = '/blah/package.json'
}) {
readPkgUpSyncMock.mockImplementationOnce(() => ({
package: pkg,
path: pkgPath
}));
}
const fromHere = (...p) => _path.default.join(__dirname, ...p);
const createFromTemplate = (template, dest) => _fsExtra.default.copySync(fromHere(`./__tests__/fixtures/init/${template}`), dest);
it('should do nothing if running by self', () => {
createFromTemplate('self', testDirectory);
const pkgPath = _path.default.resolve(testDirectory, 'package.json');
mockPkg({
pkg: {
name: '@interaktiv/dia-scripts'
},
pkgPath
});
process.argv = ['node', './git', ...[]];
require('./git');
const [, logCall] = consoleLogMock.mock.calls;
const [log] = logCall;
expect(log).toEqual(expect.stringMatching(/skipping/));
});
it('should init a git repo', () => {
createFromTemplate('default', testDirectory);
const pkgPath = _path.default.resolve(testDirectory, 'package.json');
mockPkg({
pkgPath
});
crossSpawnSyncMock.mockReturnValueOnce({
status: 0
});
crossSpawnSyncMock.mockReturnValueOnce({
status: 1
});
process.argv = ['node', './git', ...[]];
require('./git');
crossSpawnSyncMock.mock.calls.map(([script, calledArgs]) => [script, ...calledArgs].join(' ')).forEach(c => expect(c).toMatchSnapshot());
const [lastCall] = crossSpawnSyncMock.mock.calls.slice(-1);
const [script, calledArgs] = lastCall;
expect([script, ...calledArgs].join(' ')).toEqual(expect.stringMatching(/init/));
});
it('should NOT init a git repo if one already exists', () => {
createFromTemplate('default', testDirectory);
const pkgPath = _path.default.resolve(testDirectory, 'package.json');
mockPkg({
pkgPath
});
process.argv = ['node', './git', ...[]];
require('./git');
crossSpawnSyncMock.mock.calls.map(([script, calledArgs]) => [script, ...calledArgs].join(' ')).forEach(c => expect(c).toMatchSnapshot());
const [lastCall] = crossSpawnSyncMock.mock.calls.slice(-1);
const [script, calledArgs] = lastCall;
expect([script, ...calledArgs].join(' ')).toEqual(expect.not.stringMatching(/init/));
});
it('should not run on CI', () => {
createFromTemplate('default', testDirectory);
const pkgPath = _path.default.resolve(testDirectory, 'package.json');
mockPkg({
pkgPath
});
jest.mock('is-ci', () => true);
process.argv = ['node', './git', ...[]];
require('./git');
expect(consoleLogMock).toHaveBeenCalledTimes(2);
const [, logCall] = consoleLogMock.mock.calls;
const [log] = logCall;
expect(log).toEqual(expect.stringMatching(/skipping/));
expect(crossSpawnSyncMock).toBeCalledTimes(0);
});
});