from requests import Response, Request, Session
from unittest.mock import patch
import pytest
import os
import hashlib
from pathlib import Path
from urllib.parse import urljoin, urlparse
from openml.enums import APIVersion
from openml.exceptions import OpenMLAuthenticationError
from openml._api import HTTPClient, HTTPCache
import openml
@pytest.fixture
def cache(http_client_v1) -> HTTPCache:
return http_client_v1.cache
@pytest.fixture
def http_client(http_client_v1) -> HTTPClient:
return http_client_v1
@pytest.fixture
def sample_path() -> str:
return "task/1"
@pytest.fixture
def sample_url_v1(sample_path, test_server_v1) -> str:
return urljoin(test_server_v1, sample_path)
@pytest.fixture
def sample_download_url_v1(test_server_v1) -> str:
server = test_server_v1.split("api/")[0]
endpoint = "data/v1/download/1/anneal.arff"
url = server + endpoint
return url
def test_cache(cache, sample_url_v1):
params = {"param1": "value1", "param2": "value2"}
# validate key
parsed_url = urlparse(sample_url_v1)
path_parts = parsed_url.path.strip("/").split("/")
params_key = "&".join([f"{k}={v}" for k, v in params.items()])
key = cache.get_key(sample_url_v1, params)
expected_key = os.path.join(
*path_parts,
params_key,
)
assert key == expected_key
# validate path
path = cache._key_to_path(key)
expected_path = Path(openml.config.get_cache_directory()).joinpath(key)
assert path == expected_path
# validate save/load
# mock response
req = Request("GET", sample_url_v1).prepare()
response = Response()
response.status_code = 200
response.url = sample_url_v1
response.reason = "OK"
response._content = b"test"
response.headers = {"Content-Type": "text/xml"}
response.encoding = "utf-8"
response.request = req
response.elapsed = type("Elapsed", (), {"total_seconds": lambda x: 0.1})()
cache.save(key, response)
cached = cache.load(key)
assert cached.status_code == 200
assert cached.url == sample_url_v1
assert cached.content == b"test"
assert cached.headers["Content-Type"] == "text/xml"
@pytest.mark.test_server()
def test_get(http_client):
response = http_client.get("task/1")
assert response.status_code == 200
assert b"