feat: Google Workspace Toolkit (#222)
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from goose.toolkit.google_workspace import GoogleWorkspace
|
||||
from goose.tools.google_oauth_handler import GoogleOAuthHandler
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def google_workspace_toolkit():
|
||||
return GoogleWorkspace(notifier=MagicMock())
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_credentials():
|
||||
mock_creds = MagicMock()
|
||||
mock_creds.token = "mock_token"
|
||||
return mock_creds
|
||||
|
||||
|
||||
def test_google_workspace_init(google_workspace_toolkit):
|
||||
assert isinstance(google_workspace_toolkit, GoogleWorkspace)
|
||||
|
||||
|
||||
@patch.object(GoogleOAuthHandler, "get_credentials")
|
||||
def test_login(mock_get_credentials, google_workspace_toolkit, mock_credentials):
|
||||
mock_get_credentials.return_value = mock_credentials
|
||||
result = google_workspace_toolkit.login()
|
||||
assert "Successfully authenticated with Google!" in result
|
||||
assert "Access token: mock_tok..." in result
|
||||
|
||||
|
||||
@patch.object(GoogleOAuthHandler, "get_credentials")
|
||||
def test_login_error(mock_get_credentials, google_workspace_toolkit):
|
||||
mock_get_credentials.side_effect = ValueError("Test error")
|
||||
result = google_workspace_toolkit.login()
|
||||
assert "Error: Test error" in result
|
||||
|
||||
|
||||
@patch("goose.toolkit.google_workspace.get_file_paths")
|
||||
def test_file_paths(mock_get_file_paths):
|
||||
mock_get_file_paths.return_value = {
|
||||
"CLIENT_SECRETS_FILE": "/mock/home/path/.config/goose/google_credentials.json",
|
||||
"TOKEN_FILE": "/mock/home/path/.config/goose/google_oauth_token.json",
|
||||
}
|
||||
from goose.toolkit.google_workspace import get_file_paths
|
||||
|
||||
file_paths = get_file_paths()
|
||||
assert file_paths["CLIENT_SECRETS_FILE"] == "/mock/home/path/.config/goose/google_credentials.json"
|
||||
assert file_paths["TOKEN_FILE"] == "/mock/home/path/.config/goose/google_oauth_token.json"
|
||||
|
||||
|
||||
def test_list_emails(mocker, google_workspace_toolkit):
|
||||
# Mock get_file_paths
|
||||
mock_get_file_paths = mocker.patch("goose.toolkit.google_workspace.get_file_paths")
|
||||
mock_get_file_paths.return_value = {
|
||||
"CLIENT_SECRETS_FILE": "/mock/home/path/.config/goose/google_credentials.json",
|
||||
"TOKEN_FILE": "/mock/home/path/.config/goose/google_oauth_token.json",
|
||||
}
|
||||
|
||||
# Mock GoogleOAuthHandler
|
||||
mock_google_oauth_handler = mocker.patch("goose.toolkit.google_workspace.GoogleOAuthHandler")
|
||||
mock_credentials = mocker.MagicMock()
|
||||
mock_google_oauth_handler.return_value.get_credentials.return_value = mock_credentials
|
||||
|
||||
# Mock GmailClient
|
||||
mock_gmail_client = mocker.patch("goose.toolkit.google_workspace.GmailClient")
|
||||
mock_gmail_client.return_value.list_emails.return_value = "mock_emails"
|
||||
|
||||
# Call the method
|
||||
result = google_workspace_toolkit.list_emails()
|
||||
|
||||
# Assertions
|
||||
assert result == "mock_emails"
|
||||
mock_get_file_paths.assert_called_once()
|
||||
mock_google_oauth_handler.assert_called_once_with(
|
||||
"/mock/home/path/.config/goose/google_credentials.json",
|
||||
"/mock/home/path/.config/goose/google_oauth_token.json",
|
||||
["https://www.googleapis.com/auth/gmail.readonly", "https://www.googleapis.com/auth/calendar.readonly"],
|
||||
)
|
||||
mock_google_oauth_handler.return_value.get_credentials.assert_called_once()
|
||||
mock_gmail_client.assert_called_once_with(mock_credentials)
|
||||
mock_gmail_client.return_value.list_emails.assert_called_once()
|
||||
|
||||
|
||||
def test_todays_schedule(mocker, google_workspace_toolkit):
|
||||
mock_calendar_client = mocker.Mock()
|
||||
mock_calendar_client.list_events_for_today.return_value = [
|
||||
{
|
||||
"summary": "Test Event 1",
|
||||
"start": {"dateTime": "2023-05-01T09:00:00"},
|
||||
"end": {"dateTime": "2023-05-01T10:00:00"},
|
||||
},
|
||||
{
|
||||
"summary": "Test Event 2",
|
||||
"start": {"dateTime": "2023-05-01T14:00:00"},
|
||||
"end": {"dateTime": "2023-05-01T15:00:00"},
|
||||
},
|
||||
]
|
||||
mocker.patch("goose.toolkit.google_workspace.GoogleCalendarClient", return_value=mock_calendar_client)
|
||||
mocker.patch(
|
||||
"goose.toolkit.google_workspace.get_file_paths",
|
||||
return_value={"CLIENT_SECRETS_FILE": "mock_path", "TOKEN_FILE": "mock_path"},
|
||||
)
|
||||
mocker.patch("goose.toolkit.google_workspace.GoogleOAuthHandler")
|
||||
|
||||
result = google_workspace_toolkit.todays_schedule()
|
||||
|
||||
assert isinstance(result, list)
|
||||
assert len(result) == 2
|
||||
assert result[0]["summary"] == "Test Event 1"
|
||||
assert result[1]["summary"] == "Test Event 2"
|
||||
|
||||
|
||||
def test_list_calendars(mocker, google_workspace_toolkit):
|
||||
mock_calendar_client = mocker.Mock()
|
||||
mock_calendar_client.list_calendars.return_value = [
|
||||
{"summary": "Calendar 1", "id": "calendar1@example.com"},
|
||||
{"summary": "Calendar 2", "id": "calendar2@example.com"},
|
||||
]
|
||||
mocker.patch("goose.toolkit.google_workspace.GoogleCalendarClient", return_value=mock_calendar_client)
|
||||
mocker.patch(
|
||||
"goose.toolkit.google_workspace.get_file_paths",
|
||||
return_value={"CLIENT_SECRETS_FILE": "mock_path", "TOKEN_FILE": "mock_path"},
|
||||
)
|
||||
mocker.patch("goose.toolkit.google_workspace.GoogleOAuthHandler")
|
||||
|
||||
result = google_workspace_toolkit.list_calendars()
|
||||
|
||||
assert isinstance(result, list)
|
||||
assert len(result) == 2
|
||||
assert result[0]["summary"] == "Calendar 1"
|
||||
assert result[1]["summary"] == "Calendar 2"
|
||||
assert result[0]["id"] == "calendar1@example.com"
|
||||
assert result[1]["id"] == "calendar2@example.com"
|
||||
Reference in New Issue
Block a user