dify/web/service/webapp-address.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

84 lines
3.1 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from 'vite-plus/test'
import {
getWebAppApiPath,
getWebAppConversationScopeId,
getWebAppPublicApiPath,
parseWebAppAddress,
resolveWebAppAddress,
} from './webapp-address'
describe('WebAppAddress', () => {
afterEach(() => {
vi.unstubAllGlobals()
})
it('parses ordinary and environment workflow addresses without using the app code format', () => {
expect(parseWebAppAddress('/workflow/env-prefix-is-still-ordinary')).toEqual({
kind: 'default',
code: 'env-prefix-is-still-ordinary',
})
expect(parseWebAppAddress('/environment/workflow/workflow-app')).toEqual({
kind: 'environment',
code: 'workflow-app',
})
})
it('does not reinterpret an unsupported environment path as an ordinary webapp', () => {
expect(parseWebAppAddress('/environment/workflow')).toBeNull()
expect(parseWebAppAddress('/environment/not-a-mode/workflow-app')).toBeNull()
})
it('accepts every webapp mode under the environment prefix', () => {
expect(parseWebAppAddress('/environment/chat/chat-app')).toEqual({
kind: 'environment',
code: 'chat-app',
})
})
it('builds the environment upload and workflow URLs', () => {
const address = parseWebAppAddress('/environment/workflow/workflow-app')
expect(getWebAppApiPath(address, '/files/upload')).toBe(
'/environment/workflow-app/files/upload',
)
expect(getWebAppApiPath(address, '/workflows/run')).toBe(
'/environment/workflow-app/workflows/run',
)
expect(getWebAppApiPath(address, '/workflows/tasks/task-1/stop')).toBe(
'/environment/workflow-app/workflows/tasks/task-1/stop',
)
})
it('routes only environment login status to the environment API', () => {
const address = parseWebAppAddress('/environment/workflow/workflow-app')
expect(getWebAppPublicApiPath(address, '/login/status?user_id=user-1')).toBe(
'/environment/workflow-app/login/status?user_id=user-1',
)
expect(getWebAppPublicApiPath(address, '/login')).toBe('/login')
expect(getWebAppPublicApiPath(address, '/logout')).toBe('/logout')
expect(getWebAppPublicApiPath(address, '/email-code-login/validity')).toBe(
'/email-code-login/validity',
)
expect(getWebAppPublicApiPath(address, '/forgot-password')).toBe('/forgot-password')
expect(getWebAppPublicApiPath(address, '/enterprise/sso/members/oidc/login')).toBe(
'/enterprise/sso/members/oidc/login',
)
})
it('does not resolve a browser address during server rendering', () => {
vi.stubGlobal('location', undefined)
expect(resolveWebAppAddress()).toBeNull()
})
it('isolates Environment conversations without changing ordinary webapp storage', () => {
expect(getWebAppConversationScopeId({ kind: 'default', code: 'webapp' }, 'app-1')).toBe('app-1')
expect(
getWebAppConversationScopeId({ kind: 'environment', code: 'environment-1' }, 'app-1'),
).toBe('environment:environment-1')
expect(
getWebAppConversationScopeId({ kind: 'environment', code: 'environment-2' }, 'app-1'),
).toBe('environment:environment-2')
})
})