diff --git a/services/capability/test/conftest.py b/services/capability/test/conftest.py index 75a95326158ae4b2b180177a63e4bce375abfd55..bc0dd994fc6269bfd4c845191c3c1d13900bb2e0 100644 --- a/services/capability/test/conftest.py +++ b/services/capability/test/conftest.py @@ -4,6 +4,8 @@ from datetime import datetime from typing import Any, Dict, List, Optional from unittest.mock import MagicMock +# pylint: disable=E0401, R0903 + import pendulum import pytest from pyramid.config import Configurator @@ -25,8 +27,6 @@ from workspaces.capability.schema_interfaces import ( from workspaces.capability.helpers_interfaces import ParameterIF from workspaces.products.schema_interfaces import FutureProductIF -# pylint: disable=E0401, R0903 - @pytest.fixture(scope="module") def test_config() -> Configurator: @@ -51,7 +51,16 @@ class MockCapabilityInfo(MagicMock): capabilities = [ Capability(name="null", steps="test", max_jobs=2, enabled=True, has_image_products=False), - Capability(name="error", steps="error", max_jobs=-1, enabled=True, has_image_products=False), + Capability( + name="error", steps="error", max_jobs=-1, enabled=True, has_image_products=False + ), + Capability( + name="std_restore_imaging", + steps="test", + max_jobs=1, + enabled=True, + has_image_products=True, + ), ] capability_requests = [ CapabilityRequest( @@ -88,11 +97,39 @@ class MockCapabilityInfo(MagicMock): ), ] + carta_capability_version = CapabilityVersion( + capability_request_id=21, + version_number=2, + parameters={ + "product_locator": "uid://evla/execblock/35b23178-0dde-4167-82fd-9bd6128a80a1", + "cal_locator": "uid://evla/calibration/6a940d35-c714-47a2-ac4a-1df6182ee83f", + "user_email": "jgoldste@nrao.edu", + }, + files=[], + workflow_metadata={"carta_url": "https://pr-dsoc-dev.nrao.edu/pKP8pcGvI02M/"}, + ) + capability_requests.append(CapabilityRequest( + id = carta_capability_version.capability_request_id, + state="Complete", + capability_name="std_restore_imaging", + versions=[CapabilityVersion( + capability_request_id=1, version_number=1, parameters='{"arguments": "-g"}' + ), carta_capability_version], + created_at=pendulum.now(), + updated_at=pendulum.now(), + )) + + capability_executions = [] - capability_versions = [] + capability_versions = [carta_capability_version] def edit_capability( - self, name: str, steps: str = None, max_jobs: int = None, enabled: bool = None, has_image_products: bool = None + self, + name: str, + steps: str = None, + max_jobs: int = None, + enabled: bool = None, + has_image_products: bool = None, ) -> bool: """ Change this capability according to params passed in. @@ -144,26 +181,53 @@ class MockCapabilityInfo(MagicMock): return capability_request return None - def lookup_active_capability_requests(self, capability_name: str) -> Optional[Dict[str, List[Dict]]]: + def lookup_capability_version(self, request_id: int, version_number: int) -> CapabilityVersion: + """ + Find the capability version with this request ID and version number. + + :param request_id: the capability request ID + :return: + """ + for capability_request in self.capability_requests: + current_version = capability_request.current_version + if ( + current_version.capability_request_id == request_id + and current_version.version_number == version_number + ): + return current_version + + return None + + def lookup_active_capability_requests( + self, capability_name: str + ) -> Optional[Dict[str, List[Dict]]]: if capability_name not in [capability.name for capability in self.capabilities]: return None active_requests = [] for capability_request in self.capability_requests: - if capability_request.capability_name == capability_name and capability_request.state != "Complete": + if ( + capability_request.capability_name == capability_name + and capability_request.state != "Complete" + ): active_requests.append(capability_request.__json__()) return {"active_requests": active_requests} - def lookup_created_capability_requests(self, capability_name: str) -> Optional[Dict[str, List[Dict]]]: + def lookup_created_capability_requests( + self, capability_name: str + ) -> Optional[Dict[str, List[Dict]]]: if capability_name not in [capability.name for capability in self.capabilities]: return None active_requests = [] for capability_request in self.capability_requests: - if capability_request.capability_name == capability_name and capability_request.state == "Created": + if ( + capability_request.capability_name == capability_name + and capability_request.state == "Created" + ): active_requests.append(capability_request.__json__()) return {"active_requests": active_requests} @@ -257,7 +321,9 @@ class MockCapabilityInfo(MagicMock): request.state = CapabilityRequestState.Created.name self.save_entity(request) - self.copy_previous_version_files(version=version, previous_version_files=current_version_files) + self.copy_previous_version_files( + version=version, previous_version_files=current_version_files + ) return version @@ -290,6 +356,7 @@ class MockCapabilityService(MagicMock): :return: Newly created request """ capability = self.capability_info.lookup_capability(capability_name) + request = CapabilityRequest( state=CapabilityRequestState.Created.name, capability=capability, @@ -302,7 +369,9 @@ class MockCapabilityService(MagicMock): self.capability_info.save_entity(request) return request - def create_new_version(self, capability_request_id: int, parameters: List[Parameter] = None) -> CapabilityVersionIF: + def create_new_version( + self, capability_request_id: int, parameters: List[Parameter] = None + ) -> CapabilityVersionIF: """ Mocked version of the corresponding `CapabilityService.create_new_version` method diff --git a/services/capability/test/test_capability_version_views.py b/services/capability/test/test_capability_version_views.py index 02211dca394228bd01d0183a92f84aa0fa66d7d6..4ffc643ce5926e92f51f7e8e179051a983733242 100644 --- a/services/capability/test/test_capability_version_views.py +++ b/services/capability/test/test_capability_version_views.py @@ -4,12 +4,12 @@ The logic can be found in `capability/views/capability_version.py """ import http -from pyramid.config import Configurator -from pyramid.httpexceptions import HTTPBadRequest, HTTPNotFound, HTTPPreconditionFailed +# pylint: disable=C0415, E0401 + from pyramid.testing import DummyRequest -def test_view_latest_version(test_config: Configurator, request_null_capability: DummyRequest): +def test_view_latest_version(request_null_capability: DummyRequest): from capability.views.capability_version import view_latest_version request_null_capability.matchdict["capability_request_id"] = 1 @@ -29,16 +29,33 @@ def test_view_latest_version(test_config: Configurator, request_null_capability: no_versions_response = view_latest_version(request_null_capability) assert no_versions_response.status_code == http.HTTPStatus.PRECONDITION_FAILED - request_null_capability.matchdict["capability_request_id"] = 5 + request_null_capability.matchdict["capability_request_id"] = 6 no_such_request_response = view_latest_version(request_null_capability) assert no_such_request_response.status_code == http.HTTPStatus.NOT_FOUND + # we -should- find this one + expected_json = { + "type": "CapabilityVersion", + "capability_request_id": 21, + "version_number": 2, + "parameters": { + "product_locator": "uid://evla/execblock/35b23178-0dde-4167-82fd-9bd6128a80a1", + "cal_locator": "uid://evla/calibration/6a940d35-c714-47a2-ac4a-1df6182ee83f", + "user_email": "jgoldste@nrao.edu", + }, + "workflow_metadata": {"carta_url": "https://pr-dsoc-dev.nrao.edu/pKP8pcGvI02M/"}, + "files": [], + } + request_null_capability.matchdict["capability_request_id"] = expected_json["capability_request_id"] + request_null_capability.matchdict["capability_name"] = "std_restore_imaging" + not_found_response = view_latest_version(request_null_capability) + assert not_found_response.status_code == http.HTTPStatus.OK + assert not_found_response.json_body == expected_json -def test_create_capability_version(test_config: Configurator, request_null_capability: DummyRequest): +def test_create_capability_version(request_null_capability: DummyRequest): """ Tests the create capability version view to make sure it properly supports creation of versions - :param test_config: Dummy Pyramid Configurator object set up for testing :param request_null_capability: Dummy Pyramid request object set up with mocked DB access supporting the null capability """