Skip to content

Commit

Permalink
update test suite to use node:test assertions
Browse files Browse the repository at this point in the history
  • Loading branch information
nimesh0505 committed Sep 6, 2024
1 parent 1528753 commit 1658fd3
Showing 1 changed file with 69 additions and 70 deletions.
139 changes: 69 additions & 70 deletions test.js
Original file line number Diff line number Diff line change
@@ -1,87 +1,86 @@
'use strict'
const { test, beforeEach } = require('node:test')
const assert = require('node:assert')
const { test } = require('node:test')
const tty = require('node:tty')
const Hook = require('./')
const ttySupportColor = tty.isatty(process.stdout.fd)

const proxyquire = require('proxyquire')

test('pre-commit', async (t) => {
await t.test('is exported as a function', () => {
assert.strictEqual(typeof Hook, 'function')
await t.test('is exported as a function', (t) => {
t.assert.strictEqual(typeof Hook, 'function', 'Hook should be a function')
})

await t.test('can be initialized without a `new` keyword', () => {
await t.test('can be initialized without a `new` keyword', (t) => {
const hook = Hook(function () {}, {
ignorestatus: true
})

assert.strictEqual(hook instanceof Hook, true)
assert.strictEqual(typeof hook.parse, 'function')
t.assert.ok(hook instanceof Hook, 'hook should be an instance of Hook')
t.assert.strictEqual(typeof hook.parse, 'function', 'hook.parse should be a function')
})

await t.test('#parse', async (t) => {
let hook

beforeEach(() => {
t.beforeEach(() => {
hook = new Hook(function () {}, {
ignorestatus: true
})
})

await t.test('extracts configuration values from precommit.<flag>', () => {
await t.test('extracts configuration values from precommit.<flag>', (t) => {
hook.json = {
'precommit.silent': true
}

assert.strictEqual(hook.silent, false)
t.assert.strictEqual(hook.silent, false, 'hook.silent should initially be false')

hook.parse()

assert.strictEqual(hook.config.silent, true)
assert.strictEqual(hook.silent, true)
t.assert.strictEqual(hook.config.silent, true, 'hook.config.silent should be true after parsing')
t.assert.strictEqual(hook.silent, true, 'hook.silent should be true after parsing')
})

await t.test('extracts configuration values from pre-commit.<flag>', () => {
await t.test('extracts configuration values from pre-commit.<flag>', (t) => {
hook.json = {
'pre-commit.silent': true,
'pre-commit.colors': false
}

assert.strictEqual(hook.silent, false)
assert.strictEqual(hook.colors, ttySupportColor)
t.assert.strictEqual(hook.silent, false, 'hook.silent should initially be false')
t.assert.strictEqual(hook.colors, ttySupportColor, 'hook.colors should initially match ttySupportColor')

hook.parse()

assert.strictEqual(hook.config.silent, true)
assert.strictEqual(hook.silent, true)
assert.strictEqual(hook.colors, false)
t.assert.strictEqual(hook.config.silent, true, 'hook.config.silent should be true after parsing')
t.assert.strictEqual(hook.silent, true, 'hook.silent should be true after parsing')
t.assert.strictEqual(hook.colors, false, 'hook.colors should be false after parsing')
})

await t.test('normalizes the `pre-commit` to an array', () => {
await t.test('normalizes the `pre-commit` to an array', (t) => {
hook.json = {
'pre-commit': 'test, cows, moo'
}

hook.parse()

assert.strictEqual(hook.config.run.length, 3)
assert.deepStrictEqual(hook.config.run, ['test', 'cows', 'moo'])
t.assert.strictEqual(hook.config.run.length, 3, 'hook.config.run should have 3 items')
t.assert.deepStrictEqual(hook.config.run, ['test', 'cows', 'moo'], 'hook.config.run should contain the correct items')
})

await t.test('normalizes the `precommit` to an array', () => {
await t.test('normalizes the `precommit` to an array', (t) => {
hook.json = {
precommit: 'test, cows, moo'
}

hook.parse()

assert.strictEqual(hook.config.run.length, 3)
assert.deepStrictEqual(hook.config.run, ['test', 'cows', 'moo'])
t.assert.strictEqual(hook.config.run.length, 3, 'hook.config.run should have 3 items')
t.assert.deepStrictEqual(hook.config.run, ['test', 'cows', 'moo'], 'hook.config.run should contain the correct items')
})

await t.test('allows `pre-commit` object based syntax', () => {
await t.test('allows `pre-commit` object based syntax', (t) => {
hook.json = {
'pre-commit': {
run: 'test scripts go here',
Expand All @@ -92,13 +91,13 @@ test('pre-commit', async (t) => {

hook.parse()

assert.strictEqual(hook.config.run.length, 4)
assert.deepStrictEqual(hook.config.run, ['test', 'scripts', 'go', 'here'])
assert.strictEqual(hook.silent, true)
assert.strictEqual(hook.colors, false)
t.assert.strictEqual(hook.config.run.length, 4, 'hook.config.run should have 4 items')
t.assert.deepStrictEqual(hook.config.run, ['test', 'scripts', 'go', 'here'], 'hook.config.run should contain the correct items')
t.assert.strictEqual(hook.silent, true, 'hook.silent should be true')
t.assert.strictEqual(hook.colors, false, 'hook.colors should be false')
})

await t.test('defaults to `test` if nothing is specified', () => {
await t.test('defaults to `test` if nothing is specified', (t) => {
hook.json = {
scripts: {
test: 'mocha test.js'
Expand All @@ -107,11 +106,11 @@ test('pre-commit', async (t) => {

hook.parse()

assert.strictEqual(hook.config.run.length, 1)
assert.deepStrictEqual(hook.config.run, ['test'])
t.assert.strictEqual(hook.config.run.length, 1, 'hook.config.run should have 1 item')
t.assert.deepStrictEqual(hook.config.run, ['test'], 'hook.config.run should contain the correct item')
})

await t.test('ignores the default npm.script.test placeholder', () => {
await t.test('ignores the default npm.script.test placeholder', (t) => {
hook.json = {
scripts: {
test: 'echo "Error: no test specified" && exit 1'
Expand All @@ -120,10 +119,10 @@ test('pre-commit', async (t) => {

hook.parse()

assert.strictEqual(typeof hook.config.run, 'undefined')
t.assert.strictEqual(typeof hook.config.run, 'undefined', 'hook.config.run should be undefined')
})

await t.test('overrides the `pre-commit` config property in package.json with the config inside `.pre-commit.json` if it exists', () => {
await t.test('overrides the `pre-commit` config property in package.json with the config inside `.pre-commit.json` if it exists', (t) => {
const Hook = proxyquire('.', {
'node:fs': {
existsSync () {
Expand All @@ -138,10 +137,10 @@ test('pre-commit', async (t) => {

hook = new Hook(function () {}, { ignorestatus: true })

assert.deepStrictEqual(hook.config.run, ['lint', 'bench'])
t.assert.deepStrictEqual(hook.config.run, ['lint', 'bench'], 'hook.config.run should contain the correct items')
})

await t.test('should properly handle errors while trying to read and parse the contents of `.pre-commit.json`', () => {
await t.test('should properly handle errors while trying to read and parse the contents of `.pre-commit.json`', (t) => {
let Hook = proxyquire('.', {
'node:fs': {
existsSync () {
Expand All @@ -167,61 +166,61 @@ test('pre-commit', async (t) => {
hook = new Hook(exit)

function exit (code, lines) {
assert.notStrictEqual(lines.length, 0)
assert.strictEqual(code, 1)
t.assert.ok(lines.length !== 0, 'lines should not be empty')
t.assert.strictEqual(code, 1, 'exit code should be 1')
}
})
})

await t.test('#log', async (t) => {
await t.test('prefixes the logs with `pre-commit`', () => {
await t.test('prefixes the logs with `pre-commit`', (t) => {
const hook = new Hook(function (code, lines) {
assert.strictEqual(code, 1)
assert.strictEqual(Array.isArray(lines), true)
t.assert.strictEqual(code, 1, 'exit code should be 1')
t.assert.ok(Array.isArray(lines), 'lines should be an array')

assert.strictEqual(lines[0], 'pre-commit: ')
assert.strictEqual(lines[1], 'pre-commit: foo')
assert.strictEqual(lines[2], 'pre-commit: ')
assert.strictEqual(lines.length, 3)
t.assert.ok(lines[0].includes('pre-commit: '), 'first line should start with `pre-commit: `')
t.assert.ok(lines[1].includes('pre-commit: foo'), 'second line should start with `pre-commit: foo`')
t.assert.ok(lines[2].includes('pre-commit: '), 'third line should start with `pre-commit: `')
t.assert.strictEqual(lines.length, 3, 'total lines should be 3')

// color prefix check
lines.forEach(function (line) {
assert.strictEqual(line.includes('\u001b'), ttySupportColor)
t.assert.strictEqual(line.includes('\u001b'), ttySupportColor)
})
}, { ignorestatus: true })

hook.config.silent = true
hook.log(['foo'])
})

await t.test('allows for a custom error code', () => {
await t.test('allows for a custom error code', (t) => {
const hook = new Hook(function (code, lines) {
assert.strictEqual(code, 0)
t.assert.strictEqual(code, 0, 'exit code should be 0')
}, { ignorestatus: true })

hook.config.silent = true
hook.log(['foo'], 0)
})

await t.test('allows strings to be split \\n', () => {
await t.test('allows strings to be split \\n', (t) => {
const hook = new Hook(function (code, lines) {
assert.strictEqual(code, 0)
t.assert.strictEqual(code, 0, 'exit code should be 0')

assert.strictEqual(lines.length, 4)
assert.strictEqual(lines[1], 'pre-commit: foo')
assert.strictEqual(lines[2], 'pre-commit: bar')
t.assert.strictEqual(lines.length, 4, 'total lines should be 4')
t.assert.ok(lines[1].includes('pre-commit: foo'), 'second line should start with `pre-commit: foo`')
t.assert.ok(lines[2].includes('pre-commit: bar'), 'third line should start with `pre-commit: bar`')
}, { ignorestatus: true })

hook.config.silent = true
hook.log('foo\nbar', 0)
})

await t.test('does not output colors when configured to do so', () => {
await t.test('does not output colors when configured to do so', (t) => {
const hook = new Hook(function (code, lines) {
assert.strictEqual(code, 0)
t.assert.strictEqual(code, 0, 'exit code should be 0')

lines.forEach(function (line) {
assert.strictEqual(line.includes('\u001b'), false)
t.assert.strictEqual(line.includes('\u001b'), false, 'line should not include color prefix')
})
}, { ignorestatus: true })

Expand All @@ -231,28 +230,28 @@ test('pre-commit', async (t) => {
hook.log('foo\nbar', 0)
})

await t.test('output lines to stderr if error code 1', () => {
await t.test('output lines to stderr if error code 1', (t) => {
const err = console.error
const hook = new Hook(function (code, lines) {
console.error = err
}, { ignorestatus: true })

console.error = function (line) {
assert.strictEqual(line.includes('pre-commit: '), true)
t.assert.ok(line.includes('pre-commit: '), true)
}

hook.config.colors = false
hook.log('foo\nbar', 1)
})

await t.test('output lines to stderr if error code 0', () => {
await t.test('output lines to stderr if error code 0', (t) => {
const log = console.log
const hook = new Hook(function (code, lines) {
console.log = log
}, { ignorestatus: true })

console.log = function (line) {
assert.strictEqual(line.includes('pre-commit: '), true)
t.assert.ok(line.includes('pre-commit: '), true)
}

hook.config.colors = false
Expand All @@ -261,27 +260,27 @@ test('pre-commit', async (t) => {
})

await t.test('#run', async (t) => {
await t.test('runs the specified scripts and exit with 0 on no error', () => {
await t.test('runs the specified scripts and exit with 0 on no error', (t) => {
const hook = new Hook(function (code, lines) {
assert.strictEqual(code, 0)
assert.strictEqual(typeof lines, 'undefined')
t.assert.strictEqual(code, 0, 'exit code should be 0')
t.assert.strictEqual(typeof lines, 'undefined', 'lines should be undefined')
}, { ignorestatus: true })

hook.config.run = ['example-pass']
hook.run()
})

await t.test('runs the specified test and exits with 1 on error', () => {
await t.test('runs the specified test and exits with 1 on error', (t) => {
const hook = new Hook(function (code, lines) {
assert.strictEqual(code, 1)
t.assert.strictEqual(code, 1, 'exit code should be 1')

assert.strictEqual(Array.isArray(lines), true)
assert.strictEqual(lines[1].includes('`example-fail`'), true)
assert.strictEqual(lines[2].includes('code (1)'), true)
t.assert.ok(Array.isArray(lines), 'lines should be an array')
t.assert.ok(lines[1].includes('`example-fail`'), true)
t.assert.ok(lines[2].includes('code (1)'), true)
}, { ignorestatus: true })

hook.config.run = ['example-fail']
hook.run()
})
})
})
})

0 comments on commit 1658fd3

Please sign in to comment.