diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/notification_test.exs | 22 | ||||
| -rw-r--r-- | test/plugs/authentication_plug_test.exs | 6 | ||||
| -rw-r--r-- | test/plugs/legacy_authentication_plug_test.exs | 36 | ||||
| -rw-r--r-- | test/signature_test.exs | 21 | ||||
| -rw-r--r-- | test/support/factory.ex | 24 | ||||
| -rw-r--r-- | test/tasks/user_test.exs | 84 | ||||
| -rw-r--r-- | test/test_helper.exs | 3 | ||||
| -rw-r--r-- | test/user_test.exs | 42 | ||||
| -rw-r--r-- | test/web/activity_pub/activity_pub_test.exs | 109 | ||||
| -rw-r--r-- | test/web/activity_pub/mrf/mrf_test.exs | 46 | ||||
| -rw-r--r-- | test/web/activity_pub/mrf/simple_policy_test.exs | 93 | ||||
| -rw-r--r-- | test/web/activity_pub/publisher_test.exs | 266 | ||||
| -rw-r--r-- | test/web/admin_api/admin_api_controller_test.exs | 74 | ||||
| -rw-r--r-- | test/web/admin_api/config_test.exs | 8 | ||||
| -rw-r--r-- | test/web/federator_test.exs | 9 | ||||
| -rw-r--r-- | test/web/mastodon_api/mastodon_api_controller_test.exs | 80 | ||||
| -rw-r--r-- | test/web/oauth/oauth_controller_test.exs | 74 | ||||
| -rw-r--r-- | test/web/rich_media/parser_test.exs | 12 | ||||
| -rw-r--r-- | test/web/streamer_test.exs | 57 | 
19 files changed, 860 insertions, 206 deletions
diff --git a/test/notification_test.exs b/test/notification_test.exs index b4eb7fd0f..dd7bbacc4 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -44,6 +44,28 @@ defmodule Pleroma.NotificationTest do        assert notification.user_id == subscriber.id      end + +    test "does not create a notification for subscribed users if status is a reply" do +      user = insert(:user) +      other_user = insert(:user) +      subscriber = insert(:user) + +      User.subscribe(subscriber, other_user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "test post"}) + +      {:ok, _reply_activity} = +        CommonAPI.post(other_user, %{ +          "status" => "test reply", +          "in_reply_to_status_id" => activity.id +        }) + +      user_notifications = Notification.for_user(user) +      assert length(user_notifications) == 1 + +      subscriber_notifications = Notification.for_user(subscriber) +      assert Enum.empty?(subscriber_notifications) +    end    end    describe "create_notification" do diff --git a/test/plugs/authentication_plug_test.exs b/test/plugs/authentication_plug_test.exs index 7ca045616..f7f8fd9f3 100644 --- a/test/plugs/authentication_plug_test.exs +++ b/test/plugs/authentication_plug_test.exs @@ -9,7 +9,6 @@ defmodule Pleroma.Plugs.AuthenticationPlugTest do    alias Pleroma.User    import ExUnit.CaptureLog -  import Mock    setup %{conn: conn} do      user = %User{ @@ -67,13 +66,12 @@ defmodule Pleroma.Plugs.AuthenticationPlugTest do        refute AuthenticationPlug.checkpw("test-password1", hash)      end +    @tag :skip_on_mac      test "check sha512-crypt hash" do        hash =          "$6$9psBWV8gxkGOZWBz$PmfCycChoxeJ3GgGzwvhlgacb9mUoZ.KUXNCssekER4SJ7bOK53uXrHNb2e4i8yPFgSKyzaW9CcmrDXWIEMtD1" -      with_mock :crypt, crypt: fn _password, password_hash -> password_hash end do -        assert AuthenticationPlug.checkpw("password", hash) -      end +      assert AuthenticationPlug.checkpw("password", hash)      end      test "it returns false when hash invalid" do diff --git a/test/plugs/legacy_authentication_plug_test.exs b/test/plugs/legacy_authentication_plug_test.exs index 02f530058..9804e073b 100644 --- a/test/plugs/legacy_authentication_plug_test.exs +++ b/test/plugs/legacy_authentication_plug_test.exs @@ -5,19 +5,18 @@  defmodule Pleroma.Plugs.LegacyAuthenticationPlugTest do    use Pleroma.Web.ConnCase +  import Pleroma.Factory +    alias Pleroma.Plugs.LegacyAuthenticationPlug    alias Pleroma.User -  import Mock -    setup do -    # password is "password" -    user = %User{ -      id: 1, -      name: "dude", -      password_hash: -        "$6$9psBWV8gxkGOZWBz$PmfCycChoxeJ3GgGzwvhlgacb9mUoZ.KUXNCssekER4SJ7bOK53uXrHNb2e4i8yPFgSKyzaW9CcmrDXWIEMtD1" -    } +    user = +      insert(:user, +        password: "password", +        password_hash: +          "$6$9psBWV8gxkGOZWBz$PmfCycChoxeJ3GgGzwvhlgacb9mUoZ.KUXNCssekER4SJ7bOK53uXrHNb2e4i8yPFgSKyzaW9CcmrDXWIEMtD1" +      )      %{user: user}    end @@ -36,6 +35,7 @@ defmodule Pleroma.Plugs.LegacyAuthenticationPlugTest do      assert ret_conn == conn    end +  @tag :skip_on_mac    test "it authenticates the auth_user if present and password is correct and resets the password",         %{           conn: conn, @@ -46,22 +46,12 @@ defmodule Pleroma.Plugs.LegacyAuthenticationPlugTest do        |> assign(:auth_credentials, %{username: "dude", password: "password"})        |> assign(:auth_user, user) -    conn = -      with_mocks([ -        {:crypt, [], [crypt: fn _password, password_hash -> password_hash end]}, -        {User, [], -         [ -           reset_password: fn user, %{password: password, password_confirmation: password} -> -             {:ok, user} -           end -         ]} -      ]) do -        LegacyAuthenticationPlug.call(conn, %{}) -      end - -    assert conn.assigns.user == user +    conn = LegacyAuthenticationPlug.call(conn, %{}) + +    assert conn.assigns.user.id == user.id    end +  @tag :skip_on_mac    test "it does nothing if the password is wrong", %{      conn: conn,      user: user diff --git a/test/signature_test.exs b/test/signature_test.exs index 7400cae9a..26337eaf9 100644 --- a/test/signature_test.exs +++ b/test/signature_test.exs @@ -48,16 +48,14 @@ defmodule Pleroma.SignatureTest do      test "it returns error when not found user" do        assert capture_log(fn -> -               assert Signature.fetch_public_key(make_fake_conn("test-ap_id")) == -                        {:error, :error} +               assert Signature.fetch_public_key(make_fake_conn("test-ap_id")) == {:error, :error}               end) =~ "[error] Could not decode user"      end      test "it returns error if public key is empty" do        user = insert(:user, %{info: %{source_data: %{"publicKey" => %{}}}}) -      assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == -               {:error, :error} +      assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == {:error, :error}      end    end @@ -65,8 +63,7 @@ defmodule Pleroma.SignatureTest do      test "it returns key" do        ap_id = "https://mastodon.social/users/lambadalambda" -      assert Signature.refetch_public_key(make_fake_conn(ap_id)) == -               {:ok, @rsa_public_key} +      assert Signature.refetch_public_key(make_fake_conn(ap_id)) == {:ok, @rsa_public_key}      end      test "it returns error when not found user" do @@ -105,4 +102,16 @@ defmodule Pleroma.SignatureTest do               ) == {:error, []}      end    end + +  describe "key_id_to_actor_id/1" do +    test "it properly deduces the actor id for misskey" do +      assert Signature.key_id_to_actor_id("https://example.com/users/1234/publickey") == +               "https://example.com/users/1234" +    end + +    test "it properly deduces the actor id for mastodon and pleroma" do +      assert Signature.key_id_to_actor_id("https://example.com/users/1234#main-key") == +               "https://example.com/users/1234" +    end +  end  end diff --git a/test/support/factory.ex b/test/support/factory.ex index c6a72521a..9ef1b789c 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -119,17 +119,21 @@ defmodule Pleroma.Factory do    def note_activity_factory(attrs \\ %{}) do      user = attrs[:user] || insert(:user)      note = attrs[:note] || insert(:note, user: user) -    attrs = Map.drop(attrs, [:user, :note]) -    data = %{ -      "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(), -      "type" => "Create", -      "actor" => note.data["actor"], -      "to" => note.data["to"], -      "object" => note.data["id"], -      "published" => DateTime.utc_now() |> DateTime.to_iso8601(), -      "context" => note.data["context"] -    } +    data_attrs = attrs[:data_attrs] || %{} +    attrs = Map.drop(attrs, [:user, :note, :data_attrs]) + +    data = +      %{ +        "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(), +        "type" => "Create", +        "actor" => note.data["actor"], +        "to" => note.data["to"], +        "object" => note.data["id"], +        "published" => DateTime.utc_now() |> DateTime.to_iso8601(), +        "context" => note.data["context"] +      } +      |> Map.merge(data_attrs)      %Pleroma.Activity{        data: data, diff --git a/test/tasks/user_test.exs b/test/tasks/user_test.exs index 3d4b08fba..2b9453042 100644 --- a/test/tasks/user_test.exs +++ b/test/tasks/user_test.exs @@ -5,6 +5,9 @@  defmodule Mix.Tasks.Pleroma.UserTest do    alias Pleroma.Repo    alias Pleroma.User +  alias Pleroma.Web.OAuth.Authorization +  alias Pleroma.Web.OAuth.Token +    use Pleroma.DataCase    import Pleroma.Factory @@ -327,6 +330,13 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert_received {:mix_shell, :info, [message]}        assert message =~ "Invite for token #{invite.token} was revoked."      end + +    test "it prints an error message when invite is not exist" do +      Mix.Tasks.Pleroma.User.run(["revoke_invite", "foo"]) + +      assert_received {:mix_shell, :error, [message]} +      assert message =~ "No invite found" +    end    end    describe "running delete_activities" do @@ -337,6 +347,13 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert_received {:mix_shell, :info, [message]}        assert message == "User #{nickname} statuses deleted."      end + +    test "it prints an error message when user is not exist" do +      Mix.Tasks.Pleroma.User.run(["delete_activities", "foo"]) + +      assert_received {:mix_shell, :error, [message]} +      assert message =~ "No local user" +    end    end    describe "running toggle_confirmed" do @@ -364,6 +381,13 @@ defmodule Mix.Tasks.Pleroma.UserTest do        refute user.info.confirmation_pending        refute user.info.confirmation_token      end + +    test "it prints an error message when user is not exist" do +      Mix.Tasks.Pleroma.User.run(["toggle_confirmed", "foo"]) + +      assert_received {:mix_shell, :error, [message]} +      assert message =~ "No local user" +    end    end    describe "search" do @@ -386,4 +410,64 @@ defmodule Mix.Tasks.Pleroma.UserTest do                 User.Search.search("moon fediverse", for_user: user) |> Enum.map(& &1.id)      end    end + +  describe "signing out" do +    test "it deletes all user's tokens and authorizations" do +      user = insert(:user) +      insert(:oauth_token, user: user) +      insert(:oauth_authorization, user: user) + +      assert Repo.get_by(Token, user_id: user.id) +      assert Repo.get_by(Authorization, user_id: user.id) + +      :ok = Mix.Tasks.Pleroma.User.run(["sign_out", user.nickname]) + +      refute Repo.get_by(Token, user_id: user.id) +      refute Repo.get_by(Authorization, user_id: user.id) +    end + +    test "it prints an error message when user is not exist" do +      Mix.Tasks.Pleroma.User.run(["sign_out", "foo"]) + +      assert_received {:mix_shell, :error, [message]} +      assert message =~ "No local user" +    end +  end + +  describe "tagging" do +    test "it add tags to a user" do +      user = insert(:user) + +      :ok = Mix.Tasks.Pleroma.User.run(["tag", user.nickname, "pleroma"]) + +      user = User.get_cached_by_nickname(user.nickname) +      assert "pleroma" in user.tags +    end + +    test "it prints an error message when user is not exist" do +      Mix.Tasks.Pleroma.User.run(["tag", "foo"]) + +      assert_received {:mix_shell, :error, [message]} +      assert message =~ "Could not change user tags" +    end +  end + +  describe "untagging" do +    test "it deletes tags from a user" do +      user = insert(:user, tags: ["pleroma"]) +      assert "pleroma" in user.tags + +      :ok = Mix.Tasks.Pleroma.User.run(["untag", user.nickname, "pleroma"]) + +      user = User.get_cached_by_nickname(user.nickname) +      assert Enum.empty?(user.tags) +    end + +    test "it prints an error message when user is not exist" do +      Mix.Tasks.Pleroma.User.run(["untag", "foo"]) + +      assert_received {:mix_shell, :error, [message]} +      assert message =~ "Could not change user tags" +    end +  end  end diff --git a/test/test_helper.exs b/test/test_helper.exs index 3e33f0335..a927b2c3d 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -2,7 +2,8 @@  # Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only -ExUnit.start() +os_exclude = if :os.type() == {:unix, :darwin}, do: [skip_on_mac: true], else: [] +ExUnit.start(exclude: os_exclude)  Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, :manual)  Mox.defmock(Pleroma.ReverseProxy.ClientMock, for: Pleroma.ReverseProxy.Client)  {:ok, _} = Application.ensure_all_started(:ex_machina) diff --git a/test/user_test.exs b/test/user_test.exs index f7f2ae113..4a756a996 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -824,6 +824,48 @@ defmodule Pleroma.UserTest do        assert User.blocks?(user, collateral_user)      end +    test "does not block domain with same end" do +      user = insert(:user) + +      collateral_user = +        insert(:user, %{ap_id: "https://another-awful-and-rude-instance.com/user/bully"}) + +      {:ok, user} = User.block_domain(user, "awful-and-rude-instance.com") + +      refute User.blocks?(user, collateral_user) +    end + +    test "does not block domain with same end if wildcard added" do +      user = insert(:user) + +      collateral_user = +        insert(:user, %{ap_id: "https://another-awful-and-rude-instance.com/user/bully"}) + +      {:ok, user} = User.block_domain(user, "*.awful-and-rude-instance.com") + +      refute User.blocks?(user, collateral_user) +    end + +    test "blocks domain with wildcard for subdomain" do +      user = insert(:user) + +      user_from_subdomain = +        insert(:user, %{ap_id: "https://subdomain.awful-and-rude-instance.com/user/bully"}) + +      user_with_two_subdomains = +        insert(:user, %{ +          ap_id: "https://subdomain.second_subdomain.awful-and-rude-instance.com/user/bully" +        }) + +      user_domain = insert(:user, %{ap_id: "https://awful-and-rude-instance.com/user/bully"}) + +      {:ok, user} = User.block_domain(user, "*.awful-and-rude-instance.com") + +      assert User.blocks?(user, user_from_subdomain) +      assert User.blocks?(user, user_with_two_subdomains) +      assert User.blocks?(user, user_domain) +    end +      test "unblocks domains" do        user = insert(:user)        collateral_user = insert(:user, %{ap_id: "https://awful-and-rude-instance.com/user/bully"}) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 00adbc0f9..1c0b274cb 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -6,11 +6,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    use Pleroma.DataCase    alias Pleroma.Activity    alias Pleroma.Builders.ActivityBuilder -  alias Pleroma.Instances    alias Pleroma.Object    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub -  alias Pleroma.Web.ActivityPub.Publisher    alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.CommonAPI @@ -1083,113 +1081,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do             } = activity    end -  describe "publish_one/1" do -    test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is not specified", -                   Instances, -                   [:passthrough], -                   [] do -      actor = insert(:user) -      inbox = "http://200.site/users/nick1/inbox" - -      assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) - -      assert called(Instances.set_reachable(inbox)) -    end - -    test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is set", -                   Instances, -                   [:passthrough], -                   [] do -      actor = insert(:user) -      inbox = "http://200.site/users/nick1/inbox" - -      assert {:ok, _} = -               Publisher.publish_one(%{ -                 inbox: inbox, -                 json: "{}", -                 actor: actor, -                 id: 1, -                 unreachable_since: NaiveDateTime.utc_now() -               }) - -      assert called(Instances.set_reachable(inbox)) -    end - -    test_with_mock "does NOT call `Instances.set_reachable` on successful federation if `unreachable_since` is nil", -                   Instances, -                   [:passthrough], -                   [] do -      actor = insert(:user) -      inbox = "http://200.site/users/nick1/inbox" - -      assert {:ok, _} = -               Publisher.publish_one(%{ -                 inbox: inbox, -                 json: "{}", -                 actor: actor, -                 id: 1, -                 unreachable_since: nil -               }) - -      refute called(Instances.set_reachable(inbox)) -    end - -    test_with_mock "calls `Instances.set_unreachable` on target inbox on non-2xx HTTP response code", -                   Instances, -                   [:passthrough], -                   [] do -      actor = insert(:user) -      inbox = "http://404.site/users/nick1/inbox" - -      assert {:error, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) - -      assert called(Instances.set_unreachable(inbox)) -    end - -    test_with_mock "it calls `Instances.set_unreachable` on target inbox on request error of any kind", -                   Instances, -                   [:passthrough], -                   [] do -      actor = insert(:user) -      inbox = "http://connrefused.site/users/nick1/inbox" - -      assert {:error, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) - -      assert called(Instances.set_unreachable(inbox)) -    end - -    test_with_mock "does NOT call `Instances.set_unreachable` if target is reachable", -                   Instances, -                   [:passthrough], -                   [] do -      actor = insert(:user) -      inbox = "http://200.site/users/nick1/inbox" - -      assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) - -      refute called(Instances.set_unreachable(inbox)) -    end - -    test_with_mock "does NOT call `Instances.set_unreachable` if target instance has non-nil `unreachable_since`", -                   Instances, -                   [:passthrough], -                   [] do -      actor = insert(:user) -      inbox = "http://connrefused.site/users/nick1/inbox" - -      assert {:error, _} = -               Publisher.publish_one(%{ -                 inbox: inbox, -                 json: "{}", -                 actor: actor, -                 id: 1, -                 unreachable_since: NaiveDateTime.utc_now() -               }) - -      refute called(Instances.set_unreachable(inbox)) -    end -  end -    test "fetch_activities/2 returns activities addressed to a list " do      user = insert(:user)      member = insert(:user) diff --git a/test/web/activity_pub/mrf/mrf_test.exs b/test/web/activity_pub/mrf/mrf_test.exs new file mode 100644 index 000000000..a9cdf5317 --- /dev/null +++ b/test/web/activity_pub/mrf/mrf_test.exs @@ -0,0 +1,46 @@ +defmodule Pleroma.Web.ActivityPub.MRFTest do +  use ExUnit.Case, async: true +  alias Pleroma.Web.ActivityPub.MRF + +  test "subdomains_regex/1" do +    assert MRF.subdomains_regex(["unsafe.tld", "*.unsafe.tld"]) == [ +             ~r/^unsafe.tld$/, +             ~r/^(.*\.)*unsafe.tld$/ +           ] +  end + +  describe "subdomain_match/2" do +    test "common domains" do +      regexes = MRF.subdomains_regex(["unsafe.tld", "unsafe2.tld"]) + +      assert regexes == [~r/^unsafe.tld$/, ~r/^unsafe2.tld$/] + +      assert MRF.subdomain_match?(regexes, "unsafe.tld") +      assert MRF.subdomain_match?(regexes, "unsafe2.tld") + +      refute MRF.subdomain_match?(regexes, "example.com") +    end + +    test "wildcard domains with one subdomain" do +      regexes = MRF.subdomains_regex(["*.unsafe.tld"]) + +      assert regexes == [~r/^(.*\.)*unsafe.tld$/] + +      assert MRF.subdomain_match?(regexes, "unsafe.tld") +      assert MRF.subdomain_match?(regexes, "sub.unsafe.tld") +      refute MRF.subdomain_match?(regexes, "anotherunsafe.tld") +      refute MRF.subdomain_match?(regexes, "unsafe.tldanother") +    end + +    test "wildcard domains with two subdomains" do +      regexes = MRF.subdomains_regex(["*.unsafe.tld"]) + +      assert regexes == [~r/^(.*\.)*unsafe.tld$/] + +      assert MRF.subdomain_match?(regexes, "unsafe.tld") +      assert MRF.subdomain_match?(regexes, "sub.sub.unsafe.tld") +      refute MRF.subdomain_match?(regexes, "sub.anotherunsafe.tld") +      refute MRF.subdomain_match?(regexes, "sub.unsafe.tldanother") +    end +  end +end diff --git a/test/web/activity_pub/mrf/simple_policy_test.exs b/test/web/activity_pub/mrf/simple_policy_test.exs index 0fd68e103..8e86d2219 100644 --- a/test/web/activity_pub/mrf/simple_policy_test.exs +++ b/test/web/activity_pub/mrf/simple_policy_test.exs @@ -49,6 +49,19 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do        assert SimplePolicy.filter(local_message) == {:ok, local_message}      end + +    test "match with wildcard domain" do +      Config.put([:mrf_simple, :media_removal], ["*.remote.instance"]) +      media_message = build_media_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(media_message) == +               {:ok, +                media_message +                |> Map.put("object", Map.delete(media_message["object"], "attachment"))} + +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end    end    describe "when :media_nsfw" do @@ -74,6 +87,20 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do        assert SimplePolicy.filter(local_message) == {:ok, local_message}      end + +    test "match with wildcard domain" do +      Config.put([:mrf_simple, :media_nsfw], ["*.remote.instance"]) +      media_message = build_media_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(media_message) == +               {:ok, +                media_message +                |> put_in(["object", "tag"], ["foo", "nsfw"]) +                |> put_in(["object", "sensitive"], true)} + +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end    end    defp build_media_message do @@ -106,6 +133,15 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do        assert SimplePolicy.filter(report_message) == {:reject, nil}        assert SimplePolicy.filter(local_message) == {:ok, local_message}      end + +    test "match with wildcard domain" do +      Config.put([:mrf_simple, :report_removal], ["*.remote.instance"]) +      report_message = build_report_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(report_message) == {:reject, nil} +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end    end    defp build_report_message do @@ -146,6 +182,27 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do        assert SimplePolicy.filter(local_message) == {:ok, local_message}      end +    test "match with wildcard domain" do +      {actor, ftl_message} = build_ftl_actor_and_message() + +      ftl_message_actor_host = +        ftl_message +        |> Map.fetch!("actor") +        |> URI.parse() +        |> Map.fetch!(:host) + +      Config.put([:mrf_simple, :federated_timeline_removal], ["*." <> ftl_message_actor_host]) +      local_message = build_local_message() + +      assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message) +      assert actor.follower_address in ftl_message["to"] +      refute actor.follower_address in ftl_message["cc"] +      refute "https://www.w3.org/ns/activitystreams#Public" in ftl_message["to"] +      assert "https://www.w3.org/ns/activitystreams#Public" in ftl_message["cc"] + +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end +      test "has a matching host but only as:Public in to" do        {_actor, ftl_message} = build_ftl_actor_and_message() @@ -192,6 +249,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do        assert SimplePolicy.filter(remote_message) == {:reject, nil}      end + +    test "match with wildcard domain" do +      Config.put([:mrf_simple, :reject], ["*.remote.instance"]) + +      remote_message = build_remote_message() + +      assert SimplePolicy.filter(remote_message) == {:reject, nil} +    end    end    describe "when :accept" do @@ -224,6 +289,16 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do        assert SimplePolicy.filter(local_message) == {:ok, local_message}        assert SimplePolicy.filter(remote_message) == {:ok, remote_message}      end + +    test "match with wildcard domain" do +      Config.put([:mrf_simple, :accept], ["*.remote.instance"]) + +      local_message = build_local_message() +      remote_message = build_remote_message() + +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +      assert SimplePolicy.filter(remote_message) == {:ok, remote_message} +    end    end    describe "when :avatar_removal" do @@ -251,6 +326,15 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do        refute filtered["icon"]      end + +    test "match with wildcard domain" do +      Config.put([:mrf_simple, :avatar_removal], ["*.remote.instance"]) + +      remote_user = build_remote_user() +      {:ok, filtered} = SimplePolicy.filter(remote_user) + +      refute filtered["icon"] +    end    end    describe "when :banner_removal" do @@ -278,6 +362,15 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do        refute filtered["image"]      end + +    test "match with wildcard domain" do +      Config.put([:mrf_simple, :banner_removal], ["*.remote.instance"]) + +      remote_user = build_remote_user() +      {:ok, filtered} = SimplePolicy.filter(remote_user) + +      refute filtered["image"] +    end    end    defp build_local_message do diff --git a/test/web/activity_pub/publisher_test.exs b/test/web/activity_pub/publisher_test.exs new file mode 100644 index 000000000..36a39c84c --- /dev/null +++ b/test/web/activity_pub/publisher_test.exs @@ -0,0 +1,266 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.PublisherTest do +  use Pleroma.DataCase + +  import Pleroma.Factory +  import Tesla.Mock +  import Mock + +  alias Pleroma.Activity +  alias Pleroma.Instances +  alias Pleroma.Web.ActivityPub.Publisher + +  @as_public "https://www.w3.org/ns/activitystreams#Public" + +  setup do +    mock(fn env -> apply(HttpRequestMock, :request, [env]) end) +    :ok +  end + +  describe "determine_inbox/2" do +    test "it returns sharedInbox for messages involving as:Public in to" do +      user = +        insert(:user, %{ +          info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}} +        }) + +      activity = %Activity{ +        data: %{"to" => [@as_public], "cc" => [user.follower_address]} +      } + +      assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox" +    end + +    test "it returns sharedInbox for messages involving as:Public in cc" do +      user = +        insert(:user, %{ +          info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}} +        }) + +      activity = %Activity{ +        data: %{"cc" => [@as_public], "to" => [user.follower_address]} +      } + +      assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox" +    end + +    test "it returns sharedInbox for messages involving multiple recipients in to" do +      user = +        insert(:user, %{ +          info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}} +        }) + +      user_two = insert(:user) +      user_three = insert(:user) + +      activity = %Activity{ +        data: %{"cc" => [], "to" => [user.ap_id, user_two.ap_id, user_three.ap_id]} +      } + +      assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox" +    end + +    test "it returns sharedInbox for messages involving multiple recipients in cc" do +      user = +        insert(:user, %{ +          info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}} +        }) + +      user_two = insert(:user) +      user_three = insert(:user) + +      activity = %Activity{ +        data: %{"to" => [], "cc" => [user.ap_id, user_two.ap_id, user_three.ap_id]} +      } + +      assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox" +    end + +    test "it returns sharedInbox for messages involving multiple recipients in total" do +      user = +        insert(:user, %{ +          info: %{ +            source_data: %{ +              "inbox" => "http://example.com/personal-inbox", +              "endpoints" => %{"sharedInbox" => "http://example.com/inbox"} +            } +          } +        }) + +      user_two = insert(:user) + +      activity = %Activity{ +        data: %{"to" => [user_two.ap_id], "cc" => [user.ap_id]} +      } + +      assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox" +    end + +    test "it returns inbox for messages involving single recipients in total" do +      user = +        insert(:user, %{ +          info: %{ +            source_data: %{ +              "inbox" => "http://example.com/personal-inbox", +              "endpoints" => %{"sharedInbox" => "http://example.com/inbox"} +            } +          } +        }) + +      activity = %Activity{ +        data: %{"to" => [user.ap_id], "cc" => []} +      } + +      assert Publisher.determine_inbox(activity, user) == "http://example.com/personal-inbox" +    end +  end + +  describe "publish_one/1" do +    test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is not specified", +                   Instances, +                   [:passthrough], +                   [] do +      actor = insert(:user) +      inbox = "http://200.site/users/nick1/inbox" + +      assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) + +      assert called(Instances.set_reachable(inbox)) +    end + +    test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is set", +                   Instances, +                   [:passthrough], +                   [] do +      actor = insert(:user) +      inbox = "http://200.site/users/nick1/inbox" + +      assert {:ok, _} = +               Publisher.publish_one(%{ +                 inbox: inbox, +                 json: "{}", +                 actor: actor, +                 id: 1, +                 unreachable_since: NaiveDateTime.utc_now() +               }) + +      assert called(Instances.set_reachable(inbox)) +    end + +    test_with_mock "does NOT call `Instances.set_reachable` on successful federation if `unreachable_since` is nil", +                   Instances, +                   [:passthrough], +                   [] do +      actor = insert(:user) +      inbox = "http://200.site/users/nick1/inbox" + +      assert {:ok, _} = +               Publisher.publish_one(%{ +                 inbox: inbox, +                 json: "{}", +                 actor: actor, +                 id: 1, +                 unreachable_since: nil +               }) + +      refute called(Instances.set_reachable(inbox)) +    end + +    test_with_mock "calls `Instances.set_unreachable` on target inbox on non-2xx HTTP response code", +                   Instances, +                   [:passthrough], +                   [] do +      actor = insert(:user) +      inbox = "http://404.site/users/nick1/inbox" + +      assert {:error, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) + +      assert called(Instances.set_unreachable(inbox)) +    end + +    test_with_mock "it calls `Instances.set_unreachable` on target inbox on request error of any kind", +                   Instances, +                   [:passthrough], +                   [] do +      actor = insert(:user) +      inbox = "http://connrefused.site/users/nick1/inbox" + +      assert {:error, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) + +      assert called(Instances.set_unreachable(inbox)) +    end + +    test_with_mock "does NOT call `Instances.set_unreachable` if target is reachable", +                   Instances, +                   [:passthrough], +                   [] do +      actor = insert(:user) +      inbox = "http://200.site/users/nick1/inbox" + +      assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1}) + +      refute called(Instances.set_unreachable(inbox)) +    end + +    test_with_mock "does NOT call `Instances.set_unreachable` if target instance has non-nil `unreachable_since`", +                   Instances, +                   [:passthrough], +                   [] do +      actor = insert(:user) +      inbox = "http://connrefused.site/users/nick1/inbox" + +      assert {:error, _} = +               Publisher.publish_one(%{ +                 inbox: inbox, +                 json: "{}", +                 actor: actor, +                 id: 1, +                 unreachable_since: NaiveDateTime.utc_now() +               }) + +      refute called(Instances.set_unreachable(inbox)) +    end +  end + +  describe "publish/2" do +    test_with_mock "publishes an activity with BCC to all relevant peers.", +                   Pleroma.Web.Federator.Publisher, +                   [:passthrough], +                   [] do +      follower = +        insert(:user, +          local: false, +          info: %{ +            ap_enabled: true, +            source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"} +          } +        ) + +      actor = insert(:user, follower_address: follower.ap_id) +      user = insert(:user) + +      {:ok, _follower_one} = Pleroma.User.follow(follower, actor) +      actor = refresh_record(actor) + +      note_activity = +        insert(:note_activity, +          recipients: [follower.ap_id], +          data_attrs: %{"bcc" => [user.ap_id]} +        ) + +      res = Publisher.publish(actor, note_activity) +      assert res == :ok + +      assert called( +               Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{ +                 inbox: "https://domain.com/users/nick1/inbox", +                 actor: actor, +                 id: note_activity.data["id"] +               }) +             ) +    end +  end +end diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index ee48b752c..6dda4ae51 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -1010,6 +1010,17 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 "uses" => 0               }      end + +    test "with invalid token" do +      admin = insert(:user, info: %{is_admin: true}) + +      conn = +        build_conn() +        |> assign(:user, admin) +        |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"}) + +      assert json_response(conn, :not_found) == "Not found" +    end    end    describe "GET /api/pleroma/admin/reports/:id" do @@ -1560,7 +1571,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                  %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]},                  %{"tuple" => [":seconds_valid", 60]},                  %{"tuple" => [":path", ""]}, -                %{"tuple" => [":key1", nil]} +                %{"tuple" => [":key1", nil]}, +                %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}                ]              }            ] @@ -1576,7 +1588,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                       %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]},                       %{"tuple" => [":seconds_valid", 60]},                       %{"tuple" => [":path", ""]}, -                     %{"tuple" => [":key1", nil]} +                     %{"tuple" => [":key1", nil]}, +                     %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}                     ]                   }                 ] @@ -1902,6 +1915,63 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do               }      end    end + +  describe "GET /api/pleroma/admin/users/:nickname/statuses" do +    setup do +      admin = insert(:user, info: %{is_admin: true}) +      user = insert(:user) + +      date1 = (DateTime.to_unix(DateTime.utc_now()) + 2000) |> DateTime.from_unix!() +      date2 = (DateTime.to_unix(DateTime.utc_now()) + 1000) |> DateTime.from_unix!() +      date3 = (DateTime.to_unix(DateTime.utc_now()) + 3000) |> DateTime.from_unix!() + +      insert(:note_activity, user: user, published: date1) +      insert(:note_activity, user: user, published: date2) +      insert(:note_activity, user: user, published: date3) + +      conn = +        build_conn() +        |> assign(:user, admin) + +      {:ok, conn: conn, user: user} +    end + +    test "renders user's statuses", %{conn: conn, user: user} do +      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses") + +      assert json_response(conn, 200) |> length() == 3 +    end + +    test "renders user's statuses with a limit", %{conn: conn, user: user} do +      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses?page_size=2") + +      assert json_response(conn, 200) |> length() == 2 +    end + +    test "doesn't return private statuses by default", %{conn: conn, user: user} do +      {:ok, _private_status} = +        CommonAPI.post(user, %{"status" => "private", "visibility" => "private"}) + +      {:ok, _public_status} = +        CommonAPI.post(user, %{"status" => "public", "visibility" => "public"}) + +      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses") + +      assert json_response(conn, 200) |> length() == 4 +    end + +    test "returns private statuses with godmode on", %{conn: conn, user: user} do +      {:ok, _private_status} = +        CommonAPI.post(user, %{"status" => "private", "visibility" => "private"}) + +      {:ok, _public_status} = +        CommonAPI.post(user, %{"status" => "public", "visibility" => "public"}) + +      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses?godmode=true") + +      assert json_response(conn, 200) |> length() == 5 +    end +  end  end  # Needed for testing diff --git a/test/web/admin_api/config_test.exs b/test/web/admin_api/config_test.exs index d41666ef3..3190dc1c8 100644 --- a/test/web/admin_api/config_test.exs +++ b/test/web/admin_api/config_test.exs @@ -238,6 +238,14 @@ defmodule Pleroma.Web.AdminAPI.ConfigTest do        assert Config.from_binary(binary) == [key: "value"]      end +    test "keyword with partial_chain key" do +      binary = +        Config.transform([%{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}]) + +      assert binary == :erlang.term_to_binary(partial_chain: &:hackney_connect.partial_chain/1) +      assert Config.from_binary(binary) == [partial_chain: &:hackney_connect.partial_chain/1] +    end +      test "keyword" do        binary =          Config.transform([ diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs index 69dd4d747..6e143eee4 100644 --- a/test/web/federator_test.exs +++ b/test/web/federator_test.exs @@ -22,6 +22,15 @@ defmodule Pleroma.Web.FederatorTest do      :ok    end +  describe "Publisher.perform" do +    test "call `perform` with unknown task" do +      assert { +               :error, +               "Don't know what to do with this" +             } = Pleroma.Web.Federator.Publisher.perform("test", :ok, :ok) +    end +  end +    describe "Publish an activity" do      setup do        user = insert(:user) diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs index b4b1dd785..ce2e44499 100644 --- a/test/web/mastodon_api/mastodon_api_controller_test.exs +++ b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -2815,11 +2815,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        card_data = %{          "image" => "http://ia.media-imdb.com/images/rock.jpg", -        "provider_name" => "www.imdb.com", -        "provider_url" => "http://www.imdb.com", +        "provider_name" => "example.com", +        "provider_url" => "https://example.com",          "title" => "The Rock",          "type" => "link", -        "url" => "http://www.imdb.com/title/tt0117500/", +        "url" => "https://example.com/ogp",          "description" =>            "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.",          "pleroma" => %{ @@ -2827,7 +2827,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do              "image" => "http://ia.media-imdb.com/images/rock.jpg",              "title" => "The Rock",              "type" => "video.movie", -            "url" => "http://www.imdb.com/title/tt0117500/", +            "url" => "https://example.com/ogp",              "description" =>                "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer."            } @@ -2868,14 +2868,14 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do                 "title" => "Pleroma",                 "description" => "",                 "image" => nil, -               "provider_name" => "pleroma.social", -               "provider_url" => "https://pleroma.social", -               "url" => "https://pleroma.social/", +               "provider_name" => "example.com", +               "provider_url" => "https://example.com", +               "url" => "https://example.com/ogp-missing-data",                 "pleroma" => %{                   "opengraph" => %{                     "title" => "Pleroma",                     "type" => "website", -                   "url" => "https://pleroma.social/" +                   "url" => "https://example.com/ogp-missing-data"                   }                 }               } @@ -3768,6 +3768,38 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        assert Enum.empty?(response)      end + +    test "does not return users who have favorited the status but are blocked", %{ +      conn: %{assigns: %{user: user}} = conn, +      activity: activity +    } do +      other_user = insert(:user) +      {:ok, user} = User.block(user, other_user) + +      {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) + +      response = +        conn +        |> assign(:user, user) +        |> get("/api/v1/statuses/#{activity.id}/favourited_by") +        |> json_response(:ok) + +      assert Enum.empty?(response) +    end + +    test "does not fail on an unauthenticated request", %{conn: conn, activity: activity} do +      other_user = insert(:user) +      {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) + +      response = +        conn +        |> assign(:user, nil) +        |> get("/api/v1/statuses/#{activity.id}/favourited_by") +        |> json_response(:ok) + +      [%{"id" => id}] = response +      assert id == other_user.id +    end    end    describe "GET /api/v1/statuses/:id/reblogged_by" do @@ -3807,6 +3839,38 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        assert Enum.empty?(response)      end + +    test "does not return users who have reblogged the status but are blocked", %{ +      conn: %{assigns: %{user: user}} = conn, +      activity: activity +    } do +      other_user = insert(:user) +      {:ok, user} = User.block(user, other_user) + +      {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + +      response = +        conn +        |> assign(:user, user) +        |> get("/api/v1/statuses/#{activity.id}/reblogged_by") +        |> json_response(:ok) + +      assert Enum.empty?(response) +    end + +    test "does not fail on an unauthenticated request", %{conn: conn, activity: activity} do +      other_user = insert(:user) +      {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + +      response = +        conn +        |> assign(:user, nil) +        |> get("/api/v1/statuses/#{activity.id}/reblogged_by") +        |> json_response(:ok) + +      [%{"id" => id}] = response +      assert id == other_user.id +    end    end    describe "POST /auth/password, with valid parameters" do diff --git a/test/web/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs index aae34804d..92e156347 100644 --- a/test/web/oauth/oauth_controller_test.exs +++ b/test/web/oauth/oauth_controller_test.exs @@ -5,9 +5,7 @@  defmodule Pleroma.Web.OAuth.OAuthControllerTest do    use Pleroma.Web.ConnCase    import Pleroma.Factory -  import Mock -  alias Pleroma.Registration    alias Pleroma.Repo    alias Pleroma.Web.OAuth.Authorization    alias Pleroma.Web.OAuth.OAuthController @@ -108,28 +106,26 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do          "state" => ""        } -      with_mock Pleroma.Web.Auth.Authenticator, -        get_registration: fn _ -> {:ok, registration} end do -        conn = -          get( -            conn, -            "/oauth/twitter/callback", -            %{ -              "oauth_token" => "G-5a3AAAAAAAwMH9AAABaektfSM", -              "oauth_verifier" => "QZl8vUqNvXMTKpdmUnGejJxuHG75WWWs", -              "provider" => "twitter", -              "state" => Poison.encode!(state_params) -            } -          ) +      conn = +        conn +        |> assign(:ueberauth_auth, %{provider: registration.provider, uid: registration.uid}) +        |> get( +          "/oauth/twitter/callback", +          %{ +            "oauth_token" => "G-5a3AAAAAAAwMH9AAABaektfSM", +            "oauth_verifier" => "QZl8vUqNvXMTKpdmUnGejJxuHG75WWWs", +            "provider" => "twitter", +            "state" => Poison.encode!(state_params) +          } +        ) -        assert response = html_response(conn, 302) -        assert redirected_to(conn) =~ ~r/#{redirect_uri}\?code=.+/ -      end +      assert response = html_response(conn, 302) +      assert redirected_to(conn) =~ ~r/#{redirect_uri}\?code=.+/      end      test "with user-unbound registration, GET /oauth/<provider>/callback renders registration_details page",           %{app: app, conn: conn} do -      registration = insert(:registration, user: nil) +      user = insert(:user)        state_params = %{          "scope" => "read write", @@ -138,26 +134,28 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do          "state" => "a_state"        } -      with_mock Pleroma.Web.Auth.Authenticator, -        get_registration: fn _ -> {:ok, registration} end do -        conn = -          get( -            conn, -            "/oauth/twitter/callback", -            %{ -              "oauth_token" => "G-5a3AAAAAAAwMH9AAABaektfSM", -              "oauth_verifier" => "QZl8vUqNvXMTKpdmUnGejJxuHG75WWWs", -              "provider" => "twitter", -              "state" => Poison.encode!(state_params) -            } -          ) +      conn = +        conn +        |> assign(:ueberauth_auth, %{ +          provider: "twitter", +          uid: "171799000", +          info: %{nickname: user.nickname, email: user.email, name: user.name, description: nil} +        }) +        |> get( +          "/oauth/twitter/callback", +          %{ +            "oauth_token" => "G-5a3AAAAAAAwMH9AAABaektfSM", +            "oauth_verifier" => "QZl8vUqNvXMTKpdmUnGejJxuHG75WWWs", +            "provider" => "twitter", +            "state" => Poison.encode!(state_params) +          } +        ) -        assert response = html_response(conn, 200) -        assert response =~ ~r/name="op" type="submit" value="register"/ -        assert response =~ ~r/name="op" type="submit" value="connect"/ -        assert response =~ Registration.email(registration) -        assert response =~ Registration.nickname(registration) -      end +      assert response = html_response(conn, 200) +      assert response =~ ~r/name="op" type="submit" value="register"/ +      assert response =~ ~r/name="op" type="submit" value="connect"/ +      assert response =~ user.email +      assert response =~ user.nickname      end      test "on authentication error, GET /oauth/<provider>/callback redirects to `redirect_uri`", %{ diff --git a/test/web/rich_media/parser_test.exs b/test/web/rich_media/parser_test.exs index 19c19e895..b75bdf96f 100644 --- a/test/web/rich_media/parser_test.exs +++ b/test/web/rich_media/parser_test.exs @@ -59,7 +59,8 @@ defmodule Pleroma.Web.RichMedia.ParserTest do    test "doesn't just add a title" do      assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/non-ogp") == -             {:error, "Found metadata was invalid or incomplete: %{}"} +             {:error, +              "Found metadata was invalid or incomplete: %{url: \"http://example.com/non-ogp\"}"}    end    test "parses ogp" do @@ -71,7 +72,7 @@ defmodule Pleroma.Web.RichMedia.ParserTest do                  description:                    "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.",                  type: "video.movie", -                url: "http://www.imdb.com/title/tt0117500/" +                url: "http://example.com/ogp"                }}    end @@ -84,7 +85,7 @@ defmodule Pleroma.Web.RichMedia.ParserTest do                  description:                    "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.",                  type: "video.movie", -                url: "http://www.imdb.com/title/tt0117500/" +                url: "http://example.com/ogp-missing-title"                }}    end @@ -96,7 +97,8 @@ defmodule Pleroma.Web.RichMedia.ParserTest do                  site: "@flickr",                  image: "https://farm6.staticflickr.com/5510/14338202952_93595258ff_z.jpg",                  title: "Small Island Developing States Photo Submission", -                description: "View the album on Flickr." +                description: "View the album on Flickr.", +                url: "http://example.com/twitter-card"                }}    end @@ -120,7 +122,7 @@ defmodule Pleroma.Web.RichMedia.ParserTest do                  thumbnail_width: 150,                  title: "Bacon Lollys",                  type: "photo", -                url: "https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_b.jpg", +                url: "http://example.com/oembed",                  version: "1.0",                  web_page: "https://www.flickr.com/photos/bees/2362225867/",                  web_page_short_url: "https://flic.kr/p/4AK2sc", diff --git a/test/web/streamer_test.exs b/test/web/streamer_test.exs index 4633d7765..d47b37efb 100644 --- a/test/web/streamer_test.exs +++ b/test/web/streamer_test.exs @@ -65,6 +65,63 @@ defmodule Pleroma.Web.StreamerTest do        Streamer.stream("user:notification", notify)        Task.await(task)      end + +    test "it doesn't send notify to the 'user:notification' stream when a user is blocked", %{ +      user: user +    } do +      blocked = insert(:user) +      {:ok, user} = User.block(user, blocked) + +      task = Task.async(fn -> refute_receive {:text, _}, 4_000 end) + +      Streamer.add_socket( +        "user:notification", +        %{transport_pid: task.pid, assigns: %{user: user}} +      ) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => ":("}) +      {:ok, notif, _} = CommonAPI.favorite(activity.id, blocked) + +      Streamer.stream("user:notification", notif) +      Task.await(task) +    end + +    test "it doesn't send notify to the 'user:notification' stream when a thread is muted", %{ +      user: user +    } do +      user2 = insert(:user) +      task = Task.async(fn -> refute_receive {:text, _}, 4_000 end) + +      Streamer.add_socket( +        "user:notification", +        %{transport_pid: task.pid, assigns: %{user: user}} +      ) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"}) +      {:ok, activity} = CommonAPI.add_mute(user, activity) +      {:ok, notif, _} = CommonAPI.favorite(activity.id, user2) +      Streamer.stream("user:notification", notif) +      Task.await(task) +    end + +    test "it doesn't send notify to the 'user:notification' stream' when a domain is blocked", %{ +      user: user +    } do +      user2 = insert(:user, %{ap_id: "https://hecking-lewd-place.com/user/meanie"}) +      task = Task.async(fn -> refute_receive {:text, _}, 4_000 end) + +      Streamer.add_socket( +        "user:notification", +        %{transport_pid: task.pid, assigns: %{user: user}} +      ) + +      {:ok, user} = User.block_domain(user, "hecking-lewd-place.com") +      {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"}) +      {:ok, notif, _} = CommonAPI.favorite(activity.id, user2) + +      Streamer.stream("user:notification", notif) +      Task.await(task) +    end    end    test "it sends to public" do  | 
