diff --git a/core/tests.py b/core/tests.py
deleted file mode 100644
index 10cbc14cc3ad6d17b3f45744b488bf50888cf87f..0000000000000000000000000000000000000000
--- a/core/tests.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from django.contrib.auth.models import User
-from rest_framework.test import APIClient
-from rest_framework.test import APITestCase
-from rest_framework import status
-
-from .models.profile import Profile
-
-
-class ProfileTestCase(APITestCase):
-
-    """
-    Test suite for Contact
-    """
-    def setUp(self):
-        self.client = APIClient()
-        self.data = {
-            "username": "xjhmlcy",
-            "email": "xjhmlcy@gmail.com",
-            "password": "abcdefg123"
-        }
-        self.url = "/api/auth/register"
-
-    def test_create_contact(self):
-        '''
-        test ContactViewSet create method
-        '''
-        data = self.data
-        response = self.client.post(self.url, data)
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
-        self.assertEqual(User.objects.count(), 1)
-        self.assertEqual(Profile.objects.count(), 1)
-        self.assertEqual(User.objects.get().username, "xjhmlcy")
-        self.assertEqual(Profile.objects.get().user.email, "xjhmlcy@gmail.com")
diff --git a/core/tests/__init__.py b/core/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/core/tests/test_auth.py b/core/tests/test_auth.py
new file mode 100644
index 0000000000000000000000000000000000000000..4637c809a422aa68820a53b70fc6ef446f984d51
--- /dev/null
+++ b/core/tests/test_auth.py
@@ -0,0 +1,130 @@
+from django.contrib.auth.models import User
+from rest_framework.test import APITestCase
+from rest_framework import status
+from knox.models import AuthToken
+
+from core.models.profile import Profile
+
+
+class AuthTests(APITestCase):
+
+    """
+    Test suite for Auth
+    """
+    def add_test_person(self, username, email, password):
+        user = User.objects.create_user(username=username, email=email, password=password)
+        return AuthToken.objects.create(user)
+
+    def test_register_default(self):
+        url = "/api/auth/register"
+        data = {
+            "username": "xjhmlcy",
+            "email": "xjhmlcy@gmail.com",
+            "password": "abcdefg123"
+        }
+        response = self.client.post(url, data, format='json')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertEqual(User.objects.count(), 1)
+        self.assertEqual(Profile.objects.count(), 1)
+        self.assertEqual(User.objects.get().username, data["username"])
+        self.assertEqual(Profile.objects.get().user.email, data["email"])
+        self.assertFalse(User.objects.get().is_active)
+    
+    def test_register_exist_email(self):
+        url = "/api/auth/register"
+        data1 = {
+            "username": "xjhmlcy",
+            "email": "xjhmlcy@gmail.com",
+            "password": "abcdefg123"
+        }
+        data2 = {
+            "username": "xjhmlcy_1",
+            "email": "xjhmlcy@gmail.com",
+            "password": "abcdefg123"
+        }
+        response = self.client.post(url, data1, format='json')
+        response = self.client.post(url, data2, format='json')
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+        self.assertEqual(User.objects.count(), 1)
+        self.assertEqual(Profile.objects.count(), 1)
+        self.assertEqual(User.objects.get().username, data1["username"])
+        self.assertEqual(Profile.objects.get().user.email, data1["email"])
+    
+    def test_register_exist_username(self):
+        url = "/api/auth/register"
+        data1 = {
+            "username": "xjhmlcy",
+            "email": "xjhmlcy@gmail.com",
+            "password": "abcdefg123"
+        }
+        data2 = {
+            "username": "xjhmlcy",
+            "email": "xjhmlcy123@gmail.com",
+            "password": "abcdefg123"
+        }
+        response = self.client.post(url, data1, format='json')
+        response = self.client.post(url, data2, format='json')
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+        self.assertEqual(User.objects.count(), 1)
+        self.assertEqual(Profile.objects.count(), 1)
+        self.assertEqual(User.objects.get().username, data1["username"])
+        self.assertEqual(Profile.objects.get().user.email, data1["email"])
+    
+    def test_login_default_by_username(self):
+        username = "xjhmlcy"
+        email = "xjhmlcy123@gmail.com"
+        password = "abcdefg123"
+        token, token_key = self.add_test_person(username, email, password)
+
+        url = "/api/auth/login"
+        data = {
+            "username": username,
+            "password": password
+        }
+        response = self.client.post(url, data, format='json')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertIsNotNone(response.data.get('user', None))
+        self.assertEqual(response.data['user'].get('id', None), token.user.id)
+        self.assertEqual(response.data['user'].get('username', None), token.user.username)
+        self.assertEqual(response.data['user'].get('email', None), token.user.email)
+    
+    def test_login_default_by_email(self):
+        username = "xjhmlcy"
+        email = "xjhmlcy123@gmail.com"
+        password = "abcdefg123"
+        token, token_key = self.add_test_person(username, email, password)
+
+        url = "/api/auth/login"
+        data = {
+            "username": email,
+            "password": password
+        }
+        response = self.client.post(url, data, format='json')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertIsNotNone(response.data.get('user', None))
+        self.assertEqual(response.data['user'].get('id', None), token.user.id)
+        self.assertEqual(response.data['user'].get('username', None), token.user.username)
+        self.assertEqual(response.data['user'].get('email', None), token.user.email)
+    
+    def test_login_wrong_password(self):
+        username = "xjhmlcy"
+        email = "xjhmlcy123@gmail.com"
+        password = "abcdefg123"
+        token, token_key = self.add_test_person(username, email, password)
+
+        url = "/api/auth/login"
+        data = {
+            "username": email,
+            "password": password + "456"
+        }
+        response = self.client.post(url, data, format='json')
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+    
+    def test_login_no_username(self):
+        url = "/api/auth/login"
+        data = {
+            "username": '123456',
+            "password": "12345678"
+        }
+        response = self.client.post(url, data, format='json')
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
diff --git a/core/tests/test_coupon.py b/core/tests/test_coupon.py
new file mode 100644
index 0000000000000000000000000000000000000000..ee9ae5688de3794917e97e2bbf5555115b375159
--- /dev/null
+++ b/core/tests/test_coupon.py
@@ -0,0 +1,38 @@
+from django.contrib.auth.models import User
+from rest_framework.test import APITestCase
+from rest_framework import status
+from knox.models import AuthToken
+
+from core.models.coupon import Coupon, CouponCategory
+
+
+class CouponTests(APITestCase):
+
+    """
+    Test suite for Coupon
+    """
+    def add_test_person(self, username, email, password):
+        user = User.objects.create_user(username=username, email=email, password=password)
+        return AuthToken.objects.create(user)
+
+    def add_test_coupon(self):
+        coupon_category = CouponCategory.objects.create(category='sports', sub_category='sneakers')
+        coupon = Coupon.objects.create(store='Apple', start_date='2022-12-31', expire_date='2023-12-31')
+        coupon.categories.add(coupon_category)
+        coupon.save()
+
+    def test_register_default(self):
+        username = "xjhmlcy"
+        email = "xjhmlcy123@gmail.com"
+        password = "abcdefg123"
+        token, token_key = self.add_test_person(username, email, password)
+        self.client.credentials(HTTP_AUTHORIZATION='Token ' + token_key)
+
+        self.add_test_coupon()
+
+        url = "/api/coupon"
+        response = self.client.get(url)
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertEqual(Coupon.objects.count(), 1)
+        self.assertEqual(CouponCategory.objects.count(), 1)
+        self.assertEqual(response.data[0].get('store', None), 'Apple')
diff --git a/core/tests/test_profile.py b/core/tests/test_profile.py
new file mode 100644
index 0000000000000000000000000000000000000000..72778d5d61be07e28ff06972ab607469c0eaa54e
--- /dev/null
+++ b/core/tests/test_profile.py
@@ -0,0 +1,91 @@
+from django.contrib.auth.models import User
+from rest_framework.test import APITestCase
+from rest_framework import status
+from knox.models import AuthToken
+
+from core.models.profile import Profile
+
+
+class ProfileTests(APITestCase):
+
+    """
+    Test suite for Profile
+    """
+    def add_test_person(self):
+        user = User(username='xjhmlcy', email='xjhmlcy@gmail.com', password='abcdefg123')
+        user.save()
+        return AuthToken.objects.create(user)
+
+    def test_retrive_profile(self):
+        token, token_key = self.add_test_person()
+        self.client.credentials(HTTP_AUTHORIZATION='Token ' + token_key)
+
+        url = "http://localhost:8000/api/profile"
+        response = self.client.get(url)
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertIsNotNone(response.data.get('user', None))
+        self.assertEqual(response.data['user'].get('username'), token.user.username)
+        self.assertEqual(response.data['user'].get('email'), token.user.email)
+        self.assertEqual(response.data.get('bio'), '')
+        self.assertEqual(response.data.get('birthday'), None)
+        self.assertEqual(response.data.get('country'), '')
+        self.assertEqual(response.data.get('city'), '')
+        self.assertEqual(response.data.get('affiliation'), '')
+        self.assertEqual(response.data.get('photo'), 'http://testserver/media/https%3A/static.productionready.io/images/smiley-cyrus.jpg')
+    
+    def test_update_profile(self):
+        token, token_key = self.add_test_person()
+        self.client.credentials(HTTP_AUTHORIZATION='Token ' + token_key)
+
+        url = "http://localhost:8000/api/profile"
+        data = {
+            'bio': 'Hello, world!',
+            'birthday': '2000-03-09',
+            'country': 'CA',
+            'city': 'Waterloo',
+            'affiliation': 'University of Waterloo'
+        }
+        response = self.client.patch(url, data)
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertIsNotNone(response.data.get('user', None))
+        self.assertEqual(response.data['user'].get('username'), token.user.username)
+        self.assertEqual(response.data['user'].get('email'), token.user.email)
+        self.assertEqual(response.data.get('bio'), data['bio'])
+        self.assertEqual(response.data.get('birthday'), str(data['birthday']))
+        self.assertEqual(response.data.get('country'), data['country'])
+        self.assertEqual(response.data.get('city'), data['city'])
+        self.assertEqual(response.data.get('affiliation'), data['affiliation'])
+        self.assertEqual(response.data.get('photo'), 'http://testserver/media/https%3A/static.productionready.io/images/smiley-cyrus.jpg')
+
+    def test_update_username(self):
+        token, token_key = self.add_test_person()
+        self.client.credentials(HTTP_AUTHORIZATION='Token ' + token_key)
+
+        url = "http://localhost:8000/api/profile"
+        data = {
+            'user': {
+                'username': 'apple'
+            }
+        }
+        response = self.client.patch(url, data, format='json')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertIsNotNone(User.objects.get(username=data['user']['username']))
+        self.assertIsNotNone(response.data.get('user', None))
+        self.assertEqual(response.data['user'].get('username', None), data['user']['username'])
+
+    def test_update_email(self):
+        token, token_key = self.add_test_person()
+        self.client.credentials(HTTP_AUTHORIZATION='Token ' + token_key)
+
+        url = "http://localhost:8000/api/profile"
+        data = {
+            'user': {
+                'email': 'apple@gmail.com'
+            }
+        }
+        response = self.client.patch(url, data, format='json')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertIsNotNone(User.objects.get(email=data['user']['email']))
+        self.assertFalse(User.objects.get(email=data['user']['email']).is_active)
+        self.assertIsNotNone(response.data.get('user', None))
+        self.assertEqual(response.data['user'].get('email', None), data['user']['email'])