diff --git a/edi_webservice_oca/README.rst b/edi_webservice_oca/README.rst new file mode 100644 index 000000000..b570d8b64 --- /dev/null +++ b/edi_webservice_oca/README.rst @@ -0,0 +1,137 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +============== +EDI WebService +============== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:53a13902ac3279b551922ef5e3577b1cebf49ef7b9eca8bed55ee901b04b50d2 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi--framework-lightgray.png?logo=github + :target: https://github.com/OCA/edi-framework/tree/19.0/edi_webservice_oca + :alt: OCA/edi-framework +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/edi-framework-19-0/edi-framework-19-0-edi_webservice_oca + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/edi-framework&target_branch=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Plug webservice module within EDI framework. Allows to configure attach +webservices on an EDI backend and/or on an exchange type. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Go to "EDI -> Config -> Backends" and edit or create one. Find the tab +"Webservice" and add a webservice. On the webservice record you can +specify all the general parameters to connect to the service (see +webservice README for more details). + +If you want to take full control on if/how the webservice is used you +can do it via exchange type's advanced settings. + +Hence, assuming your webservice has a URL configured as +\`\ https://my.endpoint/%7Bpath%7D\ \`: + +:: + + components: + send: + usage: webservice.send # or any custom component usage inheriting from this + work_ctx: + webservice: + method: post # mandatory + url_params: + path: endpoint1/foo + +For each call related to this type, you'll get a POST request against +https://my.endpoint/endpoint/foo. + +``url_params`` can contain all the keys need for URL interpolation. + +In addition, you can user ``url`` to override the full url used for the +call per exchange type. + +If you want to send data as bytes you can use the option send_as_bytes +like: + +:: + + [...] + webservice: + send_as_bytes: true + [...] + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Dixmit +* Camptocamp + +Contributors +------------ + +- Enric Tobella +- Simone Orsi + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-etobella| image:: https://github.com/etobella.png?size=40px + :target: https://github.com/etobella + :alt: etobella +.. |maintainer-simahawk| image:: https://github.com/simahawk.png?size=40px + :target: https://github.com/simahawk + :alt: simahawk + +Current `maintainers `__: + +|maintainer-etobella| |maintainer-simahawk| + +This module is part of the `OCA/edi-framework `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/edi_webservice_oca/__init__.py b/edi_webservice_oca/__init__.py new file mode 100644 index 000000000..f24d3e242 --- /dev/null +++ b/edi_webservice_oca/__init__.py @@ -0,0 +1,2 @@ +from . import components +from . import models diff --git a/edi_webservice_oca/__manifest__.py b/edi_webservice_oca/__manifest__.py new file mode 100644 index 000000000..23e55fb3b --- /dev/null +++ b/edi_webservice_oca/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2020 Dixmit +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "EDI WebService", + "summary": """ + Defines webservice integration from EDI Exchange records""", + "version": "19.0.1.0.0", + "license": "AGPL-3", + "development_status": "Beta", + "author": "Dixmit, Camptocamp, Odoo Community Association (OCA)", + "maintainers": ["etobella", "simahawk"], + "website": "https://github.com/OCA/edi-framework", + "depends": ["edi_component_oca", "webservice"], + "data": ["views/edi_backend.xml", "security/ir.model.access.csv"], + "demo": ["demo/edi_backend.xml"], +} diff --git a/edi_webservice_oca/components/__init__.py b/edi_webservice_oca/components/__init__.py new file mode 100644 index 000000000..e974cb6fa --- /dev/null +++ b/edi_webservice_oca/components/__init__.py @@ -0,0 +1 @@ +from . import send diff --git a/edi_webservice_oca/components/send.py b/edi_webservice_oca/components/send.py new file mode 100644 index 000000000..e42e345f7 --- /dev/null +++ b/edi_webservice_oca/components/send.py @@ -0,0 +1,48 @@ +# Copyright 2022 Camptocamp SA +# @author: Simone Orsi +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, exceptions + +from odoo.addons.component.core import Component + + +class EDIWebserviceSend(Component): + """Generic component for webservice requests. + + Configuration is expected to come from the work ctx key `webservice`. + You can easily pass via exchange type advanced settings. + """ + + _name = "edi.webservice.send" + _inherit = [ + "edi.component.mixin", + ] + _usage = "webservice.send" + + def __init__(self, work_context): + super().__init__(work_context) + self.ws_settings = getattr(work_context, "webservice", {}) + self.webservice_backend = self.backend.webservice_backend_id + + def send(self): + method, pargs, kwargs = self._get_call_params() + return self.webservice_backend.call(method, *pargs, **kwargs) + + def _get_call_params(self): + try: + method = self.ws_settings["method"].lower() + except KeyError as err: + raise exceptions.UserError( + _("`method` is required in `webservice` type settings.") + ) from err + pargs = self.ws_settings.get("pargs", []) + kwargs = self.ws_settings.get("kwargs", {}) + kwargs["data"] = self._get_data() + return method, pargs, kwargs + + def _get_data(self): + # By sending as bytes `requests` won't try to guess and/or alter the encoding. + # TODO: add tests + as_bytes = self.ws_settings.get("send_as_bytes") + return self.exchange_record._get_file_content(as_bytes=as_bytes) diff --git a/edi_webservice_oca/demo/edi_backend.xml b/edi_webservice_oca/demo/edi_backend.xml new file mode 100644 index 000000000..5c0346242 --- /dev/null +++ b/edi_webservice_oca/demo/edi_backend.xml @@ -0,0 +1,20 @@ + + + + Demo backend + edi_demo_ws + http + https://foo.test/{endpoint} + application/xml + none + + + Demo backend type WS + demo_ws_backend + + + Demo backend w/ WS + + + + diff --git a/edi_webservice_oca/i18n/edi_webservice.pot b/edi_webservice_oca/i18n/edi_webservice.pot new file mode 100644 index 000000000..7b5cc9214 --- /dev/null +++ b/edi_webservice_oca/i18n/edi_webservice.pot @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * edi_webservice +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: edi_webservice +#: model:ir.model,name:edi_webservice.model_edi_backend +msgid "EDI Backend" +msgstr "" + +#. module: edi_webservice +#: model:ir.model.fields,field_description:edi_webservice.field_edi_backend__webservice_backend_id +msgid "Webservice Backend" +msgstr "" diff --git a/edi_webservice_oca/i18n/edi_webservice_oca.pot b/edi_webservice_oca/i18n/edi_webservice_oca.pot new file mode 100644 index 000000000..1fcb0bda3 --- /dev/null +++ b/edi_webservice_oca/i18n/edi_webservice_oca.pot @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * edi_webservice_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: edi_webservice_oca +#: model:ir.model,name:edi_webservice_oca.model_edi_backend +msgid "EDI Backend" +msgstr "" + +#. module: edi_webservice_oca +#: model_terms:ir.ui.view,arch_db:edi_webservice_oca.edi_backend_view_form +msgid "Webservice" +msgstr "" + +#. module: edi_webservice_oca +#: model:ir.model.fields,field_description:edi_webservice_oca.field_edi_backend__webservice_backend_id +msgid "Webservice Backend" +msgstr "" + +#. module: edi_webservice_oca +#. odoo-python +#: code:addons/edi_webservice_oca/components/send.py:0 +msgid "`method` is required in `webservice` type settings." +msgstr "" diff --git a/edi_webservice_oca/i18n/it.po b/edi_webservice_oca/i18n/it.po new file mode 100644 index 000000000..3863eea59 --- /dev/null +++ b/edi_webservice_oca/i18n/it.po @@ -0,0 +1,39 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * edi_webservice_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-05-13 12:34+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: edi_webservice_oca +#: model:ir.model,name:edi_webservice_oca.model_edi_backend +msgid "EDI Backend" +msgstr "Backend EDI" + +#. module: edi_webservice_oca +#: model_terms:ir.ui.view,arch_db:edi_webservice_oca.edi_backend_view_form +msgid "Webservice" +msgstr "Servizio web" + +#. module: edi_webservice_oca +#: model:ir.model.fields,field_description:edi_webservice_oca.field_edi_backend__webservice_backend_id +msgid "Webservice Backend" +msgstr "Backend servizio web" + +#. module: edi_webservice_oca +#. odoo-python +#: code:addons/edi_webservice_oca/components/send.py:0 +#, python-format +msgid "`method` is required in `webservice` type settings." +msgstr "`method` è richiesto nelle impostazioni tipo `webservice`." diff --git a/edi_webservice_oca/models/__init__.py b/edi_webservice_oca/models/__init__.py new file mode 100644 index 000000000..4b2c54ac3 --- /dev/null +++ b/edi_webservice_oca/models/__init__.py @@ -0,0 +1 @@ +from . import edi_backend diff --git a/edi_webservice_oca/models/edi_backend.py b/edi_webservice_oca/models/edi_backend.py new file mode 100644 index 000000000..c232d6e2b --- /dev/null +++ b/edi_webservice_oca/models/edi_backend.py @@ -0,0 +1,37 @@ +# Copyright 2020 Dixmit +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class EdiBackend(models.Model): + _inherit = "edi.backend" + + webservice_backend_id = fields.Many2one("webservice.backend") + _webservice_actions = ("send", "receive") + + def _get_component_usage_candidates(self, exchange_record, key): + candidates = super()._get_component_usage_candidates(exchange_record, key) + ws_backend = self.webservice_backend_id.sudo() + if not ws_backend or key not in self._webservice_actions: + return candidates + return [f"webservice.{key}"] + candidates + + def _component_match_attrs(self, exchange_record, key): + # Override to inject `webservice_protocol` as match attribute + res = super()._component_match_attrs(exchange_record, key) + ws_backend = self.webservice_backend_id.sudo() + if not ws_backend or key not in self._webservice_actions: + return res + res["webservice_protocol"] = ws_backend.protocol + return res + + def _component_sort_key(self, component_class): + res = super()._component_sort_key(component_class) + ws_backend = self.webservice_backend_id + # Override to give precedence by `webservice_protocol` when needed. + if not ws_backend: + return res + return ( + 1 if getattr(component_class, "_webservice_protocol", False) else 0, + ) + res diff --git a/edi_webservice_oca/pyproject.toml b/edi_webservice_oca/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/edi_webservice_oca/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/edi_webservice_oca/readme/CONFIGURE.md b/edi_webservice_oca/readme/CONFIGURE.md new file mode 100644 index 000000000..bb47d4dae --- /dev/null +++ b/edi_webservice_oca/readme/CONFIGURE.md @@ -0,0 +1,35 @@ +Go to "EDI -\> Config -\> Backends" and edit or create one. Find the tab +"Webservice" and add a webservice. On the webservice record you can +specify all the general parameters to connect to the service (see +webservice README for more details). + +If you want to take full control on if/how the webservice is used you +can do it via exchange type's advanced settings. + +Hence, assuming your webservice has a URL configured as +\`\`: + + components: + send: + usage: webservice.send # or any custom component usage inheriting from this + work_ctx: + webservice: + method: post # mandatory + url_params: + path: endpoint1/foo + +For each call related to this type, you'll get a POST request against +https://my.endpoint/endpoint/foo. + +`url_params` can contain all the keys need for URL interpolation. + +In addition, you can user `url` to override the full url used for the +call per exchange type. + +If you want to send data as bytes you can use the option send_as_bytes +like: + + [...] + webservice: + send_as_bytes: true + [...] diff --git a/edi_webservice_oca/readme/CONTRIBUTORS.md b/edi_webservice_oca/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..86f1c6189 --- /dev/null +++ b/edi_webservice_oca/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Enric Tobella \<\> +- Simone Orsi \<\> diff --git a/edi_webservice_oca/readme/DESCRIPTION.md b/edi_webservice_oca/readme/DESCRIPTION.md new file mode 100644 index 000000000..f5419e349 --- /dev/null +++ b/edi_webservice_oca/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +Plug webservice module within EDI framework. Allows to configure attach +webservices on an EDI backend and/or on an exchange type. diff --git a/edi_webservice_oca/security/ir.model.access.csv b/edi_webservice_oca/security/ir.model.access.csv new file mode 100644 index 000000000..03c66bda8 --- /dev/null +++ b/edi_webservice_oca/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_webservice_backend_edi_manager,webservice_backend edi manager,webservice.model_webservice_backend,base_edi.group_edi_manager,1,1,1,1 diff --git a/edi_webservice_oca/static/description/icon.png b/edi_webservice_oca/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/edi_webservice_oca/static/description/icon.png differ diff --git a/edi_webservice_oca/static/description/index.html b/edi_webservice_oca/static/description/index.html new file mode 100644 index 000000000..59b64f6d1 --- /dev/null +++ b/edi_webservice_oca/static/description/index.html @@ -0,0 +1,469 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

EDI WebService

+ +

Beta License: AGPL-3 OCA/edi-framework Translate me on Weblate Try me on Runboat

+

Plug webservice module within EDI framework. Allows to configure attach +webservices on an EDI backend and/or on an exchange type.

+

Table of contents

+ +
+

Configuration

+

Go to “EDI -> Config -> Backends” and edit or create one. Find the tab +“Webservice” and add a webservice. On the webservice record you can +specify all the general parameters to connect to the service (see +webservice README for more details).

+

If you want to take full control on if/how the webservice is used you +can do it via exchange type’s advanced settings.

+

Hence, assuming your webservice has a URL configured as +`https://my.endpoint/%7Bpath%7D`:

+
+components:
+  send:
+    usage: webservice.send  # or any custom component usage inheriting from this
+    work_ctx:
+      webservice:
+        method: post  # mandatory
+        url_params:
+          path: endpoint1/foo
+
+

For each call related to this type, you’ll get a POST request against +https://my.endpoint/endpoint/foo.

+

url_params can contain all the keys need for URL interpolation.

+

In addition, you can user url to override the full url used for the +call per exchange type.

+

If you want to send data as bytes you can use the option send_as_bytes +like:

+
+[...]
+      webservice:
+        send_as_bytes: true
+[...]
+
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Dixmit
  • +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainers:

+

etobella simahawk

+

This module is part of the OCA/edi-framework project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+
+ + diff --git a/edi_webservice_oca/tests/__init__.py b/edi_webservice_oca/tests/__init__.py new file mode 100644 index 000000000..825af6718 --- /dev/null +++ b/edi_webservice_oca/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_backend +from . import test_send diff --git a/edi_webservice_oca/tests/common.py b/edi_webservice_oca/tests/common.py new file mode 100644 index 000000000..3bd9c1f9d --- /dev/null +++ b/edi_webservice_oca/tests/common.py @@ -0,0 +1,24 @@ +# Copyright 2022 Camptocamp SA +# @author Simone Orsi +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import base64 + +from odoo.addons.edi_component_oca.tests.common import EDIBackendCommonComponentTestCase + + +class TestEDIWebserviceBase(EDIBackendCommonComponentTestCase): + @classmethod + def _get_backend(cls): + return cls.env.ref("edi_webservice_oca.demo_edi_backend") + + @classmethod + def _setup_records(cls): + result = super()._setup_records() + cls.filedata = base64.b64encode(b"This is a simple file") + vals = { + "model": cls.partner._name, + "res_id": cls.partner.id, + "exchange_file": cls.filedata, + } + cls.record = cls.backend.create_record("test_csv_output", vals) + return result diff --git a/edi_webservice_oca/tests/test_backend.py b/edi_webservice_oca/tests/test_backend.py new file mode 100644 index 000000000..60e039982 --- /dev/null +++ b/edi_webservice_oca/tests/test_backend.py @@ -0,0 +1,48 @@ +# Copyright 2020 Dixmit +# @author: Enric Tobella +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.edi_core_oca.tests.common import EDIBackendCommonTestCase + + +class TestEdiWebService(EDIBackendCommonTestCase): + @classmethod + def _setup_records(cls): + result = super()._setup_records() + cls.webservice = cls.env["webservice.backend"].create( + { + "name": "WebService", + "protocol": "http", + "url": "https://localhost.demo.odoo/", + "content_type": "application/xml", + "tech_name": "demo_ws", + "auth_type": "none", + } + ) + vals = { + "model": cls.partner._name, + "res_id": cls.partner.id, + } + cls.record = cls.backend.create_record("test_csv_input", vals) + return result + + def test_components_with_ws(self): + self.backend.webservice_backend_id = self.webservice + components = self.backend._get_component_usage_candidates(self.record, "send") + self.assertIn("webservice.send", components) + + def test_components_without_ws(self): + components = self.backend._get_component_usage_candidates(self.record, "send") + self.assertNotIn("webservice.send", components) + + def test_component_lookup_avg_user(self): + """Ensure normal users can run the component lookup methods.""" + user = ( + self.env["res.users"] + .with_context(no_reset_password=True) + .create({"name": "Test EDI WS User", "login": "test_edi_ws_perm_user"}) + ) + backend = self.backend.with_user(user) + backend.sudo().webservice_backend_id = self.webservice + backend._get_component_usage_candidates(self.record, "send") + backend._component_match_attrs(self.record, "send") diff --git a/edi_webservice_oca/tests/test_send.py b/edi_webservice_oca/tests/test_send.py new file mode 100644 index 000000000..f4a2198c3 --- /dev/null +++ b/edi_webservice_oca/tests/test_send.py @@ -0,0 +1,106 @@ +# Copyright 2022 Camptocamp SA +# @author Simone Orsi +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from urllib.parse import urlparse + +import responses +from requests import PreparedRequest, Session + +from odoo import exceptions + +from .common import TestEDIWebserviceBase + + +class TestSend(TestEDIWebserviceBase): + @classmethod + def setUpClass(cls): + cls._super_send = Session.send + super().setUpClass() + + @classmethod + def _setup_records(cls): + result = super()._setup_records() + cls.ws_backend = cls.backend.webservice_backend_id + cls.settings1 = """ + components: + send: + usage: webservice.send + work_ctx: + webservice: + _no_method: post + pargs: + - foo + - bar + kwargs: + random: 1 + url_params: + endpoint: push/here + """ + cls.settings2 = """ + components: + send: + usage: webservice.send + work_ctx: + webservice: + method: post + kwargs: + url_params: + endpoint: push/here + """ + cls.record.type_id.set_settings(cls.settings1) + return result + + @classmethod + def _request_handler(cls, s: Session, r: PreparedRequest, /, **kw): + # Allow request to test custom URL + if urlparse(r.url).netloc == "foo.test": + return cls._super_send(s, r) + return super()._request_handler(s, r, **kw) + + def test_find_component(self): + component = self.backend._get_component(self.record, "send") + self.assertEqual(component._name, "edi.webservice.send") + + def test_component_settings(self): + component = self.backend._get_component(self.record, "send") + self.assertEqual( + component.ws_settings, + { + "_no_method": "post", + "pargs": ["foo", "bar"], + "kwargs": { + "random": 1, + "url_params": { + "endpoint": "push/here", + }, + }, + }, + ) + + def test_component_no_method(self): + component = self.backend._get_component(self.record, "send") + msg = "`method` is required in `webservice` type settings" + with self.assertRaisesRegex(exceptions.UserError, msg): + component._get_call_params() + + def test_component_params(self): + self.record.type_id.set_settings(self.settings2) + component = self.backend._get_component(self.record, "send") + method, pargs, kwargs = component._get_call_params() + self.assertEqual(method, "post") + self.assertEqual(len(kwargs), 2) + self.assertEqual(kwargs["data"], "This is a simple file") + self.assertEqual(kwargs["url_params"], {"endpoint": "push/here"}) + + @responses.activate + def test_component_send(self): + self.record.type_id.set_settings(self.settings2) + url = "https://foo.test/push/here" + responses.add(responses.POST, url, body="{}") + component = self.backend._get_component(self.record, "send") + result = component.send() + self.assertEqual(result, b"{}") + self.assertEqual( + responses.calls[0].request.headers["Content-Type"], "application/xml" + ) + self.assertEqual(responses.calls[0].request.body, "This is a simple file") diff --git a/edi_webservice_oca/views/edi_backend.xml b/edi_webservice_oca/views/edi_backend.xml new file mode 100644 index 000000000..b2a71d774 --- /dev/null +++ b/edi_webservice_oca/views/edi_backend.xml @@ -0,0 +1,18 @@ + + + + + edi.backend + + + + + + + + + + + + diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 4ec60a70e..000000000 --- a/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -# generated from manifests external_dependencies -PyYAML -openupgradelib