diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/membership/tests | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/membership/tests')
| -rw-r--r-- | addons/membership/tests/__init__.py | 3 | ||||
| -rw-r--r-- | addons/membership/tests/common.py | 32 | ||||
| -rw-r--r-- | addons/membership/tests/test_membership.py | 160 |
3 files changed, 195 insertions, 0 deletions
diff --git a/addons/membership/tests/__init__.py b/addons/membership/tests/__init__.py new file mode 100644 index 00000000..a02bcfa7 --- /dev/null +++ b/addons/membership/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from odoo.addons.membership.tests import test_membership diff --git a/addons/membership/tests/common.py b/addons/membership/tests/common.py new file mode 100644 index 00000000..a7845fa8 --- /dev/null +++ b/addons/membership/tests/common.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- + +import datetime +from dateutil.relativedelta import relativedelta + +from odoo.addons.account.tests.common import AccountTestInvoicingCommon + + +class TestMembershipCommon(AccountTestInvoicingCommon): + + @classmethod + def setUpClass(cls, chart_template_ref=None): + super().setUpClass(chart_template_ref=chart_template_ref) + + # Test memberships + cls.membership_1 = cls.env['product.product'].create({ + 'membership': True, + 'membership_date_from': datetime.date.today() + relativedelta(days=-2), + 'membership_date_to': datetime.date.today() + relativedelta(months=1), + 'name': 'Basic Limited', + 'type': 'service', + 'list_price': 100.00, + }) + + # Test people + cls.partner_1 = cls.env['res.partner'].create({ + 'name': 'Ignasse Reblochon', + }) + cls.partner_2 = cls.env['res.partner'].create({ + 'name': 'Martine Poulichette', + 'free_member': True, + }) diff --git a/addons/membership/tests/test_membership.py b/addons/membership/tests/test_membership.py new file mode 100644 index 00000000..957ca2df --- /dev/null +++ b/addons/membership/tests/test_membership.py @@ -0,0 +1,160 @@ +# -*- coding: utf-8 -*- + +import datetime +from dateutil.relativedelta import relativedelta +from unittest.mock import patch + +import time +from odoo.addons.membership.tests.common import TestMembershipCommon +from odoo.tests import tagged +from odoo import fields + + +@tagged('post_install', '-at_install') +class TestMembership(TestMembershipCommon): + + def test_none_membership(self): + self.membership_1.write({ + 'membership_date_from': datetime.date.today() + relativedelta(years=-2), + 'membership_date_to': datetime.date.today() + relativedelta(years=-1), + }) + + self.partner_1.create_membership_invoice(self.membership_1, 75.0) + self.assertEqual( + self.partner_1.membership_state, 'none', + 'membership: outdated non paid subscription should keep in non-member state') + + def test_old_membership(self): + self.membership_1.write({ + 'membership_date_from': datetime.date.today() + relativedelta(years=-2), + 'membership_date_to': datetime.date.today() + relativedelta(years=-1), + }) + + self.partner_1.create_membership_invoice(self.membership_1, 75.0) + self.assertEqual( + self.partner_1.membership_state, 'none', + 'membership: outdated non paid subscription should keep in non-member state') + + # subscribes to a membership + self.partner_1.create_membership_invoice(self.membership_1, 75.0) + + # checks for invoices + invoice = self.env['account.move'].search([('partner_id', '=', self.partner_1.id)], limit=1) + self.assertEqual( + invoice.state, 'draft', + 'membership: new subscription should create a draft invoice') + self.assertEqual( + invoice.invoice_line_ids[0].product_id, self.membership_1, + 'membership: new subscription should create a line with the membership as product') + self.assertEqual( + invoice.invoice_line_ids[0].price_unit, 75.0, + 'membership: new subscription should create a line with the given price instead of product price') + + self.assertEqual( + self.partner_1.membership_state, 'none', + 'membership: old membership unpaid should be in non-member state') + + # the invoice is open -> customer goes to invoiced status + invoice.action_post() + + self.assertEqual( + self.partner_1.membership_state, 'none', + 'membership: after opening the invoice for old membership, it should remain in non paid status') + + # payment process + payment = self.env['account.payment'].create({ + 'destination_account_id': invoice.line_ids.account_id.filtered(lambda account: account.internal_type == 'receivable').id, + 'payment_method_id': self.env['account.payment.method'].search([], limit=1).id, + 'payment_type': 'inbound', + 'partner_type': 'customer', + 'partner_id': invoice.partner_id.id, + 'amount': 500, + 'company_id': self.env.company.id, + 'currency_id': self.env.company.currency_id.id, + }) + payment.action_post() + inv1_receivable = invoice.line_ids.filtered(lambda l: l.account_id.internal_type == 'receivable') + pay_receivable = payment.move_id.line_ids.filtered(lambda l: l.account_id.internal_type == 'receivable') + + (inv1_receivable + pay_receivable).reconcile() + + # the invoice is paid -> customer goes to paid status + self.assertEqual( + self.partner_1.membership_state, 'old', + 'membership: after paying the invoice, customer should be in old status') + + # check second partner then associate them + self.assertEqual( + self.partner_2.membership_state, 'free', + 'membership: free member customer should be in free state') + self.partner_2.write({'free_member': False, 'associate_member': self.partner_1.id}) + self.assertEqual( + self.partner_2.membership_state, 'old', + 'membership: associated customer should be in old state') + + def test_paid_membership(self): + self.assertEqual( + self.partner_1.membership_state, 'none', + 'membership: default membership status of partners should be None') + + # subscribes to a membership + invoice = self.partner_1.create_membership_invoice(self.membership_1, 75.0) + + self.assertEqual( + invoice.state, 'draft', + 'membership: new subscription should create a draft invoice') + self.assertEqual( + invoice.invoice_line_ids[0].product_id, self.membership_1, + 'membership: new subscription should create a line with the membership as product') + self.assertEqual( + invoice.invoice_line_ids[0].price_unit, 75.0, + 'membership: new subscription should create a line with the given price instead of product price') + + self.assertEqual( + self.partner_1.membership_state, 'waiting', + 'membership: new membership should be in waiting state') + + # the invoice is open -> customer goes to invoiced status + invoice.action_post() + self.assertEqual( + self.partner_1.membership_state, 'invoiced', + 'membership: after opening the invoice, customer should be in invoiced status') + + # the invoice is paid -> customer goes to paid status + payment = self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=invoice.ids)\ + .create({ + 'amount': 86.25 + })\ + ._create_payments() + + self.assertEqual( + self.partner_1.membership_state, 'paid', + 'membership: after paying the invoice, customer should be in paid status') + + # check second partner then associate them + self.assertEqual( + self.partner_2.membership_state, 'free', + 'membership: free member customer should be in free state') + self.partner_2.write({'free_member': False, 'associate_member': self.partner_1.id}) + self.assertEqual( + self.partner_2.membership_state, 'paid', + 'membership: associated customer should be in paid state') + + def test_cancel_membership(self): + self.assertEqual( + self.partner_1.membership_state, 'none', + 'membership: default membership status of partners should be None') + + # subscribes to a membership + invoice = self.partner_1.create_membership_invoice(self.membership_1, 75.0) + + def patched_today(*args, **kwargs): + return fields.Date.to_date('2019-01-01') + + with patch.object(fields.Date, 'today', patched_today): + invoice.button_cancel() + + self.partner_1._compute_membership_state() + self.assertEqual(invoice.state, 'cancel') + self.assertEqual(self.partner_1.membership_state, 'canceled') |
