qerrors
Version:
Intelligent error handling middleware with AI-powered analysis, environment validation, caching, and production-ready logging. Provides OpenAI-based error suggestions, queue management, retry mechanisms, and comprehensive configuration options for Node.js
79 lines (69 loc) • 2.83 kB
JavaScript
const test = require('node:test'); //node test runner
const assert = require('node:assert/strict'); //assert helpers
const qtests = require('qtests'); //stubbing util
function withEnv(vars) {
const orig = {};
Object.entries(vars).forEach(([k, v]) => { orig[k] = process.env[k]; if (v === undefined) { delete process.env[k]; } else { process.env[k] = v; } });
return () => { Object.entries(orig).forEach(([k, v]) => { if (v === undefined) { delete process.env[k]; } else { process.env[k] = v; } }); };
}
function reloadConfig() {
delete require.cache[require.resolve('../lib/config')];
return require('../lib/config');
}
// Scenario: getEnv returns environment variable when set
test('getEnv returns env var when present', () => {
const restore = withEnv({ TEST_VAL: 'xyz' });
const cfg = reloadConfig();
try {
assert.equal(cfg.getEnv('TEST_VAL'), 'xyz'); //returns provided env value
} finally { restore(); }
});
// Scenario: getEnv falls back to default when undefined
test('getEnv falls back to default', () => {
const restore = withEnv({ QERRORS_QUEUE_LIMIT: undefined });
const cfg = reloadConfig();
try {
assert.equal(cfg.getEnv('QERRORS_QUEUE_LIMIT'), '100'); //falls back to default
} finally { restore(); }
});
// Scenario: safeRun returns function result
test('safeRun returns result', () => {
const cfg = reloadConfig();
const res = cfg.safeRun('fn', () => 5, 0);
assert.equal(res, 5); //returns function output
});
// Scenario: safeRun catches error and returns fallback
test('safeRun returns fallback on error', () => {
const cfg = reloadConfig();
let msg;
const restoreErr = qtests.stubMethod(console, 'error', m => { msg = m; });
try {
const out = cfg.safeRun('fn', () => { throw new Error('boom'); }, 7, 'info');
assert.equal(out, 7); //fallback value used
assert.ok(msg.includes('fn failed')); //error logged for context
} finally { restoreErr(); }
});
// Scenario: getInt parses env value
test('getInt parses integer env value', () => {
const restore = withEnv({ QERRORS_TIMEOUT: '9000' });
const cfg = reloadConfig();
try {
assert.equal(cfg.getInt('QERRORS_TIMEOUT'), 9000); //parses integer env
} finally { restore(); }
});
// Scenario: getInt falls back to default on invalid env
test('getInt uses default when env invalid', () => {
const restore = withEnv({ QERRORS_TIMEOUT: 'abc' });
const cfg = reloadConfig();
try {
assert.equal(cfg.getInt('QERRORS_TIMEOUT'), 10000); //invalid env uses default
} finally { restore(); }
});
// Scenario: getInt enforces minimum value
test('getInt enforces minimum bound', () => {
const restore = withEnv({ QERRORS_TIMEOUT: '1' });
const cfg = reloadConfig();
try {
assert.equal(cfg.getInt('QERRORS_TIMEOUT', 5), 5); //result respects minimum
} finally { restore(); }
});