UNPKG

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

45 lines (41 loc) 2.41 kB
const test = require('node:test'); //node test runner const assert = require('node:assert/strict'); //strict assertions const qtests = require('qtests'); //stubbing utilities const qerrors = require('../lib/qerrors'); //module under test const { axiosInstance } = qerrors; //axios instance used by qerrors const logger = require('../lib/logger'); //logger promise instance function createRes() { //minimal express like response mock return { headersSent: false, //flag for header state statusCode: null, //status tracking payload: null, //captured payload status(code) { this.statusCode = code; return this; }, //status setter json(data) { this.payload = data; return this; }, //json payload send(html) { this.payload = html; return this; } //html payload }; } test('qerrors integration logs error and analyzes context', async () => { // Use manual stubbing for wrapped functions (qtests.stubMethod has issues with these) const originalPost = axiosInstance.post; axiosInstance.post = async () => ({ data: { choices: [{ message: { content: { ok: true } } }] } }); const restoreAxios = () => { axiosInstance.post = originalPost; }; let logArg; //capture logger.error argument const realLogger = await logger; //resolve logger promise const origLog = realLogger.error; //store original function realLogger.error = (...args) => { logArg = args[0]; return origLog.apply(realLogger, args); }; //wrap logger.error to capture call //(wrap to spy while preserving) const origToken = process.env.OPENAI_API_KEY; //store token to restore after test process.env.OPENAI_API_KEY = 'tkn'; //set token for analyzeError to run const res = createRes(); //create mock res const err = new Error('boom'); //sample error try { await qerrors(err, 'spyCtx', {}, res); //invoke qerrors real functions await new Promise(r => setTimeout(r, 0)); //wait for queued analysis to finish } finally { restoreAxios(); //restore axios.post realLogger.error = origLog; //restore logger.error if (origToken === undefined) { delete process.env.OPENAI_API_KEY; } else { process.env.OPENAI_API_KEY = origToken; } //restore token after test } assert.ok(logArg.uniqueErrorName); //ensure log contains id assert.equal(logArg.uniqueErrorName, err.uniqueErrorName); //id matches error assert.equal(logArg.context, 'spyCtx'); //verify context was logged correctly });