| defmodule Plausible.Stats.Query.QueryResultTest do |
| use Plausible.DataCase, async: true |
| alias Plausible.Stats.{Query, QueryRunner, QueryResult, QueryOptimizer} |
|
|
| setup do |
| user = insert(:user) |
|
|
| site = |
| new_site( |
| owner: user, |
| inserted_at: ~N[2020-01-01T00:00:00], |
| stats_start_date: ~D[2020-01-01] |
| ) |
|
|
| {:ok, site: site} |
| end |
|
|
| test "parse_and_build!/2 raises on error on site_id mismatch", %{site: site} do |
| assert_raise FunctionClauseError, fn -> |
| Query.parse_and_build!( |
| site, |
| %{ |
| "site_id" => "different" |
| } |
| ) |
| end |
| end |
|
|
| test "parse_and_build!/2 raises on schema validation error", %{site: site} do |
| assert_raise RuntimeError, |
| ~s/Failed to build query: "#: Required properties metrics, date_range were not present."/, |
| fn -> |
| Query.parse_and_build!( |
| site, |
| %{ |
| "site_id" => site.domain |
| } |
| ) |
| end |
| end |
|
|
| test "serializing query to JSON keeps keys ordered", %{site: site} do |
| query = |
| Query.parse_and_build!( |
| site, |
| %{ |
| "site_id" => site.domain, |
| "metrics" => ["pageviews"], |
| "date_range" => ["2024-01-01", "2024-02-01"], |
| "include" => %{"imports" => true} |
| } |
| ) |
|
|
| query = QueryOptimizer.optimize(query) |
|
|
| query_result_json = |
| %QueryRunner{site: site, results: [], main_query: query} |
| |> QueryResult.from() |
| |> Jason.encode!(pretty: true) |
| |> String.replace(site.domain, "dummy.site") |
|
|
| assert query_result_json == """ |
| { |
| "results": [], |
| "meta": { |
| "imports_included": false, |
| "imports_skip_reason": "no_imported_data" |
| }, |
| "query": { |
| "site_id": "dummy.site", |
| "metrics": [ |
| "pageviews" |
| ], |
| "date_range": [ |
| "2024-01-01T00:00:00Z", |
| "2024-02-01T23:59:59Z" |
| ], |
| "filters": [], |
| "dimensions": [], |
| "order_by": [ |
| [ |
| "pageviews", |
| "desc" |
| ] |
| ], |
| "include": { |
| "imports": true |
| }, |
| "pagination": { |
| "offset": 0, |
| "limit": 10000 |
| } |
| } |
| }\ |
| """ |
| end |
| end |
|
|