Files
crawler-plugin/backend/tests/test_admin_invalid_asin_data.py
T
huangzd1997 fa5a59e5cd
Build Backend JAR / build (push) Has been cancelled
task-116: 后台管理新增/导入表单弹窗化 + 分组管理独立菜单与UI优化 + 轻量进度端点
- 后台管理页(admin)所有面板的新增/导入表单改为弹窗操作,原有字段 ID 全部保留、提交逻辑不变;导入删除入口不再触发二次确认拦截
- 分组管理升级为独立菜单(V102 + schema initializer),移除 5 个面板内的管理分组按钮;分组列表改为蓝白主题、增加权限分组横幅
- Python 侧 group-manage 权限守卫(_ensure_backend_menu_access 补充 group-manage)
- 引入 V101(biz_task_file_job 复合索引)+ 新增 TaskProgressLight/TaskFileJob 轻量端点与进度聚合作
- 前端 progress-light / page-separated-loads / dispatch-guard 共享模块及单元测试
2026-09-01 12:54:13 +08:00

144 lines
5.0 KiB
Python

import sys
import unittest
from pathlib import Path
from unittest.mock import patch
from flask import Flask
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from blueprints import admin_api
class AdminInvalidAsinDataTest(unittest.TestCase):
def setUp(self):
self.app = Flask(__name__)
def test_list_forwards_operator_and_formats_group_fields(self):
java_response = {
'data': {
'items': [{
'id': 9,
'dataValue': 'B012345678',
'brand': 'acme',
'groupId': 3,
'groupName': 'group-a',
'recordSource': 'MANUAL',
'createdAt': '2026-08-08T12:30:00',
}],
'total': 1,
'page': 1,
'pageSize': 15,
},
}
with self.app.test_request_context('/api/admin/invalid-asin-data?page=1&page_size=15&data_value=B01&brand=acme&group_id=3'):
with patch.object(
admin_api,
'_ensure_backend_menu_access',
return_value=('admin', {'id': 7}, None),
), patch.object(
admin_api,
'_proxy_permission_java',
return_value=(java_response, None, 200),
) as proxy:
response = admin_api.list_invalid_asin_data.__wrapped__()
self.assertEqual(response.status_code, 200)
self.assertEqual(response.get_json()['items'], [{
'id': 9,
'data_value': 'B012345678',
'brand': 'acme',
'group_id': 3,
'group_name': 'group-a',
'record_source': 'MANUAL',
'created_at': '2026-08-08 12:30',
}])
self.assertEqual(
proxy.call_args.kwargs['params'],
{
'page': 1,
'pageSize': 15,
'keyword': '',
'dataValue': 'B01',
'brand': 'acme',
'groupId': 3,
},
)
self.assertEqual(proxy.call_args.kwargs['current_row'], {'id': 7})
def test_create_forwards_group_with_trusted_current_user(self):
java_response = {
'message': 'created',
'data': {
'id': 9,
'dataValue': 'B012345678',
'brand': 'acme',
'groupId': 3,
'groupName': 'group-a',
'recordSource': 'MANUAL',
},
}
with self.app.test_request_context(
'/api/admin/invalid-asin-data',
method='POST',
json={'data_value': ' B012345678 ', 'brand': 'Acme', 'group_id': 3},
):
with patch.object(
admin_api,
'_ensure_backend_menu_access',
return_value=('super_admin', {'id': 1}, None),
), patch.object(
admin_api,
'_proxy_permission_java',
return_value=(java_response, None, 200),
) as proxy:
response = admin_api.create_invalid_asin_data.__wrapped__()
self.assertEqual(response.status_code, 200)
self.assertNotIn('params', proxy.call_args.kwargs)
self.assertEqual(proxy.call_args.kwargs['current_row'], {'id': 1})
self.assertEqual(proxy.call_args.kwargs['json_data'], {
'dataValue': 'B012345678',
'brand': 'Acme',
'groupId': 3,
})
def test_group_list_marks_first_group_as_locked_for_normal_account(self):
groups = [
{'id': 3, 'groupName': 'group-a'},
{'id': 8, 'groupName': 'group-b'},
]
with self.app.test_request_context('/api/admin/shop-manage-groups'):
with patch.object(
admin_api,
'_ensure_backend_menu_access',
return_value=('admin', {'id': 7}, None),
), patch.object(
admin_api,
'_load_expanded_shop_manage_groups',
return_value=(groups, None, 200),
):
response = admin_api.list_shop_manage_groups.__wrapped__()
body = response.get_json()
self.assertEqual(body['locked_group_id'], 3)
self.assertEqual([item['id'] for item in body['items']], [3, 8])
def test_group_list_does_not_lock_super_admin(self):
with self.app.test_request_context('/api/admin/shop-manage-groups'):
with patch.object(
admin_api,
'_ensure_backend_menu_access',
return_value=('super_admin', {'id': 1}, None),
), patch.object(
admin_api,
'_load_expanded_shop_manage_groups',
return_value=([{'id': 3, 'groupName': 'group-a'}], None, 200),
):
response = admin_api.list_shop_manage_groups.__wrapped__()
self.assertIsNone(response.get_json()['locked_group_id'])
if __name__ == '__main__':
unittest.main()