Files
redash/tests/query_runner/test_google_analytics4.py
2023-07-21 10:52:18 +09:00

195 lines
8.5 KiB
Python

import datetime
from unittest import TestCase
from redash.query_runner.google_analytics4 import (
format_column_value,
get_formatted_column_json,
parse_ga_response,
)
class TestFormatColumnValue(TestCase):
def setUp(self):
self.columns = [
{
"name": "date",
"friendly_name": "date",
"type": "date",
},
{
"name": "dateHour",
"friendly_name": "dateHour",
"type": "datetime",
},
{
"name": "dateHourMinute",
"friendly_name": "dateHourMinute",
"type": "datetime",
},
{
"name": "city",
"friendly_name": "city",
"type": "string",
},
]
def test_string_value(self):
column_name = "city"
column_value = "Delhi"
value = format_column_value(column_name, column_value, self.columns)
self.assertEqual(value, column_value)
def test_for_date(self):
column_name = "date"
column_value = "20230711"
value = format_column_value(column_name, column_value, self.columns)
self.assertEqual(value, datetime.datetime.strptime(column_value, "%Y%m%d"))
def test_for_date_hour(self):
column_name = "dateHour"
column_value = "2023071210"
value = format_column_value(column_name, column_value, self.columns)
self.assertEqual(value, datetime.datetime.strptime(column_value, "%Y%m%d%H"))
def test_for_date_hour_minute(self):
column_name = "dateHour"
column_value = "202307121030"
value = format_column_value(column_name, column_value, self.columns)
self.assertEqual(value, datetime.datetime.strptime(column_value, "%Y%m%d%H%M"))
def test_when_exception_raise(self):
column_name = "dateHour"
column_value = "20230712103025"
with self.assertRaisesRegex(Exception, "Unknown date/time format in results: '20230712103025'"):
format_column_value(column_name, column_value, self.columns)
class TestGetFormattedColumnJson(TestCase):
def test_date_column(self):
column_name = "date"
expected_response = {
"name": column_name,
"friendly_name": column_name,
"type": "date",
}
self.assertEqual(get_formatted_column_json(column_name), expected_response)
def test_date_hour_column(self):
column_name = "dateHour"
expected_response = {
"name": column_name,
"friendly_name": column_name,
"type": "datetime",
}
self.assertEqual(get_formatted_column_json(column_name), expected_response)
def test_other_string(self):
column_name = "city"
expected_response = {
"name": column_name,
"friendly_name": column_name,
"type": "string",
}
self.assertEqual(get_formatted_column_json(column_name), expected_response)
class TestParseGaResponse(TestCase):
def test_parse_ga_response(self):
response = {
"dimensionHeaders": [{"name": "date"}],
"metricHeaders": [{"name": "activeUsers", "type": "TYPE_INTEGER"}],
"rows": [{"dimensionValues": [{"value": "20230713"}], "metricValues": [{"value": "50"}]}],
"rowCount": 1,
"metadata": {"currencyCode": "USD", "timeZone": "Asia/Calcutta"},
"kind": "analyticsData#runReport",
}
expected_value = {
"columns": [
{"name": "date", "friendly_name": "date", "type": "date"},
{"name": "activeUsers", "friendly_name": "activeUsers", "type": "string"},
],
"rows": [{"date": datetime.datetime(2023, 7, 13, 0, 0), "activeUsers": "50"}],
}
value = parse_ga_response(response)
self.assertEqual(value, expected_value)
def test_parse_ga_response_with_date_hour(self):
response = {
"dimensionHeaders": [{"name": "dateHour"}],
"metricHeaders": [{"name": "activeUsers", "type": "TYPE_INTEGER"}],
"rows": [
{"dimensionValues": [{"value": "2023071312"}], "metricValues": [{"value": "7"}]},
{"dimensionValues": [{"value": "2023071318"}], "metricValues": [{"value": "7"}]},
{"dimensionValues": [{"value": "2023071317"}], "metricValues": [{"value": "5"}]},
{"dimensionValues": [{"value": "2023071319"}], "metricValues": [{"value": "5"}]},
{"dimensionValues": [{"value": "2023071320"}], "metricValues": [{"value": "5"}]},
{"dimensionValues": [{"value": "2023071314"}], "metricValues": [{"value": "4"}]},
{"dimensionValues": [{"value": "2023071315"}], "metricValues": [{"value": "4"}]},
{"dimensionValues": [{"value": "2023071302"}], "metricValues": [{"value": "3"}]},
{"dimensionValues": [{"value": "2023071305"}], "metricValues": [{"value": "3"}]},
{"dimensionValues": [{"value": "2023071313"}], "metricValues": [{"value": "3"}]},
{"dimensionValues": [{"value": "2023071306"}], "metricValues": [{"value": "2"}]},
{"dimensionValues": [{"value": "2023071310"}], "metricValues": [{"value": "2"}]},
{"dimensionValues": [{"value": "2023071321"}], "metricValues": [{"value": "2"}]},
{"dimensionValues": [{"value": "2023071300"}], "metricValues": [{"value": "1"}]},
{"dimensionValues": [{"value": "2023071304"}], "metricValues": [{"value": "1"}]},
{"dimensionValues": [{"value": "2023071307"}], "metricValues": [{"value": "1"}]},
{"dimensionValues": [{"value": "2023071308"}], "metricValues": [{"value": "1"}]},
{"dimensionValues": [{"value": "2023071309"}], "metricValues": [{"value": "1"}]},
{"dimensionValues": [{"value": "2023071311"}], "metricValues": [{"value": "1"}]},
{"dimensionValues": [{"value": "2023071316"}], "metricValues": [{"value": "1"}]},
{"dimensionValues": [{"value": "2023071323"}], "metricValues": [{"value": "1"}]},
],
"rowCount": 21,
"metadata": {"currencyCode": "USD", "timeZone": "Asia/Calcutta"},
"kind": "analyticsData#runReport",
}
expected_value = {
"columns": [
{"name": "dateHour", "friendly_name": "dateHour", "type": "datetime"},
{"name": "activeUsers", "friendly_name": "activeUsers", "type": "string"},
],
"rows": [
{"dateHour": datetime.datetime(2023, 7, 13, 12, 0), "activeUsers": "7"},
{"dateHour": datetime.datetime(2023, 7, 13, 18, 0), "activeUsers": "7"},
{"dateHour": datetime.datetime(2023, 7, 13, 17, 0), "activeUsers": "5"},
{"dateHour": datetime.datetime(2023, 7, 13, 19, 0), "activeUsers": "5"},
{"dateHour": datetime.datetime(2023, 7, 13, 20, 0), "activeUsers": "5"},
{"dateHour": datetime.datetime(2023, 7, 13, 14, 0), "activeUsers": "4"},
{"dateHour": datetime.datetime(2023, 7, 13, 15, 0), "activeUsers": "4"},
{"dateHour": datetime.datetime(2023, 7, 13, 2, 0), "activeUsers": "3"},
{"dateHour": datetime.datetime(2023, 7, 13, 5, 0), "activeUsers": "3"},
{"dateHour": datetime.datetime(2023, 7, 13, 13, 0), "activeUsers": "3"},
{"dateHour": datetime.datetime(2023, 7, 13, 6, 0), "activeUsers": "2"},
{"dateHour": datetime.datetime(2023, 7, 13, 10, 0), "activeUsers": "2"},
{"dateHour": datetime.datetime(2023, 7, 13, 21, 0), "activeUsers": "2"},
{"dateHour": datetime.datetime(2023, 7, 13, 0, 0), "activeUsers": "1"},
{"dateHour": datetime.datetime(2023, 7, 13, 4, 0), "activeUsers": "1"},
{"dateHour": datetime.datetime(2023, 7, 13, 7, 0), "activeUsers": "1"},
{"dateHour": datetime.datetime(2023, 7, 13, 8, 0), "activeUsers": "1"},
{"dateHour": datetime.datetime(2023, 7, 13, 9, 0), "activeUsers": "1"},
{"dateHour": datetime.datetime(2023, 7, 13, 11, 0), "activeUsers": "1"},
{"dateHour": datetime.datetime(2023, 7, 13, 16, 0), "activeUsers": "1"},
{"dateHour": datetime.datetime(2023, 7, 13, 23, 0), "activeUsers": "1"},
],
}
value = parse_ga_response(response)
self.assertEqual(value, expected_value)