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.
		
		
		
		
		
			
		
			
				
					285 lines
				
				5.3 KiB
			
		
		
			
		
	
	
					285 lines
				
				5.3 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const t = require('tap') | ||
|  | const path = require('path') | ||
|  | const Fastify = require('fastify') | ||
|  | const fastifyEnv = require('../index') | ||
|  | 
 | ||
|  | function makeTest (t, options, isOk, confExpected, errorMessage) { | ||
|  |   t.plan(isOk ? 2 : 1) | ||
|  | 
 | ||
|  |   const fastify = Fastify() | ||
|  |   fastify.register(fastifyEnv, options) | ||
|  |     .ready(err => { | ||
|  |       if (isOk) { | ||
|  |         t.notOk(err) | ||
|  |         t.strictSame(fastify.config, confExpected) | ||
|  |         return | ||
|  |       } | ||
|  | 
 | ||
|  |       t.strictSame(err.message, errorMessage) | ||
|  |     }) | ||
|  | } | ||
|  | 
 | ||
|  | const tests = [ | ||
|  |   { | ||
|  |     name: 'empty ok', | ||
|  |     schema: { type: 'object' }, | ||
|  |     data: { }, | ||
|  |     isOk: true, | ||
|  |     confExpected: {} | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - ok', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       properties: { | ||
|  |         PORT: { | ||
|  |           type: 'string' | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: { | ||
|  |       PORT: '44' | ||
|  |     }, | ||
|  |     isOk: true, | ||
|  |     confExpected: { | ||
|  |       PORT: '44' | ||
|  |     } | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - ok - coerce value', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       properties: { | ||
|  |         PORT: { | ||
|  |           type: 'integer' | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: { | ||
|  |       PORT: '44' | ||
|  |     }, | ||
|  |     isOk: true, | ||
|  |     confExpected: { | ||
|  |       PORT: 44 | ||
|  |     } | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - ok - remove additional properties', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       properties: { | ||
|  |         PORT: { | ||
|  |           type: 'integer' | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: { | ||
|  |       PORT: '44', | ||
|  |       ANOTHER_PORT: '55' | ||
|  |     }, | ||
|  |     isOk: true, | ||
|  |     confExpected: { | ||
|  |       PORT: 44 | ||
|  |     } | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - ok - use default', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       properties: { | ||
|  |         PORT: { | ||
|  |           type: 'integer', | ||
|  |           default: 5555 | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: { }, | ||
|  |     isOk: true, | ||
|  |     confExpected: { | ||
|  |       PORT: 5555 | ||
|  |     } | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - ok - required + default', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       required: ['PORT'], | ||
|  |       properties: { | ||
|  |         PORT: { | ||
|  |           type: 'integer', | ||
|  |           default: 6666 | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: { }, | ||
|  |     isOk: true, | ||
|  |     confExpected: { | ||
|  |       PORT: 6666 | ||
|  |     } | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - ok - allow array', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       required: ['PORT'], | ||
|  |       properties: { | ||
|  |         PORT: { | ||
|  |           type: 'integer', | ||
|  |           default: 6666 | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: [{ }], | ||
|  |     isOk: true, | ||
|  |     confExpected: { | ||
|  |       PORT: 6666 | ||
|  |     } | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - ok - merge multiple object + env', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       required: ['PORT', 'MONGODB_URL'], | ||
|  |       properties: { | ||
|  |         PORT: { | ||
|  |           type: 'integer', | ||
|  |           default: 6666 | ||
|  |         }, | ||
|  |         MONGODB_URL: { | ||
|  |           type: 'string' | ||
|  |         }, | ||
|  |         VALUE_FROM_ENV: { | ||
|  |           type: 'string' | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: [{ PORT: 3333 }, { MONGODB_URL: 'mongodb://localhost/pippo' }], | ||
|  |     isOk: true, | ||
|  |     confExpected: { | ||
|  |       PORT: 3333, | ||
|  |       MONGODB_URL: 'mongodb://localhost/pippo', | ||
|  |       VALUE_FROM_ENV: 'pippo' | ||
|  |     } | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - ok - load only from env', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       required: ['VALUE_FROM_ENV'], | ||
|  |       properties: { | ||
|  |         VALUE_FROM_ENV: { | ||
|  |           type: 'string' | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: undefined, | ||
|  |     isOk: true, | ||
|  |     confExpected: { | ||
|  |       VALUE_FROM_ENV: 'pippo' | ||
|  |     } | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - ok - opts override environment', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       required: ['VALUE_FROM_ENV'], | ||
|  |       properties: { | ||
|  |         VALUE_FROM_ENV: { | ||
|  |           type: 'string' | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: { VALUE_FROM_ENV: 'pluto' }, | ||
|  |     isOk: true, | ||
|  |     confExpected: { | ||
|  |       VALUE_FROM_ENV: 'pluto' | ||
|  |     } | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - ok - load only from .env', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       required: ['VALUE_FROM_DOTENV'], | ||
|  |       properties: { | ||
|  |         VALUE_FROM_DOTENV: { | ||
|  |           type: 'string' | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: undefined, | ||
|  |     isOk: true, | ||
|  |     dotenv: { path: path.join(__dirname, '.env') }, | ||
|  |     confExpected: { | ||
|  |       VALUE_FROM_DOTENV: 'look ma' | ||
|  |     } | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - KO', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       required: ['PORT'], | ||
|  |       properties: { | ||
|  |         PORT: { | ||
|  |           type: 'integer' | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: { }, | ||
|  |     isOk: false, | ||
|  |     errorMessage: 'env must have required property \'PORT\'' | ||
|  |   }, | ||
|  |   { | ||
|  |     name: 'simple object - invalid data', | ||
|  |     schema: { | ||
|  |       type: 'object', | ||
|  |       required: ['PORT'], | ||
|  |       properties: { | ||
|  |         PORT: { | ||
|  |           type: 'integer' | ||
|  |         } | ||
|  |       } | ||
|  |     }, | ||
|  |     data: [], | ||
|  |     isOk: false, | ||
|  |     errorMessage: 'opts/data must NOT have fewer than 1 items, opts/data must be object, opts/data must match exactly one schema in oneOf' | ||
|  |   } | ||
|  | ] | ||
|  | 
 | ||
|  | tests.forEach(function (testConf) { | ||
|  |   t.test(testConf.name, t => { | ||
|  |     const options = { | ||
|  |       schema: testConf.schema, | ||
|  |       data: testConf.data, | ||
|  |       dotenv: testConf.dotenv, | ||
|  |       dotenvConfig: testConf.dotenvConfig | ||
|  |     } | ||
|  | 
 | ||
|  |     makeTest(t, options, testConf.isOk, testConf.confExpected, testConf.errorMessage) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | t.test('should use custom config key name', t => { | ||
|  |   t.plan(1) | ||
|  |   const schema = { | ||
|  |     type: 'object', | ||
|  |     required: ['PORT'], | ||
|  |     properties: { | ||
|  |       PORT: { | ||
|  |         type: 'integer', | ||
|  |         default: 6666 | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   const fastify = Fastify() | ||
|  |   fastify.register(fastifyEnv, { | ||
|  |     schema, | ||
|  |     confKey: 'customConfigKeyName' | ||
|  |   }) | ||
|  |     .ready(() => { | ||
|  |       t.strictSame(fastify.customConfigKeyName, { PORT: 6666 }) | ||
|  |     }) | ||
|  | }) |