183 lines
6 KiB
JavaScript
183 lines
6 KiB
JavaScript
|
import assert from '../lib/assert.mjs'
|
||
|
import t from '../lib/eltro.mjs'
|
||
|
import { spy, stub } from '../index.mjs'
|
||
|
|
||
|
[spy, stub].forEach(function(tester, i) {
|
||
|
t.describe(`#${i === 0 ? 'spy' : 'stub'}()`, function() {
|
||
|
t.test('should keep track of call count', function() {
|
||
|
let spyer = tester()
|
||
|
assert.strictEqual(spyer.callCount, 0)
|
||
|
assert.notOk(spyer.called)
|
||
|
assert.strictEqual(spyer.firstCall, null)
|
||
|
assert.strictEqual(spyer.secondCall, null)
|
||
|
assert.strictEqual(spyer.thirdCall, null)
|
||
|
|
||
|
spyer()
|
||
|
assert.strictEqual(spyer.callCount, 1)
|
||
|
assert.ok(spyer.called)
|
||
|
assert.deepStrictEqual(spyer.firstCall, [])
|
||
|
assert.strictEqual(spyer.secondCall, null)
|
||
|
assert.strictEqual(spyer.thirdCall, null)
|
||
|
|
||
|
spyer()
|
||
|
assert.strictEqual(spyer.callCount, 2)
|
||
|
assert.ok(spyer.called)
|
||
|
assert.deepStrictEqual(spyer.firstCall, [])
|
||
|
assert.deepStrictEqual(spyer.secondCall, [])
|
||
|
assert.strictEqual(spyer.thirdCall, null)
|
||
|
|
||
|
spyer()
|
||
|
assert.strictEqual(spyer.callCount, 3)
|
||
|
assert.ok(spyer.called)
|
||
|
assert.deepStrictEqual(spyer.firstCall, [])
|
||
|
assert.deepStrictEqual(spyer.secondCall, [])
|
||
|
assert.deepStrictEqual(spyer.thirdCall, [])
|
||
|
|
||
|
spyer()
|
||
|
assert.strictEqual(spyer.callCount, 4)
|
||
|
})
|
||
|
|
||
|
t.test('should keep track of arguments used to call', function() {
|
||
|
const assertFirstArgs = 'asdf'
|
||
|
const assertSecondArgs = { a: 1 }
|
||
|
const assertThirdArgs = [{ b: 1 }, { c: 2 }]
|
||
|
let spyer = tester()
|
||
|
assert.notOk(spyer.called)
|
||
|
|
||
|
spyer(assertFirstArgs)
|
||
|
spyer(assertSecondArgs)
|
||
|
spyer(assertThirdArgs[0], assertThirdArgs[1])
|
||
|
assert.strictEqual(spyer.callCount, 3)
|
||
|
|
||
|
assert.strictEqual(spyer.onCall(0)[0], assertFirstArgs)
|
||
|
assert.strictEqual(spyer.onCall(1)[0], assertSecondArgs)
|
||
|
assert.strictEqual(spyer.onCall(2)[0], assertThirdArgs[0])
|
||
|
assert.strictEqual(spyer.onCall(2)[1], assertThirdArgs[1])
|
||
|
|
||
|
assert.strictEqual(spyer.firstCall[0], assertFirstArgs)
|
||
|
assert.strictEqual(spyer.secondCall[0], assertSecondArgs)
|
||
|
assert.strictEqual(spyer.thirdCall[0], assertThirdArgs[0])
|
||
|
assert.strictEqual(spyer.thirdCall[1], assertThirdArgs[1])
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
|
||
|
t.describe('#stub()', function() {
|
||
|
t.test('should support returns', function() {
|
||
|
const assertInput = { a : 1 }
|
||
|
const assertReturns = { b: 3 }
|
||
|
let s = stub()
|
||
|
assert.strictEqual(s(), undefined)
|
||
|
s.returns(assertReturns)
|
||
|
assert.strictEqual(s(assertInput), assertReturns)
|
||
|
assert.ok(s.called)
|
||
|
assert.strictEqual(s.callCount, 2)
|
||
|
assert.strictEqual(s.secondCall[0], assertInput)
|
||
|
})
|
||
|
|
||
|
t.test('should support throws', function() {
|
||
|
const assertInput = { a : 1 }
|
||
|
const assertThrows = new Error('testety test')
|
||
|
let s = stub()
|
||
|
assert.strictEqual(s(), undefined)
|
||
|
s.throws(assertThrows)
|
||
|
assert.throws(function() {
|
||
|
s(assertInput)
|
||
|
}, assertThrows)
|
||
|
assert.ok(s.called)
|
||
|
assert.strictEqual(s.callCount, 2)
|
||
|
assert.strictEqual(s.secondCall[0], assertInput)
|
||
|
})
|
||
|
|
||
|
t.test('should support resolves', async function() {
|
||
|
const assertInput = { a : 1 }
|
||
|
const assertReturns = { b: 3 }
|
||
|
let s = stub()
|
||
|
assert.strictEqual(s(), undefined)
|
||
|
s.resolves(assertReturns)
|
||
|
let promiser = s(assertInput)
|
||
|
assert.ok(promiser.then)
|
||
|
assert.strictEqual(typeof(promiser.then), 'function')
|
||
|
let output = await promiser
|
||
|
assert.strictEqual(output, assertReturns)
|
||
|
})
|
||
|
|
||
|
t.test('should support rejects', async function() {
|
||
|
const assertInput = { a : 1 }
|
||
|
const assertReturns = { b: 3 }
|
||
|
let s = stub()
|
||
|
assert.strictEqual(s(), undefined)
|
||
|
s.rejects(assertReturns)
|
||
|
let promiser = s(assertInput)
|
||
|
assert.ok(promiser.then)
|
||
|
assert.strictEqual(typeof(promiser.then), 'function')
|
||
|
let output = await assert.isRejected(promiser)
|
||
|
assert.strictEqual(output, assertReturns)
|
||
|
})
|
||
|
|
||
|
t.test('should support custom function overwrite', async function() {
|
||
|
const assertInput = { a : 1 }
|
||
|
const assertReturns = { b: 3 }
|
||
|
let ourCallCount = 50
|
||
|
let s = stub(function(input) {
|
||
|
ourCallCount++
|
||
|
assert.strictEqual(input, assertInput)
|
||
|
return assertReturns
|
||
|
})
|
||
|
assert.strictEqual(s(assertInput), assertReturns)
|
||
|
assert.ok(s.called)
|
||
|
assert.strictEqual(s.callCount, 1)
|
||
|
assert.strictEqual(ourCallCount, 51)
|
||
|
assert.strictEqual(s.firstCall[0], assertInput)
|
||
|
|
||
|
assert.throws(function() {
|
||
|
s(null)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
t.test('should support custom function overwrite after the fact', async function() {
|
||
|
const assertInput = { a : 1 }
|
||
|
const assertReturns = { b: 3 }
|
||
|
let ourCallCount = 0
|
||
|
let s = stub()
|
||
|
assert.strictEqual(s(null), undefined)
|
||
|
s.returnWith(function(input) {
|
||
|
ourCallCount++
|
||
|
assert.strictEqual(input, assertInput)
|
||
|
return assertReturns
|
||
|
})
|
||
|
assert.strictEqual(s(assertInput), assertReturns)
|
||
|
assert.ok(s.called)
|
||
|
assert.strictEqual(s.callCount, 2)
|
||
|
assert.strictEqual(ourCallCount, 1)
|
||
|
assert.strictEqual(s.secondCall[0], assertInput)
|
||
|
|
||
|
assert.throws(function() {
|
||
|
s(null)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
t.test('should throw if parameter is something else than a function', function() {
|
||
|
assert.ok(stub(null))
|
||
|
assert.ok(stub(0))
|
||
|
assert.ok(stub(''))
|
||
|
assert.strictEqual(stub(null)(), undefined)
|
||
|
assert.strictEqual(stub(0)(), undefined)
|
||
|
assert.strictEqual(stub('')(), undefined)
|
||
|
assert.throws(function() { stub([]) })
|
||
|
assert.throws(function() { stub({}) })
|
||
|
assert.throws(function() { stub(123) })
|
||
|
assert.throws(function() { stub('asdf') })
|
||
|
})
|
||
|
|
||
|
t.test('should throw if returnWith is called with something else than a function', function() {
|
||
|
assert.throws(function() { stub().returnWith(0) })
|
||
|
assert.throws(function() { stub().returnWith('') })
|
||
|
assert.throws(function() { stub().returnWith(null) })
|
||
|
assert.throws(function() { stub().returnWith([]) })
|
||
|
assert.throws(function() { stub().returnWith({}) })
|
||
|
assert.throws(function() { stub().returnWith(123) })
|
||
|
assert.throws(function() { stub().returnWith('asdf') })
|
||
|
})
|
||
|
})
|