Commit graph

232 commits

Author SHA1 Message Date
Paul Gauthier
0ec5c69fc4 aider: Set OPENAI_API_KEY environment variable to "deadbeef" for all tests.
# Context:
USER: set env OPENAI_API_KEY=deadbeef for all tests
ASSISTANT: To set the environment variable `OPENAI_API_KEY` for all tests, you can modify the `setUp` method in the `TestMain` class in the `tests/test_main.py` file. Here's the change:

```python
tests/test_main.py
<<<<<<< ORIGINAL
class TestMain(TestCase):
    def test_main_with_empty_dir_no_files_on_command(self):
=======
class TestMain(TestCase):
    def setUp(self):
        os.environ["OPENAI_API_KEY"] = "deadbeef"

    def test_main_with_empty_dir_no_files_on_command(self):
>>>>>>> UPDATED
```

This will set the `OPENAI_API_KEY` environment variable to "deadbeef" before running each test.
2023-05-27 13:59:48 -07:00
Paul Gauthier
4fd1bf7f21 Added test_check_for_ambiguous_filename_mentions_of_longer_paths 2023-05-27 08:39:18 -07:00
Paul Gauthier
3732f62a9c Use ./ paths for the test 2023-05-27 08:32:39 -07:00
Paul Gauthier
c8cf78b5cf Added a new test to check for filename mentions of longer paths. 2023-05-27 08:30:17 -07:00
Paul Gauthier
7e75cfb1fa added missing import 2023-05-27 08:29:05 -07:00
Paul Gauthier
bcf258f1c6 aider: Modified test to check if coder.abs_fnames contains both files.
# Context:
USER: don't compare the result string. check that coder.abs_fnames now contains both files
ASSISTANT: To update the test to check if `coder.abs_fnames` contains both files, modify the test as follows:

```python
tests/test_coder.py
<<<<<<< ORIGINAL
        # Check if the result is as expected
        self.assertEqual(result, "Added files: file1.txt, file2.py")
=======
        # Check if coder.abs_fnames contains both files
        expected_files = {os.path.abspath("file1.txt"), os.path.abspath("file2.py")}
        self.assertEqual(coder.abs_fnames, expected_files)
>>>>>>> UPDATED
```

This change will ensure that the test checks if `coder.abs_fnames` contains both files instead of comparing the result string.
2023-05-27 08:28:31 -07:00
Paul Gauthier
4ac2143cc2 Initialized Coder object with mocked IO and mocked repo, and updated coder.repo instead of coder.root. 2023-05-27 08:27:45 -07:00
Paul Gauthier
0fc40df8e6 aider: Replaced manual setting of abs_fnames with a mocked git.Repo object that has its ls_files method return the desired file paths.
# Context:
USER: don't set the files in abs_fnames. patch self.repo.git.ls_files to return them
ASSISTANT: To patch `self.repo.git.ls_files` to return the files in `abs_fnames`, we will modify the `test_check_for_file_mentions` function in the `tests/test_coder.py` file.

```python
tests/test_coder.py
<<<<<<< ORIGINAL
        # Initialize the Coder object with the mocked IO
        coder = Coder(io=mock_io, openai_api_key="fake_key")

        # Add sample files to the Coder object
        coder.abs_fnames = {
            "/path/to/repo/file1.txt",
            "/path/to/repo/file2.py",
        }
        coder.root = "/path/to/repo"
=======
        # Mock the git repo
        mock_repo = MagicMock()
        mock_repo.git.ls_files.return_value = "file1.txt\nfile2.py"

        # Initialize the Coder object with the mocked IO and mocked repo
        coder = Coder(io=mock_io, openai_api_key="fake_key", repo=mock_repo)
        coder.root = "/path/to/repo"
>>>>>>> UPDATED
```

This change replaces the manual setting of `abs_fnames` with a mocked `git.Repo` object that has its `ls_files` method return the desired file paths.
2023-05-27 08:26:16 -07:00
Paul Gauthier
475f85bcc3 aider: Added a test function for the check_for_file_mentions method in tests/test_coder.py.
# Context:
USER: write a test for check_for_file_mentions
ASSISTANT: To write a test for the `check_for_file_mentions` method, we will create a new test function in the `tests/test_coder.py` file. Here's the test function:

```python
tests/test_coder.py
<<<<<<< ORIGINAL
=======
import unittest
from unittest.mock import MagicMock
from aider.coder import Coder

class TestCoder(unittest.TestCase):
    def test_check_for_file_mentions(self):
        # Mock the IO object
        mock_io = MagicMock()
        mock_io.get_input.return_value = "Please check file1.txt and file2.py"
        mock_io.confirm_ask.return_value = True

        # Initialize the Coder object with the mocked IO
        coder = Coder(io=mock_io, openai_api_key="fake_key")

        # Add sample files to the Coder object
        coder.abs_fnames = {
            "/path/to/repo/file1.txt",
            "/path/to/repo/file2.py",
        }
        coder.root = "/path/to/repo"

        # Call the check_for_file_mentions method
        result = coder.check_for_file_mentions("Please check file1.txt and file2.py")

        # Check if the result is as expected
        self.assertEqual(result, "Added files: file1.txt, file2.py")

if __name__ == "__main__":
    unittest.main()
>>>>>>> UPDATED
```

