'use strict' const chai = require('chai') const path = require('path') const sinon = require('sinon') const overrideEnv = require('process-utils/override-env') const fsp = require('fs').promises const loadEnv = require('../../../../lib/cli/load-dotenv') const dotenv = require('dotenv') const ServerlessError = require('../../../../lib/serverless-error') chai.use(require('chai-as-promised')) const expect = require('chai').expect describe('test/unit/lib/cli/load-dotenv.test.js', () => { let restoreEnv before(async () => { const stage = 'testing' const stageFileContent = 'FROM_STAGE=valuefromstage' await fsp.writeFile( path.join(process.cwd(), `.env.${stage}`), stageFileContent, ) const defaultFileContent = 'FROM_DEFAULT=valuefromdefault' await fsp.writeFile(path.join(process.cwd(), '.env'), defaultFileContent) }) beforeEach(() => { restoreEnv = overrideEnv().restoreEnv }) afterEach(() => { restoreEnv && restoreEnv() }) it('should load matching stage env file if present', async () => { await loadEnv('testing') expect(process.env).to.not.have.property('FROM_DEFAULT') expect(process.env.FROM_STAGE).to.equal('valuefromstage') }) it('should load from default env file if present and no matching stage file found', async () => { await loadEnv('nonmatchingstage') expect(process.env.FROM_DEFAULT).to.equal('valuefromdefault') expect(process.env).to.not.have.property('FROM_STAGE') }) it('should throw ServerlessError if dotenv returns error other than missing file', () => { const errorMessage = 'Unexpected error while loading env' const dotenvResult = sinon .stub(dotenv, 'config') .returns({ error: new Error(errorMessage) }) expect(() => loadEnv('testing')) .to.throw(ServerlessError) .with.property('code', 'DOTENV_LOAD_ERROR') dotenvResult.restore() }) })