diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/conversation_test.exs | 20 | ||||
| -rw-r--r-- | test/formatter_test.exs | 2 | ||||
| -rw-r--r-- | test/plugs/http_security_plug_test.exs | 133 | ||||
| -rw-r--r-- | test/plugs/legacy_authentication_plug_test.exs | 2 | ||||
| -rw-r--r-- | test/repo_test.exs | 7 | ||||
| -rw-r--r-- | test/support/factory.ex | 14 | ||||
| -rw-r--r-- | test/tasks/database_test.exs | 49 | ||||
| -rw-r--r-- | test/tasks/user_test.exs | 28 | ||||
| -rw-r--r-- | test/user_test.exs | 61 | ||||
| -rw-r--r-- | test/web/activity_pub/activity_pub_test.exs | 35 | ||||
| -rw-r--r-- | test/web/activity_pub/mrf/simple_policy_test.exs | 192 | ||||
| -rw-r--r-- | test/web/activity_pub/visibilty_test.exs | 10 | ||||
| -rw-r--r-- | test/web/admin_api/admin_api_controller_test.exs | 327 | ||||
| -rw-r--r-- | test/web/common_api/common_api_test.exs | 37 | ||||
| -rw-r--r-- | test/web/mastodon_api/mastodon_api_controller_test.exs | 12 | ||||
| -rw-r--r-- | test/web/ostatus/ostatus_test.exs | 6 | 
16 files changed, 844 insertions, 91 deletions
diff --git a/test/conversation_test.exs b/test/conversation_test.exs index 864b2eb03..5903d10ff 100644 --- a/test/conversation_test.exs +++ b/test/conversation_test.exs @@ -11,6 +11,26 @@ defmodule Pleroma.ConversationTest do    import Pleroma.Factory +  test "it goes through old direct conversations" do +    user = insert(:user) +    other_user = insert(:user) + +    {:ok, _activity} = +      CommonAPI.post(user, %{"visibility" => "direct", "status" => "hey @#{other_user.nickname}"}) + +    Repo.delete_all(Conversation) +    Repo.delete_all(Conversation.Participation) + +    refute Repo.one(Conversation) + +    Conversation.bump_for_all_activities() + +    assert Repo.one(Conversation) +    [participation, _p2] = Repo.all(Conversation.Participation) + +    assert participation.read +  end +    test "it creates a conversation for given ap_id" do      assert {:ok, %Conversation{} = conversation} =               Conversation.create_for_ap_id("https://some_ap_id") diff --git a/test/formatter_test.exs b/test/formatter_test.exs index 06f4f6e50..5e7011160 100644 --- a/test/formatter_test.exs +++ b/test/formatter_test.exs @@ -125,7 +125,7 @@ defmodule Pleroma.FormatterTest do        archaeme =          insert(:user, %{            nickname: "archa_eme_", -          info: %Pleroma.User.Info{source_data: %{"url" => "https://archeme/@archa_eme_"}} +          info: %User.Info{source_data: %{"url" => "https://archeme/@archa_eme_"}}          })        archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) diff --git a/test/plugs/http_security_plug_test.exs b/test/plugs/http_security_plug_test.exs index 0cbb7e4b1..7dfd50c1f 100644 --- a/test/plugs/http_security_plug_test.exs +++ b/test/plugs/http_security_plug_test.exs @@ -7,77 +7,96 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlugTest do    alias Pleroma.Config    alias Plug.Conn -  test "it sends CSP headers when enabled", %{conn: conn} do -    Config.put([:http_security, :enabled], true) - -    conn = -      conn -      |> get("/api/v1/instance") - -    refute Conn.get_resp_header(conn, "x-xss-protection") == [] -    refute Conn.get_resp_header(conn, "x-permitted-cross-domain-policies") == [] -    refute Conn.get_resp_header(conn, "x-frame-options") == [] -    refute Conn.get_resp_header(conn, "x-content-type-options") == [] -    refute Conn.get_resp_header(conn, "x-download-options") == [] -    refute Conn.get_resp_header(conn, "referrer-policy") == [] -    refute Conn.get_resp_header(conn, "content-security-policy") == [] -  end +  describe "http security enabled" do +    setup do +      enabled = Config.get([:http_securiy, :enabled]) -  test "it does not send CSP headers when disabled", %{conn: conn} do -    Config.put([:http_security, :enabled], false) +      Config.put([:http_security, :enabled], true) -    conn = -      conn -      |> get("/api/v1/instance") +      on_exit(fn -> +        Config.put([:http_security, :enabled], enabled) +      end) -    assert Conn.get_resp_header(conn, "x-xss-protection") == [] -    assert Conn.get_resp_header(conn, "x-permitted-cross-domain-policies") == [] -    assert Conn.get_resp_header(conn, "x-frame-options") == [] -    assert Conn.get_resp_header(conn, "x-content-type-options") == [] -    assert Conn.get_resp_header(conn, "x-download-options") == [] -    assert Conn.get_resp_header(conn, "referrer-policy") == [] -    assert Conn.get_resp_header(conn, "content-security-policy") == [] -  end +      :ok +    end -  test "it sends STS headers when enabled", %{conn: conn} do -    Config.put([:http_security, :enabled], true) -    Config.put([:http_security, :sts], true) +    test "it sends CSP headers when enabled", %{conn: conn} do +      conn = get(conn, "/api/v1/instance") -    conn = -      conn -      |> get("/api/v1/instance") +      refute Conn.get_resp_header(conn, "x-xss-protection") == [] +      refute Conn.get_resp_header(conn, "x-permitted-cross-domain-policies") == [] +      refute Conn.get_resp_header(conn, "x-frame-options") == [] +      refute Conn.get_resp_header(conn, "x-content-type-options") == [] +      refute Conn.get_resp_header(conn, "x-download-options") == [] +      refute Conn.get_resp_header(conn, "referrer-policy") == [] +      refute Conn.get_resp_header(conn, "content-security-policy") == [] +    end -    refute Conn.get_resp_header(conn, "strict-transport-security") == [] -    refute Conn.get_resp_header(conn, "expect-ct") == [] -  end +    test "it sends STS headers when enabled", %{conn: conn} do +      Config.put([:http_security, :sts], true) -  test "it does not send STS headers when disabled", %{conn: conn} do -    Config.put([:http_security, :enabled], true) -    Config.put([:http_security, :sts], false) +      conn = get(conn, "/api/v1/instance") -    conn = -      conn -      |> get("/api/v1/instance") +      refute Conn.get_resp_header(conn, "strict-transport-security") == [] +      refute Conn.get_resp_header(conn, "expect-ct") == [] +    end -    assert Conn.get_resp_header(conn, "strict-transport-security") == [] -    assert Conn.get_resp_header(conn, "expect-ct") == [] -  end +    test "it does not send STS headers when disabled", %{conn: conn} do +      Config.put([:http_security, :sts], false) + +      conn = get(conn, "/api/v1/instance") + +      assert Conn.get_resp_header(conn, "strict-transport-security") == [] +      assert Conn.get_resp_header(conn, "expect-ct") == [] +    end + +    test "referrer-policy header reflects configured value", %{conn: conn} do +      conn = get(conn, "/api/v1/instance") + +      assert Conn.get_resp_header(conn, "referrer-policy") == ["same-origin"] -  test "referrer-policy header reflects configured value", %{conn: conn} do -    Config.put([:http_security, :enabled], true) +      Config.put([:http_security, :referrer_policy], "no-referrer") -    conn = -      conn -      |> get("/api/v1/instance") +      conn = +        build_conn() +        |> get("/api/v1/instance") -    assert Conn.get_resp_header(conn, "referrer-policy") == ["same-origin"] +      assert Conn.get_resp_header(conn, "referrer-policy") == ["no-referrer"] +    end -    Config.put([:http_security, :referrer_policy], "no-referrer") +    test "it sends `report-to` & `report-uri` CSP response headers" do +      conn = +        build_conn() +        |> get("/api/v1/instance") -    conn = -      build_conn() -      |> get("/api/v1/instance") +      [csp] = Conn.get_resp_header(conn, "content-security-policy") -    assert Conn.get_resp_header(conn, "referrer-policy") == ["no-referrer"] +      assert csp =~ ~r|report-uri https://endpoint.com; report-to csp-endpoint;| + +      [reply_to] = Conn.get_resp_header(conn, "reply-to") + +      assert reply_to == +               "{\"endpoints\":[{\"url\":\"https://endpoint.com\"}],\"group\":\"csp-endpoint\",\"max-age\":10886400}" +    end +  end + +  test "it does not send CSP headers when disabled", %{conn: conn} do +    enabled = Config.get([:http_securiy, :enabled]) + +    Config.put([:http_security, :enabled], false) + +    on_exit(fn -> +      Config.put([:http_security, :enabled], enabled) +    end) + +    conn = get(conn, "/api/v1/instance") + +    assert Conn.get_resp_header(conn, "x-xss-protection") == [] +    assert Conn.get_resp_header(conn, "x-permitted-cross-domain-policies") == [] +    assert Conn.get_resp_header(conn, "x-frame-options") == [] +    assert Conn.get_resp_header(conn, "x-content-type-options") == [] +    assert Conn.get_resp_header(conn, "x-download-options") == [] +    assert Conn.get_resp_header(conn, "referrer-policy") == [] +    assert Conn.get_resp_header(conn, "content-security-policy") == []    end  end diff --git a/test/plugs/legacy_authentication_plug_test.exs b/test/plugs/legacy_authentication_plug_test.exs index 8b0b06772..02f530058 100644 --- a/test/plugs/legacy_authentication_plug_test.exs +++ b/test/plugs/legacy_authentication_plug_test.exs @@ -3,7 +3,7 @@  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Plugs.LegacyAuthenticationPlugTest do -  use Pleroma.Web.ConnCase, async: true +  use Pleroma.Web.ConnCase    alias Pleroma.Plugs.LegacyAuthenticationPlug    alias Pleroma.User diff --git a/test/repo_test.exs b/test/repo_test.exs index 5382289c7..85085a1fa 100644 --- a/test/repo_test.exs +++ b/test/repo_test.exs @@ -1,23 +1,24 @@  defmodule Pleroma.RepoTest do    use Pleroma.DataCase    import Pleroma.Factory +  alias Pleroma.User    describe "find_resource/1" do      test "returns user" do        user = insert(:user) -      query = from(t in Pleroma.User, where: t.id == ^user.id) +      query = from(t in User, where: t.id == ^user.id)        assert Repo.find_resource(query) == {:ok, user}      end      test "returns not_found" do -      query = from(t in Pleroma.User, where: t.id == ^"9gBuXNpD2NyDmmxxdw") +      query = from(t in User, where: t.id == ^"9gBuXNpD2NyDmmxxdw")        assert Repo.find_resource(query) == {:error, :not_found}      end    end    describe "get_assoc/2" do      test "get assoc from preloaded data" do -      user = %Pleroma.User{name: "Agent Smith"} +      user = %User{name: "Agent Smith"}        token = %Pleroma.Web.OAuth.Token{insert(:oauth_token) | user: user}        assert Repo.get_assoc(token, :user) == {:ok, user}      end diff --git a/test/support/factory.ex b/test/support/factory.ex index 2a2954ad6..be6247ca4 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -4,6 +4,7 @@  defmodule Pleroma.Factory do    use ExMachina.Ecto, repo: Pleroma.Repo +  alias Pleroma.User    def participation_factory do      conversation = insert(:conversation) @@ -23,7 +24,7 @@ defmodule Pleroma.Factory do    end    def user_factory do -    user = %Pleroma.User{ +    user = %User{        name: sequence(:name, &"Test テスト User #{&1}"),        email: sequence(:email, &"user#{&1}@example.com"),        nickname: sequence(:nickname, &"nick#{&1}"), @@ -34,16 +35,16 @@ defmodule Pleroma.Factory do      %{        user -      | ap_id: Pleroma.User.ap_id(user), -        follower_address: Pleroma.User.ap_followers(user), -        following: [Pleroma.User.ap_id(user)] +      | ap_id: User.ap_id(user), +        follower_address: User.ap_followers(user), +        following: [User.ap_id(user)]      }    end    def note_factory(attrs \\ %{}) do      text = sequence(:text, &"This is :moominmamma: note #{&1}") -    user = insert(:user) +    user = attrs[:user] || insert(:user)      data = %{        "type" => "Note", @@ -113,7 +114,8 @@ defmodule Pleroma.Factory do    end    def note_activity_factory(attrs \\ %{}) do -    note = attrs[:note] || insert(:note) +    user = attrs[:user] || insert(:user) +    note = attrs[:note] || insert(:note, user: user)      data = %{        "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(), diff --git a/test/tasks/database_test.exs b/test/tasks/database_test.exs new file mode 100644 index 000000000..579130b05 --- /dev/null +++ b/test/tasks/database_test.exs @@ -0,0 +1,49 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Mix.Tasks.Pleroma.DatabaseTest do +  alias Pleroma.Repo +  alias Pleroma.User +  use Pleroma.DataCase + +  import Pleroma.Factory + +  setup_all do +    Mix.shell(Mix.Shell.Process) + +    on_exit(fn -> +      Mix.shell(Mix.Shell.IO) +    end) + +    :ok +  end + +  describe "running update_users_following_followers_counts" do +    test "following and followers count are updated" do +      [user, user2] = insert_pair(:user) +      {:ok, %User{following: following, info: info} = user} = User.follow(user, user2) + +      assert length(following) == 2 +      assert info.follower_count == 0 + +      info_cng = Ecto.Changeset.change(info, %{follower_count: 3}) + +      {:ok, user} = +        user +        |> Ecto.Changeset.change(%{following: following ++ following}) +        |> Ecto.Changeset.put_embed(:info, info_cng) +        |> Repo.update() + +      assert length(user.following) == 4 +      assert user.info.follower_count == 3 + +      assert :ok == Mix.Tasks.Pleroma.Database.run(["update_users_following_followers_counts"]) + +      user = User.get_by_id(user.id) + +      assert length(user.following) == 2 +      assert user.info.follower_count == 0 +    end +  end +end diff --git a/test/tasks/user_test.exs b/test/tasks/user_test.exs index eaf4ecf84..260ce0d95 100644 --- a/test/tasks/user_test.exs +++ b/test/tasks/user_test.exs @@ -3,6 +3,7 @@  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.UserTest do +  alias Pleroma.Repo    alias Pleroma.User    use Pleroma.DataCase @@ -338,4 +339,31 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert message == "User #{nickname} statuses deleted."      end    end + +  describe "running toggle_confirmed" do +    test "user is confirmed" do +      %{id: id, nickname: nickname} = insert(:user, info: %{confirmation_pending: false}) + +      assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname]) +      assert_received {:mix_shell, :info, [message]} +      assert message == "#{nickname} needs confirmation." + +      user = Repo.get(User, id) +      assert user.info.confirmation_pending +      assert user.info.confirmation_token +    end + +    test "user is not confirmed" do +      %{id: id, nickname: nickname} = +        insert(:user, info: %{confirmation_pending: true, confirmation_token: "some token"}) + +      assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname]) +      assert_received {:mix_shell, :info, [message]} +      assert message == "#{nickname} doesn't need confirmation." + +      user = Repo.get(User, id) +      refute user.info.confirmation_pending +      refute user.info.confirmation_token +    end +  end  end diff --git a/test/user_test.exs b/test/user_test.exs index 0b65e89e9..10e463ff8 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -277,7 +277,7 @@ defmodule Pleroma.UserTest do      end      test "it restricts certain nicknames" do -      [restricted_name | _] = Pleroma.Config.get([Pleroma.User, :restricted_nicknames]) +      [restricted_name | _] = Pleroma.Config.get([User, :restricted_nicknames])        assert is_bitstring(restricted_name) @@ -626,6 +626,37 @@ defmodule Pleroma.UserTest do      end    end +  describe "remove duplicates from following list" do +    test "it removes duplicates" do +      user = insert(:user) +      follower = insert(:user) + +      {:ok, %User{following: following} = follower} = User.follow(follower, user) +      assert length(following) == 2 + +      {:ok, follower} = +        follower +        |> User.update_changeset(%{following: following ++ following}) +        |> Repo.update() + +      assert length(follower.following) == 4 + +      {:ok, follower} = User.remove_duplicated_following(follower) +      assert length(follower.following) == 2 +    end + +    test "it does nothing when following is uniq" do +      user = insert(:user) +      follower = insert(:user) + +      {:ok, follower} = User.follow(follower, user) +      assert length(follower.following) == 2 + +      {:ok, follower} = User.remove_duplicated_following(follower) +      assert length(follower.following) == 2 +    end +  end +    describe "follow_import" do      test "it imports user followings from list" do        [user1, user2, user3] = insert_list(3, :user) @@ -873,7 +904,6 @@ defmodule Pleroma.UserTest do        assert [activity] ==                 ActivityPub.fetch_activities([user2.ap_id | user2.following], %{"user" => user2}) -               |> ActivityPub.contain_timeline(user2)        {:ok, _user} = User.deactivate(user) @@ -882,7 +912,6 @@ defmodule Pleroma.UserTest do        assert [] ==                 ActivityPub.fetch_activities([user2.ap_id | user2.following], %{"user" => user2}) -               |> ActivityPub.contain_timeline(user2)      end    end @@ -1194,14 +1223,32 @@ defmodule Pleroma.UserTest do      follower2 = insert(:user)      follower3 = insert(:user) -    {:ok, follower} = Pleroma.User.follow(follower, user) -    {:ok, _follower2} = Pleroma.User.follow(follower2, user) -    {:ok, _follower3} = Pleroma.User.follow(follower3, user) +    {:ok, follower} = User.follow(follower, user) +    {:ok, _follower2} = User.follow(follower2, user) +    {:ok, _follower3} = User.follow(follower3, user) -    {:ok, _} = Pleroma.User.block(user, follower) +    {:ok, _} = User.block(user, follower)      user_show = Pleroma.Web.TwitterAPI.UserView.render("show.json", %{user: user})      assert Map.get(user_show, "followers_count") == 2    end + +  describe "toggle_confirmation/1" do +    test "if user is confirmed" do +      user = insert(:user, info: %{confirmation_pending: false}) +      {:ok, user} = User.toggle_confirmation(user) + +      assert user.info.confirmation_pending +      assert user.info.confirmation_token +    end + +    test "if user is unconfirmed" do +      user = insert(:user, info: %{confirmation_pending: true, confirmation_token: "some token"}) +      {:ok, user} = User.toggle_confirmation(user) + +      refute user.info.confirmation_pending +      refute user.info.confirmation_token +    end +  end  end diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index e38de388b..11fd3d244 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -462,6 +462,29 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      refute Enum.member?(activities, activity_three.id)    end +  test "doesn't return activities from blocked domains" do +    domain = "dogwhistle.zone" +    domain_user = insert(:user, %{ap_id: "https://#{domain}/@pundit"}) +    note = insert(:note, %{data: %{"actor" => domain_user.ap_id}}) +    activity = insert(:note_activity, %{note: note}) +    user = insert(:user) +    {:ok, user} = User.block_domain(user, domain) + +    activities = +      ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) + +    refute activity in activities + +    followed_user = insert(:user) +    ActivityPub.follow(user, followed_user) +    {:ok, repeat_activity, _} = CommonAPI.repeat(activity.id, followed_user) + +    activities = +      ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) + +    refute repeat_activity in activities +  end +    test "doesn't return muted activities" do      activity_one = insert(:note_activity)      activity_two = insert(:note_activity) @@ -960,17 +983,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do            "in_reply_to_status_id" => private_activity_2.id          }) -      activities = ActivityPub.fetch_activities([user1.ap_id | user1.following]) +      activities = +        ActivityPub.fetch_activities([user1.ap_id | user1.following]) +        |> Enum.map(fn a -> a.id end)        private_activity_1 = Activity.get_by_ap_id_with_object(private_activity_1.data["id"]) -      assert [public_activity, private_activity_1, private_activity_3] == activities +      assert [public_activity.id, private_activity_1.id, private_activity_3.id] == activities        assert length(activities) == 3 -      activities = ActivityPub.contain_timeline(activities, user1) +      activities = +        ActivityPub.fetch_activities([user1.ap_id | user1.following], %{"user" => user1}) +        |> Enum.map(fn a -> a.id end) -      assert [public_activity, private_activity_1] == activities +      assert [public_activity.id, private_activity_1.id] == activities        assert length(activities) == 2      end    end diff --git a/test/web/activity_pub/mrf/simple_policy_test.exs b/test/web/activity_pub/mrf/simple_policy_test.exs new file mode 100644 index 000000000..1e0511975 --- /dev/null +++ b/test/web/activity_pub/mrf/simple_policy_test.exs @@ -0,0 +1,192 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do +  use Pleroma.DataCase +  import Pleroma.Factory +  alias Pleroma.Config +  alias Pleroma.Web.ActivityPub.MRF.SimplePolicy + +  setup do +    orig = Config.get!(:mrf_simple) + +    Config.put(:mrf_simple, +      media_removal: [], +      media_nsfw: [], +      federated_timeline_removal: [], +      reject: [], +      accept: [] +    ) + +    on_exit(fn -> +      Config.put(:mrf_simple, orig) +    end) +  end + +  describe "when :media_removal" do +    test "is empty" do +      Config.put([:mrf_simple, :media_removal], []) +      media_message = build_media_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(media_message) == {:ok, media_message} +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end + +    test "has a matching host" 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 +    test "is empty" do +      Config.put([:mrf_simple, :media_nsfw], []) +      media_message = build_media_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(media_message) == {:ok, media_message} +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end + +    test "has a matching host" 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 +    %{ +      "actor" => "https://remote.instance/users/bob", +      "type" => "Create", +      "object" => %{ +        "attachment" => [%{}], +        "tag" => ["foo"], +        "sensitive" => false +      } +    } +  end + +  describe "when :federated_timeline_removal" do +    test "is empty" do +      Config.put([:mrf_simple, :federated_timeline_removal], []) +      {_, ftl_message} = build_ftl_actor_and_message() +      local_message = build_local_message() + +      assert SimplePolicy.filter(ftl_message) == {:ok, ftl_message} +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +    end + +    test "has a matching host" 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 +  end + +  defp build_ftl_actor_and_message do +    actor = insert(:user) + +    {actor, +     %{ +       "actor" => actor.ap_id, +       "to" => ["https://www.w3.org/ns/activitystreams#Public", "http://foo.bar/baz"], +       "cc" => [actor.follower_address, "http://foo.bar/qux"] +     }} +  end + +  describe "when :reject" do +    test "is empty" do +      Config.put([:mrf_simple, :reject], []) + +      remote_message = build_remote_message() + +      assert SimplePolicy.filter(remote_message) == {:ok, remote_message} +    end + +    test "has a matching host" 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 +    test "is empty" do +      Config.put([:mrf_simple, :accept], []) + +      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 + +    test "is not empty but it doesn't have a matching host" do +      Config.put([:mrf_simple, :accept], ["non.matching.remote"]) + +      local_message = build_local_message() +      remote_message = build_remote_message() + +      assert SimplePolicy.filter(local_message) == {:ok, local_message} +      assert SimplePolicy.filter(remote_message) == {:reject, nil} +    end + +    test "has a matching host" 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 + +  defp build_local_message do +    %{ +      "actor" => "#{Pleroma.Web.base_url()}/users/alice", +      "to" => [], +      "cc" => [] +    } +  end + +  defp build_remote_message do +    %{"actor" => "https://remote.instance/users/bob"} +  end +end diff --git a/test/web/activity_pub/visibilty_test.exs b/test/web/activity_pub/visibilty_test.exs index 9c03c8be2..e2584f635 100644 --- a/test/web/activity_pub/visibilty_test.exs +++ b/test/web/activity_pub/visibilty_test.exs @@ -96,6 +96,16 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do      refute Visibility.visible_for_user?(direct, unrelated)    end +  test "doesn't die when the user doesn't exist", +       %{ +         direct: direct, +         user: user +       } do +    Repo.delete(user) +    Cachex.clear(:user_cache) +    refute Visibility.is_private?(direct) +  end +    test "get_visibility", %{      public: public,      private: private, diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index 6c1897b5a..ca12c7215 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -5,8 +5,10 @@  defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    use Pleroma.Web.ConnCase +  alias Pleroma.Activity    alias Pleroma.User    alias Pleroma.UserInviteToken +  alias Pleroma.Web.CommonAPI    import Pleroma.Factory    describe "/api/pleroma/admin/users" do @@ -949,4 +951,329 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do               }      end    end + +  describe "GET /api/pleroma/admin/reports/:id" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) + +      %{conn: assign(conn, :user, admin)} +    end + +    test "returns report by its id", %{conn: conn} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      response = +        conn +        |> get("/api/pleroma/admin/reports/#{report_id}") +        |> json_response(:ok) + +      assert response["id"] == report_id +    end + +    test "returns 404 when report id is invalid", %{conn: conn} do +      conn = get(conn, "/api/pleroma/admin/reports/test") + +      assert json_response(conn, :not_found) == "Not found" +    end +  end + +  describe "PUT /api/pleroma/admin/reports/:id" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      %{conn: assign(conn, :user, admin), id: report_id} +    end + +    test "mark report as resolved", %{conn: conn, id: id} do +      response = +        conn +        |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "resolved"}) +        |> json_response(:ok) + +      assert response["state"] == "resolved" +    end + +    test "closes report", %{conn: conn, id: id} do +      response = +        conn +        |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "closed"}) +        |> json_response(:ok) + +      assert response["state"] == "closed" +    end + +    test "returns 400 when state is unknown", %{conn: conn, id: id} do +      conn = +        conn +        |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "test"}) + +      assert json_response(conn, :bad_request) == "Unsupported state" +    end + +    test "returns 404 when report is not exist", %{conn: conn} do +      conn = +        conn +        |> put("/api/pleroma/admin/reports/test", %{"state" => "closed"}) + +      assert json_response(conn, :not_found) == "Not found" +    end +  end + +  describe "GET /api/pleroma/admin/reports" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) + +      %{conn: assign(conn, :user, admin)} +    end + +    test "returns empty response when no reports created", %{conn: conn} do +      response = +        conn +        |> get("/api/pleroma/admin/reports") +        |> json_response(:ok) + +      assert Enum.empty?(response["reports"]) +    end + +    test "returns reports", %{conn: conn} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      response = +        conn +        |> get("/api/pleroma/admin/reports") +        |> json_response(:ok) + +      [report] = response["reports"] + +      assert length(response["reports"]) == 1 +      assert report["id"] == report_id +    end + +    test "returns reports with specified state", %{conn: conn} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: first_report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      {:ok, %{id: second_report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I don't like this user" +        }) + +      CommonAPI.update_report_state(second_report_id, "closed") + +      response = +        conn +        |> get("/api/pleroma/admin/reports", %{ +          "state" => "open" +        }) +        |> json_response(:ok) + +      [open_report] = response["reports"] + +      assert length(response["reports"]) == 1 +      assert open_report["id"] == first_report_id + +      response = +        conn +        |> get("/api/pleroma/admin/reports", %{ +          "state" => "closed" +        }) +        |> json_response(:ok) + +      [closed_report] = response["reports"] + +      assert length(response["reports"]) == 1 +      assert closed_report["id"] == second_report_id + +      response = +        conn +        |> get("/api/pleroma/admin/reports", %{ +          "state" => "resolved" +        }) +        |> json_response(:ok) + +      assert Enum.empty?(response["reports"]) +    end + +    test "returns 403 when requested by a non-admin" do +      user = insert(:user) + +      conn = +        build_conn() +        |> assign(:user, user) +        |> get("/api/pleroma/admin/reports") + +      assert json_response(conn, :forbidden) == %{"error" => "User is not admin."} +    end + +    test "returns 403 when requested by anonymous" do +      conn = +        build_conn() +        |> get("/api/pleroma/admin/reports") + +      assert json_response(conn, :forbidden) == %{"error" => "Invalid credentials."} +    end +  end + +  describe "POST /api/pleroma/admin/reports/:id/respond" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) + +      %{conn: assign(conn, :user, admin)} +    end + +    test "returns created dm", %{conn: conn} do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      response = +        conn +        |> post("/api/pleroma/admin/reports/#{report_id}/respond", %{ +          "status" => "I will check it out" +        }) +        |> json_response(:ok) + +      recipients = Enum.map(response["mentions"], & &1["username"]) + +      assert conn.assigns[:user].nickname in recipients +      assert reporter.nickname in recipients +      assert response["content"] == "I will check it out" +      assert response["visibility"] == "direct" +    end + +    test "returns 400 when status is missing", %{conn: conn} do +      conn = post(conn, "/api/pleroma/admin/reports/test/respond") + +      assert json_response(conn, :bad_request) == "Invalid parameters" +    end + +    test "returns 404 when report id is invalid", %{conn: conn} do +      conn = +        post(conn, "/api/pleroma/admin/reports/test/respond", %{ +          "status" => "foo" +        }) + +      assert json_response(conn, :not_found) == "Not found" +    end +  end + +  describe "PUT /api/pleroma/admin/statuses/:id" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) +      activity = insert(:note_activity) + +      %{conn: assign(conn, :user, admin), id: activity.id} +    end + +    test "toggle sensitive flag", %{conn: conn, id: id} do +      response = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"}) +        |> json_response(:ok) + +      assert response["sensitive"] + +      response = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"}) +        |> json_response(:ok) + +      refute response["sensitive"] +    end + +    test "change visibility flag", %{conn: conn, id: id} do +      response = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "public"}) +        |> json_response(:ok) + +      assert response["visibility"] == "public" + +      response = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "private"}) +        |> json_response(:ok) + +      assert response["visibility"] == "private" + +      response = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "unlisted"}) +        |> json_response(:ok) + +      assert response["visibility"] == "unlisted" +    end + +    test "returns 400 when visibility is unknown", %{conn: conn, id: id} do +      conn = +        conn +        |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "test"}) + +      assert json_response(conn, :bad_request) == "Unsupported visibility" +    end +  end + +  describe "DELETE /api/pleroma/admin/statuses/:id" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) +      activity = insert(:note_activity) + +      %{conn: assign(conn, :user, admin), id: activity.id} +    end + +    test "deletes status", %{conn: conn, id: id} do +      conn +      |> delete("/api/pleroma/admin/statuses/#{id}") +      |> json_response(:ok) + +      refute Activity.get_by_id(id) +    end + +    test "returns error when status is not exist", %{conn: conn} do +      conn = +        conn +        |> delete("/api/pleroma/admin/statuses/test") + +      assert json_response(conn, :bad_request) == "Could not delete" +    end +  end  end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 84744e5af..58305d09b 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -272,10 +272,41 @@ defmodule Pleroma.Web.CommonAPITest do                 data: %{                   "type" => "Flag",                   "content" => ^comment, -                 "object" => [^target_ap_id, ^activity_ap_id] +                 "object" => [^target_ap_id, ^activity_ap_id], +                 "state" => "open"                 }               } = flag_activity      end + +    test "updates report state" do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %Activity{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      {:ok, report} = CommonAPI.update_report_state(report_id, "resolved") + +      assert report.data["state"] == "resolved" +    end + +    test "does not update report state when state is unsupported" do +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %Activity{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      assert CommonAPI.update_report_state(report_id, "test") == {:error, "Unsupported state"} +    end    end    describe "reblog muting" do @@ -290,14 +321,14 @@ defmodule Pleroma.Web.CommonAPITest do      test "add a reblog mute", %{muter: muter, muted: muted} do        {:ok, muter} = CommonAPI.hide_reblogs(muter, muted) -      assert Pleroma.User.showing_reblogs?(muter, muted) == false +      assert User.showing_reblogs?(muter, muted) == false      end      test "remove a reblog mute", %{muter: muter, muted: muted} do        {:ok, muter} = CommonAPI.hide_reblogs(muter, muted)        {:ok, muter} = CommonAPI.show_reblogs(muter, muted) -      assert Pleroma.User.showing_reblogs?(muter, muted) == true +      assert User.showing_reblogs?(muter, muted) == true      end    end  end diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs index 40e7739e7..cbff141c8 100644 --- a/test/web/mastodon_api/mastodon_api_controller_test.exs +++ b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -446,7 +446,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do    end    test "verify_credentials default scope unlisted", %{conn: conn} do -    user = insert(:user, %{info: %Pleroma.User.Info{default_scope: "unlisted"}}) +    user = insert(:user, %{info: %User.Info{default_scope: "unlisted"}})      conn =        conn @@ -1322,7 +1322,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do    describe "locked accounts" do      test "/api/v1/follow_requests works" do -      user = insert(:user, %{info: %Pleroma.User.Info{locked: true}}) +      user = insert(:user, %{info: %User.Info{locked: true}})        other_user = insert(:user)        {:ok, _activity} = ActivityPub.follow(other_user, user) @@ -1367,7 +1367,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      end      test "verify_credentials", %{conn: conn} do -      user = insert(:user, %{info: %Pleroma.User.Info{default_scope: "private"}}) +      user = insert(:user, %{info: %User.Info{default_scope: "private"}})        conn =          conn @@ -1379,7 +1379,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      end      test "/api/v1/follow_requests/:id/reject works" do -      user = insert(:user, %{info: %Pleroma.User.Info{locked: true}}) +      user = insert(:user, %{info: %User.Info{locked: true}})        other_user = insert(:user)        {:ok, _activity} = ActivityPub.follow(other_user, user) @@ -2129,7 +2129,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do          |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")          |> json_response(:ok) -      assert length(anonymous_response) == 0 +      assert Enum.empty?(anonymous_response)      end      test "does not return others' favorited DM when user is not one of recipients", %{ @@ -2153,7 +2153,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do          |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")          |> json_response(:ok) -      assert length(response) == 0 +      assert Enum.empty?(response)      end      test "paginates favorites using since_id and max_id", %{ diff --git a/test/web/ostatus/ostatus_test.exs b/test/web/ostatus/ostatus_test.exs index 2916caf8d..f6be16862 100644 --- a/test/web/ostatus/ostatus_test.exs +++ b/test/web/ostatus/ostatus_test.exs @@ -355,7 +355,7 @@ defmodule Pleroma.Web.OStatusTest do        {:ok, user} = OStatus.find_or_make_user(uri) -      user = Pleroma.User.get_cached_by_id(user.id) +      user = User.get_cached_by_id(user.id)        assert user.name == "Constance Variable"        assert user.nickname == "lambadalambda@social.heldscal.la"        assert user.local == false @@ -374,7 +374,7 @@ defmodule Pleroma.Web.OStatusTest do        {:ok, user} = OStatus.find_or_make_user(uri)        assert user.info == -               %Pleroma.User.Info{ +               %User.Info{                   id: user.info.id,                   ap_enabled: false,                   background: %{}, @@ -407,7 +407,7 @@ defmodule Pleroma.Web.OStatusTest do        {:ok, user} = OStatus.find_or_make_user(uri)        old_name = user.name        old_bio = user.bio -      change = Ecto.Changeset.change(user, %{avatar: nil, bio: nil, old_name: nil}) +      change = Ecto.Changeset.change(user, %{avatar: nil, bio: nil, name: nil})        {:ok, user} = Repo.update(change)        refute user.avatar  | 
