132 lines
5.7 KiB
Python
132 lines
5.7 KiB
Python
"""移动端个人中心:个人信息获取(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)
|