def test_delete_task(self):
        """
        Taskが正常に削除され、かつ、
        削除されたTaskのIDが返ってくることを期待する。
        """
        
        manipulator = TaskManipulator()
        TODO_USER = User.objects.get(pk=2)
        TODO_TITLE = "todo"
        TODO_DESCRIPTION = "todo-description"

        TODO_TASK = manipulator.create(
            user=TODO_USER,
            title=TODO_TITLE,
            description=TODO_DESCRIPTION
        )

        task_id = manipulator.delete_task(
            user=TODO_USER,
            task_id=TODO_TASK.id
        )
        

        self.assertEqual(task_id, TODO_TASK.id)

        # 正常に削除できていることを確認する。
        task, task_status = manipulator.get_task(user=TODO_USER, task_id=task_id)

        self.assertIsNone(task)
        self.assertIsNone(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_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_create_task(self):

        # 作成されることを期待しているTaskの情報を
        # 定数的に記述しておく。
        TODO_TITLE = "test-task"
        TODO_USER = User.objects.get(pk=2) 
        TODO_DESCRIPTION = "test-description"

        manipulator = TaskManipulator()

        task = manipulator.create(
            title=TODO_TITLE,
            user=TODO_USER,
            description=TODO_DESCRIPTION
        )

        self.assertIsNotNone(task.id)
        self.assertEqual(task.title, TODO_TITLE)
        self.assertEqual(task.description, TODO_DESCRIPTION)
        self.assertEqual(task.user, TODO_USER)

        # Task作成時に一緒に作成されているTaskStatusが期待したものかを確認する。

        EXPECTED_TASK_STATUS = TaskStatus.objects.get(pk=1)
        task_history = TaskHistory.objects.filter(task=task)
        self.assertEqual(len(task_history), 1)
        self.assertEqual(task_history[0].status, EXPECTED_TASK_STATUS)
    def test_delete_task_with_other_users(self):
        """
        存在するが、他Userに紐付いているTaskを
        削除しようとしてNoneが返ってくることを期待する。
        """
        manipulator = TaskManipulator()
        TODO_USER = User.objects.get(pk=2)
        TODO_TITLE = "todo"
        TODO_DESCRIPTION = "todo-description"

        TODO_TASK = manipulator.create(
            user=TODO_USER,
            title=TODO_TITLE,
            description=TODO_DESCRIPTION
        )

        user = User.objects.get(pk=1)
        task_id = manipulator.delete_task(
            user=user,
            task_id=TODO_TASK.id
        )

        self.assertIsNone(task_id)

        # 当該タスクが削除されていないことを確認する。
        task, _ = manipulator.get_task(user=TODO_USER, task_id=TODO_TASK.id)

        self.assertEqual(task, TODO_TASK)
    def test_delete_task(self):
        # JWTを取得
        TODO_USER = User.objects.get(pk=2)
        client = APIClient()

        path = reverse('auth')

        data = {
            "username": TODO_USER.username,
            "password": "******",
        }
        response = client.post(path=path, data=data, format='json')

        token = response.data.get('token')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # Taskを事前に作成
        TODO_TITLE = 'todo-title'
        TODO_DESCRIPTION = 'todo-description'
        manipulator = TaskManipulator()
        task = manipulator.create(title=TODO_TITLE,
                                  description=TODO_DESCRIPTION,
                                  user=TODO_USER)

        # 追加したタスクを削除
        path = reverse('specific_task', kwargs={'task_id': task.id})
        client = APIClient()
        client.credentials(HTTP_AUTHORIZATION='JWT ' + token)

        response = client.delete(path=path, format='json')

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data.get('id'), task.id)
        self.assertEqual(response.data.get('title'), task.title)
        self.assertEqual(response.data.get('description'), task.description)
    def test_get_tasks(self):

        manipulator = TaskManipulator()

        # 事前にタスクを作成
        TODO_USER = User.objects.get(pk=2)
        TODO_DESCRIPTION = "test-description"
        TODO_STATUS = TaskStatus.objects.get(pk=1)

        TODO_TASKS = []
        for i in range(3):
            task = manipulator.create(
                title=str(i),
                user=TODO_USER,
                description=TODO_DESCRIPTION
            )
            TODO_TASKS.append(task)

        task_list = manipulator.get_tasks(user=TODO_USER)

        self.assertEqual(len(task_list), 3)

        for i in range(3):
            self.assertEqual(task_list[i][0].id, TODO_TASKS[i].id)
            self.assertEqual(task_list[i][0].title, TODO_TASKS[i].title)
            self.assertEqual(task_list[i][0].description, TODO_TASKS[i].description)
            self.assertEqual(task_list[i][0].user, TODO_USER)
            self.assertEqual(task_list[i][1], TODO_STATUS)
