lookml-generator/tests/test_events.py

208 строки
6.0 KiB
Python

import lkml
import pytest
from google.cloud.bigquery.schema import SchemaField
from generator.explores import EventsExplore
from generator.views import EventsView
from .utils import get_mock_bq_client, print_and_test
@pytest.fixture()
def events_view():
return EventsView(
"glean_app",
"events",
[
{
"events_table_view": "events_unnested_table",
"base_table": "mozdata.glean_app.events_unnested",
},
],
)
@pytest.fixture(params=["submission", "timestamp"])
def time_partitioning_group(request):
return request.param
@pytest.fixture()
def events_explore(events_view, tmp_path, time_partitioning_group):
(tmp_path / "events_unnested_table.view.lkml").write_text(
lkml.dump(
{
"views": [
{
"name": "events_unnested_table",
"dimensions": [
{
"name": "client_info__client_count",
"type": "string",
},
],
"dimension_groups": [
{
"name": time_partitioning_group,
"tags": (
["time_partitioning_field"]
if time_partitioning_group != "submission"
else []
),
"type": "time",
"timeframes": [
"raw",
"time",
"date",
],
}
],
}
]
}
)
)
(tmp_path / "events.view.lkml").write_text(
lkml.dump(
{
"views": [
{
"name": "events",
"measures": [
{
"name": "event_count",
"type": "count",
}
],
}
]
}
)
)
return EventsExplore(
"events",
{"base_view": "events", "extended_view": "events_unnested_table"},
tmp_path,
)
def test_view_from_db_views(events_view):
db_views = {
"glean_app": {
"events": [["mozdata", "glean_app", "events"]],
"events_unnested": [["mozdata", "glean_app", "events_unnested"]],
}
}
channels = [
{"channel": "release", "dataset": "glean_app"},
{"channel": "beta", "dataset": "glean_app_beta"},
]
actual = next(EventsView.from_db_views("glean_app", True, channels, db_views))
assert actual == events_view
def test_view_from_dict(events_view):
actual = EventsView.from_dict(
"glean_app",
"events",
{
"type": "events_view",
"tables": [
{
"events_table_view": "events_unnested_table",
"base_table": "mozdata.glean_app.events_unnested",
}
],
},
)
assert actual == events_view
def test_explore_from_views(events_view, events_explore):
views = [events_view]
actual = next(EventsExplore.from_views(views))
assert actual == events_explore
def test_explore_from_dict(events_explore, tmp_path):
actual = EventsExplore.from_dict(
"events",
{"views": {"base_view": "events", "extended_view": "events_unnested_table"}},
tmp_path,
)
assert actual == events_explore
def test_view_lookml(events_view):
expected = {
"includes": ["events_unnested_table.view.lkml"],
"views": [
{
"name": "events",
"extends": ["events_unnested_table"],
"measures": [
{
"name": "event_count",
"description": ("The number of times the event(s) occurred."),
"type": "count",
},
{
"name": "client_count",
"description": (
"The number of clients that completed the event(s)."
),
"type": "count_distinct",
"sql": "${client_info__client_id}",
},
],
},
],
}
mock_bq_client = get_mock_bq_client(
[
SchemaField(
"client_info", "RECORD", fields=[SchemaField("client_id", "STRING")]
)
]
)
actual = events_view.to_lookml(mock_bq_client, None)
print_and_test(expected=expected, actual=actual)
def test_explore_lookml(time_partitioning_group, events_explore):
date_dimension = f"{time_partitioning_group}_date"
expected = [
{
"name": "event_counts",
"view_name": "events",
"description": "Event counts over time.",
"always_filter": {
"filters": [
{date_dimension: "28 days"},
]
},
"sql_always_where": f"${{events.{date_dimension}}} >= '2010-01-01'",
"queries": [
{
"description": "Event counts from all events over the past two weeks.",
"dimensions": [date_dimension],
"measures": ["event_count"],
"filters": [
{date_dimension: "14 days"},
],
"name": "all_event_counts",
},
],
"joins": [],
},
]
actual = events_explore.to_lookml(None, None)
print_and_test(expected=expected, actual=actual)