diff --git a/HISTORY.rst b/HISTORY.rst index 99c66e1..d5792b5 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -14,6 +14,8 @@ History * ``dlocal`` * ``onpay`` * ``safecharge`` +* Added ``rule_label`` to minFraud output ``/disposition``. +* Added ``was_3d_secure_successful`` to ``/credit_card`` validation 2.3.1 (2021-02-12) ++++++++++++++++++ diff --git a/README.rst b/README.rst index cad7878..cfc206b 100644 --- a/README.rst +++ b/README.rst @@ -195,6 +195,7 @@ Score, Insights and Factors Example >>> 'cvv_result': 'N', >>> 'bank_name': 'Bank of No Hope', >>> 'issuer_id_number': '411111' + >>> 'was_3d_secure_successful': True >>> }, >>> 'payment': { >>> 'decline_code': 'invalid number', diff --git a/minfraud/models.py b/minfraud/models.py index b4f9e6e..efd993f 100644 --- a/minfraud/models.py +++ b/minfraud/models.py @@ -418,8 +418,9 @@ class Disposition: .. attribute:: action The action to take on the transaction as defined by your custom rules. - The current set of values are "accept", "manual_review", and "reject". - If you do not have custom rules set up, ``None`` will be returned. + The current set of values are "accept", "manual_review", "reject", and + "test". If you do not have custom rules set up, ``None`` will be + returned. :type: str | None @@ -429,16 +430,26 @@ class Disposition: "custom_rule", "block_list", and "default". If you do not have custom rules set up, ``None`` will be returned. + :type: str | None + + .. attribute:: rule_label + + The label of the custom rule that was triggered. If you do not have + custom rules set up, the triggered custom rule does not have a label, or + no custom rule was triggered, ``None`` will be returned. + :type: str | None """ action: Optional[str] reason: Optional[str] + rule_label: Optional[str] __slots__ = () _fields = { "action": None, "reason": None, + "rule_label": None, } diff --git a/minfraud/validation.py b/minfraud/validation.py index dcee398..b3b28e4 100644 --- a/minfraud/validation.py +++ b/minfraud/validation.py @@ -302,6 +302,7 @@ def _uri(s: str) -> str: "issuer_id_number": _iin, "last_4_digits": _credit_card_last_4, "token": _credit_card_token, + "was_3d_secure_successful": bool, }, "custom_inputs": {_custom_input_key: _custom_input_value}, "device": { diff --git a/tests/data/full-transaction-request.json b/tests/data/full-transaction-request.json index f03dcc9..430554c 100644 --- a/tests/data/full-transaction-request.json +++ b/tests/data/full-transaction-request.json @@ -53,7 +53,8 @@ "bank_phone_number": "123-456-1234", "avs_result": "Y", "cvv_result": "N", - "token": "123456abc1234" + "token": "123456abc1234", + "was_3d_secure_successful": true }, "order": { "amount": 323.21, diff --git a/tests/test_models.py b/tests/test_models.py index 00a661b..162aef8 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -99,10 +99,13 @@ def test_device(self): self.assertEqual(local_time, device.local_time) def test_disposition(self): - disposition = Disposition({"action": "accept", "reason": "default"}) + disposition = Disposition( + {"action": "accept", "reason": "default", "rule_label": "custom rule label"} + ) self.assertEqual("accept", disposition.action) self.assertEqual("default", disposition.reason) + self.assertEqual("custom rule label", disposition.rule_label) def test_email(self): first_seen = "2016-01-01" diff --git a/tests/test_validation.py b/tests/test_validation.py index f322df3..633fca8 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -185,6 +185,9 @@ def test_token(self): for invalid in ("\x20", "123456", "x" * 256): self.check_invalid_transaction({"credit_card": {"token": invalid}}) + def test_was_3d_secure_successful(self): + self.check_bool("credit_card", "was_3d_secure_successful") + class TestCustomInputs(ValidationBase, unittest.TestCase): def test_valid_inputs(self):