docs/conftest.py
"""Special doctest Pytest configuration. Other configuration in tests/conftest.py"""
from datetime import datetime
from typing import Any, Dict
from unittest.mock import Mock, create_autospec
import pytest
import requests
from requests import Session
from sybil import Sybil
from sybil.parsers.myst import PythonCodeBlockParser
from dicomtrolley.auth import VitreaAuth
from dicomtrolley.core import (
Downloader,
Instance,
InstanceReference,
Query,
QueryLevels,
Searcher,
SeriesReference,
StudyReference,
)
from dicomtrolley.dicom_qr import DICOMQR
from dicomtrolley.mint import Mint, MintQuery
from dicomtrolley.qido_rs import QidoRS
from dicomtrolley.rad69 import Rad69
from dicomtrolley.trolley import Trolley
from dicomtrolley.wado_rs import WadoRS
from dicomtrolley.wado_uri import WadoURI
from tests.conftest import set_mock_response
from tests.factories import quick_dataset
from tests.mock_responses import LOGIN_SUCCESS
from tests.mock_servers import (
MINT_SEARCH_INSTANCE_LEVEL_ANY,
WADO_URI_RESPONSE_DICOM_ANY,
)
@pytest.fixture
def mock_requests(requests_mock):
"""Requests_mock fixture replaces requests with mock. Returns this mock
Still needs original import to work apparently
"""
set_mock_response(requests_mock, MINT_SEARCH_INSTANCE_LEVEL_ANY)
set_mock_response(requests_mock, WADO_URI_RESPONSE_DICOM_ANY)
set_mock_response(requests_mock, LOGIN_SUCCESS)
return requests_mock
@pytest.fixture
def trolley(a_trolley):
"""Used when 'trolley' is called in docs examples"""
# Avoid 'could not find x' exceptions for trolley.download(x)
a_trolley.download = create_autospec(a_trolley.download)
return a_trolley
@pytest.fixture
def an_instance():
an_instance = Mock(spec=Instance)
an_instance.data = quick_dataset(Rows=100)
return an_instance
def setup_namespace(namespace: Dict[str, Any]):
"""All imports done before each of the examples in docs"""
to_add = {
"requests": requests,
"Trolley": Trolley,
"Mint": Mint,
"WadoURI": WadoURI,
"WadoRS": WadoRS,
"Rad69": Rad69,
"QidoRS": QidoRS,
"Query": Query,
"DICOMQR": DICOMQR,
"QueryLevels": QueryLevels,
"datetime": datetime,
"MintQuery": MintQuery,
"a_session": Mock(spec=Session),
"a_searcher": Mock(spec=Searcher),
"a_downloader": Mock(spec=Downloader),
"StudyReference": StudyReference,
"SeriesReference": SeriesReference,
"InstanceReference": InstanceReference,
}
to_add_authentication = {"VitreaAuth": VitreaAuth} # for authentication.md
namespace.update(to_add)
namespace.update(to_add_authentication)
pytest_collect_file = Sybil(
parsers=[PythonCodeBlockParser()],
pattern="*.md",
fixtures=["mock_requests", "no_storage", "trolley", "an_instance"],
setup=setup_namespace,
).pytest()