@@ -27,45 +27,105 @@ var isString = is.string;
2727var isEmpty = is . empty ;
2828var forEach = require ( 'lodash.foreach' ) ;
2929var assign = require ( 'lodash.assign' ) ;
30+ var pick = require ( 'lodash.pick' ) ;
31+ var omitBy = require ( 'lodash.omitby' ) ;
3032const ERR_TOKEN = '_@google_STACKDRIVER_INTEGRATION_TEST_ERROR__' ;
31-
32-
33- describe ( 'Behvaiour acceptance testing' , function ( ) {
34- before ( function ( ) {
35- // Before starting the suite make sure we have the proper resources
36- if ( ! isString ( process . env . GCLOUD_PROJECT ) ) {
37- throw new Error (
38- 'The gcloud project id (GCLOUD_PROJECT) was not set in the env' ) ;
39- } else if ( ! isString ( process . env . STUBBED_API_KEY ) ) {
40- throw new Error (
41- 'The api key (STUBBED_API_KEY) was not set as an env variable' ) ;
42- } else if ( ! isString ( process . env . STUBBED_PROJECT_NUM ) ) {
43- throw new Error (
44- 'The project number (STUBBED_PROJECT_NUM) was not set in the env' ) ;
45- } else if ( process . env . NODE_ENV !== 'production' ) {
46- throw new Error (
47- 'The NODE_ENV is not set to production as an env variable. Please ' +
48- 'set NODE_ENV to production' ) ;
33+ const env = ( function ( injectedEnv ) {
34+ const envKeys = [ 'GOOGLE_APPLICATION_CREDENTIALS' , 'GCLOUD_PROJECT' ,
35+ 'NODE_ENV' ] ;
36+ class InstancedEnv {
37+ constructor ( ) {
38+ assign ( this , injectedEnv ) ;
39+ this . _originalEnv = this . _captureProcessProperties ( ) ;
4940 }
50- // In case we are running after unit mocks which were not destroyed properly
51- nock . cleanAll ( ) ;
52- } ) ;
41+ _captureProcessProperties ( ) {
42+ return omitBy ( pick ( process . env , envKeys ) , value => ! isString ( value ) ) ;
43+ }
44+ sterilizeProcess ( ) {
45+ forEach ( envKeys , ( v , k ) => delete process . env [ k ] ) ;
46+ return this ;
47+ }
48+ setProjectId ( ) {
49+ assign ( process . env , {
50+ GCLOUD_PROJECT : injectedEnv . projectId
51+ } ) ;
52+ return this ;
53+ }
54+ setProjectNumber ( ) {
55+ assign ( process . env , {
56+ GCLOUD_PROJECT : injectedEnv . projectNumber
57+ } ) ;
58+ return this ;
59+ }
60+ setKeyFilename ( ) {
61+ assign ( process . env , {
62+ GOOGLE_APPLICATION_CREDENTIALS : injectedEnv . keyFilename
63+ } ) ;
64+ return this ;
65+ }
66+ setProduction ( ) {
67+ assign ( process . env , {
68+ NODE_ENV : 'production'
69+ } ) ;
70+ return this ;
71+ }
72+ restoreProcessToOriginalState ( ) {
73+ assign ( process . env , this . _originalEnv ) ;
74+ return this ;
75+ }
76+ injected ( ) {
77+ return assign ( { } , injectedEnv ) ;
78+ }
79+ }
80+ return new InstancedEnv ( ) ;
81+ } ( require ( '../../../system-test/env.js' ) ) ) ;
82+ const SHOULD_RUN = ( function ( ) {
83+ if ( ! isString ( env . injected ( ) . projectId ) ) {
84+ return new Error ( 'The project id (projectId) was not set in the env' ) ;
85+ }
86+ if ( ! isString ( env . injected ( ) . apiKey ) ) {
87+ return new Error ( 'The api key (apiKey) was not set as an env variable' ) ;
88+ }
89+ if ( ! isString ( env . injected ( ) . projectNumber ) ) {
90+ return new Error (
91+ 'The project number (projectNumber) was not set in the env' ) ;
92+ }
93+ if ( ! isString ( env . injected ( ) . keyFilename ) ) {
94+ return new Error (
95+ 'The key filename (keyFilename) was not set in the env' ) ;
96+ }
97+ return true ;
98+ } ( ) ) ;
99+ const TEST_RUNNER = ( function ( ) {
100+ if ( SHOULD_RUN instanceof Error ) {
101+ console . log ( 'Skipping error-reporting system tests:' ) ;
102+ console . log ( ' ' + SHOULD_RUN . message ) ;
103+ return describe . skip ;
104+ }
105+ return describe ;
106+ } ( ) ) ;
107+
108+ ( TEST_RUNNER ) ( 'Errors system tests' , function ( ) {
53109 describe ( 'Request/Response lifecycle mocking' , function ( ) {
54110 var sampleError = new Error ( ERR_TOKEN ) ;
55111 var errorMessage = new ErrorMessage ( ) . setMessage ( sampleError ) ;
56112 var fakeService , client , logger ;
113+ before ( ( ) => env . sterilizeProcess ( ) ) ;
57114 beforeEach ( function ( ) {
115+ env . setProjectId ( ) . setKeyFilename ( ) . setProduction ( ) ;
58116 fakeService = nock (
59117 'https://clouderrorreporting.googleapis.com/v1beta1/projects/' +
60- process . env . GCLOUD_PROJECT
118+ env . projectId
61119 ) . persist ( ) . post ( '/events:report' ) ;
62120 logger = createLogger ( { logLevel : 5 } ) ;
63121 client = new RequestHandler (
64122 new Configuration ( { ignoreEnvironmentCheck : true } , logger ) , logger ) ;
65123 } ) ;
66124 afterEach ( function ( ) {
125+ env . sterilizeProcess ( ) ;
67126 nock . cleanAll ( ) ;
68127 } ) ;
128+ after ( ( ) => env . restoreProcessToOriginalState ( ) ) ;
69129 describe ( 'Receiving non-retryable errors' , function ( ) {
70130 it ( 'Should fail' , function ( done ) {
71131 this . timeout ( 5000 ) ;
@@ -99,7 +159,8 @@ describe('Behvaiour acceptance testing', function() {
99159 describe ( 'Using an API key' , function ( ) {
100160 it ( 'Should provide the key as a query string on outgoing requests' ,
101161 function ( done ) {
102- var key = process . env . STUBBED_API_KEY ;
162+ env . sterilizeProcess ( ) . setProjectId ( ) . setProduction ( ) ;
163+ var key = env . apiKey ;
103164 var client = new RequestHandler ( new Configuration (
104165 { key : key , ignoreEnvironmentCheck : true } ,
105166 createLogger ( { logLevel : 5 } ) ) ) ;
@@ -125,30 +186,17 @@ describe('Behvaiour acceptance testing', function() {
125186 describe ( 'System-live integration testing' , function ( ) {
126187 var sampleError = new Error ( ERR_TOKEN ) ;
127188 var errorMessage = new ErrorMessage ( ) . setMessage ( sampleError . stack ) ;
128- var oldEnv = {
129- GCLOUD_PROJECT : process . env . GCLOUD_PROJECT ,
130- STUBBED_PROJECT_NUM : process . env . STUBBED_PROJECT_NUM ,
131- NODE_ENV : process . env . NODE_ENV
132- } ;
133- function sterilizeEnv ( ) {
134- forEach ( oldEnv , function ( val , key ) {
135- delete process . env [ key ] ;
136- } ) ;
137- }
138- function restoreEnv ( ) {
139- assign ( process . env , oldEnv ) ;
140- }
141189 describe ( 'Client creation' , function ( ) {
142190 describe ( 'Using only project id' , function ( ) {
143191 describe ( 'As a runtime argument' , function ( ) {
144192 var cfg , logger ;
145193 before ( function ( ) {
146- sterilizeEnv ( ) ;
194+ env . sterilizeProcess ( ) . setKeyFilename ( ) ;
147195 logger = createLogger ( { logLevel : 5 } ) ;
148- cfg = new Configuration ( { projectId : oldEnv . GCLOUD_PROJECT ,
196+ cfg = new Configuration ( { projectId : env . injected ( ) . projectId ,
149197 ignoreEnvironmentCheck : true } , logger ) ;
150198 } ) ;
151- after ( restoreEnv ) ;
199+ after ( ( ) => env . sterilizeProcess ( ) ) ;
152200 it ( 'Should not throw on initialization' , function ( done ) {
153201 this . timeout ( 10000 ) ;
154202 assert . doesNotThrow ( function ( ) {
@@ -166,12 +214,11 @@ describe('Behvaiour acceptance testing', function() {
166214 describe ( 'As an env variable' , function ( ) {
167215 var cfg , logger ;
168216 before ( function ( ) {
169- sterilizeEnv ( ) ;
170- process . env . GCLOUD_PROJECT = oldEnv . GCLOUD_PROJECT ;
217+ env . sterilizeProcess ( ) . setProjectId ( ) . setKeyFilename ( ) ;
171218 logger = createLogger ( { logLevel : 5 } ) ;
172219 cfg = new Configuration ( { ignoreEnvironmentCheck : true } , logger ) ;
173220 } ) ;
174- after ( restoreEnv ) ;
221+ after ( ( ) => env . sterilizeProcess ( ) ) ;
175222 it ( 'Should not throw on initialization' , function ( done ) {
176223 this . timeout ( 10000 ) ;
177224 assert . doesNotThrow ( function ( ) {
@@ -191,14 +238,14 @@ describe('Behvaiour acceptance testing', function() {
191238 describe ( 'As a runtime argument' , function ( ) {
192239 var cfg , logger ;
193240 before ( function ( ) {
194- sterilizeEnv ( ) ;
241+ env . sterilizeProcess ( ) . setKeyFilename ( ) ;
195242 logger = createLogger ( { logLevel : 5 } ) ;
196243 cfg = new Configuration ( {
197- projectId : parseInt ( oldEnv . STUBBED_PROJECT_NUM ) ,
244+ projectId : parseInt ( env . injected ( ) . projectNumber ) ,
198245 ignoreEnvironmentCheck : true
199246 } , logger ) ;
200247 } ) ;
201- after ( restoreEnv ) ;
248+ after ( ( ) => env . sterilizeProcess ( ) ) ;
202249 it ( 'Should not throw on initialization' , function ( done ) {
203250 this . timeout ( 10000 ) ;
204251 assert . doesNotThrow ( function ( ) {
@@ -216,12 +263,11 @@ describe('Behvaiour acceptance testing', function() {
216263 describe ( 'As an env variable' , function ( ) {
217264 var cfg , logger ;
218265 before ( function ( ) {
219- sterilizeEnv ( ) ;
220- process . env . GCLOUD_PROJECT = oldEnv . STUBBED_PROJECT_NUM ;
266+ env . sterilizeProcess ( ) . setKeyFilename ( ) . setProjectNumber ( ) ;
221267 logger = createLogger ( { logLevel : 5 } ) ;
222268 cfg = new Configuration ( { ignoreEnvironmentCheck : true } , logger ) ;
223269 } ) ;
224- after ( restoreEnv ) ;
270+ after ( ( ) => env . sterilizeProcess ( ) ) ;
225271 it ( 'Should not throw on initialization' , function ( done ) {
226272 this . timeout ( 10000 ) ;
227273 assert . doesNotThrow ( function ( ) {
@@ -248,14 +294,13 @@ describe('Behvaiour acceptance testing', function() {
248294 ] . join ( ' ' ) ;
249295 var logger , client ;
250296 before ( function ( ) {
251- delete process . env . NODE_ENV ;
297+ env . sterilizeProcess ( ) . setKeyFilename ( ) . setProjectId ( ) ;
298+ process . env . NODE_ENV = 'null' ;
252299 logger = createLogger ( { logLevel : 5 } ) ;
253300 client = new RequestHandler ( new Configuration ( undefined , logger ) ,
254301 logger ) ;
255302 } ) ;
256- after ( function ( ) {
257- process . env . NODE_ENV = oldEnv . NODE_ENV ;
258- } ) ;
303+ after ( ( ) => env . sterilizeProcess ( ) ) ;
259304 it ( 'Should callback with an error' , function ( done ) {
260305 client . sendError ( { } , function ( err , response , body ) {
261306 assert ( err instanceof Error ) ;
@@ -265,49 +310,22 @@ describe('Behvaiour acceptance testing', function() {
265310 } ) ;
266311 } ) ;
267312 } ) ;
268- // describe('An invalid env configuration', function() {
269- // var ERROR_STRING = [
270- // 'Unable to find the project Id for communication with the',
271- // 'Stackdriver Error Reporting service. This app will be unable to',
272- // 'send errors to the reporting service unless a valid project Id',
273- // 'is supplied via runtime configuration or the GCLOUD_PROJECT',
274- // 'environmental variable.'
275- // ].join(' ');
276- // var logger, client;
277- // before(function() {
278- // delete process.env.GCLOUD_PROJECT;
279- // logger = createLogger({logLevel: 5});
280- // client = new RequestHandler(new Configuration(
281- // {ignoreEnvironmentCheck: true}, logger), logger);
282- // });
283- // after(function() {
284- // process.env.GCLOUD_PROJECT = oldEnv.GCLOUD_PROJECT;
285- // });
286- // it('Should callback with an error', function(done) {
287- // client.sendError(errorMessage, function(err, response, body) {
288- // assert(err instanceof Error);
289- // assert.strictEqual(err.message, ERROR_STRING);
290- // assert.strictEqual(response, null);
291- // done();
292- // });
293- // });
294- // });
295313 } ) ;
296314 describe ( 'Success behaviour' , function ( ) {
297315 var er = new Error ( ERR_TOKEN ) ;
298316 var em = new ErrorMessage ( ) . setMessage ( er . stack ) ;
299317 describe ( 'Given a valid project id' , function ( ) {
300318 var logger , client , cfg ;
301319 before ( function ( ) {
302- sterilizeEnv ( ) ;
320+ env . sterilizeProcess ( ) ;
303321 logger = createLogger ( { logLevel : 5 } ) ;
304322 cfg = new Configuration ( {
305- projectId : oldEnv . GCLOUD_PROJECT ,
323+ projectId : env . injected ( ) . projectId ,
306324 ignoreEnvironmentCheck : true
307325 } , logger ) ;
308326 client = new RequestHandler ( cfg , logger ) ;
309327 } ) ;
310- after ( restoreEnv ) ;
328+ after ( ( ) => env . sterilizeProcess ( ) ) ;
311329 it ( 'Should succeed in its request' , function ( done ) {
312330 client . sendError ( em , function ( err , response , body ) {
313331 assert . strictEqual ( err , null ) ;
@@ -321,19 +339,15 @@ describe('Behvaiour acceptance testing', function() {
321339 describe ( 'Given a valid project number' , function ( ) {
322340 var logger , client , cfg ;
323341 before ( function ( ) {
324- forEach ( oldEnv , function ( val , key ) {
325- delete process . env [ key ] ;
326- } ) ;
342+ env . sterilizeProcess ( ) ;
327343 logger = createLogger ( { logLevel : 5 } ) ;
328344 cfg = new Configuration ( {
329- projectId : parseInt ( oldEnv . STUBBED_PROJECT_NUM ) ,
345+ projectId : parseInt ( env . injected ( ) . projectNumber ) ,
330346 ignoreEnvironmentCheck : true
331347 } , logger ) ;
332348 client = new RequestHandler ( cfg , logger ) ;
333349 } ) ;
334- after ( function ( ) {
335- assign ( process . env , oldEnv ) ;
336- } ) ;
350+ after ( ( ) => env . sterilizeProcess ( ) ) ;
337351 it ( 'Should succeed in its request' , function ( done ) {
338352 client . sendError ( em , function ( err , response , body ) {
339353 assert . strictEqual ( err , null ) ;
0 commit comments