aboutsummaryrefslogtreecommitdiff
path: root/autogpts/autogpt/tests/unit/test_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'autogpts/autogpt/tests/unit/test_utils.py')
-rw-r--r--autogpts/autogpt/tests/unit/test_utils.py223
1 files changed, 223 insertions, 0 deletions
diff --git a/autogpts/autogpt/tests/unit/test_utils.py b/autogpts/autogpt/tests/unit/test_utils.py
new file mode 100644
index 000000000..afe2497dc
--- /dev/null
+++ b/autogpts/autogpt/tests/unit/test_utils.py
@@ -0,0 +1,223 @@
+import os
+from unittest.mock import patch
+
+import pytest
+import requests
+from git import InvalidGitRepositoryError
+
+from autogpt.app.utils import (
+ get_bulletin_from_web,
+ get_current_git_branch,
+ get_latest_bulletin,
+)
+from autogpt.json_utils.utilities import extract_dict_from_response
+from autogpt.utils import validate_yaml_file
+from tests.utils import skip_in_ci
+
+
+@pytest.fixture
+def valid_json_response() -> dict:
+ return {
+ "thoughts": {
+ "text": "My task is complete. I will use the 'task_complete' command "
+ "to shut down.",
+ "reasoning": "I will use the 'task_complete' command because it allows me "
+ "to shut down and signal that my task is complete.",
+ "plan": "I will use the 'task_complete' command with the reason "
+ "'Task complete: retrieved Tesla's revenue in 2022.' to shut down.",
+ "criticism": "I need to ensure that I have completed all necessary tasks "
+ "before shutting down.",
+ "speak": "All done!",
+ },
+ "command": {
+ "name": "task_complete",
+ "args": {"reason": "Task complete: retrieved Tesla's revenue in 2022."},
+ },
+ }
+
+
+@pytest.fixture
+def invalid_json_response() -> dict:
+ return {
+ "thoughts": {
+ "text": "My task is complete. I will use the 'task_complete' command "
+ "to shut down.",
+ "reasoning": "I will use the 'task_complete' command because it allows me "
+ "to shut down and signal that my task is complete.",
+ "plan": "I will use the 'task_complete' command with the reason "
+ "'Task complete: retrieved Tesla's revenue in 2022.' to shut down.",
+ "criticism": "I need to ensure that I have completed all necessary tasks "
+ "before shutting down.",
+ "speak": "",
+ },
+ "command": {"name": "", "args": {}},
+ }
+
+
+def test_validate_yaml_file_valid():
+ with open("valid_test_file.yaml", "w") as f:
+ f.write("setting: value")
+ result, message = validate_yaml_file("valid_test_file.yaml")
+ os.remove("valid_test_file.yaml")
+
+ assert result is True
+ assert "Successfully validated" in message
+
+
+def test_validate_yaml_file_not_found():
+ result, message = validate_yaml_file("non_existent_file.yaml")
+
+ assert result is False
+ assert "wasn't found" in message
+
+
+def test_validate_yaml_file_invalid():
+ with open("invalid_test_file.yaml", "w") as f:
+ f.write(
+ "settings:\n"
+ " first_setting: value\n"
+ " second_setting: value\n"
+ " nested_setting: value\n"
+ " third_setting: value\n"
+ "unindented_setting: value"
+ )
+ result, message = validate_yaml_file("invalid_test_file.yaml")
+ os.remove("invalid_test_file.yaml")
+ print(result)
+ print(message)
+ assert result is False
+ assert "There was an issue while trying to read" in message
+
+
+@patch("requests.get")
+def test_get_bulletin_from_web_success(mock_get):
+ expected_content = "Test bulletin from web"
+
+ mock_get.return_value.status_code = 200
+ mock_get.return_value.text = expected_content
+ bulletin = get_bulletin_from_web()
+
+ assert expected_content in bulletin
+ mock_get.assert_called_with(
+ "https://raw.githubusercontent.com/Significant-Gravitas/AutoGPT/master/autogpts/autogpt/BULLETIN.md" # noqa: E501
+ )
+
+
+@patch("requests.get")
+def test_get_bulletin_from_web_failure(mock_get):
+ mock_get.return_value.status_code = 404
+ bulletin = get_bulletin_from_web()
+
+ assert bulletin == ""
+
+
+@patch("requests.get")
+def test_get_bulletin_from_web_exception(mock_get):
+ mock_get.side_effect = requests.exceptions.RequestException()
+ bulletin = get_bulletin_from_web()
+
+ assert bulletin == ""
+
+
+def test_get_latest_bulletin_no_file():
+ if os.path.exists("data/CURRENT_BULLETIN.md"):
+ os.remove("data/CURRENT_BULLETIN.md")
+
+ bulletin, is_new = get_latest_bulletin()
+ assert is_new
+
+
+def test_get_latest_bulletin_with_file():
+ expected_content = "Test bulletin"
+ with open("data/CURRENT_BULLETIN.md", "w", encoding="utf-8") as f:
+ f.write(expected_content)
+
+ with patch("autogpt.app.utils.get_bulletin_from_web", return_value=""):
+ bulletin, is_new = get_latest_bulletin()
+ assert expected_content in bulletin
+ assert is_new is False
+
+ os.remove("data/CURRENT_BULLETIN.md")
+
+
+def test_get_latest_bulletin_with_new_bulletin():
+ with open("data/CURRENT_BULLETIN.md", "w", encoding="utf-8") as f:
+ f.write("Old bulletin")
+
+ expected_content = "New bulletin from web"
+ with patch(
+ "autogpt.app.utils.get_bulletin_from_web", return_value=expected_content
+ ):
+ bulletin, is_new = get_latest_bulletin()
+ assert "::NEW BULLETIN::" in bulletin
+ assert expected_content in bulletin
+ assert is_new
+
+ os.remove("data/CURRENT_BULLETIN.md")
+
+
+def test_get_latest_bulletin_new_bulletin_same_as_old_bulletin():
+ expected_content = "Current bulletin"
+ with open("data/CURRENT_BULLETIN.md", "w", encoding="utf-8") as f:
+ f.write(expected_content)
+
+ with patch(
+ "autogpt.app.utils.get_bulletin_from_web", return_value=expected_content
+ ):
+ bulletin, is_new = get_latest_bulletin()
+ assert expected_content in bulletin
+ assert is_new is False
+
+ os.remove("data/CURRENT_BULLETIN.md")
+
+
+@skip_in_ci
+def test_get_current_git_branch():
+ branch_name = get_current_git_branch()
+ assert branch_name != ""
+
+
+@patch("autogpt.app.utils.Repo")
+def test_get_current_git_branch_success(mock_repo):
+ mock_repo.return_value.active_branch.name = "test-branch"
+ branch_name = get_current_git_branch()
+
+ assert branch_name == "test-branch"
+
+
+@patch("autogpt.app.utils.Repo")
+def test_get_current_git_branch_failure(mock_repo):
+ mock_repo.side_effect = InvalidGitRepositoryError()
+ branch_name = get_current_git_branch()
+
+ assert branch_name == ""
+
+
+def test_extract_json_from_response(valid_json_response: dict):
+ emulated_response_from_openai = str(valid_json_response)
+ assert (
+ extract_dict_from_response(emulated_response_from_openai) == valid_json_response
+ )
+
+
+def test_extract_json_from_response_wrapped_in_code_block(valid_json_response: dict):
+ emulated_response_from_openai = "```" + str(valid_json_response) + "```"
+ assert (
+ extract_dict_from_response(emulated_response_from_openai) == valid_json_response
+ )
+
+
+def test_extract_json_from_response_wrapped_in_code_block_with_language(
+ valid_json_response: dict,
+):
+ emulated_response_from_openai = "```json" + str(valid_json_response) + "```"
+ assert (
+ extract_dict_from_response(emulated_response_from_openai) == valid_json_response
+ )
+
+
+def test_extract_json_from_response_json_contained_in_string(valid_json_response: dict):
+ emulated_response_from_openai = "sentence1" + str(valid_json_response) + "sentence2"
+ assert (
+ extract_dict_from_response(emulated_response_from_openai) == valid_json_response
+ )