@@ -10,30 +10,53 @@ const validEnvFilePath = '../fixtures/dotenv/valid.env';
1010const nodeOptionsEnvFilePath = '../fixtures/dotenv/node-options.env' ;
1111
1212describe ( '.env supports edge cases' , ( ) => {
13-
14- it ( 'supports multiple declarations' , async ( ) => {
15- // process.env.BASIC is equal to `basic` because the second .env file overrides it.
13+ it ( 'supports multiple declarations, including optional ones' , async ( ) => {
1614 const code = `
1715 const assert = require('assert');
1816 assert.strictEqual(process.env.BASIC, 'basic');
1917 assert.strictEqual(process.env.NODE_NO_WARNINGS, '1');
2018 ` . trim ( ) ;
19+ const children = await Promise . all ( Array . from ( { length : 4 } , ( _ , i ) =>
20+ common . spawnPromisified (
21+ process . execPath ,
22+ [
23+ // Bitwise AND to create all 4 possible combinations:
24+ // i & 0b01 is truthy when i has value 0bx1 (i.e. 0b01 (1) and 0b11 (3)), falsy otherwise.
25+ // i & 0b10 is truthy when i has value 0b1x (i.e. 0b10 (2) and 0b11 (3)), falsy otherwise.
26+ `${ i & 0b01 ? '--env-file' : '--env-file-if-exists' } =${ nodeOptionsEnvFilePath } ` ,
27+ `${ i & 0b10 ? '--env-file' : '--env-file-if-exists' } =${ validEnvFilePath } ` ,
28+ '--eval' , code ,
29+ ] ,
30+ { cwd : __dirname } ,
31+ ) ) ) ;
32+ assert . deepStrictEqual ( children , Array . from ( { length : 4 } , ( ) => ( {
33+ code : 0 ,
34+ signal : null ,
35+ stdout : '' ,
36+ stderr : '' ,
37+ } ) ) ) ;
38+ } ) ;
39+
40+ it ( 'supports absolute paths' , async ( ) => {
41+ const code = `
42+ require('assert').strictEqual(process.env.BASIC, 'basic');
43+ ` . trim ( ) ;
2144 const child = await common . spawnPromisified (
2245 process . execPath ,
23- [ `--env-file=${ nodeOptionsEnvFilePath } ` , `--env-file=${ validEnvFilePath } ` , '--eval' , code ] ,
24- { cwd : __dirname } ,
46+ [ `--env-file=${ path . resolve ( __dirname , validEnvFilePath ) } ` , '--eval' , code ] ,
2547 ) ;
2648 assert . strictEqual ( child . stderr , '' ) ;
2749 assert . strictEqual ( child . code , 0 ) ;
2850 } ) ;
2951
30- it ( 'supports absolute paths ' , async ( ) => {
52+ it ( 'supports a space instead of \'=\' for the flag ' , async ( ) => {
3153 const code = `
3254 require('assert').strictEqual(process.env.BASIC, 'basic');
3355 ` . trim ( ) ;
3456 const child = await common . spawnPromisified (
3557 process . execPath ,
36- [ `--env-file=${ path . resolve ( __dirname , validEnvFilePath ) } ` , '--eval' , code ] ,
58+ [ '--env-file' , validEnvFilePath , '--eval' , code ] ,
59+ { cwd : __dirname } ,
3760 ) ;
3861 assert . strictEqual ( child . stderr , '' ) ;
3962 assert . strictEqual ( child . code , 0 ) ;
@@ -48,10 +71,23 @@ describe('.env supports edge cases', () => {
4871 [ '--env-file=.env' , '--eval' , code ] ,
4972 { cwd : __dirname } ,
5073 ) ;
51- assert . notStrictEqual ( child . stderr . toString ( ) , '' ) ;
74+ assert . notStrictEqual ( child . stderr , '' ) ;
5275 assert . strictEqual ( child . code , 9 ) ;
5376 } ) ;
5477
78+ it ( 'should handle non-existent optional .env file' , async ( ) => {
79+ const code = `
80+ require('assert').strictEqual(1,1);
81+ ` . trim ( ) ;
82+ const child = await common . spawnPromisified (
83+ process . execPath ,
84+ [ '--env-file-if-exists=.env' , '--eval' , code ] ,
85+ { cwd : __dirname } ,
86+ ) ;
87+ assert . notStrictEqual ( child . stderr , '' ) ;
88+ assert . strictEqual ( child . code , 0 ) ;
89+ } ) ;
90+
5591 it ( 'should not override existing environment variables but introduce new vars' , async ( ) => {
5692 const code = `
5793 require('assert').strictEqual(process.env.BASIC, 'existing');
@@ -106,7 +142,7 @@ describe('.env supports edge cases', () => {
106142 '--eval' , `require('assert').strictEqual(process.env.BASIC, undefined);` ,
107143 '--' , '--env-file' , validEnvFilePath ,
108144 ] ,
109- { cwd : fixtures . path ( 'dotenv' ) } ,
145+ { cwd : __dirname } ,
110146 ) ;
111147 assert . strictEqual ( child . stdout , '' ) ;
112148 assert . strictEqual ( child . stderr , '' ) ;
0 commit comments