4
from googleapiclient.errors import HttpError
6
from autogpt.agents.agent import Agent
7
from autogpt.agents.utils.exceptions import ConfigurationError
8
from autogpt.commands.web_search import google, safe_google_results, web_search
11
@pytest.mark.parametrize(
12
"query, expected_output",
13
[("test", "test"), (["test1", "test2"], '["test1", "test2"]')],
15
def test_safe_google_results(query, expected_output):
16
result = safe_google_results(query)
17
assert isinstance(result, str)
18
assert result == expected_output
21
def test_safe_google_results_invalid_input():
22
with pytest.raises(AttributeError):
23
safe_google_results(123)
26
@pytest.mark.parametrize(
27
"query, num_results, expected_output_parts, return_value",
32
("Result 1", "https://example.com/result1"),
33
[{"title": "Result 1", "href": "https://example.com/result1"}],
36
("no results", 1, (), []),
39
def test_google_search(
40
query, num_results, expected_output_parts, return_value, mocker, agent: Agent
42
mock_ddg = mocker.Mock()
43
mock_ddg.return_value = return_value
45
mocker.patch("autogpt.commands.web_search.DDGS.text", mock_ddg)
46
actual_output = web_search(query, agent=agent, num_results=num_results)
47
for o in expected_output_parts:
48
assert o in actual_output
52
def mock_googleapiclient(mocker):
53
mock_build = mocker.patch("googleapiclient.discovery.build")
54
mock_service = mocker.Mock()
55
mock_build.return_value = mock_service
56
return mock_service.cse().list().execute().get
59
@pytest.mark.parametrize(
60
"query, num_results, search_results, expected_output",
66
{"link": "http://example.com/result1"},
67
{"link": "http://example.com/result2"},
68
{"link": "http://example.com/result3"},
71
"http://example.com/result1",
72
"http://example.com/result2",
73
"http://example.com/result3",
79
def test_google_official_search(
87
mock_googleapiclient.return_value = search_results
88
actual_output = google(query, agent=agent, num_results=num_results)
89
assert actual_output == safe_google_results(expected_output)
92
@pytest.mark.parametrize(
93
"query, num_results, expected_error_type, http_code, error_msg",
111
def test_google_official_search_errors(
115
mock_googleapiclient,
121
def __init__(self, _status, _reason):
122
self.status = _status
123
self.reason = _reason
126
"error": {"code": http_code, "message": error_msg, "reason": "backendError"}
129
resp=resp(http_code, error_msg),
130
content=str.encode(json.dumps(response_content)),
131
uri="https://www.googleapis.com/customsearch/v1?q=invalid+query&cx",
134
mock_googleapiclient.side_effect = error
135
with pytest.raises(expected_error_type):
136
google(query, agent=agent, num_results=num_results)