diff options
Diffstat (limited to 'test/web/plugs')
| -rw-r--r-- | test/web/plugs/plug_test.exs | 91 | 
1 files changed, 91 insertions, 0 deletions
| diff --git a/test/web/plugs/plug_test.exs b/test/web/plugs/plug_test.exs new file mode 100644 index 000000000..943e484e7 --- /dev/null +++ b/test/web/plugs/plug_test.exs @@ -0,0 +1,91 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PlugTest do +  @moduledoc "Tests for the functionality added via `use Pleroma.Web, :plug`" + +  alias Pleroma.Plugs.ExpectAuthenticatedCheckPlug +  alias Pleroma.Plugs.ExpectPublicOrAuthenticatedCheckPlug +  alias Pleroma.Plugs.PlugHelper + +  import Mock + +  use Pleroma.Web.ConnCase + +  describe "when plug is skipped, " do +    setup_with_mocks( +      [ +        {ExpectPublicOrAuthenticatedCheckPlug, [:passthrough], []} +      ], +      %{conn: conn} +    ) do +      conn = ExpectPublicOrAuthenticatedCheckPlug.skip_plug(conn) +      %{conn: conn} +    end + +    test "it neither adds plug to called plugs list nor calls `perform/2`, " <> +           "regardless of :if_func / :unless_func options", +         %{conn: conn} do +      for opts <- [%{}, %{if_func: fn _ -> true end}, %{unless_func: fn _ -> false end}] do +        ret_conn = ExpectPublicOrAuthenticatedCheckPlug.call(conn, opts) + +        refute called(ExpectPublicOrAuthenticatedCheckPlug.perform(:_, :_)) +        refute PlugHelper.plug_called?(ret_conn, ExpectPublicOrAuthenticatedCheckPlug) +      end +    end +  end + +  describe "when plug is NOT skipped, " do +    setup_with_mocks([{ExpectAuthenticatedCheckPlug, [:passthrough], []}]) do +      :ok +    end + +    test "with no pre-run checks, adds plug to called plugs list and calls `perform/2`", %{ +      conn: conn +    } do +      ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{}) + +      assert called(ExpectAuthenticatedCheckPlug.perform(ret_conn, :_)) +      assert PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) +    end + +    test "when :if_func option is given, calls the plug only if provided function evals tru-ish", +         %{conn: conn} do +      ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{if_func: fn _ -> false end}) + +      refute called(ExpectAuthenticatedCheckPlug.perform(:_, :_)) +      refute PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) + +      ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{if_func: fn _ -> true end}) + +      assert called(ExpectAuthenticatedCheckPlug.perform(ret_conn, :_)) +      assert PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) +    end + +    test "if :unless_func option is given, calls the plug only if provided function evals falsy", +         %{conn: conn} do +      ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{unless_func: fn _ -> true end}) + +      refute called(ExpectAuthenticatedCheckPlug.perform(:_, :_)) +      refute PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) + +      ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{unless_func: fn _ -> false end}) + +      assert called(ExpectAuthenticatedCheckPlug.perform(ret_conn, :_)) +      assert PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) +    end + +    test "allows a plug to be called multiple times (even if it's in called plugs list)", %{ +      conn: conn +    } do +      conn = ExpectAuthenticatedCheckPlug.call(conn, %{an_option: :value1}) +      assert called(ExpectAuthenticatedCheckPlug.perform(conn, %{an_option: :value1})) + +      assert PlugHelper.plug_called?(conn, ExpectAuthenticatedCheckPlug) + +      conn = ExpectAuthenticatedCheckPlug.call(conn, %{an_option: :value2}) +      assert called(ExpectAuthenticatedCheckPlug.perform(conn, %{an_option: :value2})) +    end +  end +end | 
