Skip to content

Commit e50cc79

Browse files
committed
[IMP] edi_voxel_oca: Added a unit test coverage initial.
1 parent f9df81b commit e50cc79

File tree

5 files changed

+171
-0
lines changed

5 files changed

+171
-0
lines changed

edi_voxel_oca/tests/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from . import test_queue_job
2+
from . import test_res_company
3+
from . import test_res_partner
4+
from . import test_voxel_mixin

edi_voxel_oca/tests/test_queue_job.py

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Copyright 2019 Tecnativa - Ernesto Tejeda
2+
# Copyright 2025 Guavana - Leonardo J. Caballero G.
3+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
4+
5+
from odoo.tests.common import TransactionCase
6+
7+
class TestQueueJob(TransactionCase):
8+
9+
def setUp(self):
10+
super(TestQueueJob, self).setUp()
11+
self.queue_job = self.env['queue.job'].create({
12+
'name': 'Test Job',
13+
'state': 'pending',
14+
})
15+
16+
def test_voxel_do_now(self):
17+
self.queue_job.voxel_do_now()
18+
self.assertFalse(self.queue_job.eta, "ETA should be set to False")
19+
20+
def test_voxel_cancel_now(self):
21+
self.queue_job.voxel_cancel_now()
22+
self.assertFalse(self.queue_job.exists(), "Job should be unlinked if in pending, enqueued, or failed state")
23+
24+
def test_voxel_requeue_sudo(self):
25+
self.queue_job.voxel_requeue_sudo()
26+
self.assertEqual(self.queue_job.state, 'enqueued', "Job should be requeued")
+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Copyright 2019 Tecnativa - Ernesto Tejeda
2+
# Copyright 2025 Guavana - Leonardo J. Caballero G.
3+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
4+
5+
from odoo.tests.common import TransactionCase
6+
from datetime import datetime, timedelta
7+
import pytz
8+
9+
class TestResCompany(TransactionCase):
10+
11+
def setUp(self):
12+
super(TestResCompany, self).setUp()
13+
self.company = self.env['res.company'].create({
14+
'name': 'Test Company',
15+
'voxel_enabled': True,
16+
'voxel_send_mode': 'auto',
17+
'voxel_sent_time': 12.0,
18+
'voxel_delay_time': 2.0,
19+
})
20+
21+
def test_get_voxel_report_eta_auto(self):
22+
self.company.voxel_send_mode = 'auto'
23+
eta = self.company._get_voxel_report_eta()
24+
self.assertIsNone(eta, "ETA should be None for auto send mode")
25+
26+
def test_get_voxel_report_eta_fixed(self):
27+
self.company.voxel_send_mode = 'fixed'
28+
tz = self.env.context.get("tz", self.env.user.partner_id.tz) or 'UTC'
29+
offset = datetime.now(pytz.timezone(tz)).strftime("%z")
30+
hour_diff = int(offset[:3])
31+
expected_hour = int(12 - hour_diff)
32+
now = datetime.now()
33+
if now.hour > expected_hour:
34+
now += timedelta(days=1)
35+
expected_eta = now.replace(hour=expected_hour, minute=0, second=0, microsecond=0)
36+
eta = self.company._get_voxel_report_eta()
37+
self.assertEqual(eta, expected_eta, "ETA should match the expected fixed time")
38+
39+
def test_get_voxel_report_eta_delayed(self):
40+
self.company.voxel_send_mode = 'delayed'
41+
expected_eta = datetime.now() + timedelta(hours=2)
42+
eta = self.company._get_voxel_report_eta()
43+
self.assertIsNotNone(eta, "ETA should not be None for delayed send mode")
44+
self.assertAlmostEqual(eta, expected_eta, msg="ETA should be 2 hours from now for delayed send mode", delta=timedelta(seconds=1))
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Copyright 2019 Tecnativa - Ernesto Tejeda
2+
# Copyright 2025 Guavana - Leonardo J. Caballero G.
3+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
4+
5+
from odoo.tests.common import TransactionCase
6+
7+
class TestResPartner(TransactionCase):
8+
9+
def setUp(self):
10+
super(TestResPartner, self).setUp()
11+
self.partner = self.env['res.partner'].create({
12+
'name': 'Test Partner',
13+
'vat': 'ES12345678',
14+
'voxel_enabled': True,
15+
})
16+
17+
def test_commercial_fields(self):
18+
commercial_fields = self.partner._commercial_fields()
19+
self.assertIn('voxel_enabled', commercial_fields, "voxel_enabled should be in the commercial fields")
20+
21+
def test_get_voxel_vat_with_prefix(self):
22+
vat = self.partner._get_voxel_vat()
23+
self.assertEqual(vat, '12345678', "VAT should be stripped of the 'ES' prefix")
24+
25+
def test_get_voxel_vat_without_prefix(self):
26+
self.partner.vat = '12345678'
27+
vat = self.partner._get_voxel_vat()
28+
self.assertEqual(vat, '12345678', "VAT should remain unchanged if no 'ES' prefix")
+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Copyright 2019 Tecnativa - Ernesto Tejeda
2+
# Copyright 2025 Guavana - Leonardo J. Caballero G.
3+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
4+
5+
from odoo.tests.common import TransactionCase
6+
from unittest.mock import patch, MagicMock
7+
from datetime import datetime, timedelta
8+
9+
class TestVoxelMixin(TransactionCase):
10+
11+
def setUp(self):
12+
super(TestVoxelMixin, self).setUp()
13+
self.company = self.env['res.company'].create({
14+
'name': 'Test Company',
15+
'voxel_enabled': True,
16+
})
17+
self.mixin = self.env['voxel.mixin'].create({
18+
'voxel_state': 'not_sent',
19+
# 'company_id': self.company.id,
20+
})
21+
22+
@patch('odoo.addons.edi_voxel_oca.models.voxel_mixin.requests.put')
23+
def test_send_voxel_report_success(self, mock_put):
24+
mock_put.return_value.status_code = 200
25+
self.mixin._send_voxel_report('Outbox', 'test.xml', b'<xml></xml>')
26+
self.assertEqual(self.mixin.voxel_state, 'sent', "Voxel state should be 'sent'")
27+
28+
@patch('odoo.addons.edi_voxel_oca.models.voxel_mixin.requests.put')
29+
def test_send_voxel_report_failure(self, mock_put):
30+
mock_put.return_value.status_code = 500
31+
with self.assertRaises(Exception):
32+
self.mixin._send_voxel_report('Outbox', 'test.xml', b'<xml></xml>')
33+
self.assertEqual(self.mixin.voxel_state, 'sent_errors', "Voxel state should be 'sent_errors'")
34+
35+
@patch('odoo.addons.edi_voxel_oca.models.voxel_mixin.requests.get')
36+
def test_list_voxel_document_filenames(self, mock_get):
37+
mock_get.return_value.status_code = 200
38+
mock_get.return_value.content = b'test1.xml\ntest2.xml\n'
39+
filenames = self.mixin._list_voxel_document_filenames('Outbox', self.company)
40+
self.assertEqual(filenames, ['test1.xml', 'test2.xml'], "Filenames should match the expected list")
41+
42+
@patch('odoo.addons.edi_voxel_oca.models.voxel_mixin.requests.get')
43+
def test_read_voxel_document(self, mock_get):
44+
mock_get.return_value.status_code = 200
45+
mock_get.return_value.content = b'<xml></xml>'
46+
content = self.mixin._read_voxel_document('Inbox', self.company, 'test.xml')
47+
self.assertEqual(content, '<xml></xml>', "Content should match the expected XML")
48+
49+
@patch('odoo.addons.edi_voxel_oca.models.voxel_mixin.requests.delete')
50+
def test_delete_voxel_document(self, mock_delete):
51+
mock_delete.return_value.status_code = 200
52+
self.mixin._delete_voxel_document('Inbox', 'test.xml', self.company)
53+
mock_delete.assert_called_once()
54+
55+
def test_get_voxel_filename(self):
56+
self.mixin.get_document_type = MagicMock(return_value='INV')
57+
filename = self.mixin._get_voxel_filename()
58+
self.assertTrue(filename.startswith('INV_'), "Filename should start with 'INV_'")
59+
self.assertTrue(filename.endswith('.xml'), "Filename should end with '.xml'")
60+
61+
def test_cancel_voxel_jobs(self):
62+
job = self.env['queue.job'].create({
63+
'name': 'Test Job',
64+
'state': 'pending',
65+
})
66+
self.mixin.voxel_job_ids = [(4, job.id)]
67+
self.mixin._cancel_voxel_jobs()
68+
self.assertEqual(self.mixin.voxel_state, 'cancelled', "Voxel state should be 'cancelled'")
69+
self.assertFalse(job.exists(), "Job should be unlinked")

0 commit comments

Comments
 (0)