redash/tests/__init__.py

126 lines
3.5 KiB
Python
Raw Normal View History

import os
import datetime
import logging
from unittest import TestCase
from contextlib import contextmanager
2017-01-22 10:46:27 +00:00
os.environ['REDASH_REDIS_URL'] = os.environ.get('REDASH_REDIS_URL', "redis://localhost:6379/0").replace("/0", "/5")
2015-08-16 19:55:24 +00:00
# Use different url for Celery to avoid DB being cleaned up:
2017-01-22 10:46:27 +00:00
os.environ['REDASH_CELERY_BROKER'] = os.environ.get('REDASH_REDIS_URL', "redis://localhost:6379/0").replace("/5", "/6")
2015-08-16 19:55:24 +00:00
2015-12-26 21:19:37 +00:00
# Dummy values for oauth login
os.environ['REDASH_GOOGLE_CLIENT_ID'] = "dummy"
os.environ['REDASH_GOOGLE_CLIENT_SECRET'] = "dummy"
os.environ['REDASH_MULTI_ORG'] = "true"
2015-08-16 19:55:24 +00:00
from redash import create_app
from redash import redis_connection
2016-11-28 11:22:22 +00:00
from redash.models import db
from redash.utils import json_dumps, json_loads
from tests.factories import Factory, user_factory
logging.disable("INFO")
2015-12-27 07:43:36 +00:00
logging.getLogger("metrics").setLevel("ERROR")
2014-02-05 09:01:06 +00:00
def authenticate_request(c, user):
with c.session_transaction() as sess:
2018-12-10 10:27:39 +00:00
sess['user_id'] = user.get_id()
@contextmanager
def authenticated_user(c, user=None):
if not user:
user = user_factory.create()
2016-11-29 04:30:35 +00:00
db.session.commit()
authenticate_request(c, user)
yield user
2014-02-05 09:01:06 +00:00
class BaseTestCase(TestCase):
def setUp(self):
self.app = create_app()
2016-11-28 13:20:10 +00:00
self.db = db
self.app.config['TESTING'] = True
self.app.config['SERVER_NAME'] = 'localhost'
self.app_ctx = self.app.app_context()
self.app_ctx.push()
2016-11-29 04:30:35 +00:00
db.session.close()
2016-11-28 13:20:10 +00:00
db.drop_all()
2016-11-28 11:22:22 +00:00
db.create_all()
self.factory = Factory()
2016-11-28 11:22:22 +00:00
self.client = self.app.test_client()
2014-02-05 09:01:06 +00:00
def tearDown(self):
2016-11-28 11:22:22 +00:00
db.session.remove()
2016-11-28 13:20:10 +00:00
db.get_engine(self.app).dispose()
self.app_ctx.pop()
2015-03-30 08:05:20 +00:00
redis_connection.flushdb()
2015-03-22 12:42:06 +00:00
2016-11-29 04:30:35 +00:00
def make_request(self, method, path, org=None, user=None, data=None,
is_json=True, follow_redirects=False):
if user is None:
user = self.factory.user
if org is None:
org = self.factory.org
if org is not False:
path = "/{}{}".format(org.slug, path)
if user:
authenticate_request(self.client, user)
method_fn = getattr(self.client, method.lower())
headers = {}
if data and is_json:
data = json_dumps(data)
if is_json:
content_type = 'application/json'
else:
content_type = None
response = method_fn(
path,
data=data,
headers=headers,
content_type=content_type,
follow_redirects=follow_redirects,
)
if response.data and is_json:
response.json = json_loads(response.data)
return response
def get_request(self, path, org=None, headers=None):
if org:
path = "/{}{}".format(org.slug, path)
return self.client.get(path, headers=headers)
def post_request(self, path, data=None, org=None, headers=None):
if org:
path = "/{}{}".format(org.slug, path)
return self.client.post(path, data=data, headers=headers)
2015-03-22 12:42:06 +00:00
def assertResponseEqual(self, expected, actual):
for k, v in expected.iteritems():
if isinstance(v, datetime.datetime) or isinstance(actual[k],
datetime.datetime):
2015-03-22 12:42:06 +00:00
continue
if isinstance(v, list):
continue
if isinstance(v, dict):
self.assertResponseEqual(v, actual[k])
continue
self.assertEqual(v, actual[k], "{} not equal (expected: {}, actual: {}).".format(k, v, actual[k]))