def test_given_no_response(mocker): retry = mocker.patch(f"{PKG}.retry_while_false", side_effect=_retry) requester = NonCallableMock(Requester) requester.base_url = sentinel.requester_base_url requester.execute.return_value = (sentinel.execution, None) requirements = NonCallableMock(ResponseDescription) runner = UnitRunner(requester) assert runner.base_url is sentinel.requester_base_url execution, response, verification = runner.run(sentinel.request, requirements) assert execution is sentinel.execution assert response is None assert verification is None requester.execute.assert_called_once_with(sentinel.request, session=None, context=Context()) requirements.verify.assert_not_called() retry.assert_called_once_with(ANY, attempts=1, delay=0.1, predicate=predicate)
def test_given_a_response(mocker): retry = mocker.patch(f"{PKG}.retry_while_false", side_effect=_retry) execution = ExecutionReport(starts=sentinel.starts) requester = NonCallableMock(Requester) requester.base_url = sentinel.requester_base_url requester.execute.return_value = (execution, sentinel.response) def _verify(analyzer: Analyzer, context: Optional[Context] = None) -> Verification: assert analyzer is sentinel.response assert context == Context(foo="bar", starts=sentinel.starts) return sentinel.verification requirements = NonCallableMock(ResponseDescription, verify=Mock(side_effect=_verify)) runner = UnitRunner(requester=requester, retry=3, delay=sentinel.delay) assert runner.base_url is sentinel.requester_base_url execution, response, verification = runner.run( sentinel.request, requirements, sentinel.session, context=Context(foo="bar"), ) assert execution is execution assert response is sentinel.response assert verification is sentinel.verification requester.execute.assert_called_with( sentinel.request, session=sentinel.session, context=Context(foo="bar"), ) # Contextual values will disappear. requirements.verify.assert_called_with(sentinel.response, Context(foo="bar")) retry.assert_called_once_with(ANY, attempts=4, delay=sentinel.delay, predicate=ANY)