mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-22 21:34:59 +00:00

# Aider chat conversation: USER: write a test for `cmd_git`. use `GitTemporaryDirectory` to make a temp git repo. add a file. then run `/git commit -a -m msg` and confirm that the file is in the repo ASSISTANT: To write a test for `cmd_git`, we need to modify the `tests/test_commands.py` file. Here are the steps we need to follow: 1. Import `GitTemporaryDirectory` from `tests.utils`. 2. Create a new test method `test_cmd_git`. 3. Inside this method, create a temporary git repository using `GitTemporaryDirectory`. 4. Add a file to the repository. 5. Run the `cmd_git` method with the arguments `"commit -a -m msg"`. 6. Check if the file has been committed to the repository. Here is the *edit block* for these changes: <source>python tests/test_commands.py <<<<<<< ORIGINAL from unittest import TestCase from aider import models from aider.coders import Coder from aider.commands import Commands from aider.dump import dump # noqa: F401 from aider.io import InputOutput ======= from unittest import TestCase from tests.utils import GitTemporaryDirectory from aider import models from aider.coders import Coder from aider.commands import Commands from aider.dump import dump # noqa: F401 from aider.io import InputOutput >>>>>>> UPDATED </source> <source>python tests/test_commands.py <<<<<<< ORIGINAL def test_cmd_tokens(self): # Initialize the Commands and InputOutput objects io = InputOutput(pretty=False, yes=True) coder = Coder.create(models.GPT35, None, io) commands = Commands(io, coder) commands.cmd_add("foo.txt bar.txt") # Redirect the standard output to an instance of io.StringIO stdout = StringIO() sys.stdout = stdout commands.cmd_tokens("") # Reset the standard output sys.stdout = sys.__stdout__ # Get the console output console_output = stdout.getvalue() self.assertIn("foo.txt", console_output) self.assertIn("bar.txt", console_output) ======= def test_cmd_git(self): # Initialize the Commands and InputOutput objects io = InputOutput(pretty=False, yes=True) with GitTemporaryDirectory() as tempdir: # Create a file in the temporary directory with open(f"{tempdir}/test.txt", "w") as f: f.write("test") coder = Coder.create(models.GPT35, None, io) commands = Commands(io, coder) # Run the cmd_git method with the arguments "commit -a -m msg" commands.cmd_git("commit -a -m msg") # Check if the file has been committed to the repository repo = git.Repo(tempdir) files_in_repo = [item.a_path for item in repo.index.diff(None)] self.assertIn("test.txt", files_in_repo) >>>>>>> UPDATED </source>
177 lines
6.3 KiB
Python
177 lines
6.3 KiB
Python
import codecs
|
|
import os
|
|
import shutil
|
|
import sys
|
|
import tempfile
|
|
from io import StringIO
|
|
from pathlib import Path
|
|
from unittest import TestCase
|
|
from tests.utils import GitTemporaryDirectory
|
|
|
|
from aider import models
|
|
from aider.coders import Coder
|
|
from aider.commands import Commands
|
|
from aider.dump import dump # noqa: F401
|
|
from aider.io import InputOutput
|
|
|
|
|
|
class TestCommands(TestCase):
|
|
def setUp(self):
|
|
self.original_cwd = os.getcwd()
|
|
self.tempdir = tempfile.mkdtemp()
|
|
os.chdir(self.tempdir)
|
|
|
|
def tearDown(self):
|
|
os.chdir(self.original_cwd)
|
|
shutil.rmtree(self.tempdir)
|
|
|
|
def test_cmd_add(self):
|
|
# Initialize the Commands and InputOutput objects
|
|
io = InputOutput(pretty=False, yes=True)
|
|
from aider.coders import Coder
|
|
|
|
coder = Coder.create(models.GPT35, None, io)
|
|
commands = Commands(io, coder)
|
|
|
|
# Call the cmd_add method with 'foo.txt' and 'bar.txt' as a single string
|
|
commands.cmd_add("foo.txt bar.txt")
|
|
|
|
# Check if both files have been created in the temporary directory
|
|
self.assertTrue(os.path.exists("foo.txt"))
|
|
self.assertTrue(os.path.exists("bar.txt"))
|
|
|
|
def test_cmd_add_with_glob_patterns(self):
|
|
# Initialize the Commands and InputOutput objects
|
|
io = InputOutput(pretty=False, yes=True)
|
|
from aider.coders import Coder
|
|
|
|
coder = Coder.create(models.GPT35, None, io)
|
|
commands = Commands(io, coder)
|
|
|
|
# Create some test files
|
|
with open("test1.py", "w") as f:
|
|
f.write("print('test1')")
|
|
with open("test2.py", "w") as f:
|
|
f.write("print('test2')")
|
|
with open("test.txt", "w") as f:
|
|
f.write("test")
|
|
|
|
# Call the cmd_add method with a glob pattern
|
|
commands.cmd_add("*.py")
|
|
|
|
# Check if the Python files have been added to the chat session
|
|
self.assertIn(str(Path("test1.py").resolve()), coder.abs_fnames)
|
|
self.assertIn(str(Path("test2.py").resolve()), coder.abs_fnames)
|
|
|
|
# Check if the text file has not been added to the chat session
|
|
self.assertNotIn(str(Path("test.txt").resolve()), coder.abs_fnames)
|
|
|
|
def test_cmd_add_no_match(self):
|
|
# Initialize the Commands and InputOutput objects
|
|
io = InputOutput(pretty=False, yes=True)
|
|
from aider.coders import Coder
|
|
|
|
coder = Coder.create(models.GPT35, None, io)
|
|
commands = Commands(io, coder)
|
|
|
|
# Call the cmd_add method with a non-existent file pattern
|
|
commands.cmd_add("*.nonexistent")
|
|
|
|
# Check if no files have been added to the chat session
|
|
self.assertEqual(len(coder.abs_fnames), 0)
|
|
|
|
def test_cmd_add_drop_directory(self):
|
|
# Initialize the Commands and InputOutput objects
|
|
io = InputOutput(pretty=False, yes=True)
|
|
from aider.coders import Coder
|
|
|
|
coder = Coder.create(models.GPT35, None, io)
|
|
commands = Commands(io, coder)
|
|
|
|
# Create a directory and add files to it
|
|
os.mkdir("test_dir")
|
|
os.mkdir("test_dir/another_dir")
|
|
with open("test_dir/test_file1.txt", "w") as f:
|
|
f.write("Test file 1")
|
|
with open("test_dir/test_file2.txt", "w") as f:
|
|
f.write("Test file 2")
|
|
with open("test_dir/another_dir/test_file.txt", "w") as f:
|
|
f.write("Test file 3")
|
|
|
|
# Call the cmd_add method with a directory
|
|
commands.cmd_add("test_dir test_dir/test_file2.txt")
|
|
|
|
# Check if the files have been added to the chat session
|
|
self.assertIn(str(Path("test_dir/test_file1.txt").resolve()), coder.abs_fnames)
|
|
self.assertIn(str(Path("test_dir/test_file2.txt").resolve()), coder.abs_fnames)
|
|
self.assertIn(str(Path("test_dir/another_dir/test_file.txt").resolve()), coder.abs_fnames)
|
|
|
|
commands.cmd_drop("test_dir/another_dir")
|
|
self.assertIn(str(Path("test_dir/test_file1.txt").resolve()), coder.abs_fnames)
|
|
self.assertIn(str(Path("test_dir/test_file2.txt").resolve()), coder.abs_fnames)
|
|
self.assertNotIn(
|
|
str(Path("test_dir/another_dir/test_file.txt").resolve()), coder.abs_fnames
|
|
)
|
|
|
|
def test_cmd_drop_with_glob_patterns(self):
|
|
# Initialize the Commands and InputOutput objects
|
|
io = InputOutput(pretty=False, yes=True)
|
|
from aider.coders import Coder
|
|
|
|
coder = Coder.create(models.GPT35, None, io)
|
|
commands = Commands(io, coder)
|
|
|
|
subdir = Path("subdir")
|
|
subdir.mkdir()
|
|
(subdir / "subtest1.py").touch()
|
|
(subdir / "subtest2.py").touch()
|
|
|
|
Path("test1.py").touch()
|
|
Path("test2.py").touch()
|
|
|
|
# Add some files to the chat session
|
|
commands.cmd_add("*.py")
|
|
|
|
self.assertEqual(len(coder.abs_fnames), 2)
|
|
|
|
# Call the cmd_drop method with a glob pattern
|
|
commands.cmd_drop("*2.py")
|
|
|
|
self.assertIn(str(Path("test1.py").resolve()), coder.abs_fnames)
|
|
self.assertNotIn(str(Path("test2.py").resolve()), coder.abs_fnames)
|
|
|
|
def test_cmd_add_bad_encoding(self):
|
|
# Initialize the Commands and InputOutput objects
|
|
io = InputOutput(pretty=False, yes=True)
|
|
from aider.coders import Coder
|
|
|
|
coder = Coder.create(models.GPT35, None, io)
|
|
commands = Commands(io, coder)
|
|
|
|
# Create a new file foo.bad which will fail to decode as utf-8
|
|
with codecs.open("foo.bad", "w", encoding="iso-8859-15") as f:
|
|
f.write("ÆØÅ") # Characters not present in utf-8
|
|
|
|
commands.cmd_add("foo.bad")
|
|
|
|
self.assertEqual(coder.abs_fnames, set())
|
|
|
|
def test_cmd_git(self):
|
|
# Initialize the Commands and InputOutput objects
|
|
io = InputOutput(pretty=False, yes=True)
|
|
|
|
with GitTemporaryDirectory() as tempdir:
|
|
# Create a file in the temporary directory
|
|
with open(f"{tempdir}/test.txt", "w") as f:
|
|
f.write("test")
|
|
|
|
coder = Coder.create(models.GPT35, None, io)
|
|
commands = Commands(io, coder)
|
|
|
|
# Run the cmd_git method with the arguments "commit -a -m msg"
|
|
commands.cmd_git("commit -a -m msg")
|
|
|
|
# Check if the file has been committed to the repository
|
|
repo = git.Repo(tempdir)
|
|
files_in_repo = [item.a_path for item in repo.index.diff(None)]
|
|
self.assertIn("test.txt", files_in_repo)
|