Skip to content

Commit

Permalink
Merge pull request #40 from JoMingyu/issue/39
Browse files Browse the repository at this point in the history
Category API 테스트
  • Loading branch information
JoMingyu committed Apr 8, 2019
2 parents 1049cf5 + ec8740c commit 5282707
Show file tree
Hide file tree
Showing 8 changed files with 118 additions and 45 deletions.
2 changes: 1 addition & 1 deletion app/views/board/category.py
Expand Up @@ -42,7 +42,7 @@ def post(self):

return {
'id': category.id
}
}, 201
except IntegrityError:
abort(409)

Expand Down
15 changes: 15 additions & 0 deletions tests/__init__.py
Expand Up @@ -3,10 +3,14 @@
from unittest import TestCase

from flask.wrappers import ResponseBase
from flask_jwt_extended import create_access_token
from werkzeug.security import generate_password_hash

from app import create_app
from app.extensions import main_db
from app.models import Base
from app.models.user import TblUsers
from app.views.user.account.signup import SignupAPI
from config import app_config, db_config


Expand All @@ -32,6 +36,17 @@ def setUpClass(cls):
def setUp(self):
Base.metadata.create_all(main_db.engine)

with self.app.test_request_context():
self.test_user_model = SignupAPI.Schema.Post.get_mock_object()
self.test_user_access_token = create_access_token(self.test_user_model.id)

self.session.add(TblUsers(
id=self.test_user_model.id,
password=generate_password_hash(self.test_user_model.password),
nickname=self.test_user_model.nickname
))
self.session.commit()

def tearDown(self):
Base.metadata.drop_all(main_db.engine)

Expand Down
Empty file added tests/board/__init__.py
Empty file.
79 changes: 79 additions & 0 deletions tests/board/test_category.py
@@ -0,0 +1,79 @@
from app.models.category import TblCategories
from app.views.board.category import CategoryAPI
from tests import BaseTest


class TestCategoryPostAPI(BaseTest):
def setUp(self):
super(TestCategoryPostAPI, self).setUp()

self.method = 'POST'
self.uri = '/board/categories'
self.set_authorization_header_jwt(self.test_user_access_token)

def test_happypath(self):
self.json = CategoryAPI.Schema.Post.get_mock_object().to_primitive()
resp = self.request()
self.assertEqual(201, resp.status_code)

payload = resp.json
self.assertDictEqual({
'id': 1
}, payload)

def test_category_name_duplicated(self):
name = self.generate_random_string()

self.session.add(
TblCategories(
name=name
)
)
self.session.commit()

self.json = {
'name': name
}
resp = self.request()
self.assertEqual(409, resp.status_code)


class TestCategoryGetAPI(BaseTest):
def setUp(self):
super(TestCategoryGetAPI, self).setUp()

self.uri = '/board/categories'
self.set_authorization_header_jwt(self.test_user_access_token)

def test_happypath(self):
category_names = [
self.generate_random_string() for _ in range(10)
]

for category_name in category_names:
self.session.add(
TblCategories(
name=category_name
)
)
self.session.commit()

resp = self.request()
self.assertEqual(200, resp.status_code)

payload = resp.json
self.assertDictEqual({
'data': [{
'id': id,
'name': category_name
} for id, category_name in zip(range(1, 11), category_names)]
}, payload)

def test_empty_category_list(self):
resp = self.request()
self.assertEqual(200, resp.status_code)

payload = resp.json
self.assertDictEqual({
'data': []
}, payload)
24 changes: 4 additions & 20 deletions tests/user/account/__init__.py
@@ -1,25 +1,9 @@
from jwt import decode

from werkzeug.security import generate_password_hash

from app.models.user import TblUsers
from app.views.user.account.signup import SignupAPI
from tests import BaseTest


class JWTRelatedTestBase(BaseTest):
def setUp(self):
super(JWTRelatedTestBase, self).setUp()

self.mock_object = SignupAPI.Schema.Post.get_mock_object()
with self.app.test_request_context():
self.session.add(TblUsers(
id=self.mock_object.id,
password=generate_password_hash(self.mock_object.password),
nickname=self.mock_object.nickname
))
self.session.commit()

class JWTRelatedTest(BaseTest):
def _validate_access_token(self, access_token, secret_key, expected_identity):
access_token_payload: dict = decode(access_token, secret_key)
self.assertEqual('access', access_token_payload['type'])
Expand All @@ -30,9 +14,9 @@ def _validate_refresh_token(self, refresh_token, secret_key, expected_identity):
self.assertEqual('refresh', refresh_token_payload['type'])
self.assertEqual(expected_identity, refresh_token_payload['identity'])

