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.
		
		
		
		
		
			
		
			
				
					
					
						
							451 lines
						
					
					
						
							9.8 KiB
						
					
					
				
			
		
		
	
	
							451 lines
						
					
					
						
							9.8 KiB
						
					
					
				| 'use strict'
 | |
| 
 | |
| const t = require('tap')
 | |
| const test = t.test
 | |
| const build = require('../example-composited')
 | |
| 
 | |
| let fastify = null
 | |
| 
 | |
| t.teardown(() => {
 | |
|   fastify.close()
 | |
| })
 | |
| 
 | |
| test('boot server', t => {
 | |
|   t.plan(1)
 | |
|   fastify = build()
 | |
|   t.error(false)
 | |
| })
 | |
| 
 | |
| test('And Relation sucess for single case', t => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/singleand',
 | |
|     payload: {
 | |
|       n: 11
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, { hello: 'world' })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('And Relation failed for single case', t => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/singleand',
 | |
|     payload: {
 | |
|       n: 10
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, {
 | |
|       error: 'Unauthorized',
 | |
|       message: '`n` is not odd',
 | |
|       statusCode: 401
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Or Relation sucess for single case', t => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/singleor',
 | |
|     payload: {
 | |
|       n: 11
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, { hello: 'world' })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Or Relation failed for single case', t => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/singleor',
 | |
|     payload: {
 | |
|       n: 10
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, {
 | |
|       error: 'Unauthorized',
 | |
|       message: '`n` is not odd',
 | |
|       statusCode: 401
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('And Relation failed for first check', t => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/checkand',
 | |
|     payload: {
 | |
|       n: 'tomas'
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, {
 | |
|       error: 'Unauthorized',
 | |
|       message: 'type of `n` is not `number`',
 | |
|       statusCode: 401
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('And Relation failed for first check', t => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/checkand',
 | |
|     payload: {
 | |
|       m: 11
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, {
 | |
|       error: 'Unauthorized',
 | |
|       message: 'type of `n` is not `number`',
 | |
|       statusCode: 401
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('And Relation failed for second check', t => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/checkand',
 | |
|     payload: {
 | |
|       n: 10
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, {
 | |
|       error: 'Unauthorized',
 | |
|       message: '`n` is not odd',
 | |
|       statusCode: 401
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('And Relation success', t => {
 | |
|   t.plan(3)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/checkand',
 | |
|     payload: {
 | |
|       n: 11
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, { hello: 'world' })
 | |
|     t.equal(res.statusCode, 200)
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Or Relation success under first case', t => {
 | |
|   t.plan(3)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/checkor',
 | |
|     payload: {
 | |
|       n: 1
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, { hello: 'world' })
 | |
|     t.equal(res.statusCode, 200)
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Or Relation success under second case', t => {
 | |
|   t.plan(3)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/checkor',
 | |
|     payload: {
 | |
|       n: 200
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, { hello: 'world' })
 | |
|     t.equal(res.statusCode, 200)
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Or Relation failed for both case', t => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/checkor',
 | |
|     payload: {
 | |
|       n: 90
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, {
 | |
|       error: 'Unauthorized',
 | |
|       message: '`n` is not big',
 | |
|       statusCode: 401
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Check run all line fail with AND', t => {
 | |
|   t.plan(8)
 | |
| 
 | |
|   const fastify = build()
 | |
| 
 | |
|   fastify.after(() => {
 | |
|     fastify.route({
 | |
|       method: 'GET',
 | |
|       url: '/run-all-pipe',
 | |
|       preHandler: fastify.auth([
 | |
|         (request, reply, done) => { t.pass('executed 1'); done() },
 | |
|         (request, reply, done) => { t.pass('executed 2'); done(new Error('second')) },
 | |
|         (request, reply, done) => { t.pass('executed 3'); done() },
 | |
|         (request, reply, done) => { t.pass('executed 4'); done() },
 | |
|         (request, reply, done) => { t.pass('executed 5'); done(new Error('fifth')) }
 | |
|       ], { relation: 'and', run: 'all' }),
 | |
|       handler: (req, reply) => { reply.send({ hello: 'world' }) }
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   fastify.inject('/run-all-pipe', (err, res) => {
 | |
|     t.error(err)
 | |
|     t.equal(res.statusCode, 401)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, {
 | |
|       error: 'Unauthorized',
 | |
|       message: 'second',
 | |
|       statusCode: 401
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Check run all line with AND', t => {
 | |
|   t.plan(8)
 | |
| 
 | |
|   const fastify = build()
 | |
| 
 | |
|   fastify.after(() => {
 | |
|     fastify.route({
 | |
|       method: 'GET',
 | |
|       url: '/run-all-pipe',
 | |
|       preHandler: fastify.auth([
 | |
|         (request, reply, done) => { t.pass('executed 1'); done() },
 | |
|         (request, reply, done) => { t.pass('executed 2'); done() },
 | |
|         (request, reply, done) => { t.pass('executed 3'); done() },
 | |
|         (request, reply, done) => { t.pass('executed 4'); done() },
 | |
|         (request, reply, done) => { t.pass('executed 5'); done() }
 | |
|       ], { relation: 'and', run: 'all' }),
 | |
|       handler: (req, reply) => { reply.send({ hello: 'world' }) }
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   fastify.inject('/run-all-pipe', (err, res) => {
 | |
|     t.error(err)
 | |
|     t.equal(res.statusCode, 200)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, { hello: 'world' })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Check run all line with OR', t => {
 | |
|   t.plan(8)
 | |
| 
 | |
|   const fastify = build()
 | |
| 
 | |
|   fastify.after(() => {
 | |
|     fastify.route({
 | |
|       method: 'GET',
 | |
|       url: '/run-all-pipe',
 | |
|       preHandler: fastify.auth([
 | |
|         (req, reply, done) => { t.pass('executed 1'); done(new Error('primo')) },
 | |
|         (req, reply, done) => { t.pass('executed 2'); done(new Error('secondo')) },
 | |
|         (req, reply, done) => { t.pass('executed 3'); done() },
 | |
|         (req, reply, done) => { t.pass('executed 4'); done(new Error('quarto')) },
 | |
|         (req, reply, done) => { t.pass('executed 5'); done() }
 | |
|       ], { relation: 'or', run: 'all' }),
 | |
|       handler: (req, reply) => { reply.send({ hello: 'world' }) }
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   fastify.inject('/run-all-pipe', (err, res) => {
 | |
|     t.error(err)
 | |
|     t.equal(res.statusCode, 200)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, { hello: 'world' })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Check run all fail line with OR', t => {
 | |
|   t.plan(8)
 | |
| 
 | |
|   const fastify = build()
 | |
| 
 | |
|   fastify.after(() => {
 | |
|     fastify.route({
 | |
|       method: 'GET',
 | |
|       url: '/run-all-pipe',
 | |
|       preHandler: fastify.auth([
 | |
|         (req, reply, done) => { t.pass('executed 1'); done(new Error('primo')) },
 | |
|         (req, reply, done) => { t.pass('executed 2'); done(new Error('secondo')) },
 | |
|         (req, reply, done) => { t.pass('executed 3'); done(new Error('terzo')) },
 | |
|         (req, reply, done) => { t.pass('executed 4'); done(new Error('quarto')) },
 | |
|         (req, reply, done) => { t.pass('executed 5'); done(new Error('quinto')) }
 | |
|       ], { relation: 'or', run: 'all' }),
 | |
|       handler: (req, reply) => { reply.send({ hello: 'world' }) }
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   fastify.inject('/run-all-pipe', (err, res) => {
 | |
|     t.error(err)
 | |
|     t.equal(res.statusCode, 401)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, {
 | |
|       error: 'Unauthorized',
 | |
|       message: 'quinto',
 | |
|       statusCode: 401
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Ignore last status', t => {
 | |
|   t.plan(5)
 | |
| 
 | |
|   const fastify = build()
 | |
| 
 | |
|   fastify.after(() => {
 | |
|     fastify.route({
 | |
|       method: 'GET',
 | |
|       url: '/run-all-status',
 | |
|       preHandler: fastify.auth([
 | |
|         (req, reply, done) => { t.pass('executed 1'); done() },
 | |
|         (req, reply, done) => { t.pass('executed 2'); done(new Error('last')) }
 | |
|       ], { relation: 'or', run: 'all' }),
 | |
|       handler: (req, reply) => { reply.send({ hello: 'world' }) }
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   fastify.inject('/run-all-status', (err, res) => {
 | |
|     t.error(err)
 | |
|     t.equal(res.statusCode, 200)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, { hello: 'world' })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Or Relation run all', t => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/run-all-or',
 | |
|     payload: {
 | |
|       n: 11
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, {
 | |
|       odd: true,
 | |
|       big: false,
 | |
|       number: true
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Or Relation run all fail', t => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/run-all-or',
 | |
|     payload: {
 | |
|       n: 'foo'
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, {
 | |
|       error: 'Unauthorized',
 | |
|       message: 'type of `n` is not `number`',
 | |
|       statusCode: 401
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('And Relation run all', t => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   fastify.inject({
 | |
|     method: 'POST',
 | |
|     url: '/run-all-and',
 | |
|     payload: {
 | |
|       n: 101
 | |
|     }
 | |
|   }, (err, res) => {
 | |
|     t.error(err)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, {
 | |
|       odd: true,
 | |
|       big: true,
 | |
|       number: true
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('Clean status code settle by user', t => {
 | |
|   t.plan(5)
 | |
| 
 | |
|   const fastify = build()
 | |
| 
 | |
|   fastify.after(() => {
 | |
|     fastify.route({
 | |
|       method: 'GET',
 | |
|       url: '/run-all-status',
 | |
|       preHandler: fastify.auth([
 | |
|         (req, reply, done) => { t.pass('executed 1'); done() },
 | |
|         (req, reply, done) => { t.pass('executed 2'); reply.code(400); done(new Error('last')) }
 | |
|       ], { relation: 'or', run: 'all' }),
 | |
|       handler: (req, reply) => { reply.send({ hello: 'world' }) }
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   fastify.inject('/run-all-status', (err, res) => {
 | |
|     t.error(err)
 | |
|     t.equal(res.statusCode, 200)
 | |
|     const payload = JSON.parse(res.payload)
 | |
|     t.same(payload, { hello: 'world' })
 | |
|   })
 | |
| })
 |