from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.models import SocialApp from django.contrib.auth.models import User from rest_framework import status from rest_framework.authtoken.models import Token from rest_framework.test import APITestCase from documents.tests.utils import DirectoriesMixin class TestApiProfile(DirectoriesMixin, APITestCase): ENDPOINT = "/api/profile/" def setUp(self): super().setUp() self.user = User.objects.create_superuser( username="temp_admin", first_name="firstname", last_name="surname", ) SocialApp.objects.create( name="Keycloak", provider="openid_connect", provider_id="keycloak-test", ) self.user.socialaccount_set.add( SocialAccount(uid="123456789", provider="keycloak-test"), bulk=False, ) self.client.force_authenticate(user=self.user) def test_get_profile(self): """ GIVEN: - Configured user WHEN: - API call is made to get profile THEN: - Profile is returned """ response = self.client.get(self.ENDPOINT) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["email"], self.user.email) self.assertEqual(response.data["first_name"], self.user.first_name) self.assertEqual(response.data["last_name"], self.user.last_name) def test_update_profile(self): """ GIVEN: - Configured user WHEN: - API call is made to update profile THEN: - Profile is updated """ user_data = { "email": "new@email.com", "password": "superpassword1234", "first_name": "new first name", "last_name": "new last name", } response = self.client.patch(self.ENDPOINT, user_data) self.assertEqual(response.status_code, status.HTTP_200_OK) user = User.objects.get(username=self.user.username) self.assertTrue(user.check_password(user_data["password"])) self.assertEqual(user.email, user_data["email"]) self.assertEqual(user.first_name, user_data["first_name"]) self.assertEqual(user.last_name, user_data["last_name"]) def test_update_auth_token(self): """ GIVEN: - Configured user WHEN: - API call is made to generate auth token THEN: - Token is created the first time, updated the second """ self.assertEqual(len(Token.objects.all()), 0) response = self.client.post(f"{self.ENDPOINT}generate_auth_token/") self.assertEqual(response.status_code, status.HTTP_200_OK) token1 = Token.objects.filter(user=self.user).first() self.assertIsNotNone(token1) response = self.client.post(f"{self.ENDPOINT}generate_auth_token/") self.assertEqual(response.status_code, status.HTTP_200_OK) token2 = Token.objects.filter(user=self.user).first() self.assertNotEqual(token1.key, token2.key) def test_profile_not_logged_in(self): """ GIVEN: - User not logged in WHEN: - API call is made to get profile and update token THEN: - Profile is returned """ self.client.logout() response = self.client.get(self.ENDPOINT) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) response = self.client.post(f"{self.ENDPOINT}generate_auth_token/") self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) def test_get_social_account_providers(self): """ GIVEN: - Configured user WHEN: - API call is made to get social account providers THEN: - Social account providers are returned """ response = self.client.get(f"{self.ENDPOINT}social_account_providers") self.assertEqual(response.status_code, status.HTTP_200_OK) def test_disconnect_social_account(self): """ GIVEN: - Configured user WHEN: - API call is made to disconnect a social account THEN: - Social account is deleted from the user or request fails """ # Test with invalid id response = self.client.post( f"{self.ENDPOINT}disconnect_social_account/", {"id": -1}, ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) # Test with valid id social_account_id = self.user.socialaccount_set.all()[0].pk response = self.client.post( f"{self.ENDPOINT}disconnect_social_account/", {"id": social_account_id}, ) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data, social_account_id) self.assertEqual( len(self.user.socialaccount_set.filter(pk=social_account_id)), 0, )