You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iTi-Flask/tests/test_seed_system.py

87 lines
3.2 KiB
Python

from sqlalchemy import select
from iti.applications import create_app
from iti.applications.common.enums import GenderEnum, StatusEnum
from iti.applications.common.permission import get_super_admin_role
from iti.applications.extensions import db
from iti.applications.models import Role, SysConfig, SysMenu, User
from iti.seeds.system import DEFAULT_MENUS, seed_system_data
def test_seed_system_data_is_idempotent():
app = create_app("test")
with app.app_context():
db.create_all()
first = seed_system_data()
admin_user = db.session.scalar(select(User).filter_by(username="admin"))
assert admin_user is not None
admin_user.realname = "已有管理员"
admin_user.email = "existing@example.com"
admin_user.password = "custom-password"
db.session.commit()
second = seed_system_data()
assert first["roles"]["created"] == 2
assert first["menus"]["created"] == len(DEFAULT_MENUS)
assert second["roles"]["created"] == 0
assert second["menus"]["created"] == 0
assert second["users"]["created"] == 0
admin_role = db.session.scalar(select(Role).filter_by(code="ADMIN"))
common_role = db.session.scalar(select(Role).filter_by(code="COMMON"))
admin_user = db.session.scalar(select(User).filter_by(username="admin"))
default_roles = db.session.scalar(
select(SysConfig).filter_by(type="USER", code="DEFAULT_USER_ROLES")
)
assert admin_role is not None
assert common_role is not None
assert admin_user is not None
assert admin_user.realname == "已有管理员"
assert admin_user.email == "existing@example.com"
assert admin_user.check_password("custom-password")
assert default_roles is not None
assert default_roles.value == "COMMON"
assert app.config["PERMISSION_CONFIG"]["SUPER_ADMIN_ROLE"] == "ADMIN"
assert get_super_admin_role() == "ADMIN"
assert {role.code for role in admin_user.roles} == {"ADMIN"}
assert len(admin_role.menus) == len(DEFAULT_MENUS)
assert db.session.scalar(select(SysMenu).filter_by(name="PunchAndReport")) is None
db.session.remove()
db.drop_all()
def test_seed_system_data_does_not_update_existing_admin_user():
app = create_app("test")
with app.app_context():
db.create_all()
existing = User(
username="admin",
password="custom-password",
realname="已有管理员",
email="existing@example.com",
gender=GenderEnum.SECURE.value,
status=StatusEnum.ENABLED.value,
)
db.session.add(existing)
db.session.commit()
summary = seed_system_data()
admin_user = db.session.scalar(select(User).filter_by(username="admin"))
assert summary["users"]["created"] == 0
assert summary["users"]["updated"] == 0
assert summary["users"]["skipped"] == 1
assert admin_user.realname == "已有管理员"
assert admin_user.email == "existing@example.com"
assert admin_user.check_password("custom-password")
assert {role.code for role in admin_user.roles} == {"ADMIN"}
db.session.remove()
db.drop_all()