From 5ae61e6fc3c8c2684288f2f70e00d2cbff5803c7 Mon Sep 17 00:00:00 2001 From: ivaosthu Date: Wed, 22 May 2019 09:29:56 +0200 Subject: [PATCH] chore: Make options more testable --- lib/options.js | 72 ++++++++++++++++++++++----------------------- lib/options.test.js | 21 +++++++++++++ 2 files changed, 57 insertions(+), 36 deletions(-) diff --git a/lib/options.js b/lib/options.js index de6072065a..c9cdb6105d 100644 --- a/lib/options.js +++ b/lib/options.js @@ -6,48 +6,48 @@ const { defaultLogProvider, validateLogProvider } = require('./logger'); const isDev = () => process.env.NODE_ENV === 'development'; const THIRTY_DAYS = 30 * 24 * 60 * 60 * 1000; -const DEFAULT_OPTIONS = { - databaseUrl: - process.env.DATABASE_URL || process.env.DATABASE_HOST - ? defaultDatabaseUrl() - : undefined, - databaseSchema: 'public', - port: process.env.HTTP_PORT || process.env.PORT || 4242, - host: process.env.HTTP_HOST, - pipe: undefined, - baseUriPath: process.env.BASE_URI_PATH || '', - serverMetrics: true, - enableLegacyRoutes: true, - extendedPermissions: false, - publicFolder, - enableRequestLogger: isDev(), - secret: 'UNLEASH-SECRET', - sessionAge: THIRTY_DAYS, - adminAuthentication: 'unsecure', - ui: {}, - importFile: undefined, - dropBeforeImport: false, - getLogger: defaultLogProvider, -}; +function defaultOptions() { + return { + databaseUrl: defaultDatabaseUrl(), + databaseSchema: 'public', + port: process.env.HTTP_PORT || process.env.PORT || 4242, + host: process.env.HTTP_HOST, + pipe: undefined, + baseUriPath: process.env.BASE_URI_PATH || '', + serverMetrics: true, + enableLegacyRoutes: true, + extendedPermissions: false, + publicFolder, + enableRequestLogger: isDev(), + secret: 'UNLEASH-SECRET', + sessionAge: THIRTY_DAYS, + adminAuthentication: 'unsecure', + ui: {}, + importFile: undefined, + dropBeforeImport: false, + getLogger: defaultLogProvider, + }; +} function defaultDatabaseUrl() { - const dbUsername = process.env.DATABASE_USERNAME || 'unleash_user'; - const dbPassword = process.env.DATABASE_PASSWORD || 'passord'; - const dbHost = process.env.DATABASE_HOST || 'localhost'; - const dbPort = process.env.DATABASE_PORT || 5432; - const dbName = process.env.DATABASE_NAME || 'unleash'; - const sslSupport = process.env.DATABASE_SSL || 'true'; - return `postgres://${dbUsername}:${dbPassword}@${dbHost}:${dbPort}/${dbName}?ssl=${sslSupport}`; + if (process.env.DATABASE_URL) { + return process.env.DATABASE_URL; + } else if (isDev() || process.env.DATABASE_HOST) { + const dbUsername = process.env.DATABASE_USERNAME || 'unleash_user'; + const dbPassword = process.env.DATABASE_PASSWORD || 'passord'; + const dbHost = process.env.DATABASE_HOST || 'localhost'; + const dbPort = process.env.DATABASE_PORT || 5432; + const dbName = process.env.DATABASE_NAME || 'unleash'; + const sslSupport = process.env.DATABASE_SSL || 'true'; + return `postgres://${dbUsername}:${dbPassword}@${dbHost}:${dbPort}/${dbName}?ssl=${sslSupport}`; + } else { + return undefined; + } } module.exports = { createOptions: opts => { - const options = Object.assign({}, DEFAULT_OPTIONS, opts); - - // If we are running in development we should assume local db - if (isDev() && !options.databaseUrl) { - options.databaseUrl = defaultDatabaseUrl(); - } + const options = Object.assign({}, defaultOptions(), opts); if (!options.databaseUrl) { throw new Error( diff --git a/lib/options.test.js b/lib/options.test.js index d2785f5e58..18b715effe 100644 --- a/lib/options.test.js +++ b/lib/options.test.js @@ -13,6 +13,7 @@ test('should require DATABASE_URI', t => { }); test('should set default databaseUrl for develpment', t => { + delete process.env.NODE_ENV; process.env.NODE_ENV = 'development'; const { createOptions } = require('./options'); @@ -24,6 +25,26 @@ test('should set default databaseUrl for develpment', t => { ); }); +test('should use DATABASE_URL from env', t => { + const databaseUrl = 'postgres://u:p@localhost:5432/name'; + delete process.env.NODE_ENV; + process.env.DATABASE_URL = databaseUrl; + const { createOptions } = require('./options'); + + const options = createOptions({}); + + t.true(options.databaseUrl === databaseUrl); +}); + +test('should use databaseUrl from options', t => { + const databaseUrl = 'postgres://u:p@localhost:5432/name'; + const { createOptions } = require('./options'); + + const options = createOptions({ databaseUrl }); + + t.true(options.databaseUrl === databaseUrl); +}); + test('should not override provided options', t => { process.env.DATABASE_URL = 'test'; process.env.NODE_ENV = 'production';