85 lines
2.9 KiB
JavaScript
85 lines
2.9 KiB
JavaScript
import { describe, it, expect } from 'vitest';
|
|
import {
|
|
formatPatternName,
|
|
calculateCategoryBreakdown,
|
|
calculateResolutionPercentages,
|
|
getScoreColor
|
|
} from '../../web/utils/stats_logic.js';
|
|
|
|
describe('Stats Logic - formatPatternName', () => {
|
|
it('should format pattern IDs correctly', () => {
|
|
expect(formatPatternName('oom_error')).toBe('OOM Error');
|
|
expect(formatPatternName('cuda_memory')).toBe('CUDA Memory');
|
|
expect(formatPatternName('vae_decode_fail')).toBe('VAE Decode Fail');
|
|
expect(formatPatternName('llm_load_fail')).toBe('LLM Load Fail');
|
|
expect(formatPatternName('generic_error')).toBe('Generic Error');
|
|
});
|
|
|
|
it('should handle empty input', () => {
|
|
expect(formatPatternName(null)).toBe('Unknown');
|
|
expect(formatPatternName('')).toBe('Unknown');
|
|
});
|
|
});
|
|
|
|
describe('Stats Logic - calculateCategoryBreakdown', () => {
|
|
it('should calculate percentages and sort by count descending', () => {
|
|
const breakdown = {
|
|
'memory': 10,
|
|
'workflow': 5,
|
|
'generic': 5
|
|
};
|
|
const total = 20;
|
|
|
|
const result = calculateCategoryBreakdown(breakdown, total);
|
|
|
|
expect(result).toHaveLength(3);
|
|
// Should be sorted desc
|
|
expect(result[0].id).toBe('memory');
|
|
expect(result[0].percent).toBe(50); // 10/20
|
|
|
|
// Handling ties is stable/unspecified for sort, but logic is fine
|
|
expect(result[1].percent).toBe(25);
|
|
expect(result[2].percent).toBe(25);
|
|
});
|
|
|
|
it('should handle zero total gracefully', () => {
|
|
const breakdown = { 'memory': 0 };
|
|
const result = calculateCategoryBreakdown(breakdown, 0);
|
|
expect(result[0].percent).toBe(0);
|
|
});
|
|
|
|
it('should handle null breakdown', () => {
|
|
expect(calculateCategoryBreakdown(null, 10)).toEqual([]);
|
|
});
|
|
});
|
|
|
|
describe('Stats Logic - calculateResolutionPercentages', () => {
|
|
it('should calculate percentages correctly', () => {
|
|
const rates = { resolved: 50, unresolved: 30, ignored: 20 };
|
|
const res = calculateResolutionPercentages(rates);
|
|
|
|
expect(res.resolved).toBe(50);
|
|
expect(res.unresolved).toBe(30);
|
|
expect(res.ignored).toBe(20);
|
|
expect(res.total).toBe(100);
|
|
});
|
|
|
|
it('should handle empty/null rates (default to zero)', () => {
|
|
const res = calculateResolutionPercentages(null);
|
|
expect(res.resolved).toBe(0);
|
|
expect(res.unresolved).toBe(0);
|
|
expect(res.ignored).toBe(0);
|
|
expect(res.total).toBe(1); // Avoid div zero protection
|
|
});
|
|
});
|
|
|
|
describe('Stats Logic - getScoreColor', () => {
|
|
it('should return correct colors for thresholds', () => {
|
|
expect(getScoreColor(90)).toBe('#4caf50');
|
|
expect(getScoreColor(80)).toBe('#4caf50');
|
|
expect(getScoreColor(79)).toBe('#ff9800'); // Warning
|
|
expect(getScoreColor(50)).toBe('#ff9800');
|
|
expect(getScoreColor(49)).toBe('#f44336'); // Critical
|
|
});
|
|
});
|