def test_post_update(self, client, user_factory, post_factory, faker):
        test_url = reverse_lazy(self.post_update_url, args=(1,))
        for http_method in ('get', 'post', 'put', 'patch', 'delete'):
            response = getattr(client, http_method)(test_url)
            assert response.status_code == status.HTTP_401_UNAUTHORIZED

        user = User.objects.prefetch_related('posts').last()
        client.force_authenticate(user)

        for http_method in ('get', 'post', 'put', 'delete'):
            response = getattr(client, http_method)(test_url)
            assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED

        new_user = user_factory()
        draft_post = post_factory(author=new_user, status=Post.DRAFT)
        non_draft_post = post_factory(author=new_user, status=Post.PUBLISHED)

        url = reverse_lazy(self.post_update_url, args=(draft_post.id,))
        response = client.patch(url)
        assert response.status_code == status.HTTP_403_FORBIDDEN

        url = reverse_lazy(self.post_update_url, args=(non_draft_post.id,))
        response = client.patch(url)
        assert response.status_code == status.HTTP_403_FORBIDDEN

        payloads = {}
        user_post = user.posts.last()

        url = reverse_lazy(self.post_update_url, args=(user_post.id,))
        response = client.patch(url, data=payloads)
        assert response.status_code == status.HTTP_200_OK
        response.data.pop(self.updated_field, None)
        data = PostSerializer(user_post).data
        data.pop(self.updated_field, None)
        assert response.data == data

        payloads = {
            self.title_field: faker.sentence(),
            self.body_field: faker.words(),
            self.status_field: Post.PUBLISHED,
            self.allow_comments_field: False,
        }

        response = client.patch(url, data=payloads)
        assert response.status_code == status.HTTP_200_OK
        assert response.data.get(self.title_field) != data.get(self.title_field)
        assert response.data.get(self.body_field) != data.get(self.body_field)
        assert response.data.get(self.status_field) == Post.PUBLISHED
        assert not response.data.get(self.allow_comments_field)