bemade-addons/bemade_sports_clinic/tests/test_treatment_professional_consistency.py
Denis Durepos c0834eb327 [REF] bemade_sports_clinic: Remove injury models and simplify data model
- Removed models/injury_models.py and all its references
- Converted relational fields to character fields:
  - body_location_id → body_location
  - injury_type_id → injury_type
- Updated portal templates to use text inputs instead of dropdowns
- Updated controller code to process the new field formats
- Removed related access rights from security CSV
- Modified test files to accommodate the new structure

This refactoring simplifies the data model by removing unnecessary
classifications that were adding complexity without significant benefit.
The direct text fields maintain the same functionality while reducing
the database overhead and simplifying the UI.
2025-07-16 11:37:50 -04:00

304 lines
17 KiB
Python

from odoo.tests import TransactionCase, tagged
from odoo import Command
@tagged("-at_install", "post_install")
class TestTreatmentProfessionalConsistency(TransactionCase):
"""Test the consistency between role assignments, security groups, and computed fields."""
@classmethod
def setUpClass(cls):
super().setUpClass()
# Get treatment professional group
cls.treatment_prof_group = cls.env.ref('bemade_sports_clinic.group_sports_clinic_treatment_professional')
# Create a test team
cls.team = cls.env['sports.team'].create({
'name': 'Test Team',
})
# Create test partners for different roles
cls.partner_head_therapist = cls.env['res.partner'].create({
'name': 'Head Therapist Partner',
'email': 'head.therapist@example.com',
})
cls.partner_therapist = cls.env['res.partner'].create({
'name': 'Therapist Partner',
'email': 'therapist@example.com',
})
cls.partner_coach = cls.env['res.partner'].create({
'name': 'Coach Partner',
'email': 'coach@example.com',
})
# Create a partner for portal user testing
cls.partner_portal_therapist = cls.env['res.partner'].create({
'name': 'Portal Therapist Partner',
'email': 'portal.therapist@example.com',
})
# Create users for each partner with different user types
cls.user_head_therapist = cls.env['res.users'].create({
'name': 'Head Therapist User (Internal)',
'login': 'head.therapist@example.com',
'partner_id': cls.partner_head_therapist.id,
'groups_id': [(4, cls.env.ref('base.group_user').id)], # Internal user
})
cls.user_therapist = cls.env['res.users'].create({
'name': 'Therapist User (Internal)',
'login': 'therapist@example.com',
'partner_id': cls.partner_therapist.id,
'groups_id': [(4, cls.env.ref('base.group_user').id)], # Internal user
})
cls.user_portal_therapist = cls.env['res.users'].create({
'name': 'Portal Therapist User',
'login': 'portal.therapist@example.com',
'partner_id': cls.partner_portal_therapist.id,
'groups_id': [(4, cls.env.ref('base.group_portal').id)], # Portal user
})
cls.user_coach = cls.env['res.users'].create({
'name': 'Coach User (Portal)',
'login': 'coach@example.com',
'partner_id': cls.partner_coach.id,
'groups_id': [(4, cls.env.ref('base.group_portal').id)], # Portal user
})
def test_role_assignment_updates_security_group(self):
"""Test that assigning therapist roles correctly updates security groups."""
# Check initial state - no users should have treatment professional group or flag
self.assertFalse(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertFalse(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertFalse(self.user_portal_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertFalse(self.user_coach.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertFalse(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertFalse(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertFalse(self.user_portal_therapist.has_group('bemade_sports_clinic.group_portal_treatment_professional'))
self.assertFalse(self.user_coach.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
# 1. Create a head therapist staff record
head_therapist_staff = self.env['sports.team.staff'].create({
'team_id': self.team.id,
'partner_id': self.partner_head_therapist.id,
'role': 'head_therapist',
})
# Verify head therapist gets treatment professional group and flag
# No need to invalidate models anymore as we check group membership directly # Force recomputation
self.assertTrue(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'),
"Head therapist user should be added to treatment professional group")
self.assertTrue(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'),
"Head therapist should be in treatment professional group")
# 2. Create a therapist staff record
therapist_staff = self.env['sports.team.staff'].create({
'team_id': self.team.id,
'partner_id': self.partner_therapist.id,
'role': 'therapist',
})
# Verify therapist gets treatment professional group and flag
# No need to invalidate models anymore as we check group membership directly # Force recomputation
self.assertTrue(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'),
"Therapist user should be added to treatment professional group")
self.assertTrue(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'),
"Therapist should be in treatment professional group")
# 3. Create a coach staff record - should NOT be in treatment professional group
coach_staff = self.env['sports.team.staff'].create({
'team_id': self.team.id,
'partner_id': self.partner_coach.id,
'role': 'coach',
})
# Verify coach does NOT get treatment professional group or flag
# No need to invalidate models anymore as we check group membership directly # Force recomputation
self.assertFalse(self.user_coach.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'),
"Coach should NOT be added to treatment professional group")
self.assertFalse(self.user_coach.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'),
"Coach should NOT have treatment professional group membership")
# 4. Test changing roles - change head therapist to coach
head_therapist_staff.write({'role': 'coach'})
# Verify head therapist loses treatment professional group and flag
# No need to invalidate models anymore as we check group membership directly # Force recomputation
self.assertFalse(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'),
"Former head therapist should be removed from treatment professional group")
self.assertFalse(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'),
"Former head therapist should NOT have treatment professional group membership")
# 5. Test manual group assignment for internal users
# Use the internal user therapist instead of the portal user coach
self.user_therapist.write({'groups_id': [(4, self.treatment_prof_group.id)]})
# Verify therapist now has treatment professional flag due to group membership
# No need to invalidate models anymore as we check group membership directly # Force recomputation
self.assertTrue(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'),
"Therapist should have treatment professional group after manual assignment")
self.assertTrue(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'),
"Therapist should be in treatment professional group after direct group assignment")
def test_group_membership_preserved_across_role_changes(self):
"""Test that group membership is correctly managed when roles change."""
# Create initial staff record with therapist role
staff = self.env['sports.team.staff'].create({
'team_id': self.team.id,
'partner_id': self.partner_head_therapist.id,
'role': 'therapist',
})
# Verify user is in treatment professional group
# No need to invalidate models anymore as we check group membership directly
self.assertTrue(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
# Change role to non-therapist role
staff.write({'role': 'other'})
# Verify user is removed from treatment professional group
# No need to invalidate models anymore as we check group membership directly
self.assertFalse(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
# Change back to therapist role
staff.write({'role': 'therapist'})
# Verify user is added back to treatment professional group
# No need to invalidate models anymore as we check group membership directly
self.assertTrue(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
def test_multiple_team_assignments(self):
"""Test that multiple team assignments are handled correctly."""
# Create second team
team2 = self.env['sports.team'].create({
'name': 'Second Test Team',
})
# Assign user as coach in team 1 and head therapist in team 2
coach_staff = self.env['sports.team.staff'].create({
'team_id': self.team.id,
'partner_id': self.partner_head_therapist.id,
'role': 'coach',
})
therapist_staff = self.env['sports.team.staff'].create({
'team_id': team2.id,
'partner_id': self.partner_head_therapist.id,
'role': 'head_therapist',
})
# Verify user is in treatment professional group due to any therapist role
# No need to invalidate models anymore as we check group membership directly
self.assertTrue(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertTrue(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
# Remove therapist role on team 2
therapist_staff.write({'role': 'other'})
# Verify user loses treatment professional status
# No need to invalidate models anymore as we check group membership directly
self.assertFalse(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertFalse(self.user_head_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
def test_role_removal_through_deletion(self):
"""Test that deleting staff records properly removes treatment professional status."""
# Create therapist staff record
therapist_staff = self.env['sports.team.staff'].create({
'team_id': self.team.id,
'partner_id': self.partner_therapist.id,
'role': 'therapist',
})
# Verify user gets treatment professional group
# No need to invalidate models anymore as we check group membership directly
self.assertTrue(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertTrue(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
# Delete the staff record
therapist_staff.unlink()
# Verify user loses treatment professional status after deletion
# No need to invalidate models anymore as we check group membership directly
self.assertFalse(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertFalse(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
def test_multiple_role_assignments_deletion(self):
"""Test that deleting one therapist role preserves status if other therapist roles exist."""
# Create two therapist staff records on different teams
team2 = self.env['sports.team'].create({
'name': 'Second Test Team',
})
therapist_staff1 = self.env['sports.team.staff'].create({
'team_id': self.team.id,
'partner_id': self.partner_therapist.id,
'role': 'therapist',
})
therapist_staff2 = self.env['sports.team.staff'].create({
'team_id': team2.id,
'partner_id': self.partner_therapist.id,
'role': 'head_therapist',
})
# Verify user has treatment professional status
# No need to invalidate models anymore as we check group membership directly
self.assertTrue(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
# Delete one staff record but not the other
therapist_staff1.unlink()
# Verify user still has treatment professional status (from the second record)
# No need to invalidate models anymore as we check group membership directly
self.assertTrue(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertTrue(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
# Delete the second staff record
therapist_staff2.unlink()
# Verify user loses treatment professional status
# No need to invalidate models anymore as we check group membership directly
self.assertFalse(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertFalse(self.user_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
def test_portal_user_as_treatment_professional(self):
"""Test that portal users can be treatment professionals via the flag without group membership."""
# Verify initially the portal user is not a treatment professional
self.assertFalse(self.user_portal_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'))
self.assertFalse(self.user_portal_therapist.has_group('bemade_sports_clinic.group_portal_treatment_professional'))
# Verify the user is a portal user and not an internal user
self.assertTrue(self.user_portal_therapist.has_group('base.group_portal'))
self.assertFalse(self.user_portal_therapist.has_group('base.group_user'))
# Assign portal user as head therapist
portal_therapist_staff = self.env['sports.team.staff'].create({
'team_id': self.team.id,
'partner_id': self.partner_portal_therapist.id,
'role': 'head_therapist',
})
# Verify portal user gets treatment professional flag but NOT the group
# (would conflict with portal user type)
# No need to invalidate models anymore as we check group membership directly
self.assertFalse(self.user_portal_therapist.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional'),
"Portal user should NOT be added to treatment professional group (would conflict with user type)")
self.assertTrue(self.user_portal_therapist.has_group('bemade_sports_clinic.group_portal_treatment_professional'),
"Portal user with therapist role should be in portal treatment professional group")
# Verify user is still a portal user and not an internal user
self.assertTrue(self.user_portal_therapist.has_group('base.group_portal'))
self.assertFalse(self.user_portal_therapist.has_group('base.group_user'))
# Remove therapist role
portal_therapist_staff.write({'role': 'other'})
# Verify portal user loses treatment professional status
# No need to invalidate models anymore as we check group membership directly
self.assertFalse(self.user_portal_therapist.has_group('bemade_sports_clinic.group_portal_treatment_professional'),
"Portal user should NOT have portal treatment professional group when role is changed")