67 lines
1.6 KiB
TypeScript
67 lines
1.6 KiB
TypeScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import type { Server } from 'node:http'
|
|
|
|
import { createShutdownController } from './shutdown.js'
|
|
import type { StartupState } from './state.js'
|
|
|
|
function createStartupState(): StartupState {
|
|
return {
|
|
phase: 'ready',
|
|
core: {
|
|
running: false,
|
|
ready: true,
|
|
attemptCount: 1,
|
|
lastAttemptAt: '',
|
|
lastError: '',
|
|
readyAt: '',
|
|
},
|
|
process: {
|
|
lastUnhandledRejection: null,
|
|
lastUncaughtException: null,
|
|
},
|
|
}
|
|
}
|
|
|
|
test('shutdown closes the HTTP server and database pool', async () => {
|
|
let serverClosed = false
|
|
let databaseClosed = false
|
|
const server = {
|
|
listening: true,
|
|
close(callback: (error?: Error) => void) {
|
|
serverClosed = true
|
|
callback()
|
|
},
|
|
} as unknown as Server
|
|
const controller = createShutdownController(server, createStartupState(), {
|
|
closeDatabase: async () => {
|
|
databaseClosed = true
|
|
},
|
|
})
|
|
|
|
await controller.shutdown('test')
|
|
|
|
assert.equal(serverClosed, true)
|
|
assert.equal(databaseClosed, true)
|
|
assert.equal(controller.isShutdownStarted(), true)
|
|
})
|
|
|
|
test('shutdown closes the database pool when the server is already stopped', async () => {
|
|
let databaseClosed = false
|
|
const server = {
|
|
listening: false,
|
|
close() {
|
|
throw new Error('close should not be called')
|
|
},
|
|
} as unknown as Server
|
|
const controller = createShutdownController(server, createStartupState(), {
|
|
closeDatabase: async () => {
|
|
databaseClosed = true
|
|
},
|
|
})
|
|
|
|
await controller.shutdown('test')
|
|
|
|
assert.equal(databaseClosed, true)
|
|
})
|