Skip to content

Commit

Permalink
refactor: improve test factory
Browse files Browse the repository at this point in the history
  • Loading branch information
thetutlage committed Sep 25, 2023
1 parent 9dce0e9 commit 239a5dd
Show file tree
Hide file tree
Showing 7 changed files with 162 additions and 178 deletions.
4 changes: 2 additions & 2 deletions examples/dot.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { runner } from '../factories/main.js'
import { dot } from '../src/reporters/main.js'
import { createDiverseTests, runner } from '../factories/main.js'

await runner()
.configure({
Expand All @@ -9,4 +9,4 @@ await runner()
activated: ['dot'],
},
})
.run()
.runSuites(createDiverseTests)
4 changes: 2 additions & 2 deletions examples/ndjson.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { runner } from '../factories/main.js'
import { ndjson } from '../src/reporters/main.js'
import { createDiverseTests, runner } from '../factories/main.js'

await runner()
.configure({
Expand All @@ -9,4 +9,4 @@ await runner()
activated: ['ndjson'],
},
})
.run()
.runSuites(createDiverseTests)
4 changes: 2 additions & 2 deletions examples/spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { runner } from '../factories/main.js'
import { spec } from '../src/reporters/main.js'
import { createDiverseTests, runner } from '../factories/main.js'

await runner()
.configure({
Expand All @@ -9,4 +9,4 @@ await runner()
activated: ['spec'],
},
})
.run()
.runSuites(createDiverseTests)
120 changes: 120 additions & 0 deletions factories/create_diverse_tests.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import assert from 'node:assert'
import { Suite, Emitter, Refiner } from '../modules/core/main.js'
import { createTest, createTestGroup } from '../src/create_test.js'

/**
* Creates a unit tests suite with bunch of dummy tests
* reproducing different tests behavior
*/
function createUnitTestsSuite(emitter: Emitter, refiner: Refiner, file?: string) {
const suite = new Suite('unit', emitter, refiner)
const group = createTestGroup('Maths#add', emitter, refiner, {
suite,
file,
})

createTest('A top level test inside a suite', emitter, refiner, {
suite,
file,
}).run(() => {})

createTest('add two numbers', emitter, refiner, { group, file }).run(() => {
assert.equal(2 + 2, 4)
})
createTest('add three numbers', emitter, refiner, {
group,
file,
}).run(() => {
assert.equal(2 + 2 + 2, 6)
})

createTest('add group of numbers', emitter, refiner, { group, file })
createTest('use math.js lib', emitter, refiner, { group, file }).skip(
true,
'Library work pending'
)
createTest('add multiple numbers', emitter, refiner, {
file,
group,
}).run(() => {
assert.equal(2 + 2 + 2 + 2, 6)
})
createTest('add floating numbers', emitter, refiner, { group, file })
.run(() => {
assert.equal(2 + 2.2 + 2.1, 6)
})
.fails('Have to add support for floating numbers')
createTest('A test with an error that is not an AssertionError', emitter, refiner, {
group,
file,
}).run(() => {
throw new Error('This is an error')
})

return suite
}

/**
* Creates a unit functional suite with bunch of dummy tests
* reproducing different tests behavior
*/
function createFunctionalTestsSuite(emitter: Emitter, refiner: Refiner, file?: string) {
const suite = new Suite('functional', emitter, refiner)

const group = createTestGroup('Users/store', emitter, refiner, {
suite,
file: file,
})
createTest('Validate user data', emitter, refiner, {
group,
file: file,
}).run(() => {})
createTest('Disallow duplicate emails', emitter, refiner, {
group,
file: file,
}).run(() => {})
createTest('Disallow duplicate emails across tenants', emitter, refiner, {
group,
file: file,
}).run(() => {
const users = ['', '']
assert.equal(users.length, 1)
})
createTest('Normalize email before persisting it', emitter, refiner, {
group,
file: file,
}).skip(true, 'Have to build a normalizer')
createTest('Send email verification mail', emitter, refiner, {
group,
file: file,
})

const usersListGroup = createTestGroup('Users/list', emitter, refiner, {
suite,
file: file,
})
usersListGroup.setup(() => {
throw new Error('Unable to cleanup database')
})
createTest('A test that will never because the group hooks fails', emitter, refiner, {
group: usersListGroup,
})

createTest('A top level test inside functional suite', emitter, refiner, {
suite,
file: file,
}).run(() => {})

return suite
}

/**
* Returns an array of suites with dummy tests reproducting
* different test behavior
*/
export function createDiverseTests(emitter: Emitter, refiner: Refiner, file?: string): Suite[] {
return [
createUnitTestsSuite(emitter, refiner, file),
createFunctionalTestsSuite(emitter, refiner, file),
]
}
13 changes: 13 additions & 0 deletions factories/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,22 @@
* file that was distributed with this source code.
*/

import { ReporterContract } from '../src/types.js'
import { RunnerFactory } from './runner.js'

/**
* Create an instance of the runner factory
*/
export const runner = () => new RunnerFactory()
export { createDiverseTests } from './create_diverse_tests.js'
export const syncReporter: ReporterContract = {
name: 'sync',
handler(r, emitter) {
emitter.on('runner:end', function () {
const summary = r.getSummary()
if (summary.hasError) {
throw summary.failureTree[0].children[0].errors[0].error
}
})
},
}
Loading

0 comments on commit 239a5dd

Please sign in to comment.