Skip to content

Commit 88502b6

Browse files
committed
[FIX] queue job test creation with proper sentinel context
1 parent 5eef98a commit 88502b6

4 files changed

Lines changed: 76 additions & 248 deletions

File tree

spp_base_common/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
## 2025-11-20
44

5+
### 2025-11-20 16:30:00 - [FIX] queue job test creation with proper sentinel context
6+
7+
- Fixed test job creation to use `_job_edit_sentinel` context for protected fields
8+
- Added `_create_test_job` helper method to simplify job creation in tests
9+
- Updated all test methods to use helper instead of direct create() calls
10+
- Tests now properly respect queue.job model's protected fields constraint
11+
512
### 2025-11-20 16:00:00 - [ADD] comprehensive tests for queue job tracking
613

714
- Added `test_queue_job_tracking.py` with 10 comprehensive test cases

spp_base_common/tests/test_queue_job_tracking.py

Lines changed: 31 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Part of OpenSPP. See LICENSE file for full copyright and licensing details.
22

3+
import uuid
4+
35
from odoo.tests.common import TransactionCase
46

57

@@ -10,6 +12,9 @@ def setUpClass(cls):
1012
cls.queue_job_model = cls.env["queue.job"]
1113
cls.area_import_model = cls.env["spp.area.import"]
1214

15+
# Get the EDIT_SENTINEL for protected fields
16+
cls.job_edit_sentinel = cls.queue_job_model.EDIT_SENTINEL
17+
1318
# Create test area import records
1419
cls.area_import_1 = cls.area_import_model.create(
1520
{
@@ -22,56 +27,35 @@ def setUpClass(cls):
2227
}
2328
)
2429

