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.
87 lines
3.2 KiB
Python
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()
|