diff --git a/CHANGELOG.md b/CHANGELOG.md
index ea12e81..2fad243 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ## Unreleased
 ### Added
 - Ability to specify `proxies` for a `Service` definition so all calls to the service use the defined proxies
+- Ability to specify `auth` for a `Service` definition so all calls to the service use the defined authentication
 - Ability to specify `return_raw_response_object` at the endpoint level, overridden by any value specified at call time
 
 ## [5.0.0] - 2019-12-02
diff --git a/setup.cfg b/setup.cfg
index b456e3a..366d9a3 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -44,6 +44,7 @@ lint =
 test =
     pytest==5.2.2
     pytest-cov==2.8.1
+    pytest-randomly==3.4.0
 docs =
     importlib-metadata==0.23
     sphinx==2.2.1
@@ -67,7 +68,7 @@ skip_covered = True
 
 [tool:pytest]
 testpaths = tests
-addopts = -ra -q --strict --cov
+addopts = -ra --strict --cov
 xfail_strict = True
 
 [tox:tox]
@@ -86,5 +87,5 @@ commands =
 [testenv:lint]
 extras = lint
 commands =
-    pyflakes src/apiron tests
-    black --check src/apiron tests
+    pyflakes {posargs:src tests}
+    black {posargs:--check src tests}
diff --git a/src/apiron/client.py b/src/apiron/client.py
index 80f3d60..b72e78f 100644
--- a/src/apiron/client.py
+++ b/src/apiron/client.py
@@ -224,6 +224,8 @@ def call(
 
     method = method or endpoint.default_method
 
+    auth = auth or session.auth or service.auth
+
     request = build_request_object(
         session,
         service,
diff --git a/src/apiron/service/base.py b/src/apiron/service/base.py
index 7847d85..a2fe5a0 100644
--- a/src/apiron/service/base.py
+++ b/src/apiron/service/base.py
@@ -19,6 +19,7 @@ class ServiceMeta(type):
 
 class ServiceBase(metaclass=ServiceMeta):
     required_headers = {}
+    auth = ()
     proxies = {}
 
     @classmethod

How to do HTTPBasicAuth using apiron?
**Describe the bug**
How to do HTTPBasicAuth using apiron?

**To Reproduce**
I use below in requests:

`requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))`

diff --git a/tests/service/test_base.py b/tests/service/test_base.py
index 8ee3a48..8ce47c5 100644
--- a/tests/service/test_base.py
+++ b/tests/service/test_base.py
@@ -3,7 +3,7 @@ import pytest
 from apiron import Endpoint, Service, ServiceBase
 
 
-@pytest.fixture(scope="class")
+@pytest.fixture
 def service():
     class SomeService(Service):
         domain = "http://foo.com"
diff --git a/tests/test_client.py b/tests/test_client.py
index 41e775c..6ab00f0 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -22,249 +22,287 @@ def mock_endpoint():
     return endpoint
 
 
-class TestClient:
-    @mock.patch("requests.sessions.Session", autospec=True)
-    def test_get_adapted_session(self, mock_session):
-        adapter = mock.Mock()
-        adapted_session = client.get_adapted_session(adapter)
-        assert adapter == adapted_session.get_adapter("http://foo.com")
-        assert adapter == adapted_session.get_adapter("https://foo.com")
-
-    def test_get_required_headers(self, mock_endpoint):
-        service = mock.Mock()
-        service.required_headers = {"one": "two"}
-        mock_endpoint.required_headers = {"foo": "bar"}
-        expected_headers = {}
-        expected_headers.update(service.required_headers)
-        expected_headers.update(mock_endpoint.required_headers)
-        assert expected_headers == client.get_required_headers(service, mock_endpoint)
-
-    @mock.patch("apiron.client.requests.Request")
-    @mock.patch("apiron.client.get_required_headers")
-    def test_build_request_object_passes_arguments_to_request_constructor(
-        self, mock_get_required_headers, mock_request_constructor, mock_endpoint
-    ):
-        session = mock.Mock()
-
-        service = mock.Mock()
-        service.get_hosts.return_value = ["http://host1.biz"]
-
-        mock_endpoint.default_method = "POST"
-        mock_endpoint.required_headers = {"header": "value"}
-        mock_endpoint.required_params = set()
-
-        params = {"baz": "qux"}
-        mock_endpoint.get_merged_params.return_value = params
-        data = "I am a data"
-        files = {"file_name": io.BytesIO(b"this is a test")}
-        json = {"raw": "data"}
-        headers = {"Accept": "stuff"}
-        cookies = {"chocolate-chip": "yes"}
-        auth = mock.Mock()
-
-        mock_get_required_headers.return_value = {"header": "value"}
-        expected_headers = {}
-        expected_headers.update(headers)
-        expected_headers.update(mock_endpoint.required_headers)
-
-        with mock.patch.object(session, "prepare_request") as mock_prepare_request:
-            client.build_request_object(
-                session,
-                service,
-                mock_endpoint,
-                params=params,
-                data=data,
-                files=files,
-                json=json,
-                headers=headers,
-                cookies=cookies,
-                auth=auth,
-                foo="bar",
-            )
-
-            mock_request_constructor.assert_called_once_with(
-                url="http://host1.biz/foo/",
-                method=mock_endpoint.default_method,
-                headers=expected_headers,
-                cookies=cookies,
-                params=params,
-                data=data,
-                files=files,
-                json=json,
-                auth=auth,
-            )
-
-            assert 1 == mock_prepare_request.call_count
-
-    @mock.patch("apiron.client.Timeout")
-    @mock.patch("apiron.client.get_adapted_session")
-    @mock.patch("apiron.client.build_request_object")
-    @mock.patch("requests.adapters.HTTPAdapter", autospec=True)
-    @mock.patch("requests.Session", autospec=True)
-    def test_call(
-        self,
-        MockSession,
-        MockAdapter,
-        mock_build_request_object,
-        mock_get_adapted_session,
-        mock_timeout,
-        mock_response,
-        mock_endpoint,
-    ):
-        service = mock.Mock()
-        service.get_hosts.return_value = ["http://host1.biz"]
-
-        mock_endpoint.default_method = "GET"
-        mock_endpoint.streaming = True
-
-        request = mock.Mock()
-        request.url = "http://host1.biz/foo/"
-        mock_build_request_object.return_value = request
-
-        mock_logger = mock.Mock()
-
-        mock_response.status_code = 200
-        mock_response.url = "http://host1.biz/foo/"
-
-        mock_session = MockSession()
-        mock_session.send.return_value = mock_response
-        mock_session.proxies = {}
-        mock_get_adapted_session.return_value = mock_session
-
-        client.call(service, mock_endpoint, timeout_spec=mock_timeout, logger=mock_logger)
-
-        mock_get_adapted_session.assert_called_once_with(MockAdapter())
-        mock_session.send.assert_called_once_with(
-            request,
-            timeout=(mock_timeout.connection_timeout, mock_timeout.read_timeout),
-            stream=mock_endpoint.streaming,
-            allow_redirects=True,
-            proxies=service.proxies,
+@pytest.fixture
+def mock_logger():
+    return mock.Mock()
+
+
+@mock.patch("requests.sessions.Session", autospec=True)
+def test_get_adapted_session(mock_session):
+    adapter = mock.Mock()
+    adapted_session = client.get_adapted_session(adapter)
+    assert adapter == adapted_session.get_adapter("http://foo.com")
+    assert adapter == adapted_session.get_adapter("https://foo.com")
+
+
+def test_get_required_headers(mock_endpoint):
+    service = mock.Mock()
+    service.required_headers = {"one": "two"}
+    mock_endpoint.required_headers = {"foo": "bar"}
+    expected_headers = {}
+    expected_headers.update(service.required_headers)
+    expected_headers.update(mock_endpoint.required_headers)
+    assert expected_headers == client.get_required_headers(service, mock_endpoint)
+
+
+@mock.patch("apiron.client.requests.Request")
+@mock.patch("apiron.client.get_required_headers")
+def test_build_request_object_passes_arguments_to_request_constructor(
+    mock_get_required_headers, mock_request_constructor, mock_endpoint
+):
+    session = mock.Mock()
+
+    service = mock.Mock()
+    service.get_hosts.return_value = ["http://host1.biz"]
+
+    mock_endpoint.default_method = "POST"
+    mock_endpoint.required_headers = {"header": "value"}
+    mock_endpoint.required_params = set()
+
+    params = {"baz": "qux"}
+    mock_endpoint.get_merged_params.return_value = params
+    data = "I am a data"
+    files = {"file_name": io.BytesIO(b"this is a test")}
+    json = {"raw": "data"}
+    headers = {"Accept": "stuff"}
+    cookies = {"chocolate-chip": "yes"}
+    auth = mock.Mock()
+
+    mock_get_required_headers.return_value = {"header": "value"}
+    expected_headers = {}
+    expected_headers.update(headers)
+    expected_headers.update(mock_endpoint.required_headers)
+
+    with mock.patch.object(session, "prepare_request") as mock_prepare_request:
+        client.build_request_object(
+            session,
+            service,
+            mock_endpoint,
+            params=params,
+            data=data,
+            files=files,
+            json=json,
+            headers=headers,
+            cookies=cookies,
+            auth=auth,
+            foo="bar",
         )
 
-        mock_logger.info.assert_any_call("GET http://host1.biz/foo/")
-        mock_logger.info.assert_any_call("200 http://host1.biz/foo/")
+        mock_request_constructor.assert_called_once_with(
+            url="http://host1.biz/foo/",
+            method=mock_endpoint.default_method,
+            headers=expected_headers,
+            cookies=cookies,
+            params=params,
+            data=data,
+            files=files,
+            json=json,
+            auth=auth,
+        )
 
-        mock_endpoint.default_method = "POST"
-        request.method = "POST"
+        assert 1 == mock_prepare_request.call_count
+
+
+@mock.patch("apiron.client.Timeout")
+@mock.patch("apiron.client.get_adapted_session")
+@mock.patch("apiron.client.build_request_object")
+@mock.patch("requests.adapters.HTTPAdapter", autospec=True)
+@mock.patch("requests.Session", autospec=True)
+def test_call(
+    MockSession,
+    MockAdapter,
+    mock_build_request_object,
+    mock_get_adapted_session,
+    mock_timeout,
+    mock_response,
+    mock_endpoint,
+    mock_logger,
+):
+    service = mock.Mock()
+    service.get_hosts.return_value = ["http://host1.biz"]
+
+    mock_endpoint.default_method = "GET"
+    mock_endpoint.streaming = True
+
+    request = mock.Mock()
+    request.url = "http://host1.biz/foo/"
+    mock_build_request_object.return_value = request
+
+    mock_response.status_code = 200
+    mock_response.url = "http://host1.biz/foo/"
+
+    mock_session = MockSession()
+    mock_session.send.return_value = mock_response
+    mock_session.proxies = {}
+    mock_session.auth = ()
+    mock_get_adapted_session.return_value = mock_session
 
-        client.call(service, mock_endpoint, session=mock_session, timeout_spec=mock_timeout, logger=mock_logger)
+    client.call(service, mock_endpoint, timeout_spec=mock_timeout, logger=mock_logger)
 
-        mock_session.send.assert_any_call(
-            request,
-            timeout=(mock_timeout.connection_timeout, mock_timeout.read_timeout),
-            stream=mock_endpoint.streaming,
-            allow_redirects=True,
-            proxies=service.proxies,
-        )
+    mock_get_adapted_session.assert_called_once_with(MockAdapter())
+    mock_session.send.assert_called_once_with(
+        request,
+        timeout=(mock_timeout.connection_timeout, mock_timeout.read_timeout),
+        stream=mock_endpoint.streaming,
+        allow_redirects=True,
+        proxies=service.proxies,
+    )
 
-        mock_logger.info.assert_any_call("GET http://host1.biz/foo/")
-        mock_logger.info.assert_any_call("200 http://host1.biz/foo/")
+    mock_logger.info.assert_any_call("GET http://host1.biz/foo/")
+    mock_logger.info.assert_any_call("200 http://host1.biz/foo/")
 
-        request.method = "PUT"
+    mock_endpoint.default_method = "POST"
+    request.method = "POST"
 
-        client.call(
-            service, mock_endpoint, method="PUT", session=mock_session, timeout_spec=mock_timeout, logger=mock_logger
-        )
+    client.call(service, mock_endpoint, session=mock_session, timeout_spec=mock_timeout, logger=mock_logger)
 
-        mock_session.send.assert_any_call(
-            request,
-            timeout=(mock_timeout.connection_timeout, mock_timeout.read_timeout),
-            stream=mock_endpoint.streaming,
-            allow_redirects=True,
-            proxies=service.proxies,
-        )
+    mock_session.send.assert_any_call(
+        request,
+        timeout=(mock_timeout.connection_timeout, mock_timeout.read_timeout),
+        stream=mock_endpoint.streaming,
+        allow_redirects=True,
+        proxies=service.proxies,
+    )
 
-    @mock.patch("apiron.client.get_adapted_session")
-    def test_call_with_existing_session(self, mock_get_adapted_session, mock_response, mock_endpoint):
-        service = mock.Mock()
-        service.get_hosts.return_value = ["http://host1.biz"]
-        service.required_headers = {}
+    mock_logger.info.assert_any_call("GET http://host1.biz/foo/")
+    mock_logger.info.assert_any_call("200 http://host1.biz/foo/")
 
-        mock_logger = mock.Mock()
+    request.method = "PUT"
 
-        session = mock.Mock()
-        session.send.return_value = mock_response
+    client.call(
+        service, mock_endpoint, method="PUT", session=mock_session, timeout_spec=mock_timeout, logger=mock_logger
+    )
 
-        client.call(service, mock_endpoint, session=session, logger=mock_logger)
+    mock_session.send.assert_any_call(
+        request,
+        timeout=(mock_timeout.connection_timeout, mock_timeout.read_timeout),
+        stream=mock_endpoint.streaming,
+        allow_redirects=True,
+        proxies=service.proxies,
+    )
 
-        assert not mock_get_adapted_session.called
-        assert not session.close.called
 
-    def test_call_with_explicit_encoding(self, mock_response, mock_endpoint):
-        service = mock.Mock()
-        service.get_hosts.return_value = ["http://host1.biz"]
-        service.required_headers = {}
+@mock.patch("apiron.client.build_request_object")
+@mock.patch("apiron.client.get_adapted_session")
+@mock.patch("requests.Session", autospec=True)
+def test_call_auth_priority(
+    MockSession, mock_get_adapted_session, mock_build_request_object, mock_endpoint, mock_logger
+):
+    service = mock.Mock()
+    service.get_hosts.return_value = ["http://host1.biz"]
+    service.required_headers = {}
+    service.auth = ("service-user", "p455w0rd!")
 
-        session = mock.Mock()
-        session.send.return_value = mock_response
+    mock_session = MockSession()
+    mock_session.proxies = {}
+    mock_session.auth = ("session-user", "p455w0rd!")
 
-        client.call(service, mock_endpoint, session=session, logger=mock.Mock(), encoding="FAKE-CODEC")
+    mock_get_adapted_session.return_value = mock_session
 
-        assert "FAKE-CODEC" == mock_response.encoding
+    client.call(service, mock_endpoint, auth=("direct-user", "p455w0rd!"), session=mock_session, logger=mock_logger)
+    assert mock_build_request_object.call_args[1]["auth"] == ("direct-user", "p455w0rd!")
 
-    def test_build_request_object_raises_no_host_exception(self):
-        service = mock.Mock()
-        service.get_hosts.return_value = []
+    client.call(service, mock_endpoint, session=mock_session, logger=mock_logger)
+    assert mock_build_request_object.call_args[1]["auth"] == ("session-user", "p455w0rd!")
 
-        with pytest.raises(NoHostsAvailableException):
-            client.build_request_object(None, service, None)
+    mock_session.auth = ()
+    client.call(service, mock_endpoint, logger=mock_logger)
+    assert mock_build_request_object.call_args[1]["auth"] == ("service-user", "p455w0rd!")
 
-    def test_choose_host_returns_one_of_the_available_hosts(self):
-        hosts = ["foo", "bar", "baz"]
-        service = mock.Mock()
-        service.get_hosts.return_value = hosts
-        assert client.choose_host(service) in hosts
 
-    def test_choose_host_raises_exception_when_no_hosts_available(self):
-        service = mock.Mock()
-        service.get_hosts.return_value = []
-        with pytest.raises(NoHostsAvailableException):
-            client.choose_host(service)
+@mock.patch("apiron.client.get_adapted_session")
+def test_call_with_existing_session(mock_get_adapted_session, mock_response, mock_endpoint, mock_logger):
+    service = mock.Mock()
+    service.get_hosts.return_value = ["http://host1.biz"]
+    service.required_headers = {}
 
-    def test_call_when_raw_response_object_requested(self, mock_response, mock_endpoint):
-        service = mock.Mock()
-        service.get_hosts.return_value = ["http://host1.biz"]
-        service.required_headers = {}
+    session = mock.Mock()
+    session.send.return_value = mock_response
 
-        session = mock.Mock()
-        session.send.return_value = mock_response
+    client.call(service, mock_endpoint, session=session, logger=mock_logger)
 
-        response = client.call(
-            service, mock_endpoint, session=session, logger=mock.Mock(), return_raw_response_object=True,
-        )
+    assert not mock_get_adapted_session.called
+    assert not session.close.called
 
-        assert response is mock_response
 
-    def test_call_when_raw_response_object_requested_on_endpoint(self, mock_response, mock_endpoint):
-        service = mock.Mock()
-        service.get_hosts.return_value = ["http://host1.biz"]
-        service.required_headers = {}
+def test_call_with_explicit_encoding(mock_response, mock_endpoint, mock_logger):
+    service = mock.Mock()
+    service.get_hosts.return_value = ["http://host1.biz"]
+    service.required_headers = {}
 
-        session = mock.Mock()
-        session.send.return_value = mock_response
+    session = mock.Mock()
+    session.send.return_value = mock_response
 
-        mock_endpoint.return_raw_response_object = True
+    client.call(service, mock_endpoint, session=session, logger=mock_logger, encoding="FAKE-CODEC")
 
-        response = client.call(service, mock_endpoint, session=session, logger=mock.Mock())
+    assert "FAKE-CODEC" == mock_response.encoding
 
-        assert response is mock_response
 
-    def test_return_raw_response_object_in_call_overrides_endpoint(self, mock_response, mock_endpoint):
-        service = mock.Mock()
-        service.get_hosts.return_value = ["http://host1.biz"]
-        service.required_headers = {}
+def test_build_request_object_raises_no_host_exception():
+    service = mock.Mock()
+    service.get_hosts.return_value = []
 
-        session = mock.Mock()
-        session.send.return_value = mock_response
+    with pytest.raises(NoHostsAvailableException):
+        client.build_request_object(None, service, None)
 
-        mock_endpoint.return_raw_response_object = False
 
-        response = client.call(
-            service, mock_endpoint, session=session, logger=mock.Mock(), return_raw_response_object=True,
-        )
+def test_choose_host_returns_one_of_the_available_hosts():
+    hosts = ["foo", "bar", "baz"]
+    service = mock.Mock()
+    service.get_hosts.return_value = hosts
+    assert client.choose_host(service) in hosts
+
+
+def test_choose_host_raises_exception_when_no_hosts_available():
+    service = mock.Mock()
+    service.get_hosts.return_value = []
+    with pytest.raises(NoHostsAvailableException):
+        client.choose_host(service)
+
+
+def test_call_when_raw_response_object_requested(mock_response, mock_endpoint, mock_logger):
+    service = mock.Mock()
+    service.get_hosts.return_value = ["http://host1.biz"]
+    service.required_headers = {}
+
+    session = mock.Mock()
+    session.send.return_value = mock_response
+
+    response = client.call(service, mock_endpoint, session=session, logger=mock_logger, return_raw_response_object=True)
+
+    assert response is mock_response
+
+
+def test_call_when_raw_response_object_requested_on_endpoint(mock_response, mock_endpoint):
+    service = mock.Mock()
+    service.get_hosts.return_value = ["http://host1.biz"]
+    service.required_headers = {}
+
+    session = mock.Mock()
+    session.send.return_value = mock_response
+
+    mock_endpoint.return_raw_response_object = True
+
+    response = client.call(service, mock_endpoint, session=session, logger=mock.Mock())
+
+    assert response is mock_response
+
+
+def test_return_raw_response_object_in_call_overrides_endpoint(mock_response, mock_endpoint):
+    service = mock.Mock()
+    service.get_hosts.return_value = ["http://host1.biz"]
+    service.required_headers = {}
+
+    session = mock.Mock()
+    session.send.return_value = mock_response
+
+    mock_endpoint.return_raw_response_object = False
+
+    response = client.call(
+        service, mock_endpoint, session=session, logger=mock.Mock(), return_raw_response_object=True,
+    )
 
-        assert response is mock_response
+    assert response is mock_response
 
 
 @pytest.mark.parametrize(

pip install -e .[dev]
parse_log_pytest
pytest
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio pytest
apt-get update apt-get install -y gcc
3.7
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/ithaka/apiron.git@b907523be60dfb4e874b3c74adfa2494c09ad23e#egg=apiron
attrs @ file:///croot/attrs_1668696182826/work
certifi @ file:///croot/certifi_1671487769961/work/certifi
charset-normalizer==3.4.1
coverage==7.2.7
execnet==2.0.2
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
idna==3.10
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1671697413597/work
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pytest==7.1.2
pytest-asyncio==0.21.2
pytest-cov==4.1.0
pytest-mock==3.11.1
pytest-xdist==3.5.0
requests==2.31.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
urllib3==2.0.7
zipp @ file:///croot/zipp_1672387121353/work

name: apiron
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - apiron==5.0.0
      - charset-normalizer==3.4.1
      - coverage==7.2.7
      - execnet==2.0.2
      - idna==3.10
      - pytest-asyncio==0.21.2
      - pytest-cov==4.1.0
      - pytest-mock==3.11.1
      - pytest-xdist==3.5.0
      - requests==2.31.0
      - urllib3==2.0.7
prefix: /opt/conda/envs/apiron

tests/test_client.py::test_call_auth_priority
tests/service/test_base.py::TestServiceBase::test_get_hosts_returns_empty_list_by_default tests/service/test_base.py::TestServiceBase::test_required_headers_returns_empty_dict_by_default tests/service/test_base.py::TestService::test_get_hosts_returns_domain tests/service/test_base.py::TestService::test_str_method_on_class tests/service/test_base.py::TestService::test_repr_method_on_class tests/service/test_base.py::TestService::test_required_headers_returns_empty_dict_by_default tests/service/test_base.py::TestService::test_endpoints_when_no_endpoints tests/service/test_base.py::TestService::test_endpoints_when_one_endpoint tests/service/test_base.py::TestService::test_endpoints_when_multiple_endpoints tests/test_client.py::test_get_adapted_session tests/test_client.py::test_get_required_headers tests/test_client.py::test_build_request_object_passes_arguments_to_request_constructor tests/test_client.py::test_call tests/test_client.py::test_call_with_existing_session tests/test_client.py::test_call_with_explicit_encoding tests/test_client.py::test_build_request_object_raises_no_host_exception tests/test_client.py::test_choose_host_returns_one_of_the_available_hosts tests/test_client.py::test_choose_host_raises_exception_when_no_hosts_available tests/test_client.py::test_call_when_raw_response_object_requested tests/test_client.py::test_call_when_raw_response_object_requested_on_endpoint tests/test_client.py::test_return_raw_response_object_in_call_overrides_endpoint tests/test_client.py::test_build_url[http://biz.com-/endpoint-http://biz.com/endpoint] tests/test_client.py::test_build_url[http://biz.com/-endpoint-http://biz.com/endpoint] tests/test_client.py::test_build_url[http://biz.com/-/endpoint-http://biz.com/endpoint] tests/test_client.py::test_build_url[http://biz.com-endpoint-http://biz.com/endpoint] tests/test_client.py::test_build_url[http://biz.com/v2-/endpoint-http://biz.com/v2/endpoint] tests/test_client.py::test_build_url[http://biz.com/v2/-endpoint-http://biz.com/v2/endpoint] tests/test_client.py::test_build_url[http://biz.com/v2/-/endpoint-http://biz.com/v2/endpoint] tests/test_client.py::test_build_url[http://biz.com/v2-endpoint-http://biz.com/v2/endpoint]
src/apiron/service/base.py src/apiron/client.py setup.cfg CHANGELOG.md
src/apiron/service/base.py src/apiron/client.py setup.cfg CHANGELOG.md