Skip to content

Commit ae7c222

Browse files
authored
fix(amazonq): Add AuthUtil test suite and fix unit tests (#7249)
## Problem Unit tests for `amazonq_backed` and `regionProfileManager` are broken or disabled, because they are not working with the LSP auth setup ## Solution * Create a new test util to setup AuthUtil for tests, stubbing the LSP client methods * Rework the unit test where necessary to use the AuthUtil on Flare identity server * Move `amazonq_backed` to the `amazonq` package, since the AuthUtil won't instantiate correctly if the unit test runs under `toolkits` test suite --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 4b0ec4d commit ae7c222

File tree

10 files changed

+175
-143
lines changed

10 files changed

+175
-143
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/*!
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import assert from 'assert'
7+
import * as sinon from 'sinon'
8+
import { assertTelemetry, createTestAuthUtil } from 'aws-core-vscode/test'
9+
import { AuthUtil, awsIdSignIn, getStartUrl } from 'aws-core-vscode/codewhisperer'
10+
import { backendAmazonQ } from 'aws-core-vscode/login'
11+
12+
describe('Amazon Q Login', async function () {
13+
const region = 'fakeRegion'
14+
const startUrl = 'fakeUrl'
15+
16+
let sandbox: sinon.SinonSandbox
17+
let backend: backendAmazonQ.AmazonQLoginWebview
18+
19+
await createTestAuthUtil()
20+
21+
beforeEach(function () {
22+
sandbox = sinon.createSandbox()
23+
backend = new backendAmazonQ.AmazonQLoginWebview()
24+
})
25+
26+
afterEach(function () {
27+
sandbox.restore()
28+
})
29+
30+
it('signs into builder ID and emits telemetry', async function () {
31+
await backend.startBuilderIdSetup()
32+
33+
assert.ok(AuthUtil.instance.isConnected())
34+
assert.ok(AuthUtil.instance.isBuilderIdConnection())
35+
36+
assertTelemetry('auth_addConnection', {
37+
result: 'Succeeded',
38+
credentialSourceId: 'awsId',
39+
authEnabledFeatures: 'codewhisperer',
40+
isReAuth: false,
41+
ssoRegistrationExpiresAt: undefined,
42+
ssoRegistrationClientId: undefined,
43+
})
44+
})
45+
46+
it('signs into IdC and emits telemetry', async function () {
47+
await backend.startEnterpriseSetup(startUrl, region)
48+
49+
assert.ok(AuthUtil.instance.isConnected())
50+
assert.ok(AuthUtil.instance.isIdcConnection())
51+
assert.ok(AuthUtil.instance.isSsoSession())
52+
assert.deepStrictEqual(AuthUtil.instance.connection?.startUrl, startUrl)
53+
assert.deepStrictEqual(AuthUtil.instance.connection?.region, region)
54+
55+
assertTelemetry('auth_addConnection', {
56+
result: 'Succeeded',
57+
credentialSourceId: 'iamIdentityCenter',
58+
authEnabledFeatures: 'codewhisperer',
59+
credentialStartUrl: startUrl,
60+
awsRegion: region,
61+
isReAuth: false,
62+
ssoRegistrationExpiresAt: undefined,
63+
ssoRegistrationClientId: undefined,
64+
})
65+
})
66+
67+
it('reauths builder ID and emits telemetry', async function () {
68+
await awsIdSignIn()
69+
70+
await backend.reauthenticateConnection()
71+
72+
assert.ok(AuthUtil.instance.isConnected())
73+
74+
assertTelemetry('auth_addConnection', {
75+
result: 'Succeeded',
76+
credentialSourceId: 'awsId',
77+
authEnabledFeatures: 'codewhisperer',
78+
isReAuth: true,
79+
ssoRegistrationExpiresAt: undefined,
80+
ssoRegistrationClientId: undefined,
81+
})
82+
})
83+
84+
it('reauths IdC and emits telemetry', async function () {
85+
await getStartUrl.connectToEnterpriseSso(startUrl, region)
86+
87+
await backend.reauthenticateConnection()
88+
89+
assert.ok(AuthUtil.instance.isConnected())
90+
91+
assertTelemetry('auth_addConnection', {
92+
result: 'Succeeded',
93+
credentialSourceId: 'iamIdentityCenter',
94+
authEnabledFeatures: 'codewhisperer',
95+
credentialStartUrl: startUrl,
96+
awsRegion: region,
97+
isReAuth: true,
98+
ssoRegistrationExpiresAt: undefined,
99+
ssoRegistrationClientId: undefined,
100+
})
101+
})
102+
103+
it('signs out of reauth and emits telemetry', async function () {
104+
await backend.signout()
105+
106+
assert.ok(!AuthUtil.instance.isConnected())
107+
108+
assertTelemetry('auth_addConnection', {
109+
result: 'Cancelled',
110+
credentialSourceId: 'iamIdentityCenter',
111+
authEnabledFeatures: 'codewhisperer',
112+
credentialStartUrl: startUrl,
113+
awsRegion: region,
114+
isReAuth: true,
115+
ssoRegistrationExpiresAt: undefined,
116+
ssoRegistrationClientId: undefined,
117+
})
118+
})
119+
})

packages/amazonq/test/unit/codewhisperer/region/regionProfileManager.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import assert, { fail } from 'assert'
88
import { AuthUtil, RegionProfile, RegionProfileManager, defaultServiceConfig } from 'aws-core-vscode/codewhisperer'
99
import { globals } from 'aws-core-vscode/shared'
1010
import { constants } from 'aws-core-vscode/auth'
11+
import { createTestAuthUtil } from 'aws-core-vscode/test'
1112

1213
const enterpriseSsoStartUrl = 'https://enterprise.awsapps.com/start'
1314
const region = 'us-east-1'
1415

15-
describe('RegionProfileManager', function () {
16+
describe('RegionProfileManager', async function () {
1617
let regionProfileManager: RegionProfileManager
1718

1819
const profileFoo: RegionProfile = {
@@ -22,6 +23,8 @@ describe('RegionProfileManager', function () {
2223
description: 'foo description',
2324
}
2425

26+
await createTestAuthUtil()
27+
2528
async function setupConnection(type: 'builderId' | 'idc') {
2629
if (type === 'builderId') {
2730
await AuthUtil.instance.login(constants.builderIdStartUrl, region)

packages/amazonq/test/unit/codewhisperer/service/recommendationHandler.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import * as sinon from 'sinon'
99
import {
1010
ReferenceInlineProvider,
1111
session,
12-
AuthUtil,
1312
DefaultCodeWhispererClient,
1413
RecommendationsList,
1514
ConfigurationEntry,
1615
RecommendationHandler,
1716
CodeWhispererCodeCoverageTracker,
1817
supplementalContextUtil,
18+
AuthUtil,
1919
} from 'aws-core-vscode/codewhisperer'
2020
import {
2121
assertTelemetryCurried,
@@ -39,15 +39,13 @@ describe('recommendationHandler', function () {
3939
describe('getRecommendations', async function () {
4040
const mockClient = stub(DefaultCodeWhispererClient)
4141
const mockEditor = createMockTextEditor()
42-
const testStartUrl = 'testStartUrl'
4342

4443
beforeEach(async function () {
4544
sinon.restore()
4645
await resetCodeWhispererGlobalVariables()
4746
mockClient.listRecommendations.resolves({})
4847
mockClient.generateRecommendations.resolves({})
4948
RecommendationHandler.instance.clearRecommendations()
50-
sinon.stub(AuthUtil.instance.connection!, 'startUrl').value(testStartUrl)
5149
})
5250

5351
afterEach(function () {
@@ -143,7 +141,7 @@ describe('recommendationHandler', function () {
143141
codewhispererLineNumber: 1,
144142
codewhispererCursorOffset: 38,
145143
codewhispererLanguage: 'python',
146-
credentialStartUrl: testStartUrl,
144+
credentialStartUrl: AuthUtil.instance.connection?.startUrl,
147145
codewhispererSupplementalContextIsUtg: false,
148146
codewhispererSupplementalContextTimeout: false,
149147
codewhispererSupplementalContextLatency: 0,

packages/amazonq/test/unit/codewhisperer/tracker/codewhispererTracker.test.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,6 @@ describe('codewhispererTracker', function () {
8282

8383
describe('emitTelemetryOnSuggestion', function () {
8484
it('Should call recordCodewhispererUserModification with suggestion event', async function () {
85-
const testStartUrl = 'testStartUrl'
86-
sinon.stub(AuthUtil.instance.connection!, 'startUrl').value(testStartUrl)
8785
const suggestion = createAcceptedSuggestionEntry()
8886
const assertTelemetry = assertTelemetryCurried('codewhisperer_userModification')
8987
await CodeWhispererTracker.getTracker().emitTelemetryOnSuggestion(suggestion)
@@ -95,7 +93,7 @@ describe('codewhispererTracker', function () {
9593
codewhispererModificationPercentage: 1,
9694
codewhispererCompletionType: 'Line',
9795
codewhispererLanguage: 'java',
98-
credentialStartUrl: testStartUrl,
96+
credentialStartUrl: AuthUtil.instance.connection?.startUrl,
9997
codewhispererCharactersAccepted: suggestion.originalString.length,
10098
codewhispererCharactersModified: 0,
10199
})

packages/core/src/codewhisperer/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export * from './util/commonUtil'
9393
export * from './util/supplementalContext/codeParsingUtil'
9494
export * from './util/supplementalContext/supplementalContextUtil'
9595
export * from './util/codewhispererSettings'
96+
export * as getStartUrl from './util/getStartUrl'
9697
export * as supplementalContextUtil from './util/supplementalContext/supplementalContextUtil'
9798
export * from './service/diagnosticsProvider'
9899
export * as diagnosticsProvider from './service/diagnosticsProvider'

packages/core/src/login/webview/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55

66
export { CommonAuthViewProvider } from './commonAuthViewProvider'
77
export { CommonAuthWebview } from './vue/backend'
8+
export * as backendAmazonQ from './vue/amazonq/backend_amazonq'

packages/core/src/login/webview/vue/amazonq/backend_amazonq.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55
import * as vscode from 'vscode'
6-
import { AwsConnection, SsoConnection, getTelemetryMetadataForConn } from '../../../../auth/connection'
6+
import { AwsConnection, SsoConnection } from '../../../../auth/connection'
77
import { AuthUtil } from '../../../../codewhisperer/util/authUtil'
88
import { CommonAuthWebview } from '../backend'
99
import { awsIdSignIn } from '../../../../codewhisperer/util/showSsoPrompt'
@@ -114,9 +114,7 @@ export class AmazonQLoginWebview extends CommonAuthWebview {
114114
...(await AuthUtil.instance.getTelemetryMetadata()),
115115
})
116116
await AuthUtil.instance.reauthenticate()
117-
this.storeMetricMetadata({
118-
...(await AuthUtil.instance.getTelemetryMetadata()),
119-
})
117+
this.storeMetricMetadata(await AuthUtil.instance.getTelemetryMetadata())
120118
})
121119
} finally {
122120
this.isReauthenticating = false
@@ -178,7 +176,7 @@ export class AmazonQLoginWebview extends CommonAuthWebview {
178176
this.storeMetricMetadata({
179177
authEnabledFeatures: 'codewhisperer',
180178
isReAuth: true,
181-
...(await getTelemetryMetadataForConn()),
179+
...(await AuthUtil.instance.getTelemetryMetadata()),
182180
result: 'Cancelled',
183181
})
184182

packages/core/src/test/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@ export * from './testUtil'
2525
export * from './amazonq/utils'
2626
export * from './fake/mockFeatureConfigData'
2727
export * from './shared/ui/testUtils'
28+
export * from './testAuthUtil'

packages/core/src/test/login/webview/vue/backend_amazonq.test.ts

Lines changed: 0 additions & 130 deletions
This file was deleted.

0 commit comments

Comments
 (0)