Skip to content
Merged
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
72 changes: 69 additions & 3 deletions tests/test_client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import inspect
import time
import types
import uuid
from concurrent.futures import ThreadPoolExecutor
from unittest.mock import MagicMock
Expand Down Expand Up @@ -242,7 +243,7 @@ def test_should_call_api_level_hooks(no_op_provider_client):
api_hook.after.assert_called_once()


# Requirement 1.7.5
# Requirement 1.7.1, Requirement 1.7.3
def test_should_define_a_provider_status_accessor(no_op_provider_client):
# When
status = no_op_provider_client.get_provider_status()
Expand All @@ -251,7 +252,23 @@ def test_should_define_a_provider_status_accessor(no_op_provider_client):
assert status == ProviderStatus.READY


# Requirement 1.7.6
# Requirement 1.7.4
def test_provider_should_return_error_status_if_failed():
# Given
provider = NoOpProvider()
set_provider(provider)
client = get_client()

provider.emit_provider_error(ProviderEventDetails(error_code=ErrorCode.GENERAL))

# When
status = client.get_provider_status()

# Then
assert status == ProviderStatus.ERROR


# Requirement 1.7.6, Requirement 1.7.8
@pytest.mark.asyncio
async def test_should_shortcircuit_if_provider_is_not_ready(
no_op_provider_client, monkeypatch
Expand Down Expand Up @@ -281,7 +298,7 @@ async def test_should_shortcircuit_if_provider_is_not_ready(
spy_hook.finally_after.assert_called_once()


# Requirement 1.7.7
# Requirement 1.7.5, Requirement 1.7.7
@pytest.mark.asyncio
async def test_should_shortcircuit_if_provider_is_in_irrecoverable_error_state(
no_op_provider_client, monkeypatch
Expand Down Expand Up @@ -311,6 +328,27 @@ async def test_should_shortcircuit_if_provider_is_in_irrecoverable_error_state(
spy_hook.finally_after.assert_called_once()


# Requirement 1.7.9
def test_provider_should_return_not_ready_status_after_shutdown(monkeypatch):
# Given
provider = NoOpProvider()
set_provider(provider)
client = get_client()

def _shutdown(self) -> None:
self._status = ProviderStatus.NOT_READY

monkeypatch.setattr(provider, "shutdown", types.MethodType(_shutdown, provider))

# When
api.shutdown()

status = client.get_provider_status()

# Then
assert status == ProviderStatus.NOT_READY


@pytest.mark.asyncio
async def test_should_run_error_hooks_if_provider_returns_resolution_with_error_code():
# Given
Expand Down Expand Up @@ -482,6 +520,34 @@ def test_provider_event_late_binding():
spy.provider_configuration_changed.assert_called_once_with(details)


# Requirement 5.1.4, Requirement 5.1.5
def test_provider_event_handler_exception():
# Given
provider = NoOpProvider()
set_provider(provider)

spy = MagicMock()

client = get_client()
client.add_handler(ProviderEvent.PROVIDER_ERROR, spy.provider_error)

# When
provider.emit_provider_error(
ProviderEventDetails(error_code=ErrorCode.GENERAL, message="some_error")
)

# Then
spy.provider_error.assert_called_once_with(
EventDetails(
flags_changed=None,
message="some_error",
error_code=ErrorCode.GENERAL,
metadata={},
provider_name="No-op Provider",
)
)


def test_client_handlers_thread_safety():
provider = NoOpProvider()
set_provider(provider)
Expand Down