File size: 2,643 Bytes
3b1ab70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
"""§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,不新建