from rest_framework import status from rest_framework.test import APITestCase from django.test.utils import override_settings from django.test.client import MULTIPART_CONTENT, encode_multipart, BOUNDARY from pingcap_sso.models import ( User, SecurityCode, CompanyVerifyApplication ) @override_settings( EMAIL_BACKEND='django.core.mail.backends.dummy.EmailBackend', SMS_BACKEND='sms.backends.dummy.SmsBackend', CACHES={ 'default': { # Just for disable django-rest-framework's throttle 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', } }, RESERVED_USERNAMES=['admin'] ) class ProfileTest(APITestCase): databases = ['default', 'discourse'] fixtures = [ 'pingcap_sso/tests/fixtures/org/pingcap_sso.json', 'pingcap_sso/tests/fixtures/org/discourse.json' ] USER_PROFILE_PATH = '/api/profile' SEND_EMAIL_CODE_PATH = '/api/profile/company/send-code' SUBMIT_PATH = '/api/profile/company/verify' # TODO: add test cases for discourse def setUp(self): self.user = User.objects.get(username='orgtest1') self.user.company_verified_status = User.COMPANY_UNVERIFIED self.user.job_title_code = '2G3agrmyP' self.user.job_title_text = '学生' self.user.company_name = 'pingcap' self.user.save() self.client.force_login(self.user) def test_update_company(self): self.user.company_verified_status = User.COMPANY_VERIFIED_PASS self.user.save() self.client.patch(self.USER_PROFILE_PATH, { 'company_name': 'new_company' }) self.user.refresh_from_db() self.assertEqual(self.user.company_verified_status, User.COMPANY_UNVERIFIED) def test_not_update_company(self): self.user.company_verified_status = User.COMPANY_VERIFIED_PASS self.user.save() self.client.patch(self.USER_PROFILE_PATH, { 'company_name': self.user.company_name }) self.user.refresh_from_db() self.assertEqual(self.user.company_verified_status, User.COMPANY_VERIFIED_PASS) def test_update_job_title(self): self.user.company_verified_status = User.COMPANY_VERIFIED_PASS self.user.save() self.client.patch(self.USER_PROFILE_PATH, { 'job_title': '95cvUSA2G' }) self.user.refresh_from_db() self.assertEqual(self.user.company_verified_status, User.COMPANY_UNVERIFIED) def test_not_update_job_title(self): self.user.company_verified_status = User.COMPANY_VERIFIED_PASS self.user.save() self.client.patch(self.USER_PROFILE_PATH, { 'job_title': self.user.job_title_code }) self.user.refresh_from_db() self.assertEqual(self.user.company_verified_status, User.COMPANY_VERIFIED_PASS) def test_send_code_with_empty_job_title(self): self.user.job_title_code = None self.user.job_title_text = None self.user.company_name = 'pingcap' self.user.save() response = self.client.post(self.SEND_EMAIL_CODE_PATH, { 'email': 'wangdi@pingcap.com' }) self.assertEqual(response.status_code, status.HTTP_409_CONFLICT) def test_send_code_with_empty_company(self): self.user.job_title_code = '2G3agrmyP' self.user.job_title_text = '学生' self.user.company_name = None self.user.save() response = self.client.post(self.SEND_EMAIL_CODE_PATH, { 'email': 'wangdi@pingcap.com' }) self.assertEqual(response.status_code, status.HTTP_409_CONFLICT) def test_send_code_when_already_verified(self): self.user.company_verified_status = User.COMPANY_VERIFIED_PASS self.user.save() response = self.client.post(self.SEND_EMAIL_CODE_PATH, { 'email': 'wangdi@pingcap.com' }) self.assertEqual(response.status_code, status.HTTP_409_CONFLICT) def test_send_email_code(self): response = self.client.post(self.SEND_EMAIL_CODE_PATH, { 'email': 'wangdi@pingcap.com' }) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(SecurityCode.objects.count(), 1) self.assertEqual(SecurityCode.objects.first().deliver_address, 'wangdi@pingcap.com') def test_send_code_to_non_business_email(self): response = self.client.post(self.SEND_EMAIL_CODE_PATH, { 'email': 'wangdi@163.com' }) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) response = self.client.post(self.SEND_EMAIL_CODE_PATH, { 'email': '1111111111@qq.com' }) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) response = self.client.post(self.SEND_EMAIL_CODE_PATH, { 'email': 'wangdi4zm@gmail.com' }) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(SecurityCode.objects.count(), 0) def _submit_verification_with_email(self): email = 'wangdi@pingcap.com' response = self.client.post(self.SEND_EMAIL_CODE_PATH, { 'email': email }) self.assertEqual(response.status_code, status.HTTP_200_OK) email_code = SecurityCode.objects.filter(confirmed=False).first().code response = self.client.post( path=self.SUBMIT_PATH, data=encode_multipart(data={ 'verification_method': 0, 'email': email, 'email_code': email_code }, boundary=BOUNDARY), content_type=MULTIPART_CONTENT ) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(SecurityCode.objects.filter(confirmed=False).count(), 0) self.assertEqual(CompanyVerifyApplication.objects.all().count(), 1) response = self.client.get(self.USER_PROFILE_PATH) self.assertEqual(response.data['data']['company_verified_status'], User.COMPANY_VERIFIED_PENDING) def test_submit_verification_with_email(self): self._submit_verification_with_email() def test_approve_verification(self): self._submit_verification_with_email() self.assertEqual(self.user.awardedpoint_records.count(), 0) reviewer = User.objects.filter(is_staff=True, is_superuser=True).first() self.client.force_login(reviewer) verification = CompanyVerifyApplication.objects.first() response = self.client.put(f'/api/admin/company/verify/applications/{verification.id}', { 'action': 1, 'reason': '' }) self.assertEqual(response.status_code, status.HTTP_200_OK) self.user.refresh_from_db() self.assertAlmostEqual(self.user.company_verified_status, User.COMPANY_VERIFIED_PASS) self.assertEqual(self.user.awardedpoint_records.count(), 1) def test_reject_verification(self): self._submit_verification_with_email() self.user.refresh_from_db() self.assertEqual(self.user.company_verified_status, User.COMPANY_VERIFIED_PENDING) self.assertEqual(self.user.awardedpoint_records.count(), 0) reviewer = User.objects.filter(is_staff=True, is_superuser=True).first() self.client.force_login(reviewer) verification = CompanyVerifyApplication.objects.first() response = self.client.put(f'/api/admin/company/verify/applications/{verification.id}', { 'action': 0, 'reason': '' }) self.assertEqual(response.status_code, status.HTTP_200_OK) self.user.refresh_from_db() self.assertAlmostEqual(self.user.company_verified_status, User.COMPANY_UNVERIFIED) self.assertEqual(self.user.awardedpoint_records.count(), 0) def test_submit_verification_with_incumbency(self): # TODO: add test case for submit verification with incumbency ... def test_submit_verification_with_wrong_email_code(self): email = 'wangdi@pingcap.com' response = self.client.post( path=self.SUBMIT_PATH, data=encode_multipart(data={ 'verification_method': 0, 'email': email, 'email_code': '111111' }, boundary=BOUNDARY), content_type=MULTIPART_CONTENT ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertIn('email_code', response.data['errors']) self.assertEqual(len(response.data['errors'].items()), 1) self.assertEqual(SecurityCode.objects.filter(confirmed=False).count(), 0) self.assertEqual(CompanyVerifyApplication.objects.all().count(), 0) response = self.client.get(self.USER_PROFILE_PATH) self.assertEqual(response.data['data']['company_verified_status'], User.COMPANY_UNVERIFIED) def test_submit_verification_without_incumbency(self): email = 'wangdi@pingcap.com' response = self.client.post( path=self.SUBMIT_PATH, data=encode_multipart(data={ 'verification_method': 1, }, boundary=BOUNDARY), content_type=MULTIPART_CONTENT ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertIn('incumbency_cert', response.data['errors']) self.assertEqual(len(response.data['errors'].items()), 1) self.assertEqual(CompanyVerifyApplication.objects.all().count(), 0) response = self.client.get(self.USER_PROFILE_PATH) self.assertEqual(response.data['data']['company_verified_status'], User.COMPANY_UNVERIFIED) def test_submit_verification_when_already_verified(self): self.user.company_verified_status = User.COMPANY_VERIFIED_PASS self.user.save() response = self.client.post( path=self.SUBMIT_PATH, data=encode_multipart(data={ 'verification_method': 1, }, boundary=BOUNDARY), content_type=MULTIPART_CONTENT ) self.assertEqual(response.status_code, status.HTTP_409_CONFLICT) self.assertEqual(CompanyVerifyApplication.objects.all().count(), 0) response = self.client.get(self.USER_PROFILE_PATH) self.assertEqual(response.data['data']['company_verified_status'], User.COMPANY_VERIFIED_PASS)