25-
def test_01_queue_job_res_fields(self):
26-
"""Test that queue.job model has res_id and res_model fields"""
27-
job = self.queue_job_model.create(
30+
def _create_test_job(self, name, res_model, res_id, state="done", method_name="test_method"):
31+
"""Helper method to create test queue jobs with proper sentinel context"""
32+
return self.queue_job_model.with_context(_job_edit_sentinel=self.job_edit_sentinel).create(
2833
{
29-
"name": "Test Job",
30-
"model_name": "spp.area.import",
31-
"method_name": "test_method",
32-
"res_model": "spp.area.import",
33-
"res_id": self.area_import_1.id,
34+
"uuid": str(uuid.uuid4()),
35+
"name": name,
36+
"model_name": res_model,
37+
"method_name": method_name,
38+
"res_model": res_model,
39+
"res_id": res_id,
40+
"state": state,
3441
}
3542
)
3643

44+
def test_01_queue_job_res_fields(self):
45+
"""Test that queue.job model has res_id and res_model fields"""
46+
job = self._create_test_job("Test Job", "spp.area.import", self.area_import_1.id, state="done")
47+
3748
self.assertEqual(job.res_model, "spp.area.import")
3849
self.assertEqual(job.res_id, self.area_import_1.id)
3950

4051
def test_02_compute_job_ids(self):
4152
"""Test that area import correctly computes related jobs"""
4253
# Create jobs for area_import_1
43-
job1 = self.queue_job_model.create(
44-
{
45-
"name": "Job 1 for Import 1",
46-
"model_name": "spp.area.import",
47-
"method_name": "test_method",
48-
"res_model": "spp.area.import",
49-
"res_id": self.area_import_1.id,
50-
"state": "done",
51-
}
52-
)
53-
job2 = self.queue_job_model.create(
54-
{
55-
"name": "Job 2 for Import 1",
56-
"model_name": "spp.area.import",
57-
"method_name": "test_method",
58-
"res_model": "spp.area.import",
59-
"res_id": self.area_import_1.id,
60-
"state": "pending",
61-
}
62-
)
54+
job1 = self._create_test_job("Job 1 for Import 1", "spp.area.import", self.area_import_1.id, state="done")
55+
job2 = self._create_test_job("Job 2 for Import 1", "spp.area.import", self.area_import_1.id, state="pending")
6356

6457
# Create job for area_import_2
65-
job3 = self.queue_job_model.create(
66-
{
67-
"name": "Job 1 for Import 2",
68-
"model_name": "spp.area.import",
69-
"method_name": "test_method",
70-
"res_model": "spp.area.import",
71-
"res_id": self.area_import_2.id,
72-
"state": "done",
73-
}
74-
)
58+
job3 = self._create_test_job("Job 1 for Import 2", "spp.area.import", self.area_import_2.id, state="done")
7559

7660
# Trigger compute
7761
self.area_import_1._compute_job_ids()
@@ -100,16 +84,7 @@ def test_03_has_ongoing_jobs_no_jobs(self):
10084
def test_04_has_ongoing_jobs_with_pending_job(self):
10185
"""Test has_ongoing_jobs when there is a pending job"""
10286
# Create a pending job
103-
self.queue_job_model.create(
104-
{
105-
"name": "Pending Job",
106-
"model_name": "spp.area.import",
107-
"method_name": "test_method",
108-
"res_model": "spp.area.import",
109-
"res_id": self.area_import_1.id,
110-
"state": "pending",
111-
}
112-
)
87+
self._create_test_job("Pending Job", "spp.area.import", self.area_import_1.id, state="pending")
11388

11489
# Trigger compute on both records
11590
self.area_import_1._compute_has_ongoing_jobs()
@@ -125,16 +100,7 @@ def test_05_has_ongoing_jobs_with_enqueued_job(self):
125100
self.queue_job_model.search([("res_model", "=", "spp.area.import")]).unlink()
126101

127102
# Create an enqueued job
128-
self.queue_job_model.create(
129-
{
130-
"name": "Enqueued Job",
131-
"model_name": "spp.area.import",
132-
"method_name": "test_method",
133-
"res_model": "spp.area.import",
134-
"res_id": self.area_import_2.id,
135-
"state": "enqueued",
136-
}
137-
)
103+
self._create_test_job("Enqueued Job", "spp.area.import", self.area_import_2.id, state="enqueued")
138104

139105
# Trigger compute
140106
self.area_import_1._compute_has_ongoing_jobs()
@@ -150,16 +116,7 @@ def test_06_has_ongoing_jobs_with_started_job(self):
150116
self.queue_job_model.search([("res_model", "=", "spp.area.import")]).unlink()
151117

152118
# Create a started job
153-
self.queue_job_model.create(
154-
{
155-
"name": "Started Job",
156-
"model_name": "spp.area.import",
157-
"method_name": "test_method",
158-
"res_model": "spp.area.import",
159-
"res_id": self.area_import_1.id,
160-
"state": "started",
161-
}
162-
)
119+
self._create_test_job("Started Job", "spp.area.import", self.area_import_1.id, state="started")
163120

164121
# Trigger compute
165122
self.area_import_1._compute_has_ongoing_jobs()
@@ -175,26 +132,8 @@ def test_07_has_ongoing_jobs_with_done_job(self):
175132
self.queue_job_model.search([("res_model", "=", "spp.area.import")]).unlink()
176133

177134
# Create only done/failed jobs
178-
self.queue_job_model.create(
179-
{
180-
"name": "Done Job",
181-
"model_name": "spp.area.import",
182-
"method_name": "test_method",
183-
"res_model": "spp.area.import",
184-
"res_id": self.area_import_1.id,
185-
"state": "done",
186-
}
187-
)
188-
self.queue_job_model.create(
189-
{
190-
"name": "Failed Job",
191-
"model_name": "spp.area.import",
192-
"method_name": "test_method",
193-
"res_model": "spp.area.import",
194-
"res_id": self.area_import_2.id,
195-
"state": "failed",
196-
}
197-
)
135+
self._create_test_job("Done Job", "spp.area.import", self.area_import_1.id, state="done")
136+
self._create_test_job("Failed Job", "spp.area.import", self.area_import_2.id, state="failed")
198137

199138
# Trigger compute
200139
self.area_import_1._compute_has_ongoing_jobs()
@@ -210,26 +149,8 @@ def test_08_has_ongoing_jobs_mixed_states(self):
210149
self.queue_job_model.search([("res_model", "=", "spp.area.import")]).unlink()
211150

212151
# Create jobs with different states
213-
self.queue_job_model.create(
214-
{
215-
"name": "Done Job",
216-
"model_name": "spp.area.import",
217-
"method_name": "test_method",
218-
"res_model": "spp.area.import",
219-
"res_id": self.area_import_1.id,
220-
"state": "done",
221-
}
222-
)
223-
self.queue_job_model.create(
224-
{
225-
"name": "Pending Job",
226-
"model_name": "spp.area.import",
227-
"method_name": "test_method",
228-
"res_model": "spp.area.import",
229-
"res_id": self.area_import_2.id,
230-
"state": "pending",
231-
}
232-
)
152+
self._create_test_job("Done Job", "spp.area.import", self.area_import_1.id, state="done")
153+
self._create_test_job("Pending Job", "spp.area.import", self.area_import_2.id, state="pending")
233154

234155
# Trigger compute
235156
self.area_import_1._compute_has_ongoing_jobs()
@@ -242,16 +163,7 @@ def test_08_has_ongoing_jobs_mixed_states(self):
242163
def test_09_job_ids_empty_for_different_model(self):
243164
"""Test that job_ids is empty when jobs belong to different model"""
244165
# Create a job with different res_model
245-
self.queue_job_model.create(
246-
{
247-
"name": "Job for different model",
248-
"model_name": "res.partner",
249-
"method_name": "test_method",
250-
"res_model": "res.partner",
251-
"res_id": 1,
252-
"state": "done",
253-
}
254-
)
166+
self._create_test_job("Job for different model", "res.partner", 1, state="done")
255167

256168
# Trigger compute
257169
self.area_import_1._compute_job_ids()
@@ -265,16 +177,7 @@ def test_10_has_ongoing_jobs_different_model(self):
265177
self.queue_job_model.search([("res_model", "=", "spp.area.import")]).unlink()
266178

267179
# Create a pending job for a different model
268-
self.queue_job_model.create(
269-
{
270-
"name": "Job for different model",
271-
"model_name": "res.partner",
272-
"method_name": "test_method",
273-
"res_model": "res.partner",
274-
"res_id": 1,
275-
"state": "pending",
276-
}
277-
)
180+
self._create_test_job("Job for different model", "res.partner", 1, state="pending")
278181

279182
# Trigger compute
280183
self.area_import_1._compute_has_ongoing_jobs()

spp_demo_common/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
## 2025-11-20
44

5+
### 2025-11-20 16:30:00 - [FIX] queue job test creation with proper sentinel context
6+
7+
- Fixed test job creation to use `_job_edit_sentinel` context for protected fields
8+
- Added `_create_test_job` helper method to simplify job creation in tests
9+
- Updated all test methods (test_28 through test_37) to use helper instead of direct create() calls
10+
- Tests now properly respect queue.job model's protected fields constraint
11+
512
### 2025-11-20 16:15:00 - [ADD] comprehensive tests for queue job tracking in demo data generator
613

714
- Added test_28: Tests `_compute_queue_job_ids` correctly filters jobs by generator record

0 commit comments

Comments
 (0)