You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							126 lines
						
					
					
						
							2.9 KiB
						
					
					
				
			
		
		
	
	
							126 lines
						
					
					
						
							2.9 KiB
						
					
					
				| 'use strict'
 | |
| 
 | |
| const test = require('tap').test
 | |
| const FormData = require('form-data')
 | |
| const Fastify = require('fastify')
 | |
| const multipart = require('..')
 | |
| const http = require('http')
 | |
| const path = require('path')
 | |
| const fs = require('fs')
 | |
| 
 | |
| const filePath = path.join(__dirname, '../README.md')
 | |
| 
 | |
| test('should be able to use JSON schema to validate request', function (t) {
 | |
|   t.plan(6)
 | |
| 
 | |
|   const fastify = Fastify()
 | |
|   t.teardown(fastify.close.bind(fastify))
 | |
| 
 | |
|   fastify.register(multipart, { attachFieldsToBody: true, sharedSchemaId: '#mySharedSchema' })
 | |
| 
 | |
|   const original = fs.readFileSync(filePath, 'utf8')
 | |
| 
 | |
|   fastify.post('/', {
 | |
|     schema: {
 | |
|       body: {
 | |
|         type: 'object',
 | |
|         required: ['hello', 'upload'],
 | |
|         properties: {
 | |
|           hello: { $ref: '#mySharedSchema' },
 | |
|           upload: { $ref: '#mySharedSchema' }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }, async function (req, reply) {
 | |
|     t.ok(req.isMultipart())
 | |
| 
 | |
|     t.same(Object.keys(req.body), ['upload', 'hello'])
 | |
| 
 | |
|     const content = await req.body.upload.toBuffer()
 | |
| 
 | |
|     t.equal(content.toString(), original)
 | |
|     t.equal(req.body.hello.value, 'world')
 | |
| 
 | |
|     reply.code(200).send()
 | |
|   })
 | |
| 
 | |
|   fastify.listen({ port: 0 }, async function () {
 | |
|     // request
 | |
|     const form = new FormData()
 | |
|     const opts = {
 | |
|       protocol: 'http:',
 | |
|       hostname: 'localhost',
 | |
|       port: fastify.server.address().port,
 | |
|       path: '/',
 | |
|       headers: form.getHeaders(),
 | |
|       method: 'POST'
 | |
|     }
 | |
| 
 | |
|     const req = http.request(opts, (res) => {
 | |
|       t.equal(res.statusCode, 200)
 | |
|       res.resume()
 | |
|       res.on('end', () => {
 | |
|         t.pass('res ended successfully')
 | |
|       })
 | |
|     })
 | |
|     form.append('upload', fs.createReadStream(filePath))
 | |
|     form.append('hello', 'world')
 | |
|     form.pipe(req)
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('should throw because JSON schema is invalid', function (t) {
 | |
|   t.plan(2)
 | |
| 
 | |
|   const fastify = Fastify()
 | |
|   t.teardown(fastify.close.bind(fastify))
 | |
| 
 | |
|   fastify.register(multipart, { attachFieldsToBody: true, sharedSchemaId: '#mySharedSchema' })
 | |
| 
 | |
|   fastify.post('/', {
 | |
|     schema: {
 | |
|       body: {
 | |
|         type: 'object',
 | |
|         required: ['hello'],
 | |
|         properties: {
 | |
|           hello: {
 | |
|             type: 'object',
 | |
|             properties: {
 | |
|               value: {
 | |
|                 type: 'string',
 | |
|                 enum: ['red']
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }, async function (req, reply) {
 | |
|     console.log(req.body)
 | |
|     reply.code(200).send()
 | |
|   })
 | |
| 
 | |
|   fastify.listen({ port: 0 }, async function () {
 | |
|     // request
 | |
|     const form = new FormData()
 | |
|     const opts = {
 | |
|       protocol: 'http:',
 | |
|       hostname: 'localhost',
 | |
|       port: fastify.server.address().port,
 | |
|       path: '/',
 | |
|       headers: form.getHeaders(),
 | |
|       method: 'POST'
 | |
|     }
 | |
| 
 | |
|     const req = http.request(opts, (res) => {
 | |
|       t.equal(res.statusCode, 400)
 | |
|       res.resume()
 | |
|       res.on('end', () => {
 | |
|         t.pass('res ended successfully')
 | |
|       })
 | |
|     })
 | |
|     form.append('hello', 'world')
 | |
|     form.pipe(req)
 | |
|   })
 | |
| })
 |