Files
medical_training/test/test_profile_personal.py
T

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)