Add comprehensive performance monitoring and testing infrastructure
Some checks failed
Lint and Build / build (20) (pull_request) Failing after 36s
Lint and Build / build (22) (pull_request) Failing after 50s

- Implement performance dashboard with real-time metrics tracking
- Add React hooks for smart polling, debouncing, and active source lookup
- Create Jest testing framework with comprehensive test suites for components, API endpoints, and utilities
- Enhance UI components with optimized rendering and memoization
- Improve polling efficiency with visibility detection and adaptive intervals

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Decobus 2025-07-19 06:20:19 -04:00
parent a66979fb34
commit c259f0d943
15 changed files with 6320 additions and 94 deletions

View file

@ -0,0 +1,76 @@
import { GET } from '../streams/route';
// Mock the database module
jest.mock('@/lib/database', () => ({
getDatabase: jest.fn(),
}));
describe('/api/streams', () => {
let mockDb: any;
beforeEach(() => {
// Create mock database
mockDb = {
all: jest.fn(),
};
const { getDatabase } = require('@/lib/database');
getDatabase.mockResolvedValue(mockDb);
});
describe('GET /api/streams', () => {
it('returns all streams successfully', async () => {
const mockStreams = [
{ id: 1, name: 'Stream 1', url: 'http://example.com/1', obs_source_name: 'Source 1', team_id: 1 },
{ id: 2, name: 'Stream 2', url: 'http://example.com/2', obs_source_name: 'Source 2', team_id: 2 },
];
mockDb.all.mockResolvedValue(mockStreams);
const response = await GET();
expect(mockDb.all).toHaveBeenCalledWith(
expect.stringContaining('SELECT * FROM')
);
const { NextResponse } = require('next/server');
expect(NextResponse.json).toHaveBeenCalledWith(mockStreams);
});
it('returns empty array when no streams exist', async () => {
mockDb.all.mockResolvedValue([]);
const response = await GET();
const { NextResponse } = require('next/server');
expect(NextResponse.json).toHaveBeenCalledWith([]);
});
it('handles database errors gracefully', async () => {
const dbError = new Error('Database connection failed');
mockDb.all.mockRejectedValue(dbError);
const response = await GET();
const { NextResponse } = require('next/server');
expect(NextResponse.json).toHaveBeenCalledWith(
{ error: 'Failed to fetch streams' },
{ status: 500 }
);
});
it('handles database connection errors', async () => {
const connectionError = new Error('Failed to connect to database');
const { getDatabase } = require('@/lib/database');
getDatabase.mockRejectedValue(connectionError);
const response = await GET();
const { NextResponse } = require('next/server');
expect(NextResponse.json).toHaveBeenCalledWith(
{ error: 'Failed to fetch streams' },
{ status: 500 }
);
});
});
});

View file

@ -0,0 +1,89 @@
import { GET } from '../teams/route';
// Mock the database module
jest.mock('@/lib/database', () => ({
getDatabase: jest.fn(),
}));
// Mock the apiHelpers module
jest.mock('@/lib/apiHelpers', () => ({
withErrorHandling: jest.fn((handler) => handler),
createSuccessResponse: jest.fn((data, status = 200) => ({
data,
status,
json: async () => ({ success: true, data }),
})),
createDatabaseError: jest.fn((operation, error) => ({
error: 'Database Error',
status: 500,
json: async () => ({
error: 'Database Error',
message: `Database operation failed: ${operation}`,
}),
})),
}));
describe('/api/teams', () => {
let mockDb: any;
beforeEach(() => {
// Create mock database
mockDb = {
all: jest.fn(),
};
const { getDatabase } = require('@/lib/database');
getDatabase.mockResolvedValue(mockDb);
});
describe('GET /api/teams', () => {
it('returns all teams successfully', async () => {
const mockTeams = [
{ team_id: 1, team_name: 'Team Alpha' },
{ team_id: 2, team_name: 'Team Beta' },
{ team_id: 3, team_name: 'Team Gamma' },
];
mockDb.all.mockResolvedValue(mockTeams);
const response = await GET();
expect(mockDb.all).toHaveBeenCalledWith(
expect.stringContaining('SELECT * FROM')
);
const { createSuccessResponse } = require('@/lib/apiHelpers');
expect(createSuccessResponse).toHaveBeenCalledWith(mockTeams);
});
it('returns empty array when no teams exist', async () => {
mockDb.all.mockResolvedValue([]);
const response = await GET();
const { createSuccessResponse } = require('@/lib/apiHelpers');
expect(createSuccessResponse).toHaveBeenCalledWith([]);
});
it('handles database errors gracefully', async () => {
const dbError = new Error('Table does not exist');
mockDb.all.mockRejectedValue(dbError);
const response = await GET();
const { createDatabaseError } = require('@/lib/apiHelpers');
expect(createDatabaseError).toHaveBeenCalledWith('fetch teams', dbError);
});
it('handles database connection errors', async () => {
const connectionError = new Error('Failed to connect to database');
const { getDatabase } = require('@/lib/database');
getDatabase.mockRejectedValue(connectionError);
const response = await GET();
const { createDatabaseError } = require('@/lib/apiHelpers');
expect(createDatabaseError).toHaveBeenCalledWith('fetch teams', connectionError);
});
});
});