Exemplo n.º 1
0
def test_raises_error_codes_on_match(test_error):
    errors = [test_error]
    with raises_error_codes('TEST') as exc_info:
        raise Client.CallActionError(
            actions=[ActionResponse(action='', errors=errors)])

    assert exc_info.soa_errors == errors
Exemplo n.º 2
0
def test_raises_error_codes_multiple(codes):
    errors = [Error(code=code, message='bam') for code in codes]
    with raises_error_codes(['TEST', 'AUTH_MISSING']) as exc_info:
        raise Client.CallActionError(
            actions=[ActionResponse(action='', errors=errors)])

    assert exc_info.soa_errors == errors
Exemplo n.º 3
0
def test_raises_field_errors_on_match(invalid_event_id_field_error):
    errors = [invalid_event_id_field_error]
    with raises_field_errors({'event_id': 'INVALID'}) as exc_info:
        raise Client.CallActionError(
            actions=[ActionResponse(action='', errors=errors)])

    assert exc_info.soa_errors == errors
Exemplo n.º 4
0
def test_raises_call_action_error_on_error(test_error):
    errors = [test_error]
    with raises_call_action_error() as exc_info:
        raise Client.CallActionError(
            actions=[ActionResponse(action='', errors=errors)])

    assert exc_info.soa_errors == errors
Exemplo n.º 5
0
def test_raises_error_only_codes_unexpected_missing(test_error,
                                                    auth_missing_error):
    errors = [test_error, auth_missing_error]
    with pytest.raises(pytest.raises.Exception):
        with raises_only_error_codes('UNAUTHORIZED'):
            raise Client.CallActionError(
                actions=[ActionResponse(action='', errors=errors)])
Exemplo n.º 6
0
def test_raises_error_only_codes_unexpected_field_error(
        invalid_event_id_field_error, auth_missing_error):
    errors = [invalid_event_id_field_error, auth_missing_error]
    with pytest.raises(pytest.raises.Exception):
        with raises_only_error_codes('AUTH_MISSING'):
            raise Client.CallActionError(
                actions=[ActionResponse(action='', errors=errors)])
Exemplo n.º 7
0
def test_raises_only_error_codes_match(test_error, auth_missing_error):
    errors = [test_error, auth_missing_error]
    with raises_only_error_codes(['AUTH_MISSING', 'TEST']) as exc_info:
        raise Client.CallActionError(
            actions=[ActionResponse(action='', errors=errors)])

    assert exc_info.soa_errors == errors
Exemplo n.º 8
0
def test_raises_field_errors_missing(code, field):
    errors = [
        Error(code=code, message='test fail', field=field),
    ]
    with pytest.raises(pytest.raises.Exception):
        with raises_field_errors({'event_id': 'UNKNOWN'}):
            raise Client.CallActionError(
                actions=[ActionResponse(action='', errors=errors)])
Exemplo n.º 9
0
def test_raises_only_field_errors_unexpected_missing(
        unknown_event_id_field_error, invalid_organization_id_field_error):
    errors = [
        unknown_event_id_field_error,
        invalid_organization_id_field_error,
    ]
    with pytest.raises(pytest.raises.Exception):
        with raises_only_field_errors({'event_id': 'MISSING'}):
            raise Client.CallActionError(
                actions=[ActionResponse(action='', errors=errors)])
Exemplo n.º 10
0
def test_raises_only_field_errors_unexpected_error(
        auth_missing_error, invalid_organization_id_field_error):
    errors = [
        auth_missing_error,
        invalid_organization_id_field_error,
    ]
    with pytest.raises(pytest.raises.Exception):
        with raises_only_field_errors({'organization_id': 'INVALID'}):
            raise Client.CallActionError(
                actions=[ActionResponse(action='', errors=errors)])
Exemplo n.º 11
0
def test_raises_field_errors_unexpected_only(invalid_event_id_field_error,
                                             unknown_event_id_field_error):
    errors = [
        invalid_event_id_field_error,
        unknown_event_id_field_error,
    ]
    with pytest.raises(pytest.raises.Exception):
        with raises_field_errors({'event_id': ['UNKNOWN']}, only=True):
            raise Client.CallActionError(
                actions=[ActionResponse(action='', errors=errors)])
