You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
5.2 KiB
171 lines
5.2 KiB
'use strict' |
|
|
|
const fs = require('fs') |
|
const path = require('path') |
|
const mkdirp = require('mkdirp') |
|
const rimraf = require('rimraf') |
|
const tempy = require('tempy') |
|
const installFrom = require('../src/install') |
|
const uninstallFrom = require('../src/uninstall') |
|
|
|
function install(rootDir, dir) { |
|
installFrom(path.join(rootDir, dir)) |
|
} |
|
|
|
function uninstall(rootDir, dir) { |
|
uninstallFrom(path.join(rootDir, dir)) |
|
} |
|
|
|
function mkdir(rootDir, dir) { |
|
mkdirp.sync(path.join(rootDir, dir)) |
|
} |
|
|
|
function writeFile(dir, filePath, data) { |
|
fs.writeFileSync(path.join(dir, filePath), data) |
|
} |
|
|
|
function readFile(dir, filePath) { |
|
return fs.readFileSync(path.join(dir, filePath), 'utf-8') |
|
} |
|
|
|
function exists(dir, filePath) { |
|
return fs.existsSync(path.join(dir, filePath)) |
|
} |
|
|
|
describe('yorkie', () => { |
|
let dir |
|
beforeEach(() => (dir = tempy.directory())) |
|
afterEach(() => rimraf.sync(dir)) |
|
|
|
it('should support basic layout', () => { |
|
mkdir(dir, '.git/hooks') |
|
mkdir(dir, 'node_modules/yorkie') |
|
writeFile(dir, 'package.json', '{}') |
|
|
|
install(dir, '/node_modules/yorkie') |
|
const hook = readFile(dir, '.git/hooks/pre-commit') |
|
|
|
expect(hook).toMatch('#yorkie') |
|
expect(hook).toMatch('cd "."') |
|
expect(hook).toMatch(`node "./node_modules/yorkie/src/runner.js" pre-commit`) |
|
expect(hook).toMatch('--no-verify') |
|
|
|
const prepareCommitMsg = readFile(dir, '.git/hooks/prepare-commit-msg') |
|
expect(prepareCommitMsg).toMatch('cannot be bypassed') |
|
|
|
uninstall(dir, 'node_modules/yorkie') |
|
expect(exists(dir, '.git/hooks/pre-push')).toBeFalsy() |
|
}) |
|
|
|
it('should not install git hooks when installed in sub directory', () => { |
|
mkdir(dir, '.git/hooks') |
|
mkdir(dir, 'A/B/node_modules/yorkie') |
|
writeFile(dir, 'A/B/package.json', '{}') |
|
|
|
install(dir, 'A/B/node_modules/yorkie') |
|
expect(exists(dir, '.git/hooks/pre-commit')).toBeFalsy() |
|
}) |
|
|
|
it('should support git submodule', () => { |
|
mkdir(dir, '.git/modules/A/B') |
|
mkdir(dir, 'A/B/node_modules/yorkie') |
|
writeFile(dir, 'package.json', '{}') |
|
writeFile(dir, 'A/B/package.json', '{}') |
|
writeFile(dir, 'A/B/.git', 'git: ../../.git/modules/A/B') |
|
|
|
install(dir, 'A/B/node_modules/yorkie') |
|
const hook = readFile(dir, '.git/modules/A/B/hooks/pre-commit') |
|
|
|
expect(hook).toMatch('cd "."') |
|
|
|
uninstall(dir, 'A/B/node_modules/yorkie') |
|
expect(exists(dir, '.git/hooks/pre-push')).toBeFalsy() |
|
}) |
|
|
|
it('should not install git hooks in submodule sub directory', () => { |
|
mkdir(dir, '.git/modules/A/B') |
|
mkdir(dir, 'A/B/C/node_modules/yorkie') |
|
writeFile(dir, 'package.json', '{}') |
|
writeFile(dir, 'A/B/C/package.json', '{}') |
|
writeFile(dir, 'A/B/.git', 'git: ../../.git/modules/A/B') |
|
|
|
install(dir, 'A/B/C/node_modules/yorkie') |
|
expect(exists(dir, '.git/modules/A/B/hooks/pre-commit')).toBeFalsy() |
|
}) |
|
|
|
it('should support git worktrees', () => { |
|
mkdir(dir, '.git/worktrees/B') |
|
mkdir(dir, 'A/B/node_modules/yorkie') |
|
writeFile(dir, 'package.json', '{}') |
|
writeFile(dir, 'A/B/package.json', '{}') |
|
|
|
// Git path for worktrees is absolute |
|
const absolutePath = path.join(dir, '.git/worktrees/B') |
|
writeFile(dir, 'A/B/.git', `git: ${absolutePath}`) |
|
|
|
install(dir, 'A/B/node_modules/yorkie') |
|
const hook = readFile(dir, '.git/worktrees/B/hooks/pre-commit') |
|
|
|
expect(hook).toMatch('cd "."') |
|
|
|
uninstall(dir, 'A/B/node_modules/yorkie') |
|
expect(exists(dir, '.git/hooks/pre-commit')).toBeFalsy() |
|
}) |
|
|
|
it('should not modify user hooks', () => { |
|
mkdir(dir, '.git/hooks') |
|
mkdir(dir, 'node_modules/yorkie') |
|
writeFile(dir, '.git/hooks/pre-push', 'foo') |
|
|
|
// Verify that it's not overwritten |
|
install(dir, 'node_modules/yorkie') |
|
const hook = readFile(dir, '.git/hooks/pre-push') |
|
expect(hook).toBe('foo') |
|
|
|
uninstall(dir, 'node_modules/yorkie') |
|
expect(exists(dir, '.git/hooks/pre-push')).toBeTruthy() |
|
}) |
|
|
|
it('should not install from /node_modules/A/node_modules', () => { |
|
mkdir(dir, '.git/hooks') |
|
mkdir(dir, 'node_modules/A/node_modules/yorkie') |
|
|
|
install(dir, 'node_modules/A/node_modules/yorkie') |
|
expect(exists(dir, '.git/hooks/pre-push')).toBeFalsy() |
|
}) |
|
|
|
it("should not crash if there's no .git directory", () => { |
|
mkdir(dir, 'node_modules/yorkie') |
|
|
|
expect(() => install(dir, 'node_modules/yorkie')).not.toThrow() |
|
expect(() => uninstall(dir, 'node_modules/yorkie')).not.toThrow() |
|
}) |
|
|
|
it('should migrate existing scripts (ghooks)', () => { |
|
mkdir(dir, '.git/hooks') |
|
writeFile(dir, 'package.json', '{}') |
|
mkdir(dir, '/node_modules/yorkie') |
|
writeFile( |
|
dir, |
|
'.git/hooks/pre-commit', |
|
'// Generated by ghooks. Do not edit this file.' |
|
) |
|
|
|
install(dir, 'node_modules/yorkie') |
|
const hook = readFile(dir, '.git/hooks/pre-commit') |
|
expect(hook).toMatch('yorkie') |
|
expect(hook).not.toMatch('ghooks') |
|
}) |
|
|
|
it('should migrate existing scripts (pre-commit)', () => { |
|
mkdir(dir, '.git/hooks') |
|
writeFile(dir, 'package.json', '{}') |
|
mkdir(dir, '/node_modules/yorkie') |
|
writeFile(dir, '.git/hooks/pre-commit', './node_modules/pre-commit/hook') |
|
|
|
install(dir, 'node_modules/yorkie') |
|
const hook = readFile(dir, '.git/hooks/pre-commit') |
|
expect(hook).toMatch('yorkie') |
|
expect(hook).not.toMatch('./node_modules/pre-commit/hook') |
|
}) |
|
})
|
|
|