mirror of
https://github.com/langgenius/dify.git
synced 2026-09-05 08:48:10 +08:00
Co-authored-by: zhangx1n <zhangxin@dify.ai> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
89 lines
2.9 KiB
TypeScript
89 lines
2.9 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vite-plus/test'
|
|
|
|
const getMock = vi.hoisted(() => vi.fn())
|
|
|
|
vi.mock('./base', () => ({
|
|
del: vi.fn(),
|
|
delPublic: vi.fn(),
|
|
get: vi.fn(),
|
|
getPublic: getMock,
|
|
patch: vi.fn(),
|
|
patchPublic: vi.fn(),
|
|
post: vi.fn(),
|
|
postPublic: vi.fn(),
|
|
ssePost: vi.fn(),
|
|
upload: vi.fn(),
|
|
}))
|
|
|
|
vi.mock('./webapp-auth', () => ({
|
|
getOrCreateWebAppSessionId: vi.fn(() => 'webapp-session-1'),
|
|
getWebAppAccessToken: vi.fn(() => ''),
|
|
}))
|
|
|
|
const { fetchAccessToken } = await import('./share')
|
|
|
|
describe('fetchAccessToken', () => {
|
|
beforeEach(() => {
|
|
getMock.mockReset()
|
|
})
|
|
|
|
it('shares an in-flight passport request for the same environment', async () => {
|
|
window.history.replaceState({}, '', '/environment/workflow/environment-app')
|
|
let resolveRequest: (value: { access_token: string }) => void = () => {}
|
|
getMock.mockReturnValue(
|
|
new Promise((resolve) => {
|
|
resolveRequest = resolve
|
|
}),
|
|
)
|
|
|
|
const firstRequest = fetchAccessToken({ appCode: 'environment-app' })
|
|
const secondRequest = fetchAccessToken({ appCode: 'environment-app' })
|
|
|
|
expect(getMock).toHaveBeenCalledTimes(1)
|
|
expect(getMock).toHaveBeenCalledWith('/passport?user_id=webapp-session-1', expect.anything())
|
|
|
|
resolveRequest({ access_token: 'passport' })
|
|
await expect(Promise.all([firstRequest, secondRequest])).resolves.toEqual([
|
|
{ access_token: 'passport' },
|
|
{ access_token: 'passport' },
|
|
])
|
|
|
|
await fetchAccessToken({ appCode: 'environment-app' })
|
|
expect(getMock).toHaveBeenCalledTimes(2)
|
|
})
|
|
|
|
it('does not coalesce ordinary Web App passport requests', async () => {
|
|
window.history.replaceState({}, '', '/workflow/ordinary-app')
|
|
getMock.mockResolvedValue({ access_token: 'passport' })
|
|
|
|
await Promise.all([
|
|
fetchAccessToken({ appCode: 'ordinary-app' }),
|
|
fetchAccessToken({ appCode: 'ordinary-app' }),
|
|
])
|
|
|
|
expect(getMock).toHaveBeenCalledTimes(2)
|
|
})
|
|
|
|
it('passes an embedded user id to the environment passport', async () => {
|
|
window.history.replaceState({}, '', '/environment/workflow/environment-app')
|
|
getMock.mockResolvedValue({ access_token: 'passport' })
|
|
|
|
await fetchAccessToken({ appCode: 'environment-app', userId: 'iframe-user-123' })
|
|
|
|
expect(getMock).toHaveBeenCalledWith('/passport?user_id=iframe-user-123', expect.anything())
|
|
})
|
|
|
|
it('starts a new environment passport request after a failure', async () => {
|
|
window.history.replaceState({}, '', '/environment/workflow/environment-app')
|
|
const error = new Response(null, { status: 401 })
|
|
getMock.mockRejectedValueOnce(error).mockResolvedValueOnce({ access_token: 'passport' })
|
|
|
|
await expect(fetchAccessToken({ appCode: 'environment-app' })).rejects.toBe(error)
|
|
await expect(fetchAccessToken({ appCode: 'environment-app' })).resolves.toEqual({
|
|
access_token: 'passport',
|
|
})
|
|
|
|
expect(getMock).toHaveBeenCalledTimes(2)
|
|
})
|
|
})
|