async def test_errors_are_raised_aggregated(activity): def sample_fn1(**_): raise PermanentError("boo!123") def sample_fn2(**_): raise PermanentError("boo!456") registry = OperatorRegistry() registry.register_activity_handler(fn=sample_fn1, id='id1', activity=activity) registry.register_activity_handler(fn=sample_fn2, id='id2', activity=activity) with pytest.raises(ActivityError) as e: await run_activity( registry=registry, activity=activity, lifecycle=all_at_once, ) assert set(e.value.outcomes.keys()) == {'id1', 'id2'} assert e.value.outcomes['id1'].final assert e.value.outcomes['id1'].delay is None assert e.value.outcomes['id1'].result is None assert e.value.outcomes['id1'].exception is not None assert e.value.outcomes['id2'].final assert e.value.outcomes['id2'].delay is None assert e.value.outcomes['id2'].result is None assert e.value.outcomes['id2'].exception is not None assert str(e.value.outcomes['id1'].exception) == "boo!123" assert str(e.value.outcomes['id2'].exception) == "boo!456"
async def test_delays_are_simulated(activity, mocker): def sample_fn(**_): raise TemporaryError('to be retried', delay=123) registry = OperatorRegistry() registry.register_activity_handler(fn=sample_fn, id='id', activity=activity, retries=3) with freezegun.freeze_time() as frozen: async def sleep_or_wait_substitute(*_, **__): frozen.tick(123) sleep_or_wait = mocker.patch('kopf.engines.sleeping.sleep_or_wait', wraps=sleep_or_wait_substitute) with pytest.raises(ActivityError) as e: await run_activity( registry=registry, activity=activity, lifecycle=all_at_once, ) assert sleep_or_wait.call_count == 3 # 3 retries, 1 sleep each
async def test_single_credentials_provided_to_vault(): info = ConnectionInfo(server='https://expected/') vault = Vault() registry = OperatorRegistry() def login_fn(**_): return info registry.register_activity_handler( fn=login_fn, id= 'login_fn', # auto-detection does not work, as it is local to the test function. activity=Activity.AUTHENTICATION, ) await authenticate( registry=registry, vault=vault, ) assert vault items = [] async for key, info in vault: items.append((key, info)) assert len(items) == 1 assert items[0][0] == 'login_fn' assert items[0][1] is info
async def test_noreturn_handler_produces_no_credentials(): vault = Vault() registry = OperatorRegistry() def login_fn(**_): pass registry.register_activity_handler( fn=login_fn, id= 'login_fn', # auto-detection does not work, as it is local to the test function. activity=Activity.AUTHENTICATION, ) await authenticate( registry=registry, vault=vault, ) assert vault.readiness.is_set() assert not vault.emptiness.is_set() assert not vault with pytest.raises(LoginError): async for _, _ in vault: pass
async def test_errors_are_cascaded_from_one_of_the_originals(activity): def sample_fn(**_): raise PermanentError("boo!") registry = OperatorRegistry() registry.register_activity_handler(fn=sample_fn, id='id', activity=activity) with pytest.raises(ActivityError) as e: await run_activity( registry=registry, activity=activity, lifecycle=all_at_once, ) assert e.value.__cause__ assert type(e.value.__cause__) is PermanentError assert str(e.value.__cause__) == "boo!"
async def test_retries_are_simulated(activity, mocker): mock = mocker.MagicMock() def sample_fn(**_): mock() raise TemporaryError('to be retried', delay=0) registry = OperatorRegistry() registry.register_activity_handler(fn=sample_fn, id='id', activity=activity, retries=3) with pytest.raises(ActivityError) as e: await run_activity( registry=registry, activity=activity, lifecycle=all_at_once, ) assert isinstance(e.value.outcomes['id'].exception, PermanentError) assert mock.call_count == 3
async def test_results_are_returned_on_success(activity): def sample_fn1(**_): return 123 def sample_fn2(**_): return 456 registry = OperatorRegistry() registry.register_activity_handler(fn=sample_fn1, id='id1', activity=activity) registry.register_activity_handler(fn=sample_fn2, id='id2', activity=activity) results = await run_activity( registry=registry, activity=activity, lifecycle=all_at_once, ) assert set(results.keys()) == {'id1', 'id2'} assert results['id1'] == 123 assert results['id2'] == 456