from datetime import date from dateutil.relativedelta import relativedelta from odoo.exceptions import ValidationError from odoo.tests.common import TransactionCase, tagged @tagged('post_install', '-at_install') class TestMembershipMemberDetails(TransactionCase): def _tier(self, code, **values): return self.env['community.membership.tier'].create({ 'name': code, 'code': code, 'price': 10.0, 'period': 'annual', **values, }) def test_fixed_term_tier_expires_after_term_years(self): tier = self._tier('DET-10Y', period='fixed_term', term_years=10) partner = self.env['res.partner'].create({'name': 'Ten Year Member', 'membership_tier_id': tier.id}) partner.action_activate_membership() self.assertEqual(partner.membership_expiry, partner.membership_start + relativedelta(years=10)) def test_name_built_from_first_and_last_name(self): partner = self.env['res.partner'].create({'first_name': 'Arun', 'last_name': 'Kumar'}) self.assertEqual(partner.name, 'Arun Kumar') def test_age_counts_birth_month(self): partner = self.env['res.partner'].create({'name': 'Aged Member', 'birth_month': '6', 'birth_year': 1960}) self.assertEqual(partner._age_on(date(2026, 5, 31)), 65) self.assertEqual(partner._age_on(date(2026, 6, 1)), 66) def test_tier_minimum_age_enforced(self): tier = self._tier('DET-SEN', min_age=65) this_year = date.today().year with self.assertRaises(ValidationError): self.env['res.partner'].create({ 'name': 'Too Young', 'membership_tier_id': tier.id, 'birth_month': '1', 'birth_year': this_year - 30, }) # Unknown birth year is allowed; the board can check documents instead. self.env['res.partner'].create({'name': 'Unknown Age', 'membership_tier_id': tier.id}) def test_birth_year_must_be_plausible(self): with self.assertRaises(ValidationError): self.env['res.partner'].create({'name': 'Bad Year', 'birth_year': 1850}) def test_family_members_listed_on_head(self): tier = self._tier('DET-FAM', allows_family_members=True) head = self.env['res.partner'].create({'name': 'Family Head', 'membership_tier_id': tier.id}) spouse = self.env['res.partner'].create({'name': 'Spouse', 'family_head_id': head.id}) self.assertEqual(head.family_member_ids, spouse) def test_board_approval(self): partner = self.env['res.partner'].create({ 'name': 'Applicant', 'membership_approval_state': 'pending', }) partner.action_approve_membership() self.assertEqual(partner.membership_approval_state, 'approved')