mirror of https://github.com/langgenius/dify.git
98 lines
3.9 KiB
TypeScript
98 lines
3.9 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest'
|
|
import { pluginInstallLimit } from '@/app/components/plugins/install-plugin/hooks/use-install-plugin-limit'
|
|
import { InstallationScope } from '@/types/feature'
|
|
|
|
vi.mock('@/context/global-public-context', () => ({
|
|
useGlobalPublicStore: () => ({
|
|
plugin_installation_permission: {
|
|
restrict_to_marketplace_only: false,
|
|
plugin_installation_scope: InstallationScope.ALL,
|
|
},
|
|
}),
|
|
}))
|
|
|
|
describe('Plugin Marketplace to Install Flow', () => {
|
|
describe('install permission validation pipeline', () => {
|
|
const systemFeaturesAll = {
|
|
plugin_installation_permission: {
|
|
restrict_to_marketplace_only: false,
|
|
plugin_installation_scope: InstallationScope.ALL,
|
|
},
|
|
}
|
|
|
|
const systemFeaturesMarketplaceOnly = {
|
|
plugin_installation_permission: {
|
|
restrict_to_marketplace_only: true,
|
|
plugin_installation_scope: InstallationScope.ALL,
|
|
},
|
|
}
|
|
|
|
const systemFeaturesOfficialOnly = {
|
|
plugin_installation_permission: {
|
|
restrict_to_marketplace_only: false,
|
|
plugin_installation_scope: InstallationScope.OFFICIAL_ONLY,
|
|
},
|
|
}
|
|
|
|
it('should allow marketplace plugin when all sources allowed', () => {
|
|
const plugin = { from: 'marketplace' as const, verification: { authorized_category: 'langgenius' } }
|
|
const result = pluginInstallLimit(plugin as never, systemFeaturesAll as never)
|
|
expect(result.canInstall).toBe(true)
|
|
})
|
|
|
|
it('should allow github plugin when all sources allowed', () => {
|
|
const plugin = { from: 'github' as const, verification: { authorized_category: 'langgenius' } }
|
|
const result = pluginInstallLimit(plugin as never, systemFeaturesAll as never)
|
|
expect(result.canInstall).toBe(true)
|
|
})
|
|
|
|
it('should block github plugin when marketplace only', () => {
|
|
const plugin = { from: 'github' as const, verification: { authorized_category: 'langgenius' } }
|
|
const result = pluginInstallLimit(plugin as never, systemFeaturesMarketplaceOnly as never)
|
|
expect(result.canInstall).toBe(false)
|
|
})
|
|
|
|
it('should allow marketplace plugin when marketplace only', () => {
|
|
const plugin = { from: 'marketplace' as const, verification: { authorized_category: 'partner' } }
|
|
const result = pluginInstallLimit(plugin as never, systemFeaturesMarketplaceOnly as never)
|
|
expect(result.canInstall).toBe(true)
|
|
})
|
|
|
|
it('should allow official plugin when official only', () => {
|
|
const plugin = { from: 'marketplace' as const, verification: { authorized_category: 'langgenius' } }
|
|
const result = pluginInstallLimit(plugin as never, systemFeaturesOfficialOnly as never)
|
|
expect(result.canInstall).toBe(true)
|
|
})
|
|
|
|
it('should block community plugin when official only', () => {
|
|
const plugin = { from: 'marketplace' as const, verification: { authorized_category: 'community' } }
|
|
const result = pluginInstallLimit(plugin as never, systemFeaturesOfficialOnly as never)
|
|
expect(result.canInstall).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('plugin source classification', () => {
|
|
it('should correctly classify plugin install sources', () => {
|
|
const sources = ['marketplace', 'github', 'package'] as const
|
|
const features = {
|
|
plugin_installation_permission: {
|
|
restrict_to_marketplace_only: true,
|
|
plugin_installation_scope: InstallationScope.ALL,
|
|
},
|
|
}
|
|
|
|
const results = sources.map(source => ({
|
|
source,
|
|
canInstall: pluginInstallLimit(
|
|
{ from: source, verification: { authorized_category: 'langgenius' } } as never,
|
|
features as never,
|
|
).canInstall,
|
|
}))
|
|
|
|
expect(results.find(r => r.source === 'marketplace')?.canInstall).toBe(true)
|
|
expect(results.find(r => r.source === 'github')?.canInstall).toBe(false)
|
|
expect(results.find(r => r.source === 'package')?.canInstall).toBe(false)
|
|
})
|
|
})
|
|
})
|