aboutsummaryrefslogtreecommitdiff
path: root/.ai/scripts/tests/test_broadcast.py
blob: a0decf53d5f23d983198d175630f0d49a679da5f (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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
"""Tests for broadcast.py: project fingerprinting + discovery.

Plain python3 script. The pure-ish helpers are driven against tmp project
trees; discovery is exercised with SEARCH_ROOTS monkeypatched to the tree, and
the cwd-based helpers with monkeypatch.chdir.
"""
from __future__ import annotations

import importlib.util
from pathlib import Path

import pytest

SCRIPT = Path(__file__).resolve().parents[1] / "broadcast.py"


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


def _make_project(root: Path, name: str, with_inbox: bool = True,
                  with_protocols: bool = True) -> Path:
    p = root / name
    (p / ".ai").mkdir(parents=True)
    if with_protocols:
        (p / ".ai" / "protocols.org").write_text("#+TITLE: protocols\n")
    if with_inbox:
        (p / "inbox").mkdir()
    return p


# --- is_broadcastable ---

def test_is_broadcastable_true_with_protocols_and_inbox(bcast, tmp_path):
    assert bcast.is_broadcastable(_make_project(tmp_path, "proj")) is True


def test_is_broadcastable_false_without_inbox(bcast, tmp_path):
    p = _make_project(tmp_path, "proj", with_inbox=False)
    assert bcast.is_broadcastable(p) is False


def test_is_broadcastable_false_without_protocols(bcast, tmp_path):
    p = _make_project(tmp_path, "proj", with_protocols=False)
    assert bcast.is_broadcastable(p) is False


def test_is_broadcastable_false_on_plain_dir(bcast, tmp_path):
    assert bcast.is_broadcastable(tmp_path) is False


# --- discover (SEARCH_ROOTS monkeypatched onto the tmp tree) ---

def test_discover_finds_broadcastable_subprojects(bcast, tmp_path, monkeypatch):
    root = tmp_path / "code"
    root.mkdir()
    _make_project(root, "alpha")
    _make_project(root, "beta")
    _make_project(root, "no-inbox", with_inbox=False)  # not broadcastable
    monkeypatch.setattr(bcast, "SEARCH_ROOTS", [root])
    assert [p.name for p in bcast.discover()] == ["alpha", "beta"]


def test_discover_handles_root_that_is_itself_a_project(bcast, tmp_path, monkeypatch):
    root = _make_project(tmp_path, ".emacs.d")
    monkeypatch.setattr(bcast, "SEARCH_ROOTS", [root])
    assert [p.name for p in bcast.discover()] == [".emacs.d"]


def test_discover_dedups_by_basename_across_roots(bcast, tmp_path, monkeypatch):
    root1 = tmp_path / "code"
    root1.mkdir()
    root2 = tmp_path / "projects"
    root2.mkdir()
    _make_project(root1, "dup")
    _make_project(root2, "dup")
    monkeypatch.setattr(bcast, "SEARCH_ROOTS", [root1, root2])
    assert [p.name for p in bcast.discover()] == ["dup"]


def test_discover_skips_missing_roots(bcast, tmp_path, monkeypatch):
    monkeypatch.setattr(bcast, "SEARCH_ROOTS", [tmp_path / "does-not-exist"])
    assert bcast.discover() == []


# --- sender_project / inbox_send_path (cwd-based) ---

def test_sender_project_returns_basename_inside_an_ai_project(bcast, tmp_path, monkeypatch):
    p = _make_project(tmp_path, "myproj")
    monkeypatch.chdir(p)
    assert bcast.sender_project() == "myproj"


def test_sender_project_none_outside_an_ai_project(bcast, tmp_path, monkeypatch):
    monkeypatch.chdir(tmp_path)
    assert bcast.sender_project() is None


def test_inbox_send_path_found_in_project(bcast, tmp_path, monkeypatch):
    p = _make_project(tmp_path, "myproj")
    (p / ".ai" / "scripts").mkdir()
    helper = p / ".ai" / "scripts" / "inbox-send.py"
    helper.write_text("# stub\n")
    monkeypatch.chdir(p)
    assert bcast.inbox_send_path() == helper


def test_inbox_send_path_raises_when_missing(bcast, tmp_path, monkeypatch):
    monkeypatch.chdir(tmp_path)
    with pytest.raises(SystemExit):
        bcast.inbox_send_path()