mirror of
https://github.com/getredash/redash.git
synced 2025-12-19 17:37:19 -05:00
Removed pseudojson class, converted all options and other json columns to jsonb ones (#6687)
Co-authored-by: Andrew Chubatiuk <andrew.chubatiuk@motional.com>
This commit is contained in:
@@ -70,7 +70,7 @@ dashboard_factory = ModelFactory(
|
||||
redash.models.Dashboard,
|
||||
name="test",
|
||||
user=user_factory.create,
|
||||
layout="[]",
|
||||
layout=[],
|
||||
is_draft=False,
|
||||
org=1,
|
||||
)
|
||||
@@ -122,7 +122,7 @@ alert_factory = ModelFactory(
|
||||
|
||||
query_result_factory = ModelFactory(
|
||||
redash.models.QueryResult,
|
||||
data='{"columns":{}, "rows":[]}',
|
||||
data={"columns": {}, "rows": []},
|
||||
runtime=1,
|
||||
retrieved_at=utcnow,
|
||||
query_text="SELECT 1",
|
||||
@@ -137,13 +137,13 @@ visualization_factory = ModelFactory(
|
||||
query_rel=query_factory.create,
|
||||
name="Chart",
|
||||
description="",
|
||||
options="{}",
|
||||
options={},
|
||||
)
|
||||
|
||||
widget_factory = ModelFactory(
|
||||
redash.models.Widget,
|
||||
width=1,
|
||||
options="{}",
|
||||
options={},
|
||||
dashboard=dashboard_factory.create,
|
||||
visualization=visualization_factory.create,
|
||||
)
|
||||
|
||||
@@ -74,7 +74,7 @@ class TestDashboardResourceGet(BaseTestCase):
|
||||
vis = self.factory.create_visualization(query_rel=query)
|
||||
restricted_widget = self.factory.create_widget(visualization=vis, dashboard=dashboard)
|
||||
widget = self.factory.create_widget(dashboard=dashboard)
|
||||
dashboard.layout = "[[{}, {}]]".format(widget.id, restricted_widget.id)
|
||||
dashboard.layout = [[widget.id, restricted_widget.id]]
|
||||
db.session.commit()
|
||||
|
||||
rv = self.make_request("get", "/api/dashboards/{0}".format(dashboard.id))
|
||||
@@ -94,7 +94,7 @@ class TestDashboardResourcePost(BaseTestCase):
|
||||
rv = self.make_request(
|
||||
"post",
|
||||
"/api/dashboards/{0}".format(d.id),
|
||||
data={"name": new_name, "layout": "[]"},
|
||||
data={"name": new_name, "layout": []},
|
||||
)
|
||||
self.assertEqual(rv.status_code, 200)
|
||||
self.assertEqual(rv.json["name"], new_name)
|
||||
@@ -107,7 +107,7 @@ class TestDashboardResourcePost(BaseTestCase):
|
||||
rv = self.make_request(
|
||||
"post",
|
||||
"/api/dashboards/{0}".format(d.id),
|
||||
data={"name": new_name, "layout": "[]", "version": d.version - 1},
|
||||
data={"name": new_name, "layout": [], "version": d.version - 1},
|
||||
)
|
||||
|
||||
self.assertEqual(rv.status_code, 409)
|
||||
@@ -120,7 +120,7 @@ class TestDashboardResourcePost(BaseTestCase):
|
||||
rv = self.make_request(
|
||||
"post",
|
||||
"/api/dashboards/{0}".format(d.id),
|
||||
data={"name": new_name, "layout": "[]"},
|
||||
data={"name": new_name, "layout": []},
|
||||
)
|
||||
|
||||
self.assertEqual(rv.status_code, 200)
|
||||
@@ -133,7 +133,7 @@ class TestDashboardResourcePost(BaseTestCase):
|
||||
rv = self.make_request(
|
||||
"post",
|
||||
"/api/dashboards/{0}".format(d.id),
|
||||
data={"name": new_name, "layout": "[]", "version": d.version},
|
||||
data={"name": new_name, "layout": [], "version": d.version},
|
||||
user=user,
|
||||
)
|
||||
self.assertEqual(rv.status_code, 403)
|
||||
@@ -143,7 +143,7 @@ class TestDashboardResourcePost(BaseTestCase):
|
||||
rv = self.make_request(
|
||||
"post",
|
||||
"/api/dashboards/{0}".format(d.id),
|
||||
data={"name": new_name, "layout": "[]", "version": d.version},
|
||||
data={"name": new_name, "layout": [], "version": d.version},
|
||||
user=user,
|
||||
)
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from redash.handlers.query_results import error_messages, run_query
|
||||
from redash.models import db
|
||||
from redash.utils import json_dumps
|
||||
from tests import BaseTestCase
|
||||
|
||||
|
||||
@@ -362,7 +361,7 @@ class TestQueryDropdownsResource(BaseTestCase):
|
||||
|
||||
query_result = self.factory.create_query_result()
|
||||
data = {"rows": [], "columns": [{"name": "whatever"}]}
|
||||
query_result = self.factory.create_query_result(data=json_dumps(data))
|
||||
query_result = self.factory.create_query_result(data=data)
|
||||
unrelated_dropdown_query = self.factory.create_query(latest_query_data=query_result)
|
||||
|
||||
# unrelated_dropdown_query has not been associated with query
|
||||
@@ -378,7 +377,7 @@ class TestQueryDropdownsResource(BaseTestCase):
|
||||
def test_allows_access_if_associated_and_has_access_to_parent(self):
|
||||
query_result = self.factory.create_query_result()
|
||||
data = {"rows": [], "columns": [{"name": "whatever"}]}
|
||||
query_result = self.factory.create_query_result(data=json_dumps(data))
|
||||
query_result = self.factory.create_query_result(data=data)
|
||||
dropdown_query = self.factory.create_query(latest_query_data=query_result)
|
||||
|
||||
options = {"parameters": [{"name": "param", "type": "query", "queryId": dropdown_query.id}]}
|
||||
@@ -423,7 +422,7 @@ class TestQueryResultExcelResponse(BaseTestCase):
|
||||
"rows": [{"test": 1}, {"test": 2, "test2": 3}],
|
||||
"columns": [{"name": "test"}, {"name": "test2"}],
|
||||
}
|
||||
query_result = self.factory.create_query_result(data=json_dumps(data))
|
||||
query_result = self.factory.create_query_result(data=data)
|
||||
|
||||
rv = self.make_request(
|
||||
"get",
|
||||
|
||||
@@ -2,7 +2,6 @@ import textwrap
|
||||
from unittest import TestCase
|
||||
|
||||
from redash.models import OPERATORS, Alert, db, next_state
|
||||
from redash.utils import json_dumps
|
||||
from tests import BaseTestCase
|
||||
|
||||
|
||||
@@ -43,7 +42,7 @@ class TestAlertAll(BaseTestCase):
|
||||
|
||||
|
||||
def get_results(value):
|
||||
return json_dumps({"rows": [{"foo": value}], "columns": [{"name": "foo", "type": "STRING"}]})
|
||||
return {"rows": [{"foo": value}], "columns": [{"name": "foo", "type": "STRING"}]}
|
||||
|
||||
|
||||
class TestAlertEvaluate(BaseTestCase):
|
||||
@@ -66,7 +65,7 @@ class TestAlertEvaluate(BaseTestCase):
|
||||
self.assertEqual(alert.evaluate(), Alert.UNKNOWN_STATE)
|
||||
|
||||
def test_evaluate_return_unknown_when_empty_results(self):
|
||||
results = json_dumps({"rows": [], "columns": [{"name": "foo", "type": "STRING"}]})
|
||||
results = {"rows": [], "columns": [{"name": "foo", "type": "STRING"}]}
|
||||
alert = self.create_alert(results)
|
||||
self.assertEqual(alert.evaluate(), Alert.UNKNOWN_STATE)
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ class DashboardTest(BaseTestCase):
|
||||
widget1 = self.factory.create_widget(visualization=vis1, dashboard=dashboard)
|
||||
widget2 = self.factory.create_widget(visualization=vis2, dashboard=dashboard)
|
||||
widget3 = self.factory.create_widget(visualization=vis3, dashboard=dashboard)
|
||||
dashboard.layout = "[[{}, {}, {}]]".format(widget1.id, widget2.id, widget3.id)
|
||||
dashboard.layout = [[widget1.id, widget2.id, widget3.id]]
|
||||
db.session.commit()
|
||||
return dashboard
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@ class QueryTest(BaseTestCase):
|
||||
q2 = self.factory.create_query(name="Testing searching")
|
||||
q3 = self.factory.create_query(name="Testing finding")
|
||||
|
||||
queries = list(Query.search("(testing search) or finding", [self.factory.default_group.id]))
|
||||
queries = list(Query.search("testing (search or finding)", [self.factory.default_group.id]))
|
||||
self.assertIn(q1, queries)
|
||||
self.assertIn(q2, queries)
|
||||
self.assertIn(q3, queries)
|
||||
@@ -373,16 +373,26 @@ class TestQueryFork(BaseTestCase):
|
||||
query = self.factory.create_query(data_source=data_source, description="this is description")
|
||||
|
||||
# create default TABLE - query factory does not create it
|
||||
self.factory.create_visualization(query_rel=query, name="Table", description="", type="TABLE", options="{}")
|
||||
self.factory.create_visualization(query_rel=query, name="Table", description="", type="TABLE", options={})
|
||||
|
||||
visualization_chart = self.factory.create_visualization(
|
||||
query_rel=query,
|
||||
description="chart vis",
|
||||
type="CHART",
|
||||
options="""{"yAxis": [{"type": "linear"}, {"type": "linear", "opposite": true}], "series": {"stacking": null}, "globalSeriesType": "line", "sortX": true, "seriesOptions": {"count": {"zIndex": 0, "index": 0, "type": "line", "yAxis": 0}}, "xAxis": {"labels": {"enabled": true}, "type": "datetime"}, "columnMapping": {"count": "y", "created_at": "x"}, "bottomMargin": 50, "legend": {"enabled": true}}""",
|
||||
options={
|
||||
"yAxis": [{"type": "linear"}, {"type": "linear", "opposite": True}],
|
||||
"series": {"stacking": None},
|
||||
"globalSeriesType": "line",
|
||||
"sortX": True,
|
||||
"seriesOptions": {"count": {"zIndex": 0, "index": 0, "type": "line", "yAxis": 0}},
|
||||
"xAxis": {"labels": {"enabled": True}, "type": "datetime"},
|
||||
"columnMapping": {"count": "y", "created_at": "x"},
|
||||
"bottomMargin": 50,
|
||||
"legend": {"enabled": True},
|
||||
},
|
||||
)
|
||||
visualization_box = self.factory.create_visualization(
|
||||
query_rel=query, description="box vis", type="BOXPLOT", options="{}"
|
||||
query_rel=query, description="box vis", type="BOXPLOT", options={}
|
||||
)
|
||||
fork_user = self.factory.create_user()
|
||||
forked_query = query.fork(fork_user)
|
||||
@@ -417,7 +427,7 @@ class TestQueryFork(BaseTestCase):
|
||||
self.assertEqual(count_table, 1)
|
||||
self.assertEqual(forked_table.name, "Table")
|
||||
self.assertEqual(forked_table.description, "")
|
||||
self.assertEqual(forked_table.options, "{}")
|
||||
self.assertEqual(forked_table.options, {})
|
||||
|
||||
def test_fork_from_query_that_has_no_visualization(self):
|
||||
# prepare original query and visualizations
|
||||
@@ -425,7 +435,7 @@ class TestQueryFork(BaseTestCase):
|
||||
query = self.factory.create_query(data_source=data_source, description="this is description")
|
||||
|
||||
# create default TABLE - query factory does not create it
|
||||
self.factory.create_visualization(query_rel=query, name="Table", description="", type="TABLE", options="{}")
|
||||
self.factory.create_visualization(query_rel=query, name="Table", description="", type="TABLE", options={})
|
||||
|
||||
fork_user = self.factory.create_user()
|
||||
|
||||
@@ -457,7 +467,7 @@ class TestQueryUpdateLatestResult(BaseTestCase):
|
||||
self.query_hash = gen_query_hash(self.query)
|
||||
self.runtime = 123
|
||||
self.utcnow = utcnow()
|
||||
self.data = "data"
|
||||
self.data = {"columns": {}, "rows": []}
|
||||
|
||||
def test_updates_existing_queries(self):
|
||||
query1 = self.factory.create_query(query_text=self.query)
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
import datetime
|
||||
from unittest import TestCase
|
||||
|
||||
from mock import patch
|
||||
|
||||
from redash import models
|
||||
from redash.models import DBPersistence
|
||||
from redash.utils import utcnow
|
||||
from tests import BaseTestCase
|
||||
|
||||
@@ -71,28 +67,9 @@ class QueryResultTest(BaseTestCase):
|
||||
query.data_source,
|
||||
query.query_hash,
|
||||
query.query_text,
|
||||
"",
|
||||
{},
|
||||
0,
|
||||
utcnow(),
|
||||
)
|
||||
|
||||
self.assertEqual(original_updated_at, query.updated_at)
|
||||
|
||||
|
||||
class TestDBPersistence(TestCase):
|
||||
def test_updating_data_removes_cached_result(self):
|
||||
p = DBPersistence()
|
||||
p.data = '{"test": 1}'
|
||||
self.assertDictEqual(p.data, {"test": 1})
|
||||
p.data = '{"test": 2}'
|
||||
self.assertDictEqual(p.data, {"test": 2})
|
||||
|
||||
@patch("redash.models.json_loads")
|
||||
def test_calls_json_loads_only_once(self, json_loads_patch):
|
||||
json_loads_patch.return_value = "1"
|
||||
p = DBPersistence()
|
||||
json_data = '{"test": 1}'
|
||||
p.data = json_data
|
||||
a = p.data # noqa
|
||||
b = p.data # noqa
|
||||
json_loads_patch.assert_called_once_with(json_data)
|
||||
|
||||
@@ -87,7 +87,7 @@ class TestClickHouse(TestCase):
|
||||
|
||||
self.assertIsNone(error)
|
||||
self.assertEqual(
|
||||
json.loads(data),
|
||||
data,
|
||||
{
|
||||
"columns": [
|
||||
{"name": "1", "friendly_name": "1", "type": TYPE_INTEGER},
|
||||
@@ -139,7 +139,7 @@ SELECT * FROM test;
|
||||
|
||||
self.assertIsNone(error)
|
||||
self.assertEqual(
|
||||
json.loads(data),
|
||||
data,
|
||||
{
|
||||
"columns": [
|
||||
{"name": "1", "friendly_name": "1", "type": TYPE_INTEGER},
|
||||
|
||||
@@ -2,7 +2,6 @@ from unittest.mock import patch
|
||||
|
||||
from redash.query_runner import TYPE_INTEGER, TYPE_STRING
|
||||
from redash.query_runner.e6data import e6data
|
||||
from redash.utils import json_dumps
|
||||
|
||||
runner = e6data(
|
||||
{
|
||||
@@ -28,15 +27,13 @@ def test_run_query(mock_cursor):
|
||||
|
||||
json_data, error = runner.run_query(query, user)
|
||||
|
||||
expected_json_data = json_dumps(
|
||||
{
|
||||
"columns": [
|
||||
{"name": "id", "type": TYPE_INTEGER},
|
||||
{"name": "name", "type": TYPE_STRING},
|
||||
],
|
||||
"rows": [{"id": 1, "name": "John"}],
|
||||
}
|
||||
)
|
||||
expected_json_data = {
|
||||
"columns": [
|
||||
{"name": "id", "type": TYPE_INTEGER},
|
||||
{"name": "name", "type": TYPE_STRING},
|
||||
],
|
||||
"rows": [{"id": 1, "name": "John"}],
|
||||
}
|
||||
|
||||
assert json_data == expected_json_data
|
||||
|
||||
@@ -50,7 +47,7 @@ def test_test_connection(mock_cursor):
|
||||
|
||||
json_data, error = runner.run_query(query, user)
|
||||
|
||||
expected_json_data = json_dumps({"columns": [{"name": "EXPR$0", "type": TYPE_INTEGER}], "rows": [{"EXPR$0": 1}]})
|
||||
expected_json_data = {"columns": [{"name": "EXPR$0", "type": TYPE_INTEGER}], "rows": [{"EXPR$0": 1}]}
|
||||
|
||||
assert json_data == expected_json_data
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import json
|
||||
|
||||
from influxdb.resultset import ResultSet
|
||||
|
||||
from redash.query_runner import (
|
||||
@@ -40,7 +38,7 @@ def test_influxdb_result_types_with_rows():
|
||||
{"k1": "bar", "time": "2023-10-06T13:31:08.882953339Z", "v1": 0.6, "v2": 4},
|
||||
],
|
||||
}
|
||||
assert json.loads(transformed) == expected
|
||||
assert transformed == expected
|
||||
|
||||
|
||||
def test_influxdb_result_types_with_no_rows_are_string():
|
||||
@@ -55,4 +53,4 @@ def test_influxdb_result_types_with_no_rows_are_string():
|
||||
],
|
||||
"rows": [],
|
||||
}
|
||||
assert json.loads(transformed) == expected
|
||||
assert transformed == expected
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import json
|
||||
|
||||
import mock
|
||||
import pytest
|
||||
from influxdb_client.client.flux_table import (
|
||||
@@ -277,10 +275,8 @@ class TestInfluxDBv2:
|
||||
@mock.patch("redash.query_runner.influx_db_v2.InfluxDBClient")
|
||||
@mock.patch("redash.query_runner.influx_db_v2.InfluxDBv2." "_cleanup_cert_files")
|
||||
@mock.patch("redash.query_runner.influx_db_v2.logger")
|
||||
@mock.patch("redash.query_runner.influx_db_v2.json_dumps")
|
||||
def test_run_query(
|
||||
self,
|
||||
json_dumps_mock: mock.MagicMock,
|
||||
logger_mock: mock.MagicMock,
|
||||
cleanup_cert_files_mock: mock.MagicMock,
|
||||
influx_db_client_mock: mock.MagicMock,
|
||||
@@ -310,28 +306,24 @@ class TestInfluxDBv2:
|
||||
],
|
||||
"rows": [{"col_1": "col_value_1", "col_2": 1}, {"col_1": "col_value_2", "col_2": 2}, {"col_3": 3.0}],
|
||||
}
|
||||
json_dumps_data = json.dumps(result_data)
|
||||
|
||||
query_mock = influx_db_client_mock.return_value.__enter__().query_api().query
|
||||
query_mock.return_value = influx_table_list
|
||||
json_dumps_mock.return_value = json_dumps_data
|
||||
|
||||
# 1. case: successful query data
|
||||
data, error = influx_db_v2.run_query(query, "user")
|
||||
|
||||
assert data == json_dumps_data
|
||||
assert data == result_data
|
||||
assert error is None
|
||||
|
||||
influx_db_client_mock.assert_called_once_with(url="url", token="token", org="org", **influx_kwargs)
|
||||
logger_mock.debug.assert_called_once_with(f"InfluxDB got query: {query!r}")
|
||||
query_mock.assert_called_once_with(query)
|
||||
json_dumps_mock.assert_called_once_with(result_data)
|
||||
cleanup_cert_files_mock.assert_called_once_with(influx_kwargs)
|
||||
|
||||
influx_db_client_mock.reset_mock()
|
||||
logger_mock.reset_mock()
|
||||
query_mock.reset_mock()
|
||||
json_dumps_mock.reset_mock()
|
||||
cleanup_cert_files_mock.reset_mock()
|
||||
|
||||
# 2. case: unsuccessful query data
|
||||
@@ -344,5 +336,4 @@ class TestInfluxDBv2:
|
||||
influx_db_client_mock.assert_called_once_with(url="url", token="token", org="org", **influx_kwargs)
|
||||
logger_mock.debug.assert_called_once_with(f"InfluxDB got query: {query!r}")
|
||||
query_mock.assert_called_once_with(query)
|
||||
json_dumps_mock.assert_not_called()
|
||||
cleanup_cert_files_mock.assert_called_once_with(influx_kwargs)
|
||||
|
||||
@@ -5,7 +5,6 @@ from unittest import TestCase
|
||||
import mock
|
||||
|
||||
from redash.query_runner.prometheus import Prometheus, get_instant_rows, get_range_rows
|
||||
from redash.utils import json_dumps
|
||||
|
||||
|
||||
class TestPrometheus(TestCase):
|
||||
@@ -350,7 +349,7 @@ class TestPrometheus(TestCase):
|
||||
{"friendly_name": "foo_bar", "type": "string", "name": "foo_bar"},
|
||||
]
|
||||
|
||||
data_expected = json_dumps({"rows": rows, "columns": columns})
|
||||
data_expected = {"rows": rows, "columns": columns}
|
||||
|
||||
requests_get_mock.return_value = mock.Mock(
|
||||
json=mock.Mock(return_value={"data": {"result": self.instant_query_result}})
|
||||
@@ -424,7 +423,7 @@ class TestPrometheus(TestCase):
|
||||
{"friendly_name": "foo_bar", "type": "string", "name": "foo_bar"},
|
||||
]
|
||||
|
||||
data_expected = json_dumps({"rows": rows, "columns": columns})
|
||||
data_expected = {"rows": rows, "columns": columns}
|
||||
|
||||
requests_get_mock.return_value = mock.Mock(
|
||||
json=mock.Mock(return_value={"data": {"result": self.range_query_result}})
|
||||
@@ -490,7 +489,7 @@ class TestPrometheus(TestCase):
|
||||
{"friendly_name": "foo_bar", "type": "string", "name": "foo_bar"},
|
||||
]
|
||||
|
||||
data_expected = json_dumps({"rows": rows, "columns": columns})
|
||||
data_expected = {"rows": rows, "columns": columns}
|
||||
|
||||
now_datetime = datetime(2023, 12, 12, 11, 00, 00)
|
||||
end_timestamp_expected = int(time.mktime(now_datetime.timetuple()))
|
||||
|
||||
@@ -15,7 +15,7 @@ class TestPythonQueryRunner(TestCase):
|
||||
query_string = "print('test')"
|
||||
mock_dt.utcnow = mock.Mock(return_value=datetime(1901, 12, 21))
|
||||
result = self.python.run_query(query_string, "user")
|
||||
self.assertEqual(result[0], '{"rows": [], "columns": [], "log": ["[1901-12-21T00:00:00] test"]}')
|
||||
self.assertEqual(result[0], {"rows": [], "columns": [], "log": ["[1901-12-21T00:00:00] test"]})
|
||||
|
||||
def test_empty_result(self):
|
||||
query_string = "result={}"
|
||||
@@ -68,11 +68,11 @@ class TestPythonQueryRunner(TestCase):
|
||||
result = self.python.run_query(query_string, "user")
|
||||
self.assertEqual(
|
||||
result[0],
|
||||
'{"columns": [{"name": "col1", "type": "string"},'
|
||||
' {"name": "col2", "type": "integer"}],'
|
||||
' "rows": [{"col1": "foo", "col2": 100},'
|
||||
' {"col1": "bar", "col2": 200}],'
|
||||
' "log": []}',
|
||||
{
|
||||
"columns": [{"name": "col1", "type": "string"}, {"name": "col2", "type": "integer"}],
|
||||
"rows": [{"col1": "foo", "col2": 100}, {"col1": "bar", "col2": 200}],
|
||||
"log": [],
|
||||
},
|
||||
)
|
||||
|
||||
@mock.patch("datetime.datetime")
|
||||
@@ -89,11 +89,11 @@ class TestPythonQueryRunner(TestCase):
|
||||
result = self.python.run_query(query_string, "user")
|
||||
self.assertEqual(
|
||||
result[0],
|
||||
'{"columns": [{"name": "col1", "type": "string"},'
|
||||
' {"name": "col2", "type": "integer"}],'
|
||||
' "rows": [{"col1": "foo", "col2": 100},'
|
||||
' {"col1": "bar", "col2": 200}],'
|
||||
' "log": ["[1901-12-21T00:00:00] test"]}',
|
||||
{
|
||||
"columns": [{"name": "col1", "type": "string"}, {"name": "col2", "type": "integer"}],
|
||||
"rows": [{"col1": "foo", "col2": 100}, {"col1": "bar", "col2": 200}],
|
||||
"log": ["[1901-12-21T00:00:00] test"],
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@ from redash.query_runner.query_results import (
|
||||
prepare_parameterized_query,
|
||||
replace_query_parameters,
|
||||
)
|
||||
from redash.utils import json_dumps
|
||||
from tests import BaseTestCase
|
||||
|
||||
|
||||
@@ -235,5 +234,5 @@ class TestGetQueryResult(BaseTestCase):
|
||||
|
||||
with mock.patch.object(PostgreSQL, "run_query") as qr:
|
||||
query_result_data = {"columns": [], "rows": []}
|
||||
qr.return_value = (json_dumps(query_result_data), None)
|
||||
qr.return_value = (query_result_data, None)
|
||||
self.assertEqual(query_result_data, get_query_results(self.factory.user, query.id, False))
|
||||
|
||||
@@ -83,7 +83,7 @@ class TestTinybird(TestCase):
|
||||
|
||||
self.assertIsNone(error)
|
||||
self.assertEqual(
|
||||
json.loads(data),
|
||||
data,
|
||||
{
|
||||
"columns": [
|
||||
{"name": "string_attribute", "friendly_name": "string_attribute", "type": TYPE_STRING},
|
||||
|
||||
@@ -28,7 +28,16 @@ class TestTrino(TestCase):
|
||||
|
||||
def _assert_schema_catalog(self, mock_run_query, mock__get_catalogs, runner):
|
||||
mock_run_query.return_value = (
|
||||
f'{{"rows": [{{"table_schema": "{TestTrino.schema_name}", "table_name": "{TestTrino.table_name}", "column_name": "{TestTrino.column_name}", "data_type": "{TestTrino.column_type}"}}]}}',
|
||||
{
|
||||
"rows": [
|
||||
{
|
||||
"table_schema": TestTrino.schema_name,
|
||||
"table_name": TestTrino.table_name,
|
||||
"column_name": TestTrino.column_name,
|
||||
"data_type": TestTrino.column_type,
|
||||
}
|
||||
]
|
||||
},
|
||||
None,
|
||||
)
|
||||
mock__get_catalogs.return_value = [TestTrino.catalog_name]
|
||||
@@ -36,14 +45,14 @@ class TestTrino(TestCase):
|
||||
expected_schema = [
|
||||
{
|
||||
"name": f"{TestTrino.catalog_name}.{TestTrino.schema_name}.{TestTrino.table_name}",
|
||||
"columns": [{"name": f"{TestTrino.column_name}", "type": f"{TestTrino.column_type}"}],
|
||||
"columns": [{"name": TestTrino.column_name, "type": TestTrino.column_type}],
|
||||
}
|
||||
]
|
||||
self.assertEqual(schema, expected_schema)
|
||||
|
||||
@patch.object(Trino, "run_query")
|
||||
def test__get_catalogs(self, mock_run_query):
|
||||
mock_run_query.return_value = (f'{{"rows": [{{"Catalog": "{TestTrino.catalog_name}"}}]}}', None)
|
||||
mock_run_query.return_value = ({"rows": [{"Catalog": TestTrino.catalog_name}]}, None)
|
||||
runner = Trino({})
|
||||
catalogs = runner._get_catalogs()
|
||||
expected_catalogs = [TestTrino.catalog_name]
|
||||
|
||||
@@ -4,7 +4,6 @@ from unittest import mock
|
||||
import yaml
|
||||
|
||||
from redash.query_runner.yandex_disk import enabled
|
||||
from redash.utils import json_dumps
|
||||
|
||||
if enabled:
|
||||
import pandas as pd
|
||||
@@ -114,22 +113,20 @@ def test_run_query(mocked_requests, mock_yandex_disk):
|
||||
mock_readers = EXTENSIONS_READERS.copy()
|
||||
mock_readers["csv"] = mock_ext_readers_return
|
||||
|
||||
expected_data = json_dumps(
|
||||
{
|
||||
"columns": [
|
||||
{"name": "id", "friendly_name": "id", "type": "integer"},
|
||||
{"name": "name", "friendly_name": "name", "type": "string"},
|
||||
{"name": "age", "friendly_name": "age", "type": "integer"},
|
||||
],
|
||||
"rows": [
|
||||
{"id": 1, "name": "Alice", "age": 20},
|
||||
{"id": 2, "name": "Bob", "age": 21},
|
||||
{"id": 3, "name": "Charlie", "age": 22},
|
||||
{"id": 4, "name": "Dave", "age": 23},
|
||||
{"id": 5, "name": "Eve", "age": 24},
|
||||
],
|
||||
}
|
||||
)
|
||||
expected_data = {
|
||||
"columns": [
|
||||
{"name": "id", "friendly_name": "id", "type": "integer"},
|
||||
{"name": "name", "friendly_name": "name", "type": "string"},
|
||||
{"name": "age", "friendly_name": "age", "type": "integer"},
|
||||
],
|
||||
"rows": [
|
||||
{"id": 1, "name": "Alice", "age": 20},
|
||||
{"id": 2, "name": "Bob", "age": 21},
|
||||
{"id": 3, "name": "Charlie", "age": 22},
|
||||
{"id": 4, "name": "Dave", "age": 23},
|
||||
{"id": 5, "name": "Eve", "age": 24},
|
||||
],
|
||||
}
|
||||
|
||||
with mock.patch.dict("redash.query_runner.yandex_disk.EXTENSIONS_READERS", mock_readers, clear=True):
|
||||
data, error = mock_yandex_disk.run_query(yaml.dump({"path": "/tmp/file.csv"}), "user")
|
||||
@@ -204,23 +201,21 @@ def test_run_query_multiple_sheets(mocked_requests, mock_yandex_disk):
|
||||
data, error = mock_yandex_disk.run_query(query, "user")
|
||||
|
||||
assert error is None
|
||||
assert data == json_dumps(
|
||||
{
|
||||
"columns": [
|
||||
{"name": "id", "friendly_name": "id", "type": "integer"},
|
||||
{"name": "name", "friendly_name": "name", "type": "string"},
|
||||
{"name": "age", "friendly_name": "age", "type": "integer"},
|
||||
{"name": "sheet_name", "friendly_name": "sheet_name", "type": "string"},
|
||||
],
|
||||
"rows": [
|
||||
{"id": 1, "name": "Alice", "age": 20, "sheet_name": "sheet1"},
|
||||
{"id": 2, "name": "Bob", "age": 21, "sheet_name": "sheet1"},
|
||||
{"id": 3, "name": "Charlie", "age": 22, "sheet_name": "sheet1"},
|
||||
{"id": 4, "name": "Dave", "age": 23, "sheet_name": "sheet1"},
|
||||
{"id": 5, "name": "Eve", "age": 24, "sheet_name": "sheet1"},
|
||||
],
|
||||
}
|
||||
)
|
||||
assert data == {
|
||||
"columns": [
|
||||
{"name": "id", "friendly_name": "id", "type": "integer"},
|
||||
{"name": "name", "friendly_name": "name", "type": "string"},
|
||||
{"name": "age", "friendly_name": "age", "type": "integer"},
|
||||
{"name": "sheet_name", "friendly_name": "sheet_name", "type": "string"},
|
||||
],
|
||||
"rows": [
|
||||
{"id": 1, "name": "Alice", "age": 20, "sheet_name": "sheet1"},
|
||||
{"id": 2, "name": "Bob", "age": 21, "sheet_name": "sheet1"},
|
||||
{"id": 3, "name": "Charlie", "age": 22, "sheet_name": "sheet1"},
|
||||
{"id": 4, "name": "Dave", "age": 23, "sheet_name": "sheet1"},
|
||||
{"id": 5, "name": "Eve", "age": 24, "sheet_name": "sheet1"},
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
@skip_condition
|
||||
|
||||
@@ -98,7 +98,7 @@ def test_yandex_metrica_query(mocked_requests_get):
|
||||
data, error = query_runner.run_query(example_query, None)
|
||||
|
||||
assert error is None
|
||||
assert json.loads(data) == expected_data
|
||||
assert data == expected_data
|
||||
|
||||
|
||||
def test_yandex_metrica_429(mocked_requests_get):
|
||||
|
||||
@@ -5,7 +5,6 @@ from redash.serializers import (
|
||||
serialize_query_result,
|
||||
serialize_query_result_to_dsv,
|
||||
)
|
||||
from redash.utils import json_dumps
|
||||
from tests import BaseTestCase
|
||||
|
||||
data = {
|
||||
@@ -26,19 +25,19 @@ data = {
|
||||
|
||||
class QueryResultSerializationTest(BaseTestCase):
|
||||
def test_serializes_all_keys_for_authenticated_users(self):
|
||||
query_result = self.factory.create_query_result(data=json_dumps({}))
|
||||
query_result = self.factory.create_query_result(data={})
|
||||
serialized = serialize_query_result(query_result, False)
|
||||
self.assertSetEqual(set(query_result.to_dict().keys()), set(serialized.keys()))
|
||||
|
||||
def test_doesnt_serialize_sensitive_keys_for_unauthenticated_users(self):
|
||||
query_result = self.factory.create_query_result(data=json_dumps({}))
|
||||
query_result = self.factory.create_query_result(data={})
|
||||
serialized = serialize_query_result(query_result, True)
|
||||
self.assertSetEqual(set(["data", "retrieved_at"]), set(serialized.keys()))
|
||||
|
||||
|
||||
class DsvSerializationTest(BaseTestCase):
|
||||
def delimited_content(self, delimiter):
|
||||
query_result = self.factory.create_query_result(data=json_dumps(data))
|
||||
query_result = self.factory.create_query_result(data=data)
|
||||
return serialize_query_result_to_dsv(query_result, delimiter)
|
||||
|
||||
def test_serializes_booleans_correctly(self):
|
||||
|
||||
@@ -10,7 +10,6 @@ from redash.tasks.queries.execution import (
|
||||
enqueue_query,
|
||||
execute_query,
|
||||
)
|
||||
from redash.utils import json_dumps
|
||||
from tests import BaseTestCase
|
||||
|
||||
|
||||
@@ -181,7 +180,7 @@ class QueryExecutorTests(BaseTestCase):
|
||||
"""
|
||||
with patch.object(PostgreSQL, "run_query") as qr:
|
||||
query_result_data = {"columns": [], "rows": []}
|
||||
qr.return_value = (json_dumps(query_result_data), None)
|
||||
qr.return_value = (query_result_data, None)
|
||||
result_id = execute_query("SELECT 1, 2", self.factory.data_source.id, {})
|
||||
self.assertEqual(1, qr.call_count)
|
||||
result = models.QueryResult.query.get(result_id)
|
||||
@@ -193,7 +192,16 @@ class QueryExecutorTests(BaseTestCase):
|
||||
"""
|
||||
q = self.factory.create_query(query_text="SELECT 1, 2", schedule={"interval": 300})
|
||||
with patch.object(PostgreSQL, "run_query") as qr:
|
||||
qr.return_value = ([1, 2], None)
|
||||
qr.return_value = (
|
||||
{
|
||||
"columns": [
|
||||
{"name": "_col0", "friendly_name": "_col0", "type": "integer"},
|
||||
{"name": "_col1", "friendly_name": "_col1", "type": "integer"},
|
||||
],
|
||||
"rows": [{"_col0": 1, "_col1": 2}],
|
||||
},
|
||||
None,
|
||||
)
|
||||
result_id = execute_query(
|
||||
"SELECT 1, 2",
|
||||
self.factory.data_source.id,
|
||||
@@ -251,7 +259,16 @@ class QueryExecutorTests(BaseTestCase):
|
||||
self.assertEqual(q.schedule_failures, 1)
|
||||
|
||||
with patch.object(PostgreSQL, "run_query") as qr:
|
||||
qr.return_value = ([1, 2], None)
|
||||
qr.return_value = (
|
||||
{
|
||||
"columns": [
|
||||
{"name": "_col0", "friendly_name": "_col0", "type": "integer"},
|
||||
{"name": "_col1", "friendly_name": "_col1", "type": "integer"},
|
||||
],
|
||||
"rows": [{"_col0": 1, "_col1": 2}],
|
||||
},
|
||||
None,
|
||||
)
|
||||
execute_query(
|
||||
"SELECT 1, 2",
|
||||
self.factory.data_source.id,
|
||||
@@ -280,7 +297,16 @@ class QueryExecutorTests(BaseTestCase):
|
||||
self.assertEqual(q.schedule_failures, 1)
|
||||
|
||||
with patch.object(PostgreSQL, "run_query") as qr:
|
||||
qr.return_value = ([1, 2], None)
|
||||
qr.return_value = (
|
||||
{
|
||||
"columns": [
|
||||
{"name": "_col0", "friendly_name": "_col0", "type": "integer"},
|
||||
{"name": "_col1", "friendly_name": "_col1", "type": "integer"},
|
||||
],
|
||||
"rows": [{"_col0": 1, "_col1": 2}],
|
||||
},
|
||||
None,
|
||||
)
|
||||
execute_query(
|
||||
"SELECT 1, 2",
|
||||
self.factory.data_source.id,
|
||||
|
||||
@@ -328,7 +328,7 @@ class QueryArchiveTest(BaseTestCase):
|
||||
query.data_source,
|
||||
query.query_hash,
|
||||
query.query_text,
|
||||
"1",
|
||||
{"columns": {}, "rows": []},
|
||||
123,
|
||||
yesterday,
|
||||
)
|
||||
@@ -504,7 +504,7 @@ class TestQueryResultStoreResult(BaseTestCase):
|
||||
self.query_hash = gen_query_hash(self.query)
|
||||
self.runtime = 123
|
||||
self.utcnow = utcnow()
|
||||
self.data = '{"a": 1}'
|
||||
self.data = {"a": 1}
|
||||
|
||||
def test_stores_the_result(self):
|
||||
query_result = models.QueryResult.store_result(
|
||||
@@ -517,7 +517,7 @@ class TestQueryResultStoreResult(BaseTestCase):
|
||||
self.utcnow,
|
||||
)
|
||||
|
||||
self.assertEqual(query_result._data, self.data)
|
||||
self.assertEqual(query_result.data, self.data)
|
||||
self.assertEqual(query_result.runtime, self.runtime)
|
||||
self.assertEqual(query_result.retrieved_at, self.utcnow)
|
||||
self.assertEqual(query_result.query_text, self.query)
|
||||
|
||||
Reference in New Issue
Block a user