def test_update_task_with_wrong_status(self):
        
        manipulator = TaskManipulator()

        # 事前にタスクを作成
        TODO_USER = User.objects.get(pk=2)
        TODO_TITLE = "todo"
        TODO_DESCRIPTION = "test-description"
        
        task = manipulator.create(
            title=TODO_TITLE,
            user=TODO_USER,
            description=TODO_DESCRIPTION
        ) 

        
        # 更新処理タスクが期待したとおりに更新されているかを確認
        UPDATED_TITLE = "updated"
        UPDATED_DESCRIPTION = "updated-description"
        WRONG_STATUS = "wrong"

        updated_task, updated_task_status = manipulator.update_task(
            user=TODO_USER,
            task_id=task.id,
            title=UPDATED_TITLE,
            description=UPDATED_DESCRIPTION,
            status=WRONG_STATUS
        )

        # Taskが更新されていないこと、
        # TaskStatusとしてNoneが返ってきていることを確認
        self.assertEqual(updated_task, task)
        self.assertIsNone(updated_task_status)
    def test_update_task_with_status_only(self):
        """
        TaskStatusのみをアップデート
        """
        manipulator = TaskManipulator()

        # 事前にタスクを作成
        TODO_USER = User.objects.get(pk=2)
        TODO_TITLE = "todo"
        TODO_DESCRIPTION = "test-description"
        
        task = manipulator.create(
            title=TODO_TITLE,
            user=TODO_USER,
            description=TODO_DESCRIPTION
        ) 

        # 更新処理タスクが期待したとおりに更新されているかを確認
        RUNNING_STATUS = TaskStatus.objects.get(pk=2)

        updated_task, updated_task_status = manipulator.update_task(
            user=TODO_USER,
            task_id=task.id,
            status=RUNNING_STATUS.name
        )

        self.assertEqual(updated_task.id, task.id)
        self.assertEqual(updated_task.title, TODO_TITLE)
        self.assertEqual(updated_task.description, TODO_DESCRIPTION)
        self.assertEqual(updated_task.user, TODO_USER)
        self.assertEqual(updated_task_status.name, RUNNING_STATUS.name)
    def test_update_task_without_task_id(self):

        manipulator = TaskManipulator()
        user = User.objects.get(pk=2)

        task, task_status = manipulator.update_task(
            user=user,
            task_id=None
        )

        self.assertIsNone(task)
        self.assertIsNone(task_status)
    def patch(self, request, task_id):
        """
        メッセージボディとして以下を期待
        {
            "title": Taskの名前,
            "description": Taskの内容,
            "status": TaskStatusの名前
        }
        レスポンスメッセージとして以下を作成する。
        {
            "id": TaskのID,
            "title": 更新済みTaskの名前,
            "description": 更新済みTaskの詳細,
            "status": 更新済みTaskStatus
        }
        """



        data = JSONParser().parse(request)
        user = request.user

        manipulator = TaskManipulator()
        
        task, task_status = manipulator.update_task(
            user = user,
            task_id=task_id,
            title=data.get("title"),
            description=data.get("description"),
            status=data.get("status")
        )


        if task_status is None:
            if task is None:
                return Response(data=None, status=status.HTTP_404_NOT_FOUND)
            return Response(data=None, status=status.HTTP_400_BAD_REQUEST)
        
        if task is None:
            return Response(data=None, status=status.HTTP_404_NOT_FOUND)
        
        response_task = {
            "id": task.id,
            "title": task.title,
            "description": task.description,
            "status": task_status.name,
        }
        serializer = TaskSerializer(response_task)

        return Response(data=serializer.data, status=status.HTTP_200_OK)
    def test_update_task_status_with_other_user(self):
        """
        他のユーザに紐づくタスクを指定した場合
        に更新されずにNone, Noneが返ってくることを確認
        """

        manipulator = TaskManipulator()

        # 事前にタスクを作成
        TODO_USER = User.objects.get(pk=2)
        TODO_TITLE = "todo"
        TODO_DESCRIPTION = "test-description"
        
        task = manipulator.create(
            title=TODO_TITLE,
            user=TODO_USER,
            description=TODO_DESCRIPTION
        ) 

        # 更新処理タスクが期待したとおりに更新されているかを確認
        USER = User.objects.get(pk=1)
        RUNNING_STATUS = TaskStatus.objects.get(pk=2)
        UPDATED_TITLE = "updated"
        UPDATED_DESCRIPTION = "updated-description"

        updated_task, updated_task_status = manipulator.update_task(
            user=USER,
            task_id=task.id,
            title=UPDATED_TITLE,
            description=UPDATED_DESCRIPTION,
            status=RUNNING_STATUS.name
        )

        self.assertIsNone(updated_task)
        self.assertIsNone(updated_task_status)

        task = Task.objects.get(pk=task.id)
        self.assertEqual(task.title, TODO_TITLE)
        self.assertEqual(task.description, TODO_DESCRIPTION)
    def test_update_task_status_without_task(self):
        """
        指定したtask_idに対応するTaskが存在しない場合
        """
        manipulator = TaskManipulator()

        TODO_USER = User.objects.get(pk=2)
        # 更新処理タスクが期待したとおりに更新されているかを確認
        UPDATED_TITLE = "updated"
        UPDATED_DESCRIPTION = "updated-description"
        RUNNING_STATUS = TaskStatus.objects.get(pk=2)

        updated_task, updated_task_status = manipulator.update_task(
            user=TODO_USER,
            task_id=140000000,
            title=UPDATED_TITLE,
            description=UPDATED_DESCRIPTION,
            status=RUNNING_STATUS
        )

        # Task, TaskStatusともにNoneであることを確認
        self.assertIsNone(updated_task)
        self.assertIsNone(updated_task_status)
    def test_update_task(self):
        """
        正常にTaskおよびTaskStatusの更新ができることを確認する
        """

        manipulator = TaskManipulator()

        # 事前にタスクを作成
        TODO_USER = User.objects.get(pk=2)
        TODO_TITLE = "todo"
        TODO_DESCRIPTION = "test-description"
        
        task = manipulator.create(
            title=TODO_TITLE,
            user=TODO_USER,
            description=TODO_DESCRIPTION
        ) 

        # 更新処理タスクが期待したとおりに更新されているかを確認
        RUNNING_STATUS = TaskStatus.objects.get(pk=2)
        UPDATED_TITLE = "updated"
        UPDATED_DESCRIPTION = "updated-description"

        updated_task, updated_task_status = manipulator.update_task(
            user=TODO_USER,
            task_id=task.id,
            title=UPDATED_TITLE,
            description=UPDATED_DESCRIPTION,
            status=RUNNING_STATUS.name
        )

        self.assertEqual(updated_task.id, task.id)
        self.assertEqual(updated_task.title, UPDATED_TITLE)
        self.assertEqual(updated_task.description, UPDATED_DESCRIPTION)
        self.assertEqual(updated_task.user, TODO_USER)
        self.assertEqual(updated_task_status.name, RUNNING_STATUS.name)