dify/web/service/share.spec.ts
Wu Tianwei 550196e3b8
feat: app deployment v2 (#41444)
Co-authored-by: zhangx1n <zhangxin@dify.ai>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-09-04 02:01:35 +00:00

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)
})
})