|
|
@@ -3913,6 +3913,36 @@ class TestSetFanSpeedAPI:
|
|
|
_called_fan_id, called_pwm = mock_client.set_fan_speed.call_args.args
|
|
|
assert called_pwm == expected_pwm
|
|
|
|
|
|
+ @pytest.mark.asyncio
|
|
|
+ @pytest.mark.integration
|
|
|
+ @pytest.mark.parametrize(
|
|
|
+ "model,expected_label",
|
|
|
+ [
|
|
|
+ ("P2S", "Exhaust fan"),
|
|
|
+ ("X2D", "Exhaust fan"),
|
|
|
+ ("X1C", "Chamber fan"),
|
|
|
+ ("P1S", "Chamber fan"),
|
|
|
+ ("H2D", "Chamber fan"),
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ async def test_chamber_fan_message_matches_model_label(
|
|
|
+ self, async_client: AsyncClient, printer_factory, model, expected_label
|
|
|
+ ):
|
|
|
+ """The success toast must use the same name as the printer card badge.
|
|
|
+
|
|
|
+ On P2S/X2D the big_fan2 fan is labelled "Exhaust"; everywhere else it
|
|
|
+ stays "Chamber". A mismatch means the user clicks "Exhaust" and gets
|
|
|
+ told "Chamber fan set to N%".
|
|
|
+ """
|
|
|
+ printer = await printer_factory(name="P", model=model)
|
|
|
+ mock_client = MagicMock()
|
|
|
+ mock_client.set_fan_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}/fan-speed?fan=chamber&speed=50")
|
|
|
+ assert response.status_code == 200
|
|
|
+ assert response.json()["message"] == f"{expected_label} set to 50%"
|
|
|
+
|
|
|
@pytest.mark.asyncio
|
|
|
@pytest.mark.integration
|
|
|
async def test_speed_out_of_range_rejected(self, async_client: AsyncClient, printer_factory):
|