mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-03 22:59:14 +00:00
272 lines
8.1 KiB
TypeScript
272 lines
8.1 KiB
TypeScript
import { createPinia, setActivePinia } from 'pinia'
|
|
import { beforeEach, describe, expect, it } from 'vitest'
|
|
|
|
import { useConflictDetectionStore } from '@/workbench/extensions/manager/stores/conflictDetectionStore'
|
|
import type { ConflictDetectionResult } from '@/workbench/extensions/manager/types/conflictDetectionTypes'
|
|
|
|
describe('useConflictDetectionStore', () => {
|
|
beforeEach(() => {
|
|
setActivePinia(createPinia())
|
|
})
|
|
|
|
const mockConflictedPackages: ConflictDetectionResult[] = [
|
|
{
|
|
package_id: 'ComfyUI-Manager',
|
|
package_name: 'ComfyUI-Manager',
|
|
has_conflict: true,
|
|
is_compatible: false,
|
|
conflicts: [
|
|
{
|
|
type: 'pending',
|
|
current_value: 'no_registry_data',
|
|
required_value: 'registry_data_available'
|
|
}
|
|
]
|
|
},
|
|
{
|
|
package_id: 'comfyui-easy-use',
|
|
package_name: 'comfyui-easy-use',
|
|
has_conflict: true,
|
|
is_compatible: false,
|
|
conflicts: [
|
|
{
|
|
type: 'comfyui_version',
|
|
current_value: '0.3.43',
|
|
required_value: '<0.3.40'
|
|
}
|
|
]
|
|
},
|
|
{
|
|
package_id: 'img2colors-comfyui-node',
|
|
package_name: 'img2colors-comfyui-node',
|
|
has_conflict: true,
|
|
is_compatible: false,
|
|
conflicts: [
|
|
{
|
|
type: 'banned',
|
|
current_value: 'installed',
|
|
required_value: 'not_banned'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
describe('initial state', () => {
|
|
it('should have empty initial state', () => {
|
|
const store = useConflictDetectionStore()
|
|
|
|
expect(store.conflictedPackages).toEqual([])
|
|
expect(store.isDetecting).toBe(false)
|
|
expect(store.lastDetectionTime).toBeNull()
|
|
expect(store.hasConflicts).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('setConflictedPackages', () => {
|
|
it('should set conflicted packages', () => {
|
|
const store = useConflictDetectionStore()
|
|
|
|
store.setConflictedPackages(mockConflictedPackages)
|
|
|
|
expect(store.conflictedPackages).toEqual(mockConflictedPackages)
|
|
expect(store.conflictedPackages).toHaveLength(3)
|
|
})
|
|
|
|
it('should update hasConflicts computed property', () => {
|
|
const store = useConflictDetectionStore()
|
|
|
|
expect(store.hasConflicts).toBe(false)
|
|
|
|
store.setConflictedPackages(mockConflictedPackages)
|
|
|
|
expect(store.hasConflicts).toBe(true)
|
|
})
|
|
})
|
|
|
|
describe('getConflictsForPackageByID', () => {
|
|
it('should find package by exact ID match', () => {
|
|
const store = useConflictDetectionStore()
|
|
store.setConflictedPackages(mockConflictedPackages)
|
|
|
|
const result = store.getConflictsForPackageByID('ComfyUI-Manager')
|
|
|
|
expect(result).toBeDefined()
|
|
expect(result?.package_id).toBe('ComfyUI-Manager')
|
|
expect(result?.conflicts).toHaveLength(1)
|
|
})
|
|
|
|
it('should return undefined for non-existent package', () => {
|
|
const store = useConflictDetectionStore()
|
|
store.setConflictedPackages(mockConflictedPackages)
|
|
|
|
const result = store.getConflictsForPackageByID('non-existent-package')
|
|
|
|
expect(result).toBeUndefined()
|
|
})
|
|
})
|
|
|
|
describe('bannedPackages', () => {
|
|
it('should filter packages with banned conflicts', () => {
|
|
const store = useConflictDetectionStore()
|
|
store.setConflictedPackages(mockConflictedPackages)
|
|
|
|
const bannedPackages = store.bannedPackages
|
|
|
|
expect(bannedPackages).toHaveLength(1)
|
|
expect(bannedPackages[0].package_id).toBe('img2colors-comfyui-node')
|
|
})
|
|
|
|
it('should return empty array when no banned packages', () => {
|
|
const store = useConflictDetectionStore()
|
|
const noBannedPackages = mockConflictedPackages.filter(
|
|
(pkg) => !pkg.conflicts.some((c) => c.type === 'banned')
|
|
)
|
|
store.setConflictedPackages(noBannedPackages)
|
|
|
|
const bannedPackages = store.bannedPackages
|
|
|
|
expect(bannedPackages).toHaveLength(0)
|
|
})
|
|
})
|
|
|
|
describe('securityPendingPackages', () => {
|
|
it('should filter packages with pending conflicts', () => {
|
|
const store = useConflictDetectionStore()
|
|
store.setConflictedPackages(mockConflictedPackages)
|
|
|
|
const securityPendingPackages = store.securityPendingPackages
|
|
|
|
expect(securityPendingPackages).toHaveLength(1)
|
|
expect(securityPendingPackages[0].package_id).toBe('ComfyUI-Manager')
|
|
})
|
|
})
|
|
|
|
describe('clearConflicts', () => {
|
|
it('should clear all conflicted packages', () => {
|
|
const store = useConflictDetectionStore()
|
|
store.setConflictedPackages(mockConflictedPackages)
|
|
|
|
expect(store.conflictedPackages).toHaveLength(3)
|
|
expect(store.hasConflicts).toBe(true)
|
|
|
|
store.clearConflicts()
|
|
|
|
expect(store.conflictedPackages).toEqual([])
|
|
expect(store.hasConflicts).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('detection state management', () => {
|
|
it('should set detecting state', () => {
|
|
const store = useConflictDetectionStore()
|
|
|
|
expect(store.isDetecting).toBe(false)
|
|
|
|
store.setDetecting(true)
|
|
|
|
expect(store.isDetecting).toBe(true)
|
|
|
|
store.setDetecting(false)
|
|
|
|
expect(store.isDetecting).toBe(false)
|
|
})
|
|
|
|
it('should set last detection time', () => {
|
|
const store = useConflictDetectionStore()
|
|
const timestamp = '2024-01-01T00:00:00Z'
|
|
|
|
expect(store.lastDetectionTime).toBeNull()
|
|
|
|
store.setLastDetectionTime(timestamp)
|
|
|
|
expect(store.lastDetectionTime).toBe(timestamp)
|
|
})
|
|
})
|
|
|
|
describe('reactivity', () => {
|
|
it('should update computed properties when conflicted packages change', () => {
|
|
const store = useConflictDetectionStore()
|
|
|
|
// Initially no conflicts
|
|
expect(store.hasConflicts).toBe(false)
|
|
expect(store.bannedPackages).toHaveLength(0)
|
|
|
|
// Add conflicts
|
|
store.setConflictedPackages(mockConflictedPackages)
|
|
|
|
// Computed properties should update
|
|
expect(store.hasConflicts).toBe(true)
|
|
expect(store.bannedPackages).toHaveLength(1)
|
|
expect(store.securityPendingPackages).toHaveLength(1)
|
|
|
|
// Clear conflicts
|
|
store.clearConflicts()
|
|
|
|
// Computed properties should update again
|
|
expect(store.hasConflicts).toBe(false)
|
|
expect(store.bannedPackages).toHaveLength(0)
|
|
expect(store.securityPendingPackages).toHaveLength(0)
|
|
})
|
|
})
|
|
|
|
describe('edge cases', () => {
|
|
it('should handle empty conflicts array', () => {
|
|
const store = useConflictDetectionStore()
|
|
store.setConflictedPackages([])
|
|
|
|
expect(store.conflictedPackages).toEqual([])
|
|
expect(store.hasConflicts).toBe(false)
|
|
expect(store.bannedPackages).toHaveLength(0)
|
|
expect(store.securityPendingPackages).toHaveLength(0)
|
|
})
|
|
|
|
it('should handle packages with multiple conflict types', () => {
|
|
const store = useConflictDetectionStore()
|
|
const multiConflictPackage: ConflictDetectionResult = {
|
|
package_id: 'multi-conflict-package',
|
|
package_name: 'Multi Conflict Package',
|
|
has_conflict: true,
|
|
is_compatible: false,
|
|
conflicts: [
|
|
{
|
|
type: 'banned',
|
|
current_value: 'installed',
|
|
required_value: 'not_banned'
|
|
},
|
|
{
|
|
type: 'pending',
|
|
current_value: 'no_registry_data',
|
|
required_value: 'registry_data_available'
|
|
}
|
|
]
|
|
}
|
|
|
|
store.setConflictedPackages([multiConflictPackage])
|
|
|
|
// Should appear in both banned and security pending
|
|
expect(store.bannedPackages).toHaveLength(1)
|
|
expect(store.securityPendingPackages).toHaveLength(1)
|
|
expect(store.bannedPackages[0].package_id).toBe('multi-conflict-package')
|
|
expect(store.securityPendingPackages[0].package_id).toBe(
|
|
'multi-conflict-package'
|
|
)
|
|
})
|
|
|
|
it('should handle packages with has_conflict false', () => {
|
|
const store = useConflictDetectionStore()
|
|
const noConflictPackage: ConflictDetectionResult = {
|
|
package_id: 'no-conflict-package',
|
|
package_name: 'No Conflict Package',
|
|
has_conflict: false,
|
|
is_compatible: true,
|
|
conflicts: []
|
|
}
|
|
|
|
store.setConflictedPackages([noConflictPackage])
|
|
|
|
// hasConflicts should check has_conflict property
|
|
expect(store.hasConflicts).toBe(false)
|
|
})
|
|
})
|
|
})
|