mirror of
https://github.com/getredash/redash.git
synced 2025-12-19 17:37:19 -05:00
Show an error message on "Test Connection" failure for Google Spreadsheet Query Runner (#6652)
This commit is contained in:
committed by
GitHub
parent
2b4b1cf7e3
commit
9bbdb4b765
@@ -23,6 +23,7 @@ logger = logging.getLogger(__name__)
|
||||
try:
|
||||
import google.auth
|
||||
import gspread
|
||||
from google.auth.exceptions import GoogleAuthError
|
||||
from google.oauth2.service_account import Credentials
|
||||
from gspread.exceptions import APIError
|
||||
from gspread.exceptions import WorksheetNotFound as GSWorksheetNotFound
|
||||
@@ -230,13 +231,17 @@ class GoogleSpreadsheet(BaseQueryRunner):
|
||||
return spreadsheetservice
|
||||
|
||||
def test_connection(self):
|
||||
service = self._get_spreadsheet_service()
|
||||
test_spreadsheet_key = "1S0mld7LMbUad8LYlo13Os9f7eNjw57MqVC0YiCd1Jis"
|
||||
try:
|
||||
service = self._get_spreadsheet_service()
|
||||
service.open_by_key(test_spreadsheet_key).worksheets()
|
||||
except APIError as e:
|
||||
logger.exception(e)
|
||||
message = parse_api_error(e)
|
||||
raise Exception(message)
|
||||
except GoogleAuthError as e:
|
||||
logger.exception(e)
|
||||
raise Exception(str(e))
|
||||
|
||||
def run_query(self, query, user):
|
||||
logger.debug("Spreadsheet is about to execute query: %s", query)
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
import datetime
|
||||
from unittest import TestCase
|
||||
|
||||
from mock import MagicMock
|
||||
import pytest
|
||||
from google.auth.exceptions import TransportError
|
||||
from gspread.exceptions import APIError
|
||||
from mock import MagicMock, patch
|
||||
|
||||
from redash.query_runner import TYPE_DATETIME, TYPE_FLOAT
|
||||
from redash.query_runner.google_spreadsheets import (
|
||||
TYPE_BOOLEAN,
|
||||
TYPE_STRING,
|
||||
GoogleSpreadsheet,
|
||||
WorksheetNotFoundByTitleError,
|
||||
WorksheetNotFoundError,
|
||||
_get_columns_and_column_names,
|
||||
@@ -171,3 +175,32 @@ class TestIsUrlKey(TestCase):
|
||||
|
||||
_key = "key|0"
|
||||
self.assertFalse(is_url_key(_key))
|
||||
|
||||
|
||||
class TestConnection(TestCase):
|
||||
@patch("redash.query_runner.google_spreadsheets.google.auth.default")
|
||||
@patch("redash.query_runner.google_spreadsheets.gspread.Client")
|
||||
def test_connect_succuess(self, mock_client, _mock_auth_default):
|
||||
try:
|
||||
qr_gspread = GoogleSpreadsheet({})
|
||||
qr_gspread.test_connection()
|
||||
mock_client().login.assert_called_once_with()
|
||||
mock_client().open_by_key.assert_called_once()
|
||||
except Exception:
|
||||
self.fail("test_connection failed")
|
||||
|
||||
@patch("redash.query_runner.google_spreadsheets.google.auth.default")
|
||||
def test_connect_fail_with_transport_error(self, mock_auth_default):
|
||||
mock_auth_default.side_effect = TransportError("Connection Refused")
|
||||
qr_gspread = GoogleSpreadsheet({})
|
||||
with pytest.raises(Exception):
|
||||
qr_gspread.test_connection()
|
||||
|
||||
@patch("redash.query_runner.google_spreadsheets.google.auth.default")
|
||||
def test_connect_fail_with_api_error(self, mock_auth_default):
|
||||
mock_response = MagicMock()
|
||||
mock_response.json.return_value = {"error": {"message": "Sheet API is disabled"}}
|
||||
mock_auth_default.side_effect = APIError(mock_response)
|
||||
qr_gspread = GoogleSpreadsheet({})
|
||||
with pytest.raises(Exception):
|
||||
qr_gspread.test_connection()
|
||||
|
||||
Reference in New Issue
Block a user