DRF 5-16 이미지 포함한 글 작성 테스트

Grace Goh·2022년 11월 16일
0

Django Rest Framework

목록 보기
32/36
# articles/test.py

from django.urls import reverse
from rest_framework.test import APITestCase
from rest_framework import status
from users.models import User

# 이미지 업로드
from django.test.client import MULTIPART_CONTENT, encode_multipart, BOUNDARY
from PIL import Image
import tempfile # 임시파일 만드는 library

def get_temporary_image(temp_file): # 임시이미지 만들기
    size = (200, 200)
    color = (255, 0, 0, 0)
    image = Image.new("RGBA", size, color)
    image.save(temp_file, 'png')
    return temp_file


class ArticleCreateTest(APITestCase):
    @classmethod
    def setUpTestData(cls): 
        cls.user_data = {'email':'hp@gmail.com', 'password':'hp'}
        cls.article_data = {'title':'hp', 'content':'hp is hp'}
        cls.user = User.objects.create_user('hp@gmail.com', 'hp')

    def setUp(self):
        self.access_token = self.client.post(reverse('token_obtain_pair'), self.user_data).data['access']

    def test_fail_if_not_logged_in(self):
        url = reverse("article_view") 
        response = self.client.post(url, self.article_data) 
        self.assertEqual(response.status_code, 401)

    def test_create_article(self):
        response = self.client.post(
            path=reverse("article_view"), 
            data=self.article_data, # 동일
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}"
        )
        self.assertEqual(response.status_code, 200)



    def test_create_article_with_image(self):
        # 임시 이미지 파일 생성하기 
        temp_file = tempfile.NamedTemporaryFile() # py에서 제공하는 임시파일 만들기
        temp_file.name = "image.png"
        image_file = get_temporary_image(temp_file) # 맨 위에 있는 함수에 넣어 
        image_file.seek(0) # 이미지의 첫 번째 프레임 받아오기
        self.article_data["image"] = image_file # 위 cls.article_data에 image까지 추가됨.

        # 전송
        response = self.client.post(
            path=reverse("article_view"), # 동일하게
            data=encode_multipart(data = self.article_data, boundary=BOUNDARY)
            content_type=MULTIPART_CONTENT,
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}"
        )
        self.assertEqual(response.data["message"], "글 작성 완료")
profile
Español, Inglés, Coreano y Python

0개의 댓글