1
1
const fs = require ( 'fs' )
2
- // const os = require('os')
3
- // const path = require('path')
2
+ const os = require ( 'os' )
3
+ const path = require ( 'path' )
4
4
5
5
const sinon = require ( 'sinon' )
6
6
const t = require ( 'tap' )
7
7
8
8
const dotenv = require ( '../lib/main' )
9
9
10
- const mockParseResponse = { test : 'foo' }
10
+ t . beforeEach ( ( ) => {
11
+ delete process . env . BASIC // reset
12
+ } )
11
13
12
14
t . test ( 'takes string for path option' , ct => {
13
- ct . plan ( 2 )
14
-
15
15
const testPath = 'tests/.env'
16
16
const env = dotenv . config ( { path : testPath } )
17
17
18
18
ct . equal ( env . parsed . BASIC , 'basic' )
19
19
ct . equal ( process . env . BASIC , 'basic' )
20
+
21
+ ct . end ( )
20
22
} )
21
23
22
24
t . test ( 'takes array for path option' , ct => {
23
- ct . plan ( 2 )
24
-
25
25
const testPath = [ 'tests/.env' ]
26
26
const env = dotenv . config ( { path : testPath } )
27
27
28
28
ct . equal ( env . parsed . BASIC , 'basic' )
29
29
ct . equal ( process . env . BASIC , 'basic' )
30
+
31
+ ct . end ( )
30
32
} )
31
33
32
34
t . test ( 'takes two or more files in the array for path option' , ct => {
33
- ct . plan ( 2 )
34
-
35
35
const testPath = [ 'tests/.env.local' , 'tests/.env' ]
36
36
const env = dotenv . config ( { path : testPath } )
37
37
38
38
ct . equal ( env . parsed . BASIC , 'local_basic' )
39
39
ct . equal ( process . env . BASIC , 'local_basic' )
40
+
41
+ ct . end ( )
40
42
} )
41
43
42
44
t . test ( 'takes URL for path option' , ct => {
43
- ct . plan ( 2 )
45
+ const envPath = path . resolve ( __dirname , '.env' )
46
+ const fileUrl = new URL ( `file://${ envPath } ` )
44
47
45
- const testPath = new URL ( 'file://home/user/project/.env' )
46
- const env = dotenv . config ( { path : testPath } )
48
+ const env = dotenv . config ( { path : fileUrl } )
47
49
48
50
ct . equal ( env . parsed . BASIC , 'basic' )
49
51
ct . equal ( process . env . BASIC , 'basic' )
52
+
53
+ ct . end ( )
50
54
} )
51
55
52
- // t.test('takes option for path along with home directory char ~', ct => {
53
- // ct.plan(2)
54
- // const mockedHomedir = '/Users/dummy'
55
- // const homedirStub = sinon.stub(os, 'homedir').returns(mockedHomedir)
56
- // const testPath = '~/.env'
57
- // dotenv.config({ path: testPath })
58
- //
59
- // ct.equal(readFileSyncStub.args[0][0], path.join(mockedHomedir, '.env'))
60
- // ct.ok(homedirStub.called)
61
- // homedirStub.restore()
62
- // })
56
+ t . test ( 'takes option for path along with home directory char ~' , ct => {
57
+ const readFileSyncStub = sinon . stub ( fs , 'readFileSync' ) . returns ( 'test=foo' )
58
+ const mockedHomedir = '/Users/dummy'
59
+ const homedirStub = sinon . stub ( os , 'homedir' ) . returns ( mockedHomedir )
60
+ const testPath = '~/.env'
61
+ dotenv . config ( { path : testPath } )
63
62
64
- t . test ( 'takes option for encoding' , ct => {
65
- ct . plan ( 1 )
63
+ ct . equal ( readFileSyncStub . args [ 0 ] [ 0 ] , path . join ( mockedHomedir , '.env' ) )
64
+ ct . ok ( homedirStub . called )
66
65
67
- const testEncoding = 'latin1'
68
- dotenv . config ( { encoding : testEncoding } )
66
+ homedirStub . restore ( )
67
+ readFileSyncStub . restore ( )
68
+ ct . end ( )
69
+ } )
69
70
71
+ t . test ( 'takes option for encoding' , ct => {
70
72
const readFileSyncStub = sinon . stub ( fs , 'readFileSync' ) . returns ( 'test=foo' )
71
73
74
+ const testEncoding = 'latin1'
75
+ dotenv . config ( { encoding : testEncoding } )
72
76
ct . equal ( readFileSyncStub . args [ 0 ] [ 1 ] . encoding , testEncoding )
77
+
73
78
readFileSyncStub . restore ( )
79
+ ct . end ( )
74
80
} )
75
81
76
82
t . test ( 'takes option for debug' , ct => {
77
- ct . plan ( 1 )
78
-
79
83
const logStub = sinon . stub ( console , 'log' )
80
- dotenv . config ( { debug : 'true' } )
81
84
85
+ dotenv . config ( { debug : 'true' } )
82
86
ct . ok ( logStub . called )
87
+
83
88
logStub . restore ( )
89
+ ct . end ( )
84
90
} )
85
91
86
92
t . test ( 'reads path with encoding, parsing output to process.env' , ct => {
87
- ct . plan ( 2 )
93
+ const readFileSyncStub = sinon . stub ( fs , 'readFileSync' ) . returns ( 'BASIC=basic' )
94
+ const parseStub = sinon . stub ( dotenv , 'parse' ) . returns ( { BASIC : 'basic' } )
88
95
89
- const env = dotenv . config ( )
96
+ const res = dotenv . config ( )
90
97
91
- ct . same ( env . parsed . BASIC , 'basic' )
92
- ct . same ( process . env . BASIC , 'basic' )
98
+ ct . same ( res . parsed , { BASIC : 'basic' } )
99
+ ct . equal ( readFileSyncStub . callCount , 1 )
100
+
101
+ readFileSyncStub . restore ( )
102
+ parseStub . restore ( )
103
+
104
+ ct . end ( )
93
105
} )
94
106
95
107
t . test ( 'does not write over keys already in process.env' , ct => {
96
- ct . plan ( 2 )
97
-
108
+ const testPath = 'tests/.env'
98
109
const existing = 'bar'
99
110
process . env . BASIC = existing
100
- const env = dotenv . config ( )
111
+ const env = dotenv . config ( { path : testPath } )
101
112
102
113
ct . equal ( env . parsed . BASIC , 'basic' )
103
114
ct . equal ( process . env . BASIC , existing )
115
+
116
+ ct . end ( )
104
117
} )
105
118
106
119
t . test ( 'does write over keys already in process.env if override turned on' , ct => {
107
- ct . plan ( 2 )
108
-
120
+ const testPath = 'tests/.env'
109
121
const existing = 'bar'
110
122
process . env . BASIC = existing
111
- const env = dotenv . config ( { override : true } )
123
+ const env = dotenv . config ( { path : testPath , override : true } )
112
124
113
125
ct . equal ( env . parsed . BASIC , 'basic' )
114
126
ct . equal ( process . env . BASIC , 'basic' )
127
+
128
+ ct . end ( )
115
129
} )
116
130
117
131
t . test ( 'does not write over keys already in process.env if the key has a falsy value' , ct => {
118
- ct . plan ( 2 )
119
-
132
+ const testPath = 'tests/.env'
120
133
const existing = ''
121
134
process . env . BASIC = existing
122
- const env = dotenv . config ( )
135
+ const env = dotenv . config ( { path : testPath } )
123
136
124
137
ct . equal ( env . parsed . BASIC , 'basic' )
125
- ct . equal ( process . env . BASIC , undefined )
138
+ ct . equal ( process . env . BASIC , '' )
139
+
140
+ ct . end ( )
126
141
} )
127
142
128
143
t . test ( 'does write over keys already in process.env if the key has a falsy value but override is set to true' , ct => {
129
- ct . plan ( 2 )
130
-
144
+ const testPath = 'tests/.env'
131
145
const existing = ''
132
146
process . env . BASIC = existing
133
- // 'foo' returned as value in `beforeEach`. should keep this ''
134
- const env = dotenv . config ( { override : true } )
147
+ const env = dotenv . config ( { path : testPath , override : true } )
135
148
136
149
ct . equal ( env . parsed . BASIC , 'basic' )
137
- ct . equal ( process . env . BASIC , '' )
138
- // ct.ok(process.env.test )
150
+ ct . equal ( process . env . BASIC , 'basic ' )
151
+ ct . end ( )
139
152
} )
140
153
141
154
t . test ( 'can write to a different object rather than process.env' , ct => {
142
- ct . plan ( 3 )
143
-
155
+ const testPath = 'tests/.env'
144
156
process . env . BASIC = 'other' // reset process.env
145
157
146
158
const myObject = { }
147
- const env = dotenv . config ( { processEnv : myObject } )
159
+ const env = dotenv . config ( { path : testPath , processEnv : myObject } )
148
160
149
161
ct . equal ( env . parsed . BASIC , 'basic' )
150
162
console . log ( 'logging' , process . env . BASIC )
151
163
ct . equal ( process . env . BASIC , 'other' )
152
164
ct . equal ( myObject . BASIC , 'basic' )
165
+
166
+ ct . end ( )
153
167
} )
154
168
155
169
t . test ( 'returns parsed object' , ct => {
156
- ct . plan ( 2 )
157
-
158
- const env = dotenv . config ( )
170
+ const testPath = 'tests/.env'
171
+ const env = dotenv . config ( { path : testPath } )
159
172
160
173
ct . notOk ( env . error )
161
- ct . same ( env . parsed , mockParseResponse )
174
+ ct . equal ( env . parsed . BASIC , 'basic' )
175
+
176
+ ct . end ( )
162
177
} )
163
178
164
179
t . test ( 'returns any errors thrown from reading file or parsing' , ct => {
165
- ct . plan ( 1 )
166
-
167
180
const readFileSyncStub = sinon . stub ( fs , 'readFileSync' ) . returns ( 'test=foo' )
168
181
169
182
readFileSyncStub . throws ( )
@@ -172,6 +185,8 @@ t.test('returns any errors thrown from reading file or parsing', ct => {
172
185
ct . type ( env . error , Error )
173
186
174
187
readFileSyncStub . restore ( )
188
+
189
+ ct . end ( )
175
190
} )
176
191
177
192
t . test ( 'logs any errors thrown from reading file or parsing when in debug mode' , ct => {
0 commit comments