mirror of
https://github.com/hanzoai/python-sdk.git
synced 2026-10-23 20:23:00 +00:00
220 lines
6.4 KiB
Python
220 lines
6.4 KiB
Python
"""Tests for basic file editor operations."""
|
|
|
|
import json
|
|
import re
|
|
|
|
from dev_aci.editor import file_editor
|
|
|
|
from .conftest import parse_result
|
|
|
|
|
|
def test_file_editor_happy_path(temp_file):
|
|
command = "str_replace"
|
|
old_str = "test file"
|
|
new_str = "sample file"
|
|
|
|
# Create test file
|
|
with open(temp_file, "w") as f:
|
|
f.write("This is a test file.\nThis file is for testing purposes.")
|
|
|
|
# Call the `file_editor` function
|
|
result = file_editor(
|
|
command=command,
|
|
path=temp_file,
|
|
old_str=old_str,
|
|
new_str=new_str,
|
|
enable_linting=False,
|
|
)
|
|
|
|
# Extract the JSON content using a regular expression
|
|
match = re.search(
|
|
r"<oh_aci_output_[0-9a-f]{32}>(.*?)</oh_aci_output_[0-9a-f]{32}>",
|
|
result,
|
|
re.DOTALL,
|
|
)
|
|
assert match, (
|
|
"Output does not contain the expected <oh_aci_output_> tags in the correct format."
|
|
)
|
|
result_dict = json.loads(match.group(1))
|
|
|
|
# Validate the formatted output in the result dictionary
|
|
formatted_output = result_dict["formatted_output_and_error"]
|
|
assert (
|
|
formatted_output
|
|
== f"""The file {temp_file} has been edited. Here's the result of running `cat -n` on a snippet of {temp_file}:
|
|
1\tThis is a sample file.
|
|
2\tThis file is for testing purposes.
|
|
Review the changes and make sure they are as expected. Edit the file again if necessary."""
|
|
)
|
|
assert result_dict["path"] == str(temp_file)
|
|
assert result_dict["prev_exist"] is True
|
|
assert (
|
|
result_dict["old_content"]
|
|
== "This is a test file.\nThis file is for testing purposes."
|
|
)
|
|
assert (
|
|
result_dict["new_content"]
|
|
== "This is a sample file.\nThis file is for testing purposes."
|
|
)
|
|
|
|
# Ensure the file content was updated
|
|
with open(temp_file, "r") as f:
|
|
content = f.read()
|
|
assert "This is a sample file." in content
|
|
|
|
|
|
def test_file_editor_with_xml_tag_parsing(temp_file):
|
|
# Create content that includes the XML tag pattern
|
|
xml_content = """This is a file with XML tags parsing logic...
|
|
match = re.search(
|
|
r'<oh_aci_output_[0-9a-f]{32}>(.*?)</oh_aci_output_[0-9a-f]{32}>',
|
|
result,
|
|
re.DOTALL,
|
|
)
|
|
...More text here.
|
|
"""
|
|
|
|
with open(temp_file, "w") as f:
|
|
f.write(xml_content)
|
|
|
|
result = file_editor(
|
|
command="view",
|
|
path=temp_file,
|
|
)
|
|
|
|
# Ensure the content is extracted correctly
|
|
match = re.search(
|
|
r"<oh_aci_output_[0-9a-f]{32}>(.*?)</oh_aci_output_[0-9a-f]{32}>",
|
|
result,
|
|
re.DOTALL,
|
|
)
|
|
|
|
assert match, (
|
|
"Output does not contain the expected <oh_aci_output_> tags in the correct format."
|
|
)
|
|
result_dict = json.loads(match.group(1))
|
|
|
|
# Validate the formatted output in the result dictionary
|
|
formatted_output = result_dict["formatted_output_and_error"]
|
|
assert (
|
|
formatted_output
|
|
== f"""Here's the result of running `cat -n` on {temp_file}:
|
|
1\tThis is a file with XML tags parsing logic...
|
|
2\tmatch = re.search(
|
|
3\t r'<oh_aci_output_[0-9a-f]{{32}}>(.*?)</oh_aci_output_[0-9a-f]{{32}}>',
|
|
4\t result,
|
|
5\t re.DOTALL,
|
|
6\t)
|
|
7\t...More text here.
|
|
8\t
|
|
"""
|
|
)
|
|
|
|
|
|
def test_successful_operations(temp_file):
|
|
"""Test successful file operations and their output formatting."""
|
|
# Create a test file
|
|
content = "line 1\nline 2\nline 3\n"
|
|
with open(temp_file, "w") as f:
|
|
f.write(content)
|
|
|
|
# Test view
|
|
result = file_editor(
|
|
command="view",
|
|
path=temp_file,
|
|
enable_linting=False,
|
|
)
|
|
result_json = parse_result(result)
|
|
assert (
|
|
"Here's the result of running `cat -n`"
|
|
in result_json["formatted_output_and_error"]
|
|
)
|
|
assert "line 1" in result_json["formatted_output_and_error"]
|
|
|
|
# Test str_replace
|
|
result = file_editor(
|
|
command="str_replace",
|
|
path=temp_file,
|
|
old_str="line 2",
|
|
new_str="replaced line",
|
|
enable_linting=False,
|
|
)
|
|
result_json = parse_result(result)
|
|
assert "has been edited" in result_json["formatted_output_and_error"]
|
|
assert "replaced line" in result_json["formatted_output_and_error"]
|
|
|
|
# Test insert
|
|
result = file_editor(
|
|
command="insert",
|
|
path=temp_file,
|
|
insert_line=1,
|
|
new_str="inserted line",
|
|
enable_linting=False,
|
|
)
|
|
result_json = parse_result(result)
|
|
assert "has been edited" in result_json["formatted_output_and_error"]
|
|
assert "inserted line" in result_json["formatted_output_and_error"]
|
|
|
|
# Test undo
|
|
result = file_editor(
|
|
command="undo_edit",
|
|
path=temp_file,
|
|
enable_linting=False,
|
|
)
|
|
result_json = parse_result(result)
|
|
assert "undone successfully" in result_json["formatted_output_and_error"]
|
|
|
|
|
|
def test_tab_expansion(temp_file):
|
|
"""Test that tabs are properly expanded in file operations."""
|
|
# Create a file with tabs
|
|
content = "no tabs\n\tindented\nline\twith\ttabs\n"
|
|
with open(temp_file, "w") as f:
|
|
f.write(content)
|
|
|
|
# Test view command
|
|
result = file_editor(
|
|
command="view",
|
|
path=temp_file,
|
|
enable_linting=False,
|
|
)
|
|
result_json = parse_result(result)
|
|
# Tabs should be expanded to spaces in output
|
|
assert " indented" in result_json["formatted_output_and_error"]
|
|
assert "line with tabs" in result_json["formatted_output_and_error"]
|
|
|
|
# Test str_replace with tabs in old_str
|
|
result = file_editor(
|
|
command="str_replace",
|
|
path=temp_file,
|
|
old_str="line\twith\ttabs",
|
|
new_str="replaced line",
|
|
enable_linting=False,
|
|
)
|
|
result_json = parse_result(result)
|
|
assert "replaced line" in result_json["formatted_output_and_error"]
|
|
|
|
# Test str_replace with tabs in new_str
|
|
result = file_editor(
|
|
command="str_replace",
|
|
path=temp_file,
|
|
old_str="replaced line",
|
|
new_str="new\tline\twith\ttabs",
|
|
enable_linting=False,
|
|
)
|
|
result_json = parse_result(result)
|
|
# Tabs should be expanded in the output
|
|
assert "new line with tabs" in result_json["formatted_output_and_error"]
|
|
|
|
# Test insert with tabs
|
|
result = file_editor(
|
|
command="insert",
|
|
path=temp_file,
|
|
insert_line=1,
|
|
new_str="\tindented\tline",
|
|
enable_linting=False,
|
|
)
|
|
result_json = parse_result(result)
|
|
# Tabs should be expanded in the output
|
|
assert " indented line" in result_json["formatted_output_and_error"]
|