Exemplo n.º 8
0
    def post(self, request):
        """
        メッセージボディとして以下を期待。
        {
            "title": Taskのtitle,
            "description": Taskの内容,
        }
        レスポンスメッセージとして以下を作成する。
        {
            "id": TaskのID,
            "title": Taskの名前,
            "description": Taskの詳細,
            "created_at": Taskの生成日時
        }
        """
        # https://qiita.com/xKxAxKx/items/60e8fb93d6bbeebcf065#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%AE%E6%83%85%E5%A0%B1%E5%8F%96%E5%BE%97
        data = JSONParser().parse(request)
        user = request.user

        manipulator = TaskManipulator()
        task = manipulator.create(
            title=data['title'],
            user=user,
            description=data['description']
        )

        serializer = TaskSerializer(task)
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    def test_get_tasks_without_tasks(self):

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

        task_list = manipulator.get_tasks(user=TODO_USER)

        self.assertEqual(len(task_list), 0)
Exemplo n.º 10
0
    def get(self, request, task_id=None):
        """
        1) task_idが指定されている場合
        ・対応するidを持つTaskがリクエストしたUserのものである場合は
          当該Task1つのみを当該Taskに含んだを返す。
        ・対応するTaskが存在しない場合は空配列と404 Not Foundを返す
        ・対応するTaskが存在してもリクエストしたUserのものではない場合も
        404 Not Foundとから配列を返す。
        2) task_idが指定されていない場合
        ・リクエストしたUserのTaskの配列を返す(200 OK)

        <返すレスポンスの形式>
        [
            {
                "id": Task.id,
                "title": Task.title,
                "description": Task.description,
                "status": Taskの最新TaskStatus.name
            },...
        ]
        """
        user = request.user
        manipulator = TaskManipulator()

        tasks = []
        if task_id is None:
            ts = manipulator.get_tasks(user=user)
        
            for task, task_status in ts:
                tasks.append({
                    "id": task.id,
                    "title": task.title,
                    "description": task.description,
                    "status": task_status.name,
                })
            

        else:
            task, task_status = manipulator.get_task(user=user, task_id=task_id)

            if task is None or task_status is None:
                # 一方のみがNone出ないことはアプリケーションの仕様上
                # ありえないが念の為
                serializer = TaskSerializer(tasks, many=True)
                return Response(data=serializer.data, status=status.HTTP_404_NOT_FOUND)

            tasks.append({
                "id": task.id,
                "title": task.title,
                "description": task.description,
                "status": task_status.name,
            })
        
        serializer = TaskSerializer(tasks, many=True)
        return Response(data=serializer.data, status=status.HTTP_200_OK)
    def test_update_task_with_other_user(self):
        """
        更新しようとしたTaskは存在するものの、
        リクエストしたUserに紐付かないものである場合に、
        404 Not Foundが返ってくることを確認する。
        """
        # JWTを取得
        TODO_USER = User.objects.get(pk=2)
        client = APIClient()

        path = reverse('auth')

        data = {
            "username": TODO_USER.username,
            "password": "******",
        }

        response = client.post(path=path, data=data, format='json')

        token = response.data.get('token')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # Taskを事前に作成
        TODO_TITLE = 'todo-title'
        TODO_DESCRIPTION = 'todo-description'
        USER = User.objects.get(pk=1)
        manipulator = TaskManipulator()
        task = manipulator.create(title=TODO_TITLE,
                                  description=TODO_DESCRIPTION,
                                  user=USER)

        # 追加したタスクを更新
        path = reverse('specific_task', kwargs={'task_id': task.id})
        client = APIClient()
        client.credentials(HTTP_AUTHORIZATION='JWT ' + token)

        TITLE = "title"
        DESCRIPTION = "description"
        STATUS = "status"

        UPDATED_TASK_TITLE = '洗濯機から洗濯物を回収する'
        UPDATED_TASK_DESCRIPTION = '洗濯機から乾燥済みの洗濯物を回収する'
        UPDATED_TASK_STATUS = TaskStatus.objects.get(pk=2).name
        data = {
            TITLE: UPDATED_TASK_TITLE,
            DESCRIPTION: UPDATED_TASK_DESCRIPTION,
            STATUS: UPDATED_TASK_STATUS
        }

        response = client.patch(path=path, data=data, format='json')

        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.assertIsNone(response.data)
    def test_get_task_not_exist(self):
        # 存在しないTaskのidを指定して
        # None, Noneが返ってくることを期待する。
        manipulator = TaskManipulator()

        TODO_USER = User.objects.get(pk=2) 

        # 明らかに存在しないTaskのidを指定する
        task, status = manipulator.get_task(user=TODO_USER, task_id=100)

        self.assertIsNone(task)
        self.assertIsNone(status)
    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 test_update_task_with_wrong_status(self):
        """
        存在しないTaskStatusを指定して更新を試みて
        400 Bad Requestが返ってくることを確認する
        """
        # JWTを取得
        TODO_USER = User.objects.get(pk=2)
        client = APIClient()

        path = reverse('auth')

        data = {
            "username": TODO_USER.username,
            "password": "******",
        }

        response = client.post(path=path, data=data, format='json')

        token = response.data.get('token')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # Taskを事前に作成
        TODO_TITLE = 'todo-title'
        TODO_DESCRIPTION = 'todo-description'
        TODO_USER = User.objects.get(pk=2)
        manipulator = TaskManipulator()
        task = manipulator.create(title=TODO_TITLE,
                                  description=TODO_DESCRIPTION,
                                  user=TODO_USER)

        # 追加したタスクを更新
        path = reverse('specific_task', kwargs={'task_id': task.id})
        client = APIClient()
        client.credentials(HTTP_AUTHORIZATION='JWT ' + token)

        TITLE = "title"
        DESCRIPTION = "description"
        STATUS = "status"

        UPDATED_TASK_TITLE = '洗濯機から洗濯物を回収する'
        UPDATED_TASK_DESCRIPTION = '洗濯機から乾燥済みの洗濯物を回収する'
        UPDATED_TASK_STATUS = "WRONG"
        data = {
            TITLE: UPDATED_TASK_TITLE,
            DESCRIPTION: UPDATED_TASK_DESCRIPTION,
            STATUS: UPDATED_TASK_STATUS
        }

        response = client.patch(path=path, data=data, format='json')

        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertIsNone(response.data)
