mirror of
https://github.com/langgenius/dify.git
synced 2026-05-13 08:57:28 +08:00
test: add nuqs adapter to hook specs
This commit is contained in:
parent
5e7aa8dd03
commit
fc196df814
@ -3,6 +3,7 @@ import type { ChatConfig } from '../types'
|
|||||||
import type { AppConversationData, AppData, AppMeta, ConversationItem } from '@/models/share'
|
import type { AppConversationData, AppData, AppMeta, ConversationItem } from '@/models/share'
|
||||||
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
||||||
import { act, renderHook, waitFor } from '@testing-library/react'
|
import { act, renderHook, waitFor } from '@testing-library/react'
|
||||||
|
import { NuqsTestingAdapter } from 'nuqs/adapters/testing'
|
||||||
import { ToastProvider } from '@/app/components/base/toast'
|
import { ToastProvider } from '@/app/components/base/toast'
|
||||||
import {
|
import {
|
||||||
fetchChatList,
|
fetchChatList,
|
||||||
@ -74,9 +75,11 @@ const createQueryClient = () => new QueryClient({
|
|||||||
|
|
||||||
const createWrapper = (queryClient: QueryClient) => {
|
const createWrapper = (queryClient: QueryClient) => {
|
||||||
return ({ children }: { children: ReactNode }) => (
|
return ({ children }: { children: ReactNode }) => (
|
||||||
<QueryClientProvider client={queryClient}>
|
<NuqsTestingAdapter>
|
||||||
<ToastProvider>{children}</ToastProvider>
|
<QueryClientProvider client={queryClient}>
|
||||||
</QueryClientProvider>
|
<ToastProvider>{children}</ToastProvider>
|
||||||
|
</QueryClientProvider>
|
||||||
|
</NuqsTestingAdapter>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,12 +1,9 @@
|
|||||||
|
import type { ReactNode } from 'react'
|
||||||
import { act, renderHook } from '@testing-library/react'
|
import { act, renderHook } from '@testing-library/react'
|
||||||
|
import { NuqsTestingAdapter } from 'nuqs/adapters/testing'
|
||||||
import { PARTNER_STACK_CONFIG } from '@/config'
|
import { PARTNER_STACK_CONFIG } from '@/config'
|
||||||
import usePSInfo from './use-ps-info'
|
import usePSInfo from './use-ps-info'
|
||||||
|
|
||||||
let searchParamsValues: Record<string, string | null> = {}
|
|
||||||
const setSearchParams = (values: Record<string, string | null>) => {
|
|
||||||
searchParamsValues = values
|
|
||||||
}
|
|
||||||
|
|
||||||
type PartnerStackGlobal = typeof globalThis & {
|
type PartnerStackGlobal = typeof globalThis & {
|
||||||
__partnerStackCookieMocks?: {
|
__partnerStackCookieMocks?: {
|
||||||
get: ReturnType<typeof vi.fn>
|
get: ReturnType<typeof vi.fn>
|
||||||
@ -49,11 +46,6 @@ vi.mock('js-cookie', () => {
|
|||||||
remove,
|
remove,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
vi.mock('next/navigation', () => ({
|
|
||||||
useSearchParams: () => ({
|
|
||||||
get: (key: string) => searchParamsValues[key] ?? null,
|
|
||||||
}),
|
|
||||||
}))
|
|
||||||
vi.mock('@/service/use-billing', () => {
|
vi.mock('@/service/use-billing', () => {
|
||||||
const mutateAsync = vi.fn()
|
const mutateAsync = vi.fn()
|
||||||
const globals = getPartnerStackGlobal()
|
const globals = getPartnerStackGlobal()
|
||||||
@ -65,6 +57,15 @@ vi.mock('@/service/use-billing', () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const renderWithAdapter = (searchParams = '') => {
|
||||||
|
const wrapper = ({ children }: { children: ReactNode }) => (
|
||||||
|
<NuqsTestingAdapter searchParams={searchParams}>
|
||||||
|
{children}
|
||||||
|
</NuqsTestingAdapter>
|
||||||
|
)
|
||||||
|
return renderHook(() => usePSInfo(), { wrapper })
|
||||||
|
}
|
||||||
|
|
||||||
describe('usePSInfo', () => {
|
describe('usePSInfo', () => {
|
||||||
const originalLocationDescriptor = Object.getOwnPropertyDescriptor(globalThis, 'location')
|
const originalLocationDescriptor = Object.getOwnPropertyDescriptor(globalThis, 'location')
|
||||||
|
|
||||||
@ -76,7 +77,6 @@ describe('usePSInfo', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
setSearchParams({})
|
|
||||||
const { get, set, remove } = ensureCookieMocks()
|
const { get, set, remove } = ensureCookieMocks()
|
||||||
get.mockReset()
|
get.mockReset()
|
||||||
set.mockReset()
|
set.mockReset()
|
||||||
@ -95,12 +95,7 @@ describe('usePSInfo', () => {
|
|||||||
it('saves partner info when query params change', () => {
|
it('saves partner info when query params change', () => {
|
||||||
const { get, set } = ensureCookieMocks()
|
const { get, set } = ensureCookieMocks()
|
||||||
get.mockReturnValue(JSON.stringify({ partnerKey: 'old', clickId: 'old-click' }))
|
get.mockReturnValue(JSON.stringify({ partnerKey: 'old', clickId: 'old-click' }))
|
||||||
setSearchParams({
|
const { result } = renderWithAdapter('?ps_partner_key=new-partner&ps_xid=new-click')
|
||||||
ps_partner_key: 'new-partner',
|
|
||||||
ps_xid: 'new-click',
|
|
||||||
})
|
|
||||||
|
|
||||||
const { result } = renderHook(() => usePSInfo())
|
|
||||||
|
|
||||||
expect(result.current.psPartnerKey).toBe('new-partner')
|
expect(result.current.psPartnerKey).toBe('new-partner')
|
||||||
expect(result.current.psClickId).toBe('new-click')
|
expect(result.current.psClickId).toBe('new-click')
|
||||||
@ -124,17 +119,13 @@ describe('usePSInfo', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('does not overwrite cookie when params do not change', () => {
|
it('does not overwrite cookie when params do not change', () => {
|
||||||
setSearchParams({
|
|
||||||
ps_partner_key: 'existing',
|
|
||||||
ps_xid: 'existing-click',
|
|
||||||
})
|
|
||||||
const { get } = ensureCookieMocks()
|
const { get } = ensureCookieMocks()
|
||||||
get.mockReturnValue(JSON.stringify({
|
get.mockReturnValue(JSON.stringify({
|
||||||
partnerKey: 'existing',
|
partnerKey: 'existing',
|
||||||
clickId: 'existing-click',
|
clickId: 'existing-click',
|
||||||
}))
|
}))
|
||||||
|
|
||||||
const { result } = renderHook(() => usePSInfo())
|
const { result } = renderWithAdapter('?ps_partner_key=existing&ps_xid=existing-click')
|
||||||
|
|
||||||
act(() => {
|
act(() => {
|
||||||
result.current.saveOrUpdate()
|
result.current.saveOrUpdate()
|
||||||
@ -145,12 +136,7 @@ describe('usePSInfo', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('binds partner info and clears cookie once', async () => {
|
it('binds partner info and clears cookie once', async () => {
|
||||||
setSearchParams({
|
const { result } = renderWithAdapter('?ps_partner_key=bind-partner&ps_xid=bind-click')
|
||||||
ps_partner_key: 'bind-partner',
|
|
||||||
ps_xid: 'bind-click',
|
|
||||||
})
|
|
||||||
|
|
||||||
const { result } = renderHook(() => usePSInfo())
|
|
||||||
|
|
||||||
const mutate = ensureMutateAsync()
|
const mutate = ensureMutateAsync()
|
||||||
const { remove } = ensureCookieMocks()
|
const { remove } = ensureCookieMocks()
|
||||||
@ -177,12 +163,7 @@ describe('usePSInfo', () => {
|
|||||||
it('still removes cookie when bind fails with status 400', async () => {
|
it('still removes cookie when bind fails with status 400', async () => {
|
||||||
const mutate = ensureMutateAsync()
|
const mutate = ensureMutateAsync()
|
||||||
mutate.mockRejectedValueOnce({ status: 400 })
|
mutate.mockRejectedValueOnce({ status: 400 })
|
||||||
setSearchParams({
|
const { result } = renderWithAdapter('?ps_partner_key=bind-partner&ps_xid=bind-click')
|
||||||
ps_partner_key: 'bind-partner',
|
|
||||||
ps_xid: 'bind-click',
|
|
||||||
})
|
|
||||||
|
|
||||||
const { result } = renderHook(() => usePSInfo())
|
|
||||||
|
|
||||||
await act(async () => {
|
await act(async () => {
|
||||||
await result.current.bind()
|
await result.current.bind()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user