From df8afa933fffafd22583e5cc154744abd2ad671d Mon Sep 17 00:00:00 2001 From: Ilyas Date: Tue, 26 Sep 2023 11:58:12 +0200 Subject: [PATCH 1/2] [IMP] subscription_oca: tests --- subscription_oca/readme/CONTRIBUTORS.rst | 5 + subscription_oca/tests/__init__.py | 3 + .../tests/test_subscription_oca.py | 182 ++++++++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 subscription_oca/tests/__init__.py create mode 100644 subscription_oca/tests/test_subscription_oca.py diff --git a/subscription_oca/readme/CONTRIBUTORS.rst b/subscription_oca/readme/CONTRIBUTORS.rst index e4139ac7d2..3324fc4745 100644 --- a/subscription_oca/readme/CONTRIBUTORS.rst +++ b/subscription_oca/readme/CONTRIBUTORS.rst @@ -1 +1,6 @@ * Carlos Martínez + + +* `Ooops404 `__: + + * Ilyas diff --git a/subscription_oca/tests/__init__.py b/subscription_oca/tests/__init__.py new file mode 100644 index 0000000000..f445239d7f --- /dev/null +++ b/subscription_oca/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_subscription_oca diff --git a/subscription_oca/tests/test_subscription_oca.py b/subscription_oca/tests/test_subscription_oca.py new file mode 100644 index 0000000000..65f3b75d3e --- /dev/null +++ b/subscription_oca/tests/test_subscription_oca.py @@ -0,0 +1,182 @@ +# Copyright 2023 ooops404 +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from dateutil.relativedelta import relativedelta + +from odoo import fields +from odoo.tests import TransactionCase + + +class TestSubscriptionOCA(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.pricelist = cls.env["product.pricelist"].create( + {"name": "pricelist for contract test"} + ) + cls.partner = cls.env["res.partner"].create( + { + "name": "partner test subscription_oca", + "property_product_pricelist": cls.pricelist.id, + "email": "demo1@demo.com", + } + ) + cls.partner_2 = cls.env["res.partner"].create( + { + "name": "partner test subscription_oca 2", + "property_product_pricelist": cls.pricelist.id, + "email": "demo2@demo.com", + } + ) + cls.tax_10pc_incl = cls.env["account.tax"].create( + { + "name": "10% Tax incl", + "amount_type": "percent", + "amount": 10, + "price_include": True, + } + ) + cls.product_1 = cls.env.ref("product.product_product_1") + cls.product_1.taxes_id = [(6, 0, cls.tax_10pc_incl.ids)] + cls.product_2 = cls.env.ref("product.product_product_2") + cls.country = cls.env["res.country"].search([], limit=1) + cls.fiscal = cls.env["account.fiscal.position"].create( + { + "name": "Regime National", + "auto_apply": True, + "country_id": cls.country.id, + "vat_required": True, + "sequence": 10, + } + ) + cls.tmpl = cls.env["sale.subscription.template"].create( + { + "name": "Test Template", + "code": "OMG", + "description": "Some sort of subscription terms", + "product_ids": [(6, 0, [cls.product_1.id, cls.product_2.id])], + } + ) + cls.stage = cls.env["sale.subscription.stage"].create( + { + "name": "Test Sub Stage", + } + ) + cls.tag = cls.env["sale.subscription.tag"].create( + { + "name": "Test Tag", + } + ) + cls.sub = cls.env["sale.subscription"].create( + { + "company_id": 1, + "partner_id": cls.partner.id, + "template_id": cls.tmpl.id, + "tag_ids": [(6, 0, [cls.tag.id])], + "stage_id": cls.stage.id, + "pricelist_id": cls.pricelist.id, + "fiscal_position_id": cls.fiscal.id, + } + ) + cls.sub_line = cls.env["sale.subscription.line"].create( + { + "company_id": 1, + "sale_subscription_id": cls.sub.id, + "product_id": cls.product_1.id, + } + ) + cls.close_reason = cls.env["sale.subscription.close.reason"].create( + { + "name": "Test Close Reason", + } + ) + + def test_subscription_oca_sale_order(self): + # SO standard flow + so = self.env["sale.order"].create( + { + "partner_id": self.partner.id, + "partner_invoice_id": self.partner.id, + "partner_shipping_id": self.partner.id, + "order_line": [ + ( + 0, + 0, + { + "name": self.product_1.name, + "product_id": self.product_1.id, + "product_uom_qty": 2, + "product_uom": self.product_1.uom_id.id, + "price_unit": self.product_1.list_price, + }, + ) + ], + } + ) + so._compute_subscriptions_count() + self.assertEqual(so.subscriptions_count, 0) + action = so.action_view_subscriptions() + self.assertIsInstance(action, dict) + so.action_confirm() # without subs. + + def test_subscription_oca_sub_line(self): + # sale.subscription.line + self.assertEqual(self.sub_line.name, self.sub_line.product_id.name) + self.assertIsNotNone(self.sub_line.tax_ids) + self.assertEqual(self.sub_line.price_unit, 30.75) + self.assertEqual(self.sub_line.discount, 0) + res = self.sub_line._get_display_price(self.product_2) + self.assertEqual(res, 38.25) + sol_res = self.sub_line._prepare_sale_order_line() + self.assertIsInstance(sol_res, dict) + move_res = self.sub_line._prepare_account_move_line() + self.assertIsInstance(move_res, dict) + + def test_subscription_oca_sub_cron(self): + # sale.subscription + self.sub.cron_subscription_management() + # invoice should be created by cron + inv_id = self.env["account.move"].search( + [("subscription_id", "=", self.sub.id)] + ) + self.assertEqual(len(inv_id), 1) + self.assertEqual(self.sub.recurring_total, 27.95) + self.assertEqual(self.sub.amount_total, 30.75) + + def test_subscription_oca_sub_workflow(self): + sale_order = self.sub.create_sale_order() + self.assertTrue(sale_order) + move_id = self.sub.create_invoice() + self.assertTrue(move_id) + res = self.sub.manual_invoice() + self.assertEqual(res["type"], "ir.actions.act_window") + inv_ids = self.env["account.move"].search( + [("subscription_id", "=", self.sub.id)] + ) + self.assertEqual(len(inv_ids), 2) + self.assertEqual(sum(inv_ids.mapped("amount_total")), 2 * 30.75) + self.assertEqual(self.sub.account_invoice_ids_count, 2) + res = self.sub.action_view_account_invoice_ids() + self.assertEqual(res["type"], "ir.actions.act_window") + self.assertEqual(self.sub.sale_order_ids_count, 1) + res = self.sub.action_view_sale_order_ids() + self.assertIn(str(self.sub.sale_order_ids.id), str(res["domain"])) + self.sub.calculate_recurring_next_date(fields.Datetime.now()) + self.assertEqual( + self.sub.recurring_next_date, + fields.Date.today() + relativedelta(months=1), + ) + self.sub.partner_id = self.partner_2 + self.sub.onchange_partner_id() + self.assertEqual( + self.sub.pricelist_id.id, self.partner_2.property_product_pricelist.id + ) + self.sub.onchange_partner_id_fpos() + self.assertFalse(self.sub.fiscal_position_id) + res = self.sub.action_close_subscription() + self.assertEqual(res["type"], "ir.actions.act_window") + + def test_subscription_oca_sub_stage(self): + # sale.subscription.stage + self.stage._check_lot_product() # should not raise From 7c003cea7ae526c86ed156c8e8bf0ebf547f1327 Mon Sep 17 00:00:00 2001 From: Ilyas Date: Tue, 26 Sep 2023 15:10:04 +0200 Subject: [PATCH 2/2] [IMP] subscription_oca: refactoring --- subscription_oca/models/sale_subscription.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subscription_oca/models/sale_subscription.py b/subscription_oca/models/sale_subscription.py index 4cc562ee49..250f97a006 100644 --- a/subscription_oca/models/sale_subscription.py +++ b/subscription_oca/models/sale_subscription.py @@ -451,8 +451,8 @@ def write(self, values): def create(self, values): if "recurring_rule_boundary" in values: if not values["recurring_rule_boundary"]: - template_id = self.env["sale.subscription.template"].search( - [("id", "=", values["template_id"])] + template_id = self.env["sale.subscription.template"].browse( + values["template_id"] ) date_start = values["date_start"] if not isinstance(values["date_start"], date): @@ -464,7 +464,7 @@ def create(self, values): values["date_start"] = values["recurring_next_date"] values["stage_id"] = ( self.env["sale.subscription.stage"] - .search([("type", "=", "pre")], order="sequence desc")[-1] + .search([("type", "=", "pre")], order="sequence desc", limit=1) .id ) return super(SaleSubscription, self).create(values)