mirror of
https://github.com/getredash/redash.git
synced 2026-05-09 03:03:08 -04:00
* add last_active_at to users page * Use our JSON encoder as the SQLAlchemy JSON serializer. * Fixed some inconsistencies in the user query class methods. * Minor cosmetic fixes. * Add some make tasks for easier development. * Add user detail sync system based on Redis backend. There is a periodic Celery task that updates a new “details” JSONB column in the “user” table with the data from Redis. Currently this is only used for tracking the date of last activity of a user but can be extended with other user information later. Updates a few dependencies. * Normalize a few Flask extension API names. * Reduce implementation complexity of JSONEncoder. * Use request_started signal to make sure we have a request context. Otherwise loading the user based on the request won’t work. * Fix test that checks if disabled users can login. This correctly uses a URL path that includes the current organization and checks for the error message. The previous test seems to have been a red herring. * Minor cosmetic fixes. * Remove needs_sync in favor of just deleting things. * Misc review fixes. * Ignore line length. * Split redash.models import several modules. * Move walrus UTC DateTimeField into redash.models.types. * Restore distinctly loading dashboards. * Simplify default values for user details. * Define __repr__ methods generically. * Consistently have underscore methods at the top of model methods. * Fix tests. * Split redash.models import several modules. * Update to latest walrus and redis-py. * Update kombu to 4.2.2 for redis-py 3.x compatibility. * Remove redis-cli container after running Make task. * Move buffer condition after datetime/time conditions. * Update walrus to 0.7.1. * Refactor some query APIs. This uses the flask-sqlalchemy helpers consistently and makes more use of mixins. * Post rebase fixes. * Use correct kombu version * Fix migration down revision
70 lines
2.8 KiB
Python
70 lines
2.8 KiB
Python
#encoding: utf8
|
|
import datetime
|
|
|
|
from tests import BaseTestCase
|
|
|
|
from redash import models
|
|
from redash.utils import utcnow
|
|
|
|
|
|
class QueryResultTest(BaseTestCase):
|
|
def test_get_latest_returns_none_if_not_found(self):
|
|
found_query_result = models.QueryResult.get_latest(self.factory.data_source, "SELECT 1", 60)
|
|
self.assertIsNone(found_query_result)
|
|
|
|
def test_get_latest_returns_when_found(self):
|
|
qr = self.factory.create_query_result()
|
|
found_query_result = models.QueryResult.get_latest(qr.data_source, qr.query_text, 60)
|
|
|
|
self.assertEqual(qr, found_query_result)
|
|
|
|
def test_get_latest_doesnt_return_query_from_different_data_source(self):
|
|
qr = self.factory.create_query_result()
|
|
data_source = self.factory.create_data_source()
|
|
found_query_result = models.QueryResult.get_latest(data_source, qr.query_text, 60)
|
|
|
|
self.assertIsNone(found_query_result)
|
|
|
|
def test_get_latest_doesnt_return_if_ttl_expired(self):
|
|
yesterday = utcnow() - datetime.timedelta(days=1)
|
|
qr = self.factory.create_query_result(retrieved_at=yesterday)
|
|
|
|
found_query_result = models.QueryResult.get_latest(qr.data_source, qr.query_text, max_age=60)
|
|
|
|
self.assertIsNone(found_query_result)
|
|
|
|
def test_get_latest_returns_if_ttl_not_expired(self):
|
|
yesterday = utcnow() - datetime.timedelta(seconds=30)
|
|
qr = self.factory.create_query_result(retrieved_at=yesterday)
|
|
|
|
found_query_result = models.QueryResult.get_latest(qr.data_source, qr.query_text, max_age=120)
|
|
|
|
self.assertEqual(found_query_result, qr)
|
|
|
|
def test_get_latest_returns_the_most_recent_result(self):
|
|
yesterday = utcnow() - datetime.timedelta(seconds=30)
|
|
self.factory.create_query_result(retrieved_at=yesterday)
|
|
qr = self.factory.create_query_result()
|
|
|
|
found_query_result = models.QueryResult.get_latest(qr.data_source, qr.query_text, 60)
|
|
|
|
self.assertEqual(found_query_result.id, qr.id)
|
|
|
|
def test_get_latest_returns_the_last_cached_result_for_negative_ttl(self):
|
|
yesterday = utcnow() + datetime.timedelta(days=-100)
|
|
self.factory.create_query_result(retrieved_at=yesterday)
|
|
|
|
yesterday = utcnow() + datetime.timedelta(days=-1)
|
|
qr = self.factory.create_query_result(retrieved_at=yesterday)
|
|
found_query_result = models.QueryResult.get_latest(qr.data_source, qr.query_text, -1)
|
|
|
|
self.assertEqual(found_query_result.id, qr.id)
|
|
|
|
def test_store_result_does_not_modify_query_update_at(self):
|
|
original_updated_at = utcnow() - datetime.timedelta(hours=1)
|
|
query = self.factory.create_query(updated_at=original_updated_at)
|
|
|
|
models.QueryResult.store_result(query.org_id, query.data_source, query.query_hash, query.query_text, "", 0, utcnow())
|
|
|
|
self.assertEqual(original_updated_at, query.updated_at)
|