Skip to content

Commit 77f9831

Browse files
committed
[ADD] estate: add unit tests for property business logic
- Introduced new unit tests in the estate module covering key business processes: - Prevent offer creation on sold properties. - Disallow marking properties as sold without an accepted offer. - Ensure garden area and orientation fields reset appropriately when garden is unchecked. - These tests improve the reliability and maintainability of the estate workflow.
1 parent f4747d4 commit 77f9831

File tree

4 files changed

+73
-9
lines changed

4 files changed

+73
-9
lines changed

estate/models/estate_property.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,15 @@ def _onchange_garden(self):
8383
record.garden_orientation = "north"
8484
else:
8585
record.garden_area = 0
86-
record.garden_orientation = ""
86+
record.garden_orientation = False
8787

8888
def action_set_state_sold(self):
8989
for record in self:
9090
if record.state == "cancelled":
9191
raise UserError(_("Cancelled property cannot be sold."))
92-
else:
93-
record.state = "sold"
92+
if not record.offer_ids.filtered(lambda o: o.status == "accepted"):
93+
raise UserError(_("You cannot sell a property without an accepted offer."))
94+
record.state = "sold"
9495
return True
9596

9697
def action_set_state_cancel(self):

estate/models/estate_property_offer.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from odoo import fields, models, api, _
2-
from odoo.exceptions import UserError
2+
from odoo.exceptions import UserError, ValidationError
33
from datetime import timedelta, datetime
44

55

@@ -31,10 +31,8 @@ def create(self, vals):
3131
for val in vals:
3232
property_id = val["property_id"]
3333
offer_price = val["price"]
34-
is_state_new = (
35-
self.env["estate.property"].browse(property_id).state == "new"
36-
)
37-
34+
property = self.env["estate.property"].browse(property_id)
35+
is_state_new = (property.state == "new")
3836
result = self.read_group(
3937
domain=[("property_id", "=", property_id)],
4038
fields=["price:max"],
@@ -43,11 +41,14 @@ def create(self, vals):
4341

4442
max_price = result[0]["price"] if result else 0
4543

44+
if property.state == 'sold':
45+
raise ValidationError(_("Cannot create an offer on a sold property."))
46+
4647
if max_price >= offer_price:
4748
raise UserError(_("You cannot create an offer with a lower or equal amount than an existing offer for this property."))
4849

4950
if is_state_new:
50-
self.env["estate.property"].browse(property_id).state = "offer_received"
51+
property.state = "offer_received"
5152

5253
return super().create(vals)
5354

estate/tests/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Part of Odoo. See LICENSE file for full copyright and licensing details.
2+
3+
from . import test_estate_property_offer
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from odoo.exceptions import ValidationError, UserError
2+
from odoo.tests import Form, tagged
3+
from odoo.tests.common import TransactionCase
4+
5+
6+
@tagged('post_install', '-at_install')
7+
class TestEstateProperty(TransactionCase):
8+
9+
@classmethod
10+
def setUpClass(cls):
11+
super().setUpClass()
12+
cls.partner = cls.env["res.partner"].create({"name": "Test Buyer"})
13+
cls.property_type = cls.env["estate.property.types"].create({"name": "Apartment2"})
14+
cls.property = cls.env["estate.property"].create({
15+
"name": "Test Property",
16+
"expected_price": 150000,
17+
"property_type_id": cls.property_type.id
18+
})
19+
20+
def test_cannot_create_offer_on_sold_property(self):
21+
self.property.state = "sold"
22+
with self.assertRaises(ValidationError):
23+
self.env["estate.property.offer"].create({
24+
"price": 160000,
25+
"partner_id": self.partner.id,
26+
"property_id": self.property.id
27+
})
28+
29+
def test_cannot_sell_property_without_accepted_offer(self):
30+
with self.assertRaises(UserError):
31+
self.property.action_set_state_sold()
32+
33+
def test_cannot_sell_property_with_accepted_offer(self):
34+
offer = self.env["estate.property.offer"].create({
35+
"price": 160000,
36+
"partner_id": self.partner.id,
37+
"property_id": self.property.id
38+
})
39+
offer.action_accept_offer()
40+
self.property.action_set_state_sold()
41+
self.assertEqual(self.property.state, "sold")
42+
self.assertEqual(self.property.selling_price, offer.price)
43+
self.assertEqual(self.property.buyer_id, self.partner)
44+
45+
def test_garden_fields_reset_on_uncheck(self):
46+
with Form(self.env["estate.property"]) as prop:
47+
prop.expected_price = 10000
48+
prop.name = "Test property"
49+
prop.garden = True
50+
prop.garden_area = 25
51+
prop.garden_orientation = "west"
52+
property = prop.save()
53+
54+
with Form(property) as prop:
55+
prop.garden = False
56+
property = prop.save()
57+
58+
self.assertEqual(property.garden_area, 0)
59+
self.assertFalse(property.garden_orientation)

0 commit comments

Comments
 (0)