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:
Andrii Chubatiuk
2024-01-12 01:02:00 +02:00
committed by GitHub
parent 4d5103978b
commit ec1c4d07de
105 changed files with 549 additions and 606 deletions

View File

@@ -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,
)

View File

@@ -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,
)

View File

@@ -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",

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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},

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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()))

View File

@@ -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"],
},
)

View File

@@ -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))

View File

@@ -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},

View File

@@ -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]

View File

@@ -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

View File

@@ -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):

View File

@@ -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):

View File

@@ -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,

View File

@@ -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)