mirror of
https://github.com/getredash/redash.git
synced 2026-03-22 10:00:17 -04:00
* Added support for Apache Drill datasource * Improvements in `Drill` query runner and minor refactoring 1. Drill query runner now inherits from `BaseHTTPQueryRunner`, because they both have a lot of common code. 2. `BaseHTTPQueryRunner.get_response` method now accepts `http_method` argument (original implementation was only capable of sending `GET` HTTP requests). 3. Added `order` to `BaseHTTPRequestRunner` configuration schema to fix order of UI elements based on the schema. 4. Eliminated duplicate method `_guess_type` in `GoogleSpreadsheet`, `Results` and `Drill` query runners, moved `guess_type` to `redash.query_runner`. 5. Removed tests for `_guess_type` in `GoogleSpreadsheet`, `Results` and `Drill` query runners, merged them into single test case and moved to `tests.query_runner.test_utils`. 6. Various minor changes (code style, imports, etc).
137 lines
5.0 KiB
Python
137 lines
5.0 KiB
Python
import mock
|
|
from unittest import TestCase
|
|
|
|
import requests
|
|
from redash.query_runner import BaseHTTPQueryRunner
|
|
|
|
|
|
class RequiresAuthQueryRunner(BaseHTTPQueryRunner):
|
|
requires_authentication = True
|
|
|
|
|
|
class TestBaseHTTPQueryRunner(TestCase):
|
|
|
|
def test_requires_authentication_default(self):
|
|
self.assertFalse(BaseHTTPQueryRunner.requires_authentication)
|
|
schema = BaseHTTPQueryRunner.configuration_schema()
|
|
self.assertNotIn('username', schema['required'])
|
|
self.assertNotIn('password', schema['required'])
|
|
|
|
def test_requires_authentication_true(self):
|
|
schema = RequiresAuthQueryRunner.configuration_schema()
|
|
self.assertIn('username', schema['required'])
|
|
self.assertIn('password', schema['required'])
|
|
|
|
def test_get_auth_with_values(self):
|
|
query_runner = BaseHTTPQueryRunner({
|
|
'username': 'username',
|
|
'password': 'password'
|
|
})
|
|
self.assertEqual(query_runner.get_auth(), ('username', 'password'))
|
|
|
|
def test_get_auth_empty(self):
|
|
query_runner = BaseHTTPQueryRunner({})
|
|
self.assertIsNone(query_runner.get_auth())
|
|
|
|
def test_get_auth_empty_requires_authentication(self):
|
|
query_runner = RequiresAuthQueryRunner({})
|
|
self.assertRaisesRegexp(
|
|
ValueError,
|
|
"Username and Password required",
|
|
query_runner.get_auth
|
|
)
|
|
|
|
@mock.patch('requests.request')
|
|
def test_get_response_success(self, mock_get):
|
|
mock_response = mock.Mock()
|
|
mock_response.status_code = 200
|
|
mock_response.text = "Success"
|
|
mock_get.return_value = mock_response
|
|
|
|
url = 'https://example.com/'
|
|
query_runner = BaseHTTPQueryRunner({})
|
|
response, error = query_runner.get_response(url)
|
|
mock_get.assert_called_once_with('get', url, auth=None)
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertIsNone(error)
|
|
|
|
@mock.patch('requests.request')
|
|
def test_get_response_success_custom_auth(self, mock_get):
|
|
mock_response = mock.Mock()
|
|
mock_response.status_code = 200
|
|
mock_response.text = "Success"
|
|
mock_get.return_value = mock_response
|
|
|
|
url = 'https://example.com/'
|
|
query_runner = BaseHTTPQueryRunner({})
|
|
auth = ('username', 'password')
|
|
response, error = query_runner.get_response(url, auth=auth)
|
|
mock_get.assert_called_once_with('get', url, auth=auth)
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertIsNone(error)
|
|
|
|
@mock.patch('requests.request')
|
|
def test_get_response_failure(self, mock_get):
|
|
mock_response = mock.Mock()
|
|
mock_response.status_code = 301
|
|
mock_response.text = "Redirect"
|
|
mock_get.return_value = mock_response
|
|
|
|
url = 'https://example.com/'
|
|
query_runner = BaseHTTPQueryRunner({})
|
|
response, error = query_runner.get_response(url)
|
|
mock_get.assert_called_once_with('get', url, auth=None)
|
|
self.assertIn(query_runner.response_error, error)
|
|
|
|
@mock.patch('requests.request')
|
|
def test_get_response_httperror_exception(self, mock_get):
|
|
mock_response = mock.Mock()
|
|
mock_response.status_code = 500
|
|
mock_response.text = "Server Error"
|
|
http_error = requests.HTTPError()
|
|
mock_response.raise_for_status.side_effect = http_error
|
|
mock_get.return_value = mock_response
|
|
|
|
url = 'https://example.com/'
|
|
query_runner = BaseHTTPQueryRunner({})
|
|
response, error = query_runner.get_response(url)
|
|
mock_get.assert_called_once_with('get', url, auth=None)
|
|
self.assertIsNotNone(error)
|
|
self.assertIn("Failed to execute query", error)
|
|
|
|
@mock.patch('requests.request')
|
|
def test_get_response_requests_exception(self, mock_get):
|
|
mock_response = mock.Mock()
|
|
mock_response.status_code = 500
|
|
mock_response.text = "Server Error"
|
|
exception_message = "Some requests exception"
|
|
requests_exception = requests.RequestException(exception_message)
|
|
mock_response.raise_for_status.side_effect = requests_exception
|
|
mock_get.return_value = mock_response
|
|
|
|
url = 'https://example.com/'
|
|
query_runner = BaseHTTPQueryRunner({})
|
|
response, error = query_runner.get_response(url)
|
|
mock_get.assert_called_once_with('get', url, auth=None)
|
|
self.assertIsNotNone(error)
|
|
self.assertEqual(exception_message, error)
|
|
|
|
@mock.patch('requests.request')
|
|
def test_get_response_generic_exception(self, mock_get):
|
|
mock_response = mock.Mock()
|
|
mock_response.status_code = 500
|
|
mock_response.text = "Server Error"
|
|
exception_message = "Some generic exception"
|
|
exception = ValueError(exception_message)
|
|
mock_response.raise_for_status.side_effect = exception
|
|
mock_get.return_value = mock_response
|
|
|
|
url = 'https://example.com/'
|
|
query_runner = BaseHTTPQueryRunner({})
|
|
self.assertRaisesRegexp(
|
|
ValueError,
|
|
exception_message,
|
|
query_runner.get_response,
|
|
url
|
|
)
|