Skip to content

Commit f64b966

Browse files
committed
[IMP] queue_job: remove DB commits within test of requeue
1 parent 5c57177 commit f64b966

File tree

5 files changed

+88
-54
lines changed

5 files changed

+88
-54
lines changed

queue_job/__manifest__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
"category": "Generic Modules",
1010
"depends": ["mail", "base_sparse_field", "web"],
1111
"external_dependencies": {"python": ["requests"]},
12+
"demo": [
13+
"demo/queue_job_test_lock.xml",
14+
],
1215
"data": [
1316
"security/security.xml",
1417
"security/ir.model.access.csv",
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo noupdate="1">
3+
<!--
4+
To be used in tests cfr. test/test_requeue_dead_job.py
5+
These 'test' data are loaded as 'demo' data to have records within db
6+
and avoid doing commit within tests
7+
-->
8+
<function
9+
name="_create_test_started_job"
10+
model="queue.job"
11+
eval="('test_started_job',)"
12+
/>
13+
<function
14+
name="_create_test_enqueued_job"
15+
model="queue.job"
16+
eval="('test_enqueued_job',)"
17+
/>
18+
</odoo>

queue_job/models/queue_job.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,3 +445,32 @@ def _test_job(self, failure_rate=0):
445445
_logger.info("Running test job.")
446446
if random.random() <= failure_rate:
447447
raise JobError("Job failed")
448+
449+
@api.model
450+
def _create_test_started_job(self, uuid):
451+
"""Create started jobs to be used within tests"""
452+
self.env["queue.job"].with_context(
453+
_job_edit_sentinel=self.env["queue.job"].EDIT_SENTINEL,
454+
).create(
455+
{
456+
"uuid": uuid,
457+
"state": "started",
458+
"model_name": "queue.job",
459+
"method_name": "write",
460+
}
461+
)
462+
463+
@api.model
464+
def _create_test_enqueued_job(self, uuid):
465+
"""Create enqueued jobs to be used within tests"""
466+
self.env["queue.job"].with_context(
467+
_job_edit_sentinel=self.env["queue.job"].EDIT_SENTINEL,
468+
).create(
469+
{
470+
"uuid": uuid,
471+
"state": "enqueued",
472+
"model_name": "queue.job",
473+
"method_name": "write",
474+
"date_enqueued": datetime.now() - timedelta(minutes=1),
475+
}
476+
)
Lines changed: 19 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Copyright 2025 ACSONE SA/NV
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
33
from contextlib import closing
4-
from datetime import datetime, timedelta
54

65
from odoo.tests.common import TransactionCase
76

@@ -10,26 +9,22 @@
109

1110

1211
class TestRequeueDeadJob(TransactionCase):
13-
def create_dummy_job(self, uuid):
14-
"""
15-
Create dummy job for tests
16-
"""
17-
return (
18-
self.env["queue.job"]
19-
.with_context(
20-
_job_edit_sentinel=self.env["queue.job"].EDIT_SENTINEL,
21-
)
22-
.create(
23-
{
24-
"uuid": uuid,
25-
"user_id": self.env.user.id,
26-
"state": "pending",
27-
"model_name": "queue.job",
28-
"method_name": "write",
29-
}
30-
)
12+
def _get_demo_job(self, uuid):
13+
# job created during load of demo data
14+
job = self.env["queue.job"].search(
15+
[
16+
("uuid", "=", uuid),
17+
]
18+
)
19+
20+
self.assertTrue(
21+
job,
22+
f"Demo data queue job {uuid} should be loaded in order"
23+
" to make this tests work",
3124
)
3225

26+
return job
27+
3328
def get_locks(self, uuid, cr=None):
3429
"""
3530
Retrieve lock rows
@@ -60,7 +55,8 @@ def get_locks(self, uuid, cr=None):
6055
return cr.fetchall()
6156

6257
def test_add_lock_record(self):
63-
queue_job = self.create_dummy_job("test_add_lock")
58+
queue_job = self._get_demo_job("test_started_job")
59+
6460
job_obj = Job.load(self.env, queue_job.uuid)
6561

6662
job_obj.set_started()
@@ -71,7 +67,7 @@ def test_add_lock_record(self):
7167
self.assertEqual(1, len(locks))
7268

7369
def test_lock(self):
74-
queue_job = self.create_dummy_job("test_lock")
70+
queue_job = self._get_demo_job("test_started_job")
7571
job_obj = Job.load(self.env, queue_job.uuid)
7672

7773
job_obj.set_started()
@@ -81,9 +77,6 @@ def test_lock(self):
8177

8278
self.assertEqual(1, len(locks))
8379

84-
# commit to update queue_job records in DB
85-
self.env.cr.commit() # pylint: disable=E8102
86-
8780
job_obj.lock()
8881

8982
with closing(self.env.registry.cursor()) as new_cr:
@@ -92,28 +85,13 @@ def test_lock(self):
9285
# Row should be locked
9386
self.assertEqual(0, len(locks))
9487

95-
# clean up
96-
queue_job.unlink()
97-
98-
self.env.cr.commit() # pylint: disable=E8102
99-
100-
# because we committed the cursor, the savepoint of the test method is
101-
# gone, and this would break TransactionCase cleanups
102-
self.cr.execute("SAVEPOINT test_%d" % self._savepoint_id)
103-
10488
def test_requeue_dead_jobs(self):
105-
uuid = "test_requeue_dead_jobs"
106-
107-
queue_job = self.create_dummy_job(uuid)
89+
queue_job = self._get_demo_job("test_enqueued_job")
10890
job_obj = Job.load(self.env, queue_job.uuid)
10991

11092
job_obj.set_enqueued()
111-
# simulate enqueuing was in the past
112-
job_obj.date_enqueued = datetime.now() - timedelta(minutes=1)
11393
job_obj.set_started()
114-
11594
job_obj.store()
116-
self.env.cr.commit() # pylint: disable=E8102
11795

11896
# requeue dead jobs using current cursor
11997
query = Database(self.env.cr.dbname)._query_requeue_dead_jobs()
@@ -122,12 +100,4 @@ def test_requeue_dead_jobs(self):
122100
uuids_requeued = self.env.cr.fetchall()
123101

124102
self.assertEqual(len(uuids_requeued), 1)
125-
self.assertEqual(uuids_requeued[0][0], uuid)
126-
127-
# clean up
128-
queue_job.unlink()
129-
self.env.cr.commit() # pylint: disable=E8102
130-
131-
# because we committed the cursor, the savepoint of the test method is
132-
# gone, and this would break TransactionCase cleanups
133-
self.cr.execute("SAVEPOINT test_%d" % self._savepoint_id)
103+
self.assertEqual(uuids_requeued[0][0], queue_job.uuid)

test_queue_job/tests/test_autovacuum.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,23 @@ def test_autovacuum(self):
2828
date_done = datetime.now() - timedelta(days=29)
2929
stored.write({"date_done": date_done})
3030
self.env["queue.job"].autovacuum()
31-
self.assertEqual(len(self.env["queue.job"].search([])), 1)
31+
self.assertEqual(
32+
len(
33+
self.env["queue.job"].search(
34+
[
35+
("channel", "!=", False),
36+
]
37+
)
38+
),
39+
1,
40+
)
3241

3342
date_done = datetime.now() - timedelta(days=31)
3443
stored.write({"date_done": date_done})
3544
self.env["queue.job"].autovacuum()
36-
self.assertEqual(len(self.env["queue.job"].search([])), 0)
45+
self.assertEqual(
46+
len(self.env["queue.job"].search([("channel", "!=", False)])), 0
47+
)
3748

3849
def test_autovacuum_multi_channel(self):
3950
root_channel = self.env.ref("queue_job.channel_root")
@@ -48,11 +59,14 @@ def test_autovacuum_multi_channel(self):
4859
{"channel": channel_60days.complete_name, "date_done": date_done}
4960
)
5061

51-
self.assertEqual(len(self.env["queue.job"].search([])), 2)
5262
self.env["queue.job"].autovacuum()
53-
self.assertEqual(len(self.env["queue.job"].search([])), 1)
63+
self.assertEqual(
64+
len(self.env["queue.job"].search([("channel", "!=", False)])), 1
65+
)
5466

5567
date_done = datetime.now() - timedelta(days=61)
5668
job_60days.write({"date_done": date_done})
5769
self.env["queue.job"].autovacuum()
58-
self.assertEqual(len(self.env["queue.job"].search([])), 0)
70+
self.assertEqual(
71+
len(self.env["queue.job"].search([("channel", "!=", False)])), 0
72+
)

0 commit comments

Comments
 (0)