File size: 3,607 Bytes
5a84c0a
 
 
e73905d
 
 
 
 
5a84c0a
 
 
e73905d
5a84c0a
 
 
 
 
 
e73905d
5a84c0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e73905d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a84c0a
e73905d
5a84c0a
e73905d
5a84c0a
e73905d
 
 
5a84c0a
 
e73905d
 
5a84c0a
e73905d
5a84c0a
 
e73905d
 
 
 
 
 
 
5a84c0a
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
"""Deterministic, TENANT-AGNOSTIC output guard: for ANY client the bot must never
hand the customer a third-party (manufacturer/brand) email or site, nor assert
safety/warranty/homologation claims no tool returned. Enforced in CODE because the
weak open-weight models disobey the prompt (real Toorx transcripts proved it)."""
from __future__ import annotations

from app.orchestrator import _is_ungrounded_reply, _scrub_manufacturer

# A sample store's own identity (any client would pass its own here).
OWN_DOMS = frozenset({"baisports.com"})
OWN_MAILS = frozenset({"administracion@baisports.com"})


def test_flags_third_party_email_for_any_client():
    # a manufacturer/third-party business email -> redirect -> flagged
    assert _is_ungrounded_reply("Escribe a toorx@toorx.es", "", OWN_DOMS, OWN_MAILS)
    assert _is_ungrounded_reply("Pídelo en ventas@otramarca.com", "", OWN_DOMS, OWN_MAILS)
    # generic 'contact the manufacturer' phrasing (no brand hardcoded)
    assert _is_ungrounded_reply("contacta con el fabricante", "")
    assert _is_ungrounded_reply("visita el sitio web del fabricante", "")


def test_allows_the_stores_OWN_email_and_customer_freemail():
    # the store's own support email is NOT a redirect
    assert not _is_ungrounded_reply(
        "Escríbenos a administracion@baisports.com", "", OWN_DOMS, OWN_MAILS)
    # a customer's personal email (e.g. echoed in an order lookup) is NOT a redirect
    assert not _is_ungrounded_reply(
        "He encontrado tu pedido asociado a juan@gmail.com", "", OWN_DOMS, OWN_MAILS)


def test_generality_same_guard_protects_a_different_client():
    # a coffee store whose own domain is cafemark.com; the bot must not send the
    # customer to the roaster's site/email
    coffee_doms = frozenset({"cafemark.com"})
    assert _is_ungrounded_reply("escribe al tostador a hola@tueste-origen.com", "", coffee_doms)
    assert not _is_ungrounded_reply("escríbenos a hola@cafemark.com", "", coffee_doms,
                                    frozenset({"hola@cafemark.com"}))


def test_flags_invented_safety_warranty_only_when_ungrounded():
    assert _is_ungrounded_reply(
        "No, eso anula la garantía y supone un riesgo de lesión.",
        "ASX-90 medidas 1995x1630x2220 mm; discos 28mm encajan con holgura",
    )
    # the SAME claim is allowed when a tool result actually says it
    assert not _is_ungrounded_reply(
        "La garantía no cubre golpes por mal uso.",
        "Política: la garantía no cubre golpes por mal uso.",
    )


def test_allows_clean_grounded_reply():
    assert not _is_ungrounded_reply(
        "Los discos de 28mm encajan en barras de 25mm con holgura mínima; son seguros.",
        "Regla: los discos de 28mm SÍ son compatibles con 25mm, holgura ~3mm, seguros.",
        OWN_DOMS, OWN_MAILS,
    )
    assert not _is_ungrounded_reply("La ASX-90 cuesta 929€ y está en stock.", "", OWN_DOMS)


def test_does_not_flag_brand_name_mentions():
    # mentioning the product brand is fine — only third-party ROUTING is not
    assert not _is_ungrounded_reply("La máquina Toorx ASX-90 es una estación all-in-one.", "", OWN_DOMS)


def test_scrub_removes_third_party_sentence_keeps_rest():
    out = _scrub_manufacturer(
        "Te ayudo con la ASX-90. Para más info escribe a toorx@toorx.es. Está en stock.",
        OWN_DOMS, OWN_MAILS,
    )
    assert "toorx@toorx.es" not in out
    assert "ASX-90" in out and "stock" in out


def test_scrub_noop_when_clean():
    s = "La ASX-90 acepta discos de 28mm con holgura mínima."
    assert _scrub_manufacturer(s, OWN_DOMS, OWN_MAILS) == s