Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 6727a8b

Browse files
committedFeb 28, 2025·
[MIG] delivery_package_type_number_parcels: Migration to 18.0
1 parent b63dde3 commit 6727a8b

File tree

2 files changed

+275
-114
lines changed

2 files changed

+275
-114
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,275 @@
1+
from odoo import Command
2+
from odoo.exceptions import UserError
3+
from odoo.tests import new_test_user
4+
5+
from odoo.addons.base.tests.common import BaseCommon
6+
7+
8+
class TestDocumentPageApproval(BaseCommon):
9+
@classmethod
10+
def setUpClass(cls):
11+
super().setUpClass()
12+
cls.page_obj = cls.env["document.page"]
13+
cls.history_obj = cls.env["document.page.history"]
14+
15+
# Demo Data
16+
cls.category1 = cls.env.ref("document_page.demo_category1")
17+
cls.page1 = cls.env.ref("document_page.demo_page1")
18+
19+
# Create test user without groups first
20+
cls.user2 = new_test_user(cls.env, login="test-user2", groups="base.group_user")
21+
22+
# Ensure user2 has the approver group
23+
cls.approver_gid = cls.env.ref(
24+
"document_page_approval.group_document_approver_user"
25+
)
26+
cls.user2.write({"groups_id": [Command.link(cls.approver_gid.id)]})
27+
28+
# Ensure test-user2 has write access on document.page.history
29+
cls.env["ir.model.access"].create(
30+
{
31+
"name": "Write Access for Test User2",
32+
"model_id": cls.env["ir.model"]._get_id("document.page.history"),
33+
"group_id": cls.approver_gid.id, # Assign to approver group
34+
"perm_read": True,
35+
"perm_write": True,
36+
"perm_create": True,
37+
"perm_unlink": True,
38+
}
39+
)
40+
41+
# Disable restrictive record rules for the test
42+
cls.env["ir.rule"].search(
43+
[("model_id", "=", cls.env["ir.model"]._get_id("document.page.history"))]
44+
).write({"active": False})
45+
46+
# Create category and page that require approval
47+
cls.category2 = cls.page_obj.create(
48+
{
49+
"name": "This category requires approval",
50+
"type": "category",
51+
"approval_required": True,
52+
"approver_gid": cls.approver_gid.id,
53+
}
54+
)
55+
cls.page2 = cls.page_obj.create(
56+
{
57+
"name": "This page requires approval",
58+
"parent_id": cls.category2.id,
59+
"content": "This content will require approval",
60+
}
61+
)
62+
63+
def test_approval_required(self):
64+
"""Test that the page requires approval."""
65+
page = self.page2
66+
self.assertTrue(page.is_approval_required)
67+
self.assertTrue(page.has_changes_pending_approval)
68+
self.assertEqual(len(page.history_ids), 0)
69+
70+
def test_change_request_approve(self):
71+
"""Test that an approver can approve a change request."""
72+
page = self.page2
73+
74+
# Get the change request for this page
75+
chreq = self.history_obj.search(
76+
[("page_id", "=", page.id), ("state", "!=", "approved")], limit=1
77+
)
78+
79+
self.assertEqual(chreq.state, "to approve")
80+
81+
# Ensure user2 is listed as an approver
82+
self.assertTrue(chreq.with_user(self.user2).am_i_approver)
83+
84+
# Approve the request as user2 (approver)
85+
chreq.with_user(self.user2).action_approve()
86+
self.assertEqual(chreq.state, "approved")
87+
self.assertEqual(chreq.content, page.content)
88+
89+
# Create new change request
90+
page.write({"content": "New content"})
91+
page.invalidate_model() # Recompute fields
92+
chreq = self.history_obj.search(
93+
[("page_id", "=", page.id), ("state", "!=", "approved")], limit=1
94+
)
95+
96+
# Approve new changes
97+
chreq.with_user(self.user2).action_approve()
98+
self.assertEqual(page.content, "New content")
99+
100+
def test_change_request_auto_approve(self):
101+
"""Test that a page without approval required auto-approves changes."""
102+
page = self.page1
103+
self.assertFalse(page.is_approval_required)
104+
page.write({"content": "New content"})
105+
self.assertEqual(page.content, "New content")
106+
107+
def test_change_request_from_scratch(self):
108+
"""Test a full change request lifecycle from draft to approval."""
109+
page = self.page2
110+
111+
# Approve all pending change requests
112+
self.history_obj.search(
113+
[("page_id", "=", page.id), ("state", "!=", "approved")]
114+
).with_user(self.user2).action_approve()
115+
116+
# Create new change request
117+
chreq = self.history_obj.create(
118+
{
119+
"page_id": page.id,
120+
"summary": "Changed something",
121+
"content": "New content",
122+
}
123+
)
124+
125+
self.assertEqual(chreq.state, "draft")
126+
127+
# Move change request to 'to approve' state
128+
chreq.with_user(self.user2).action_to_approve()
129+
self.assertEqual(chreq.state, "to approve")
130+
131+
# Cancel and return to draft
132+
chreq.with_user(self.user2).action_cancel()
133+
self.assertEqual(chreq.state, "cancelled")
134+
135+
chreq.with_user(self.user2).action_draft()
136+
self.assertEqual(chreq.state, "draft")
137+
138+
# Approve the change request
139+
chreq.with_user(self.user2).action_approve()
140+
self.assertEqual(chreq.state, "approved")
141+
self.assertEqual(page.content, chreq.content)
142+
self.assertEqual(page.approved_date, chreq.approved_date)
143+
self.assertEqual(page.approved_uid, chreq.approved_uid)
144+
145+
def test_get_approvers_guids(self):
146+
"""Test that approver groups are properly assigned."""
147+
page = self.page2
148+
self.assertTrue(len(page.approver_group_ids) > 0)
149+
150+
def test_get_page_url(self):
151+
"""Test that the page URL exists."""
152+
pages = self.env["document.page.history"].search([])
153+
page = pages[0]
154+
self.assertIsNotNone(page.page_url)
155+
156+
def test_compute_is_approval_required(self):
157+
"""Ensure approval rules are inherited correctly"""
158+
self.assertTrue(self.page2.is_approval_required)
159+
self.page2.parent_id.approval_required = False
160+
self.page2.invalidate_model()
161+
self.assertFalse(self.page2.is_approval_required)
162+
163+
def test_compute_approver_group_ids(self):
164+
"""Ensure approver groups are inherited correctly"""
165+
self.assertIn(self.approver_gid, self.page2.approver_group_ids)
166+
self.page2.parent_id.approver_gid = False
167+
self.page2.invalidate_model()
168+
self.assertFalse(self.page2.approver_group_ids)
169+
170+
def test_can_user_approve_this_page(self):
171+
"""Check different approval conditions"""
172+
self.assertTrue(
173+
self.page2.with_user(self.user2).can_user_approve_this_page(self.user2)
174+
)
175+
176+
# Remove approval group from user2
177+
self.user2.write({"groups_id": [(3, self.approver_gid.id)]})
178+
self.assertFalse(
179+
self.page2.with_user(self.user2).can_user_approve_this_page(self.user2)
180+
)
181+
182+
def test_pending_approval_detection(self):
183+
"""Ensure the system detects pending approval changes"""
184+
# Reset page2 by removing previous history
185+
self.history_obj.search([("page_id", "=", self.page2.id)]).unlink()
186+
187+
self.page2.invalidate_model()
188+
self.assertFalse(self.page2.has_changes_pending_approval)
189+
190+
# Create a new change request
191+
self.history_obj.create(
192+
{
193+
"page_id": self.page2.id,
194+
"state": "to approve",
195+
}
196+
)
197+
198+
self.page2.invalidate_model()
199+
self.assertTrue(self.page2.has_changes_pending_approval)
200+
201+
def test_user_has_drafts(self):
202+
"""Ensure the system detects drafts correctly"""
203+
self.page2.invalidate_model()
204+
self.assertFalse(self.page2.user_has_drafts)
205+
206+
self.history_obj.create(
207+
{
208+
"page_id": self.page2.id,
209+
"state": "draft",
210+
}
211+
)
212+
self.page2.invalidate_model()
213+
self.assertTrue(self.page2.user_has_drafts)
214+
215+
def test_action_draft_requires_cancellation(self):
216+
"""Ensure a change request must be cancelled before setting to draft"""
217+
chreq = self.history_obj.create(
218+
{
219+
"page_id": self.page2.id,
220+
"state": "to approve",
221+
}
222+
)
223+
with self.assertRaises(UserError):
224+
chreq.action_draft()
225+
226+
def test_action_to_approve_only_from_draft(self):
227+
"""Ensure only draft requests can be sent for approval"""
228+
chreq = self.history_obj.create(
229+
{
230+
"page_id": self.page2.id,
231+
"state": "approved",
232+
}
233+
)
234+
with self.assertRaises(UserError):
235+
chreq.action_to_approve()
236+
237+
def test_approval_permission_check(self):
238+
"""Ensure approval is restricted to approvers"""
239+
chreq = self.history_obj.create(
240+
{
241+
"page_id": self.page2.id,
242+
"state": "to approve",
243+
}
244+
)
245+
246+
with self.assertRaises(UserError):
247+
chreq.with_user(self.env.ref("base.user_demo")).action_approve()
248+
249+
# Grant approval rights
250+
chreq.with_user(self.user2).action_approve()
251+
self.assertEqual(chreq.state, "approved")
252+
253+
def test_page_url_computation(self):
254+
"""Ensure page URLs are generated correctly"""
255+
chreq = self.history_obj.create({"page_id": self.page2.id})
256+
self.assertIn("web#db=", chreq.page_url)
257+
258+
def test_diff_computation(self):
259+
"""Ensure document diff is calculated properly"""
260+
self.history_obj.create(
261+
{
262+
"page_id": self.page2.id,
263+
"content": "Version 1",
264+
"state": "approved",
265+
}
266+
)
267+
268+
chreq2 = self.history_obj.create(
269+
{
270+
"page_id": self.page2.id,
271+
"content": "Version 2",
272+
}
273+
)
274+
chreq2._compute_diff()
275+
self.assertIsNotNone(chreq2.diff)

‎delivery_package_type_number_parcels/tests/test_package_type_number_parcels.py

-114
This file was deleted.

0 commit comments

Comments
 (0)
Please sign in to comment.