feat: give commands the ability to execute logic (#63)
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from unittest.mock import patch
|
||||
|
||||
from prompt_toolkit import PromptSession
|
||||
import pytest
|
||||
from goose.cli.prompt.goose_prompt_session import GoosePromptSession
|
||||
from goose.cli.prompt.user_input import PromptAction, UserInput
|
||||
@@ -7,41 +8,48 @@ from goose.cli.prompt.user_input import PromptAction, UserInput
|
||||
|
||||
@pytest.fixture
|
||||
def mock_prompt_session():
|
||||
with patch("prompt_toolkit.PromptSession") as mock_prompt_session:
|
||||
with patch("goose.cli.prompt.goose_prompt_session.PromptSession") as mock_prompt_session:
|
||||
yield mock_prompt_session
|
||||
|
||||
|
||||
def test_get_save_session_name(mock_prompt_session):
|
||||
mock_prompt_session.prompt.return_value = "my_session"
|
||||
goose_prompt_session = GoosePromptSession(mock_prompt_session)
|
||||
mock_prompt_session.return_value.prompt.return_value = "my_session"
|
||||
goose_prompt_session = GoosePromptSession()
|
||||
|
||||
assert goose_prompt_session.get_save_session_name() == "my_session"
|
||||
|
||||
|
||||
def test_get_user_input_to_continue(mock_prompt_session):
|
||||
mock_prompt_session.prompt.return_value = "input_value"
|
||||
goose_prompt_session = GoosePromptSession(mock_prompt_session)
|
||||
def test_get_save_session_name_with_space(mock_prompt_session):
|
||||
mock_prompt_session.return_value.prompt.return_value = "my_session "
|
||||
goose_prompt_session = GoosePromptSession()
|
||||
|
||||
user_input = goose_prompt_session.get_user_input()
|
||||
assert goose_prompt_session.get_save_session_name() == "my_session"
|
||||
|
||||
assert user_input == UserInput(PromptAction.CONTINUE, "input_value")
|
||||
|
||||
def test_get_user_input_to_continue():
|
||||
with patch.object(PromptSession, "prompt", return_value="input_value"):
|
||||
goose_prompt_session = GoosePromptSession()
|
||||
|
||||
user_input = goose_prompt_session.get_user_input()
|
||||
|
||||
assert user_input == UserInput(PromptAction.CONTINUE, "input_value")
|
||||
|
||||
|
||||
@pytest.mark.parametrize("exit_input", ["exit", ":q"])
|
||||
def test_get_user_input_to_exit(exit_input, mock_prompt_session):
|
||||
mock_prompt_session.prompt.return_value = exit_input
|
||||
goose_prompt_session = GoosePromptSession(mock_prompt_session)
|
||||
with patch.object(PromptSession, "prompt", return_value=exit_input):
|
||||
goose_prompt_session = GoosePromptSession()
|
||||
|
||||
user_input = goose_prompt_session.get_user_input()
|
||||
user_input = goose_prompt_session.get_user_input()
|
||||
|
||||
assert user_input == UserInput(PromptAction.EXIT)
|
||||
assert user_input == UserInput(PromptAction.EXIT)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("error", [EOFError, KeyboardInterrupt])
|
||||
def test_get_user_input_to_exit_when_error_occurs(error, mock_prompt_session):
|
||||
mock_prompt_session.prompt.side_effect = error
|
||||
goose_prompt_session = GoosePromptSession(mock_prompt_session)
|
||||
with patch.object(PromptSession, "prompt", side_effect=error):
|
||||
goose_prompt_session = GoosePromptSession()
|
||||
|
||||
user_input = goose_prompt_session.get_user_input()
|
||||
user_input = goose_prompt_session.get_user_input()
|
||||
|
||||
assert user_input == UserInput(PromptAction.EXIT)
|
||||
assert user_input == UserInput(PromptAction.EXIT)
|
||||
|
||||
@@ -232,22 +232,45 @@ def test_lex_document_ending_char_of_parameter_is_symbol():
|
||||
assert actual_tokens == expected_tokens
|
||||
|
||||
|
||||
def test_command_itself():
|
||||
pattern = command_itself("file:")
|
||||
matches = pattern.match("/file:example.txt")
|
||||
def assert_pattern_matches(pattern, text, expected_group):
|
||||
matches = pattern.search(text)
|
||||
assert matches is not None
|
||||
assert matches.group(1) == "/file:"
|
||||
assert matches.group() == expected_group
|
||||
|
||||
|
||||
def test_command_itself():
|
||||
pattern = command_itself("file")
|
||||
assert_pattern_matches(pattern, "/file:example.txt", "/file:")
|
||||
assert_pattern_matches(pattern, "/file asdf", "/file")
|
||||
assert_pattern_matches(pattern, "some /file", "/file")
|
||||
assert_pattern_matches(pattern, "some /file:", "/file:")
|
||||
assert_pattern_matches(pattern, "/file /file", "/file")
|
||||
|
||||
assert pattern.search("file") is None
|
||||
assert pattern.search("/anothercommand") is None
|
||||
|
||||
|
||||
def test_value_for_command():
|
||||
pattern = value_for_command("file:")
|
||||
matches = pattern.search("/file:example.txt")
|
||||
assert matches is not None
|
||||
assert matches.group(1) == "example.txt"
|
||||
pattern = value_for_command("file")
|
||||
assert_pattern_matches(pattern, "/file:example.txt", "example.txt")
|
||||
assert_pattern_matches(pattern, '/file:"example space.txt"', '"example space.txt"')
|
||||
assert_pattern_matches(pattern, '/file:"example.txt" some other string', '"example.txt"')
|
||||
assert_pattern_matches(pattern, "something before /file:example.txt", "example.txt")
|
||||
|
||||
# assert no pattern matches when there is no value
|
||||
assert pattern.search("/file:").group() == ""
|
||||
assert pattern.search("/file: other").group() == ""
|
||||
assert pattern.search("/file: ").group() == ""
|
||||
assert pattern.search("/file other") is None
|
||||
|
||||
|
||||
def test_completion_for_command():
|
||||
pattern = completion_for_command("file:")
|
||||
matches = pattern.search("/file:")
|
||||
assert matches is not None
|
||||
assert matches.group(1) == "file:"
|
||||
pattern = completion_for_command("file")
|
||||
assert_pattern_matches(pattern, "/file", "/file")
|
||||
assert_pattern_matches(pattern, "/fi", "/fi")
|
||||
assert_pattern_matches(pattern, "before /fi", "/fi")
|
||||
assert_pattern_matches(pattern, "some /f", "/f")
|
||||
|
||||
assert pattern.search("/file after") is None
|
||||
assert pattern.search("/ file") is None
|
||||
assert pattern.search("/file:") is None
|
||||
|
||||
Reference in New Issue
Block a user