File size: 3,768 Bytes
15766ed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""#16 from the audit: "how does my clone differ from wild type?"

align.py has done Needleman-Wunsch and Smith-Waterman since the M-series, and
the agent could never call it — the fifth capability found sitting in the repo
with no tool pointing at it. That pattern is the audit's single most common
finding, which is why this file exists at all.

The tool returns DIFFERENCES, not an alignment. A scientist comparing a
sequenced clone to its design wants "one substitution at position 9"; the
aligned strings are the evidence for that, not the answer.
"""
import pytest

from dee.core import agent_tools as t
from dee.core import orchestrator as orch


def cmp_(a, b, **kw):
    return t.execute_tool("compare_sequences",
                          dict(sequence_a=a, sequence_b=b, **kw),
                          auth_anonymous=True)


def test_a_point_mutation_is_located_exactly():
    out = cmp_("ATGGAGGAGCCGCAGTCAGAT", "ATGGAGGAACCGCAGTCAGAT")
    assert out["ok"] and out["difference_count"] == 1
    assert out["differences"] == [
        {"position": 9, "from": "G", "to": "A", "kind": "substitution"}]


def test_identical_sequences_say_so_plainly():
    """The most reassuring answer in the product, and it must not be phrased
    as 100% identity with a list of zero differences."""
    out = cmp_("ATGCATGCATGC", "ATGCATGCATGC")
    assert out["identical"] is True and out["difference_count"] == 0
    assert "identical" in orch._summarize("compare_sequences", out)


def test_indels_are_distinguished_from_substitutions():
    """A substitution and a deletion have wildly different consequences —
    collapsing both into 'differences' would hide a frameshift."""
    out = cmp_("ATGCATGCATGCAAA", "ATGCATGCATGC")
    assert out["by_kind"]["deletion"] == 3
    assert out["by_kind"]["substitution"] == 0


def test_positions_are_numbered_along_the_reference():
    """Numbering along the ALIGNMENT would give coordinates meaningless
    outside this one comparison — useless for going back to the construct."""
    out = cmp_("AAATTTGGG", "AAATTTGGGCCC")   # b has an insertion at the end
    for d in out["differences"]:
        assert d["position"] <= 9, d


def test_protein_works_too():
    out = cmp_("MSIQHFRVAL", "MSIQHFRVAK")
    assert out["difference_count"] == 1
    assert out["differences"][0]["to"] == "K"


def test_the_size_ceiling_is_an_answer_not_a_crash():
    """align() refuses oversized input by design; that refusal has to reach
    the model as a real result with a next step."""
    big = "ACGT" * 200_000
    out = cmp_(big, big)
    assert out["ok"] is False and out["kind"] == "too_large"
    assert "shorter region" in out["next"]


def test_missing_input_is_refused_before_any_work():
    assert cmp_("", "ATGC")["ok"] is False
    assert cmp_("ATGC", "  ")["ok"] is False


def test_an_unknown_mode_is_refused_rather_than_guessed():
    out = cmp_("ATGC", "ATGC", mode="fuzzy")
    assert out["ok"] is False and "global" in out["error"]


def test_the_summary_leads_with_what_changed_not_just_identity():
    """99% identity is fine for a point mutation and alarming for a
    frameshift. The line has to say which."""
    line = orch._summarize("compare_sequences",
                           cmp_("ATGCATGCATGCAAA", "ATGCATGCATGC"))
    assert "deletion" in line


def test_it_is_reachable_and_ungated():
    """The whole point of the ticket. Pure local computation on sequences the
    caller already holds — nothing transmitted, nothing stored."""
    assert "compare_sequences" in t._TOOLS
    assert any(s["function"]["name"] == "compare_sequences" for s in orch.TOOL_SPECS)
    assert t._TOOLS["compare_sequences"]["requires_signin"] is False
    assert orch._requires_confirm("compare_sequences") is False