|
|
|
|
@ -1,9 +1,11 @@
|
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
|
|
|
|
from iti import create_app
|
|
|
|
|
from iti.auth import create_access_token
|
|
|
|
|
from iti.config import BaseConfig
|
|
|
|
|
from iti.db import Base
|
|
|
|
|
from iti_system import create_system_module
|
|
|
|
|
from iti_system.models import Role, SysMenu, User
|
|
|
|
|
from iti_system.seeds import seed_system_data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -67,10 +69,13 @@ def test_login_and_current_user_flow():
|
|
|
|
|
response = client.get("/sys/user/current", headers=headers)
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
assert response.json()["data"]["username"] == "admin"
|
|
|
|
|
data = response.json()["data"]
|
|
|
|
|
assert data["username"] == "admin"
|
|
|
|
|
assert data["roleCodes"] == ["ADMIN"]
|
|
|
|
|
assert data["isSuper"] is True
|
|
|
|
|
event = app.state.audit_dispatcher._queue.get_nowait()
|
|
|
|
|
assert event.type == "login"
|
|
|
|
|
assert event.actor_id == response.json()["data"]["id"]
|
|
|
|
|
assert event.actor_id == data["id"]
|
|
|
|
|
assert event.success is True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -83,6 +88,75 @@ def test_admin_can_list_system_routes():
|
|
|
|
|
assert client.get("/sys/config/list", headers=headers).json()["code"] == 200
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_menu_exists_supports_path_auth_code_and_excludes_current_id():
|
|
|
|
|
client = TestClient(make_app())
|
|
|
|
|
headers = login(client)
|
|
|
|
|
|
|
|
|
|
by_path = client.get("/sys/menu/exists", params={"path": "/system/menu"}, headers=headers)
|
|
|
|
|
same_path = client.get(
|
|
|
|
|
"/sys/menu/exists",
|
|
|
|
|
params={"id": "system-menu", "path": "/system/menu"},
|
|
|
|
|
headers=headers,
|
|
|
|
|
)
|
|
|
|
|
by_auth_code = client.get(
|
|
|
|
|
"/sys/menu/exists",
|
|
|
|
|
params={"authCode": "system:menu:list"},
|
|
|
|
|
headers=headers,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert by_path.json()["data"] == {"exists": True}
|
|
|
|
|
assert same_path.json()["data"] == {"exists": False}
|
|
|
|
|
assert by_auth_code.json()["data"] == {"exists": True}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_menu_tree_returns_current_user_visible_routes_without_menu_admin_permission():
|
|
|
|
|
app = make_app()
|
|
|
|
|
with app.state.db_sessionmaker() as db:
|
|
|
|
|
parent = SysMenu(
|
|
|
|
|
id="orders",
|
|
|
|
|
name="Orders",
|
|
|
|
|
type="catalog",
|
|
|
|
|
path="/orders",
|
|
|
|
|
status="enabled",
|
|
|
|
|
)
|
|
|
|
|
child = SysMenu(
|
|
|
|
|
id="orders-list",
|
|
|
|
|
name="OrdersList",
|
|
|
|
|
type="menu",
|
|
|
|
|
path="/orders/list",
|
|
|
|
|
component="/orders/list",
|
|
|
|
|
auth_code="orders:list",
|
|
|
|
|
parent=parent,
|
|
|
|
|
status="enabled",
|
|
|
|
|
)
|
|
|
|
|
button = SysMenu(
|
|
|
|
|
id="orders-create",
|
|
|
|
|
name="OrdersCreate",
|
|
|
|
|
type="button",
|
|
|
|
|
auth_code="orders:create",
|
|
|
|
|
parent=child,
|
|
|
|
|
status="enabled",
|
|
|
|
|
)
|
|
|
|
|
role = Role(name="操作员", code="OPERATOR", menus=[child, button])
|
|
|
|
|
user = User(username="operator", status="enabled", roles=[role])
|
|
|
|
|
user.set_password("123456")
|
|
|
|
|
db.add_all([parent, child, button, role, user])
|
|
|
|
|
db.commit()
|
|
|
|
|
user_id = user.id
|
|
|
|
|
|
|
|
|
|
token = create_access_token(user_id, app.state.config)
|
|
|
|
|
response = TestClient(app).get(
|
|
|
|
|
"/sys/menu/tree",
|
|
|
|
|
headers={"Authorization": f"Bearer {token}"},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
data = response.json()["data"]
|
|
|
|
|
assert [item["id"] for item in data] == ["orders"]
|
|
|
|
|
assert [item["id"] for item in data[0]["children"]] == ["orders-list"]
|
|
|
|
|
assert data[0]["children"][0]["children"] == []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_internal_audit_writes_sys_log():
|
|
|
|
|
client = TestClient(make_app())
|
|
|
|
|
|
|
|
|
|
|