@@ -6,6 +6,7 @@ import { getHomeDir } from "./getHomeDir";
6
6
jest . mock ( "os" ) ;
7
7
8
8
describe ( getHomeDir . name , ( ) => {
9
+ const mockUid = 1 ;
9
10
const mockHOME = "mockHOME" ;
10
11
const mockUSERPROFILE = "mockUSERPROFILE" ;
11
12
const mockHOMEPATH = "mockHOMEPATH" ;
@@ -28,23 +29,28 @@ describe(getHomeDir.name, () => {
28
29
afterEach ( ( ) => {
29
30
process . env = OLD_ENV ;
30
31
jest . clearAllMocks ( ) ;
31
- jest . resetModules ( ) ;
32
32
} ) ;
33
33
34
34
it ( "returns value in process.env.HOME first" , ( ) => {
35
35
expect ( getHomeDir ( ) ) . toEqual ( mockHOME ) ;
36
+ expect ( homedir ) . not . toHaveBeenCalled ( ) ;
36
37
} ) ;
37
38
38
39
it ( "returns value in process.env.USERPROFILE second" , ( ) => {
39
40
process . env = { ...process . env , HOME : undefined } ;
40
41
expect ( getHomeDir ( ) ) . toEqual ( mockUSERPROFILE ) ;
42
+ expect ( homedir ) . not . toHaveBeenCalled ( ) ;
41
43
} ) ;
42
44
43
45
describe ( "returns value in HOMEPATH third" , ( ) => {
44
46
beforeEach ( ( ) => {
45
47
process . env = { ...process . env , HOME : undefined , USERPROFILE : undefined } ;
46
48
} ) ;
47
49
50
+ afterEach ( ( ) => {
51
+ expect ( homedir ) . not . toHaveBeenCalled ( ) ;
52
+ } ) ;
53
+
48
54
it ( "uses value in process.env.HOMEDRIVE if it's set" , ( ) => {
49
55
expect ( getHomeDir ( ) ) . toEqual ( `${ mockHOMEDRIVE } ${ mockHOMEPATH } ` ) ;
50
56
} ) ;
@@ -56,7 +62,84 @@ describe(getHomeDir.name, () => {
56
62
} ) ;
57
63
58
64
it ( "returns value from homedir fourth" , ( ) => {
65
+ const processGeteuidSpy = jest . spyOn ( process , "geteuid" ) . mockReturnValue ( mockUid ) ;
59
66
process . env = { ...process . env , HOME : undefined , USERPROFILE : undefined , HOMEPATH : undefined } ;
60
67
expect ( getHomeDir ( ) ) . toEqual ( mockHomeDir ) ;
68
+ expect ( homedir ) . toHaveBeenCalledTimes ( 1 ) ;
69
+ expect ( processGeteuidSpy ) . toHaveBeenCalledTimes ( 1 ) ;
70
+ } ) ;
71
+
72
+ describe ( "makes one homedir call irrespective of getHomeDir calls" , ( ) => {
73
+ const testSingleHomeDirCall = ( num : number ) => {
74
+ jest . isolateModules ( ( ) => {
75
+ const { getHomeDir } = require ( "./getHomeDir" ) ;
76
+ process . env = { ...process . env , HOME : undefined , USERPROFILE : undefined , HOMEPATH : undefined } ;
77
+
78
+ expect ( homedir ) . not . toHaveBeenCalled ( ) ;
79
+ const homeDirArr = Array ( num )
80
+ . fill ( num )
81
+ . map ( ( ) => getHomeDir ( ) ) ;
82
+ expect ( homeDirArr ) . toStrictEqual ( Array ( num ) . fill ( mockHomeDir ) ) ;
83
+
84
+ // There is one homedir call even through getHomeDir is called num times.
85
+ expect ( homedir ) . toHaveBeenCalledTimes ( 1 ) ;
86
+ } ) ;
87
+ } ;
88
+
89
+ describe ( "when geteuid is available" , ( ) => {
90
+ it . each ( [ 10 , 100 , 1000 , 10000 ] ) ( "calls: %d " , ( num : number ) => {
91
+ const processGeteuidSpy = jest . spyOn ( process , "geteuid" ) . mockReturnValue ( mockUid ) ;
92
+ expect ( processGeteuidSpy ) . not . toHaveBeenCalled ( ) ;
93
+ testSingleHomeDirCall ( num ) ;
94
+ expect ( processGeteuidSpy ) . toHaveBeenCalledTimes ( num ) ;
95
+ } ) ;
96
+ } ) ;
97
+
98
+ describe ( "when geteuid is not available" , ( ) => {
99
+ const OLD_GETEUID = process . geteuid ;
100
+
101
+ beforeAll ( ( ) => {
102
+ // @ts -ignore Type 'undefined' is not assignable to type '() => number'.
103
+ process . geteuid = undefined ;
104
+ } ) ;
105
+
106
+ afterAll ( ( ) => {
107
+ process . geteuid = OLD_GETEUID ;
108
+ } ) ;
109
+
110
+ it . each ( [ 10 , 100 , 1000 , 10000 ] ) ( "calls: %d " , testSingleHomeDirCall ) ;
111
+ } ) ;
112
+ } ) ;
113
+
114
+ describe ( "makes multiple homedir calls with based on UIDs" , ( ) => {
115
+ it . each ( [ 2 , 10 , 100 ] ) ( "calls: %d " , ( num : number ) => {
116
+ jest . isolateModules ( ( ) => {
117
+ const { getHomeDir } = require ( "./getHomeDir" ) ;
118
+ const processGeteuidSpy = jest . spyOn ( process , "geteuid" ) . mockReturnValue ( mockUid ) ;
119
+ for ( let i = 0 ; i < num ; i ++ ) {
120
+ jest . spyOn ( process , "geteuid" ) . mockReturnValueOnce ( mockUid + i ) ;
121
+ }
122
+ process . env = { ...process . env , HOME : undefined , USERPROFILE : undefined , HOMEPATH : undefined } ;
123
+
124
+ expect ( homedir ) . not . toHaveBeenCalled ( ) ;
125
+ expect ( processGeteuidSpy ) . not . toHaveBeenCalled ( ) ;
126
+ const homeDirArr = Array ( num )
127
+ . fill ( num )
128
+ . map ( ( ) => getHomeDir ( ) ) ;
129
+ expect ( homeDirArr ) . toStrictEqual ( Array ( num ) . fill ( mockHomeDir ) ) ;
130
+
131
+ // There is num homedir calls as each call returns different UID
132
+ expect ( homedir ) . toHaveBeenCalledTimes ( num ) ;
133
+ expect ( processGeteuidSpy ) . toHaveBeenCalledTimes ( num ) ;
134
+
135
+ const homeDir = getHomeDir ( ) ;
136
+ expect ( homeDir ) . toStrictEqual ( mockHomeDir ) ;
137
+
138
+ // No extra calls made to homedir, as mockUid is same as the first call.
139
+ expect ( homedir ) . toHaveBeenCalledTimes ( num ) ;
140
+ // Extra call was made to geteuid to get the same UID as the first call.
141
+ expect ( processGeteuidSpy ) . toHaveBeenCalledTimes ( num + 1 ) ;
142
+ } ) ;
143
+ } ) ;
61
144
} ) ;
62
145
} ) ;
0 commit comments