"""Tests for diff engine.""" import pytest from datetime import datetime from http_log_explorer.analyzers import DiffEngine from http_log_explorer.models import HTTPEntry, Request, Response def make_entry( method: str = "GET", url: str = "https://api.example.com/test", status: int = 200, req_headers: dict | None = None, resp_headers: dict | None = None, req_body: str | None = None, resp_body: str | None = None, ) -> HTTPEntry: """Create a test HTTPEntry.""" return HTTPEntry( id=f"entry-{method}-{status}", request=Request( method=method, url=url, headers=req_headers or {"Content-Type": "application/json"}, body=req_body, ), response=Response( status=status, status_text="OK", headers=resp_headers or {"Content-Type": "application/json"}, body=resp_body, ), timestamp=datetime.now(), ) class TestDiffEngine: """Tests for DiffEngine.""" def test_diff_same_entries(self): """Test diffing identical entries.""" entry1 = make_entry() entry2 = make_entry() engine = DiffEngine() result = engine.diff(entry1, entry2) assert not engine.has_differences(result) assert result.status1 == result.status2 def test_diff_status_change(self): """Test diffing entries with different status codes.""" entry1 = make_entry(status=200) entry2 = make_entry(status=404) engine = DiffEngine() result = engine.diff(entry1, entry2) assert result.status_changed assert result.status1 == 200 assert result.status2 == 404 def test_diff_url_change(self): """Test diffing entries with different URLs.""" entry1 = make_entry(url="https://api.example.com/users") entry2 = make_entry(url="https://api.example.com/posts") engine = DiffEngine() result = engine.diff(entry1, entry2) assert result.url_changed def test_diff_headers_change(self): """Test diffing entries with different headers.""" entry1 = make_entry( req_headers={"Content-Type": "application/json", "X-Request-ID": "123"} ) entry2 = make_entry( req_headers={"Content-Type": "application/json", "X-Request-ID": "456"} ) engine = DiffEngine() result = engine.diff(entry1, entry2) assert len(result.request_headers_diff) > 0 def test_diff_headers_added_removed(self): """Test detecting added/removed headers.""" entry1 = make_entry(req_headers={"Content-Type": "application/json"}) entry2 = make_entry(req_headers={"Authorization": "Bearer token"}) engine = DiffEngine() result = engine.diff(entry1, entry2) assert any("+ Authorization:" in s for s in result.request_headers_diff) assert any("- Content-Type:" in s for s in result.request_headers_diff) def test_diff_body_change(self): """Test diffing entries with different bodies.""" entry1 = make_entry(resp_body='{"id": 1, "name": "Alice"}') entry2 = make_entry(resp_body='{"id": 1, "name": "Bob"}') engine = DiffEngine() result = engine.diff(entry1, entry2) assert len(result.response_body_diff) > 0 def test_unified_diff_output(self): """Test unified diff output formatting.""" entry1 = make_entry(status=200) entry2 = make_entry(status=404) engine = DiffEngine() result = engine.diff(entry1, entry2) output = engine.unified_diff_output(result) assert "Status: 200 -> 404" in output def test_no_differences(self): """Test output when no differences exist.""" entry1 = make_entry() entry2 = make_entry() engine = DiffEngine() result = engine.diff(entry1, entry2) output = engine.unified_diff_output(result) assert "No differences found" in output