diff --git a/partner_programs/services/application_team.py b/partner_programs/services/application_team.py index a97cc708..46388b3f 100644 --- a/partner_programs/services/application_team.py +++ b/partner_programs/services/application_team.py @@ -124,7 +124,7 @@ def _lock_program(program: PartnerProgram) -> PartnerProgram: def _lock_application(application: Application) -> Application: return ( - Application.objects.select_for_update() + Application.objects.select_for_update(of=("self",)) .select_related("program", "user", "created_by", "project") .get(pk=application.pk) ) diff --git a/partner_programs/tests/test_application_team_service.py b/partner_programs/tests/test_application_team_service.py index 743a29ff..64d4e614 100644 --- a/partner_programs/tests/test_application_team_service.py +++ b/partner_programs/tests/test_application_team_service.py @@ -5,6 +5,7 @@ from partner_programs.models import Application, PartnerProgram, Team, TeamMember from partner_programs.services.application_team import ( + _lock_application, ActiveApplicationConflictError, ApplicationDeadlinePassedError, ApplicationNotEditableError, @@ -36,6 +37,29 @@ def setUp(self): self.user = create_user(prefix="team-service-owner") self.registration = create_program_member(self.program, user=self.user) + def test_application_lock_targets_only_application_row(self): + application = Application(pk=123) + + with patch( + "partner_programs.services.application_team." + "Application.objects.select_for_update" + ) as select_for_update: + queryset = select_for_update.return_value + related_queryset = queryset.select_related.return_value + related_queryset.get.return_value = application + + result = _lock_application(application) + + select_for_update.assert_called_once_with(of=("self",)) + queryset.select_related.assert_called_once_with( + "program", + "user", + "created_by", + "project", + ) + related_queryset.get.assert_called_once_with(pk=application.pk) + self.assertIs(result, application) + def configure_team_policy( self, *,