-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtest_jsonl_validation.py
More file actions
88 lines (69 loc) · 3.4 KB
/
Copy pathtest_jsonl_validation.py
File metadata and controls
88 lines (69 loc) · 3.4 KB
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
"""Runtime validation at the JSONL → SessionDict boundary."""
import os
import sys
from typing import Any
import pytest
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
from models.errors import SessionValidationError
from utils.jsonl_parser import parse_session
from utils.validation import validate_session_dict
FIXTURES = os.path.join(os.path.dirname(__file__), "fixtures")
def _valid_payload(**overrides: Any) -> dict[str, Any]:
base: dict[str, Any] = {
"session_id": "abc123",
"title": "Test Session",
"messages": [{"role": "user", "text": "hello"}],
"metadata": {"session_id": "abc123"},
}
base.update(overrides)
return base
class TestValidateSessionDict:
def test_missing_session_id(self):
payload = _valid_payload()
del payload["session_id"]
with pytest.raises(SessionValidationError) as exc_info:
validate_session_dict(payload)
assert exc_info.value.path == "session_id"
def test_wrong_type_session_id(self):
with pytest.raises(SessionValidationError) as exc_info:
validate_session_dict(_valid_payload(session_id=123))
assert exc_info.value.path == "session_id"
def test_null_session_id(self):
with pytest.raises(SessionValidationError) as exc_info:
validate_session_dict(_valid_payload(session_id=None))
assert exc_info.value.path == "session_id"
assert exc_info.value.detail == "must not be null"
def test_null_role_in_message(self):
with pytest.raises(SessionValidationError) as exc_info:
validate_session_dict(_valid_payload(messages=[{"role": None, "text": "x"}]))
assert exc_info.value.path == "messages[0].role"
def test_missing_role_in_message(self):
with pytest.raises(SessionValidationError) as exc_info:
validate_session_dict(_valid_payload(messages=[{"text": "no role key"}]))
assert exc_info.value.path == "messages[0].role"
def test_metadata_not_dict(self):
with pytest.raises(SessionValidationError) as exc_info:
validate_session_dict(_valid_payload(metadata="not-a-dict"))
assert exc_info.value.path == "metadata"
def test_message_not_dict(self):
with pytest.raises(SessionValidationError) as exc_info:
validate_session_dict(_valid_payload(messages=["not-a-dict"]))
assert exc_info.value.path == "messages[0]"
def test_valid_payload_returns_session_dict(self):
result = validate_session_dict(_valid_payload())
assert result["session_id"] == "abc123"
assert result["messages"][0]["role"] == "user"
def test_invalid_role_in_message(self):
with pytest.raises(SessionValidationError) as exc_info:
validate_session_dict(_valid_payload(messages=[{"role": "custom", "text": "x"}]))
assert exc_info.value.path == "messages[0].role"
assert "custom" in exc_info.value.detail
class TestParseSessionValidationRegression:
def test_session_minimal_fixture_unchanged(self):
path = os.path.join(FIXTURES, "session_minimal.jsonl")
session = parse_session(path)
assert session["session_id"] == "session_minimal"
assert session["title"] == "Hello from integration fixture"
assert len(session["messages"]) == 2
assert session["messages"][0]["role"] == "user"
assert session["messages"][1]["role"] == "assistant"