swagger-endpoint-validator
Version:
A validator of API endpoints to check that input and output match with the swagger specification for the API
108 lines (94 loc) • 3.4 kB
JavaScript
const request = require('supertest');
const runServer = require('./fake-server');
let app;
describe('validation results', () => {
beforeAll(async () => {
app = await runServer();
});
describe('successful request and reponse validation', () => {
test('should return corresponding server response (200) when GET request and response are valid', async () => {
const res = await request(app)
.get('/pets');
expect(res.statusCode)
.toEqual(200);
});
test('should return corresponding server response (200) when GET request query params are valid', async () => {
const res = await request(app)
.get('/pets?limit=10');
expect(res.statusCode)
.toEqual(200);
});
test('should return corresponding server response (200) when POST request and response are valid', async () => {
const res = await request(app)
.post('/pets')
.send({ name: 'my new pet' });
expect(res.statusCode)
.toEqual(200);
});
});
describe('unsuccessful request validation', () => {
test('should return a bad request error (400) when GET request uses unknown query params', async () => {
const res = await request(app)
.get('/pets?invalidQueryParam=1');
expect(res.statusCode)
.toEqual(400);
expect(res.body.errors[0].path)
.toEqual('/query/invalidQueryParam');
expect(res.body.errors[0].message)
.toEqual('Unknown query parameter \'invalidQueryParam\'');
});
// TODO: it's not possible to do query params minimum and maximum values validation with JSDoc
test.skip('should return a bad request error (400) when GET request query params are not valid', async () => {
const res = await request(app)
.get('/pets?limit=0');
expect(res.statusCode)
.toEqual(400);
expect(res.body.errors[0].path)
.toEqual('/query/limit');
expect(res.body.errors[0].message)
.toEqual('should be >= 1');
});
test('should return a bad request error (400) when GET request query param type is not valid', async () => {
const res = await request(app)
.get('/pets?limit=string');
expect(res.statusCode)
.toEqual(400);
expect(res.body.errors[0].path)
.toEqual('/query/limit');
expect(res.body.errors[0].message)
.toEqual('must be integer');
});
test('should return a bad request error (400) when POST request body is not valid', async () => {
const res = await request(app)
.post('/pets')
.send({});
expect(res.body.errors[0].path)
.toEqual('/body/name');
expect(res.body.errors[0].message)
.toEqual('must have required property \'name\'');
});
});
describe('unsuccessful response validation', () => {
test('should return a server error (500) when GET response is not valid', async () => {
const res = await request(app)
.get('/pets?wrong=true');
expect(res.statusCode)
.toEqual(500);
expect(res.error.status)
.toEqual(500);
expect(res.error.text)
.toContain('Error: /response/0 must have required property 'name'');
});
test('should return a server error (500) when POST response is not valid', async () => {
const res = await request(app)
.post('/pets?wrong=true')
.send({ name: 'my new pet' });
expect(res.statusCode)
.toEqual(500);
expect(res.error.status)
.toEqual(500);
expect(res.error.text)
.toContain('Error: /response must have required property 'id'');
});
});
});