Files
2026-11-13 11:50:48 +01:00

82 lines
2.4 KiB
JavaScript

import assert from 'node:assert/strict'
import test from 'node:test'
import { createLogger } from '../src/logger.js'
function capture() {
const lines = []
return {
lines,
stream: {
write(line) {
lines.push(line)
},
},
}
}
test('writes readable text logs and hides debug lines by default', () => {
const sink = capture()
const logger = createLogger({
level: 'info',
format: 'text',
stream: sink.stream,
bindings: { app: 'test' },
})
logger.debug('hidden detail', { value: 1 })
logger.info('server started', { port: 8080, name: 'a b' })
logger.warn('careful', { attempt: 2 })
assert.equal(sink.lines.length, 2)
assert.match(sink.lines[0], /^\d{4}-\d{2}-\d{2}T/)
assert.match(sink.lines[0], /INFO {2}server started app=test port=8080 name="a b"/)
assert.match(sink.lines[1], /WARN {2}careful app=test attempt=2/)
})
test('redacts credentials but keeps configuration booleans', () => {
const sink = capture()
const logger = createLogger({ level: 'info', stream: sink.stream })
logger.info('config', {
apiKey: 'secret-value',
WIKI_API_KEY: 'secret-value',
apiKeyConfigured: true,
password: 'hunter2',
normal: 'visible',
})
const line = sink.lines.join('')
assert.doesNotMatch(line, /secret-value|hunter2/)
assert.match(line, /apiKey=\[redacted\]/)
assert.match(line, /WIKI_API_KEY=\[redacted\]/)
assert.match(line, /apiKeyConfigured=true/)
assert.match(line, /normal=visible/)
})
test('emits one JSON object per line with error details', () => {
const sink = capture()
const logger = createLogger({ level: 'debug', format: 'json', stream: sink.stream })
const error = Object.assign(new Error('request failed'), { code: 'WIKI_ERROR', status: 502 })
logger.child({ jobId: 'job-1' }).error('export failed', { error, apiKey: 'nope' })
assert.equal(sink.lines.length, 1)
const record = JSON.parse(sink.lines[0])
assert.equal(record.level, 'error')
assert.equal(record.message, 'export failed')
assert.equal(record.jobId, 'job-1')
assert.equal(record.apiKey, '[redacted]')
assert.equal(record.error.message, 'request failed')
assert.equal(record.error.code, 'WIKI_ERROR')
assert.match(record.error.stack, /request failed/)
})
test('silent level disables all output', () => {
const sink = capture()
const logger = createLogger({ level: 'silent', stream: sink.stream })
logger.error('nothing here')
assert.equal(sink.lines.length, 0)
})