Spaces:
Build error
Build error
| # Generated by CodiumAI | |
| import pytest | |
| from loguru import logger | |
| from autogpt.json_utils.json_fix_llm import ( | |
| fix_and_parse_json, | |
| fix_json_using_multiple_techniques, | |
| ) | |
| from tests.utils import requires_api_key | |
| """ | |
| Code Analysis | |
| Objective: | |
| - The objective of the function is to fix a given JSON string to make it parseable and fully compliant with two techniques. | |
| Inputs: | |
| - The function takes in a string called 'assistant_reply', which is the JSON string to be fixed. | |
| Flow: | |
| - The function first calls the 'fix_and_parse_json' function to parse and print the Assistant response. | |
| - If the parsed JSON is an empty dictionary, the function calls the 'attempt_to_fix_json_by_finding_outermost_brackets' function to fix the JSON string. | |
| - If the parsed JSON is not an empty dictionary, the function returns the parsed JSON. | |
| - If the parsed JSON is an empty dictionary and cannot be fixed, the function logs an error and returns an empty dictionary. | |
| Outputs: | |
| - The main output of the function is a dictionary containing the fixed JSON string. | |
| Additional aspects: | |
| - The function uses two techniques to fix the JSON string: parsing and finding outermost brackets. | |
| - The function logs an error if the JSON string cannot be fixed and returns an empty dictionary. | |
| - The function uses the 'CFG' object to determine whether to speak the error message or not. | |
| """ | |
| class TestFixJsonUsingMultipleTechniques: | |
| # Tests that the function successfully fixes and parses a JSON string that is already compliant with both techniques. | |
| def test_fix_and_parse_json_happy_path(self): | |
| # Happy path test case where the JSON string is already compliant with both techniques | |
| json_string = '{"text": "Hello world", "confidence": 0.9}' | |
| expected_output = {"text": "Hello world", "confidence": 0.9} | |
| assert fix_json_using_multiple_techniques(json_string) == expected_output | |
| # Tests that the function successfully fixes and parses a JSON string that contains only whitespace characters. | |
| # @requires_api_key("OPEN_API_KEY") | |
| def test_fix_and_parse_json_whitespace(self, mocker): | |
| # Happy path test case where the JSON string contains only whitespace characters | |
| json_string = " \n\t " | |
| # mock try_ai_fix to avoid calling the AI model: | |
| mocker.patch("autogpt.json_utils.json_fix_llm.try_ai_fix", return_value={}) | |
| expected_output = {} | |
| assert fix_json_using_multiple_techniques(json_string) == expected_output | |
| # Tests that the function successfully converts a string with arrays to an array | |
| def test_fix_and_parse_json_array(self): | |
| # Happy path test case where the JSON string contains an array of string | |
| json_string = '[ "Add type hints", "Move docstrings", "Consider using" ]' | |
| expected_output = ["Add type hints", "Move docstrings", "Consider using"] | |
| assert fix_json_using_multiple_techniques(json_string) == expected_output | |
| # Tests that the function returns an empty dictionary when the JSON string is not parseable and cannot be fixed using either technique. | |
| # @requires_api_key("OPEN_API_KEY") | |
| def test_fix_and_parse_json_can_not(self, mocker): | |
| # Edge case test case where the JSON string is not parseable and cannot be fixed using either technique | |
| json_string = "This is not a JSON string" | |
| # mock try_ai_fix to avoid calling the AI model: | |
| mocker.patch("autogpt.json_utils.json_fix_llm.try_ai_fix", return_value={}) | |
| expected_output = {} | |
| # Use the actual function name in the test | |
| result = fix_json_using_multiple_techniques(json_string) | |
| assert result == expected_output | |
| # Tests that the function returns an empty dictionary when the JSON string is empty. | |
| # @requires_api_key("OPEN_API_KEY") | |
| def test_fix_and_parse_json_empty_string(self, mocker): | |
| # Arrange | |
| json_string = "" | |
| # Act | |
| # mock try_ai_fix to avoid calling the AI model: | |
| mocker.patch("autogpt.json_utils.json_fix_llm.try_ai_fix", return_value={}) | |
| result = fix_and_parse_json(json_string) | |
| # Assert | |
| assert result == {} | |
| # Tests that the function successfully fixes and parses a JSON string that contains escape characters. | |
| def test_fix_and_parse_json_escape_characters(self): | |
| # Arrange | |
| json_string = '{"text": "This is a \\"test\\" string."}' | |
| # Act | |
| result = fix_json_using_multiple_techniques(json_string) | |
| # Assert | |
| assert result == {"text": 'This is a "test" string.'} | |
| # Tests that the function successfully fixes and parses a JSON string that contains nested objects or arrays. | |
| def test_fix_and_parse_json_nested_objects(self): | |
| # Arrange | |
| json_string = '{"person": {"name": "John", "age": 30}, "hobbies": ["reading", "swimming"]}' | |
| # Act | |
| result = fix_json_using_multiple_techniques(json_string) | |
| # Assert | |
| assert result == { | |
| "person": {"name": "John", "age": 30}, | |
| "hobbies": ["reading", "swimming"], | |
| } | |