diff --git a/lib/tool_shed/test/base/populators.py b/lib/tool_shed/test/base/populators.py index aa3e6ec6ec9..536e194b44e 100644 --- a/lib/tool_shed/test/base/populators.py +++ b/lib/tool_shed/test/base/populators.py @@ -10,9 +10,12 @@ from galaxy_test.base import api_asserts from galaxy_test.base.api_util import random_name from tool_shed_client.schema import ( Category, + GetOrderedInstallableRevisionsRequest, OrderedInstallableRevisions, Repository, RepositoryUpdate, + ResetMetadataOnRepositoryRequest, + ResetMetadataOnRepositoryResponse, ) from .api_util import ShedApiInteractor @@ -101,14 +104,20 @@ class ToolShedPopulator: return Category(**response.json()) def get_ordered_installable_revisions(self, owner: str, name: str) -> OrderedInstallableRevisions: - params = { - "owner": owner, - "name": name, - } - revisions_response = self._api_interactor.get("repositories/get_ordered_installable_revisions", params=params) + request = GetOrderedInstallableRevisionsRequest(owner=owner, name=name) + revisions_response = self._api_interactor.get( + "repositories/get_ordered_installable_revisions", params=request.dict() + ) api_asserts.assert_status_code_is_ok(revisions_response) return OrderedInstallableRevisions(__root__=revisions_response.json()) + def reset_metadata(self, repository: HasRepositoryId) -> ResetMetadataOnRepositoryResponse: + repository_id = self._repository_id(repository) + request = ResetMetadataOnRepositoryRequest(repository_id=repository_id) + reset_response = self._api_interactor.post("repositories/reset_metadata_on_repository", json=request.dict()) + reset_response.raise_for_status() + return ResetMetadataOnRepositoryResponse(**reset_response.json()) + def _repository_id(self, has_id: HasRepositoryId) -> str: if isinstance(has_id, Repository): return has_id.id diff --git a/lib/tool_shed/test/functional/test_galaxy_install.py b/lib/tool_shed/test/functional/test_galaxy_install.py index 975df201b68..db42a6002c6 100644 --- a/lib/tool_shed/test/functional/test_galaxy_install.py +++ b/lib/tool_shed/test/functional/test_galaxy_install.py @@ -15,3 +15,19 @@ class ShedGalaxyInstallApiTestCase(ShedApiTestCase): expected_tool = f"{self.host}:{self.port}/repos/{owner}/{name}/Add_a_column1/1.1.0" tool_ids = [t["id"] for t in response.json()] assert expected_tool in tool_ids, f"Didn't find {expected_tool} in {tool_ids}" + + def test_install_simple_after_repository_metadata_reset(self): + populator = self.populator + repository = populator.setup_column_maker_repo(prefix="repoformetadata") + owner = repository.owner + name = repository.name + installable_revisions = populator.get_ordered_installable_revisions(owner, name) + latest_install_revision = installable_revisions.__root__[-1] + metadata_response = populator.reset_metadata(repository) + assert metadata_response.status == "ok" + self.install_repository(owner, name, latest_install_revision, tool_shed_url=self.url) + response = self.galaxy_interactor._get("tools?in_panel=False") + response.raise_for_status() + expected_tool = f"{self.host}:{self.port}/repos/{owner}/{name}/Add_a_column1/1.1.0" + tool_ids = [t["id"] for t in response.json()] + assert expected_tool in tool_ids, f"Didn't find {expected_tool} in {tool_ids}" diff --git a/lib/tool_shed/test/functional/test_shed_repositories.py b/lib/tool_shed/test/functional/test_shed_repositories.py index 390f575c40b..67ce93679b3 100644 --- a/lib/tool_shed/test/functional/test_shed_repositories.py +++ b/lib/tool_shed/test/functional/test_shed_repositories.py @@ -76,3 +76,18 @@ class ShedRepositoriesApiTestCase(ShedApiTestCase): assert repository.name revisions = populator.get_ordered_installable_revisions(repository.owner, repository.name) assert len(revisions.__root__) == 1 + + def test_reset_on_repository(self): + populator = self.populator + repository = populator.setup_column_maker_repo(prefix="repoforreseta") + assert repository.owner + assert repository.name + revisions = populator.get_ordered_installable_revisions(repository.owner, repository.name) + assert len(revisions.__root__) == 1 + metadata_response = populator.reset_metadata(repository) + assert metadata_response.start_time + assert metadata_response.stop_time + assert metadata_response.status == "ok" + assert len(metadata_response.repository_status) == 1 + revisions = populator.get_ordered_installable_revisions(repository.owner, repository.name) + assert len(revisions.__root__) == 1 diff --git a/lib/tool_shed/webapp/api/repositories.py b/lib/tool_shed/webapp/api/repositories.py index 4f372ef74bd..b2a5e0c4b82 100644 --- a/lib/tool_shed/webapp/api/repositories.py +++ b/lib/tool_shed/webapp/api/repositories.py @@ -659,7 +659,7 @@ class RepositoriesController(BaseAPIController): @web.legacy_expose_api def reset_metadata_on_repository(self, trans, payload, **kwd): """ - PUT /api/repositories/reset_metadata_on_repository + POST /api/repositories/reset_metadata_on_repository Resets all metadata on a specified repository in the Tool Shed. diff --git a/lib/tool_shed_client/schema/__init__.py b/lib/tool_shed_client/schema/__init__.py index 8e14a4f7395..2f9faaab8b7 100644 --- a/lib/tool_shed_client/schema/__init__.py +++ b/lib/tool_shed_client/schema/__init__.py @@ -25,6 +25,11 @@ class FailedRepositoryUpdateMessage(BaseModel): err_msg: str +class GetOrderedInstallableRevisionsRequest(BaseModel): + name: str + owner: str + + class OrderedInstallableRevisions(BaseModel): __root__: List[str] @@ -35,3 +40,14 @@ class RepositoryUpdate(BaseModel): @property def is_ok(self): return isinstance(self.__root__, ValidRepostiroyUpdateMessage) + + +class ResetMetadataOnRepositoryRequest(BaseModel): + repository_id: str + + +class ResetMetadataOnRepositoryResponse(BaseModel): + status: str # TODO: enum... + repository_status: List[str] + start_time: str + stop_time: str