1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from unittest.mock import patch
from werkzeug.urls import url_encode, url_join
from odoo.tests import tagged
from odoo.tools import mute_logger
from odoo.addons.payment.tests.http_common import PaymentHttpCommon
from odoo.addons.payment_stripe.controllers.main import StripeController
from odoo.addons.payment_stripe.tests.common import StripeCommon
@tagged('post_install', '-at_install')
class StripeTest(StripeCommon, PaymentHttpCommon):
def test_processing_values(self):
dummy_client_secret = 'pi_123456789_secret_dummy_123456789'
tx = self._create_transaction(flow='direct') # We don't really care what the flow is here.
# Ensure no external API call is done, we only want to check the processing values logic
def mock_stripe_stripe_create_intent(self):
return {'client_secret': dummy_client_secret}
with patch.object(
type(self.env['payment.transaction']), '_stripe_create_intent',
mock_stripe_stripe_create_intent,
), mute_logger('odoo.addons.payment.models.payment_transaction'):
processing_values = tx._get_processing_values()
self.assertEqual(processing_values['client_secret'], dummy_client_secret)
base_url = self.provider.get_base_url()
return_url = url_join(
base_url, f'{StripeController._return_url}?{url_encode({"reference": tx.reference})}'
)
self.assertEqual(processing_values['return_url'], return_url)
@mute_logger('odoo.addons.payment_stripe.models.payment_transaction')
def test_tx_state_after_send_capture_request(self):
self.provider.capture_manually = True
tx = self._create_transaction('direct', state='authorized')
with patch(
'odoo.addons.payment_stripe.models.payment_provider.PaymentProvider'
'._stripe_make_request',
return_value={'id': 'pi_3KTk9zAlCFm536g81Wy7RCPH', 'status': 'succeeded'},
):
tx._send_capture_request()
self.assertEqual(
tx.state, 'done', msg="The state should be 'done' after a successful capture."
)
@mute_logger('odoo.addons.payment_stripe.models.payment_transaction')
def test_tx_state_after_send_void_request(self):
self.provider.capture_manually = True
tx = self._create_transaction('redirect', state='authorized')
with patch(
'odoo.addons.payment_stripe.models.payment_provider.PaymentProvider'
'._stripe_make_request',
return_value={'id': 'pi_3KTk9zAlCFm536g81Wy7RCPH', 'status': 'canceled'},
):
tx._send_void_request()
self.assertEqual(
tx.state, 'cancel', msg="The state should be 'cancel' after voiding the transaction."
)
@mute_logger('odoo.addons.payment_stripe.controllers.main')
def test_webhook_notification_confirms_transaction(self):
""" Test the processing of a webhook notification. """
tx = self._create_transaction('redirect')
url = self._build_url(StripeController._webhook_url)
with patch(
'odoo.addons.payment_stripe.controllers.main.StripeController'
'._verify_notification_signature'
):
self._make_json_request(url, data=self.notification_data)
self.assertEqual(tx.state, 'done')
@mute_logger('odoo.addons.payment_stripe.controllers.main')
def test_webhook_notification_tokenizes_payment_method(self):
""" Test the processing of a webhook notification. """
self._create_transaction('dummy', operation='validation', tokenize=True)
url = self._build_url(StripeController._webhook_url)
payment_method_response = {
'card': {'last4': '4242'},
'id': 'pm_1KVZSNAlCFm536g8sYB92I1G',
'type': 'card'
}
with patch(
'odoo.addons.payment_stripe.controllers.main.StripeController'
'._verify_notification_signature'
), patch(
'odoo.addons.payment_stripe.models.payment_provider.PaymentProvider'
'._stripe_make_request',
return_value=payment_method_response,
), patch(
'odoo.addons.payment_stripe.models.payment_transaction.PaymentTransaction'
'._stripe_tokenize_from_notification_data'
) as tokenize_check_mock:
self._make_json_request(
url, data=dict(self.notification_data, type="setup_intent.succeeded")
)
self.assertEqual(tokenize_check_mock.call_count, 1)
@mute_logger('odoo.addons.payment_stripe.controllers.main')
def test_webhook_notification_triggers_signature_check(self):
""" Test that receiving a webhook notification triggers a signature check. """
self._create_transaction('redirect')
url = self._build_url(StripeController._webhook_url)
with patch(
'odoo.addons.payment_stripe.controllers.main.StripeController'
'._verify_notification_signature'
) as signature_check_mock, patch(
'odoo.addons.payment.models.payment_transaction.PaymentTransaction'
'._handle_notification_data'
):
self._make_json_request(url, data=self.notification_data)
self.assertEqual(signature_check_mock.call_count, 1)
def test_onboarding_action_redirect_to_url(self):
""" Test that the action generate and return an URL when the provider is disabled. """
with patch.object(
type(self.env['payment.provider']), '_stripe_fetch_or_create_connected_account',
return_value={'id': 'dummy'},
), patch.object(
type(self.env['payment.provider']), '_stripe_create_account_link',
return_value='https://dummy.url',
):
onboarding_url = self.stripe.action_stripe_connect_account()
self.assertEqual(onboarding_url['url'], 'https://dummy.url')
def test_only_create_webhook_if_not_already_done(self):
""" Test that a webhook is created only if the webhook secret is not already set. """
self.stripe.stripe_webhook_secret = False
with patch.object(type(self.env['payment.provider']), '_stripe_make_request') as mock:
self.stripe.action_stripe_create_webhook()
self.assertEqual(mock.call_count, 1)
def test_do_not_create_webhook_if_already_done(self):
""" Test that no webhook is created if the webhook secret is already set. """
self.stripe.stripe_webhook_secret = 'dummy'
with patch.object(type(self.env['payment.provider']), '_stripe_make_request') as mock:
self.stripe.action_stripe_create_webhook()
self.assertEqual(mock.call_count, 0)
def test_create_account_link_pass_required_parameters(self):
""" Test that the generation of an account link includes all the required parameters. """
with patch.object(
type(self.env['payment.provider']), '_stripe_make_proxy_request',
return_value={'url': 'https://dummy.url'},
) as mock:
self.stripe._stripe_create_account_link('dummy', 'dummy')
mock.assert_called_once()
call_args = mock.call_args.kwargs['payload'].keys()
for payload_param in ('account', 'return_url', 'refresh_url', 'type'):
self.assertIn(payload_param, call_args)
|