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: 'should have required property \'PORT\''
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    name: 'simple object - invalid data',
							 | 
						||
| 
								 | 
							
								    schema: {
							 | 
						||
| 
								 | 
							
								      type: 'object',
							 | 
						||
| 
								 | 
							
								      required: ['PORT'],
							 | 
						||
| 
								 | 
							
								      properties: {
							 | 
						||
| 
								 | 
							
								        PORT: {
							 | 
						||
| 
								 | 
							
								          type: 'integer'
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    data: [],
							 | 
						||
| 
								 | 
							
								    isOk: false,
							 | 
						||
| 
								 | 
							
								    errorMessage: 'should NOT have fewer than 1 items,should be object,should 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: schema,
							 | 
						||
| 
								 | 
							
								    confKey: 'customConfigKeyName'
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								    .ready(() => {
							 | 
						||
| 
								 | 
							
								      t.strictSame(fastify.customConfigKeyName, { PORT: 6666 })
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								})
							 |