106 lines
4.1 KiB
Python
106 lines
4.1 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import base64
|
|
|
|
from odoo import Command
|
|
from odoo.tests import tagged
|
|
from odoo.exceptions import ValidationError
|
|
from odoo.tools.misc import file_open
|
|
|
|
from odoo.addons.sign.tests.test_sign_controllers import TestSignControllerCommon
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class SignEmsignerCommon(TestSignControllerCommon):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
|
|
emsigner_auth_role = cls.env['sign.item.role'].create({
|
|
'name': 'Emsigner Role',
|
|
'auth_method': 'emsigner'
|
|
})
|
|
|
|
cls.template_emsigner = cls.env['sign.template'].create({
|
|
'name': 'template_emsigner_test',
|
|
})
|
|
|
|
cls.document_emsigner = cls.env['sign.document'].create({
|
|
'attachment_id': cls.attachment.id,
|
|
'template_id': cls.template_emsigner.id,
|
|
})
|
|
|
|
cls.env['sign.item'].create([
|
|
{
|
|
'type_id': cls.env.ref('sign.sign_item_type_signature').id,
|
|
'required': True,
|
|
'responsible_id': emsigner_auth_role.id,
|
|
'page': 1,
|
|
'posX': 0.273,
|
|
'posY': 0.158,
|
|
'document_id': cls.document_emsigner.id,
|
|
'width': 0.150,
|
|
'height': 0.015,
|
|
}
|
|
])
|
|
|
|
cls.sign_request_emsigner = cls.env['sign.request'].create({
|
|
'template_id': cls.template_emsigner.id,
|
|
'reference': cls.template_emsigner.display_name,
|
|
'request_item_ids': [Command.create({
|
|
'partner_id': cls.partner_1.id,
|
|
'role_id': emsigner_auth_role.id,
|
|
})],
|
|
})
|
|
|
|
def create_signature_value(self, sign_item_ids, role_id):
|
|
"""
|
|
Creates a dictionary of signature values for the given sign item IDs and role ID.
|
|
"""
|
|
with file_open('sign/static/demo/signature.png', "rb") as f:
|
|
self.signature_fake = base64.b64encode(f.read())
|
|
return {
|
|
str(sign_id): self.signature_fake.decode('utf-8')
|
|
for sign_id in sign_item_ids
|
|
.filtered(lambda r: not r.responsible_id or r.responsible_id.id == role_id)
|
|
.mapped('id')
|
|
}
|
|
|
|
def test_sign_emsigner_with_sign_is_successful(self):
|
|
"""
|
|
Verifies that signing with valid emSigner status completes successfully.
|
|
Ensures both request item and sign request states are updated correctly.
|
|
"""
|
|
sign_request_item = self.sign_request_emsigner.request_item_ids[0]
|
|
self.assertEqual(sign_request_item.state, 'sent')
|
|
vals = self.create_signature_value(
|
|
self.sign_request_emsigner.template_id.sign_item_ids, sign_request_item.role_id.id
|
|
)
|
|
sign_request_item._sign(vals, validation_required=True)
|
|
self.assertEqual(sign_request_item.state, 'sent')
|
|
sign_request_item.write({
|
|
'emsigner_transaction_number': 'test1234',
|
|
'emsigner_reference_number': 'test3232',
|
|
'emsigner_status': 'success',
|
|
})
|
|
sign_request_item._post_fill_request_item()
|
|
self.assertEqual(sign_request_item.state, 'completed')
|
|
self.assertEqual(self.sign_request_emsigner.state, 'signed')
|
|
|
|
def test_sign_emsigner_without_emsigner_status_raises_error(self):
|
|
"""
|
|
Ensures that signing fails if the emSigner token or status is missing.
|
|
verifies that a ValidationError is raised and states remain unchanged
|
|
"""
|
|
sign_request_item = self.sign_request_emsigner.request_item_ids[0]
|
|
self.assertEqual(sign_request_item.state, 'sent')
|
|
vals = self.create_signature_value(
|
|
self.sign_request_emsigner.template_id.sign_item_ids, sign_request_item.role_id.id
|
|
)
|
|
sign_request_item._sign(vals, validation_required=True)
|
|
self.assertEqual(sign_request_item.state, 'sent')
|
|
with self.assertRaises(ValidationError):
|
|
sign_request_item._post_fill_request_item()
|
|
self.assertEqual(sign_request_item.state, 'sent')
|
|
self.assertEqual(self.sign_request_emsigner.state, 'sent')
|