UNPKG

fastify

Version:

Fast and low overhead web framework, for Node.js

246 lines (209 loc) 5.92 kB
'use strict' const t = require('tap') const test = t.test const sget = require('simple-get').concat const Fastify = require('../fastify') const jsonParser = require('fast-json-body') const { getServerUrl } = require('./helper') process.removeAllListeners('warning') test('should be able to use default parser for extra content type', t => { t.plan(4) const fastify = Fastify() t.teardown(() => fastify.close()) fastify.post('/', (request, reply) => { reply.send(request.body) }) fastify.addContentTypeParser('text/json', { parseAs: 'string' }, fastify.getDefaultJsonParser('ignore', 'ignore')) fastify.listen({ port: 0 }, err => { t.error(err) sget({ method: 'POST', url: getServerUrl(fastify), body: '{"hello":"world"}', headers: { 'Content-Type': 'text/json' } }, (err, response, body) => { t.error(err) t.equal(response.statusCode, 200) t.strictSame(JSON.parse(body.toString()), { hello: 'world' }) fastify.close() }) }) }) test('contentTypeParser should add a custom parser with RegExp value', t => { t.plan(3) const fastify = Fastify() fastify.post('/', (req, reply) => { reply.send(req.body) }) fastify.options('/', (req, reply) => { reply.send(req.body) }) fastify.addContentTypeParser(/.*\+json$/, function (req, payload, done) { jsonParser(payload, function (err, body) { done(err, body) }) }) fastify.listen({ port: 0 }, err => { t.error(err) t.teardown(() => fastify.close()) t.test('in POST', t => { t.plan(3) sget({ method: 'POST', url: getServerUrl(fastify), body: '{"hello":"world"}', headers: { 'Content-Type': 'application/vnd.test+json' } }, (err, response, body) => { t.error(err) t.equal(response.statusCode, 200) t.same(body.toString(), JSON.stringify({ hello: 'world' })) }) }) t.test('in OPTIONS', t => { t.plan(3) sget({ method: 'OPTIONS', url: getServerUrl(fastify), body: '{"hello":"world"}', headers: { 'Content-Type': 'weird/content-type+json' } }, (err, response, body) => { t.error(err) t.equal(response.statusCode, 200) t.same(body.toString(), JSON.stringify({ hello: 'world' })) }) }) }) }) test('contentTypeParser should add multiple custom parsers with RegExp values', async t => { t.plan(6) const fastify = Fastify() t.teardown(fastify.close.bind(fastify)) fastify.post('/', (req, reply) => { reply.send(req.body) }) fastify.addContentTypeParser(/.*\+json$/, function (req, payload, done) { jsonParser(payload, function (err, body) { done(err, body) }) }) fastify.addContentTypeParser(/.*\+xml$/, function (req, payload, done) { done(null, 'xml') }) fastify.addContentTypeParser(/.*\+myExtension$/i, function (req, payload, done) { let data = '' payload.on('data', chunk => { data += chunk }) payload.on('end', () => { done(null, data + 'myExtension') }) }) await fastify.ready() { const response = await fastify.inject({ method: 'POST', url: '/', body: '{"hello":"world"}', headers: { 'Content-Type': 'application/vnd.hello+json' } }) t.equal(response.statusCode, 200) t.same(response.payload.toString(), '{"hello":"world"}') } { const response = await fastify.inject({ method: 'POST', url: '/', body: '{"hello":"world"}', headers: { 'Content-Type': 'application/test+xml' } }) t.equal(response.statusCode, 200) t.same(response.payload.toString(), 'xml') } await fastify.inject({ method: 'POST', path: '/', payload: 'abcdefg', headers: { 'Content-Type': 'application/+myExtension' } }).then((response) => { t.equal(response.statusCode, 200) t.same(response.payload.toString(), 'abcdefgmyExtension') }).catch((err) => { t.error(err) }) }) test('catch all content type parser should not interfere with content type parser', t => { t.plan(10) const fastify = Fastify() t.teardown(fastify.close.bind(fastify)) fastify.post('/', (req, reply) => { reply.send(req.body) }) fastify.addContentTypeParser('*', function (req, payload, done) { let data = '' payload.on('data', chunk => { data += chunk }) payload.on('end', () => { done(null, data) }) }) fastify.addContentTypeParser(/^application\/.*/, function (req, payload, done) { jsonParser(payload, function (err, body) { done(err, body) }) }) fastify.addContentTypeParser('text/html', function (req, payload, done) { let data = '' payload.on('data', chunk => { data += chunk }) payload.on('end', () => { done(null, data + 'html') }) }) fastify.listen({ port: 0 }, err => { t.error(err) sget({ method: 'POST', url: getServerUrl(fastify), body: '{"myKey":"myValue"}', headers: { 'Content-Type': 'application/json' } }, (err, response, body) => { t.error(err) t.equal(response.statusCode, 200) t.same(body.toString(), JSON.stringify({ myKey: 'myValue' })) }) sget({ method: 'POST', url: getServerUrl(fastify), body: 'body', headers: { 'Content-Type': 'very-weird-content-type' } }, (err, response, body) => { t.error(err) t.equal(response.statusCode, 200) t.same(body.toString(), 'body') }) sget({ method: 'POST', url: getServerUrl(fastify), body: 'my text', headers: { 'Content-Type': 'text/html' } }, (err, response, body) => { t.error(err) t.equal(response.statusCode, 200) t.same(body.toString(), 'my texthtml') }) }) })