"""移动端个人中心:个人信息获取(GET) / 更新(PATCH) 接口测试。""" from rest_framework.test import APIClient from apps.user.models import Department from .conftest import ( CacheTestCase, create_test_user, get_auth_client, ensure_institution, ) PROFILE_URL = '/api/user/profile/' class ProfileGetTest(CacheTestCase): def test_get_full_info(self): inst = ensure_institution(name='测试医院', code='PF-H001') user = create_test_user(phone='13912300001', real_name='张三', institution=inst) user.practice_years = '1-3年' user.title_name = '住院医师' user.save(update_fields=['practice_years', 'title_name']) client = get_auth_client(user) resp = client.get(PROFILE_URL) self.assertEqual(resp.status_code, 200, resp.content) data = resp.json() # 全量信息 self.assertEqual(data['id'], user.id) self.assertEqual(data['real_name'], '张三') self.assertEqual(data['practice_years'], '1-3年') self.assertEqual(data['title_name'], '住院医师') # 机构/角色等只读信息也返回(供展示,但不可改) self.assertEqual(data['institution'], inst.id) self.assertEqual(data['role_type'], 'student') def test_get_requires_auth(self): resp = APIClient().get(PROFILE_URL) self.assertEqual(resp.status_code, 401, resp.content) class ProfileUpdateTest(CacheTestCase): def setUp(self): super().setUp() self.inst = ensure_institution(name='测试医院', code='PF-H001') self.user = create_test_user(phone='13912300010', real_name='原名', institution=self.inst) self.client = get_auth_client(self.user) def test_update_allowed_fields(self): dept = Department.objects.create(name='内科', category='临床') payload = { 'username': 'newuser001', 'real_name': '李四', 'avatar': 'https://cdn.x.com/a.png', 'gender': 1, 'department': dept.id, 'title_name': '主治医师', 'major': '心血管内科', 'practice_years': '3-5年', 'training_stage': '规培', 'learning_target': '提升问诊能力', } resp = self.client.patch(PROFILE_URL, payload) self.assertEqual(resp.status_code, 200, resp.content) self.assertEqual(resp.json()['message'], '更新成功') self.user.refresh_from_db() self.assertEqual(self.user.username, 'newuser001') self.assertEqual(self.user.real_name, '李四') self.assertEqual(self.user.avatar, 'https://cdn.x.com/a.png') self.assertEqual(self.user.gender, 1) self.assertEqual(self.user.department_id, dept.id) self.assertEqual(self.user.title_name, '主治医师') self.assertEqual(self.user.major, '心血管内科') self.assertEqual(self.user.practice_years, '3-5年') self.assertEqual(self.user.training_stage, '规培') self.assertEqual(self.user.learning_target, '提升问诊能力') def test_update_phone(self): resp = self.client.patch(PROFILE_URL, {'phone': '13900008888'}) self.assertEqual(resp.status_code, 200, resp.content) self.user.refresh_from_db() self.assertEqual(self.user.phone, '13900008888') def test_cannot_change_institution_role_superuser(self): """机构 / 角色 / is_superuser 不在白名单,传了也被忽略。""" other = ensure_institution(name='其他医院', code='PF-OTHER') resp = self.client.patch(PROFILE_URL, { 'real_name': '改个名', 'institution': other.id, 'role_type': 'super_admin', 'is_superuser': True, }) self.assertEqual(resp.status_code, 200, resp.content) self.user.refresh_from_db() self.assertEqual(self.user.real_name, '改个名') # 白名单字段生效 self.assertEqual(self.user.institution_id, self.inst.id) # 机构未变 self.assertEqual(self.user.role_type, 'student') # 角色未变 self.assertFalse(self.user.is_superuser) # 仍非超管 def test_username_taken(self): create_test_user(phone='13912300099', real_name='别人') # 把别人的 username 抢过来 other_username = 'taken_name' u = create_test_user(phone='13912300098', real_name='占名者') u.username = other_username u.save(update_fields=['username']) resp = self.client.patch(PROFILE_URL, {'username': other_username}) self.assertEqual(resp.status_code, 400, resp.content) self.assertEqual(resp.json()['code'], 'VALIDATION_ERROR') def test_phone_invalid_format(self): resp = self.client.patch(PROFILE_URL, {'phone': '12345'}) self.assertEqual(resp.status_code, 400, resp.content) def test_phone_taken(self): create_test_user(phone='13912300077', real_name='占号者') resp = self.client.patch(PROFILE_URL, {'phone': '13912300077'}) self.assertEqual(resp.status_code, 400, resp.content) def test_any_global_department_accepted(self): """科室全局:可更新为任意科室(不再校验机构归属)。""" dept = Department.objects.create(name='外科', category='临床') resp = self.client.patch(PROFILE_URL, {'department': dept.id}) self.assertEqual(resp.status_code, 200, resp.content) self.user.refresh_from_db() self.assertEqual(self.user.department_id, dept.id) def test_update_requires_auth(self): resp = APIClient().patch(PROFILE_URL, {'real_name': 'x'}) self.assertEqual(resp.status_code, 401, resp.content)