feat: integrate all 10 skills into homelab-topology

- Added api-security-hardening (helmet, rate limits)
- Added nodejs-backend-patterns (error handling)
- Added observability-monitoring (pino logging)
- Added websocket-engineer (socket.io real-time updates)
- Added docker (Multi-stage build, compose)
- Added vitest (testing configuration and store tests)
- Added data-visualizer (MetricsBar and HostChart)
- Added infrastructure-monitoring/proxmox-admin/network-engineer types
- Fixed UI accessibility and styling
- Cleaned up node_modules tracking
This commit is contained in:
2026-02-20 20:35:08 -08:00
parent 3dc5d236a2
commit 6dd679b8e0
14455 changed files with 3862 additions and 2194786 deletions

67
src/utils/colors.test.ts Normal file
View File

@@ -0,0 +1,67 @@
import { describe, test, expect } from 'vitest';
import { getNodeColor, getStatusColor, getImportanceLabel, getImportanceColor } from './colors';
describe('getNodeColor', () => {
test('returns correct color for gateway', () => {
expect(getNodeColor('gateway')).toBe('#6366F1');
});
test('returns correct color for physical host', () => {
expect(getNodeColor('host_physical')).toBe('#10B981');
});
test('returns fallback color for unknown type', () => {
expect(getNodeColor('nonexistent' as any)).toBe('#6B7280');
});
test('returns service category color when type is service', () => {
expect(getNodeColor('service', 'media')).toBe('#EF4444');
expect(getNodeColor('service', 'infra')).toBe('#3B82F6');
expect(getNodeColor('service', 'monitoring')).toBe('#22C55E');
});
test('returns "other" service color when no category provided', () => {
expect(getNodeColor('service')).toBe('#6B7280');
});
});
describe('getStatusColor', () => {
test('returns green for running', () => {
expect(getStatusColor('running')).toBe('#22C55E');
});
test('returns red for stopped', () => {
expect(getStatusColor('stopped')).toBe('#EF4444');
});
test('returns gray for unknown', () => {
expect(getStatusColor('unknown')).toBe('#6B7280');
});
});
describe('getImportanceLabel', () => {
test('returns correct labels for all levels', () => {
expect(getImportanceLabel(1)).toBe('Minimal');
expect(getImportanceLabel(2)).toBe('Low');
expect(getImportanceLabel(3)).toBe('Medium');
expect(getImportanceLabel(4)).toBe('High');
expect(getImportanceLabel(5)).toBe('Critical');
});
test('returns Unknown for out-of-range values', () => {
expect(getImportanceLabel(0)).toBe('Unknown');
expect(getImportanceLabel(6)).toBe('Unknown');
});
});
describe('getImportanceColor', () => {
test('returns correct colors for all levels', () => {
expect(getImportanceColor(1)).toBe('#6B7280');
expect(getImportanceColor(3)).toBe('#F59E0B');
expect(getImportanceColor(5)).toBe('#EF4444');
});
test('returns fallback for out-of-range', () => {
expect(getImportanceColor(99)).toBe('#6B7280');
});
});