test_tailscale_api.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. """Integration tests for GET /api/v1/virtual-printers/tailscale-status."""
  2. from unittest.mock import AsyncMock, patch
  3. import pytest
  4. from httpx import AsyncClient
  5. class TestTailscaleStatusAPI:
  6. """Tests for the tailscale-status endpoint."""
  7. @pytest.mark.asyncio
  8. @pytest.mark.integration
  9. async def test_tailscale_status_available(self, async_client: AsyncClient):
  10. """Returns 200 with available=true when Tailscale is connected."""
  11. from backend.app.services.virtual_printer.tailscale import TailscaleStatus
  12. mock_status = TailscaleStatus(
  13. available=True,
  14. hostname="myhost",
  15. tailnet_name="example.ts.net",
  16. fqdn="myhost.example.ts.net",
  17. tailscale_ips=["100.1.2.3"],
  18. )
  19. with patch("backend.app.api.routes.virtual_printers.tailscale_service") as mock_svc:
  20. mock_svc.get_status = AsyncMock(return_value=mock_status)
  21. response = await async_client.get("/api/v1/virtual-printers/tailscale-status")
  22. assert response.status_code == 200
  23. data = response.json()
  24. assert data["available"] is True
  25. assert data["fqdn"] == "myhost.example.ts.net"
  26. assert data["hostname"] == "myhost"
  27. assert data["tailnet_name"] == "example.ts.net"
  28. assert "100.1.2.3" in data["tailscale_ips"]
  29. assert data["error"] is None
  30. @pytest.mark.asyncio
  31. @pytest.mark.integration
  32. async def test_tailscale_status_unavailable(self, async_client: AsyncClient):
  33. """Returns 200 with available=false and error message when Tailscale is absent."""
  34. from backend.app.services.virtual_printer.tailscale import TailscaleStatus
  35. mock_status = TailscaleStatus(
  36. available=False,
  37. hostname="",
  38. tailnet_name="",
  39. fqdn="",
  40. error="tailscale binary not found",
  41. )
  42. with patch("backend.app.api.routes.virtual_printers.tailscale_service") as mock_svc:
  43. mock_svc.get_status = AsyncMock(return_value=mock_status)
  44. response = await async_client.get("/api/v1/virtual-printers/tailscale-status")
  45. assert response.status_code == 200
  46. data = response.json()
  47. assert data["available"] is False
  48. assert data["fqdn"] == ""
  49. assert data["error"] == "tailscale binary not found"