test(cloud-auth): cover post-exchange stale connect and pending Sign in

Pin the branch that discards an earlier token exchange after a later wait
has already linked, keep Sign in enabled while connect is still pending,
and suppress a failed toast when auth is already connected.
This commit is contained in:
Jinwoo-H
2026-09-16 16:43:00 -04:00
parent f58bf1ca03
commit f1fdce1743
3 changed files with 95 additions and 1 deletions
@@ -134,4 +134,93 @@ describe('Orca cloud overlapping connect', () => {
)
expect(getCurrentOrcaProfileAuthStatus(userDataPath).cloud?.email).toBe('ada@example.com')
})
it('discards an earlier token exchange that finishes after a later wait has linked', async () => {
type PkceCode = {
code: string
codeVerifier: string
nonce: string
redirectUri: string
state: string
}
let finishEarlierPkce!: (value: PkceCode) => void
let finishLaterPkce!: (value: PkceCode) => void
let finishEarlierExchange!: (value: {
accessToken: string
refreshToken: string
expiresAt: number
cloud: OrcaProfileCloudSummary
organizations: OrcaCloudOrgSummary[]
capabilities: OrcaCloudCapabilities
}) => void
let finishLaterExchange!: (value: {
accessToken: string
refreshToken: string
expiresAt: number
cloud: OrcaProfileCloudSummary
organizations: OrcaCloudOrgSummary[]
capabilities: OrcaCloudCapabilities
}) => void
beginOrcaCloudPkceFlowMock
.mockReturnValueOnce(
new Promise((resolve) => {
finishEarlierPkce = resolve
})
)
.mockReturnValueOnce(
new Promise((resolve) => {
finishLaterPkce = resolve
})
)
exchangeOrcaCloudAuthCodeMock.mockImplementation(
(_config, args) =>
new Promise((resolve) => {
if (args.code === 'later-code') {
finishLaterExchange = resolve
} else {
finishEarlierExchange = resolve
}
})
)
const earlier = connectCurrentOrcaProfile(userDataPath)
const later = connectCurrentOrcaProfile(userDataPath)
finishEarlierPkce({
code: 'earlier-code',
codeVerifier: 'earlier-verifier',
nonce: 'earlier-nonce',
redirectUri: 'http://127.0.0.1:4100/auth/callback',
state: 'earlier-state'
})
finishLaterPkce({
code: 'later-code',
codeVerifier: 'later-verifier',
nonce: 'later-nonce',
redirectUri: 'http://127.0.0.1:4101/auth/callback',
state: 'later-state'
})
await vi.waitFor(() => expect(exchangeOrcaCloudAuthCodeMock).toHaveBeenCalledTimes(2))
finishLaterExchange({
accessToken: 'later-access',
refreshToken: 'later-refresh',
expiresAt: Date.now() + 3_600_000,
cloud: laterCloud,
organizations,
capabilities
})
await expect(later).resolves.toMatchObject({ status: 'connected' })
expect(getCurrentOrcaProfileAuthStatus(userDataPath).cloud?.email).toBe('ada@example.com')
finishEarlierExchange({
accessToken: 'earlier-access',
refreshToken: 'earlier-refresh',
expiresAt: Date.now() + 3_600_000,
cloud: earlierCloud,
organizations,
capabilities
})
await expect(earlier).resolves.toMatchObject({ status: 'cancelled' })
expect(getCurrentOrcaProfileAuthStatus(userDataPath).cloud?.email).toBe('ada@example.com')
})
})
@@ -87,6 +87,7 @@ describe('OrcaAccountSettingsPane', () => {
it('offers sign in for a local profile', async () => {
const user = userEvent.setup()
mocks.state.orcaProfileAuthStatus = { configured: true, state: 'local' }
mocks.connect.mockReturnValue(new Promise(() => {}))
render(<OrcaAccountSettingsPane />)
expect(
@@ -113,7 +113,11 @@ export const createOrcaProfilesAuthActions: StateCreator<
description: result.auth.setupMessage
}
)
} else if (result.status === 'failed' && !alreadyConnected) {
} else if (
result.status === 'failed' &&
!alreadyConnected &&
result.auth.state !== 'connected'
) {
toast.error(
translate('auto.store.slices.orca.profiles.33290e88ed', 'Failed to connect profile'),
{ description: result.error }