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