"""Tests for patience utility.""" from unittest.mock import MagicMock, patch import pytest from qa_testing_utils.patience import validate from qa_testing_utils.patience import wait from qa_testing_utils.patience import WaitingTimeoutException @pytest.fixture def mock_strategies(): """Mock scheme strategy mapping.""" mock_strategy_map = {'http': MagicMock(), 'tcp': MagicMock()} with patch.dict( 'qa_testing_utils.patience.strategies', mock_strategy_map, clear=True): yield mock_strategy_map @pytest.fixture def mock_sleep(): """Mock the sleep function for faster tests.""" with patch('qa_testing_utils.patience.wait_for_1_sec') as mock_sleep: yield mock_sleep def test_validate_fails_with_unsupported_scheme(mock_strategies): """An exception is thrown.""" with pytest.raises(ValueError): validate(['ftp://bar:8080']) def test_wait_success(mock_strategies, mock_sleep): """Waiting succeeds when all the services eventually respond.""" mock_strategies['http'].side_effect = [False, False, False, True] mock_strategies['tcp'].side_effect = [False, True] wait(validate(['http://foo:8080', 'tcp://bar:5432']), 5) assert mock_sleep.call_count == 4 def test_wait_failure(mock_strategies, mock_sleep): """Waiting fails with an exception when some service fails to respond.""" mock_strategies['http'].side_effect = [False, False, False, False] mock_strategies['tcp'].side_effect = [False, True] with pytest.raises(WaitingTimeoutException): wait(validate(['http://foo:8080', 'tcp://bar:5432']), 3) assert mock_sleep.call_count == 3