Exemplo n.º 15
0
    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_delete_task_with_no_task(self):
        """
        存在しないTaskを指定する。
        Noneが返ってくることを期待する。
        """
        manipulator = TaskManipulator()
        TODO_USER = User.objects.get(pk=2)

        task_id = manipulator.delete_task(
            user=TODO_USER,
            task_id = 100
        )

        self.assertIsNone(task_id)
    def test_get_task(self):
        """
        task_idを指定して当該Taskを取得する
        """
        # JWTを取得
        TODO_USER = User.objects.get(pk=2)
        client = APIClient()

        path = reverse('auth')

        data = {
            "username": TODO_USER.username,
            "password": "******",
        }

        response = client.post(path=path, data=data, format='json')

        token = response.data.get('token')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # 取得対象Taskを追加
        TODO_TITLE = 'todo-title'
        TODO_DESCRIPTION = 'todo-description'

        manipulator = TaskManipulator()
        TODO_TASK = manipulator.create(title=TODO_TITLE,
                                       description=TODO_DESCRIPTION,
                                       user=TODO_USER)

        # 追加したTaskを取得
        path = reverse('specific_task', kwargs={'task_id': TODO_TASK.id})
        client = APIClient()
        client.credentials(HTTP_AUTHORIZATION='JWT ' + token)
        response = client.get(path=path, format='json')

        # レスポンスコードが200 OKであることを確認
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # 返ってきたTaskが事前に作成したTask(TODO_TASK)と一致することを確認
        tasks = response.data
        self.assertEqual(len(tasks), 1)
        self.assertEqual(tasks[0].get('id'), TODO_TASK.id)
        self.assertEqual(tasks[0].get('title'), TODO_TASK.title)
        self.assertEqual(tasks[0].get('description'), TODO_TASK.description)
        self.assertEqual(tasks[0].get('status'), "TODO")
