1
1
import { expect } from "chai" ;
2
2
import * as nock from "nock" ;
3
+ import * as sinon from "sinon" ;
4
+ import { configstore } from "./configstore" ;
3
5
4
6
import { check , ensure , POLL_SETTINGS } from "./ensureApiEnabled" ;
5
7
6
8
const FAKE_PROJECT_ID = "my_project" ;
7
9
const FAKE_API = "myapi.googleapis.com" ;
10
+ const FAKE_CACHE : Record < string , Record < string , boolean > > = {
11
+ my_project : { "myapi.googleapis.com" : true } ,
12
+ } ;
8
13
9
14
describe ( "ensureApiEnabled" , ( ) => {
10
15
describe ( "check" , ( ) => {
16
+ const sandbox = sinon . createSandbox ( ) ;
17
+ let configstoreGetMock : sinon . SinonStub ;
18
+ let configstoreSetMock : sinon . SinonStub ;
11
19
before ( ( ) => {
12
20
nock . disableNetConnect ( ) ;
13
21
} ) ;
14
22
15
23
after ( ( ) => {
16
24
nock . enableNetConnect ( ) ;
17
25
} ) ;
26
+
27
+ beforeEach ( ( ) => {
28
+ configstoreGetMock = sandbox . stub ( configstore , "get" ) ;
29
+ configstoreSetMock = sandbox . stub ( configstore , "set" ) ;
30
+ } ) ;
31
+
32
+ afterEach ( ( ) => {
33
+ sandbox . restore ( ) ;
34
+ } ) ;
35
+
18
36
for ( const prefix of [ "" , "https://" , "http://" ] ) {
19
37
it ( "should call the API to check if it's enabled" , async ( ) => {
38
+ configstoreGetMock . returns ( undefined ) ;
39
+ configstoreSetMock . returns ( undefined ) ;
20
40
nock ( "https://serviceusage.googleapis.com" )
21
41
. get ( `/v1/projects/${ FAKE_PROJECT_ID } /services/${ FAKE_API } ` )
22
42
. matchHeader ( "x-goog-quota-user" , `projects/${ FAKE_PROJECT_ID } ` )
@@ -25,9 +45,12 @@ describe("ensureApiEnabled", () => {
25
45
await check ( FAKE_PROJECT_ID , prefix + FAKE_API , "" , true ) ;
26
46
27
47
expect ( nock . isDone ( ) ) . to . be . true ;
48
+ expect ( configstoreSetMock . calledWith ( FAKE_PROJECT_ID , FAKE_API ) ) ;
28
49
} ) ;
29
50
30
51
it ( "should return the value from the API" , async ( ) => {
52
+ configstoreGetMock . returns ( undefined ) ;
53
+ configstoreSetMock . returns ( undefined ) ;
31
54
nock ( "https://serviceusage.googleapis.com" )
32
55
. get ( `/v1/projects/${ FAKE_PROJECT_ID } /services/${ FAKE_API } ` )
33
56
. matchHeader ( "x-goog-quota-user" , `projects/${ FAKE_PROJECT_ID } ` )
@@ -44,26 +67,41 @@ describe("ensureApiEnabled", () => {
44
67
45
68
await expect ( check ( FAKE_PROJECT_ID , prefix + FAKE_API , "" , true ) ) . to . eventually . be . false ;
46
69
} ) ;
70
+ it ( "should skip the API call if the enablement is saved in the cache" , async ( ) => {
71
+ configstoreGetMock . returns ( FAKE_CACHE ) ;
72
+ configstoreSetMock . returns ( undefined ) ;
73
+
74
+ await expect ( check ( FAKE_PROJECT_ID , prefix + FAKE_API , "" , true ) ) . to . eventually . be . true ;
75
+ } ) ;
47
76
}
48
77
} ) ;
49
78
50
79
describe ( "ensure" , ( ) => {
80
+ const sandbox = sinon . createSandbox ( ) ;
81
+ let configstoreGetMock : sinon . SinonStub ;
82
+ let configstoreSetMock : sinon . SinonStub ;
51
83
const originalPollInterval = POLL_SETTINGS . pollInterval ;
52
84
const originalPollsBeforeRetry = POLL_SETTINGS . pollsBeforeRetry ;
53
85
beforeEach ( ( ) => {
54
86
nock . disableNetConnect ( ) ;
55
87
POLL_SETTINGS . pollInterval = 0 ;
56
88
POLL_SETTINGS . pollsBeforeRetry = 0 ; // Zero means "one check".
89
+
90
+ configstoreGetMock = sandbox . stub ( configstore , "get" ) ;
91
+ configstoreSetMock = sandbox . stub ( configstore , "set" ) ;
57
92
} ) ;
58
93
59
94
afterEach ( ( ) => {
60
95
nock . enableNetConnect ( ) ;
61
96
POLL_SETTINGS . pollInterval = originalPollInterval ;
62
97
POLL_SETTINGS . pollsBeforeRetry = originalPollsBeforeRetry ;
98
+ sandbox . restore ( ) ;
63
99
} ) ;
64
100
65
101
for ( const prefix of [ "" , "https://" , "http://" ] ) {
66
102
it ( "should verify that the API is enabled, and stop if it is" , async ( ) => {
103
+ configstoreGetMock . returns ( undefined ) ;
104
+ configstoreSetMock . returns ( undefined ) ;
67
105
nock ( "https://serviceusage.googleapis.com" )
68
106
. get ( `/v1/projects/${ FAKE_PROJECT_ID } /services/${ FAKE_API } ` )
69
107
. matchHeader ( "x-goog-quota-user" , `projects/${ FAKE_PROJECT_ID } ` )
@@ -73,7 +111,16 @@ describe("ensureApiEnabled", () => {
73
111
await expect ( ensure ( FAKE_PROJECT_ID , prefix + FAKE_API , "" , true ) ) . to . not . be . rejected ;
74
112
} ) ;
75
113
114
+ it ( "should verify that the API is enabled (in the cache), and stop if it is" , async ( ) => {
115
+ configstoreGetMock . returns ( FAKE_CACHE ) ;
116
+ configstoreSetMock . returns ( undefined ) ;
117
+
118
+ await expect ( ensure ( FAKE_PROJECT_ID , prefix + FAKE_API , "" , true ) ) . to . not . be . rejected ;
119
+ } ) ;
120
+
76
121
it ( "should attempt to enable the API if it is not enabled" , async ( ) => {
122
+ configstoreGetMock . returns ( undefined ) ;
123
+ configstoreSetMock . returns ( undefined ) ;
77
124
nock ( "https://serviceusage.googleapis.com" )
78
125
. get ( `/v1/projects/${ FAKE_PROJECT_ID } /services/${ FAKE_API } ` )
79
126
. matchHeader ( "x-goog-quota-user" , `projects/${ FAKE_PROJECT_ID } ` )
@@ -94,9 +141,12 @@ describe("ensureApiEnabled", () => {
94
141
await expect ( ensure ( FAKE_PROJECT_ID , prefix + FAKE_API , "" , true ) ) . to . not . be . rejected ;
95
142
96
143
expect ( nock . isDone ( ) ) . to . be . true ;
144
+ expect ( configstoreSetMock . calledWith ( FAKE_PROJECT_ID , FAKE_API ) ) ;
97
145
} ) ;
98
146
99
147
it ( "should retry enabling the API if it does not enable in time" , async ( ) => {
148
+ configstoreGetMock . returns ( undefined ) ;
149
+ configstoreSetMock . returns ( undefined ) ;
100
150
nock ( "https://serviceusage.googleapis.com" )
101
151
. get ( `/v1/projects/${ FAKE_PROJECT_ID } /services/${ FAKE_API } ` )
102
152
. matchHeader ( "x-goog-quota-user" , `projects/${ FAKE_PROJECT_ID } ` )
0 commit comments