/**
* Tests for the MaintenancePage component.
*/
import { describe, it, expect, beforeEach } from 'vitest';
import { screen, waitFor } from '@testing-library/react';
import { render } from '../utils';
import { MaintenancePage } from '../../pages/MaintenancePage';
import { http, HttpResponse } from 'msw';
import { server } from '../mocks/server';
const mockPrinters = [
{
id: 1,
name: 'X1 Carbon',
model: 'X1C',
serial_number: '00M09A350100001',
},
];
const mockMaintenanceTypes = [
{
id: 1,
name: 'Clean Nozzle',
description: 'Clean the printer nozzle',
default_interval_hours: 50,
applies_to_models: ['X1C', 'P1S'],
},
{
id: 2,
name: 'Lubricate Rods',
description: 'Lubricate linear rods',
default_interval_hours: 200,
applies_to_models: ['X1C', 'P1S'],
},
];
const mockMaintenanceTasks = [
{
id: 1,
printer_id: 1,
maintenance_type_id: 1,
maintenance_type_name: 'Clean Nozzle',
interval_hours: 50,
last_completed_at: '2024-01-01T00:00:00Z',
next_due_at: '2024-01-03T00:00:00Z',
hours_until_due: 10,
is_due: false,
notes: null,
},
{
id: 2,
printer_id: 1,
maintenance_type_id: 2,
maintenance_type_name: 'Lubricate Rods',
interval_hours: 200,
last_completed_at: '2023-12-01T00:00:00Z',
next_due_at: '2023-12-15T00:00:00Z',
hours_until_due: -100,
is_due: true,
notes: 'Use PTFE lubricant',
},
];
describe('MaintenancePage', () => {
beforeEach(() => {
server.use(
http.get('/api/v1/printers/', () => {
return HttpResponse.json(mockPrinters);
}),
http.get('/api/v1/maintenance/types', () => {
return HttpResponse.json(mockMaintenanceTypes);
}),
http.get('/api/v1/maintenance/', () => {
return HttpResponse.json(mockMaintenanceTasks);
}),
http.get('/api/v1/maintenance/overview', () => {
// Overview is an array of printer summaries
return HttpResponse.json([
{
printer_id: 1,
printer_name: 'X1 Carbon',
due_count: 1,
warning_count: 0,
total_print_hours: 100,
maintenance_items: [
{
id: 1,
maintenance_type_id: 1,
maintenance_type_name: 'Clean Nozzle',
interval_hours: 50,
hours_since_last: 45,
hours_until_due: 5,
is_due: false,
is_warning: false,
},
{
id: 2,
maintenance_type_id: 2,
maintenance_type_name: 'Lubricate Rods',
interval_hours: 200,
hours_since_last: 250,
hours_until_due: -50,
is_due: true,
is_warning: false,
},
],
},
]);
}),
http.post('/api/v1/maintenance/', async ({ request }) => {
const body = await request.json() as { name: string };
return HttpResponse.json({ id: 3, ...body });
}),
http.post('/api/v1/maintenance/:id/complete', () => {
return HttpResponse.json({ success: true });
})
);
});
describe('rendering', () => {
it('renders the page title', async () => {
render();
await waitFor(() => {
expect(screen.getByText('Maintenance')).toBeInTheDocument();
});
});
it('renders maintenance page content', async () => {
render();
await waitFor(() => {
// Page should render with printer tabs or tasks
expect(screen.getByText('Maintenance')).toBeInTheDocument();
});
});
});
describe('printer tabs', () => {
it('shows printer tabs when printers exist', async () => {
render();
await waitFor(() => {
// Should show printer name in tabs
expect(screen.getByText('X1 Carbon')).toBeInTheDocument();
});
});
});
});