From 52bb69907023677c55c837357751313a4ea619d2 Mon Sep 17 00:00:00 2001 From: Matt Stubbs Date: Fri, 3 Apr 2026 11:39:14 +1000 Subject: [PATCH 1/2] test: improve SearchOperationsTest postgres coverage --- lib/logflare/logs/search_operations.ex | 2 ++ test/logflare/logs/search_operations_test.exs | 34 +++++++------------ 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/lib/logflare/logs/search_operations.ex b/lib/logflare/logs/search_operations.ex index 7b944264d..b3768d576 100644 --- a/lib/logflare/logs/search_operations.ex +++ b/lib/logflare/logs/search_operations.ex @@ -73,6 +73,8 @@ defmodule Logflare.Logs.SearchOperations do backend = postgres_backend(so) PostgresAdaptor.execute_query(backend, so.query, query_type: :search) + rescue + error -> {:error, error} end defp execute_backend_query(%SO{} = so) do diff --git a/test/logflare/logs/search_operations_test.exs b/test/logflare/logs/search_operations_test.exs index 636adea94..a2c53fabe 100644 --- a/test/logflare/logs/search_operations_test.exs +++ b/test/logflare/logs/search_operations_test.exs @@ -3,6 +3,7 @@ defmodule Logflare.Logs.SearchOperationsTest do import Ecto.Query import Logflare.Utils.Guards + import Logflare.TestUtils alias Logflare.Backends alias Logflare.Backends.Adaptor.BigQueryAdaptor @@ -183,11 +184,11 @@ defmodule Logflare.Logs.SearchOperationsTest do end describe "postgres chart aggregation" do + setup_single_tenant(backend_type: :postgres) + setup %{user: user} do source = insert(:source, user: user) - stub(Backends, :get_default_backend, fn ^user -> %{type: :postgres} end) - base_so = @postgres_search_attrs |> Map.merge(%{source: source, type: :aggregates}) @@ -265,11 +266,11 @@ defmodule Logflare.Logs.SearchOperationsTest do end describe "postgres query defaults and rules" do + setup_single_tenant(backend_type: :postgres) + setup %{user: user} do source = insert(:source, user: user) - stub(Backends, :get_default_backend, fn ^user -> %{type: :postgres} end) - so = %{@postgres_search_attrs | source: source} |> SO.new() @@ -319,11 +320,11 @@ defmodule Logflare.Logs.SearchOperationsTest do end describe "postgres timestamp filter rules" do + setup_single_tenant(backend_type: :postgres) + setup %{user: user} do source = insert(:source, user: user) - stub(Backends, :get_default_backend, fn ^user -> %{type: :postgres} end) - base_so = @postgres_search_attrs |> Map.merge(%{ @@ -445,14 +446,14 @@ defmodule Logflare.Logs.SearchOperationsTest do end describe "postgres backend adaptor integration" do + setup_single_tenant(backend_type: :postgres) + setup %{user: user} do Mimic.copy(PostgresAdaptor) source = insert(:source, user: user) backend = build(:backend, type: :postgres) - stub(Backends, :get_default_backend, fn ^user -> backend end) - base_so = %{@postgres_search_attrs | source: source, query: from("test_table")} |> SO.new() @@ -493,15 +494,8 @@ defmodule Logflare.Logs.SearchOperationsTest do {:ok, QueryResult.new(rows, %{total_rows: length(rows)})} end) - PostgresAdaptor - |> expect(:ecto_to_sql, fn %Ecto.Query{}, [] -> - {:ok, {"SELECT * FROM test_table", ["param"]}} - end) - result_so = SearchOperations.do_query(base_so) - assert result_so.sql_string == "SELECT * FROM test_table" - assert result_so.sql_params == ["param"] assert result_so.rows == rows refute result_so.error end @@ -512,12 +506,13 @@ defmodule Logflare.Logs.SearchOperationsTest do PostgresAdaptor |> expect(:execute_query, fn ^backend, %Ecto.Query{}, [query_type: :search] -> - {:error, :postgres_failed} + raise Postgrex.Error, + postgres: %{code: :invalid_sql_statement_name, message: "connection refused"} end) result_so = SearchOperations.do_query(base_so) - assert result_so.error == :postgres_failed + assert %Postgrex.Error{} = result_so.error end test "do_query/1 renames count to value for aggregates and process_query_result/1 adds datetime", @@ -536,11 +531,6 @@ defmodule Logflare.Logs.SearchOperationsTest do {:ok, QueryResult.new(rows, %{total_rows: length(rows)})} end) - PostgresAdaptor - |> expect(:ecto_to_sql, fn %Ecto.Query{}, [] -> - {:ok, {"SELECT count(*) FROM test_table", []}} - end) - result_so = %{base_so | type: :aggregates} |> SearchOperations.do_query() From f13bfe7c7b8bbdd7d83b673cce5bc58864ecaf70 Mon Sep 17 00:00:00 2001 From: Matt Stubbs Date: Thu, 9 Apr 2026 14:24:01 +1000 Subject: [PATCH 2/2] feat: do_query propagates postgres exceptions --- lib/logflare/logs/search_operations.ex | 2 -- test/logflare/logs/search_operations_test.exs | 15 ++++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/logflare/logs/search_operations.ex b/lib/logflare/logs/search_operations.ex index b3768d576..7b944264d 100644 --- a/lib/logflare/logs/search_operations.ex +++ b/lib/logflare/logs/search_operations.ex @@ -73,8 +73,6 @@ defmodule Logflare.Logs.SearchOperations do backend = postgres_backend(so) PostgresAdaptor.execute_query(backend, so.query, query_type: :search) - rescue - error -> {:error, error} end defp execute_backend_query(%SO{} = so) do diff --git a/test/logflare/logs/search_operations_test.exs b/test/logflare/logs/search_operations_test.exs index a2c53fabe..08d4a7ba6 100644 --- a/test/logflare/logs/search_operations_test.exs +++ b/test/logflare/logs/search_operations_test.exs @@ -500,19 +500,24 @@ defmodule Logflare.Logs.SearchOperationsTest do refute result_so.error end - test "do_query/1 stores postgres backend errors", %{backend: backend, base_so: base_so} do + test "do_query/1 propagates postgres backend errors", %{backend: backend, base_so: base_so} do Backends |> expect(:get_default_backend, fn _user -> backend end) PostgresAdaptor |> expect(:execute_query, fn ^backend, %Ecto.Query{}, [query_type: :search] -> raise Postgrex.Error, - postgres: %{code: :invalid_sql_statement_name, message: "connection refused"} + postgres: %{ + code: "26000", + pg_code: :invalid_sql_statement_name, + message: "connection refused", + severity: "ERROR" + } end) - result_so = SearchOperations.do_query(base_so) - - assert %Postgrex.Error{} = result_so.error + assert_raise Postgrex.Error, fn -> + SearchOperations.do_query(base_so) + end end test "do_query/1 renames count to value for aggregates and process_query_result/1 adds datetime",