Django Rest Framework api test загрузить текстовый файл application / x-www-form-urlencoded - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь проверить мой Django REST API для загрузки файлов.

Подвох в том, что мой сервер пытается проверить файл так, чтобы файл имел распознанный тип файла. В настоящее время разрешены только текстовые типы файлов, например: docs, pdf, txt.

Я попытался использовать временный файл, и теперь я просто попытался прочитать файл с диска, а затем сдался.

Каждый раз, когда я использую временный файл, сервер отвечает:

    {
        "cover_letter": [
            "The submitted data was not a file. Check the encoding type on the form."
        ],
        "manuscript": [
            "The submitted data was not a file. Check the encoding type on the form."
        ]
    }

Это мой тест:

 def test_user_can_submit_a_paper(self):
     """
         Ensure that an user is able to upload a paper.

         This test is not working.. yet
     """
     tmp_file = open("__init__.py", "w")
     data = {
         "title": "paper",
         "authors": "me",
         "description": "ma detailed description",
         "manuscript": base64.b64encode(tmp_file.read()).decode(),
         "cover_letter": base64.b64encode(tmp_file.read()).decode()
     }
     tmp_file.close()


     response = self.client.post(self.papers_submitted, data=urlencode(MultiValueDict(data)), content_type='application/x-www-form-urlencoded',
                                 HTTP_AUTHORIZATION=self.authorization_header)
     print(response.data)
     self.assertEqual(response.status_code, status.HTTP_200_OK)

     del data["cover_letter"]
     response = self.client.post(self.papers_submitted, data=urlencode(MultiValueDict(data)), content_type='application/x-www-form-urlencoded',
                                 HTTP_AUTHORIZATION=self.authorization_header)
     print(response.data)
     self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

Я успешно проверил эту конечную точку через почтальона, но я не знаю, как это сделать в Python.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Мне удалось найти решение благодаря ответу Марка. Вот код, если кому-то интересно:

def test_user_can_submit_a_paper(self):
    from api.journal import PaperListSubmitted
    from django.test.client import RequestFactory
    from django.core.files import temp as tempfile
    """
        Ensure that an user is able to upload a paper.
    """

    request_factory = RequestFactory()
    manuscript = tempfile.NamedTemporaryFile(suffix=".txt")
    cover_letter = tempfile.NamedTemporaryFile(suffix=".txt")
    manuscript.write(b"This is my stupid paper that required me to research writing this test for over 5h")
    cover_letter.write(b"This is my stupid paper that required me to research writing this test for over 5h")
    manuscript.seek(0)
    cover_letter.seek(0)

    post_data = {
        "title": "My post title",
        "description": "this is my paper description",
        "authors": "no authors",
        "manuscript": manuscript,
        "cover_letter": cover_letter
    }

    request = request_factory.post(self.papers_submitted, HTTP_AUTHORIZATION=self.authorization_header,
                                   data=post_data)

    response = PaperListSubmitted.as_view()(request)
    self.assertEqual(response.status_code, status.HTTP_200_OK)
0 голосов
/ 25 апреля 2018

Если я понимаю, о чем вы спрашиваете, вы хотели бы проверить конечную точку DRF с загрузкой файла, используя python. Вы должны использовать RequestFactory, который имитирует запрос - это будет больше похоже на использование Postman.

Этот ответ Django: имитировать HTTP-запросы в оболочке имеет пример использования RequestFactory, и здесь есть несколько ответов django RequestFactory file upload для конкретных решений о том, как включить загруженные файлы с RequestFactory.

...