Exemplo n.º 18
0
    def delete(self, request, task_id):
        """
        削除対象としたいtask_id以外は、特に不要
        レスポンスメッセージとして以下を期待
        {
            "id": 削除したTaskのID,
            "title": 削除したTaskのtitle,
            "description": 削除したTaskのdescription
        }
        削除に成功した場合は200 OKを返す。
        削除対象のTaskが存在しない場合は404 Not Foundを返す。
        404 Not Foundを返す際は、レスポンスボディは空
        (本当にTaskが存在しない場合、
        Taskに紐づくUserがリクエストしたUserと異なる場合も同様)
        """

        manipulator = TaskManipulator()

        user = request.user

        task, _ = manipulator.get_task(user=user, task_id=task_id)

        if task is None:
            return Response(status=status.HTTP_404_NOT_FOUND)

        response_task = {
            "id": task.id,
            "title": task.title,
            "description": task.description
        }

        task_id = manipulator.delete_task(user=user, task_id=task.id)

        if task_id is None:
            # 基本的にはこれは到達不可能コード
            # (事前に削除対象のタスクが存在し、
            # リクエストしたユーザのものであることを確認済みであるため)
            return Response(status=status.HTTP_404_NOT_FOUND)

        serializer = TaskSerializer(response_task)

        return Response(data=serializer.data, status=status.HTTP_200_OK)
    def test_get_task_updated(self):
        # 当該タスクに対してより新しいTaskStatusが追加された場合に
        # get_taskで最新のTaskStatusが取得できることを確認します。

        manipulator = TaskManipulator()
        
        # 事前にタスクを作成
        TODO_TITLE = "test-task"
        TODO_USER = User.objects.get(pk=2) 
        TODO_DESCRIPTION = "test-description"
        TODO_STATUS = TaskStatus.objects.get(pk=1)

        manipulator = TaskManipulator()

        TODO_TASK = manipulator.create(
            title=TODO_TITLE,
            user=TODO_USER,
            description=TODO_DESCRIPTION
        )
        
        # TaskHistoryにRUNNNINGの状態のものを追加
        RUNNING_STATUS = TaskStatus.objects.get(pk=2)
        TaskHistory(
            status=RUNNING_STATUS,
            task=TODO_TASK
        ).save()

        task, status = manipulator.get_task(user=TODO_USER, task_id=TODO_TASK.id) 

        self.assertEqual(task, TODO_TASK)
        self.assertEqual(status, RUNNING_STATUS)
    def test_get_task_without_tasks(self):
        """
        Task一覧を取得するがリクエストするUserの
        Taskが一見も存在しない場合に空配列を受け取れるかを確認する。
        """
        # JWTを取得
        TODO_USER = User.objects.get(pk=2)
        client = APIClient()

        path = reverse('auth')

        data = {
            "username": TODO_USER.username,
            "password": "******",
        }

        response = client.post(path=path, data=data, format='json')

        token = response.data.get('token')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # 別ユーザでタスクを追加
        OTHER_USER = User.objects.get(pk=1)
        manipulator = TaskManipulator()
        manipulator.create(title="todo",
                           description="todo-descirption",
                           user=OTHER_USER)

        # TODO_USERの持つTask一覧を取得
        path = reverse('task')
        client = APIClient()
        client.credentials(HTTP_AUTHORIZATION='JWT ' + token)
        response = client.get(path=path, format='json')

        # 200 OKが返ってくることを確認
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # tasksが空配列であることを確認する
        tasks = response.data
        self.assertEqual(len(tasks), 0)
    def test_get_task(self):
        # 当該Userに紐づくTaskが1つある場合に
        # Task, TaskStatus(TODO状態)が
        # 返ってくることを確認します。

        manipulator = TaskManipulator()
        
        # 事前にタスクを作成
        TODO_TITLE = "test-task"
        TODO_USER = User.objects.get(pk=2) 
        TODO_DESCRIPTION = "test-description"
        TODO_STATUS = TaskStatus.objects.get(pk=1)

        manipulator = TaskManipulator()

        TODO_TASK = manipulator.create(
            title=TODO_TITLE,
            user=TODO_USER,
            description=TODO_DESCRIPTION
        )
        
        task, status = manipulator.get_task(user=TODO_USER, task_id=TODO_TASK.id)

        self.assertEqual(task.title, TODO_TITLE)
        self.assertEqual(task.user, TODO_USER)
        self.assertEqual(task.description, TODO_DESCRIPTION)
        self.assertEqual(status, TODO_STATUS) 
    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_get_tasks_with_other_users(self):

        manipulator = TaskManipulator()

        # 事前にタスクを作成
        TODO_USER = User.objects.get(pk=2)
        TODO_DESCRIPTION = "test-description"
        TODO_STATUS = TaskStatus.objects.get(pk=1)

        TODO_TASKS = []
        for i in range(3):
            task = manipulator.create(
                title=str(i),
                user=TODO_USER,
                description=TODO_DESCRIPTION
            )
            TODO_TASKS.append(task)

        USER = User.objects.get(pk=1)

        task_list = manipulator.get_tasks(user=USER)

        self.assertEqual(len(task_list), 0)
    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_delete_task_with_other_users(self):
        # JWTを取得
        TODO_USER = User.objects.get(pk=2)
        client = APIClient()

        path = reverse('auth')

        data = {
            "username": TODO_USER.username,
            "password": "******",
        }
        response = client.post(path=path, data=data, format='json')

        token = response.data.get('token')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # 別Userに紐づくTaskを事前に作成
        TODO_TITLE = 'todo-title'
        TODO_DESCRIPTION = 'todo-description'
        manipulator = TaskManipulator()
        user = User.objects.get(pk=1)

        task = manipulator.create(user=user,
                                  title=TODO_TITLE,
                                  description=TODO_DESCRIPTION)

        # Taskが作成されていることを確認
        self.assertIsNotNone(task)

        # 他Userに紐づくTaskを削除しようと試みる
        path = reverse('specific_task', kwargs={'task_id': task.id})
        client = APIClient()
        client.credentials(HTTP_AUTHORIZATION='JWT ' + token)

        response = client.delete(path=path, format='json')

        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
    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)
    def test_get_task_with_other_users(self):
        # 指定したidのTaskは存在するが、
        # 他UserのTaskである場合。
        manipulator = TaskManipulator()
        
        # 事前にタスクを作成
        TODO_TITLE = "test-task"
        TODO_USER = User.objects.get(pk=2)
        TODO_DESCRIPTION = "test-description"

        manipulator = TaskManipulator()

        TODO_TASK = manipulator.create(
            title=TODO_TITLE,
            user=TODO_USER,
            description=TODO_DESCRIPTION
        )

        USER = User.objects.get(pk=1) # Task作成時のUserとは別Userを指定
        task, status = manipulator.get_task(user=USER, task_id=TODO_TASK.id)
        
        self.assertIsNone(task)
        self.assertIsNone(status)
    def test_get_tasks(self):
        """
        タスク一覧取得の処理を投げる。
        以下の結果を期待する。
        
        [
            {
                "id": "?",
                "title": "0",
                "description": "todo-description",
                "status": "TODO"
            },
            {
                "id": "?",
                "title": "1",
                "description": "todo-description",
                "status": "TODO"
            },
            {
                "id": "?",
                "title": "2",
                "description": "todo-description",
                "status": "TODO"
            }
        ]
        """
        # JWTを取得
        TODO_USER = User.objects.get(pk=2)
        client = APIClient()

        path = reverse('auth')

        data = {
            "username": TODO_USER.username,
            "password": "******",
        }

        response = client.post(path=path, data=data, format='json')

        token = response.data.get('token')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # Taskを事前に作成
        TODO_DESCRIPTION = 'todo-description'
        manipulator = TaskManipulator()
        for i in range(3):
            manipulator.create(title=str(i),
                               description=TODO_DESCRIPTION,
                               user=TODO_USER)

        path = reverse('task')
        client = APIClient()
        client.credentials(HTTP_AUTHORIZATION='JWT ' + token)
        response = client.get(path=path, format='json')

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        tasks = response.data

        self.assertEqual(len(tasks), 3)

        for i in range(3):
            self.assertEqual(tasks[i].get('title'), str(i))
            self.assertEqual(tasks[i].get('description'), TODO_DESCRIPTION)
            self.assertEqual(tasks[i].get('status'), "TODO")
    def test_update_task(self):
        """
        存在するtask_idを指定して更新を行い
        更新済みのTaskの情報が返ってくること、
        200 OKとなることを確認する。
        以下のような形式のメッセージが返ってくることを期待する。
        
        {
            "id": "?",
            "title": "0",
            "description": "todo-description",
            "status": "TODO"
        }
        """
        # JWTを取得
        TODO_USER = User.objects.get(pk=2)
        client = APIClient()

        path = reverse('auth')

        data = {
            "username": TODO_USER.username,
            "password": "******",
        }

        response = client.post(path=path, data=data, format='json')

        token = response.data.get('token')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # Taskを事前に作成
        TODO_TITLE = 'todo-title'
        TODO_DESCRIPTION = 'todo-description'
        TODO_USER = User.objects.get(pk=2)
        manipulator = TaskManipulator()
        task = manipulator.create(title=TODO_TITLE,
                                  description=TODO_DESCRIPTION,
                                  user=TODO_USER)

        # 追加したタスクを更新
        path = reverse('specific_task', kwargs={'task_id': task.id})
        client = APIClient()
        client.credentials(HTTP_AUTHORIZATION='JWT ' + token)

        TITLE = "title"
        DESCRIPTION = "description"
        STATUS = "status"

        UPDATED_TASK_TITLE = '洗濯機から洗濯物を回収する'
        UPDATED_TASK_DESCRIPTION = '洗濯機から乾燥済みの洗濯物を回収する'
        UPDATED_TASK_STATUS = TaskStatus.objects.get(pk=2).name
        data = {
            TITLE: UPDATED_TASK_TITLE,
            DESCRIPTION: UPDATED_TASK_DESCRIPTION,
            STATUS: UPDATED_TASK_STATUS
        }

        response = client.patch(path=path, data=data, format='json')

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data.get("id"), task.id)
        self.assertEqual(response.data.get("title"), UPDATED_TASK_TITLE)
        self.assertEqual(response.data.get("description"),
                         UPDATED_TASK_DESCRIPTION)
        self.assertEqual(response.data.get("status"), UPDATED_TASK_STATUS)