qapinterface
Version:
Comprehensive API utilities for Node.js applications including authentication, security, request processing, and response handling with zero external dependencies
187 lines (150 loc) • 5.71 kB
JavaScript
/**
* Test suite for HTTP Response Validator utilities
* Can be run with: node lib/__tests__/response-validator.test.js
*/
const { throwIfResNotOk, validateAndReturnResponse, isResponseOk, getResponseError } = require('../http/response-validator');
const TestRunner = require('./TestRunner');
const test = new TestRunner();
// Mock Response objects for testing
function createMockResponse(status, statusText = '', text = '', ok = null) {
const mockResponse = {
status,
statusText,
ok: ok !== null ? ok : (status >= 200 && status < 300),
text: async () => text || statusText || `Status ${status}`
};
return mockResponse;
}
function createInvalidResponse() {
return { status: 200 }; // Missing ok property
}
test.describe('HTTP Response Validator', () => {
test.describe('throwIfResNotOk', () => {
test.it('should not throw for ok response (200)', async () => {
const response = createMockResponse(200, 'OK');
let error = null;
try {
await throwIfResNotOk(response);
} catch (e) {
error = e;
}
test.expect(error === null).to.be.true;
});
test.it('should not throw for ok response (201)', async () => {
const response = createMockResponse(201, 'Created');
let error = null;
try {
await throwIfResNotOk(response);
} catch (e) {
error = e;
}
test.expect(error === null).to.be.true;
});
test.it('should throw for 404 response', async () => {
const response = createMockResponse(404, 'Not Found');
let error = null;
try {
await throwIfResNotOk(response);
} catch (e) {
error = e;
}
test.expect(error !== null).to.be.true;
test.expect(error.message.includes('404')).to.be.true;
test.expect(error.message.includes('Not Found')).to.be.true;
});
test.it('should throw for 500 response with custom text', async () => {
const response = createMockResponse(500, 'Internal Server Error', 'Database connection failed');
let error = null;
try {
await throwIfResNotOk(response);
} catch (e) {
error = e;
}
test.expect(error !== null).to.be.true;
test.expect(error.message.includes('500')).to.be.true;
test.expect(error.message.includes('Database connection failed')).to.be.true;
});
test.it('should throw error for null response', async () => {
let error = null;
try {
await throwIfResNotOk(null);
} catch (e) {
error = e;
}
test.expect(error !== null).to.be.true;
test.expect(error.message.includes('Response object is required')).to.be.true;
});
test.it('should throw error for invalid response object', async () => {
const invalidResponse = createInvalidResponse();
let error = null;
try {
await throwIfResNotOk(invalidResponse);
} catch (e) {
error = e;
}
test.expect(error !== null).to.be.true;
test.expect(error.message.includes('Invalid Response object')).to.be.true;
});
});
test.describe('validateAndReturnResponse', () => {
test.it('should return response for ok status', async () => {
const response = createMockResponse(200, 'OK');
const result = await validateAndReturnResponse(response);
test.expect(result).to.equal(response);
});
test.it('should throw for non-ok status', async () => {
const response = createMockResponse(400, 'Bad Request');
let error = null;
try {
await validateAndReturnResponse(response);
} catch (e) {
error = e;
}
test.expect(error !== null).to.be.true;
test.expect(error.message.includes('400')).to.be.true;
});
});
test.describe('isResponseOk', () => {
test.it('should return true for ok response', () => {
const response = createMockResponse(200, 'OK');
test.expect(isResponseOk(response)).to.be.true;
});
test.it('should return false for non-ok response', () => {
const response = createMockResponse(404, 'Not Found');
test.expect(isResponseOk(response)).to.be.false;
});
test.it('should return false for null response', () => {
test.expect(isResponseOk(null)).to.be.false;
});
test.it('should return false for invalid response', () => {
const invalidResponse = createInvalidResponse();
test.expect(isResponseOk(invalidResponse)).to.be.false;
});
});
test.describe('getResponseError', () => {
test.it('should return null for ok response', async () => {
const response = createMockResponse(200, 'OK');
const error = await getResponseError(response);
test.expect(error === null).to.be.true;
});
test.it('should return error details for non-ok response', async () => {
const response = createMockResponse(400, 'Bad Request', 'Invalid input data');
const error = await getResponseError(response);
test.expect(error !== null).to.be.true;
test.expect(error.status).to.equal(400);
test.expect(error.statusText).to.equal('Bad Request');
test.expect(error.text).to.equal('Invalid input data');
});
test.it('should handle null response', async () => {
const error = await getResponseError(null);
test.expect(error !== null).to.be.true;
test.expect(error.status).to.equal(0);
test.expect(error.text.includes('null or undefined')).to.be.true;
});
});
});
(async () => {
await test.run();
const success = test.summary();
process.exit(success ? 0 : 1);
})();