Source code for ewoksmx.tests.tasks.test_icat_task

import logging
from contextlib import contextmanager
from typing import Optional
from unittest import mock

import requests

from ewoksmx.tasks.base_tasks.icat_task import IcatCallbackTask


[docs] def test_icat_callback_task(caplog): payload = {"dummy": None} task = _Dummy({"callback_url": None, "payload": payload}) with _mock_requests_get([{"jobId": 999}]): with _mock_requests_put() as mock_put: with caplog.at_level(logging.INFO): task.execute() assert ( f"Skip notification to ICAT (no callback URL): {payload}" in caplog.text ) mock_put.assert_not_called() assert task.get_output_values() == {"icat_jobs": []}
[docs] def test_icat_callback_task_with_url(caplog): payload = {"dummy": None} task = _Dummy(inputs={"callback_url": "http://[MASKED]", "payload": payload}) with _mock_requests_get([{"jobId": 999}]): with _mock_requests_put() as mock_put: with caplog.at_level(logging.INFO): task.execute() mock_put.assert_called_once_with("http://[MASKED]", json=payload) assert f"Send notification to ICAT: {payload}" in caplog.text assert task.get_output_values() == {"icat_jobs": [{"jobId": 999}]}
@contextmanager def _mock_requests_put(): with mock.patch.object(requests, "put", autospec=True) as mock_put: yield mock_put @contextmanager def _mock_requests_get(json_response): """Context manager to mock requests.put with a given JSON response and status code.""" with mock.patch.object(requests, "get", autospec=True) as mock_get: # Define the mock response mock_response = mock.Mock() mock_response.json.return_value = json_response mock_response.status_code = 200 mock_get.return_value = mock_response yield class _Dummy( IcatCallbackTask, input_names=["callback_url", "payload"], output_names=["icat_jobs"], ): def run(self): self.notify_icat(self.inputs.payload) self.outputs.icat_jobs = self.get_icat_jobs() @property def _icat_callback_url(self) -> Optional[str]: return self.inputs.callback_url