File size: 1,345 Bytes
63a6397
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import pytest

from Cyber_analyst.inference import (
    ModelActionError,
    action_to_log,
    error_action,
    parse_model_action,
)


def test_parse_model_action_accepts_compact_json():
    action = parse_model_action('{"tool_name":"search_repo","args":{"query":"api key"}}')

    assert action.tool_name == "search_repo"
    assert action.args == {"query": "api key"}


def test_parse_model_action_accepts_fenced_json():
    action = parse_model_action(
        """```json
{"tool_name":"list_assets","args":{}}
```"""
    )

    assert action.tool_name == "list_assets"
    assert action.args == {}


def test_parse_model_action_rejects_malformed_json():
    with pytest.raises(ModelActionError, match="model_parse_error"):
        parse_model_action("search the repo for api keys")


def test_action_to_log_is_single_line_json():
    action = parse_model_action('{"tool_name":"search_repo","args":{"query":"api\\nkey"}}')

    logged = action_to_log(action)

    assert "\n" not in logged
    assert logged == '{"args":{"query":"api\\nkey"},"tool_name":"search_repo"}'


def test_error_action_uses_strict_diagnostic_tool_name():
    action = error_action(ModelActionError("model_parse_error: empty response"))

    assert action.tool_name == "model_parse_error"
    assert action.args == {"message": "model_parse_error: empty response"}