kb-demo / backend /tests /test_init_system.py
RayLi-Git
fix: 檔案移至根目錄 + 套用示範 README
a7cd101
Raw
History Blame Contribute Delete
2.64 kB
"""§43 系統初始化 init_system 測試(透過 import script 模組)。"""
from __future__ import annotations
import sys
from pathlib import Path
import pytest
from app.auth.passwords import hash_password
from app.db import _utcnow, get_conn
# 讓 import init_system 找得到
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "scripts"))
@pytest.fixture()
def initsys(monkeypatch):
monkeypatch.setenv("KBV5_INIT_NONINTERACTIVE", "1")
import init_system
init_system.NON_INTERACTIVE = True
return init_system
def _mkadmin():
c = get_conn()
c.execute(
"INSERT INTO users (username, email, password_hash, role, department, "
"created_at, is_active) VALUES (?,?,?,?,?,?,1)",
("adm", "adm@x.tw", hash_password("x"), "admin", "管理部", _utcnow()),
)
return c.execute("SELECT id FROM users WHERE username='adm'").fetchone()["id"]
def test_sample_docs_created(initsys):
aid = _mkadmin()
n = initsys.step_sample_docs(get_conn(), aid)
assert n == 3
rows = get_conn().execute(
"SELECT title FROM documents WHERE author_id=?", (aid,)).fetchall()
titles = {r["title"] for r in rows}
assert "歡迎使用知識庫系統" in titles
assert "如何提交筆記" in titles
assert "系統使用指南" in titles
def test_sample_docs_idempotent(initsys):
aid = _mkadmin()
initsys.step_sample_docs(get_conn(), aid)
n2 = initsys.step_sample_docs(get_conn(), aid)
assert n2 == 0 # 第二次全跳過
def test_sample_docs_are_public(initsys):
aid = _mkadmin()
initsys.step_sample_docs(get_conn(), aid)
rows = get_conn().execute(
"SELECT visibility FROM documents WHERE author_id=?", (aid,)).fetchall()
assert all(r["visibility"] == "public" for r in rows)
def test_health_check_no_admin(initsys):
# 沒 admin → 報問題
issues = initsys.health_check(get_conn())
assert any("admin" in i for i in issues)
def test_health_check_with_admin(initsys):
_mkadmin()
# 部門需先有(conftest KBV5_SEED=0,手動加)
get_conn().execute(
"INSERT OR IGNORE INTO departments (name, sort_order, is_active, created_at) "
"VALUES ('管理部', 0, 1, ?)", (_utcnow(),))
issues = initsys.health_check(get_conn())
# 不應有「無 active admin」或「無部門」
assert not any("無 active admin" in i for i in issues)
assert not any("無部門" in i for i in issues)
def test_step_admin_skips_when_exists(initsys):
aid = _mkadmin()
result = initsys.step_admin(get_conn())
assert result == aid # 回既有 admin id,不新建