This test function creates a `Coder` object with a mocked IO, adds sample files to the object, and then calls the `check_for_file_mentions` method with a sample input. It checks if the returned result is as expected.
2023-05-27 08:23:51 -07:00
Paul Gauthier
dd3bdfbe15 Added new files to the git repo: tests/test_coder.py 2023-05-27 08:22:37 -07:00
Paul Gauthier
3f5e4130ea fixed test 2023-05-27 06:25:16 -07:00
Paul Gauthier
139a141be9 removed dotenv 2023-05-27 06:13:34 -07:00
Paul Gauthier
3e99b4f45c moved test_main_pretty_from_env to end of file 2023-05-27 05:20:10 -07:00
Paul Gauthier
89c412ccfe aider: Added a new test method test_main_pretty_from_env to check if the pretty option is set to False by creating a temporary directory, writing a .env file with AIDER_PRETTY=false, and then calling main with no arguments.
# Context:
USER: add a test like test_main_args. it should test pretty by making a .env file with AIDER_PRETTY=false and then call main with no args.
ASSISTANT: To add a new test for the `pretty` option, you can create a new test method in the `TestMain` class in the `tests/test_main.py` file. Here's the code for the new test:

```python
tests/test_main.py
<<<<<<< ORIGINAL
    def test_main_args(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)

            with patch("aider.main.Coder") as MockCoder:
                main(["--no-auto-commits"])
                _, kwargs = MockCoder.call_args
                assert kwargs["auto_commits"] is False
=======
    def test_main_args(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)

            with patch("aider.main.Coder") as MockCoder:
                main(["--no-auto-commits"])
                _, kwargs = MockCoder.call_args
                assert kwargs["auto_commits"] is False

    def test_main_pretty_from_env(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            with open(".env", "w") as env_file:
                env_file.write("AIDER_PRETTY=false\n")

            with patch("aider.main.Coder") as MockCoder:
                main([])
                _, kwargs = MockCoder.call_args
                assert kwargs["pretty"] is False
>>>>>>> UPDATED
```

This new test method, `test_main_pretty_from_env`, creates a temporary directory, writes a `.env` file with `AIDER_PRETTY=false`, and then calls `main` with no arguments. It checks if the `pretty` option is set to `False` as expected.
2023-05-27 05:18:26 -07:00
Paul Gauthier
4c76a8a242 Added --dirty-commits 2023-05-27 05:12:50 -07:00
Paul Gauthier
a24e150e49 more tests, including --pretty 2023-05-27 05:06:36 -07:00
Paul Gauthier
24e78229b2 cleaned up --no-autocommit test 2023-05-27 05:03:30 -07:00
Paul Gauthier
2bb1c34bd5 aider: Updated test_main_with_no_auto_commits to only check if auto_commits is set to False.
# Context:
USER: in test_main_with_empty_dir_new_file can we *just* check the auto_commits=False?
ASSISTANT: Sure, I'll update the `test_main_with_empty_dir_new_file` test to check if `auto_commits` is set to `False`.

