For payment_buckaroo and payment_sips (at least) running with a non-standard port is an issue to the `test_redirect_form_value` tests: while the form and test will use respectively the base_url and the configuration port, both check a response signature which is predicated upon a base url of `http://127.0.0.1:8069`. This means the test does not pass when run with a different port, and may not pass if the database was installed with a different port either (because this may have caused the `web.base_url` to be set to the installation port). The other payment modules don't seem to have such signature verification and thus apparently don't mind running with non-default port. Update in 15.2: `test_webhook_notification_confirms_transaction` also broke but differently, because the payment utils would fetch (and use) the `web.base.url` they get confused if a db is installed using one port then the tests are run using an other (or something along those lines), despite `HttpCase` trying to set the `web.base.url` (could be an ordering thing). Anyway a working solution seems to be to *remove* the bespoke code from `PaymentTestUtils` and fix `HttpCase.base_url()` so it uses the right port (apparently that'd never been fixed). This does require adapting the patch being forward-ported as `base_url` is now a callable, not an attribute. Also re-remove the attractive nuisance of the odoo.tests.common.PORT constant which does not work: it is evaluated before the configuration has been loaded and is thus always set to the default (8069). closes odoo/odoo#86068 X-original-commit: c28c99f7399da91e1a6176d6f97d4fc947013cae Signed-off-by: Xavier Morel (xmo) <xmo@odoo.com>
70 lines
2.8 KiB
Python
70 lines
2.8 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import logging
|
|
|
|
from lxml import objectify
|
|
from werkzeug import urls
|
|
|
|
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
|
|
from odoo.tools.misc import hmac as hmac_tool
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class PaymentTestUtils(AccountTestInvoicingCommon):
|
|
def _generate_test_access_token(self, *values):
|
|
""" Generate an access token based on the provided values for testing purposes.
|
|
|
|
This methods returns a token identical to that generated by
|
|
payment.utils.generate_access_token but uses the test class environment rather than the
|
|
environment of odoo.http.request.
|
|
|
|
See payment.utils.generate_access_token for additional details.
|
|
|
|
:param list values: The values to use for the generation of the token
|
|
:return: The generated access token
|
|
:rtype: str
|
|
"""
|
|
token_str = '|'.join(str(val) for val in values)
|
|
access_token = hmac_tool(self.env(su=True), 'generate_access_token', token_str)
|
|
return access_token
|
|
|
|
def _build_url(self, route):
|
|
return urls.url_join(self.base_url(), route)
|
|
|
|
def _extract_values_from_html_form(self, html_form):
|
|
""" Extract the transaction rendering values from an HTML form.
|
|
|
|
:param str html_form: The HTML form
|
|
:return: The extracted information (action & inputs)
|
|
:rtype: dict[str:str]
|
|
"""
|
|
html_tree = objectify.fromstring(html_form)
|
|
action = html_tree.get('action')
|
|
inputs = {form_input.get('name'): form_input.get('value') for form_input in html_tree.input}
|
|
return {
|
|
'action': action,
|
|
'inputs': inputs,
|
|
}
|
|
|
|
def _assert_does_not_raise(self, exception_class, func, *args, **kwargs):
|
|
""" Fail if an exception of the provided class is raised when calling the function.
|
|
|
|
If an exception of any other class is raised, it is caught and silently ignored.
|
|
|
|
This method cannot be used with functions that make requests. Any exception raised in the
|
|
scope of the new request will not be caught and will make the test fail.
|
|
|
|
:param class exception_class: The class of the exception to monitor
|
|
:param function fun: The function to call when monitoring for exceptions
|
|
:param list args: The positional arguments passed as-is to the called function
|
|
:param dict kwargs: The keyword arguments passed as-is to the called function
|
|
:return: None
|
|
"""
|
|
try:
|
|
func(*args, **kwargs)
|
|
except exception_class:
|
|
self.fail(f"{func.__name__} should not raise error of class {exception_class.__name__}")
|
|
except Exception:
|
|
pass # Any exception whose class is not monitored is caught and ignored
|