Newer
Older
TIASDataHub / tests / test_stats.py
"""目録の集計(`tiasdata stats`.SPEC_03「CLI」).

- 種類・所見の値ごとの件数を返す
- 対応表を開かない(SPEC_02「対応表」: 対応表を開くのは取り込みのときだけ)
"""

import sqlite3
from contextlib import closing

from conftest import ImportEnv

from tiasdata.cli import main
from tiasdata.config import load_config
from tiasdata.importers import run_import
from tiasdata.stats import collect_stats


def _open(env: ImportEnv) -> sqlite3.Connection:
    return sqlite3.connect(env.catalog_root / "catalog.sqlite")


def test_empty_catalog(import_env: ImportEnv) -> None:
    assert main(["init"]) == 0
    with closing(_open(import_env)) as conn:
        stats = collect_stats(conn)
    assert stats.subjects == 0
    assert stats.captures == 0
    assert stats.subjects_with_multiple_captures == 0
    assert set(stats.assets_by_kind.values()) == {0}
    assert "tongue_crop_masked" in stats.assets_by_kind
    assert stats.annotations == {}
    assert stats.superseded_annotations == 0


def test_counts_after_import(import_env: ImportEnv) -> None:
    assert main(["init"]) == 0
    run_import(load_config(import_env.config_path), import_env.source_name)
    with closing(_open(import_env)) as conn:
        stats = collect_stats(conn)
    assert stats.subjects == 7
    assert stats.captures == 18
    # ダミーの 7 人はみな 2 枚以上
    assert stats.subjects_with_multiple_captures == 7
    assert stats.assets_by_kind == {
        "color_chart": 0,
        "tongue_crop_masked": 18,
        "tongue_mask": 0,
        "tongue_raw": 0,
    }
    tongue = stats.annotations["tongue_color"]
    assert tongue.total == 18
    assert tongue.by_field["label"] == {
        "dark_red": 4,
        "light_red": 2,
        "pale": 4,
        "purple": 4,
        "red": 4,
    }
    assert tongue.by_field["severity"] == {"mild": 8, "normal": 2, "strong": 8}
    # 9 フォルダ(ラベル×程度の組み合わせ)ごとに 2 枚
    assert len(tongue.by_value) == 9
    assert set(tongue.by_value.values()) == {2}
    assert stats.superseded_annotations == 0


def test_stats_does_not_need_identity_db(import_env: ImportEnv) -> None:
    assert main(["init"]) == 0
    run_import(load_config(import_env.config_path), import_env.source_name)
    import_env.identity_path.unlink()
    assert main(["stats"]) == 0
    assert not import_env.identity_path.exists()


def test_held_images_are_not_counted(import_env: ImportEnv) -> None:
    from conftest import write_holds

    write_holds(import_env.holds_dir, "dummy_tongue", [1, 2])  # light_red の 2 枚
    assert main(["init"]) == 0
    run_import(load_config(import_env.config_path), import_env.source_name)
    with closing(_open(import_env)) as conn:
        stats = collect_stats(conn)
    assert stats.captures == 16
    assert "light_red" not in stats.annotations["tongue_color"].by_field["label"]