def validate_jwt_token(self, access_token: str, refresh_token: str):
secret_key = self.app.secret_key
expected_identity = self.mock_object.id
def validate_jwt_token(self, access_token: str, refresh_token: str, secret_key=None, expected_identity=None):
secret_key = secret_key or self.app.secret_key
expected_identity = expected_identity or self.test_user_model.id

self._validate_access_token(access_token, secret_key, expected_identity)
self._validate_refresh_token(refresh_token, secret_key, expected_identity)
21 changes: 12 additions & 9 deletions tests/user/account/test_auth.py
@@ -1,7 +1,7 @@
from tests.user.account import JWTRelatedTestBase
from tests.user.account import JWTRelatedTest


class TestAuthAPI(JWTRelatedTestBase):
class TestAuthAPI(JWTRelatedTest):
def setUp(self):
super(TestAuthAPI, self).setUp()

Expand All @@ -10,23 +10,26 @@ def setUp(self):

def test_happypath(self):
self.json = {
'id': self.mock_object.id,
'password': self.mock_object.password
'id': self.test_user_model.id,
'password': self.test_user_model.password
}

resp = self.request()
self.assertEqual(201, resp.status_code)

payload = resp.json
self.validate_jwt_token(payload['accessToken'], payload['refreshToken'])
self.validate_jwt_token(
payload['accessToken'],
payload['refreshToken']
)

def test_invalid_id(self):
"""
ID가 틀린 경우
"""
self.json = {
'id': self.mock_object.id + '!',
'password': self.mock_object.password
'id': self.test_user_model.id + '!',
'password': self.test_user_model.password
}

resp = self.request()
Expand All @@ -37,8 +40,8 @@ def test_invalid_password(self):
비밀번호가 틀린 경우
"""
self.json = {
'id': self.mock_object.id,
'password': self.mock_object.password + '!'
'id': self.test_user_model.id,
'password': self.test_user_model.password + '!'
}

resp = self.request()
Expand Down
10 changes: 5 additions & 5 deletions tests/user/account/test_refresh.py
@@ -1,18 +1,18 @@
from flask_jwt_extended import create_access_token, create_refresh_token

from tests.user.account import JWTRelatedTestBase
from tests.user.account import JWTRelatedTest


class TestRefreshAPI(JWTRelatedTestBase):
class TestRefreshAPI(JWTRelatedTest):
def setUp(self):
super(TestRefreshAPI, self).setUp()

self.method = 'GET'
self.path = '/user/account/refresh'

with self.app.test_request_context():
self.access_token = create_access_token(self.mock_object.id)
self.refresh_token = create_refresh_token(self.mock_object.id)
self.access_token = create_access_token(self.test_user_model.id)
self.refresh_token = create_refresh_token(self.test_user_model.id)

def test_happypath(self):
self.set_authorization_header_jwt(self.refresh_token)
Expand All @@ -24,7 +24,7 @@ def test_happypath(self):
self._validate_access_token(
payload['accessToken'],
self.app.secret_key,
self.mock_object.id
self.test_user_model.id
)

def test_refresh_with_access_token(self):
Expand Down
12 changes: 2 additions & 10 deletions tests/user/account/test_signup.py
@@ -1,4 +1,3 @@
from app.models.user import TblUsers
from app.views.user.account.signup import SignupAPI

from tests import BaseTest
Expand All @@ -10,10 +9,9 @@ def setUp(self):

self.method = 'POST'
self.path = '/user/account/signup'
self.mock_object = SignupAPI.Schema.Post.get_mock_object()
self.json = self.mock_object.to_primitive()

def test_happypath(self):
self.json = SignupAPI.Schema.Post.get_mock_object().mock_object.to_primitive()
resp = self.request()

self.assertEqual(201, resp.status_code)
Expand All @@ -22,13 +20,7 @@ def test_happypath(self):
# TODO

def test_id_duplicate(self):
self.session.add(TblUsers(
id=self.mock_object.id,
password=self.mock_object.password,
nickname=self.mock_object.nickname
))

self.session.commit()
self.json = self.test_user_model.to_primitive()

resp = self.request()

Expand Down

0 comments on commit 5282707

Please sign in to comment.