diff --git a/lib/appsignal/plug.ex b/lib/appsignal/plug.ex index 2a20185f7..f931a0cf2 100644 --- a/lib/appsignal/plug.ex +++ b/lib/appsignal/plug.ex @@ -28,6 +28,8 @@ if Appsignal.plug?() do conn -> Appsignal.Plug.finish_with_conn(transaction, conn) end end + + defoverridable call: 2 end end diff --git a/test/appsignal/plug_test.exs b/test/appsignal/plug_test.exs index d967ac283..d648c77f3 100644 --- a/test/appsignal/plug_test.exs +++ b/test/appsignal/plug_test.exs @@ -1,3 +1,15 @@ +defmodule ModuleWithCall do + defmacro __using__(_) do + quote do + def call(%Plug.Conn{} = conn, _opts) do + Plug.Conn.assign(conn, :called?, true) + end + + defoverridable call: 2 + end + end +end + defmodule UsingAppsignalPlug do def call(%Plug.Conn{private: %{phoenix_action: :exception}}, _opts) do raise("Exception!") @@ -29,13 +41,18 @@ defmodule UsingAppsignalPlug do } end - def call(%Plug.Conn{} = conn, _opts) do - conn |> Plug.Conn.assign(:called?, true) - end - - defoverridable call: 2 + use ModuleWithCall + use Appsignal.Plug +end +defmodule OverridingAppSignalPlug do + use ModuleWithCall use Appsignal.Plug + + def call(conn, opts) do + conn = super(conn, opts) + Plug.Conn.assign(conn, :overridden?, true) + end end defmodule Appsignal.PlugTest do @@ -493,4 +510,24 @@ defmodule Appsignal.PlugTest do end end end + + describe "when overriding the AppSignal Plug" do + setup do + conn = OverridingAppSignalPlug.call(%Plug.Conn{}, %{}) + + [conn: conn] + end + + test "starts a transaction", %{fake_transaction: fake_transaction} do + assert FakeTransaction.started_transaction?(fake_transaction) + end + + test "calls super and returns the conn", %{conn: conn} do + assert conn.assigns[:called?] + end + + test "calls the overridden call/2", %{conn: conn} do + assert conn.assigns[:overridden?] + end + end end