"""Moment proposals and judgments — what a mock can see (milestone 458 step 7). The behaviour against real tables is tests/test_integration_rule_moment_judgments.py. These pin the pieces that need no database: that the migration's CHECKs and the model agree (rule 36), which moments count as evidence, and that the line the signal hands a session names the tool that answers it. """ from __future__ import annotations import importlib.util from pathlib import Path from types import SimpleNamespace from scribe.models.rule_moment_judgment import JUDGMENT_STATES, NO_MOMENT, SOURCES from scribe.services import moments as moments_svc from scribe.services import rule_moment_judgments as svc ROOT = Path(__file__).resolve().parents[1] def _migration(): path = ROOT / "alembic" / "versions" / "0118_rule_moment_judgments.py" spec = importlib.util.spec_from_file_location("m0118", path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def test_the_migration_checks_and_the_model_agree(): m = _migration() assert tuple(m._STATES) == tuple(JUDGMENT_STATES) assert tuple(m._SOURCES) == tuple(SOURCES) def test_verdicts_name_real_states(): assert set(svc.VERDICTS.values()) <= set(JUDGMENT_STATES) def test_no_moment_is_not_a_mountable_name(): """"" is the "none fits" answer; if it ever became mountable, a pass's "no moment" would read as a mount on nothing.""" assert not moments_svc.is_moment(NO_MOMENT) def test_the_ubiquitous_moments_are_not_evidence(): assert svc.signal_moments(["work.run", "work.verify", "work.change", "work.verify", "not.a.moment", "skill.brainstorming"]) == [ "work.verify", "skill.brainstorming", ] # Every skipped name is a real moment — a typo here would skip nothing. assert all(moments_svc.is_moment(m) for m in svc.SIGNAL_SKIP) def test_the_proposal_line_names_the_tool_that_answers_it(): rule = SimpleNamespace(id=11, title="Definition of done", kind="rule") line = svc._proposal_line(rule, "work.verify", {"situations": ["a", "b", "c"]}) assert line.startswith("> Rule #11") assert "`work.verify`" in line and "3 distinct sessions" in line assert '"rule_id": 11' in line and '"moment": "work.verify"' in line assert "judge_rule_moments" in line and '"reject"' in line