@@ -134,36 +134,38 @@ describe('Cloud Credentials E2E Tests', () => {
134
134
expect ( response . body . data ) . toBeInstanceOf ( Array ) ;
135
135
expect ( response . body . data . length ) . toBeGreaterThan ( 0 ) ;
136
136
137
- // Verify AWS provider exists
138
- const awsProvider = response . body . data . find ( ( provider : any ) => provider . id === 'aws ' ) ;
139
- expect ( awsProvider ) . toBeDefined ( ) ;
140
- expect ( awsProvider . name ) . toBe ( 'Amazon Web Services ' ) ;
141
- expect ( awsProvider . enabled ) . toBe ( true ) ;
142
- expect ( awsProvider . fields ) . toBeInstanceOf ( Array ) ;
137
+ // Verify GCP provider exists
138
+ const gcpProvider = response . body . data . find ( ( provider : any ) => provider . id === 'gcp ' ) ;
139
+ expect ( gcpProvider ) . toBeDefined ( ) ;
140
+ expect ( gcpProvider . name ) . toBe ( 'Google Cloud Platform ' ) ;
141
+ expect ( gcpProvider . enabled ) . toBe ( true ) ;
142
+ expect ( gcpProvider . fields ) . toBeInstanceOf ( Array ) ;
143
143
144
144
// Verify required fields exist
145
- const accessKeyField = awsProvider . fields . find ( ( field : any ) => field . key === 'access_key_id' ) ;
146
- const secretKeyField = awsProvider . fields . find ( ( field : any ) => field . key === 'secret_access_key' ) ;
147
-
148
- expect ( accessKeyField ) . toBeDefined ( ) ;
149
- expect ( accessKeyField . required ) . toBe ( true ) ;
150
- expect ( accessKeyField . secret ) . toBe ( false ) ;
151
-
152
- expect ( secretKeyField ) . toBeDefined ( ) ;
153
- expect ( secretKeyField . required ) . toBe ( true ) ;
154
- expect ( secretKeyField . secret ) . toBe ( true ) ;
145
+ const serviceAccountField = gcpProvider . fields . find ( ( field : any ) => field . key === 'service_account_key' ) ;
146
+ const projectIdField = gcpProvider . fields . find ( ( field : any ) => field . key === 'project_id' ) ;
147
+
148
+ expect ( serviceAccountField ) . toBeDefined ( ) ;
149
+ expect ( serviceAccountField . required ) . toBe ( true ) ;
150
+ expect ( serviceAccountField . secret ) . toBe ( true ) ;
151
+ expect ( serviceAccountField . type ) . toBe ( 'textarea' ) ;
152
+
153
+ expect ( projectIdField ) . toBeDefined ( ) ;
154
+ expect ( projectIdField . required ) . toBe ( true ) ;
155
+ expect ( projectIdField . secret ) . toBe ( false ) ;
156
+ expect ( projectIdField . type ) . toBe ( 'text' ) ;
155
157
} ) ;
156
158
157
159
it ( 'should create first cloud credential as team admin' , async ( ) => {
158
160
const context = getTestContext ( ) ;
159
161
160
162
const credentialData = {
161
- providerId : 'aws ' ,
162
- name : 'Test AWS Credentials' ,
163
+ providerId : 'gcp ' ,
164
+ name : 'Test GCP Credentials' ,
163
165
comment : 'Test credentials for E2E testing' ,
164
166
credentials : {
165
- access_key_id : 'AKIATEST123456789 ' ,
166
- secret_access_key : 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYtest123 '
167
+ service_account_key : '{\n "type": "service_account",\n "project_id": "test-project-123",\n "private_key_id": "test-key-id-123456",\n "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7VJT...TEST...\\n-----END PRIVATE KEY-----\\n",\n "client_email": "test-service@test-project-123.iam.gserviceaccount.com",\n "client_id": "123456789012345678901",\n "auth_uri": "https://accounts.google.com/o/oauth2/auth",\n "token_uri": "https://oauth2.googleapis.com/token",\n "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",\n "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/test-service%40test-project-123.iam.gserviceaccount.com"\n} ' ,
168
+ project_id : 'test-project-123 '
167
169
}
168
170
} ;
169
171
@@ -180,26 +182,26 @@ describe('Cloud Credentials E2E Tests', () => {
180
182
const credential = response . body . data ;
181
183
expect ( credential . id ) . toBeDefined ( ) ;
182
184
expect ( credential . teamId ) . toBe ( context . teamAdminTeamId ) ;
183
- expect ( credential . providerId ) . toBe ( 'aws ' ) ;
185
+ expect ( credential . providerId ) . toBe ( 'gcp ' ) ;
184
186
expect ( credential . name ) . toBe ( credentialData . name ) ;
185
187
expect ( credential . comment ) . toBe ( credentialData . comment ) ;
186
188
expect ( credential . createdBy ) . toBe ( context . secondUserId ) ;
187
189
188
190
// Verify provider information
189
- expect ( credential . provider . id ) . toBe ( 'aws ' ) ;
190
- expect ( credential . provider . name ) . toBe ( 'Amazon Web Services ' ) ;
191
+ expect ( credential . provider . id ) . toBe ( 'gcp ' ) ;
192
+ expect ( credential . provider . name ) . toBe ( 'Google Cloud Platform ' ) ;
191
193
192
194
// Verify fields structure - team admin should see non-secret values but no secret values
193
195
expect ( credential . fields ) . toBeDefined ( ) ;
194
- expect ( credential . fields . access_key_id ) . toBeDefined ( ) ;
195
- expect ( credential . fields . access_key_id . hasValue ) . toBe ( true ) ;
196
- expect ( credential . fields . access_key_id . secret ) . toBe ( false ) ;
197
- expect ( credential . fields . access_key_id . value ) . toBe ( 'PLACEHOLDER_VALUE' ) ; // Non-secret field shows placeholder
196
+ expect ( credential . fields . project_id ) . toBeDefined ( ) ;
197
+ expect ( credential . fields . project_id . hasValue ) . toBe ( true ) ;
198
+ expect ( credential . fields . project_id . secret ) . toBe ( false ) ;
199
+ expect ( credential . fields . project_id . value ) . toBe ( 'PLACEHOLDER_VALUE' ) ; // Non-secret field shows placeholder
198
200
199
- expect ( credential . fields . secret_access_key ) . toBeDefined ( ) ;
200
- expect ( credential . fields . secret_access_key . hasValue ) . toBe ( true ) ;
201
- expect ( credential . fields . secret_access_key . secret ) . toBe ( true ) ;
202
- expect ( credential . fields . secret_access_key . value ) . toBeUndefined ( ) ; // Secret field never shows value
201
+ expect ( credential . fields . service_account_key ) . toBeDefined ( ) ;
202
+ expect ( credential . fields . service_account_key . hasValue ) . toBe ( true ) ;
203
+ expect ( credential . fields . service_account_key . secret ) . toBe ( true ) ;
204
+ expect ( credential . fields . service_account_key . value ) . toBeUndefined ( ) ; // Secret field never shows value
203
205
204
206
// Store credential ID for later tests
205
207
updateTestContext ( {
@@ -211,12 +213,12 @@ describe('Cloud Credentials E2E Tests', () => {
211
213
const context = getTestContext ( ) ;
212
214
213
215
const credentialData = {
214
- providerId : 'aws ' ,
215
- name : 'Edit Test AWS Credentials' ,
216
+ providerId : 'gcp ' ,
217
+ name : 'Edit Test GCP Credentials' ,
216
218
comment : 'Credentials for edit/delete testing' ,
217
219
credentials : {
218
- access_key_id : 'AKIAEDIT123456789 ' ,
219
- secret_access_key : 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYedit123 '
220
+ service_account_key : '{\n "type": "service_account",\n "project_id": "edit-test-project-456",\n "private_key_id": "edit-key-id-456789",\n "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7VJT...EDIT...\\n-----END PRIVATE KEY-----\\n",\n "client_email": "edit-service@edit-test-project-456.iam.gserviceaccount.com",\n "client_id": "456789012345678901234",\n "auth_uri": "https://accounts.google.com/o/oauth2/auth",\n "token_uri": "https://oauth2.googleapis.com/token",\n "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",\n "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/edit-service%40edit-test-project-456.iam.gserviceaccount.com"\n} ' ,
221
+ project_id : 'edit-test-project-456 '
220
222
}
221
223
} ;
222
224
@@ -243,10 +245,10 @@ describe('Cloud Credentials E2E Tests', () => {
243
245
expect ( context . editTestCredentialId ) . not . toBe ( 'undefined' ) ;
244
246
245
247
const updateData = {
246
- name : 'Updated Test AWS Credentials' ,
248
+ name : 'Updated Test GCP Credentials' ,
247
249
comment : 'Updated comment for testing' ,
248
250
credentials : {
249
- access_key_id : 'AKIATEST987654321 ' // Update non-secret field
251
+ project_id : 'updated-test-project-789 ' // Update non-secret field
250
252
}
251
253
} ;
252
254
@@ -265,12 +267,12 @@ describe('Cloud Credentials E2E Tests', () => {
265
267
expect ( credential . comment ) . toBe ( updateData . comment ) ;
266
268
267
269
// Verify updated field (team admin sees placeholder, not actual value)
268
- expect ( credential . fields . access_key_id . value ) . toBe ( 'PLACEHOLDER_VALUE' ) ;
269
- expect ( credential . fields . access_key_id . hasValue ) . toBe ( true ) ;
270
+ expect ( credential . fields . project_id . value ) . toBe ( 'PLACEHOLDER_VALUE' ) ;
271
+ expect ( credential . fields . project_id . hasValue ) . toBe ( true ) ;
270
272
271
273
// Verify secret field remains unchanged (still has value but not shown)
272
- expect ( credential . fields . secret_access_key . hasValue ) . toBe ( true ) ;
273
- expect ( credential . fields . secret_access_key . value ) . toBeUndefined ( ) ;
274
+ expect ( credential . fields . service_account_key . hasValue ) . toBe ( true ) ;
275
+ expect ( credential . fields . service_account_key . value ) . toBeUndefined ( ) ;
274
276
} ) ;
275
277
276
278
it ( 'should delete own credential as team admin' , async ( ) => {
@@ -297,12 +299,12 @@ describe('Cloud Credentials E2E Tests', () => {
297
299
298
300
// Create first credential in team admin's team
299
301
const credential1Data = {
300
- providerId : 'aws ' ,
301
- name : 'Production AWS ' ,
302
+ providerId : 'gcp ' ,
303
+ name : 'Production GCP ' ,
302
304
comment : 'Production environment credentials' ,
303
305
credentials : {
304
- access_key_id : 'AKIAPROD123456789 ' ,
305
- secret_access_key : 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYprod123 '
306
+ service_account_key : '{\n "type": "service_account",\n "project_id": "prod-project-123",\n "private_key_id": "prod-key-id-123456",\n "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7VJT...PROD...\\n-----END PRIVATE KEY-----\\n",\n "client_email": "prod-service@prod-project-123.iam.gserviceaccount.com",\n "client_id": "123456789012345678901",\n "auth_uri": "https://accounts.google.com/o/oauth2/auth",\n "token_uri": "https://oauth2.googleapis.com/token",\n "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",\n "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/prod-service%40prod-project-123.iam.gserviceaccount.com"\n} ' ,
307
+ project_id : 'prod-project-123 '
306
308
}
307
309
} ;
308
310
@@ -316,12 +318,12 @@ describe('Cloud Credentials E2E Tests', () => {
316
318
317
319
// Create second credential in team admin's team
318
320
const credential2Data = {
319
- providerId : 'aws ' ,
320
- name : 'Staging AWS ' ,
321
+ providerId : 'gcp ' ,
322
+ name : 'Staging GCP ' ,
321
323
comment : 'Staging environment credentials' ,
322
324
credentials : {
323
- access_key_id : 'AKIASTAGING123456789 ' ,
324
- secret_access_key : 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYstag123 '
325
+ service_account_key : '{\n "type": "service_account",\n "project_id": "staging-project-456",\n "private_key_id": "staging-key-id-456789",\n "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7VJT...STAGING...\\n-----END PRIVATE KEY-----\\n",\n "client_email": "staging-service@staging-project-456.iam.gserviceaccount.com",\n "client_id": "456789012345678901234",\n "auth_uri": "https://accounts.google.com/o/oauth2/auth",\n "token_uri": "https://oauth2.googleapis.com/token",\n "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",\n "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/staging-service%40staging-project-456.iam.gserviceaccount.com"\n} ' ,
326
+ project_id : 'staging-project-456 '
325
327
}
326
328
} ;
327
329
@@ -358,26 +360,26 @@ describe('Cloud Credentials E2E Tests', () => {
358
360
for ( const credential of credentials ) {
359
361
expect ( credential . id ) . toBeDefined ( ) ;
360
362
expect ( credential . name ) . toBeDefined ( ) ;
361
- expect ( credential . providerId ) . toBe ( 'aws ' ) ;
363
+ expect ( credential . providerId ) . toBe ( 'gcp ' ) ;
362
364
expect ( credential . teamId ) . toBe ( context . teamAdminTeamId ) ;
363
365
expect ( credential . createdBy ) . toBe ( context . secondUserId ) ;
364
366
365
367
// Global admin should see field metadata but NO values (even for non-secret fields)
366
368
expect ( credential . fields ) . toBeDefined ( ) ;
367
- expect ( credential . fields . access_key_id ) . toBeDefined ( ) ;
368
- expect ( credential . fields . access_key_id . hasValue ) . toBe ( true ) ;
369
- expect ( credential . fields . access_key_id . secret ) . toBe ( false ) ;
370
- expect ( credential . fields . access_key_id . value ) . toBeUndefined ( ) ; // Global admin sees no values
369
+ expect ( credential . fields . project_id ) . toBeDefined ( ) ;
370
+ expect ( credential . fields . project_id . hasValue ) . toBe ( true ) ;
371
+ expect ( credential . fields . project_id . secret ) . toBe ( false ) ;
372
+ expect ( credential . fields . project_id . value ) . toBeUndefined ( ) ; // Global admin sees no values
371
373
372
- expect ( credential . fields . secret_access_key ) . toBeDefined ( ) ;
373
- expect ( credential . fields . secret_access_key . hasValue ) . toBe ( true ) ;
374
- expect ( credential . fields . secret_access_key . secret ) . toBe ( true ) ;
375
- expect ( credential . fields . secret_access_key . value ) . toBeUndefined ( ) ; // Global admin sees no values
374
+ expect ( credential . fields . service_account_key ) . toBeDefined ( ) ;
375
+ expect ( credential . fields . service_account_key . hasValue ) . toBe ( true ) ;
376
+ expect ( credential . fields . service_account_key . secret ) . toBe ( true ) ;
377
+ expect ( credential . fields . service_account_key . value ) . toBeUndefined ( ) ; // Global admin sees no values
376
378
}
377
379
378
380
// Verify we can find both credentials
379
- const prodCredential = credentials . find ( ( c : any ) => c . name === 'Production AWS ' ) ;
380
- const stagingCredential = credentials . find ( ( c : any ) => c . name === 'Staging AWS ' ) ;
381
+ const prodCredential = credentials . find ( ( c : any ) => c . name === 'Production GCP ' ) ;
382
+ const stagingCredential = credentials . find ( ( c : any ) => c . name === 'Staging GCP ' ) ;
381
383
382
384
expect ( prodCredential ) . toBeDefined ( ) ;
383
385
expect ( stagingCredential ) . toBeDefined ( ) ;
@@ -408,17 +410,17 @@ describe('Cloud Credentials E2E Tests', () => {
408
410
expect ( response . body . data ) . toBeDefined ( ) ;
409
411
410
412
const credential = response . body . data ;
411
- expect ( credential . name ) . toBe ( 'Production AWS ' ) ;
413
+ expect ( credential . name ) . toBe ( 'Production GCP ' ) ;
412
414
expect ( credential . comment ) . toBe ( 'Production environment credentials' ) ;
413
415
414
416
// Verify global admin sees metadata but no actual values
415
- expect ( credential . fields . access_key_id . hasValue ) . toBe ( true ) ;
416
- expect ( credential . fields . access_key_id . secret ) . toBe ( false ) ;
417
- expect ( credential . fields . access_key_id . value ) . toBeUndefined ( ) ; // No value for global admin
417
+ expect ( credential . fields . project_id . hasValue ) . toBe ( true ) ;
418
+ expect ( credential . fields . project_id . secret ) . toBe ( false ) ;
419
+ expect ( credential . fields . project_id . value ) . toBeUndefined ( ) ; // No value for global admin
418
420
419
- expect ( credential . fields . secret_access_key . hasValue ) . toBe ( true ) ;
420
- expect ( credential . fields . secret_access_key . secret ) . toBe ( true ) ;
421
- expect ( credential . fields . secret_access_key . value ) . toBeUndefined ( ) ; // No value for global admin
421
+ expect ( credential . fields . service_account_key . hasValue ) . toBe ( true ) ;
422
+ expect ( credential . fields . service_account_key . secret ) . toBe ( true ) ;
423
+ expect ( credential . fields . service_account_key . value ) . toBeUndefined ( ) ; // No value for global admin
422
424
} ) ;
423
425
424
426
it ( 'should verify no secret values are ever returned in any response' , async ( ) => {
@@ -433,14 +435,14 @@ describe('Cloud Credentials E2E Tests', () => {
433
435
const globalAdminCredential = globalAdminResponse . body . data ;
434
436
435
437
// Global admin should see no values at all for other team's credentials
436
- expect ( globalAdminCredential . fields . secret_access_key . value ) . toBeUndefined ( ) ;
437
- expect ( globalAdminCredential . fields . access_key_id . value ) . toBeUndefined ( ) ;
438
- expect ( globalAdminCredential . fields . secret_access_key . hasValue ) . toBe ( true ) ;
439
- expect ( globalAdminCredential . fields . access_key_id . hasValue ) . toBe ( true ) ;
438
+ expect ( globalAdminCredential . fields . service_account_key . value ) . toBeUndefined ( ) ;
439
+ expect ( globalAdminCredential . fields . project_id . value ) . toBeUndefined ( ) ;
440
+ expect ( globalAdminCredential . fields . service_account_key . hasValue ) . toBe ( true ) ;
441
+ expect ( globalAdminCredential . fields . project_id . hasValue ) . toBe ( true ) ;
440
442
441
443
// Verify secret fields are properly marked
442
- expect ( globalAdminCredential . fields . secret_access_key . secret ) . toBe ( true ) ;
443
- expect ( globalAdminCredential . fields . access_key_id . secret ) . toBe ( false ) ;
444
+ expect ( globalAdminCredential . fields . service_account_key . secret ) . toBe ( true ) ;
445
+ expect ( globalAdminCredential . fields . project_id . secret ) . toBe ( false ) ;
444
446
445
447
// Test as team admin viewing own team's credentials
446
448
const teamAdminResponse = await request ( server . server )
@@ -451,10 +453,10 @@ describe('Cloud Credentials E2E Tests', () => {
451
453
const teamAdminCredential = teamAdminResponse . body . data ;
452
454
453
455
// Team admin should see placeholder for non-secret fields but never secret values
454
- expect ( teamAdminCredential . fields . secret_access_key . value ) . toBeUndefined ( ) ; // Secret never shown
455
- expect ( teamAdminCredential . fields . access_key_id . value ) . toBe ( 'PLACEHOLDER_VALUE' ) ; // Non-secret shows placeholder
456
- expect ( teamAdminCredential . fields . secret_access_key . hasValue ) . toBe ( true ) ;
457
- expect ( teamAdminCredential . fields . access_key_id . hasValue ) . toBe ( true ) ;
456
+ expect ( teamAdminCredential . fields . service_account_key . value ) . toBeUndefined ( ) ; // Secret never shown
457
+ expect ( teamAdminCredential . fields . project_id . value ) . toBe ( 'PLACEHOLDER_VALUE' ) ; // Non-secret shows placeholder
458
+ expect ( teamAdminCredential . fields . service_account_key . hasValue ) . toBe ( true ) ;
459
+ expect ( teamAdminCredential . fields . project_id . hasValue ) . toBe ( true ) ;
458
460
} ) ;
459
461
460
462
it ( 'should handle validation errors correctly' , async ( ) => {
@@ -479,11 +481,11 @@ describe('Cloud Credentials E2E Tests', () => {
479
481
. post ( `/api/teams/${ context . teamAdminTeamId } /cloud-credentials` )
480
482
. set ( 'Cookie' , context . teamAdminCredentialsCookie ! )
481
483
. send ( {
482
- providerId : 'aws ' ,
484
+ providerId : 'gcp ' ,
483
485
name : 'Test Credential' ,
484
486
credentials : {
485
- access_key_id : 'AKIATEST123456789 '
486
- // Missing secret_access_key
487
+ project_id : 'test-project-123 '
488
+ // Missing service_account_key
487
489
}
488
490
} ) ;
489
491
@@ -496,15 +498,15 @@ describe('Cloud Credentials E2E Tests', () => {
496
498
. post ( `/api/teams/${ context . teamAdminTeamId } /cloud-credentials` )
497
499
. set ( 'Cookie' , context . teamAdminCredentialsCookie ! )
498
500
. send ( {
499
- providerId : 'aws ' ,
500
- name : 'Production AWS ' , // Same name as existing credential
501
+ providerId : 'gcp ' ,
502
+ name : 'Production GCP ' , // Same name as existing credential
501
503
credentials : {
502
- access_key_id : 'AKIATEST123456789 ' ,
503
- secret_access_key : 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYdupe123 '
504
+ service_account_key : '{"type": "service_account", "project_id": "duplicate-test"} ' ,
505
+ project_id : 'duplicate-test-project '
504
506
}
505
507
} ) ;
506
508
507
- expect ( duplicateNameResponse . status ) . toBe ( 409 ) ;
509
+ expect ( duplicateNameResponse . status ) . toBe ( 400 ) ;
508
510
expect ( duplicateNameResponse . body . success ) . toBe ( false ) ;
509
511
expect ( duplicateNameResponse . body . error ) . toBeDefined ( ) ;
510
512
} ) ;
0 commit comments