File size: 3,214 Bytes
c9a4176
a522187
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c9a4176
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a522187
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from agents.file_conversion import convert_csv_attachment_to_json, validate_csv_json_equivalence
from agents.goal_verifier import GoalVerifier


def _goal(target: str = "e2e_metrics.json") -> str:
    return f"""Converti il file allegato e2e_metrics.csv in un nuovo file workspace chiamato {target}.
Il JSON deve preservare tutti i valori del CSV.
--- **File allegati:**
### 📎 e2e_metrics.csv (excel, 66B)
```
## Foglio: Sheet1
mese,richieste,successi
1/1/26,12,11
2/1/26,15,14
3/1/26,18,17
```
"""


def test_convert_csv_attachment_to_json_preserves_rows_and_scalars():
    result = convert_csv_attachment_to_json(_goal())

    assert result is not None
    assert result.source_name == "e2e_metrics.csv"
    assert result.target_name == "e2e_metrics.json"
    assert result.row_count == 3
    assert '"mese": "1/1/26"' in result.content
    assert '"richieste": 18' in result.content
    assert '"successi": 17' in result.content


def test_convert_csv_attachment_requires_explicit_json_target():
    assert convert_csv_attachment_to_json(_goal(target="output.txt")) is None


def test_inline_csv_conversion_preserves_the_exact_mobile_fixture():
    goal = """Esegui solo nel workspace VFS locale questa conversione deterministica.
Crea capability_catalog.csv con contenuto esatto: id,name,active
1,alpha,true
2,beta,false
. Poi crea capability_catalog.json con lo stesso catalogo come array JSON valido di due oggetti.
Non usare rete, shell, servizi esterni o provider aggiuntivi."""

    result = convert_csv_attachment_to_json(goal)

    assert result is not None
    assert result.source_is_inline is True
    assert result.source_name == "capability_catalog.csv"
    assert result.target_name == "capability_catalog.json"
    assert result.source_content == "id,name,active\n1,alpha,true\n2,beta,false\n"
    assert result.row_count == 2
    assert '"name": "alpha"' in result.content
    assert '"name": "beta"' in result.content
    assert '"CAP-001"' not in result.content
    assert validate_csv_json_equivalence(result.source_content, result.content) == (True, "")


def test_semantic_validator_rejects_a_generic_catalog_even_when_its_json_is_valid():
    csv_content = "id,name,active\n1,alpha,true\n2,beta,false\n"
    generic_catalog = """[
      {"id": "CAP-001", "name": "Data Ingestion", "active": true},
      {"id": "CAP-002", "name": "Data Cleaning", "active": false}
    ]"""

    is_valid, reason = validate_csv_json_equivalence(csv_content, generic_catalog)

    assert is_valid is False
    assert "non corrispondono" in reason


def test_file_conversion_is_not_a_code_goal_even_with_e2e_marker():
    assert GoalVerifier.is_code_goal(_goal()) is False


def test_conversion_with_explicit_code_context_remains_code_goal():
    assert GoalVerifier.is_code_goal(
        "Converti questo JSON in una funzione Python e scrivi il codice completo."
    ) is True


def test_e2e_marker_alone_does_not_turn_file_reading_into_a_code_goal():
    assert GoalVerifier.is_code_goal(
        "Leggi il file allegato e restituisci il marker E2E_FILE_READ_OK."
    ) is False
    assert GoalVerifier.is_code_goal(
        "Aggiungi un test e2e per l’endpoint API di conversione file."
    ) is True