Files
ComfyUI_frontend/tests-ui/tests/utils/systemCompatibility.test.ts
2025-09-28 15:33:29 -07:00

271 lines
9.1 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import type {
RegistryAccelerator,
RegistryOS
} from '@/workbench/extensions/manager/types/compatibility.types'
import {
checkAcceleratorCompatibility,
checkOSCompatibility,
normalizeOSList
} from '@/workbench/extensions/manager/utils/systemCompatibility'
describe('systemCompatibility', () => {
describe('checkOSCompatibility', () => {
it('should return null when supported OS list is null', () => {
const result = checkOSCompatibility(null, 'darwin')
expect(result).toBeNull()
})
it('should return null when supported OS list is undefined', () => {
const result = checkOSCompatibility(undefined, 'darwin')
expect(result).toBeNull()
})
it('should return null when supported OS list is empty', () => {
const result = checkOSCompatibility([], 'darwin')
expect(result).toBeNull()
})
it('should return null when OS is compatible (macOS)', () => {
const supported: RegistryOS[] = ['macOS', 'Windows']
const result = checkOSCompatibility(supported, 'darwin')
expect(result).toBeNull()
})
it('should return null when OS is compatible (Windows)', () => {
const supported: RegistryOS[] = ['Windows', 'Linux']
const result = checkOSCompatibility(supported, 'win32')
expect(result).toBeNull()
})
it('should return null when OS is compatible (Linux)', () => {
const supported: RegistryOS[] = ['Linux', 'macOS']
const result = checkOSCompatibility(supported, 'linux')
expect(result).toBeNull()
})
it('should return conflict when OS is incompatible', () => {
const supported: RegistryOS[] = ['Windows']
const result = checkOSCompatibility(supported, 'darwin')
expect(result).toEqual({
type: 'os',
current_value: 'macOS',
required_value: 'Windows'
})
})
it('should return conflict with Unknown OS when current OS is unrecognized', () => {
const supported: RegistryOS[] = ['Windows', 'Linux']
const result = checkOSCompatibility(supported, 'freebsd')
expect(result).toEqual({
type: 'os',
current_value: 'Unknown',
required_value: 'Windows, Linux'
})
})
it('should handle various OS string formats', () => {
const supported: RegistryOS[] = ['Windows']
// Test Windows variations
expect(checkOSCompatibility(supported, 'win32')).toBeNull()
expect(checkOSCompatibility(supported, 'windows')).toBeNull()
expect(checkOSCompatibility(supported, 'Windows_NT')).toBeNull()
// Test macOS variations
const macSupported: RegistryOS[] = ['macOS']
expect(checkOSCompatibility(macSupported, 'darwin')).toBeNull()
expect(checkOSCompatibility(macSupported, 'Darwin')).toBeNull()
expect(checkOSCompatibility(macSupported, 'macos')).toBeNull()
expect(checkOSCompatibility(macSupported, 'mac')).toBeNull()
})
it('should handle undefined current OS', () => {
const supported: RegistryOS[] = ['Windows']
const result = checkOSCompatibility(supported, undefined)
expect(result).toEqual({
type: 'os',
current_value: 'Unknown',
required_value: 'Windows'
})
})
})
describe('checkAcceleratorCompatibility', () => {
it('should return null when supported accelerator list is null', () => {
const result = checkAcceleratorCompatibility(null, 'cuda')
expect(result).toBeNull()
})
it('should return null when supported accelerator list is undefined', () => {
const result = checkAcceleratorCompatibility(undefined, 'cuda')
expect(result).toBeNull()
})
it('should return null when supported accelerator list is empty', () => {
const result = checkAcceleratorCompatibility([], 'cuda')
expect(result).toBeNull()
})
it('should return null when accelerator is compatible (CUDA)', () => {
const supported: RegistryAccelerator[] = ['CUDA', 'CPU']
const result = checkAcceleratorCompatibility(supported, 'cuda')
expect(result).toBeNull()
})
it('should return null when accelerator is compatible (Metal)', () => {
const supported: RegistryAccelerator[] = ['Metal', 'CPU']
const result = checkAcceleratorCompatibility(supported, 'mps')
expect(result).toBeNull()
})
it('should return null when accelerator is compatible (ROCm)', () => {
const supported: RegistryAccelerator[] = ['ROCm', 'CPU']
const result = checkAcceleratorCompatibility(supported, 'rocm')
expect(result).toBeNull()
})
it('should return null when accelerator is compatible (CPU)', () => {
const supported: RegistryAccelerator[] = ['CPU']
const result = checkAcceleratorCompatibility(supported, 'cpu')
expect(result).toBeNull()
})
it('should return conflict when accelerator is incompatible', () => {
const supported: RegistryAccelerator[] = ['CUDA']
const result = checkAcceleratorCompatibility(supported, 'mps')
expect(result).toEqual({
type: 'accelerator',
current_value: 'Metal',
required_value: 'CUDA'
})
})
it('should default to CPU for unknown device types', () => {
const supported: RegistryAccelerator[] = ['CUDA']
const result = checkAcceleratorCompatibility(supported, 'unknown')
expect(result).toEqual({
type: 'accelerator',
current_value: 'CPU',
required_value: 'CUDA'
})
})
it('should default to CPU when device type is undefined', () => {
const supported: RegistryAccelerator[] = ['CUDA']
const result = checkAcceleratorCompatibility(supported, undefined)
expect(result).toEqual({
type: 'accelerator',
current_value: 'CPU',
required_value: 'CUDA'
})
})
it('should handle case-insensitive device types', () => {
const supported: RegistryAccelerator[] = ['CUDA']
// CUDA variations
expect(checkAcceleratorCompatibility(supported, 'cuda')).toBeNull()
expect(checkAcceleratorCompatibility(supported, 'CUDA')).toBeNull()
expect(checkAcceleratorCompatibility(supported, 'Cuda')).toBeNull()
// Metal variations
const metalSupported: RegistryAccelerator[] = ['Metal']
expect(checkAcceleratorCompatibility(metalSupported, 'mps')).toBeNull()
expect(checkAcceleratorCompatibility(metalSupported, 'MPS')).toBeNull()
// ROCm variations
const rocmSupported: RegistryAccelerator[] = ['ROCm']
expect(checkAcceleratorCompatibility(rocmSupported, 'rocm')).toBeNull()
expect(checkAcceleratorCompatibility(rocmSupported, 'ROCM')).toBeNull()
})
it('should handle multiple required accelerators', () => {
const supported: RegistryAccelerator[] = ['CUDA', 'ROCm']
const result = checkAcceleratorCompatibility(supported, 'mps')
expect(result).toEqual({
type: 'accelerator',
current_value: 'Metal',
required_value: 'CUDA, ROCm'
})
})
})
describe('normalizeOSList', () => {
it('should return undefined for null input', () => {
const result = normalizeOSList(null)
expect(result).toBeUndefined()
})
it('should return undefined for undefined input', () => {
const result = normalizeOSList(undefined)
expect(result).toBeUndefined()
})
it('should return undefined for empty array', () => {
const result = normalizeOSList([])
expect(result).toBeUndefined()
})
it('should return undefined when OS Independent is present', () => {
const result = normalizeOSList(['OS Independent', 'Windows'])
expect(result).toBeUndefined()
})
it('should return undefined for case-insensitive OS Independent', () => {
const result = normalizeOSList(['os independent'])
expect(result).toBeUndefined()
})
it('should filter and return valid OS values', () => {
const result = normalizeOSList(['Windows', 'Linux', 'macOS'])
expect(result).toEqual(['Windows', 'Linux', 'macOS'])
})
it('should filter out invalid OS values', () => {
const result = normalizeOSList(['Windows', 'FreeBSD', 'Linux', 'Android'])
expect(result).toEqual(['Windows', 'Linux'])
})
it('should deduplicate OS values', () => {
const result = normalizeOSList([
'Windows',
'Linux',
'Windows',
'macOS',
'Linux'
])
expect(result).toEqual(['Windows', 'Linux', 'macOS'])
})
it('should return undefined when no valid OS values remain', () => {
const result = normalizeOSList(['FreeBSD', 'Android', 'iOS'])
expect(result).toBeUndefined()
})
it('should handle mixed valid and invalid values', () => {
const result = normalizeOSList([
'windows',
'Windows',
'linux',
'Linux',
'macos'
])
// Only exact matches are valid
expect(result).toEqual(['Windows', 'Linux'])
})
it('should preserve order of first occurrence when deduplicating', () => {
const result = normalizeOSList([
'Linux',
'Windows',
'macOS',
'Linux',
'Windows'
])
expect(result).toEqual(['Linux', 'Windows', 'macOS'])
})
})
})