File size: 4,186 Bytes
0e806f1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"""Tests for search functionality."""
import pytest
from unittest.mock import AsyncMock, patch, MagicMock
import httpx


def test_simple():
    """Simple test to verify pytest discovers this file."""
    assert True


@pytest.mark.asyncio
async def test_serper_search_success():
    """Test successful Serper search."""
    from app.search.serper import search as serper_search
    
    # Mock response from Serper API
    mock_response = {
        "organic": [
            {
                "title": "Test Title 1",
                "link": "https://example.com/1",
                "snippet": "Test snippet 1"
            },
            {
                "title": "Test Title 2", 
                "link": "https://example.com/2",
                "snippet": "Test snippet 2"
            }
        ]
    }
    
    with patch('httpx.AsyncClient.post') as mock_post, \
         patch('app.search.serper.get_settings') as mock_settings:
        
        # Mock settings
        mock_settings.return_value.serper_api_key = "test-key"
        
        # Mock HTTP response
        mock_response_obj = MagicMock()
        mock_response_obj.json.return_value = mock_response
        mock_response_obj.raise_for_status = MagicMock()
        mock_post.return_value = mock_response_obj
        
        results = await serper_search("test query")
        
        assert len(results) == 2
        assert results[0].title == "Test Title 1"
        assert results[0].url == "https://example.com/1"
        assert results[0].snippet == "Test snippet 1"


@pytest.mark.asyncio
async def test_serper_search_deduplication():
    """Test that duplicate domains are filtered out."""
    from app.search.serper import search as serper_search
    
    mock_response = {
        "organic": [
            {
                "title": "Test Title 1",
                "link": "https://example.com/page1",
                "snippet": "Test snippet 1"
            },
            {
                "title": "Test Title 2",
                "link": "https://example.com/page2", 
                "snippet": "Test snippet 2"
            },
            {
                "title": "Test Title 3",
                "link": "https://different.com/page1",
                "snippet": "Test snippet 3"
            }
        ]
    }
    
    with patch('httpx.AsyncClient.post') as mock_post, \
         patch('app.search.serper.get_settings') as mock_settings:
        
        mock_settings.return_value.serper_api_key = "test-key"
        mock_response_obj = MagicMock()
        mock_response_obj.json.return_value = mock_response
        mock_response_obj.raise_for_status = MagicMock()
        mock_post.return_value = mock_response_obj
        
        results = await serper_search("test query")
        
        # Should only get 2 results due to deduplication
        assert len(results) == 2
        domains = {result.url for result in results}
        assert "https://example.com/page1" in domains
        assert "https://different.com/page1" in domains


@pytest.mark.asyncio
async def test_serper_search_no_results():
    """Test handling of empty search results."""
    from app.search.serper import search as serper_search
    
    mock_response = {"organic": []}
    
    with patch('httpx.AsyncClient.post') as mock_post, \
         patch('app.search.serper.get_settings') as mock_settings:
        
        mock_settings.return_value.serper_api_key = "test-key"
        mock_response_obj = MagicMock()
        mock_response_obj.json.return_value = mock_response
        mock_response_obj.raise_for_status = MagicMock()
        mock_post.return_value = mock_response_obj
        
        results = await serper_search("test query")
        
        assert len(results) == 0


@pytest.mark.asyncio
async def test_serper_search_missing_api_key():
    """Test error handling for missing API key."""
    from app.search.serper import search as serper_search
    
    with patch('app.search.serper.get_settings') as mock_settings:
        mock_settings.return_value.serper_api_key = ""
        
        with pytest.raises(RuntimeError, match="SERPER_API_KEY is not set"):
            await serper_search("test query")