mirror of
https://github.com/langgenius/dify.git
synced 2026-03-21 22:38:26 +08:00
129 lines
3.7 KiB
TypeScript
129 lines
3.7 KiB
TypeScript
import type { PluginDetail } from './types'
|
|
import { useQuery } from '@tanstack/react-query'
|
|
import { renderHook } from '@testing-library/react'
|
|
import { consoleQuery } from '@/service/client'
|
|
import { usePluginsWithLatestVersion } from './hooks'
|
|
import { PluginSource } from './types'
|
|
|
|
vi.mock('@tanstack/react-query', () => ({
|
|
useQuery: vi.fn(),
|
|
}))
|
|
|
|
vi.mock('@/service/client', () => ({
|
|
consoleQuery: {
|
|
plugins: {
|
|
latestVersions: {
|
|
queryOptions: vi.fn((options: unknown) => options),
|
|
},
|
|
},
|
|
},
|
|
}))
|
|
|
|
const createPlugin = (overrides: Partial<PluginDetail> = {}): PluginDetail => ({
|
|
id: 'plugin-1',
|
|
created_at: '2026-01-01T00:00:00Z',
|
|
updated_at: '2026-01-01T00:00:00Z',
|
|
name: 'demo-plugin',
|
|
plugin_id: 'plugin-1',
|
|
plugin_unique_identifier: 'plugin-1@1.0.0',
|
|
declaration: {} as PluginDetail['declaration'],
|
|
installation_id: 'installation-1',
|
|
tenant_id: 'tenant-1',
|
|
endpoints_setups: 0,
|
|
endpoints_active: 0,
|
|
version: '1.0.0',
|
|
latest_version: '1.0.0',
|
|
latest_unique_identifier: 'plugin-1@1.0.0',
|
|
source: PluginSource.marketplace,
|
|
meta: undefined,
|
|
status: 'active',
|
|
deprecated_reason: '',
|
|
alternative_plugin_id: '',
|
|
...overrides,
|
|
})
|
|
|
|
describe('usePluginsWithLatestVersion', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
vi.mocked(useQuery).mockReturnValue({ data: undefined } as never)
|
|
})
|
|
|
|
it('should disable latest-version querying when there are no marketplace plugins', () => {
|
|
const plugins = [
|
|
createPlugin({ plugin_id: 'github-plugin', source: PluginSource.github }),
|
|
]
|
|
|
|
const { result } = renderHook(() => usePluginsWithLatestVersion(plugins))
|
|
|
|
expect(consoleQuery.plugins.latestVersions.queryOptions).toHaveBeenCalledWith({
|
|
input: { body: { plugin_ids: [] } },
|
|
enabled: false,
|
|
})
|
|
expect(result.current).toEqual(plugins)
|
|
})
|
|
|
|
it('should return the original plugins when version data is unavailable', () => {
|
|
const plugins = [createPlugin()]
|
|
|
|
const { result } = renderHook(() => usePluginsWithLatestVersion(plugins))
|
|
|
|
expect(result.current).toEqual(plugins)
|
|
})
|
|
|
|
it('should keep plugins unchanged when a plugin has no matching latest version', () => {
|
|
const plugins = [createPlugin()]
|
|
vi.mocked(useQuery).mockReturnValue({
|
|
data: { versions: {} },
|
|
} as never)
|
|
|
|
const { result } = renderHook(() => usePluginsWithLatestVersion(plugins))
|
|
|
|
expect(result.current).toEqual(plugins)
|
|
})
|
|
|
|
it('should merge latest version fields for marketplace plugins with version data', () => {
|
|
const plugins = [
|
|
createPlugin(),
|
|
createPlugin({
|
|
id: 'plugin-2',
|
|
plugin_id: 'plugin-2',
|
|
plugin_unique_identifier: 'plugin-2@1.0.0',
|
|
latest_version: '1.0.0',
|
|
latest_unique_identifier: 'plugin-2@1.0.0',
|
|
source: PluginSource.github,
|
|
}),
|
|
]
|
|
vi.mocked(useQuery).mockReturnValue({
|
|
data: {
|
|
versions: {
|
|
'plugin-1': {
|
|
version: '1.1.0',
|
|
unique_identifier: 'plugin-1@1.1.0',
|
|
status: 'deleted',
|
|
deprecated_reason: 'replaced',
|
|
alternative_plugin_id: 'plugin-3',
|
|
},
|
|
},
|
|
},
|
|
} as never)
|
|
|
|
const { result } = renderHook(() => usePluginsWithLatestVersion(plugins))
|
|
|
|
expect(consoleQuery.plugins.latestVersions.queryOptions).toHaveBeenCalledWith({
|
|
input: { body: { plugin_ids: ['plugin-1'] } },
|
|
enabled: true,
|
|
})
|
|
expect(result.current).toEqual([
|
|
expect.objectContaining({
|
|
plugin_id: 'plugin-1',
|
|
latest_version: '1.1.0',
|
|
latest_unique_identifier: 'plugin-1@1.1.0',
|
|
status: 'deleted',
|
|
deprecated_reason: 'replaced',
|
|
alternative_plugin_id: 'plugin-3',
|
|
}),
|
|
plugins[1],
|
|
])
|
|
})
|
|
})
|