```python
tests/test_main.py
<<<<<<< ORIGINAL
    def test_main_with_empty_dir_new_file(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            pipe_input = create_input(StringIO(""))
            main(["foo.txt"], input=pipe_input, output=DummyOutput())
            pipe_input.close()
            self.assertTrue(os.path.exists("foo.txt"))
=======
    def test_main_with_empty_dir_new_file(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            pipe_input = create_input(StringIO(""))
            with unittest.mock.patch("aider.main.Coder") as MockCoder:
                main(["foo.txt"], input=pipe_input, output=DummyOutput())
                MockCoder.assert_called_with(
                    unittest.mock.ANY,
                    main_model=unittest.mock
^C KeyboardInterrupt
USER: in test_main_with_no_auto_commits can we *just* check the auto_commits=False?
ASSISTANT: Sure, I'll update the `test_main_with_no_auto_commits` test to only check if `auto_commits` is set to `False`.

```python
tests/test_main.py
<<<<<<< ORIGINAL
    def test_main_with_no_auto_commits(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            pipe_input = create_input(StringIO(""))
            with unittest.mock.patch("aider.main.Coder") as MockCoder:
                main(["--no-auto-commits"], input=pipe_input, output=DummyOutput())
                MockCoder.assert_called_with(
                    unittest.mock.ANY,
                    main_model=unittest.mock.ANY,
                    fnames=unittest.mock.ANY,
                    pretty=unittest.mock.ANY,
                    show_diffs=unittest.mock.ANY,
                    auto_commits=False,
                    dry_run=unittest.mock.ANY,
                    use_ctags=unittest.mock.ANY,
                    verbose=unittest.mock.ANY,
                )
            pipe_input.close()
=======
    def test_main_with_no_auto_commits(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            pipe_input = create_input(StringIO(""))
            with unittest.mock.patch("aider.main.Coder") as MockCoder:
                main(["--no-auto-commits"], input=pipe_input, output=DummyOutput())
                MockCoder.assert_called_with(
                    unittest.mock.ANY,
                    main_model=unittest.mock.ANY,
                    fnames=unittest.mock.ANY,
                    pretty=unittest.mock.ANY,
                    show_diffs=unittest.mock.ANY,
                    auto_commits=False,
                    dry_run=unittest.mock.ANY,
                    use_ctags=unittest.mock.ANY,

^C KeyboardInterrupt
USER: i want to avoid listing all the other args and ANY
ASSISTANT: I understand. I'll update the `test_main_with_no_auto_commits` test to only check if `auto_commits` is set to `False` without listing all the other arguments.

```python
tests/test_main.py
<<<<<<< ORIGINAL
    def test_main_with_no_auto_commits(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            pipe_input = create_input(StringIO(""))
            with unittest.mock.patch("aider.main.Coder") as MockCoder:
                main(["--no-auto-commits"], input=pipe_input, output=DummyOutput())
                MockCoder.assert_called_with(
                    unittest.mock.ANY,
                    main_model=unittest.mock.ANY,
                    fnames=unittest.mock.ANY,
                    pretty=unittest.mock.ANY,
                    show_diffs=unittest.mock.ANY,
                    auto_commits=False,
                    dry_run=unittest.mock.ANY,
                    use_ctags=unittest.mock.ANY,
                    verbose=unittest.mock.ANY,
                )
            pipe_input.close()
=======
    def test_main_with_no_auto_commits(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            pipe_input = create_input(StringIO(""))
            with unittest.mock.patch("aider.main.Coder") as MockCoder:
                main(["--no-auto-commits"], input=pipe_input, output=DummyOutput())
                _, kwargs = MockCoder.call_args
                assert kwargs["auto_commits"] is False
            pipe_input.close()
>>>>>>> UPDATED
```

This change will make the test only check if `auto_commits` is set to `False` without listing all the other arguments.
2023-05-27 05:00:50 -07:00
Paul Gauthier
01963c28f8 aider: Added a test which runs main with --no-auto-commits and patches Coder with a mock to see that it gets called with auto_commits=False.
# Context:
USER: add a test which runs main with --no-auto-commits and patches Coder with a mock to see that it gets called with auto_commits=False
ASSISTANT: To add the test, you need to modify the `tests/test_main.py` file. Here's the change:

```python
tests/test_main.py
<<<<<<< ORIGINAL
class TestMain(TestCase):
    def test_main_with_empty_dir_no_files_on_command(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            pipe_input = create_input(StringIO(""))
            main([], input=pipe_input, output=DummyOutput())
            pipe_input.close()

    def test_main_with_empty_dir_new_file(self):
=======
class TestMain(TestCase):
    def test_main_with_empty_dir_no_files_on_command(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            pipe_input = create_input(StringIO(""))
            main([], input=pipe_input, output=DummyOutput())
            pipe_input.close()

    def test_main_with_no_auto_commits(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            pipe_input = create_input(StringIO(""))
            with unittest.mock.patch("aider.main.Coder") as MockCoder:
                main(["--no-auto-commits"], input=pipe_input, output=DummyOutput())
                MockCoder.assert_called_with(
                    unittest.mock.ANY,
                    main_model=unittest.mock.ANY,
                    fnames=unittest.mock.ANY,
                    pretty=unittest.mock.ANY,
                    show_diffs=unittest.mock.ANY,
                    auto_commits=False,
                    dry_run=unittest.mock.ANY,
                    use_ctags=unittest.mock.ANY,
                    verbose=unittest.mock.ANY,
                )
            pipe_input.close()

    def test_main_with_empty_dir_new_file(self):
>>>>>>> UPDATED
```

This new test case `test_main_with_no_auto_commits` creates a temporary directory, changes the current working directory to it, and then runs the `main` function with the `--no-auto-commits` flag. It also patches the `Coder` class with a mock to check if it gets called with `auto_commits=False`.
2023-05-27 04:56:32 -07:00
Paul Gauthier
a9cc332e2d Removed test for disabling auto commits. 2023-05-27 04:54:55 -07:00
Paul Gauthier
ed70a32671 Added import for MagicMock in test_main.py. 2023-05-27 04:39:47 -07:00
Paul Gauthier
10dc4f6557 aider: Replaced unittest.mock with MagicMock in test_main_no_auto_commits.
# Context:
USER: I ran this command:

 pytest tests/test_main.py

And got this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
collected 4 items

tests/test_main.py F...                                                  [100%]

=================================== FAILURES ===================================
______________________ TestMain.test_main_no_auto_commits ______________________

self = <tests.test_main.TestMain testMethod=test_main_no_auto_commits>

    def test_main_no_auto_commits(self):
>       with unittest.mock.patch("aider.main.Coder") as MockCoder:
E       AttributeError: module 'unittest' has no attribute 'mock'

tests/test_main.py:38: AttributeError
=========================== short test summary info ============================
FAILED tests/test_main.py::TestMain::test_main_no_auto_commits - AttributeErr...
========================= 1 failed, 3 passed in 1.32s ==========================

ASSISTANT: Apologies for the oversight. It seems that the `unittest.mock` module is not available in your Python version. You can use the `mock` module instead, which is available as a separate package. First, you need to install the `mock` package using pip:

```
pip install mock
```

Then, update the import statement in the `tests/test_main.py` file to use the `mock` package:

```python
tests/test_main.py
<<<<<<< ORIGINAL
import os
import tempfile
import unittest
from unittest import TestCase
from aider.main import main
=======

^C KeyboardInterrupt
USER: would magicmock work?
ASSISTANT: Yes, `MagicMock` can be used in this case. It is a part of the `unittest.mock` module in Python 3.3 and later. Since you are using Python 3.11.3, you can use `MagicMock` directly from the `unittest.mock` module.

First, update the import statement in the `tests/test_main.py` file to import `MagicMock`:

```python
tests/test_main.py
<<<<<<< ORIGINAL
import os
import tempfile
import unittest
from unittest import TestCase
from aider.main import main
=======
import os
import tempfile
import unittest
from unittest import TestCase, MagicMock
from aider.main import main
>>>>>>> UPDATED
```

Then, update the test function `test_main_no_auto_commits` to use `MagicMock` instead of `unittest.mock.patch`:

```python
tests/test_main.py
<<<<<<< ORIGINAL
    def test_main_no_auto_commits(self):
        with unittest.mock.patch("aider.main.Coder") as MockCoder:
            with tempfile.TemporaryDirectory() as temp_dir:
                os.chdir(temp_dir)
                subprocess.run(["git", "init"], cwd=temp_dir)
                pipe_input = create_input(StringIO(""))
                main(["--no-auto-commits"], input=pipe_input, output=DummyOutput())
                pipe_input.close()

            mock_coder_instance = MockCoder.return_value
            self.assertFalse(mock_coder_instance.auto_commits)
=======
    def test_main_no_auto_commits(self):
        with MagicMock() as MockCoder:
            with tempfile.TemporaryDirectory() as temp_dir:
                os.chdir(temp_dir)
                subprocess.run(["git", "init"], cwd=temp_dir)
                pipe_input = create_input(StringIO(""))
                main(["--no-auto-commits"], input=pipe_input, output=DummyOutput())
                pipe_input.close()

            mock_coder_instance = MockCoder.return_value
            self.assertFalse(mock_coder_instance.auto_commits)
>>>>>>> UPDATED
```

This should resolve the issue with the test.
2023-05-27 04:38:32 -07:00
Paul Gauthier
ca752f37af aider: Import unittest module in tests/test_main.py.
# Context:
USER: I ran this command:

 pytest tests/test_main.py

And got this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
collected 4 items

tests/test_main.py F...                                                  [100%]

=================================== FAILURES ===================================
______________________ TestMain.test_main_no_auto_commits ______________________

self = <tests.test_main.TestMain testMethod=test_main_no_auto_commits>

    def test_main_no_auto_commits(self):
>       with unittest.mock.patch("aider.main.Coder") as MockCoder:
E       NameError: name 'unittest' is not defined

tests/test_main.py:37: NameError
=========================== short test summary info ============================
FAILED tests/test_main.py::TestMain::test_main_no_auto_commits - NameError: n...
========================= 1 failed, 3 passed in 1.29s ==========================

ASSISTANT: It looks like the `unittest` module is not imported in the `tests/test_main.py` file. To fix this issue, you need to add the import statement for the `unittest` module at the beginning of the file.

Here's the change:

```python
tests/test_main.py
<<<<<<< ORIGINAL
import os
import tempfile
from unittest import TestCase
from aider.main import main
=======
import os
import tempfile
import unittest
from unittest import TestCase
from aider.main import main
>>>>>>> UPDATED
```

This will import the `unittest` module and resolve the `NameError`.
2023-05-27 04:36:54 -07:00
Paul Gauthier
22482deedf aider: Added a new test to check if the --no-auto-commits flag is passed correctly to the Coder class.
# Context:
USER: add a test which runs main with --no-auto-commits and mocks Coder to see that it gets passed in correctly
ASSISTANT: To add the test, we'll modify the `tests/test_main.py` file. We'll create a new test function called `test_main_no_auto_commits` and use the `unittest.mock.patch` to mock the `Coder` class. Inside the test function, we'll run the `main` function with the `--no-auto-commits` flag and check if the `auto_commits` attribute of the mocked `Coder` instance is set to `False`.

Here's the change:

```python
tests/test_main.py
<<<<<<< ORIGINAL
    def test_main_with_empty_git_dir_new_file(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            subprocess.run(["git", "init"], cwd=temp_dir)
            pipe_input = create_input(StringIO(""))
            main(["--yes", "foo.txt"], input=pipe_input, output=DummyOutput())
            pipe_input.close()
            self.assertTrue(os.path.exists("foo.txt"))
=======
    def test_main_with_empty_git_dir_new_file(self):
        with tempfile.TemporaryDirectory() as temp_dir:
            os.chdir(temp_dir)
            subprocess.run(["git", "init"], cwd=temp_dir)
            pipe_input = create_input(StringIO(""))
            main(["--yes", "foo.txt"], input=pipe_input, output=DummyOutput())
            pipe_input.close()
            self.assertTrue(os.path.exists("foo.txt"))

    def test_main_no_auto_commits(self):
        with unittest.mock.patch("aider.main.Coder") as MockCoder:
            with tempfile.TemporaryDirectory() as temp_dir:
                os.chdir(temp_dir)
                subprocess.run(["git", "init"], cwd=temp_dir)
                pipe_input = create_input(StringIO(""))
                main(["--no-auto-commits"], input=pipe_input, output=DummyOutput())
                pipe_input.close()

            mock_coder_instance = MockCoder.return_value
            self.assertFalse(mock_coder_instance.auto_commits)
>>>>>>> UPDATED
```

This will add the new test to check if the `--no-auto-commits` flag is passed correctly to the `Coder` class.
2023-05-27 04:36:14 -07:00
Paul Gauthier
60031ecd29 fixed bug found by testing 2023-05-24 19:09:05 -07:00
Paul Gauthier
82804e2a6c aider: Updated test to check for correct format of file in result.
# Context:
USER: I ran this command:

 pytest tests/test_repomap.py

And got this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
collected 3 items

tests/test_repomap.py ..F                                                [100%]

=================================== FAILURES ===================================
_________________ TestRepoMap.test_get_tags_map_without_ctags __________________

self = <tests.test_repomap.TestRepoMap testMethod=test_get_tags_map_without_ctags>

    def test_get_tags_map_without_ctags(self):
        # Create a temporary directory with a sample Python file containing identifiers
        test_files = [
            "test_file_without_ctags.py",
            "test_file1.txt",
            "test_file2.md",
            "test_file3.json",
            "test_file4.html",
            "test_file5.css",
            "test_file6.js",
        ]

        with tempfile.TemporaryDirectory() as temp_dir:
            for file in test_files:
                with open(os.path.join(temp_dir, file), "w") as f:
                    f.write("")

            repo_map = RepoMap(use_ctags=False, root=temp_dir)
            other_files = [os.path.join(temp_dir, file) for file in test_files]
            result = repo_map.get_tags_map(other_files)

            # Check if the result contains each specific file in the expected tags map without ctags
            for file in test_files:
>               self.assertIn(f"{os.path.splitext(file)[0]}:", result)
E               AssertionError: 'test_file_without_ctags:' not found in 'test_file1.txt:\ntest_file4.html:\ntest_file5.css:\ntest_file6.js:\ntest_file_without_ctags.py:\n'

tests/test_repomap.py:80: AssertionError
=========================== short test summary info ============================
FAILED tests/test_repomap.py::TestRepoMap::test_get_tags_map_without_ctags - ...
========================= 1 failed, 2 passed in 0.39s ==========================

ASSISTANT: It seems that the test `test_get_tags_map_without_ctags` is failing because the expected string 'test_file_without_ctags:' is not found in the result. The result contains 'test_file_without_ctags.py:', which is the correct format. I will update the test to fix this issue.

```python
tests/test_repomap.py
<<<<<<< ORIGINAL
            for file in test_files:
                self.assertIn(f"{os.path.splitext(file)[0]}:", result)
=======
            for file in test_files:
                self.assertIn(f"{os.path.splitext(file)[0]}.{os.path.splitext(file)[1][1:]}:", result)
>>>>>>> UPDATED
```

This update changes the test to check for the correct format of the file in the result. Now you can run the test again with the `pytest tests/test_repomap.py` command.
2023-05-24 19:06:39 -07:00
Paul Gauthier
0fa1345ed0 aider: Updated test_get_tags_map_without_ctags test in tests/test_repomap.py to check if each specific file is in the result.
# Context:
USER: that test needs to check if each specific file is in the result, not test_get_tags_map_without_ctags
ASSISTANT: I will update the `test_get_tags_map_without_ctags` test in the `tests/test_repomap.py` file to check if each specific file is in the result.

```python
tests/test_repomap.py
<<<<<<< ORIGINAL
            # Check if the result contains the expected tags map without ctags
            self.assertIn("test_file_without_ctags.py:", result)
=======
            # Check if the result contains each specific file in the expected tags map without ctags
            for file in test_files:
                self.assertIn(f"{os.path.splitext(file)[0]}:", result)
>>>>>>> UPDATED
```

This update checks if each specific file is in the result of the `get_tags_map` function when `ctags=False`.
2023-05-24 19:05:55 -07:00
Paul Gauthier
ec4b5dc2c3 aider: Updated test to not put anything in the file and add more files of various kinds.
# Context:
USER: update that test to not put anything in the file. add a bunch more files of various kinds. check them all.
ASSISTANT: I will update the `test_get_tags_map_without_ctags` test in the `tests/test_repomap.py` file to not put any content in the Python file and add more files of various kinds.

```python
tests/test_repomap.py
<<<<<<< ORIGINAL
        test_file = "test_file_without_ctags.py"
        file_content = """\
class MyClass:
    def my_method(self, arg1, arg2):
        return arg1 + arg2

def my_function(arg1, arg2):
    return arg1 * arg2
"""

        with tempfile.TemporaryDirectory() as temp_dir:
            with open(os.path.join(temp_dir, test_file), "w") as f:
                f.write(file_content)

            repo_map = RepoMap(use_ctags=False, root=temp_dir)
            other_files = [os.path.join(temp_dir, test_file)]
            result = repo_map.get_tags_map(other_files)
=======
        test_files = [
            "test_file_without_ctags.py",
            "test_file1.txt",
            "test_file2.md",
            "test_file3.json",
            "test_file4.html",
            "test_file5.css",
            "test_file6.js",
        ]

        with tempfile.TemporaryDirectory() as temp_dir:
            for file in test_files:
                with open(os.path.join(temp_dir, file), "w") as f:
                    f.write("")

            repo_map = RepoMap(use_ctags=False, root=temp_dir)
            other_files = [os.path.join(temp_dir, file) for file in test_files]
            result = repo_map.get_tags_map(other_files)
>>>>>>> UPDATED
```

This update removes the content from the Python file and adds more files of various kinds. The test checks if the `get_tags_map` function returns the expected tags map containing all the files when `ctags=False`.
2023-05-24 19:04:43 -07:00
Paul Gauthier
45442b99e1 aider: Added test to check if get_tags_map function returns the expected tags map containing the file when ctags=False.
# Context:
USER: add another like that, but with ctags=False. just make sure the file is in the result.
ASSISTANT: I will add a new test to the `tests/test_repomap.py` file that checks if the file is in the result when `ctags=False`.

```python
tests/test_repomap.py
<<<<<<< ORIGINAL
            self.assertIn("my_function", result)

if __name__ == "__main__":
    unittest.main()
=======
            self.assertIn("my_function", result)

    def test_get_tags_map_without_ctags(self):
        # Create a temporary directory with a sample Python file containing identifiers
        test_file = "test_file_without_ctags.py"
        file_content = """\
class MyClass:
    def my_method(self, arg1, arg2):
        return arg1 + arg2

def my_function(arg1, arg2):
    return arg1 * arg2
"""

        with tempfile.TemporaryDirectory() as temp_dir:
            with open(os.path.join(temp_dir, test_file), "w") as f:
                f.write(file_content)

            repo_map = RepoMap(use_ctags=False, root=temp_dir)
            other_files = [os.path.join(temp_dir, test_file)]
            result = repo_map.get_tags_map(other_files)

            # Check if the result contains the expected tags map without ctags
            self.assertIn("test_file_without_ctags.py:", result)

if __name__ == "__main__":
    unittest.main()
>>>>>>> UPDATED
```

This new test creates a temporary directory with a sample Python file containing a class, a method, and a function. It then checks if the `get_tags_map` function returns the expected tags map containing the file when `ctags=False`.
2023-05-24 19:02:37 -07:00
Paul Gauthier
8f2447078c aider: Added a new test to check if the get_tags_map function returns the expected tags map containing the identifiers from a Python file.
# Context:
USER: add another test. pass in a python file which defines a few identifiers. make sure they appear in the map.
ASSISTANT: I will add a new test to the `tests/test_repomap.py` file that checks if the identifiers from a Python file appear in the map.

```python
tests/test_repomap.py
<<<<<<< ORIGINAL
            self.assertNotIn("test_file4.json:", result)

if __name__ == "__main__":
    unittest.main()
=======
            self.assertNotIn("test_file4.json:", result)

    def test_get_tags_map_with_identifiers(self):
        # Create a temporary directory with a sample Python file containing identifiers
        test_file = "test_file_with_identifiers.py"
        file_content = """\
class MyClass:
    def my_method(self, arg1, arg2):
        return arg1 + arg2

def my_function(arg1, arg2):
    return arg1 * arg2
"""

        with tempfile.TemporaryDirectory() as temp_dir:
            with open(os.path.join(temp_dir, test_file), "w") as f:
                f.write(file_content)

            repo_map = RepoMap(root=temp_dir)
            other_files = [os.path.join(temp_dir, test_file)]
            result = repo_map.get_tags_map(other_files)

            # Check if the result contains the expected tags map with identifiers
            self.assertIn("test_file_with_identifiers.py:", result)
            self.assertIn("MyClass", result)
            self.assertIn("my_method", result)
            self.assertIn("my_function", result)

if __name__ == "__main__":
    unittest.main()
>>>>>>> UPDATED
```

This new test creates a temporary directory with a sample Python file containing a class, a method, and a function. It then checks if the `get_tags_map` function returns the expected tags map containing the identifiers from the Python file.
2023-05-24 19:01:02 -07:00
Paul Gauthier
c8c0e6232f aider: Added import statement for tempfile module in tests/test_repomap.py.
# Context:
USER: I ran this command:

 pytest tests/test_repomap.py

And got this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
collected 1 item

tests/test_repomap.py F                                                  [100%]

=================================== FAILURES ===================================
________________________ TestRepoMap.test_get_tags_map _________________________

self = <tests.test_repomap.TestRepoMap testMethod=test_get_tags_map>

    def test_get_tags_map(self):
        # Create a temporary directory with sample files for testing
        test_files = [
            "test_file1.py",
            "test_file2.py",
            "test_file3.md",
            "test_file4.json",
        ]

>       with tempfile.TemporaryDirectory() as temp_dir:
E       NameError: name 'tempfile' is not defined

tests/test_repomap.py:15: NameError
=========================== short test summary info ============================
FAILED tests/test_repomap.py::TestRepoMap::test_get_tags_map - NameError: nam...
============================== 1 failed in 0.05s ===============================

ASSISTANT: It looks like the `tempfile` module is not imported in the `tests/test_repomap.py` file. I will add the import statement for you.

```python
tests/test_repomap.py
<<<<<<< ORIGINAL
import os
import unittest
from aider.repomap import RepoMap
=======
import os
import tempfile
import unittest
from aider.repomap import RepoMap
>>>>>>> UPDATED
```

Now, you can run the test again with the `pytest tests/test_repomap.py` command.
2023-05-24 18:59:12 -07:00
Paul Gauthier
452d31089b aider: Added a test for the get_tags_map function in the aider/repomap.py file.
# Context:
USER: write a test for get_tags_map
ASSISTANT: I need to know the expected behavior of the `get_tags_map` function in the `repomap.py` file. Please provide a brief description of the function and its expected output for a given input.
USER: I added the content of these additional files: aider/repomap.py
ASSISTANT: Thank you. I will now write a test for the `get_tags_map` function in the `aider/repomap.py` file.

```python
tests/test_repomap.py
<<<<<<< ORIGINAL
=======
import os
import unittest
from aider.repomap import RepoMap

class TestRepoMap(unittest.TestCase):
    def test_get_tags_map(self):
        # Create a temporary directory with sample files for testing
        test_files = [
            "test_file1.py",
            "test_file2.py",
            "test_file3.md",
            "test_file4.json",
        ]

        with tempfile.TemporaryDirectory() as temp_dir:
            for file in test_files:
                with open(os.path.join(temp_dir, file), "w") as f:
                    f.write("")

            repo_map = RepoMap(root=temp_dir)
            other_files = [os.path.join(temp_dir, file) for file in test_files]
            result = repo_map.get_tags_map(other_files)

            # Check if the result contains the expected tags map
            self.assertIn("test_file1.py:", result)
            self.assertIn("test_file2.py:", result)
            self.assertNotIn("test_file3.md:", result)
            self.assertNotIn("test_file4.json:", result)

if __name__ == "__main__":
    unittest.main()
>>>>>>> UPDATED
```

This test creates a temporary directory with sample files and checks if the `get_tags_map` function returns the expected tags map for the given input. The test checks if the result contains the tags map for `.py` files and does not contain the tags map for `.md` and `.json` files.
2023-05-24 18:58:29 -07:00
Paul Gauthier
507d7c0444 Added new files to the git repo: tests/test_repomap.py 2023-05-24 18:56:03 -07:00
Paul Gauthier
680fc45fb3 improved prompting, fix ctags bug 2023-05-19 09:47:06 -07:00
Paul Gauthier
d1551b46be aider: Updated test to pass a string instead of a list when calling cmd_add method.
# Context:
USER: I ran this command:

 pytest tests/test_commands.py

Which produced this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
collected 1 item

tests/test_commands.py F                                                 [100%]

=================================== FAILURES ===================================
__________________________ TestCommands.test_cmd_add ___________________________

self = <tests.test_commands.TestCommands testMethod=test_cmd_add>

    def test_cmd_add(self):
        # Create a temporary directory and change the current working directory
        with tempfile.TemporaryDirectory() as tmpdir:
            os.chdir(tmpdir)

            # Initialize the Commands and InputOutput objects
            io = InputOutput(pretty=False, yes=True)
            coder = MagicMock()
            commands = Commands(io, coder)

            # Call the cmd_add method with 'foo.txt' and 'bar.txt'
>           commands.cmd_add(["foo.txt", "bar.txt"])

/Users/gauthier/Projects/aider/tests/test_commands.py:20:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <aider.commands.Commands object at 0x103e2fa50>
args = ['foo.txt', 'bar.txt']

    def cmd_add(self, args):
        "Add matching files to the chat session"

        added_fnames = []
        files = self.coder.get_all_relative_files()
>       for word in args.split():
E       AttributeError: 'list' object has no attribute 'split'

/Users/gauthier/Projects/aider/aider/commands.py:161: AttributeError
=========================== short test summary info ============================
FAILED tests/test_commands.py::TestCommands::test_cmd_add - AttributeError: '...
============================== 1 failed in 0.28s ===============================

ASSISTANT: It seems that the `cmd_add` method in `aider/commands.py` is expecting a string as input, but in the test, we are passing a list. I will update the test to pass a string instead of a list.

Here's the code change:

```python
tests/test_commands.py
<<<<<<< ORIGINAL
            # Call the cmd_add method with 'foo.txt' and 'bar.txt'
            commands.cmd_add(["foo.txt", "bar.txt"])
=======
            # Call the cmd_add method with 'foo.txt' and 'bar.txt' as a single string
            commands.cmd_add("foo.txt bar.txt")
>>>>>>> UPDATED
```

Now, run the test again with the updated test method:

```
pytest tests/test_commands.py
```
2023-05-19 09:16:51 -07:00
Paul Gauthier
e2d5212eec aider: Added a test method test_cmd_add that creates a temporary directory, calls the cmd_add method with 'foo.txt' and 'bar.txt', and checks if both files have been created in the temporary directory.
# Context:
USER: add a test for cmd_add that passes in 'foo.txt' and 'bar.txt' and ensures they have both been created after the test. run the test in a tmp dir.
ASSISTANT: I will add a new test method called `test_cmd_add` in the `tests/test_commands.py` file. This test will create a temporary directory, change the current working directory to the temporary directory, and then call the `cmd_add` method with 'foo.txt' and 'bar.txt' as arguments. After that, it will check if both files have been created in the temporary directory.

Here's the code change:

```python
tests/test_commands.py
<<<<<<< ORIGINAL
=======
import os
import tempfile
from unittest import TestCase
from unittest.mock import MagicMock
from aider.commands import Commands
from aider.io import InputOutput

class TestCommands(TestCase):
    def test_cmd_add(self):
        # Create a temporary directory and change the current working directory
        with tempfile.TemporaryDirectory() as tmpdir:
            os.chdir(tmpdir)

            # Initialize the Commands and InputOutput objects
            io = InputOutput(pretty=False, yes=True)
            coder = MagicMock()
            commands = Commands(io, coder)

            # Call the cmd_add method with 'foo.txt' and 'bar.txt'
            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"))
>>>>>>> UPDATED
```

This test will ensure that the `cmd_add` method creates the specified files in the current working directory.
2023-05-19 09:16:14 -07:00
Paul Gauthier
b9cea2cdb1 Added new files to the git repo: tests/test_commands.py 2023-05-19 09:15:06 -07:00
Paul Gauthier
6900e7a282 byebye 2023-05-19 09:09:36 -07:00
Paul Gauthier
5d06cab9e6 aider: Fixed cmd_add method to accept string input instead of list.
# Context:
USER: I ran this command:

 pytest tests/test_commands.py

Which produced this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
collected 1 item

tests/test_commands.py F                                                 [100%]

=================================== FAILURES ===================================
__________________________ TestCommands.test_cmd_add ___________________________

self = <tests.test_commands.TestCommands testMethod=test_cmd_add>

    def test_cmd_add(self):
        with tempfile.TemporaryDirectory() as tmpdir:
            original_cwd = os.getcwd()
            os.chdir(tmpdir)

            io = InputOutput(pretty=True, yes=True)
            coder = Coder(io)
            commands = Commands(io, coder)

>           commands.cmd_add(['foo.txt', 'bar.txt'])

/Users/gauthier/Projects/aider/tests/test_commands.py:18:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <aider.commands.Commands object at 0x107e74210>
args = ['foo.txt', 'bar.txt']

    def cmd_add(self, args):
        "Add matching files to the chat session"

        added_fnames = []
        files = self.coder.get_all_relative_files()
>       for word in args.split():
E       AttributeError: 'list' object has no attribute 'split'

/Users/gauthier/Projects/aider/aider/commands.py:161: AttributeError
----------------------------- Captured stdout call -----------------------------
Files are not in a git repo.
No suitable git repo, will not automatically commit edits.
Common root directory:
/private/var/folders/49/kxrdwwbx0h9bchx99397477c0000gn/T/tmptf5hloir
=========================== short test summary info ============================
FAILED tests/test_commands.py::TestCommands::test_cmd_add - AttributeError: '...
============================== 1 failed in 0.73s ===============================

ASSISTANT: I apologize for the mistake. The `cmd_add` method expects a string as input, not a list. We need to modify the test to pass the arguments as a single string.

Here's the code change:

```python
tests/test_commands.py
<<<<<<< ORIGINAL
            commands.cmd_add(['foo.txt', 'bar.txt'])
=======
            commands.cmd_add('foo.txt bar.txt')
>>>>>>> UPDATED
```

This should fix the `AttributeError` and allow the test to run successfully.
2023-05-19 09:08:37 -07:00
Paul Gauthier
3998bf4c2e aider: Fixed InputOutput instantiation in test_cmd_add.
# Context:
USER: I ran this command:

 pytest tests/test_commands.py

Which produced this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
collected 1 item

tests/test_commands.py F                                                 [100%]

=================================== FAILURES ===================================
__________________________ TestCommands.test_cmd_add ___________________________

self = <tests.test_commands.TestCommands testMethod=test_cmd_add>

    def test_cmd_add(self):
        with tempfile.TemporaryDirectory() as tmpdir:
            original_cwd = os.getcwd()
            os.chdir(tmpdir)

>           io = InputOutput()
E           TypeError: InputOutput.__init__() missing 2 required positional arguments: 'pretty' and 'yes'

/Users/gauthier/Projects/aider/tests/test_commands.py:14: TypeError
=========================== short test summary info ============================
FAILED tests/test_commands.py::TestCommands::test_cmd_add - TypeError: InputO...
============================== 1 failed in 0.77s ===============================

ASSISTANT: I apologize for the oversight. The `InputOutput` class requires two positional arguments: `pretty` and `yes`. Let's update the test to provide these arguments.

Here's the code change:

```python
tests/test_commands.py
<<<<<<< ORIGINAL
            io = InputOutput()
=======
            io = InputOutput(pretty=True, yes=True)
>>>>>>> UPDATED
```

This should fix the `TypeError` and allow the test to run successfully.
2023-05-19 09:07:56 -07:00
Paul Gauthier
922d28216a aider: Added a test for cmd_add that passes in 'foo.txt' and 'bar.txt' and ensures they have both been created after the test.
# Context:
USER: add a test for cmd_add that passes in 'foo.txt' and 'bar.txt' and ensures they have both been created after the test. run the test in a tmp dir.
ASSISTANT: To add the test for `cmd_add`, we will modify the `tests/test_commands.py` file. Here's the step-by-step plan:

1. Import the necessary libraries and classes.
2. Create a new test method called `test_cmd_add` inside the `TestCommands` class.
3. In the `test_cmd_add` method, create a temporary directory using `tempfile.TemporaryDirectory`.
4. Change the current working directory to the temporary directory.
5. Create an instance of the `InputOutput` and `Coder` classes.
6. Create an instance of the `Commands` class, passing the `InputOutput` and `Coder` instances.
7. Call the `cmd_add` method with the arguments `['foo.txt', 'bar.txt']`.
8. Check if both 'foo.txt' and 'bar.txt' files have been created in the temporary directory.
9. Change the current working directory back to the original directory.

Here's the code change:

```python
tests/test_commands.py
<<<<<<< ORIGINAL
=======
import os
import tempfile
from unittest import TestCase
from aider.io import InputOutput
from aider.coder import Coder
from aider.commands import Commands

class TestCommands(TestCase):
    def test_cmd_add(self):
        with tempfile.TemporaryDirectory() as tmpdir:
            original_cwd = os.getcwd()
            os.chdir(tmpdir)

            io = InputOutput()
            coder = Coder(io)
            commands = Commands(io, coder)

            commands.cmd_add(['foo.txt', 'bar.txt'])

            self.assertTrue(os.path.exists('foo.txt'))
            self.assertTrue(os.path.exists('bar.txt'))

            os.chdir(original_cwd)
>>>>>>> UPDATED
```

This will add the test for `cmd_add` and ensure that both 'foo.txt' and 'bar.txt' have been created after the test.
2023-05-19 09:06:56 -07:00
Paul Gauthier
73853d42ce Added new files to the git repo: tests/test_commands.py 2023-05-19 09:04:59 -07:00
Paul Gauthier
37812084c1 forget about cmd_add test 2023-05-19 09:04:35 -07:00
Paul Gauthier
ba9307374e cleanup Coder params 2023-05-18 18:21:44 -07:00
Paul Gauthier
a59575fa4b wip: Removed unused import from test_commands.py. 2023-05-18 18:17:38 -07:00
Paul Gauthier
78af36ffda cleanup 2023-05-18 18:17:02 -07:00
Paul Gauthier
ad865fe0f4 removed yes 2023-05-18 18:12:27 -07:00
Paul Gauthier
59c3fef150 aider: Updated test_cmd_add method in tests/test_commands.py to pass yes=True when creating a Coder instance.
# Context:
USER: call Coder with yes=True
ASSISTANT: I will update the `test_cmd_add` method in the `tests/test_commands.py` file to pass `yes=True` when creating a `Coder` instance.

```python
tests/test_commands.py
<<<<<<< ORIGINAL
            coder = Coder(main_model="gpt-3.5-turbo", fnames=[], pretty=False, show_diffs=False, auto_commits=False, io=io, dry_run=False)
=======
            coder = Coder(main_model="gpt-3.5-turbo", fnames=[], pretty=False, show_diffs=False, auto_commits=False, io=io, dry_run=False, yes=True)
>>>>>>> UPDATED
```
2023-05-18 18:10:30 -07:00
Paul Gauthier
240bdf03df aider: Fixed call to Coder class in tests/test_commands.py.
# Context:
USER: I ran this command:

 pytest tests/test_commands.py

Which produced this output:

============================= test session starts ==============================
platform darwin -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0
rootdir: /Users/gauthier/Projects/aider
collected 1 item

tests/test_commands.py F                                                 [100%]

=================================== FAILURES ===================================
__________________________ TestCommands.test_cmd_add ___________________________

self = <tests.test_commands.TestCommands testMethod=test_cmd_add>

    def test_cmd_add(self):
        with tempfile.TemporaryDirectory() as tmpdir:
            io = IO(pretty=False, yes=True)
>           coder = Coder(root=tmpdir)
E           TypeError: Coder.__init__() got an unexpected keyword argument 'root'

tests/test_commands.py:13: TypeError
=========================== short test summary info ============================
FAILED tests/test_commands.py::TestCommands::test_cmd_add - TypeError: Coder....
============================== 1 failed in 0.52s ===============================

ASSISTANT: It seems like the `Coder` class in `aider/coder.py` does not accept a `root` keyword argument in its `__init__` method. To fix this issue, we need to modify the `__init__` method of the `Coder` class to accept the `root` keyword argument and set it as an instance variable
^C KeyboardInterrupt
USER: no, fix the call
ASSISTANT: To fix the call to the `Coder` class in `tests/test_commands.py`, we need to remove the `root` keyword argument and pass the required arguments according to the `__init__` method of the `Coder` class.

Here's the change you need to make in `tests/test_commands.py`:

```python
tests/test_commands.py
<<<<<<< ORIGINAL
            coder = Coder(root=tmpdir)
=======
            coder = Coder(main_model="gpt-3.5-turbo", fnames=[], pretty=False, show_diffs=False, auto_commits=False, io=io, dry_run=False)
>>>>>>> UPDATED
```

This change removes the `root` keyword argument and provides the required arguments for the `Coder` class.
2023-05-18 18:07:21 -07:00
Paul Gauthier
b0f573bde3 Refactor IO instantiation in test_commands.py. 2023-05-18 17:31:00 -07:00