| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- /**
- * Tests for the Edit-Printer setup-time pre-flight.
- *
- * Editing a printer runs the same connection diagnostic on save as the
- * Add-Printer dialog, and warns (rather than blocks) when a check fails.
- */
- import { describe, it, expect, beforeEach } from 'vitest';
- import { screen, waitFor } from '@testing-library/react';
- import userEvent from '@testing-library/user-event';
- import { render } from '../utils';
- import { PrintersPage } from '../../pages/PrintersPage';
- import { http, HttpResponse } from 'msw';
- import { server } from '../mocks/server';
- const mockPrinter = {
- id: 1,
- name: 'X1 Carbon',
- ip_address: '192.168.1.100',
- serial_number: '00M09A350100001',
- access_code: '12345678',
- model: 'X1C',
- enabled: true,
- nozzle_diameter: 0.4,
- nozzle_type: 'hardened_steel',
- location: null,
- auto_archive: true,
- created_at: '2024-01-01T00:00:00Z',
- updated_at: '2024-01-01T00:00:00Z',
- };
- const mockStatus = {
- connected: true,
- state: 'IDLE',
- progress: 0,
- layer_num: 0,
- total_layers: 0,
- temperatures: { nozzle: 25, bed: 25, chamber: 25 },
- remaining_time: 0,
- filename: null,
- wifi_signal: -50,
- vt_tray: [],
- };
- async function openEditModal() {
- render(<PrintersPage />);
- await waitFor(() => expect(screen.getByText('X1 Carbon')).toBeInTheDocument());
- // Open the per-printer actions menu (kebab button), then click Edit.
- const menuBtn = [...document.querySelectorAll('button')].find((b) =>
- b.querySelector('.lucide-ellipsis-vertical'),
- )!;
- await userEvent.click(menuBtn);
- await userEvent.click(await screen.findByRole('button', { name: /^edit$/i }));
- await screen.findByText('Edit Printer');
- }
- describe('EditPrinterModal pre-flight', () => {
- beforeEach(() => {
- server.use(
- http.get('/api/v1/printers/', () => HttpResponse.json([mockPrinter])),
- http.get('/api/v1/printers/:id/status', () => HttpResponse.json(mockStatus)),
- http.get('/api/v1/queue/', () => HttpResponse.json([])),
- );
- });
- it('warns instead of saving when a connection check fails', async () => {
- server.use(
- http.post('/api/v1/printers/diagnostic', () =>
- HttpResponse.json({
- printer_id: null,
- ip_address: '192.168.1.100',
- overall: 'problems',
- checks: [{ id: 'developer_mode', status: 'fail', params: {} }],
- }),
- ),
- );
- await openEditModal();
- await userEvent.click(screen.getByRole('button', { name: /save changes/i }));
- expect(await screen.findByText(/Some connection checks failed/i)).toBeInTheDocument();
- expect(screen.getByRole('button', { name: /save anyway/i })).toBeInTheDocument();
- });
- it('saves directly when all connection checks pass', async () => {
- let updated = false;
- server.use(
- http.post('/api/v1/printers/diagnostic', () =>
- HttpResponse.json({
- printer_id: null,
- ip_address: '192.168.1.100',
- overall: 'ok',
- checks: [{ id: 'developer_mode', status: 'pass', params: {} }],
- }),
- ),
- http.patch('/api/v1/printers/:id', async () => {
- updated = true;
- return HttpResponse.json({ ...mockPrinter, name: 'X1 Carbon' });
- }),
- );
- await openEditModal();
- await userEvent.click(screen.getByRole('button', { name: /save changes/i }));
- await waitFor(() => expect(updated).toBe(true));
- expect(screen.queryByText(/Some connection checks failed/i)).not.toBeInTheDocument();
- });
- });
|