diff --git a/README.md b/README.md index 2a2bd6d..4d5b20b 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Make sure you have installed the following: Next follow these instructions. -1. **Database Setup:** Before starting with the project create a db in you local using PostgreSQL with the following details. Refer to `main/settings.py` if you have any confusion. +1.1 **Database Setup:** Before starting with the project create a db in you local using PostgreSQL with the following details. Refer to `main/settings.py` if you have any confusion. ``` NAME: osp @@ -45,6 +45,7 @@ Next follow these instructions. \c osp; GRANT ALL PRIVILEGES ON DATABASE osp to osp; ``` + 2. **Set the environment variables:** You need to download Zulip API key file from your user-settings on Zulip. The file you download is named as `download` or rename it to `download`. Place that download file in the project's directory. For more information follow [Environment Variables](#Environment-Variables) section. 3. Move into the project's directory. @@ -102,6 +103,15 @@ export SENDGRID_API_KEY= ## Testing +**Test Database:** + You may run the following commands: + + ``` + cd open-source-programs-backend + sudo -i -u postgres + GRANT ALL PRIVILEGES ON DATABASE test_osp to osp; + ALTER USER osp CREATEDB; + ``` To run the tests run: `python manage.py test`. ## QA Checks diff --git a/tests/test_api_user_info.py b/tests/test_api_user_info.py new file mode 100644 index 0000000..6a5e989 --- /dev/null +++ b/tests/test_api_user_info.py @@ -0,0 +1,76 @@ +from django.contrib.auth import get_user_model +from rest_framework import status +from rest_framework.test import APIClient, APITestCase + +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): + + 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) + + response = self.client.get("http://localhost:8000/api/info/", format="json") + response.data = response.data[0] + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["name"], body["name"]) + self.assertEqual(response.data["user_type"], body["user_type"]) + self.assertEqual(response.data["zulip_id"], body["zulip_id"]) + self.assertEqual(response.data["user"]["email"], self.register_data["email"]) + self.assertEqual(response.data["user"]["username"], self.register_data["username"]) + + 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)