diff --git a/README.md b/README.md index 3e378be..4b5b19c 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,8 @@ Next follow these instructions. CREATE DATABASE osp; \c osp; GRANT ALL PRIVILEGES ON DATABASE osp to osp; + GRANT ALL PRIVILEGES ON DATABASE test_osp to osp; + ALTER USER osp CREATEDB; ``` 2. You need to download API key file from your user-settings on Zulip. The file you download is named as 'download' or rename that to 'download'. 3. Place that download file in the project's directory. diff --git a/main/settings.py b/main/settings.py index ffaa56a..f150e54 100644 --- a/main/settings.py +++ b/main/settings.py @@ -28,7 +28,7 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] +ALLOWED_HOSTS = ['*'] # Application definition @@ -82,6 +82,7 @@ "rest_framework.authentication.SessionAuthentication", "rest_framework_simplejwt.authentication.JWTAuthentication", ), + 'TEST_REQUEST_DEFAULT_FORMAT': 'json', } SIMPLE_JWT = { @@ -120,6 +121,9 @@ 'PASSWORD': "osp", 'HOST': "localhost", # Change to db for docker-compose 'PORT': 5432, + 'TEST':{ + 'NAME':'test_osp', + }, } } diff --git a/tests/test_api_user_info.py b/tests/test_api_user_info.py new file mode 100644 index 0000000..09be56b --- /dev/null +++ b/tests/test_api_user_info.py @@ -0,0 +1,75 @@ +from django.urls import reverse +from django.contrib.auth import get_user_model +from rest_framework import status +from rest_framework.test import APIClient +from rest_framework.test import APITestCase +import json + +User = get_user_model() + +class UserInfoTests(APITestCase): + def setUp(self): + + # Needed for token auths + self.client = APIClient() + + # Register + self.register_data = { + "username":"testuser1", + "email":"testuser1@gmail.com", + "password":"hello", + "confirm_password":"hello" + } + test_user = User(username=self.register_data['username'],email=self.register_data['email'],is_active=True) + test_user.set_password(self.register_data['password']) + test_user.save() + + # Login and get real token + login_data = { + "username":self.register_data['username'], + "password":self.register_data['password'] + } + response = self.client.post('http://localhost:8000/api/token_auth/token/',login_data,format='json', headers={'Content-Type':'application/json'}) + self.access_token = response.json()['access'] + self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + self.access_token) + + def test_get_user_info_successfully_empty(self): + + response = self.client.get('http://localhost:8000/api/info/', format = 'json') + self.assertEqual(response.data,[]) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_post_user_info_successfully(self): + + body = { + "name":"Test User 1 Full Name", + "user_type":"admin", + "zulip_id": 334084 + } + response = self.client.post('http://localhost:8000/api/info/', body ,format = 'json') + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + + def test_get_user_info_successfully(self): + + response = self.client.get('http://localhost:8000/api/info/', format = 'json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_api_wrong_token(self): + + self.client.credentials() + response = self.client.get('http://localhost:8000/api/info/', format = 'json') + self.assertEqual(response.data['detail'],"Authentication credentials were not provided.") + self.assertEqual(response.status_code, 403) + + def test_multiple_post_user_info(self): + + self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + self.access_token) + body = { + "name":"Test User 1 Full Name", + "user_type":"admin", + "zulip_id": 334084 + } + for _ in range(2): + response = self.client.post('http://localhost:8000/api/info/', body ,format = 'json') + self.assertEqual(response.status_code, status.HTTP_409_CONFLICT) + diff --git a/tests/test_api_user_login.py b/tests/test_api_user_login.py new file mode 100644 index 0000000..bd907d5 --- /dev/null +++ b/tests/test_api_user_login.py @@ -0,0 +1,78 @@ +from django.urls import reverse +from django.contrib.auth import get_user_model +from rest_framework import status +from rest_framework.test import APITestCase + +User = get_user_model() + +class LoginTests(APITestCase): + def setUp(self): + + # Register + self.register_data = { + "username":"testuser1", + "email":"testuser1@gmail.com", + "password":"hello", + "confirm_password":"hello" + } + test_user = User(username=self.register_data['username'],email=self.register_data['email'],is_active=True) + # hashing password + test_user.set_password(self.register_data['password']) + test_user.save() + + def test_login_successfully(self): + """ + Ensure we can login . + """ + + # Login + login_data = { + "username":self.register_data['username'], + "password":self.register_data['password'] + } + response = self.client.post('http://localhost:8000/api/token_auth/token/',login_data,format='json', headers={'Content-Type':'application/json'}) + token = response.data['access'] + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_login_invalid_username(self): + """ + Ensure we can login . + """ + + # Login + login_data = { + "username":"nottestuser1", + "password":self.register_data['password'] + } + response = self.client.post('http://localhost:8000/api/token_auth/token/',login_data,format='json', headers={'Content-Type':'application/json'}) + + self.assertEqual(response.data['detail'],'No active account found with the given credentials') + self.assertEqual(response.status_code, 401) + + def test_login_invalid_password(self): + """ + Ensure we can login . + """ + + # Login + login_data = { + "username":self.register_data['username'], + "password":"hell" + } + response = self.client.post('http://localhost:8000/api/token_auth/token/',login_data,format='json', headers={'Content-Type':'application/json'}) + + self.assertEqual(response.data['detail'],'No active account found with the given credentials') + self.assertEqual(response.status_code, 401) + + def test_login_bad_data(self): + """ + Ensure we can login . + """ + + # Login + login_data = { + "username":self.register_data['username'], + } + response = self.client.post('http://localhost:8000/api/token_auth/token/',login_data,format='json', headers={'Content-Type':'application/json'}) + token = response.data + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) diff --git a/tests/test_api_user_register.py b/tests/test_api_user_register.py new file mode 100644 index 0000000..a15a7bf --- /dev/null +++ b/tests/test_api_user_register.py @@ -0,0 +1,19 @@ +from django.urls import reverse +from django.contrib.auth import get_user_model +from rest_framework import status +from rest_framework.test import APITestCase + +User = get_user_model() + +class RegisterTests(APITestCase): + def test_register_successfully(self): + + # Register + register_data = { + "username":"testuser1", + "email":"testuser1@gmail.com", + "password":"hello", + "confirm_password":"hello" + } + response = self.client.post('http://localhost:8000/api/token_auth/register/', register_data, format='json', headers={'Content-Type':'application/json'}) + self.assertEqual(response.status_code,status.HTTP_201_CREATED) \ No newline at end of file