108 lines
3.1 KiB
JavaScript
108 lines
3.1 KiB
JavaScript
const test = require('node:test')
|
|
const assert = require('node:assert/strict')
|
|
const express = require('express')
|
|
|
|
const { createMockContext } = require('../src/context/createMockContext')
|
|
const registerMemberProfileRoute = require('../src/routes/ewl/edip/memberProfile')
|
|
|
|
function withEnv(overrides, fn) {
|
|
const previousValues = new Map()
|
|
|
|
for (const [key, value] of Object.entries(overrides)) {
|
|
previousValues.set(key, process.env[key])
|
|
if (value === undefined) {
|
|
delete process.env[key]
|
|
} else {
|
|
process.env[key] = value
|
|
}
|
|
}
|
|
|
|
try {
|
|
return fn()
|
|
} finally {
|
|
for (const [key, value] of previousValues.entries()) {
|
|
if (value === undefined) {
|
|
delete process.env[key]
|
|
} else {
|
|
process.env[key] = value
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
async function startMemberProfileApp(envOverrides = {}) {
|
|
return withEnv(envOverrides, async () => {
|
|
const context = createMockContext()
|
|
const app = express()
|
|
app.use(express.json({ limit: '2mb' }))
|
|
registerMemberProfileRoute({ app, context })
|
|
|
|
const server = await new Promise((resolve) => {
|
|
const instance = app.listen(0, '127.0.0.1', () => resolve(instance))
|
|
})
|
|
|
|
const address = server.address()
|
|
return {
|
|
baseUrl: `http://${address.address}:${address.port}`,
|
|
close: async () =>
|
|
new Promise((resolve, reject) => {
|
|
server.close((error) => {
|
|
if (error) {
|
|
reject(error)
|
|
return
|
|
}
|
|
resolve()
|
|
})
|
|
}),
|
|
}
|
|
})
|
|
}
|
|
|
|
test('member profile route returns forced 503 when configured', async () => {
|
|
const app = await startMemberProfileApp({
|
|
MOCK_MEMBER_PROFILE_FORCE_STATUS_CODE: '503',
|
|
MOCK_MEMBER_PROFILE_FORCE_ERROR_CODE: 'MOCK_503',
|
|
MOCK_MEMBER_PROFILE_FORCE_ERROR_MSG: 'Mock member profile unavailable',
|
|
MOCK_REDEEMED_PROMOTION_RECORDING_ENABLED: 'false',
|
|
})
|
|
|
|
try {
|
|
const response = await fetch(`${app.baseUrl}/ewl/edip/v1/member/profile`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ schema: {}, data: { accountNum: '80000001' } }),
|
|
})
|
|
const body = await response.json()
|
|
|
|
assert.equal(response.status, 503)
|
|
assert.equal(body.errorCode, 'MOCK_503')
|
|
assert.equal(body.message, 'Mock member profile unavailable')
|
|
} finally {
|
|
await app.close()
|
|
}
|
|
})
|
|
|
|
test('member profile route delays response when configured', async () => {
|
|
const app = await startMemberProfileApp({
|
|
MOCK_MEMBER_PROFILE_DELAY_MS: '120',
|
|
MOCK_REDEEMED_PROMOTION_RECORDING_ENABLED: 'false',
|
|
})
|
|
|
|
try {
|
|
const startedAt = Date.now()
|
|
const response = await fetch(`${app.baseUrl}/ewl/edip/v1/member/profile`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ schema: {}, data: { accountNum: '80000001' } }),
|
|
})
|
|
const elapsedMs = Date.now() - startedAt
|
|
const body = await response.json()
|
|
|
|
assert.equal(response.status, 200)
|
|
assert.equal(body.status, true)
|
|
assert.ok(elapsedMs >= 100, `expected delayed response, got ${elapsedMs}ms`)
|
|
} finally {
|
|
await app.close()
|
|
}
|
|
})
|