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"