diff options
Diffstat (limited to 'autogpts/autogpt/tests/unit/test_url_validation.py')
-rw-r--r-- | autogpts/autogpt/tests/unit/test_url_validation.py | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/autogpts/autogpt/tests/unit/test_url_validation.py b/autogpts/autogpt/tests/unit/test_url_validation.py new file mode 100644 index 000000000..cfecc48dd --- /dev/null +++ b/autogpts/autogpt/tests/unit/test_url_validation.py @@ -0,0 +1,157 @@ +import pytest +from pytest import raises + +from autogpt.url_utils.validators import validate_url + + +@validate_url +def dummy_method(url): + return url + + +successful_test_data = ( + ("https://google.com/search?query=abc"), + ("https://google.com/search?query=abc&p=123"), + ("http://google.com/"), + ("http://a.lot.of.domain.net/param1/param2"), +) + + +@pytest.mark.parametrize("url", successful_test_data) +def test_url_validation_succeeds(url): + assert dummy_method(url) == url + + +@pytest.mark.parametrize( + "url,expected_error", + [ + ("htt://example.com", "Invalid URL format"), + ("httppp://example.com", "Invalid URL format"), + (" https://example.com", "Invalid URL format"), + ("http://?query=q", "Missing Scheme or Network location"), + ], +) +def test_url_validation_fails_invalid_url(url, expected_error): + with raises(ValueError, match=expected_error): + dummy_method(url) + + +local_file = ( + ("file://localhost"), + ("file://localhost/home/reinier/secrets.txt"), + ("file:///home/reinier/secrets.txt"), + ("file:///C:/Users/Reinier/secrets.txt"), +) + + +@pytest.mark.parametrize("url", local_file) +def test_url_validation_fails_local_path(url): + with raises(ValueError): + dummy_method(url) + + +def test_happy_path_valid_url(): + """ + Test that the function successfully validates a valid URL with `http://` or + `https://` prefix. + """ + + @validate_url + def test_func(url): + return url + + assert test_func("https://www.google.com") == "https://www.google.com" + assert test_func("http://www.google.com") == "http://www.google.com" + + +def test_general_behavior_additional_path_parameters_query_string(): + """ + Test that the function successfully validates a valid URL with additional path, + parameters, and query string. + """ + + @validate_url + def test_func(url): + return url + + assert ( + test_func("https://www.google.com/search?q=python") + == "https://www.google.com/search?q=python" + ) + + +def test_edge_case_missing_scheme_or_network_location(): + """ + Test that the function raises a ValueError if the URL is missing scheme or + network location. + """ + + @validate_url + def test_func(url): + return url + + with pytest.raises(ValueError): + test_func("www.google.com") + + +def test_edge_case_local_file_access(): + """Test that the function raises a ValueError if the URL has local file access""" + + @validate_url + def test_func(url): + return url + + with pytest.raises(ValueError): + test_func("file:///etc/passwd") + + +def test_general_behavior_sanitizes_url(): + """Test that the function sanitizes the URL by removing unnecessary components""" + + @validate_url + def test_func(url): + return url + + assert ( + test_func("https://www.google.com/search?q=python#top") + == "https://www.google.com/search?q=python" + ) + + +def test_general_behavior_invalid_url_format(): + """ + Test that the function raises a ValueError if the URL has an invalid format + (e.g. missing slashes) + """ + + @validate_url + def test_func(url): + return url + + with pytest.raises(ValueError): + test_func("https:www.google.com") + + +def test_url_with_special_chars(): + """ + Tests that the function can handle URLs that contain unusual but valid characters. + """ + url = "https://example.com/path%20with%20spaces" + assert dummy_method(url) == url + + +def test_extremely_long_url(): + """ + Tests that the function raises a ValueError if the URL is over 2000 characters. + """ + url = "http://example.com/" + "a" * 2000 + with raises(ValueError, match="URL is too long"): + dummy_method(url) + + +def test_internationalized_url(): + """ + Tests that the function can handle internationalized URLs with non-ASCII characters. + """ + url = "http://例子.测试" + assert dummy_method(url) == url |