from rest_framework.test import APITestCase from rest_framework import status from rest_framework.test import APIClient from labs.models import User class UserTests(APITestCase): fixtures = [ "labs/tests/fixtures/user0.json", ] ME_URL = "/api/user/me" USER_PROFILE_URL = "/api/user/settings" def setUp(self): self.client = APIClient() self.user = User.objects.get(email="test1@example.com") self.client.force_login(self.user) return super().setUp() def test_get_user_me_success(self): response = self.client.get(self.ME_URL) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( response.data, { "id": 1, "name": "Test User 1", "first_name": None, "last_name": None, "email": "test1@example.com", "credits": 160, "country": "AQ", "organization": "Demo Organization", "job_role": "Database Administrator", "industry": "Unknown", "language_code": "en", "last_lab_code": "", "last_region_name": "", "last_tidb_version": "", "date_joined": "2024-12-22T10:10:05Z", "is_staff": True, }, ) def test_get_user_me_unauthorized(self): self.client.logout() response = self.client.get(self.ME_URL) self.assertNotContains( response, "email", status_code=status.HTTP_401_UNAUTHORIZED ) def test_update_user_profile_success(self): expected_data = { "name": "Test User 1", "country": "CN", "organization": "PingCAP", "job_role": "Application Developer", "industry": "Software / SaaS", "language_code": "en", } response = self.client.post( self.USER_PROFILE_URL, data=expected_data, ) self.assertEqual(response.status_code, status.HTTP_200_OK) self.user.refresh_from_db() self.assertEqual(self.user.name, expected_data["name"]) self.assertEqual(self.user.country, expected_data["country"]) self.assertEqual(self.user.organization, expected_data["organization"]) self.assertEqual(self.user.job_role, expected_data["job_role"]) self.assertEqual(self.user.industry, expected_data["industry"]) self.assertEqual(self.user.language_code, expected_data["language_code"]) def test_update_user_profile_unauthorized(self): self.client.logout() response = self.client.post(self.USER_PROFILE_URL, data={}) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) def test_update_user_profile_invalid_data(self): raw_data = { "name": self.user.name, "country": self.user.country, "organization": self.user.organization, "job_role": self.user.job_role, "industry": self.user.industry, "language_code": self.user.language_code, } test_cases = [ ( { "name": "", "country": "CN", "organization": "PingCAP", "job_role": "Application Developer", "industry": "Software / SaaS", "language_code": "invalid", }, "language_code", ), ( { "name": "Test User 1", "country": "", "organization": "PingCAP", "job_role": "Application Developer", "industry": "Software / SaaS", "language_code": "en", }, "country", ), ( { "name": "Test User 1", "country": "CN", "organization": "", "job_role": "Application Developer", "industry": "Software / SaaS", "language_code": "en", }, "organization", ), ( { "name": "too long name" * 100, "country": "CN", "organization": "PingCAP", "job_role": "Application Developer", "industry": "Software / SaaS", "language_code": "en", }, "name", ), ( { "name": "Test User 1", "country": "CN", "organization": "PingCAP", "job_role": "Application Developer", "industry": "", "language_code": "en", }, "industry", ), ] for data, expected_field in test_cases: with self.subTest(data=data): response = self.client.post(self.USER_PROFILE_URL, data=data) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertIn(expected_field, response.data) self.user.refresh_from_db() self.assertEqual(self.user.name, raw_data["name"]) self.assertEqual(self.user.country, raw_data["country"]) self.assertEqual(self.user.organization, raw_data["organization"]) self.assertEqual(self.user.job_role, raw_data["job_role"]) self.assertEqual(self.user.industry, raw_data["industry"]) self.assertEqual(self.user.language_code, raw_data["language_code"]) def test_update_user_profile_partial_update_names(self): response = self.client.post( self.USER_PROFILE_URL, data={"first_name": "Alice", "last_name": "Zhang"}, ) self.assertEqual(response.status_code, status.HTTP_200_OK) self.user.refresh_from_db() self.assertEqual(self.user.first_name, "Alice") self.assertEqual(self.user.last_name, "Zhang")