test_versions_manager.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. from unittest.mock import Mock, PropertyMock
  2. import pytest
  3. from metadata_manager import (
  4. DEFAULT_WHITELISTED_FORK_REMOTES,
  5. ForkRemoteSpec,
  6. ManifestJSON,
  7. ManifestJsonVersionsProvider,
  8. RemoteInfo,
  9. VehiclesManager,
  10. VersionInfo,
  11. VersionsManager,
  12. )
  13. @pytest.fixture
  14. def vehicles_manager():
  15. existing = VehiclesManager.get_singleton()
  16. if existing is not None:
  17. return existing
  18. return VehiclesManager()
  19. @pytest.fixture
  20. def versions_manager(vehicles_manager, tmp_path):
  21. VersionsManager._VersionsManager__singleton = None
  22. repo = Mock()
  23. manager = VersionsManager(
  24. ap_repo=repo,
  25. remotes_json_path=str(tmp_path / "missing-remotes.json"),
  26. providers=[],
  27. )
  28. yield manager
  29. VersionsManager._VersionsManager__singleton = None
  30. class TestManifestJsonVersionsProvider:
  31. def test_is_available_when_manifest_is_available(self, vehicles_manager):
  32. manifest_json = Mock(spec=ManifestJSON)
  33. type(manifest_json).is_available = PropertyMock(return_value=True)
  34. provider = ManifestJsonVersionsProvider(manifest_json)
  35. assert provider.is_available is True
  36. def test_is_unavailable_when_manifest_is_unavailable(self, vehicles_manager):
  37. manifest_json = Mock(spec=ManifestJSON)
  38. type(manifest_json).is_available = PropertyMock(return_value=False)
  39. provider = ManifestJsonVersionsProvider(manifest_json)
  40. assert provider.is_available is False
  41. assert provider.get_versions("copter") == []
  42. assert provider.get_remotes() == []
  43. def test_refresh_delegates_to_manifest_json(self, vehicles_manager):
  44. manifest_json = Mock(spec=ManifestJSON)
  45. provider = ManifestJsonVersionsProvider(manifest_json)
  46. provider.refresh()
  47. manifest_json.refresh.assert_called_once()
  48. class TestVersionsManagerDedup:
  49. def _make_version(self, release_type: str, version_number: str, commit_ref: str):
  50. remote = RemoteInfo("ardupilot", "https://github.com/ardupilot/ardupilot.git")
  51. return VersionInfo(
  52. remote_info=remote,
  53. commit_ref=commit_ref,
  54. release_type=release_type,
  55. version_number=version_number,
  56. )
  57. def test_stable_wins_when_beta_is_seen_first(self, versions_manager):
  58. commit = "03c12698df56c600f5b3d39f8b17d414ea6d2a48"
  59. beta = self._make_version("beta", "4.5.0", commit)
  60. stable = self._make_version("stable", "4.5.0", commit)
  61. beta_provider = Mock()
  62. beta_provider.get_versions.return_value = [beta]
  63. stable_provider = Mock()
  64. stable_provider.get_versions.return_value = [stable]
  65. versions_manager._providers = [beta_provider, stable_provider]
  66. versions = versions_manager.get_versions_for_vehicle("sub")
  67. assert len(versions) == 1
  68. assert versions[0].release_type == "stable"
  69. assert versions[0].version_number == "4.5.0"
  70. def test_stable_wins_when_stable_is_seen_first(self, versions_manager):
  71. commit = "03c12698df56c600f5b3d39f8b17d414ea6d2a48"
  72. beta = self._make_version("beta", "4.5.0", commit)
  73. stable = self._make_version("stable", "4.5.0", commit)
  74. stable_provider = Mock()
  75. stable_provider.get_versions.return_value = [stable]
  76. beta_provider = Mock()
  77. beta_provider.get_versions.return_value = [beta]
  78. versions_manager._providers = [stable_provider, beta_provider]
  79. versions = versions_manager.get_versions_for_vehicle("sub")
  80. assert len(versions) == 1
  81. assert versions[0].release_type == "stable"
  82. def test_stable_wins_over_beta_with_same_number_different_commits(
  83. self, versions_manager
  84. ):
  85. beta = self._make_version("beta", "4.7.0", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
  86. stable = self._make_version(
  87. "stable", "4.7.0", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
  88. )
  89. provider = Mock()
  90. provider.get_versions.return_value = [beta, stable]
  91. versions_manager._providers = [provider]
  92. versions = versions_manager.get_versions_for_vehicle("sub")
  93. assert len(versions) == 1
  94. assert versions[0].release_type == "stable"
  95. assert versions[0].version_number == "4.7.0"
  96. assert versions[0].commit_ref == stable.commit_ref
  97. def test_different_version_numbers_are_kept(self, versions_manager):
  98. stable = self._make_version(
  99. "stable", "4.6.0", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
  100. )
  101. beta = self._make_version(
  102. "beta", "4.7.0", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
  103. )
  104. provider = Mock()
  105. provider.get_versions.return_value = [stable, beta]
  106. versions_manager._providers = [provider]
  107. versions = versions_manager.get_versions_for_vehicle("sub")
  108. assert {v.version_number for v in versions} == {"4.6.0", "4.7.0"}
  109. def test_na_version_numbers_are_not_collapsed(self, versions_manager):
  110. latest_a = self._make_version(
  111. "latest", "NA", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
  112. )
  113. latest_b = self._make_version(
  114. "latest", "NA", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
  115. )
  116. provider = Mock()
  117. provider.get_versions.return_value = [latest_a, latest_b]
  118. versions_manager._providers = [provider]
  119. versions = versions_manager.get_versions_for_vehicle("sub")
  120. assert len(versions) == 2
  121. class TestForkRemoteSpec:
  122. def test_default_rmackay9_uses_custom_repo_name(self):
  123. rmackay9 = next(
  124. spec for spec in DEFAULT_WHITELISTED_FORK_REMOTES if spec.owner == "rmackay9"
  125. )
  126. assert rmackay9.repo == "rmackay9-ardupilot"
  127. assert rmackay9.github_repo == "rmackay9/rmackay9-ardupilot"
  128. assert rmackay9.url == "https://github.com/rmackay9/rmackay9-ardupilot.git"
  129. def test_fork_remote_spec_url(self):
  130. spec = ForkRemoteSpec(owner="example", repo="my-ardupilot-fork")
  131. assert spec.github_repo == "example/my-ardupilot-fork"
  132. assert spec.url == "https://github.com/example/my-ardupilot-fork.git"