Beispiel #1
0
def profiling_fraud_score(user: User,
                          body: serializers.UserProfilingFraudRequest) -> None:
    handler = user_profiling.UserProfilingClient()

    try:
        profiling_infos = handler.get_user_profiling_fraud_data(
            session_id=body.session_id,
            user_id=user.id,
            user_email=user.email,
            birth_date=user.dateOfBirth.date() if user.dateOfBirth else None,
            phone_number=user.phoneNumber,
            workflow_type=user_profiling.WorkflowType.BENEFICIARY_VALIDATION,
            # depends on loadbalancer configuration
            ip_address=request.headers.get("X-Forwarded-For"),
            line_of_business=user_profiling.LineOfBusiness.B2C,
            # Insert request unique identifier
            transaction_id=get_or_set_correlation_id(),
            agent_type=user_profiling.AgentType.AGENT_MOBILE,
        )
    except user_profiling.BaseUserProfilingException:
        logger.exception("Error while retrieving user profiling infos",
                         exc_info=True)
    else:
        logger.info("Success when profiling user: returned userdata %r",
                    profiling_infos.dict())
        fraud_api.on_user_profiling_result(user, profiling_infos)
def test_get_profiling_data(requests_mock):
    matcher = requests_mock.register_uri(
        "POST", settings.USER_PROFILING_URL, json=user_profiling_fixtures.CORRECT_RESPONSE, status_code=200
    )

    handler = user_profiling.UserProfilingClient()
    profiling_data = handler.get_user_profiling_fraud_data(
        session_id="fake-session-id",
        user_id="fake-user-id",
        user_email="*****@*****.**",
        birth_date=datetime.date(1999, 6, 5),
        phone_number="+33712345678",
        workflow_type=user_profiling.WorkflowType.BENEFICIARY_VALIDATION,
        ip_address="127.0.0.1",
        line_of_business=user_profiling.LineOfBusiness.B2B,
        transaction_id="random-transaction-id",
        agent_type=user_profiling.AgentType.AGENT_MOBILE,
    )

    assert isinstance(profiling_data, fraud_models.UserProfilingFraudData)
    assert profiling_data.account_email_result == user_profiling_fixtures.CORRECT_RESPONSE["account_email_result"]
    assert profiling_data.account_email_score == int(user_profiling_fixtures.CORRECT_RESPONSE["account_email_score"])
    assert (
        profiling_data.account_telephone_result == user_profiling_fixtures.CORRECT_RESPONSE["account_telephone_result"]
    )
    assert profiling_data.account_telephone_score == int(
        user_profiling_fixtures.CORRECT_RESPONSE["account_telephone_score"]
    )
    assert profiling_data.bb_bot_rating == user_profiling_fixtures.CORRECT_RESPONSE["bb_bot_rating"]
    assert profiling_data.bb_bot_score == float(user_profiling_fixtures.CORRECT_RESPONSE["bb_bot_score"])
    assert profiling_data.bb_fraud_rating == user_profiling_fixtures.CORRECT_RESPONSE["bb_fraud_rating"]
    assert profiling_data.bb_fraud_score == float(user_profiling_fixtures.CORRECT_RESPONSE["bb_fraud_score"])
    assert profiling_data.digital_id_result == user_profiling_fixtures.CORRECT_RESPONSE["digital_id_result"]
    assert profiling_data.digital_id_trust_score == float(
        user_profiling_fixtures.CORRECT_RESPONSE["digital_id_trust_score"]
    )
    assert (
        profiling_data.digital_id_trust_score_rating
        == user_profiling_fixtures.CORRECT_RESPONSE["digital_id_trust_score_rating"]
    )
    assert profiling_data.digital_id_confidence == int(
        user_profiling_fixtures.CORRECT_RESPONSE["digital_id_confidence"]
    )
    assert (
        profiling_data.digital_id_confidence_rating
        == user_profiling_fixtures.CORRECT_RESPONSE["digital_id_confidence_rating"]
    )

    assert matcher.call_count == 1

    request_body = matcher.last_request.json()
    assert request_body["session_id"] == "fake-session-id"
    assert request_body["account_email"] == "*****@*****.**"
    assert request_body["customer_event_type"] == user_profiling.WorkflowType.BENEFICIARY_VALIDATION.value
    assert request_body["line_of_business"] == user_profiling.LineOfBusiness.B2B.value
    assert request_body["condition_attrib_5"] == user_profiling.AgentType.AGENT_MOBILE.value
def test_get_profiling_data_error(requests_mock):
    requests_mock.register_uri("POST", settings.USER_PROFILING_URL, json={}, status_code=500)

    handler = user_profiling.UserProfilingClient()
    with pytest.raises(user_profiling.UserProfilingHTTPError):
        handler.get_user_profiling_fraud_data(
            session_id="fake-session-id",
            user_id="fake-user-id",
            user_email="*****@*****.**",
            birth_date=datetime.date(1999, 6, 5),
            phone_number="+33712345678",
            workflow_type=user_profiling.WorkflowType.BENEFICIARY_VALIDATION,
            ip_address="127.0.0.1",
            line_of_business=user_profiling.LineOfBusiness.B2B,
            transaction_id="random-transaction-id",
            agent_type=user_profiling.AgentType.AGENT_MOBILE,
        )
def test_get_profiling_data_date_of_birth_empty(requests_mock):
    matcher = requests_mock.register_uri(
        "POST", settings.USER_PROFILING_URL, json=user_profiling_fixtures.CORRECT_RESPONSE, status_code=200
    )

    handler = user_profiling.UserProfilingClient()
    handler.get_user_profiling_fraud_data(
        session_id="fake-session-id",
        user_id="fake-user-id",
        user_email="*****@*****.**",
        birth_date=None,
        phone_number="+33712345678",
        workflow_type=user_profiling.WorkflowType.BENEFICIARY_VALIDATION,
        ip_address="127.0.0.1",
        line_of_business=user_profiling.LineOfBusiness.B2B,
        transaction_id="random-transaction-id",
        agent_type=user_profiling.AgentType.AGENT_MOBILE,
    )

    assert "account_date_of_birth" not in matcher.last_request.json().keys()
def test_get_profiling_data_empty_fields(requests_mock, empty_field):

    user_profiling_response = user_profiling_fixtures.CORRECT_RESPONSE.copy()
    del user_profiling_response[empty_field]
    requests_mock.register_uri("POST", settings.USER_PROFILING_URL, json=user_profiling_response, status_code=200)

    handler = user_profiling.UserProfilingClient()
    profiling_data = handler.get_user_profiling_fraud_data(
        session_id="fake-session-id",
        user_id="fake-user-id",
        user_email="*****@*****.**",
        birth_date=datetime.date(1999, 6, 5),
        phone_number="+33712345678",
        workflow_type=user_profiling.WorkflowType.BENEFICIARY_VALIDATION,
        ip_address="127.0.0.1",
        line_of_business=user_profiling.LineOfBusiness.B2B,
        transaction_id="random-transaction-id",
        agent_type=user_profiling.AgentType.AGENT_MOBILE,
    )

    assert isinstance(profiling_data, fraud_models.UserProfilingFraudData)