Unit test(3) - 로그인 데코레이터 (jwt)

wltjs10645·2020년 10월 8일
0

django

목록 보기
14/15
post-thumbnail

장바구니에 물건을 담고, 수정하고, 삭제하기 위해서는 먼저
로그인 데코레이터를 통해 인가된 사용자인지 확인하는 작업이 선행된다. 이 부분을 어떻게 test code로 작성했는지 정리해본다.

  1. user fixture 생성 후 self.token 변수에 토큰을 담는다. 로그인 unit test는 user 앱에서 이미 작성했기 때문에 여기서는 생략.

  2. 생성해 둔 토큰을 헤더에 실어 보내기 위해 header 변수를 생성하고 딕셔너리 타입으로 {"HTTP_Authorization" : self.token} 데이터를 담아준다. (json 형식으로 post 를 보내야하기 때문)

    • key 값에 HTTP_ 를 꼭 적어줘야 하는데(안 적으면 오류) 이유를 좀 더 찾아봐야겠다.
  3. 카트에 유저 아이디가 저장되어야 하기 때문에 동일하게 token 에서 user 정보를 뽑아서 cart 객체에 담아서 test code를 작성했다.

import json 
import jwt

from django.test     import TestCase,Client

from .models         import Cart
from user.models     import User
from product.models  import Product, MainCategory, SubCategory
from my_settings     import SECRET, ALGORITHM

class CartTest(TestCase):
    def setUp(self):
        User.objects.create(
                id           = 1,
                email        = 'test@mail.com',
                password     = '1234567aA!',
                name         = 'test'
                )
        self.token = jwt.encode({'user_id' :User.objects.get(id=1).id}, SECRET['secret'], algorithm = ALGORITHM).decode('utf-8')
        print(self.token)
        
      	<--Product 관련 객체들 생성 (생략)-->
        
        Cart.objects.create(id=1, user_id=1, product_id=1)
    
    def tearDown(self):
        <-- (생략)-->

    def test_cart_post_success(self):
        client = Client()
        header = {"HTTP_Authorization" : self.token}
        token = header['HTTP_Authorization']
        print(token)
        payload      = jwt.decode(token, SECRET['secret'], algorithm = ALGORITHM)
        user         = User.objects.get(id = payload['user_id'])
        print(user.id)
        cart = {
            'id'         : 2,
            'user'       : user.id,
            'product_id' : 2,
            'count'      : 3
        }

        response = client.post('/cart', json.dumps(cart), **header, content_type='application/json')
        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.json(), {'cart_id':2})

테스트를 돌리는데 계속 401 에러가 떠서 토큰 값도 각각 프린트해보고 id도 뽑아보고 했는데 틀린 부분을 찾을 수가 없었다. 데코레이터 동작하는 부분 테스트하는 게 좀 어려웠어서 계속 이 부분이 문제라고 생각했는데 post method에 이미 카트가 존재하면 401 에러를 반환하게 설정해두어서 그런 거였다. cart fixture 로 1번 카트 만들어놓고 새카트 생성을 1번으로 계속 post 를 보내고 있었다.😐 새 카트 id 변경하고 아래와 같이 테스트 성공!

profile
BACKEND DEVELOPER☁️

1개의 댓글

comment-user-thumbnail
2020년 10월 9일

잘 보고 갑니다 😀

답글 달기