Skip to content
Snippets Groups Projects
Commit 4189f49e authored by Nathan Hertz's avatar Nathan Hertz Committed by Nathan Hertz
Browse files

Changed `create_capability_request` view to use

`CapabilityService.create_request` instead of duplicating that logic
within the view; changed tests and mocks to go along with the changes
parent 60be6676
No related branches found
No related tags found
1 merge request!93Fix create capability request parameters
Pipeline #611 passed
This commit is part of merge request !93. Comments created here will be created in the context of that merge request.
...@@ -4,12 +4,7 @@ ...@@ -4,12 +4,7 @@
File containing definitions for the other half of the capability side of the Workspaces REST API, File containing definitions for the other half of the capability side of the Workspaces REST API,
concerning capability requests concerning capability requests
""" """
from pyramid.httpexceptions import ( from pyramid.httpexceptions import HTTPBadRequest, HTTPNotFound, HTTPPreconditionFailed
HTTPBadRequest,
HTTPExpectationFailed,
HTTPNotFound,
HTTPPreconditionFailed,
)
from pyramid.request import Request from pyramid.request import Request
from pyramid.response import Response from pyramid.response import Response
from pyramid.view import view_config from pyramid.view import view_config
...@@ -52,9 +47,7 @@ def create_capability_request(request: Request) -> Response: ...@@ -52,9 +47,7 @@ def create_capability_request(request: Request) -> Response:
or 412 response (HTTPPreconditionFailed) if capability with given name does not exist and thus cannot be or 412 response (HTTPPreconditionFailed) if capability with given name does not exist and thus cannot be
requested requested
""" """
expected_params = ["parameters", "versions"] expected_params = ["parameters"]
# TODO: What is the versions parameter going to look like?
# We can error check for a well-formatted param once we decide
capability_name = request.matchdict["capability_name"] capability_name = request.matchdict["capability_name"]
params = request.json_body params = request.json_body
...@@ -71,13 +64,10 @@ def create_capability_request(request: Request) -> Response: ...@@ -71,13 +64,10 @@ def create_capability_request(request: Request) -> Response:
) )
return HTTPPreconditionFailed(detail=does_not_exist_msg) return HTTPPreconditionFailed(detail=does_not_exist_msg)
else: else:
new_capability_request = CapabilityRequest( # TODO: Implement future products
parameters=params["parameters"], new_capability_request = request.capabilities.create_request(
versions=params["versions"], capability_name, parameters=params["parameters"], products=None
capability_name=capability_name,
state="Created",
) )
request.capability_info.save_entity(new_capability_request)
return Response(json_body=new_capability_request.__json__()) return Response(json_body=new_capability_request.__json__())
......
from typing import Any from typing import Any, List
from unittest.mock import MagicMock from unittest.mock import MagicMock
import pytest import pytest
from pyramid.config import Configurator from pyramid.config import Configurator
from pyramid.testing import DummyRequest, setUp, tearDown from pyramid.testing import DummyRequest, setUp, tearDown
from workspaces.capability.schema import Capability, CapabilityRequest from workspaces.capability.enums import CapabilityRequestState
from workspaces.capability.helpers import Parameter
from workspaces.capability.schema import (
Capability,
CapabilityRequest,
CapabilityVersion,
)
from workspaces.capability.schema_interfaces import CapabilityRequestIF
from workspaces.products.schema import FutureProduct
@pytest.fixture(scope="module") @pytest.fixture(scope="module")
...@@ -26,6 +34,98 @@ def test_config() -> Configurator: ...@@ -26,6 +34,98 @@ def test_config() -> Configurator:
tearDown() tearDown()
class MockCapabilityInfo(MagicMock):
capabilities = [
Capability(
name="null",
steps="test",
max_jobs=2,
),
Capability(
name="error",
steps="error",
max_jobs=-1,
),
]
capability_requests = [
CapabilityRequest(
id=0,
state="Created",
capability_name="null",
parameters="-g",
versions=[],
)
]
def edit_capability(
self, name: str, steps: str = None, max_jobs: int = None, enabled: bool = None
) -> bool:
if name == "error":
# This is here to mimic the case where an update fails to happen
return False
for capability in self.capabilities:
if name == capability.name:
if steps:
capability.steps = steps
if max_jobs:
capability.max_jobs = max_jobs
if enabled:
capability.enabled = enabled
return True
return False
def lookup_capability(self, capability_name: str) -> Capability:
for capability in self.capabilities:
if capability_name == capability.name:
return capability
return None
def lookup_capability_request(self, request_id: int) -> CapabilityRequest:
for capability_request in self.capability_requests:
if request_id == capability_request.id:
return capability_request
return None
def save_entity(self, entity: Any):
if type(entity) is Capability:
self.capabilities.append(entity)
elif type(entity) is CapabilityRequest:
entity.id = len(self.capability_requests)
self.capability_requests.append(entity)
class MockCapabilityService(MagicMock):
def __init__(self, capability_info: MockCapabilityInfo):
super().__init__()
self.capability_info = capability_info
def create_request(
self,
capability_name: str,
parameters: List[Parameter] = None,
products: List[FutureProduct] = None,
) -> CapabilityRequestIF:
"""
Mocked version of the corresponding `CapabilityService.create_request` method
:param capability_name: Name of capability
:param parameters: Parameters for request
:param products: Product that the request will give back
:return: Newly created request
"""
capability = self.capability_info.lookup_capability(capability_name)
request = CapabilityRequest(
state=CapabilityRequestState.Ready.name,
capability=capability,
capability_name=capability_name,
parameters=str(parameters),
# a trick here is to ensure that we always have a first version, with the original parameters
versions=[CapabilityVersion(version_number=1, parameters=str(parameters))],
)
self.capability_info.save_entity(request)
return request
@pytest.fixture(scope="module") @pytest.fixture(scope="module")
def request_null_capability() -> DummyRequest: def request_null_capability() -> DummyRequest:
""" """
...@@ -34,64 +134,9 @@ def request_null_capability() -> DummyRequest: ...@@ -34,64 +134,9 @@ def request_null_capability() -> DummyRequest:
:return: DummyRequest with configured mock CapabilityInfo :return: DummyRequest with configured mock CapabilityInfo
""" """
class MockCapabilityInfo(MagicMock): mock_capability_info = MockCapabilityInfo()
capabilities = [ request = DummyRequest(
Capability( capability_info=mock_capability_info,
name="null", capabilities=MockCapabilityService(mock_capability_info),
steps="test", )
max_jobs=2,
),
Capability(
name="error",
steps="error",
max_jobs=-1,
),
]
capability_requests = [
CapabilityRequest(
id=0,
state="Created",
capability_name="null",
parameters="-g",
versions=[],
)
]
def edit_capability(
self, name: str, steps: str = None, max_jobs: int = None, enabled: bool = None
) -> bool:
if name == "error":
# This is here to mimic the case where an update fails to happen
return False
for capability in self.capabilities:
if name == capability.name:
if steps:
capability.steps = steps
if max_jobs:
capability.max_jobs = max_jobs
if enabled:
capability.enabled = enabled
return True
return False
def lookup_capability(self, capability_name: str) -> Capability:
for capability in self.capabilities:
if capability_name == capability.name:
return capability
return None
def lookup_capability_request(self, request_id: int) -> CapabilityRequest:
for capability_request in self.capability_requests:
if request_id == capability_request.id:
return capability_request
return None
def save_entity(self, entity: Any):
if type(entity) is Capability:
self.capabilities.append(entity)
elif type(entity) is CapabilityRequest:
entity.id = len(self.capability_requests)
self.capability_requests.append(entity)
request = DummyRequest(capability_info=MockCapabilityInfo())
return request return request
...@@ -72,9 +72,7 @@ def test_create_capability_request( ...@@ -72,9 +72,7 @@ def test_create_capability_request(
response = create_capability_request(request_null_capability) response = create_capability_request(request_null_capability)
assert response.status_code == 200 assert response.status_code == 200
expected_response = ( expected_response = '{"id": 1, "capability_name": "null", "state": "Ready", "parameters": "-g"}'
'{"id": 1, "capability_name": "null", "state": "Created", "parameters": "-g"}'
)
assert response.json_body == expected_response assert response.json_body == expected_response
# Assert test capability has been added to list of capabilities (mocked) # Assert test capability has been added to list of capabilities (mocked)
assert request_null_capability.capability_info.lookup_capability_request(1) assert request_null_capability.capability_info.lookup_capability_request(1)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment