Files
report-print-send/pingen/tests/test_pingen.py
Anna Janiszewska 0d8676547a [MIG] pingen: Migration to 16.0
Standard migration, incl. changes proposed in https://github.com/OCA/report-print-send/pull/290/
Add unit test.
2023-12-28 10:46:26 +01:00

209 lines
8.8 KiB
Python

# Copyright 2012-2023 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
import base64
import json
import logging
from os.path import dirname, join
from unittest.mock import patch
from freezegun import freeze_time
from vcr import VCR
from odoo.tests import tagged
from odoo.tests.common import HttpCase
from odoo.addons.website.tools import MockRequest
from ..controllers.main import PingenController
vcr_pingen = VCR(
record_mode="once",
cassette_library_dir=join(dirname(__file__), "fixtures/cassettes"),
path_transformer=VCR.ensure_suffix(".yaml"),
match_on=("method", "uri"),
decode_compressed_response=True,
)
logging.basicConfig()
vcr_log = logging.getLogger("vcr")
vcr_log.setLevel(logging.INFO)
@tagged("post_install", "-at_install")
class TestPingen(HttpCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.company = cls.env.user.company_id
cls.company.pingen_clientid = "1234"
cls.company.pingen_client_secretid = "1234567893"
cls.company.pingen_organization = "4c08c24e-65f8-47cf-b280-518ee76e3437"
cls.company.pingen_staging = True
cls.pc = PingenController()
# flake8: noqa: B950
def get_request_json(self, uuid):
return json.dumps(
{
"data": {
"type": "webhook_issues",
"id": "735582d1-ccdf-423a-b493-1b3a6935df29",
"attributes": {
"reason": "Validation failed",
"url": r"https:\/\/36f4-2a02-1210-3497-c400-296e-3b7-6940-e38b.ngrok-free.app\/\/pingen\/letter_issues",
"created_at": "2023-05-19T09:35:01+0200",
},
"relationships": {
"organisation": {
"links": {
"related": r"https:\/\/identity-staging.pingen.com\/organisations\/4c08c24e-65f8-47cf-b280-518ee76e3437"
},
"data": {
"type": "organisations",
"id": "4c08c24e-65f8-47cf-b280-518ee76e3437",
},
},
"letter": {
"links": {
"related": r"https:\/\/identity-staging.pingen.com\/organisations\/4c08c24e-65f8-47cf-b280-518ee76e3437\/letters\/ddd105d8-42f6-4357-a103-9b2449bbd8e2"
},
"data": {
"type": "letters",
"id": uuid,
},
},
"event": {
"data": {
"type": "letters_events",
"id": "a9612d08-81c0-4259-8b0a-648c85377f71",
}
},
},
},
"included": [
{
"type": "organisations",
"id": "4c08c24e-65f8-47cf-b280-518ee76e3437",
"attributes": {
"name": "c2c",
"status": "active",
"plan": "free",
"billing_mode": "prepaid",
"billing_currency": "CHF",
"billing_balance": 199995.56,
"default_country": "CH",
"default_address_position": "right",
"data_retention_addresses": 6,
"data_retention_pdf": 1,
"color": "#0758FF",
"created_at": "2022-10-19T16:08:17+0200",
"updated_at": "2023-02-24T14:06:17+0100",
},
"links": {
"self": r"https:\/\/identity-staging.pingen.com\/organisations\/4c08c24e-65f8-47cf-b280-518ee76e3437"
},
},
{
"type": "letters",
"id": "ddd105d8-42f6-4357-a103-9b2449bbd8e2",
"attributes": {
"status": "action_required",
"file_original_name": "in_invoice_yourcompany_demo.pdf",
"file_pages": 1,
"address": "405 Pushp Business Campus\n,\nhmedabad, Gujarat, 382418\nnfo@azureinterior.com\n+92 7405987125",
"address_position": "left",
"country": "CH",
"delivery_product": "cheap",
"print_mode": "simplex",
"print_spectrum": "grayscale",
"price_currency": False,
"price_value": False,
"paper_types": ["normal"],
"fonts": [
{
"name": "LiberationSans",
"is_embedded": True,
},
{
"name": "Tibetan_Machine_Uni",
"is_embedded": True,
},
{
"name": "Chandas",
"is_embedded": True,
},
{
"name": "DejaVuSans-Bold",
"is_embedded": True,
},
{
"name": "DejaVuSans",
"is_embedded": True,
},
],
"source": "api",
"tracking_number": False,
"submitted_at": False,
"created_at": "2023-05-19T09:34:31+0200",
"updated_at": "2023-05-19T09:34:33+0200",
},
"links": {
"self": r"https:\/\/identity-staging.pingen.com\/organisations\/4c08c24e-65f8-47cf-b280-518ee76e3437\/letters\/ddd105d8-42f6-4357-a103-9b2449bbd8e2"
},
},
{
"type": "letters_events",
"id": "a9612d08-81c0-4259-8b0a-648c85377f71",
"attributes": {
"code": "content_failed_inspection",
"name": "Validation failed",
"producer": "Pingen",
"location": "",
"has_image": False,
"data": [],
"emitted_at": "2023-05-19T09:34:33+0200",
"created_at": "2023-05-19T09:34:33+0200",
"updated_at": "2023-05-19T09:34:33+0200",
},
},
],
}
)
@vcr_pingen.use_cassette
@freeze_time("2023-05-19")
def test_pingen_push_document(self):
attachment = self.env["ir.attachment"].create(
{
"name": "in_invoice_yourcompany_demo.pdf",
"datas": base64.b64encode(bytes("", "utf8")),
"type": "binary",
}
)
attachment.write({"send_to_pingen": True})
pingen_document = attachment.pingen_document_ids
pingen_document.push_to_pingen()
self.assertEqual(pingen_document.state, "pushed")
# as the demo invoice report does not meet pingen requirements,
# pingen will notify us about it on letter_issues webhook
with patch(
"odoo.addons.pingen.controllers.main.PingenController._get_request_content"
) as mocked_function, MockRequest(self.env) as mock_request:
mocked_function.return_value = self.get_request_json(
pingen_document.pingen_uuid
)
mock_request.httprequest.method = "POST"
# avoid checking signature when calling webhooks
with patch(
"odoo.addons.pingen.controllers.main.PingenController._verify_signature"
) as mocked_verify_sign:
mocked_verify_sign.return_value = True
self.pc.letter_issues()
self.assertEqual(pingen_document.state, "pingen_error")
self.assertEqual(pingen_document.last_error_message, "Validation failed")