Files
medical_training/test/test_cms_department.py
T

108 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""CMS 超级管理员 - 科室管理接口测试(CMS-DEPT-1~6,全局科室)。"""
import io
from openpyxl import Workbook
from django.core.files.uploadedfile import SimpleUploadedFile
from rest_framework.test import APIClient
from apps.user.models import Department
from .conftest import CacheTestCase, create_test_user, get_auth_client
CMS_DEPT_URL = '/api/cms/departments/'
XLSX_CT = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
def d_detail(pk):
return f'/api/cms/departments/{pk}/'
def d_update(pk):
return f'/api/cms/departments/{pk}/update/' # 编辑:POST(原 PATCH /{id}/
def d_disable(pk):
return f'/api/cms/departments/{pk}/disable/' # 停用:POST(原 DELETE /{id}/
def make_xlsx(headers, rows):
wb = Workbook(); ws = wb.active
ws.append(headers)
for r in rows:
ws.append(r)
buf = io.BytesIO(); wb.save(buf); buf.seek(0)
return SimpleUploadedFile('dept.xlsx', buf.read(), content_type=XLSX_CT)
def super_client(phone='13933300001'):
admin = create_test_user(phone=phone, password='Admin123', role_type='super_admin')
return get_auth_client(admin)
class CmsDepartmentTest(CacheTestCase):
def setUp(self):
super().setUp()
self.client = super_client()
def test_requires_super_admin(self):
self.assertEqual(APIClient().get(CMS_DEPT_URL).status_code, 401)
u = create_test_user(phone='13933300009', role_type='doctor')
self.assertEqual(get_auth_client(u).get(CMS_DEPT_URL).status_code, 403)
def test_crud(self):
# 新增
resp = self.client.post(CMS_DEPT_URL, {'name': '内科', 'category': '临床'})
self.assertEqual(resp.status_code, 201, resp.content)
did = resp.json()['id']
# 列表
resp = self.client.get(CMS_DEPT_URL)
self.assertEqual(resp.status_code, 200)
self.assertIn('results', resp.json())
# 编辑
resp = self.client.post(d_update(did), {'category': '医技'})
self.assertEqual(resp.status_code, 200, resp.content)
self.assertEqual(resp.json()['category'], '医技')
def test_duplicate_name(self):
Department.objects.create(name='外科', category='临床')
resp = self.client.post(CMS_DEPT_URL, {'name': '外科'})
self.assertEqual(resp.status_code, 400, resp.content)
self.assertEqual(resp.json()['code'], 'CMS_DEPARTMENT_NAME_EXISTS')
def test_soft_delete(self):
d = Department.objects.create(name='儿科', category='临床')
resp = self.client.post(d_disable(d.id))
self.assertEqual(resp.status_code, 200, resp.content)
self.assertFalse(Department.objects.filter(id=d.id).exists())
self.assertTrue(Department.all_objects.get(id=d.id).is_deleted)
def test_recreate_soft_deleted_name_returns_400(self):
"""软删后用相同名称重建:返回 400 CMS_DEPARTMENT_NAME_EXISTS(不产生重复行)。
按 all_objects 校验,避免与已停用科室同名而静默新建重复记录。
"""
d = Department.objects.create(name='康复科', category='临床')
self.client.post(d_disable(d.id))
self.assertFalse(Department.objects.filter(name='康复科').exists())
resp = self.client.post(CMS_DEPT_URL, {'name': '康复科', 'category': '临床'})
self.assertEqual(resp.status_code, 400, resp.content)
self.assertEqual(resp.json()['code'], 'CMS_DEPARTMENT_NAME_EXISTS')
self.assertEqual(Department.all_objects.filter(name='康复科').count(), 1)
def test_import_and_export(self):
f = make_xlsx(['科室名称', '分类'], [['心内科', '临床'], ['', 'x'], ['心内科', '临床']])
resp = self.client.post('/api/cms/departments/import/', {'file': f}, format='multipart')
self.assertEqual(resp.status_code, 200, resp.content)
body = resp.json()
self.assertEqual(body['success'], 1) # 1 成功;空名 + 重复各 1 失败
self.assertEqual(body['failed'], 2)
# 导出
resp = self.client.get('/api/cms/departments/export/')
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp['Content-Type'], XLSX_CT)
def test_import_template(self):
resp = self.client.get('/api/cms/departments/import-template/')
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp['Content-Type'], XLSX_CT)