|
9 | 9 | sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) |
10 | 10 |
|
11 | 11 | from models.errors import SessionValidationError |
12 | | -from utils.jsonl_parser import parse_session |
| 12 | +from utils.jsonl_parser import ( |
| 13 | + _finalize_session_metadata, |
| 14 | + _new_session_metadata_builder, |
| 15 | + parse_session, |
| 16 | +) |
13 | 17 | from utils.validation import validate_session_dict |
14 | 18 |
|
15 | 19 | FIXTURES = os.path.join(os.path.dirname(__file__), "fixtures") |
16 | 20 |
|
17 | 21 |
|
| 22 | +def _full_metadata(**overrides: Any) -> dict[str, Any]: |
| 23 | + raw = _new_session_metadata_builder("abc123") |
| 24 | + raw.update(overrides) |
| 25 | + return dict(_finalize_session_metadata(raw)) |
| 26 | + |
| 27 | + |
18 | 28 | def _valid_payload(**overrides: Any) -> dict[str, Any]: |
19 | 29 | base: dict[str, Any] = { |
20 | 30 | "session_id": "abc123", |
21 | 31 | "title": "Test Session", |
22 | 32 | "messages": [{"role": "user", "text": "hello"}], |
23 | | - "metadata": {"session_id": "abc123"}, |
| 33 | + "metadata": _full_metadata(), |
24 | 34 | } |
25 | 35 | base.update(overrides) |
26 | 36 | return base |
@@ -60,6 +70,40 @@ def test_metadata_not_dict(self): |
60 | 70 | validate_session_dict(_valid_payload(metadata="not-a-dict")) |
61 | 71 | assert exc_info.value.path == "metadata" |
62 | 72 |
|
| 73 | + def test_metadata_missing_session_id(self): |
| 74 | + metadata = _full_metadata() |
| 75 | + del metadata["session_id"] |
| 76 | + with pytest.raises(SessionValidationError) as exc_info: |
| 77 | + validate_session_dict(_valid_payload(metadata=metadata)) |
| 78 | + assert exc_info.value.path == "metadata.session_id" |
| 79 | + |
| 80 | + def test_metadata_missing_models_used(self): |
| 81 | + metadata = _full_metadata() |
| 82 | + del metadata["models_used"] |
| 83 | + with pytest.raises(SessionValidationError) as exc_info: |
| 84 | + validate_session_dict(_valid_payload(metadata=metadata)) |
| 85 | + assert exc_info.value.path == "metadata.models_used" |
| 86 | + |
| 87 | + def test_metadata_missing_first_timestamp(self): |
| 88 | + metadata = _full_metadata() |
| 89 | + del metadata["first_timestamp"] |
| 90 | + with pytest.raises(SessionValidationError) as exc_info: |
| 91 | + validate_session_dict(_valid_payload(metadata=metadata)) |
| 92 | + assert exc_info.value.path == "metadata.first_timestamp" |
| 93 | + |
| 94 | + def test_metadata_first_timestamp_null_allowed(self): |
| 95 | + result = validate_session_dict( |
| 96 | + _valid_payload(metadata=_full_metadata(first_timestamp=None)) |
| 97 | + ) |
| 98 | + assert result["metadata"]["first_timestamp"] is None |
| 99 | + |
| 100 | + def test_metadata_models_used_requires_string_elements(self): |
| 101 | + metadata = _full_metadata() |
| 102 | + metadata["models_used"] = ["claude-sonnet", 42] |
| 103 | + with pytest.raises(SessionValidationError) as exc_info: |
| 104 | + validate_session_dict(_valid_payload(metadata=metadata)) |
| 105 | + assert exc_info.value.path == "metadata.models_used[1]" |
| 106 | + |
63 | 107 | def test_message_not_dict(self): |
64 | 108 | with pytest.raises(SessionValidationError) as exc_info: |
65 | 109 | validate_session_dict(_valid_payload(messages=["not-a-dict"])) |
|
0 commit comments