mirror of
https://github.com/stablyai/orca.git
synced 2026-09-25 00:02:35 +00:00
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:
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user