[TEST] website_sale_aplicoop: add tests for home_delivery computed field
- New test_home_delivery.py: verifies group.order.home_delivery derives from delivery_product_id (compute), and that sale.order.home_delivery is set correctly through _get_effective_delivery_context - Fix test_save_order_endpoints: replace home_delivery=True (now ignored on computed field) with delivery_product_id to enable delivery - Fix test_phase3_confirm_eskaera: same fix for integration test setUp Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
9d614ed79e
commit
a1899483c5
4 changed files with 257 additions and 4 deletions
|
|
@ -15,3 +15,4 @@ from . import test_pricing_with_pricelist # noqa: F401
|
|||
from . import test_portal_sale_order_creation # noqa: F401
|
||||
from . import test_cron_picking_batch # noqa: F401
|
||||
from . import test_group_order_status_endpoint # noqa: F401
|
||||
from . import test_home_delivery # noqa: F401
|
||||
|
|
|
|||
232
website_sale_aplicoop/tests/test_home_delivery.py
Normal file
232
website_sale_aplicoop/tests/test_home_delivery.py
Normal file
|
|
@ -0,0 +1,232 @@
|
|||
# Copyright 2026 Criptomart
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
||||
|
||||
"""Tests for home_delivery auto-computation on group.order.
|
||||
|
||||
Covers:
|
||||
- group.order.home_delivery derives from delivery_product_id
|
||||
- Recomputes correctly when product is set/cleared
|
||||
- sale.order.home_delivery is set when effective delivery is requested
|
||||
- _get_effective_delivery_context honours the computed flag
|
||||
"""
|
||||
|
||||
from datetime import timedelta
|
||||
|
||||
from odoo import fields
|
||||
from odoo.tests.common import TransactionCase
|
||||
|
||||
from ..controllers.website_sale import AplicoopWebsiteSale
|
||||
|
||||
|
||||
class TestHomeDeliveryCompute(TransactionCase):
|
||||
"""Unit tests for group.order.home_delivery computed field."""
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
||||
self.group = self.env["res.partner"].create(
|
||||
{
|
||||
"name": "Delivery Test Group",
|
||||
"is_company": True,
|
||||
"is_group": True,
|
||||
}
|
||||
)
|
||||
|
||||
self.delivery_product = self.env["product.product"].create(
|
||||
{
|
||||
"name": "Home Delivery Service",
|
||||
"type": "service",
|
||||
"list_price": 3.5,
|
||||
}
|
||||
)
|
||||
|
||||
self._base_vals = {
|
||||
"name": "Delivery Test Order",
|
||||
"group_ids": [(6, 0, [self.group.id])],
|
||||
"type": "regular",
|
||||
"period": "weekly",
|
||||
"pickup_day": "3",
|
||||
"cutoff_day": "1",
|
||||
"start_date": fields.Date.today(),
|
||||
"end_date": fields.Date.today() + timedelta(days=14),
|
||||
}
|
||||
|
||||
def _make_group_order(self, **extra):
|
||||
vals = dict(self._base_vals, **extra)
|
||||
return self.env["group.order"].create(vals)
|
||||
|
||||
# --- compute correctness ---
|
||||
|
||||
def test_home_delivery_true_when_product_set(self):
|
||||
order = self._make_group_order(delivery_product_id=self.delivery_product.id)
|
||||
self.assertTrue(
|
||||
order.home_delivery,
|
||||
"home_delivery should be True when delivery_product_id is set",
|
||||
)
|
||||
|
||||
def test_home_delivery_false_without_product(self):
|
||||
order = self._make_group_order()
|
||||
self.assertFalse(
|
||||
order.home_delivery,
|
||||
"home_delivery should be False when no delivery_product_id",
|
||||
)
|
||||
|
||||
def test_home_delivery_recomputes_when_product_set(self):
|
||||
order = self._make_group_order()
|
||||
self.assertFalse(order.home_delivery)
|
||||
|
||||
order.delivery_product_id = self.delivery_product.id
|
||||
self.assertTrue(
|
||||
order.home_delivery,
|
||||
"home_delivery should recompute to True after setting delivery_product_id",
|
||||
)
|
||||
|
||||
def test_home_delivery_recomputes_when_product_cleared(self):
|
||||
order = self._make_group_order(delivery_product_id=self.delivery_product.id)
|
||||
self.assertTrue(order.home_delivery)
|
||||
|
||||
order.delivery_product_id = False
|
||||
self.assertFalse(
|
||||
order.home_delivery,
|
||||
"home_delivery should recompute to False after clearing delivery_product_id",
|
||||
)
|
||||
|
||||
def test_direct_write_to_home_delivery_is_overridden_by_compute(self):
|
||||
"""Writing home_delivery directly must not stick — compute wins."""
|
||||
order = self._make_group_order()
|
||||
# Attempt to set home_delivery=True without a product
|
||||
order.home_delivery = True
|
||||
order.invalidate_recordset()
|
||||
self.assertFalse(
|
||||
order.home_delivery,
|
||||
"Computed field must override any direct write without a delivery product",
|
||||
)
|
||||
|
||||
|
||||
class TestHomeDeliveryEffectiveContext(TransactionCase):
|
||||
"""Tests for _get_effective_delivery_context and sale.order.home_delivery."""
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
||||
self.group = self.env["res.partner"].create(
|
||||
{
|
||||
"name": "Ctx Test Group",
|
||||
"is_company": True,
|
||||
"is_group": True,
|
||||
}
|
||||
)
|
||||
self.member_partner = self.env["res.partner"].create(
|
||||
{"name": "Ctx Member", "email": "ctx@test.com"}
|
||||
)
|
||||
self.group.member_ids = [(4, self.member_partner.id)]
|
||||
|
||||
self.user = self.env["res.users"].create(
|
||||
{
|
||||
"name": "Ctx User",
|
||||
"login": "ctx_user@test.com",
|
||||
"email": "ctx_user@test.com",
|
||||
"partner_id": self.member_partner.id,
|
||||
}
|
||||
)
|
||||
|
||||
self.delivery_product = self.env["product.product"].create(
|
||||
{"name": "Delivery Svc", "type": "service", "list_price": 2.0}
|
||||
)
|
||||
|
||||
today = fields.Date.today()
|
||||
self.group_order_with_delivery = self.env["group.order"].create(
|
||||
{
|
||||
"name": "GO With Delivery",
|
||||
"group_ids": [(6, 0, [self.group.id])],
|
||||
"type": "regular",
|
||||
"period": "weekly",
|
||||
"pickup_day": "4",
|
||||
"cutoff_day": "1",
|
||||
"start_date": today,
|
||||
"end_date": today + timedelta(days=14),
|
||||
"delivery_product_id": self.delivery_product.id,
|
||||
}
|
||||
)
|
||||
self.group_order_with_delivery.action_open()
|
||||
|
||||
self.group_order_no_delivery = self.env["group.order"].create(
|
||||
{
|
||||
"name": "GO No Delivery",
|
||||
"group_ids": [(6, 0, [self.group.id])],
|
||||
"type": "regular",
|
||||
"period": "weekly",
|
||||
"pickup_day": "4",
|
||||
"cutoff_day": "1",
|
||||
"start_date": today,
|
||||
"end_date": today + timedelta(days=14),
|
||||
}
|
||||
)
|
||||
self.group_order_no_delivery.action_open()
|
||||
|
||||
self.controller = AplicoopWebsiteSale()
|
||||
|
||||
# --- _get_effective_delivery_context ---
|
||||
|
||||
def test_delivery_enabled_when_product_configured_and_requested(self):
|
||||
effective, _ = self.controller._get_effective_delivery_context(
|
||||
self.group_order_with_delivery, is_delivery=True
|
||||
)
|
||||
self.assertTrue(
|
||||
effective,
|
||||
"Delivery should be effective when group order has delivery product and user requests it",
|
||||
)
|
||||
|
||||
def test_delivery_disabled_when_product_configured_but_not_requested(self):
|
||||
effective, _ = self.controller._get_effective_delivery_context(
|
||||
self.group_order_with_delivery, is_delivery=False
|
||||
)
|
||||
self.assertFalse(
|
||||
effective,
|
||||
"Delivery should not be effective when user did not request it",
|
||||
)
|
||||
|
||||
def test_delivery_disabled_when_no_product_even_if_requested(self):
|
||||
effective, _ = self.controller._get_effective_delivery_context(
|
||||
self.group_order_no_delivery, is_delivery=True
|
||||
)
|
||||
self.assertFalse(
|
||||
effective,
|
||||
"Delivery should not be effective when group order has no delivery product",
|
||||
)
|
||||
|
||||
# --- sale.order.home_delivery propagation ---
|
||||
|
||||
def test_sale_order_home_delivery_set_when_delivery_requested(self):
|
||||
"""sale.order.home_delivery must be True when group order has product and user requests delivery."""
|
||||
order_vals = {
|
||||
"partner_id": self.member_partner.id,
|
||||
"group_order_id": self.group_order_with_delivery.id,
|
||||
"pickup_day": self.group_order_with_delivery.pickup_day,
|
||||
"pickup_date": self.group_order_with_delivery.pickup_date,
|
||||
"home_delivery": True,
|
||||
"order_line": [],
|
||||
"state": "draft",
|
||||
}
|
||||
sale_order = self.env["sale.order"].sudo().create(order_vals)
|
||||
self.assertTrue(
|
||||
sale_order.home_delivery,
|
||||
"sale.order.home_delivery should be True when group order has delivery enabled",
|
||||
)
|
||||
|
||||
def test_sale_order_home_delivery_false_without_group_order_product(self):
|
||||
"""sale.order.home_delivery must be False when group order has no delivery product."""
|
||||
order_vals = {
|
||||
"partner_id": self.member_partner.id,
|
||||
"group_order_id": self.group_order_no_delivery.id,
|
||||
"pickup_day": self.group_order_no_delivery.pickup_day,
|
||||
"pickup_date": self.group_order_no_delivery.pickup_date,
|
||||
"home_delivery": self.group_order_no_delivery.home_delivery,
|
||||
"order_line": [],
|
||||
"state": "draft",
|
||||
}
|
||||
sale_order = self.env["sale.order"].sudo().create(order_vals)
|
||||
self.assertFalse(
|
||||
sale_order.home_delivery,
|
||||
"sale.order.home_delivery should be False when group order has no delivery product",
|
||||
)
|
||||
|
|
@ -694,6 +694,16 @@ class TestConfirmEskaera_Integration(TransactionCase):
|
|||
}
|
||||
)
|
||||
|
||||
# Delivery service product — home_delivery on group.order is computed
|
||||
# from delivery_product_id, so we must set the product to enable delivery.
|
||||
self.delivery_product = self.env["product.product"].create(
|
||||
{
|
||||
"name": "Integration Delivery Svc",
|
||||
"type": "service",
|
||||
"list_price": 0.0,
|
||||
}
|
||||
)
|
||||
|
||||
# Create test group order
|
||||
self.group_order = self.env["group.order"].create(
|
||||
{
|
||||
|
|
@ -704,7 +714,7 @@ class TestConfirmEskaera_Integration(TransactionCase):
|
|||
"end_date": date.today() + timedelta(days=7),
|
||||
"cutoff_day": "3",
|
||||
"pickup_day": "5",
|
||||
"home_delivery": True,
|
||||
"delivery_product_id": self.delivery_product.id,
|
||||
}
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -96,6 +96,15 @@ class TestSaveOrderEndpoints(TransactionCase):
|
|||
}
|
||||
)
|
||||
|
||||
# Delivery service product (required to enable home_delivery on group.order)
|
||||
self.delivery_product = self.env["product.product"].create(
|
||||
{
|
||||
"name": "Home Delivery Service",
|
||||
"type": "service",
|
||||
"list_price": 3.0,
|
||||
}
|
||||
)
|
||||
|
||||
# Associate product with group order
|
||||
self.group_order.product_ids = [(4, self.product.id)]
|
||||
|
||||
|
|
@ -206,7 +215,8 @@ class TestSaveOrderEndpoints(TransactionCase):
|
|||
|
||||
def test_save_eskaera_draft_propagates_home_delivery(self):
|
||||
"""Test that save_eskaera_draft() propagates home_delivery correctly."""
|
||||
# Create a group order with home_delivery=True
|
||||
# Create a group order with home delivery enabled via delivery_product_id
|
||||
# (home_delivery is a computed field derived from delivery_product_id)
|
||||
group_order_home = self.env["group.order"].create(
|
||||
{
|
||||
"name": "Test Group Order with Home Delivery",
|
||||
|
|
@ -217,7 +227,7 @@ class TestSaveOrderEndpoints(TransactionCase):
|
|||
"period": "weekly",
|
||||
"pickup_day": "3",
|
||||
"pickup_date": datetime.now().date() + timedelta(days=3),
|
||||
"home_delivery": True, # Enable home delivery
|
||||
"delivery_product_id": self.delivery_product.id,
|
||||
"cutoff_day": "0",
|
||||
}
|
||||
)
|
||||
|
|
@ -362,7 +372,7 @@ class TestSaveOrderEndpoints(TransactionCase):
|
|||
"period": "weekly",
|
||||
"pickup_day": "5",
|
||||
"pickup_date": datetime.now().date() + timedelta(days=12),
|
||||
"home_delivery": True,
|
||||
"delivery_product_id": self.delivery_product.id,
|
||||
"cutoff_day": "0",
|
||||
}
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue