logaro
Version:
Structured logging middleware for Express. Tracks request timing, IP, status, method, and endpoint. Supports colorized console and JSON log files.
106 lines (105 loc) • 5.38 kB
JavaScript
;
// src/middleware.test.ts
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const supertest_1 = __importDefault(require("supertest"));
const express_1 = __importDefault(require("express"));
const index_1 = require("./index"); // Apne package exports
const logger_1 = __importDefault(require("./logger")); // Internal logger ko mock karne ke liye
// Winston logger ke methods ko mock karna
// Note: Type Assertion use kiya gaya hai taa ke Jest aur TypeScript types theek se mil saken.
const loggerInfoSpy = jest.spyOn(logger_1.default, 'info').mockImplementation(() => logger_1.default);
const loggerErrorSpy = jest.spyOn(logger_1.default, 'error').mockImplementation(() => logger_1.default);
const loggerWarnSpy = jest.spyOn(logger_1.default, 'warn').mockImplementation(() => logger_1.default);
describe('Request Logging Middleware Tests', () => {
let app;
// Test shuru hone se pehle Express app setup karna
beforeAll(() => {
app = (0, express_1.default)();
// 1. Request Logger Middleware lagana
app.use((0, index_1.requestLogger)());
// 2. Sample routes banana
app.get('/success', (req, res) => {
res.status(200).send('OK');
});
app.get('/not-found', (req, res) => {
// Express default 404 response
res.status(404).send('Not Found');
});
app.get('/server-error', (req, res) => {
res.status(500).send('Internal Server Error');
});
// Error logging utility test karne ke liye route
app.get('/utility-error', (req, res) => {
try {
throw new Error('Test DB Connection Failed');
}
catch (error) {
// logError utility use karna (Jisse pehla logger.error call hoga)
(0, index_1.logError)(error, req);
res.status(500).send('Logged an error');
}
});
});
// Har test ke baad spies ko clear karna
afterEach(() => {
jest.clearAllMocks();
});
// --- Test Cases ---
test('1. Successful request (200) should call logger.info', async () => {
await (0, supertest_1.default)(app).get('/success').expect(200);
// Check karna ke logger.info ko sahi data ke saath call kiya gaya hai
expect(loggerInfoSpy).toHaveBeenCalledTimes(1);
// FIX: Index [1] par Type Assertion (as object) lagaya
const logCall = loggerInfoSpy.mock.calls[0][1];
// Check karna ke required fields mojud hain
expect(logCall).toHaveProperty('method', 'GET');
expect(logCall).toHaveProperty('endpoint', '/success');
expect(logCall).toHaveProperty('status', 200);
expect(logCall).toHaveProperty('success', true);
expect(logCall).toHaveProperty('durationMs');
});
test('2. Client error (404) should call logger.warn', async () => {
await (0, supertest_1.default)(app).get('/not-found').expect(404);
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
// FIX: Index [1] par Type Assertion (as object) lagaya
const logCall = loggerWarnSpy.mock.calls[0][1];
expect(logCall).toHaveProperty('status', 404);
expect(logCall).toHaveProperty('success', false);
});
test('3. Server error (500) should call logger.error', async () => {
await (0, supertest_1.default)(app).get('/server-error').expect(500);
expect(loggerErrorSpy).toHaveBeenCalledTimes(1);
// FIX: Index [1] par Type Assertion (as object) lagaya
const logCall = loggerErrorSpy.mock.calls[0][1];
expect(logCall).toHaveProperty('status', 500);
expect(logCall).toHaveProperty('success', false);
});
test('4. Utility logError should call logger.error with details', async () => {
await (0, supertest_1.default)(app).get('/utility-error').expect(500);
// FIX: Hamein 2 calls ki ummeed hai (1 utility se, 1 middleware se)
expect(loggerErrorSpy).toHaveBeenCalledTimes(2);
// Call 1: Utility Log (Jiska message 'Custom Application Error:' se shuru hota hai)
const utilityCall = loggerErrorSpy.mock.calls.find(call => {
return call[0] === 'Custom Application Error:';
});
// Call 2: Middleware Log (Jiska message 'Server Error Occurred' hai)
const middlewareCall = loggerErrorSpy.mock.calls.find(call => {
return call[0] === 'Server Error Occurred';
});
// Assertion 1: Utility call ka data check karna
expect(utilityCall).toBeDefined();
const errorCallData = utilityCall[1];
expect(errorCallData).toHaveProperty('errorMessage', 'Test DB Connection Failed');
expect(errorCallData).toHaveProperty('route', 'GET /utility-error');
expect(errorCallData).toHaveProperty('errorStack');
// Assertion 2: Middleware call ka data check karna
expect(middlewareCall).toBeDefined();
const middlewareCallData = middlewareCall[1];
expect(middlewareCallData).toHaveProperty('status', 500);
expect(middlewareCallData).toHaveProperty('endpoint', '/utility-error');
expect(middlewareCallData).toHaveProperty('durationMs');
});
});