aboutsummaryrefslogtreecommitdiff
path: root/.ai/scripts/tests/test_drill_deck_stats.py
blob: 02d9c4e45cf8a9ed846e4f249fc09990aca84561 (plain)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
"""Tests for drill-deck-stats.py: prompt-form heuristic + CLI inventory/gate.

Plain python3 script (no third-party deps), so the pure helper imports directly;
the inventory/gate behavior is exercised through the CLI.
"""
from __future__ import annotations

import importlib.util
import subprocess
import sys
from pathlib import Path

import pytest

SCRIPT = Path(__file__).resolve().parents[1] / "drill-deck-stats.py"


@pytest.fixture(scope="module")
def stats():
    spec = importlib.util.spec_from_file_location("drill_deck_stats", SCRIPT)
    assert spec and spec.loader
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module


# --- is_prompt_form (pure) ---

def test_is_prompt_form_question_mark(stats):
    assert stats.is_prompt_form("What is DeepSat?") is True


def test_is_prompt_form_imperative_verb(stats):
    assert stats.is_prompt_form("Spell out the orbital regimes") is True


def test_is_prompt_form_imperative_is_case_insensitive(stats):
    assert stats.is_prompt_form("introduce yourself") is True


def test_is_prompt_form_topic_heading_is_not_a_prompt(stats):
    assert stats.is_prompt_form("DeepSat") is False


def test_is_prompt_form_strips_trailing_punctuation_off_first_word(stats):
    assert stats.is_prompt_form("List: the founders") is True


# --- CLI inventory + gate (integration) ---

CLEAN_DECK = """#+TITLE: DeepSat Flashcards

* Section
** What is DeepSat? :drill:
:PROPERTIES:
:ID: card-1
:END:
A satellite company.
"""

DIRTY_DECK = """#+TITLE: DeepSat Org-Drill Flashcards

* Section
** DeepSat :drill:
*** Answer
A satellite company.
"""


def _run(path):
    return subprocess.run(
        [sys.executable, str(SCRIPT), str(path)],
        capture_output=True, text=True,
    )


def test_cli_clean_deck_exits_zero(tmp_path):
    f = tmp_path / "clean.org"
    f.write_text(CLEAN_DECK)
    r = _run(f)
    assert r.returncode == 0
    assert "clean" in r.stdout


def test_cli_dirty_deck_warns_and_exits_one(tmp_path):
    f = tmp_path / "dirty.org"
    f.write_text(DIRTY_DECK)
    r = _run(f)
    assert r.returncode == 1
    assert "WARN" in r.stdout
    assert "org-drill" in r.stdout.lower()  # title-jargon audit fired


def test_cli_missing_file_exits_two(tmp_path):
    r = _run(tmp_path / "nope.org")
    assert r.returncode == 2