From 19620d6808113747f815ef89cd9542c603ac320e Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Sun, 29 Nov 2020 14:00:29 +0100 Subject: [PATCH] Fix: cleanup repository from list (#2310) * Fix: cleanup repository from list * Add repr * Avoid not exists error message --- .../resolution/fixups/store_execute_remove.py | 2 ++ supervisor/store/repository.py | 10 ++++++++++ .../fixup/test_store_execute_remove.py | 4 ++++ tests/store/test_custom_repository.py | 19 +++++++++++++++++-- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/supervisor/resolution/fixups/store_execute_remove.py b/supervisor/resolution/fixups/store_execute_remove.py index 4e7ef7f98..2dcf3524b 100644 --- a/supervisor/resolution/fixups/store_execute_remove.py +++ b/supervisor/resolution/fixups/store_execute_remove.py @@ -27,6 +27,8 @@ class FixupStoreExecuteRemove(FixupBase): await repository.remove() except StoreError: raise ResolutionFixupError() from None + else: + self.sys_store.repositories.pop(repository.slug, None) self.sys_config.drop_addon_repository(repository.source) self.sys_config.save_data() diff --git a/supervisor/store/repository.py b/supervisor/store/repository.py index 59f6df341..5269c05f1 100644 --- a/supervisor/store/repository.py +++ b/supervisor/store/repository.py @@ -40,6 +40,10 @@ class Repository(CoreSysAttributes): self._slug = get_hash_from_repository(repository) self._type = StoreType.GIT + def __repr__(self) -> str: + """Return internal representation.""" + return f"" + @property def slug(self) -> str: """Return repo slug.""" @@ -75,11 +79,17 @@ class Repository(CoreSysAttributes): if self.type != StoreType.GIT: return True + # If exists? repository_file = Path(self.git.path, "repository.json") + if not repository_file.exists(): + return False + + # If valid? try: SCHEMA_REPOSITORY_CONFIG(read_json_file(repository_file)) except (JsonFileError, vol.Invalid): return False + return True async def load(self) -> None: diff --git a/tests/resolution/fixup/test_store_execute_remove.py b/tests/resolution/fixup/test_store_execute_remove.py index 75de4c5dc..4139f4c3b 100644 --- a/tests/resolution/fixup/test_store_execute_remove.py +++ b/tests/resolution/fixup/test_store_execute_remove.py @@ -22,6 +22,8 @@ async def test_fixup(coresys: CoreSys): ) mock_repositorie = AsyncMock() + mock_repositorie.slug = "test" + coresys.store.repositories["test"] = mock_repositorie await store_execute_remove() @@ -30,3 +32,5 @@ async def test_fixup(coresys: CoreSys): assert coresys.config.save_data.called assert len(coresys.resolution.suggestions) == 0 assert len(coresys.resolution.issues) == 0 + + assert "test" not in coresys.store.repositories diff --git a/tests/store/test_custom_repository.py b/tests/store/test_custom_repository.py index 2ca1ff1e2..32d39b1c5 100644 --- a/tests/store/test_custom_repository.py +++ b/tests/store/test_custom_repository.py @@ -15,7 +15,7 @@ async def test_add_valid_repository(coresys, store_manager): with patch("supervisor.store.repository.Repository.load", return_value=None), patch( "pathlib.Path.read_text", return_value=json.dumps({"name": "Awesome repository"}), - ): + ), patch("pathlib.Path.exists", return_value=True): await store_manager.update_repositories(current + ["http://example.com"]) assert store_manager.get_from_url("http://example.com").validate() assert "http://example.com" in coresys.config.addons_repositories @@ -30,7 +30,7 @@ async def test_add_valid_repository_url(coresys, store_manager): return_value=json.dumps( {"name": "Awesome repository", "url": "http://example2.com/docs"} ), - ): + ), patch("pathlib.Path.exists", return_value=True): await store_manager.update_repositories(current + ["http://example.com"]) assert store_manager.get_from_url("http://example.com").validate() assert "http://example.com" in coresys.config.addons_repositories @@ -51,6 +51,21 @@ async def test_add_invalid_repository(coresys, store_manager): assert coresys.resolution.suggestions[-1].type == SuggestionType.EXECUTE_REMOVE +@pytest.mark.asyncio +async def test_add_invalid_repository_file(coresys, store_manager): + """Test add custom repository.""" + current = coresys.config.addons_repositories + with patch("supervisor.store.repository.Repository.load", return_value=None), patch( + "pathlib.Path.read_text", + return_value=json.dumps({"name": "Awesome repository"}), + ), patch("pathlib.Path.exists", return_value=False): + await store_manager.update_repositories(current + ["http://example.com"]) + assert not store_manager.get_from_url("http://example.com").validate() + + assert "http://example.com" in coresys.config.addons_repositories + assert coresys.resolution.suggestions[-1].type == SuggestionType.EXECUTE_REMOVE + + @pytest.mark.asyncio async def test_preinstall_valid_repository(coresys, store_manager): """Test add core repository valid."""