test_firmware_server.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import json
  2. from pathlib import Path
  3. from unittest.mock import Mock, patch
  4. from metadata_manager import ManifestClient, ManifestIndex
  5. from metadata_manager.firmware_server.client import _CacheMeta
  6. FIXTURES_DIR = Path(__file__).parent / "fixtures"
  7. SAMPLE_MANIFEST = json.loads((FIXTURES_DIR / "manifest_sample.json").read_text())
  8. class TestManifestIndex:
  9. def test_builds_releases_for_copter_heli_and_tracker(self):
  10. index = ManifestIndex.build(SAMPLE_MANIFEST)
  11. copter = index.get_releases("copter")
  12. stable = [r for r in copter if r.release_type == "stable" and r.version_number == "4.6.3"]
  13. assert len(stable) == 1
  14. assert stable[0].commit_reference.startswith("aaaa")
  15. heli = index.get_releases("heli")
  16. heli_stable = [r for r in heli if r.release_type == "stable" and r.version_number == "4.6.3"]
  17. assert len(heli_stable) == 1
  18. assert heli_stable[0].commit_reference.startswith("bbbb")
  19. tracker = index.get_releases("tracker")
  20. assert any(r.version_number == "4.6.3" for r in tracker)
  21. latest = [r for r in copter if r.release_type == "latest"]
  22. assert len(latest) == 1
  23. assert latest[0].commit_reference.startswith("eeee")
  24. assert latest[0].version_number == "NA"
  25. assert latest[0].ap_build_artifacts_url == (
  26. "https://firmware.ardupilot.org/Copter/latest"
  27. )
  28. class TestManifestClientCache:
  29. def test_uses_cache_on_304(self, tmp_path):
  30. client = ManifestClient(
  31. url="https://example.com/manifest.json",
  32. cache_dir=str(tmp_path),
  33. )
  34. client._write_cache(
  35. b'{"format-version":"1.0.0","firmware":[]}',
  36. _CacheMeta(etag='"abc"', last_modified="Mon, 01 Jan 2024 00:00:00 GMT"),
  37. )
  38. response = Mock(status_code=304, headers={}, content=b"")
  39. with patch("metadata_manager.firmware_server.client.requests.get", return_value=response):
  40. raw = client.fetch_raw()
  41. assert raw == b'{"format-version":"1.0.0","firmware":[]}'