Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 36 additions & 9 deletions tests/test_setups/test_setup_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import pandas as pd
import pytest
import requests
import sklearn.base
import sklearn.naive_bayes
import sklearn.tree
Expand Down Expand Up @@ -147,12 +148,23 @@ def test_setup_list_filter_flow(self):
for setup_id in setups:
assert setups[setup_id].flow_id == flow_id

@pytest.mark.test_server()
def test_list_setups_empty(self):
setups = openml.setups.list_setups(setup=[0])
def _mock_get(_url, **_kwargs):
response = requests.Response()
response.status_code = 412
response.headers["Content-Encoding"] = "gzip"
response._content = (
'<oml:error xmlns:oml="http://openml.org/openml">'
"<oml:code>674</oml:code>"
"<oml:message>No results</oml:message>"
"</oml:error>"
).encode()
return response

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can use from openml.testing import create_request_response function to get this mock response instead of implementing it again.
You can save this .xml content to tests/files/mock_responses and load it from there instead of writing the content here.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could use it but needs a new XML file in tests/files/mock_responses/
test_setuplist_offset generates setup IDs dynamically in a loop so create_request_response (which reads from a file) doesn't apply here. For test_list_setups_empty the content is static happy to add an XML file if preferred but wanted to keep the PR minimal. Let me know!

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ohh, i didn't know the first one is dynamic. However, I think you can create XML for 2nd one.

with unittest.mock.patch.object(requests.Session, "get", side_effect=_mock_get):
setups = openml.setups.list_setups(setup=[0])
if len(setups) > 0:
raise ValueError("UnitTest Outdated, got somehow results")

assert isinstance(setups, dict)

@pytest.mark.production_server()
Expand All @@ -168,19 +180,34 @@ def test_list_setups_output_format(self):
assert isinstance(setups, pd.DataFrame)
assert len(setups) == 10

@pytest.mark.test_server()
def test_setuplist_offset(self):
size = 10
setups = openml.setups.list_setups(offset=0, size=size)
assert len(setups) == size
setups2 = openml.setups.list_setups(offset=size, size=size)
assert len(setups2) == size

def _mock_get(url, **_kwargs):
start_id = 11 if "offset/10" in url else 1
items = "".join(
f"<oml:setup><oml:setup_id>{i}</oml:setup_id>"
f"<oml:flow_id>1</oml:flow_id></oml:setup>"
for i in range(start_id, start_id + size)
)
response = requests.Response()
response.status_code = 200
response.headers["Content-Encoding"] = "gzip"
response._content = (
f'<oml:setups xmlns:oml="http://openml.org/openml">{items}</oml:setups>'
).encode()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above,

return response

with unittest.mock.patch.object(requests.Session, "get", side_effect=_mock_get):
setups = openml.setups.list_setups(offset=0, size=size)
assert len(setups) == size
setups2 = openml.setups.list_setups(offset=size, size=size)
assert len(setups2) == size

all = set(setups.keys()).union(setups2.keys())

assert len(all) == size * 2

@pytest.mark.test_server()
def test_get_cached_setup(self):
openml.config.set_root_cache_directory(self.static_cache_dir)
openml.setups.functions._get_cached_setup(1)
Expand Down