diff --git a/src/config/project/index.js b/src/config/project/index.js index 7a29d8ac..e970e243 100644 --- a/src/config/project/index.js +++ b/src/config/project/index.js @@ -8,7 +8,7 @@ let { is, mergeEnvVars } = require('../../lib') * Get the project-level configuration, overlaying arc.aws settings (if present) */ module.exports = function getProjectConfig (params) { - let { arc, errors, raw, filepath, inventory, _testing } = params + let { arc, errors, raw, filepath, inventory } = params let _project = { ...inventory._project, arc, @@ -26,7 +26,7 @@ module.exports = function getProjectConfig (params) { // Parse local and global project preferences let scopes = [ 'global', 'local' ] for (let scope of scopes) { - let p = prefs({ scope, inventory, errors, _testing }) + let p = prefs({ scope, inventory, errors }) if (p) { // Set up the scoped metadata _project[`${scope}Preferences`] = p.preferences diff --git a/src/config/project/prefs/index.js b/src/config/project/prefs/index.js index c4bab529..f6ada23f 100644 --- a/src/config/project/prefs/index.js +++ b/src/config/project/prefs/index.js @@ -4,20 +4,13 @@ let read = require('../../../read') let validate = require('../validate') let { is, validationPatterns: valid } = require('../../../lib') let { parse } = require('./dotenv') -let { homedir } = require('os') +let os = require('os') -module.exports = function getPrefs ({ scope, inventory, errors, _testing }) { +module.exports = function getPrefs ({ scope, inventory, errors }) { let cwd = scope === 'global' - ? homedir() + ? os.homedir() : inventory._project.cwd - /* istanbul ignore next */ - if (_testing && scope === 'global') { - let _homedir = homedir() - if (process.platform === 'win32') _homedir = _homedir.replace(/^[A-Z]:\\/, '') - cwd = join(inventory._project.cwd, _homedir) - } - let envFilepath = join(cwd, '.env') let hasEnvFile = scope === 'local' && existsSync(envFilepath) let prefs = read({ type: 'preferences', cwd, errors }) diff --git a/src/index.js b/src/index.js index d974d821..35f2174d 100644 --- a/src/index.js +++ b/src/index.js @@ -32,7 +32,7 @@ module.exports = function architectInventory (params = {}, callback) { // Always ensure we have a working dir params.cwd = params.cwd || process.cwd() - let { cwd, rawArc, _testing } = params + let { cwd, rawArc } = params // Stateless inventory run if (rawArc) { @@ -60,7 +60,7 @@ module.exports = function architectInventory (params = {}, callback) { let inventory = inventoryDefaults(params) // Set up project params for config - let project = { arc, cwd, errors, filepath, inventory, raw, _testing } + let project = { arc, cwd, errors, filepath, inventory, raw } // Populate inventory.arc inventory._arc = config._arc(project) diff --git a/test/integration/preferences-test.js b/test/integration/preferences-test.js index 626bd7a7..40ec56d2 100644 --- a/test/integration/preferences-test.js +++ b/test/integration/preferences-test.js @@ -3,15 +3,16 @@ let test = require('tape') let mockTmp = require('mock-tmp') let cwd = process.cwd() let testLibPath = join(cwd, 'test', 'lib') -let { getHomedir } = require(testLibPath) +let { overrideHomedir } = require(testLibPath) let sut = join(cwd, 'src', 'index') let inv = require(sut) -let _homedir = getHomedir() let mock = join(cwd, 'test', 'mock') -let arc = '@app\nappname\n@events\nan-event' // Not using @http so we can skip ASAP filesystem checks -let reset = () => mockTmp.reset() -let _testing = true +let globalPrefsFile = '.prefs.arc' +let reset = () => { + mockTmp.reset() + overrideHomedir.reset() +} /** * Duplicates some unit tests as part of the larger whole integration test @@ -24,6 +25,7 @@ test('Set up env', t => { test('Get global preferences', t => { t.plan(11) + let cwd = join(mock, 'prefs', 'global') let prefs = { sandbox: { environment: 'testing' }, 'sandbox-startup': [ @@ -59,12 +61,11 @@ testing env_var_1 foo env_var_2 bar ` - let path = join(_homedir, '.prefs.arc') - let cwd = mockTmp({ - 'app.arc': arc, - [path]: prefsText + let tmp = mockTmp({ + [globalPrefsFile]: prefsText }) - inv({ cwd, _testing }, (err, result) => { + overrideHomedir(tmp) + inv({ cwd }, (err, result) => { if (err) t.fail(err) else { let { inv, get } = result @@ -81,7 +82,7 @@ testing delete inv._project.globalPreferences._arc delete inv._project.globalPreferences._raw t.deepEqual(inv._project.globalPreferences, prefs, 'Got correct global preferences') - t.equal(inv._project.globalPreferencesFile, join(cwd, path), 'Got correct preferences file') + t.equal(inv._project.globalPreferencesFile, join(tmp, globalPrefsFile), 'Got correct preferences file') t.teardown(reset) } }) @@ -135,6 +136,7 @@ test('Get local preferences', t => { test('Layer local preferences over global preferences', t => { t.plan(14) + let cwd = join(mock, 'prefs', 'local-over-global') let globalPrefsText = ` @sandbox environment testing @@ -160,19 +162,6 @@ testing production: null, } } - let localPrefsText = ` -@sandbox -environment staging - -@create -autocreate true - -@env -testing - env_var_2 bar -staging - env_var_3 fiz -` let localPrefs = { sandbox: { environment: 'staging', @@ -201,13 +190,11 @@ staging production: null, } } - let path = join(_homedir, '.prefs.arc') - let cwd = mockTmp({ - 'app.arc': arc, - [path]: globalPrefsText, - 'preferences.arc': localPrefsText + let tmp = mockTmp({ + [globalPrefsFile]: globalPrefsText, }) - inv({ cwd, _testing }, (err, result) => { + overrideHomedir(tmp) + inv({ cwd }, (err, result) => { if (err) t.fail(err) else { let { inv, get } = result @@ -228,7 +215,7 @@ staging delete inv._project.localPreferences._raw t.deepEqual(inv._project.globalPreferences, globalPrefs, 'Got correct global preferences') t.deepEqual(inv._project.localPreferences, localPrefs, 'Got correct local preferences') - t.equal(inv._project.globalPreferencesFile, join(cwd, path), 'Got correct preferences file') + t.equal(inv._project.globalPreferencesFile, join(tmp, globalPrefsFile), 'Got correct preferences file') t.equal(inv._project.localPreferencesFile, join(cwd, 'preferences.arc'), 'Got correct preferences file') t.teardown(reset) } diff --git a/test/lib/index.js b/test/lib/index.js index 620e3c53..23aeb6cd 100644 --- a/test/lib/index.js +++ b/test/lib/index.js @@ -1,10 +1,18 @@ -let { homedir } = require('os') +let os = require('os') let { is } = require('../../src/lib') -function getHomedir () { - let _homedir = homedir() - if (process.platform === 'win32') _homedir = _homedir.replace(/^[A-Z]:\\/, '') - return _homedir +let homedirBak +let tmpHomedir +function overrideHomedir (tmp) { + if (tmp) tmpHomedir = tmp + if (!homedirBak) homedirBak = os.homedir + os.homedir = () => tmpHomedir +} +overrideHomedir.reset = () => { + if (homedirBak) { + os.homedir = homedirBak + homedirBak = undefined + } } function setterPluginSetup (setter, fns) { @@ -18,6 +26,6 @@ function setterPluginSetup (setter, fns) { } module.exports = { - getHomedir, + overrideHomedir, setterPluginSetup, } diff --git a/test/mock/prefs/global/app.arc b/test/mock/prefs/global/app.arc new file mode 100644 index 00000000..b28bb98c --- /dev/null +++ b/test/mock/prefs/global/app.arc @@ -0,0 +1,5 @@ +@app +an-app + +@events +an-event diff --git a/test/mock/prefs/local-over-global/app.arc b/test/mock/prefs/local-over-global/app.arc new file mode 100644 index 00000000..b28bb98c --- /dev/null +++ b/test/mock/prefs/local-over-global/app.arc @@ -0,0 +1,5 @@ +@app +an-app + +@events +an-event diff --git a/test/mock/prefs/local-over-global/preferences.arc b/test/mock/prefs/local-over-global/preferences.arc new file mode 100644 index 00000000..53e86b05 --- /dev/null +++ b/test/mock/prefs/local-over-global/preferences.arc @@ -0,0 +1,11 @@ +@sandbox +environment staging + +@create +autocreate true + +@env +testing + env_var_2 bar +staging + env_var_3 fiz diff --git a/test/mock/prefs/local/app.arc b/test/mock/prefs/local/app.arc new file mode 100644 index 00000000..b28bb98c --- /dev/null +++ b/test/mock/prefs/local/app.arc @@ -0,0 +1,5 @@ +@app +an-app + +@events +an-event diff --git a/test/mock/prefs/local/prefs.arc b/test/mock/prefs/local/prefs.arc new file mode 100644 index 00000000..5a77337f --- /dev/null +++ b/test/mock/prefs/local/prefs.arc @@ -0,0 +1,6 @@ +@env +testing + foo bar + +@create +autocreate true diff --git a/test/unit/src/config/project/index-test.js b/test/unit/src/config/project/index-test.js index 88629fa9..f5f85512 100644 --- a/test/unit/src/config/project/index-test.js +++ b/test/unit/src/config/project/index-test.js @@ -3,7 +3,7 @@ let test = require('tape') let mockTmp = require('mock-tmp') let cwd = process.cwd() let testLibPath = join(cwd, 'test', 'lib') -let { getHomedir } = require(testLibPath) +let { overrideHomedir } = require(testLibPath) let inventoryDefaultsPath = join(process.cwd(), 'src', 'defaults') let inventoryDefaults = require(inventoryDefaultsPath) let defaultFunctionConfigPath = join(process.cwd(), 'src', 'defaults', 'function-config') @@ -11,10 +11,9 @@ let defaultFunctionConfig = require(defaultFunctionConfigPath) let sut = join(cwd, 'src', 'config', 'project') let getProjectConfig = require(sut) +let mock = join(cwd, 'test', 'mock') let localPrefsFile = 'prefs.arc' -let _homedir = getHomedir() -let globalPrefsFile = join(_homedir, 'prefs.arc') -let _testing = true +let globalPrefsFile = '.prefs.arc' test('Set up env', t => { t.plan(1) @@ -67,17 +66,10 @@ test('Project preferences', t => { t.plan(29) let arc = {} let errors = [] - let cwd, inventory, proj + let cwd, inventory, proj, tmp // Local preferences only - let localPrefs = `@env -testing - foo bar -@create -autocreate true` - cwd = mockTmp({ - [localPrefsFile]: localPrefs - }) + cwd = join(mock, 'prefs', 'local') inventory = inventoryDefaults({ cwd }) proj = getProjectConfig({ arc, errors, inventory }) t.equal(errors.length, 0, 'Did not error') @@ -90,7 +82,6 @@ autocreate true` t.equal(proj.globalPreferences, null, 'Did not populate globalPreferences') t.equal(proj.globalPreferencesFile, null, 'Did not populate globalPreferencesFile') t.equal(proj.env.local.testing.foo, 'bar', 'Populated env local/testing') - mockTmp.reset() // Global preferences only let globalPrefs = `@env @@ -98,11 +89,12 @@ testing fiz buz @sandbox useAWS true` - cwd = mockTmp({ + tmp = mockTmp({ [globalPrefsFile]: globalPrefs }) - inventory = inventoryDefaults({ cwd }) - proj = getProjectConfig({ arc, errors, inventory, _testing }) + overrideHomedir(tmp) + inventory = inventoryDefaults({ cwd: process.cwd() }) + proj = getProjectConfig({ arc, errors, inventory }) t.equal(errors.length, 0, 'Did not error') t.ok(proj.preferences, 'Populated preferences') t.equal(proj.preferences.env.testing.fiz, 'buz', 'Populated testing env') @@ -110,17 +102,17 @@ useAWS true` t.equal(proj.localPreferences, null, 'Did not populate localPreferences') t.equal(proj.localPreferencesFile, null, 'Did not populate localPreferencesFile') t.ok(proj.globalPreferences, 'Populated globalPreferences') - t.equal(proj.globalPreferencesFile, join(cwd, globalPrefsFile), 'Populated globalPreferencesFile') + t.equal(proj.globalPreferencesFile, join(tmp, globalPrefsFile), 'Populated globalPreferencesFile') t.equal(proj.env.local.testing.fiz, 'buz', 'Populated env local/testing') mockTmp.reset() // Merge local + global preferences - cwd = mockTmp({ - [localPrefsFile]: localPrefs, + tmp = mockTmp({ [globalPrefsFile]: globalPrefs, }) + overrideHomedir(tmp) inventory = inventoryDefaults({ cwd }) - proj = getProjectConfig({ arc, errors, inventory, _testing }) + proj = getProjectConfig({ arc, errors, inventory }) t.equal(errors.length, 0, 'Did not error') t.ok(proj.preferences, 'Populated preferences') t.equal(proj.preferences.env.testing.foo, 'bar', 'Populated testing env (preferred local to global prefs)') @@ -129,9 +121,10 @@ useAWS true` t.ok(proj.localPreferences, 'Populated localPreferences') t.equal(proj.localPreferencesFile, join(cwd, localPrefsFile), 'Populated localPreferencesFile') t.ok(proj.globalPreferences, 'Populated globalPreferences') - t.equal(proj.globalPreferencesFile, join(cwd, globalPrefsFile), 'Populated globalPreferencesFile') + t.equal(proj.globalPreferencesFile, join(tmp, globalPrefsFile), 'Populated globalPreferencesFile') t.equal(proj.env.local.testing.foo, 'bar', 'Populated env local/testing (preferred local to global prefs)') mockTmp.reset() + overrideHomedir.reset() }) test('Project plugins', t => { diff --git a/test/unit/src/config/project/prefs/index-test.js b/test/unit/src/config/project/prefs/index-test.js index 6bba19ae..80e56604 100644 --- a/test/unit/src/config/project/prefs/index-test.js +++ b/test/unit/src/config/project/prefs/index-test.js @@ -3,21 +3,22 @@ let test = require('tape') let mockTmp = require('mock-tmp') let cwd = process.cwd() let testLibPath = join(cwd, 'test', 'lib') -let { getHomedir } = require(testLibPath) +let { overrideHomedir } = require(testLibPath) let inventoryDefaultsPath = join(cwd, 'src', 'defaults') let inventoryDefaults = require(inventoryDefaultsPath) let sut = join(cwd, 'src', 'config', 'project', 'prefs') let getPrefs = require(sut) -let _homedir = getHomedir() -let path = join(_homedir, '.prefs.arc') -let reset = () => mockTmp.restore() +let path = '.prefs.arc' +let reset = () => { + mockTmp.reset() + overrideHomedir.reset() +} function clean (preferences) { // Delete the meta stuff so the actual preferences match during an equality check delete preferences._arc delete preferences._raw } -let _testing = true test('Set up env', t => { t.plan(1) @@ -70,13 +71,14 @@ testing env_var_1 foo env_var_2 bar ` - let cwd = mockTmp({ + let tmp = mockTmp({ [path]: prefsText }) + overrideHomedir(tmp) let inventory = inventoryDefaults({ cwd }) let errors = [] - let { preferences, preferencesFile } = getPrefs({ scope: 'global', inventory, errors, _testing }) + let { preferences, preferencesFile } = getPrefs({ scope: 'global', inventory, errors }) t.ok(preferences, 'Got preferences') t.ok(preferences._arc, 'Got (arc object)') t.ok(preferences._raw, 'Got (raw file)') @@ -202,12 +204,13 @@ test('Get preferences (only unknown items)', t => { @idk userland true ` - let cwd = mockTmp({ + let tmp = mockTmp({ [path]: prefsText }) + overrideHomedir(tmp) let inventory = inventoryDefaults({ cwd }) let errors = [] - let { preferences, preferencesFile } = getPrefs({ scope: 'global', inventory, errors, _testing }) + let { preferences, preferencesFile } = getPrefs({ scope: 'global', inventory, errors }) t.ok(preferences, 'Got preferences') t.ok(preferences._arc, 'Got (arc object)') t.ok(preferences._raw, 'Got (raw file)') @@ -221,17 +224,18 @@ userland true test('Validate preferences', t => { t.plan(7) let mock = () => mockTmp({ [path]: prefsText }) - let cwd, errors, inventory, prefsText + let errors, inventory, prefsText, tmp // Invalid @sandbox env prefsText = ` @sandbox env foo ` - cwd = mock() + tmp = mock() + overrideHomedir(tmp) inventory = inventoryDefaults({ cwd }) errors = [] - getPrefs({ scope: 'global', inventory, errors, _testing }) + getPrefs({ scope: 'global', inventory, errors }) t.equal(errors.length, 1, `Invalid preferences errored: ${errors[0]}`) // Invalid @env pragma @@ -239,10 +243,11 @@ env foo @env foo ` - cwd = mock() + tmp = mock() + overrideHomedir(tmp) inventory = inventoryDefaults({ cwd }) errors = [] - getPrefs({ scope: 'global', inventory, errors, _testing }) + getPrefs({ scope: 'global', inventory, errors }) t.equal(errors.length, 1, `Invalid preferences errored: ${errors[0]}`) // Invalid @env environments @@ -251,10 +256,11 @@ foo staging foo ` - cwd = mock() + tmp = mock() + overrideHomedir(tmp) inventory = inventoryDefaults({ cwd }) errors = [] - getPrefs({ scope: 'global', inventory, errors, _testing }) + getPrefs({ scope: 'global', inventory, errors }) t.equal(errors.length, 1, `Invalid preferences errored: ${errors[0]}`) prefsText = ` @@ -262,10 +268,11 @@ staging staging env-var-1 foo ` - cwd = mock() + tmp = mock() + overrideHomedir(tmp) inventory = inventoryDefaults({ cwd }) errors = [] - getPrefs({ scope: 'global', inventory, errors, _testing }) + getPrefs({ scope: 'global', inventory, errors }) t.equal(errors.length, 1, `Invalid preferences errored: ${errors[0]}`) prefsText = ` @@ -276,10 +283,11 @@ testing staging ` - cwd = mock() + tmp = mock() + overrideHomedir(tmp) inventory = inventoryDefaults({ cwd }) errors = [] - getPrefs({ scope: 'global', inventory, errors, _testing }) + getPrefs({ scope: 'global', inventory, errors }) t.equal(errors.length, 1, `Invalid preferences errored: ${errors[0]}`) prefsText = ` @@ -294,10 +302,11 @@ production env_var_1 foo env_var_2 bar ` - cwd = mock() + tmp = mock() + overrideHomedir(tmp) inventory = inventoryDefaults({ cwd }) errors = [] - getPrefs({ scope: 'global', inventory, errors, _testing }) + getPrefs({ scope: 'global', inventory, errors }) t.equal(errors.length, 1, `Invalid preferences errored: ${errors[0]}`) prefsText = ` @@ -308,10 +317,11 @@ staging env_var_1 foo env_var_2 bar ` - cwd = mock() + tmp = mock() + overrideHomedir(tmp) inventory = inventoryDefaults({ cwd }) errors = [] - getPrefs({ scope: 'global', inventory, errors, _testing }) + getPrefs({ scope: 'global', inventory, errors }) t.equal(errors.length, 1, `Invalid preferences errored: ${errors[0]}`) t.teardown(reset)