Exemplo n.º 12
0
def test_raises_only_field_errors_match(invalid_event_id_field_error,
                                        unknown_event_id_field_error):
    errors = [
        invalid_event_id_field_error,
        unknown_event_id_field_error,
    ]
    with raises_only_field_errors({'event_id': ['UNKNOWN',
                                                'INVALID']}) as exc_info:
        raise Client.CallActionError(
            actions=[ActionResponse(action='', errors=errors)])

    assert exc_info.soa_errors == errors
Exemplo n.º 13
0
def test_raises_field_errors_match_multiple(codes):
    errors = [
        Error(code=code, field=field, message='bam') for field, code in codes
    ]
    with raises_field_errors({
            'event_id': 'UNKNOWN',
            'organization_id': 'INVALID'
    }) as exc_info:
        raise Client.CallActionError(
            actions=[ActionResponse(action='', errors=errors)])

    assert exc_info.soa_errors == errors
Exemplo n.º 14
0
def test_raises_error_codes_missing(codes):
    errors = [Error(code=code, message='bam') for code in codes]
    with pytest.raises(pytest.raises.Exception):
        with raises_error_codes(['AUTH_MISSING']):
            raise Client.CallActionError(
                actions=[ActionResponse(action='', errors=errors)])
Exemplo n.º 15
0
def test_raises_only_error_codes_unexpected(test_error, auth_missing_error):
    errors = [test_error, auth_missing_error]
    with pytest.raises(pytest.raises.Exception):
        with raises_only_error_codes(['AUTH_MISSING']):
            raise Client.CallActionError(
                actions=[ActionResponse(action='', errors=errors)])
Exemplo n.º 16
0
        def wrapped(client, service_name, actions, *args, **kwargs):
            assert isinstance(
                service_name, six.text_type
            ), 'Called service name "{}" must be unicode'.format(
                service_name, )

            requests_to_send_to_mock_client = OrderedDict()
            requests_to_send_to_wrapped_client = []
            for i, action_request in enumerate(actions):
                action_name = getattr(action_request, 'action',
                                      None) or action_request['action']
                assert isinstance(
                    action_name, six.text_type
                ), 'Called action name "{}" must be unicode'.format(
                    action_name, )

                if service_name == self.service and action_name == self.action:
                    # If the service AND action name match, we should send the request to our mocked client
                    if not isinstance(action_request, ActionRequest):
                        action_request = ActionRequest(action_request)
                    requests_to_send_to_mock_client[i] = action_request
                else:
                    # If the service OR action name DO NOT match, we should delegate the request to the wrapped client
                    requests_to_send_to_wrapped_client.append(action_request)

            # Hold off on raising action errors until both mock and real responses are merged
            raise_action_errors = kwargs.get('raise_action_errors', True)
            kwargs['raise_action_errors'] = False
            # Run the real and mocked jobs and merge the results, to simulate a single job
            if requests_to_send_to_wrapped_client:
                job_response = self._wrapped_client_call_actions_method(
                    client, service_name, requests_to_send_to_wrapped_client,
                    *args, **kwargs)
            else:
                job_response = JobResponse()
            for i, action_request in requests_to_send_to_mock_client.items():
                try:
                    mock_response = mock_action(action_request.body or {})
                    if isinstance(mock_response, JobResponse):
                        mock_response = mock_response.actions[0]
                    elif isinstance(mock_response, dict):
                        mock_response = ActionResponse(self.action,
                                                       body=mock_response)
                    elif not isinstance(mock_response, ActionResponse):
                        mock_response = ActionResponse(self.action)
                except ActionError as e:
                    mock_response = ActionResponse(self.action,
                                                   errors=e.errors)
                job_response.actions.insert(i, mock_response)
            if kwargs.get('continue_on_error', False) is False:
                # Simulate the server job halting on the first action error
                first_error_index = -1
                for i, action_result in enumerate(job_response.actions):
                    if action_result.errors:
                        first_error_index = i
                        break
                if first_error_index >= 0:
                    job_response.actions = job_response.actions[:
                                                                first_error_index
                                                                + 1]
            if raise_action_errors:
                error_actions = [
                    action for action in job_response.actions if action.errors
                ]
                if error_actions:
                    raise Client.CallActionError(error_actions)

            return job_response