import pytest from requests import Session, Response from unittest.mock import patch from openml._api import FallbackProxy, ResourceAPI, ResourceV1API, ResourceV2API from openml.enums import ResourceType from openml.exceptions import OpenMLNotSupportedError import openml class DummyTaskAPI(ResourceAPI): resource_type: ResourceType = ResourceType.TASK class DummyTaskV1API(ResourceV1API, DummyTaskAPI): pass class DummyTaskV2API(ResourceV2API, DummyTaskAPI): pass @pytest.fixture def dummy_task_v1(http_client_v1, minio_client) -> DummyTaskV1API: return DummyTaskV1API(http=http_client_v1, minio=minio_client) @pytest.fixture def dummy_task_v2(http_client_v2, minio_client) -> DummyTaskV1API: return DummyTaskV2API(http=http_client_v2, minio=minio_client) @pytest.fixture def dummy_task_fallback(dummy_task_v1, dummy_task_v2) -> DummyTaskV1API: return FallbackProxy(dummy_task_v2, dummy_task_v1) def test_v1_publish(dummy_task_v1, test_server_v1, test_apikey_v1): resource = dummy_task_v1 resource_name = resource.resource_type.value resource_files = {"description": "Resource Description File"} resource_id = 123 with patch.object(Session, "request") as mock_request: mock_request.return_value = Response() mock_request.return_value.status_code = 200 mock_request.return_value._content = ( f'\n' f"\t{resource_id}\n" f"\n" ).encode("utf-8") published_resource_id = resource.publish( resource_name, files=resource_files, ) assert resource_id == published_resource_id mock_request.assert_called_once_with( method="POST", url=test_server_v1 + resource_name, params={}, data={"api_key": test_apikey_v1}, headers=openml.config._HEADERS, files=resource_files, ) def test_v1_delete(dummy_task_v1, test_server_v1, test_apikey_v1): resource = dummy_task_v1 resource_name = resource.resource_type.value resource_id = 123 with patch.object(Session, "request") as mock_request: mock_request.return_value = Response() mock_request.return_value.status_code = 200 mock_request.return_value._content = ( f'\n' f" {resource_id}\n" f"\n" ).encode("utf-8") resource.delete(resource_id) mock_request.assert_called_once_with( method="DELETE", url=( test_server_v1 + resource_name + "/" + str(resource_id) ), params={"api_key": test_apikey_v1}, data={}, headers=openml.config._HEADERS, files=None, ) def test_v1_tag(dummy_task_v1, test_server_v1, test_apikey_v1): resource = dummy_task_v1 resource_id = 123 resource_tag = "TAG" with patch.object(Session, "request") as mock_request: mock_request.return_value = Response() mock_request.return_value.status_code = 200 mock_request.return_value._content = ( f'' f"{resource_id}" f"{resource_tag}" f"" ).encode("utf-8") tags = resource.tag(resource_id, resource_tag) assert resource_tag in tags mock_request.assert_called_once_with( method="POST", url=( test_server_v1 + resource.resource_type + "/tag" ), params={}, data={ "api_key": test_apikey_v1, "task_id": resource_id, "tag": resource_tag, }, headers=openml.config._HEADERS, files=None, ) def test_v1_untag(dummy_task_v1, test_server_v1, test_apikey_v1): resource = dummy_task_v1 resource_id = 123 resource_tag = "TAG" with patch.object(Session, "request") as mock_request: mock_request.return_value = Response() mock_request.return_value.status_code = 200 mock_request.return_value._content = ( f'' f"{resource_id}" f"" ).encode("utf-8") tags = resource.untag(resource_id, resource_tag) assert resource_tag not in tags mock_request.assert_called_once_with( method="POST", url=( test_server_v1 + resource.resource_type + "/untag" ), params={}, data={ "api_key": test_apikey_v1, "task_id": resource_id, "tag": resource_tag, }, headers=openml.config._HEADERS, files=None, ) def test_v2_publish(dummy_task_v2): with pytest.raises(OpenMLNotSupportedError): dummy_task_v2.publish(path=None, files=None) def test_v2_delete(dummy_task_v2): with pytest.raises(OpenMLNotSupportedError): dummy_task_v2.delete(resource_id=None) def test_v2_tag(dummy_task_v2): with pytest.raises(OpenMLNotSupportedError): dummy_task_v2.tag(resource_id=None, tag=None) def test_v2_untag(dummy_task_v2): with pytest.raises(OpenMLNotSupportedError): dummy_task_v2.untag(resource_id=None, tag=None) def test_fallback_publish(dummy_task_fallback): with patch.object(ResourceV1API, "publish") as mock_publish: mock_publish.return_value = None dummy_task_fallback.publish(path=None, files=None) mock_publish.assert_called_once_with(path=None, files=None) def test_fallback_delete(dummy_task_fallback): with patch.object(ResourceV1API, "delete") as mock_delete: mock_delete.return_value = None dummy_task_fallback.delete(resource_id=None) mock_delete.assert_called_once_with(resource_id=None) def test_fallback_tag(dummy_task_fallback): with patch.object(ResourceV1API, "tag") as mock_tag: mock_tag.return_value = None dummy_task_fallback.tag(resource_id=None, tag=None) mock_tag.assert_called_once_with(resource_id=None, tag=None) def test_fallback_untag(dummy_task_fallback): with patch.object(ResourceV1API, "untag") as mock_untag: mock_untag.return_value = None dummy_task_fallback.untag(resource_id=None, tag=None) mock_untag.assert_called_once_with(resource_id=None, tag=None)