diff --git a/autogpt/spinner.py b/autogpt/spinner.py index 4e33d7421..ed02eb44c 100644 --- a/autogpt/spinner.py +++ b/autogpt/spinner.py @@ -54,8 +54,8 @@ class Spinner: def update_message(self, new_message, delay=0.1): """Update the spinner message Args: - new_message (str): New message to display - delay: Delay in seconds before updating the message + new_message (str): New message to display. + delay (float): The delay in seconds between each spinner update. """ time.sleep(delay) sys.stdout.write( diff --git a/tests/unit/test_spinner.py b/tests/unit/test_spinner.py new file mode 100644 index 000000000..55b39c8a4 --- /dev/null +++ b/tests/unit/test_spinner.py @@ -0,0 +1,69 @@ + +# Generated by CodiumAI +from autogpt.spinner import Spinner +import time + + +import unittest + +""" +Code Analysis + +Main functionalities: +The Spinner class provides a simple way to display a spinning animation while a process is running. It can be used to indicate that a process is ongoing and to provide visual feedback to the user. The class can be used as a context manager, which means that it can be used with the 'with' statement to automatically start and stop the spinner animation. + +Methods: +- __init__(self, message: str = "Loading...", delay: float = 0.1) -> None: Initializes the Spinner class with a message to display and a delay between each spinner update. +- spin(self) -> None: Spins the spinner animation while the process is running. +- __enter__(self): Starts the spinner animation when used as a context manager. +- __exit__(self, exc_type, exc_value, exc_traceback) -> None: Stops the spinner animation when used as a context manager. +- update_message(self, new_message, delay=0.1): Updates the message displayed by the spinner animation. + +Fields: +- spinner: An itertools.cycle object that contains the characters used for the spinner animation. +- delay: The delay between each spinner update. +- message: The message to display. +- running: A boolean value that indicates whether the spinner animation is running. +- spinner_thread: A threading.Thread object that runs the spin method in a separate thread. +""" + +ALMOST_DONE_MESSAGE = "Almost done..." +PLEASE_WAIT = "Please wait..." + +class TestSpinner(unittest.TestCase): + + # Tests that the spinner initializes with default values. + def test_spinner_initializes_with_default_values(self): + with Spinner() as spinner: + self.assertEqual(spinner.message, "Loading...") + self.assertEqual(spinner.delay, 0.1) + + # Tests that the spinner initializes with custom message and delay values. + def test_spinner_initializes_with_custom_values(self): + with Spinner(message=PLEASE_WAIT, delay=0.2) as spinner: + self.assertEqual(spinner.message, PLEASE_WAIT) + self.assertEqual(spinner.delay, 0.2) + + # Tests that the spinner starts spinning and stops spinning without errors. + def test_spinner_stops_spinning(self): + with Spinner() as spinner: + time.sleep(1) + spinner.update_message(ALMOST_DONE_MESSAGE) + time.sleep(1) + self.assertFalse(spinner.running) + + # Tests that the spinner message can be updated while the spinner is running and the spinner continues spinning. + def test_spinner_updates_message_and_still_spins(self): + with Spinner() as spinner: + self.assertTrue(spinner.running) + time.sleep(1) + spinner.update_message(ALMOST_DONE_MESSAGE) + time.sleep(1) + self.assertEqual(spinner.message, ALMOST_DONE_MESSAGE) + self.assertFalse(spinner.running) + + # Tests that the spinner can be used as a context manager. + def test_spinner_can_be_used_as_context_manager(self): + with Spinner() as spinner: + self.assertTrue(spinner.running) + self.assertFalse(spinner.running)