mirror of
https://github.com/maziggy/bambuddy.git
synced 2026-09-30 11:12:35 +02:00
Add a speed control badge to the printer monitoring card controls row that lets users switch between Silent (50%), Standard (100%), Sport (124%), and Ludicrous (166%) presets during active prints. The badge displays a gauge icon with the current speed percentage, always visible but disabled when idle. Includes backend endpoint, optimistic UI updates, i18n for all 7 locales, and full test coverage.
78 lines
2.9 KiB
Python
78 lines
2.9 KiB
Python
"""Unit tests for the print speed control endpoint.
|
|
|
|
Tests POST /api/v1/printers/{printer_id}/print-speed?mode=N
|
|
where mode is 1=silent, 2=standard, 3=sport, 4=ludicrous.
|
|
"""
|
|
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import pytest
|
|
from httpx import AsyncClient
|
|
|
|
|
|
class TestPrintSpeedAPI:
|
|
"""Tests for the print speed control endpoint."""
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_print_speed_not_found(self, async_client: AsyncClient):
|
|
"""Verify 404 for non-existent printer."""
|
|
response = await async_client.post("/api/v1/printers/99999/print-speed?mode=2")
|
|
assert response.status_code == 404
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_print_speed_not_connected(self, async_client: AsyncClient, printer_factory):
|
|
"""Verify error when printer is not connected."""
|
|
printer = await printer_factory(name="Disconnected Printer")
|
|
|
|
with patch("backend.app.api.routes.printers.printer_manager") as mock_pm:
|
|
mock_pm.get_client.return_value = None
|
|
|
|
response = await async_client.post(f"/api/v1/printers/{printer.id}/print-speed?mode=2")
|
|
|
|
assert response.status_code == 400
|
|
assert "not connected" in response.json()["detail"].lower()
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_print_speed_failure(self, async_client: AsyncClient, printer_factory):
|
|
"""Verify 500 when client fails to set speed."""
|
|
printer = await printer_factory(name="Test Printer")
|
|
|
|
mock_client = MagicMock()
|
|
mock_client.set_print_speed.return_value = False
|
|
|
|
with patch("backend.app.api.routes.printers.printer_manager") as mock_pm:
|
|
mock_pm.get_client.return_value = mock_client
|
|
|
|
response = await async_client.post(f"/api/v1/printers/{printer.id}/print-speed?mode=2")
|
|
|
|
assert response.status_code == 500
|
|
assert "failed" in response.json()["detail"].lower()
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize(
|
|
"mode, expected_name",
|
|
[
|
|
(1, "Silent"),
|
|
(2, "Standard"),
|
|
(3, "Sport"),
|
|
(4, "Ludicrous"),
|
|
],
|
|
)
|
|
async def test_print_speed_success(self, async_client: AsyncClient, printer_factory, mode, expected_name):
|
|
"""Verify successful speed change for each mode (1-4)."""
|
|
printer = await printer_factory(name="Test Printer")
|
|
|
|
mock_client = MagicMock()
|
|
mock_client.set_print_speed.return_value = True
|
|
|
|
with patch("backend.app.api.routes.printers.printer_manager") as mock_pm:
|
|
mock_pm.get_client.return_value = mock_client
|
|
|
|
response = await async_client.post(f"/api/v1/printers/{printer.id}/print-speed?mode={mode}")
|
|
|
|
assert response.status_code == 200
|
|
result = response.json()
|
|
assert result["success"] is True
|
|
assert expected_name in result["message"]
|
|
mock_client.set_print_speed.assert_called_once_with(mode)
|