@@ -633,6 +633,43 @@ def test_update_task_handles_null_priority_and_status(
633
633
self .assertIsNone (update_payload_sent_to_repo ["priority" ])
634
634
self .assertIsNone (update_payload_sent_to_repo ["status" ])
635
635
636
+ @patch ("todo.services.task_service.TaskRepository.get_by_id" )
637
+ @patch ("todo.services.task_service.TaskRepository.update" )
638
+ @patch ("todo.services.task_service.TaskRepository._get_assigned_task_ids_for_user" )
639
+ def test_update_task_permission_denied_if_not_creator_or_assignee (
640
+ self , mock_get_assigned , mock_update , mock_get_by_id
641
+ ):
642
+ task_id = self .task_id_str
643
+ user_id = "not_creator_or_assignee"
644
+ task_model = self .default_task_model .model_copy (deep = True )
645
+ task_model .createdBy = "some_other_user"
646
+ mock_get_by_id .return_value = task_model
647
+ mock_get_assigned .return_value = []
648
+ validated_data = {"title" : "new title" }
649
+ with self .assertRaises (PermissionError ) as context :
650
+ TaskService .update_task (task_id , validated_data , user_id )
651
+ self .assertEqual (str (context .exception ), ApiErrors .UNAUTHORIZED_TITLE )
652
+ mock_get_by_id .assert_called_once_with (task_id )
653
+ mock_get_assigned .assert_called_once_with (user_id )
654
+ mock_update .assert_not_called ()
655
+
656
+ @patch ("todo.services.task_service.TaskRepository.get_by_id" )
657
+ @patch ("todo.services.task_service.TaskRepository.update" )
658
+ @patch ("todo.services.task_service.TaskRepository._get_assigned_task_ids_for_user" )
659
+ def test_update_task_permission_allowed_if_assignee (self , mock_get_assigned , mock_update , mock_get_by_id ):
660
+ task_id = self .task_id_str
661
+ user_id = "assignee_user"
662
+ task_model = self .default_task_model .model_copy (deep = True )
663
+ task_model .createdBy = "some_other_user"
664
+ mock_get_by_id .return_value = task_model
665
+ mock_get_assigned .return_value = [task_model .id ]
666
+ mock_update .return_value = task_model
667
+ validated_data = {"title" : "new title" }
668
+ TaskService .update_task (task_id , validated_data , user_id )
669
+ mock_get_by_id .assert_called_once_with (task_id )
670
+ mock_get_assigned .assert_called_once_with (user_id )
671
+ mock_update .assert_called_once ()
672
+
636
673
637
674
class TaskServiceDeferTests (TestCase ):
638
675
def setUp (self ):
@@ -745,3 +782,44 @@ def test_defer_task_on_done_task_raises_conflict(self, mock_repo_get_by_id, mock
745
782
self .assertEqual (str (context .exception ), ValidationErrors .CANNOT_DEFER_A_DONE_TASK )
746
783
mock_repo_get_by_id .assert_called_once_with (self .task_id )
747
784
mock_repo_update .assert_not_called ()
785
+
786
+ @patch ("todo.services.task_service.TaskRepository.get_by_id" )
787
+ @patch ("todo.services.task_service.TaskRepository.update" )
788
+ @patch ("todo.services.task_service.TaskRepository._get_assigned_task_ids_for_user" )
789
+ def test_defer_task_permission_denied_if_not_creator_or_assignee (
790
+ self , mock_get_assigned , mock_update , mock_get_by_id
791
+ ):
792
+ task_id = self .task_id
793
+ user_id = "not_creator_or_assignee"
794
+ task_model = self .task_model
795
+ task_model .createdBy = "some_other_user"
796
+ mock_get_by_id .return_value = task_model
797
+ mock_get_assigned .return_value = []
798
+ deferred_till = self .current_time + timedelta (days = 5 )
799
+ with self .assertRaises (PermissionError ) as context :
800
+ TaskService .defer_task (task_id , deferred_till , user_id )
801
+ self .assertEqual (str (context .exception ), ApiErrors .UNAUTHORIZED_TITLE )
802
+ mock_get_by_id .assert_called_once_with (task_id )
803
+ mock_get_assigned .assert_called_once_with (user_id )
804
+ mock_update .assert_not_called ()
805
+
806
+ @patch ("todo.services.task_service.TaskRepository.get_by_id" )
807
+ @patch ("todo.services.task_service.TaskRepository._get_assigned_task_ids_for_user" )
808
+ @patch ("todo.services.task_service.TaskRepository.delete_by_id" )
809
+ def test_delete_task_permission_denied_if_not_creator_or_assignee (
810
+ self , mock_delete_by_id , mock_get_assigned , mock_get_by_id
811
+ ):
812
+ task_id = str (ObjectId ())
813
+ user_id = "not_creator_or_assignee"
814
+ task_model = MagicMock ()
815
+ task_model .createdBy = "some_other_user"
816
+ task_model .id = ObjectId (task_id )
817
+ mock_get_by_id .return_value = task_model
818
+ mock_get_assigned .return_value = []
819
+ mock_delete_by_id .side_effect = PermissionError (ApiErrors .UNAUTHORIZED_TITLE )
820
+ with self .assertRaises (PermissionError ) as context :
821
+ TaskService .delete_task (task_id , user_id )
822
+ self .assertEqual (str (context .exception ), ApiErrors .UNAUTHORIZED_TITLE )
823
+ mock_get_by_id .assert_not_called ()
824
+ mock_get_assigned .assert_not_called ()
825
+ mock_delete_by_id .assert_called_once_with (task_id , user_id )
0 commit comments