diff options
Diffstat (limited to 'test/web')
63 files changed, 1143 insertions, 572 deletions
| diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index bd8e0b5cc..573853afa 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -26,12 +26,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      :ok    end -  clear_config([:instance, :federating]) do -    Config.put([:instance, :federating], true) -  end +  setup do: clear_config([:instance, :federating], true)    describe "/relay" do -    clear_config([:instance, :allow_relay]) +    setup do: clear_config([:instance, :allow_relay])      test "with the relay active, it returns the relay user", %{conn: conn} do        res = @@ -1227,8 +1225,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        |> json_response(403)      end -    clear_config([:media_proxy]) -    clear_config([Pleroma.Upload]) +    setup do: clear_config([:media_proxy]) +    setup do: clear_config([Pleroma.Upload])      test "POST /api/ap/upload_media", %{conn: conn} do        user = insert(:user) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 2ea03bbf9..17e7b97de 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -27,7 +27,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      :ok    end -  clear_config([:instance, :federating]) +  setup do: clear_config([:instance, :federating])    describe "streaming out participations" do      test "it streams them out" do @@ -1396,7 +1396,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    end    describe "deletion" do -    clear_config([:instance, :rewrite_policy]) +    setup do: clear_config([:instance, :rewrite_policy])      test "it reverts deletion on error" do        note = insert(:note_activity) @@ -1425,6 +1425,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert Repo.get(Object, object.id).data["type"] == "Tombstone"      end +    test "it doesn't fail when an activity was already deleted" do +      {:ok, delete} = insert(:note_activity) |> Object.normalize() |> ActivityPub.delete() + +      assert {:ok, ^delete} = delete |> Object.normalize() |> ActivityPub.delete() +    end +      test "decrements user note count only for public activities" do        user = insert(:user, note_count: 10) @@ -1580,7 +1586,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    end    describe "update" do -    clear_config([:instance, :max_pinned_statuses]) +    setup do: clear_config([:instance, :max_pinned_statuses])      test "it creates an update activity with the new user data" do        user = insert(:user) diff --git a/test/web/activity_pub/mrf/anti_followbot_policy_test.exs b/test/web/activity_pub/mrf/anti_followbot_policy_test.exs index 37a7bfcf7..fca0de7c6 100644 --- a/test/web/activity_pub/mrf/anti_followbot_policy_test.exs +++ b/test/web/activity_pub/mrf/anti_followbot_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicyTest do diff --git a/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs b/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs index b524fdd23..1a13699be 100644 --- a/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs +++ b/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do @@ -110,6 +110,15 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do    end    describe "with unknown actors" do +    setup do +      Tesla.Mock.mock(fn +        %{method: :get, url: "http://invalid.actor"} -> +          %Tesla.Env{status: 500, body: ""} +      end) + +      :ok +    end +      test "it rejects posts without links" do        message =          @linkless_message diff --git a/test/web/activity_pub/mrf/ensure_re_prepended_test.exs b/test/web/activity_pub/mrf/ensure_re_prepended_test.exs index dbc8b9e80..38ddec5bb 100644 --- a/test/web/activity_pub/mrf/ensure_re_prepended_test.exs +++ b/test/web/activity_pub/mrf/ensure_re_prepended_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.EnsureRePrependedTest do diff --git a/test/web/activity_pub/mrf/hellthread_policy_test.exs b/test/web/activity_pub/mrf/hellthread_policy_test.exs index 916b95692..95ef0b168 100644 --- a/test/web/activity_pub/mrf/hellthread_policy_test.exs +++ b/test/web/activity_pub/mrf/hellthread_policy_test.exs @@ -26,7 +26,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicyTest do      [user: user, message: message]    end -  clear_config(:mrf_hellthread) +  setup do: clear_config(:mrf_hellthread)    describe "reject" do      test "rejects the message if the recipient count is above reject_threshold", %{ diff --git a/test/web/activity_pub/mrf/keyword_policy_test.exs b/test/web/activity_pub/mrf/keyword_policy_test.exs index 18242a889..fd1f7aec8 100644 --- a/test/web/activity_pub/mrf/keyword_policy_test.exs +++ b/test/web/activity_pub/mrf/keyword_policy_test.exs @@ -7,7 +7,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicyTest do    alias Pleroma.Web.ActivityPub.MRF.KeywordPolicy -  clear_config(:mrf_keyword) +  setup do: clear_config(:mrf_keyword)    setup do      Pleroma.Config.put([:mrf_keyword], %{reject: [], federated_timeline_removal: [], replace: []}) diff --git a/test/web/activity_pub/mrf/mention_policy_test.exs b/test/web/activity_pub/mrf/mention_policy_test.exs index 08f7be542..aa003bef5 100644 --- a/test/web/activity_pub/mrf/mention_policy_test.exs +++ b/test/web/activity_pub/mrf/mention_policy_test.exs @@ -7,7 +7,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do    alias Pleroma.Web.ActivityPub.MRF.MentionPolicy -  clear_config(:mrf_mention) +  setup do: clear_config(:mrf_mention)    test "pass filter if allow list is empty" do      Pleroma.Config.delete([:mrf_mention]) diff --git a/test/web/activity_pub/mrf/mrf_test.exs b/test/web/activity_pub/mrf/mrf_test.exs index 04709df17..c941066f2 100644 --- a/test/web/activity_pub/mrf/mrf_test.exs +++ b/test/web/activity_pub/mrf/mrf_test.exs @@ -60,7 +60,7 @@ defmodule Pleroma.Web.ActivityPub.MRFTest do    end    describe "describe/0" do -    clear_config([:instance, :rewrite_policy]) +    setup do: clear_config([:instance, :rewrite_policy])      test "it works as expected with noop policy" do        expected = %{ diff --git a/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs b/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs index 63ed71129..64ea61dd4 100644 --- a/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs +++ b/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.NoPlaceholderTextPolicyTest do diff --git a/test/web/activity_pub/mrf/normalize_markup_test.exs b/test/web/activity_pub/mrf/normalize_markup_test.exs index 0207be56b..9b39c45bd 100644 --- a/test/web/activity_pub/mrf/normalize_markup_test.exs +++ b/test/web/activity_pub/mrf/normalize_markup_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.NormalizeMarkupTest do diff --git a/test/web/activity_pub/mrf/object_age_policy_test.exs b/test/web/activity_pub/mrf/object_age_policy_test.exs index 643609da4..7ee195eeb 100644 --- a/test/web/activity_pub/mrf/object_age_policy_test.exs +++ b/test/web/activity_pub/mrf/object_age_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do @@ -9,12 +9,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do    alias Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy    alias Pleroma.Web.ActivityPub.Visibility -  clear_config([:mrf_object_age]) do -    Config.put(:mrf_object_age, -      threshold: 172_800, -      actions: [:delist, :strip_followers] -    ) -  end +  setup do: +          clear_config(:mrf_object_age, +            threshold: 172_800, +            actions: [:delist, :strip_followers] +          )    setup_all do      Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) diff --git a/test/web/activity_pub/mrf/reject_non_public_test.exs b/test/web/activity_pub/mrf/reject_non_public_test.exs index fc1d190bb..f36299b86 100644 --- a/test/web/activity_pub/mrf/reject_non_public_test.exs +++ b/test/web/activity_pub/mrf/reject_non_public_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublicTest do @@ -8,7 +8,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublicTest do    alias Pleroma.Web.ActivityPub.MRF.RejectNonPublic -  clear_config([:mrf_rejectnonpublic]) +  setup do: clear_config([:mrf_rejectnonpublic])    describe "public message" do      test "it's allowed when address is public" do diff --git a/test/web/activity_pub/mrf/simple_policy_test.exs b/test/web/activity_pub/mrf/simple_policy_test.exs index df0f223f8..91c24c2d9 100644 --- a/test/web/activity_pub/mrf/simple_policy_test.exs +++ b/test/web/activity_pub/mrf/simple_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do @@ -8,18 +8,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do    alias Pleroma.Config    alias Pleroma.Web.ActivityPub.MRF.SimplePolicy -  clear_config([:mrf_simple]) do -    Config.put(:mrf_simple, -      media_removal: [], -      media_nsfw: [], -      federated_timeline_removal: [], -      report_removal: [], -      reject: [], -      accept: [], -      avatar_removal: [], -      banner_removal: [] -    ) -  end +  setup do: +          clear_config(:mrf_simple, +            media_removal: [], +            media_nsfw: [], +            federated_timeline_removal: [], +            report_removal: [], +            reject: [], +            accept: [], +            avatar_removal: [], +            banner_removal: [] +          )    describe "when :media_removal" do      test "is empty" do diff --git a/test/web/activity_pub/mrf/subchain_policy_test.exs b/test/web/activity_pub/mrf/subchain_policy_test.exs index 221b8958e..fff66cb7e 100644 --- a/test/web/activity_pub/mrf/subchain_policy_test.exs +++ b/test/web/activity_pub/mrf/subchain_policy_test.exs @@ -13,8 +13,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SubchainPolicyTest do      "type" => "Create",      "object" => %{"content" => "hi"}    } - -  clear_config([:mrf_subchain, :match_actor]) +  setup do: clear_config([:mrf_subchain, :match_actor])    test "it matches and processes subchains when the actor matches a configured target" do      Pleroma.Config.put([:mrf_subchain, :match_actor], %{ diff --git a/test/web/activity_pub/mrf/user_allowlist_policy_test.exs b/test/web/activity_pub/mrf/user_allowlist_policy_test.exs index 87c9e1b29..724bae058 100644 --- a/test/web/activity_pub/mrf/user_allowlist_policy_test.exs +++ b/test/web/activity_pub/mrf/user_allowlist_policy_test.exs @@ -7,7 +7,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.UserAllowListPolicyTest do    alias Pleroma.Web.ActivityPub.MRF.UserAllowListPolicy -  clear_config([:mrf_user_allowlist, :localhost]) +  setup do: clear_config([:mrf_user_allowlist, :localhost])    test "pass filter if allow list is empty" do      actor = insert(:user) diff --git a/test/web/activity_pub/mrf/vocabulary_policy_test.exs b/test/web/activity_pub/mrf/vocabulary_policy_test.exs index d9207b095..69f22bb77 100644 --- a/test/web/activity_pub/mrf/vocabulary_policy_test.exs +++ b/test/web/activity_pub/mrf/vocabulary_policy_test.exs @@ -8,7 +8,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.VocabularyPolicyTest do    alias Pleroma.Web.ActivityPub.MRF.VocabularyPolicy    describe "accept" do -    clear_config([:mrf_vocabulary, :accept]) +    setup do: clear_config([:mrf_vocabulary, :accept])      test "it accepts based on parent activity type" do        Pleroma.Config.put([:mrf_vocabulary, :accept], ["Like"]) @@ -65,7 +65,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.VocabularyPolicyTest do    end    describe "reject" do -    clear_config([:mrf_vocabulary, :reject]) +    setup do: clear_config([:mrf_vocabulary, :reject])      test "it rejects based on parent activity type" do        Pleroma.Config.put([:mrf_vocabulary, :reject], ["Like"]) diff --git a/test/web/activity_pub/publisher_test.exs b/test/web/activity_pub/publisher_test.exs index da26b13f7..801da03c1 100644 --- a/test/web/activity_pub/publisher_test.exs +++ b/test/web/activity_pub/publisher_test.exs @@ -23,9 +23,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      :ok    end -  clear_config_all([:instance, :federating]) do -    Pleroma.Config.put([:instance, :federating], true) -  end +  setup_all do: clear_config([:instance, :federating], true)    describe "gather_webfinger_links/1" do      test "it returns links" do diff --git a/test/web/activity_pub/relay_test.exs b/test/web/activity_pub/relay_test.exs index e3115dcd8..9e16e39c4 100644 --- a/test/web/activity_pub/relay_test.exs +++ b/test/web/activity_pub/relay_test.exs @@ -68,7 +68,7 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do    end    describe "publish/1" do -    clear_config([:instance, :federating]) +    setup do: clear_config([:instance, :federating])      test "returns error when activity not `Create` type" do        activity = insert(:like_activity) @@ -89,6 +89,11 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do            }          ) +      Tesla.Mock.mock(fn +        %{method: :get, url: "http://mastodon.example.org/eee/99541947525187367"} -> +          %Tesla.Env{status: 500, body: ""} +      end) +        assert capture_log(fn ->                 assert Relay.publish(activity) == {:error, nil}               end) =~ "[error] error: nil" diff --git a/test/web/activity_pub/transmogrifier/follow_handling_test.exs b/test/web/activity_pub/transmogrifier/follow_handling_test.exs index c3d3f9830..967389fae 100644 --- a/test/web/activity_pub/transmogrifier/follow_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/follow_handling_test.exs @@ -19,7 +19,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do    end    describe "handle_incoming" do -    clear_config([:user, :deny_follow_blocked]) +    setup do: clear_config([:user, :deny_follow_blocked])      test "it works for osada follow request" do        user = insert(:user) diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 83372ec7e..6dfd823f7 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -25,7 +25,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do      :ok    end -  clear_config([:instance, :max_remote_account_fields]) +  setup do: clear_config([:instance, :max_remote_account_fields])    describe "handle_incoming" do      test "it ignores an incoming notice if we already have it" do @@ -1353,11 +1353,8 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    end    describe "`handle_incoming/2`, Mastodon format `replies` handling" do -    clear_config([:activitypub, :note_replies_output_limit]) do -      Pleroma.Config.put([:activitypub, :note_replies_output_limit], 5) -    end - -    clear_config([:instance, :federation_incoming_replies_max_depth]) +    setup do: clear_config([:activitypub, :note_replies_output_limit], 5) +    setup do: clear_config([:instance, :federation_incoming_replies_max_depth])      setup do        data = @@ -1396,11 +1393,8 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    end    describe "`handle_incoming/2`, Pleroma format `replies` handling" do -    clear_config([:activitypub, :note_replies_output_limit]) do -      Pleroma.Config.put([:activitypub, :note_replies_output_limit], 5) -    end - -    clear_config([:instance, :federation_incoming_replies_max_depth]) +    setup do: clear_config([:activitypub, :note_replies_output_limit], 5) +    setup do: clear_config([:instance, :federation_incoming_replies_max_depth])      setup do        user = insert(:user) @@ -1884,7 +1878,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    end    describe "fix_in_reply_to/2" do -    clear_config([:instance, :federation_incoming_replies_max_depth]) +    setup do: clear_config([:instance, :federation_incoming_replies_max_depth])      setup do        data = Poison.decode!(File.read!("test/fixtures/mastodon-post-activity.json")) @@ -2147,9 +2141,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    end    describe "set_replies/1" do -    clear_config([:activitypub, :note_replies_output_limit]) do -      Pleroma.Config.put([:activitypub, :note_replies_output_limit], 2) -    end +    setup do: clear_config([:activitypub, :note_replies_output_limit], 2)      test "returns unmodified object if activity doesn't have self-replies" do        data = Poison.decode!(File.read!("test/fixtures/mastodon-post-activity.json")) diff --git a/test/web/activity_pub/views/object_view_test.exs b/test/web/activity_pub/views/object_view_test.exs index f6796ad4a..6c006206b 100644 --- a/test/web/activity_pub/views/object_view_test.exs +++ b/test/web/activity_pub/views/object_view_test.exs @@ -37,9 +37,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectViewTest do    end    describe "note activity's `replies` collection rendering" do -    clear_config([:activitypub, :note_replies_output_limit]) do -      Pleroma.Config.put([:activitypub, :note_replies_output_limit], 5) -    end +    setup do: clear_config([:activitypub, :note_replies_output_limit], 5)      test "renders `replies` collection for a note activity" do        user = insert(:user) diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index e4c152fb7..fe8a086d8 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -21,7 +21,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    alias Pleroma.UserInviteToken    alias Pleroma.Web.ActivityPub.Relay    alias Pleroma.Web.CommonAPI -  alias Pleroma.Web.MastodonAPI.StatusView    alias Pleroma.Web.MediaProxy    setup_all do @@ -43,9 +42,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "with [:auth, :enforce_oauth_admin_scope_usage]," do -    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do -      Config.put([:auth, :enforce_oauth_admin_scope_usage], true) -    end +    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], true)      test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope",           %{admin: admin} do @@ -93,9 +90,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "unless [:auth, :enforce_oauth_admin_scope_usage]," do -    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do -      Config.put([:auth, :enforce_oauth_admin_scope_usage], false) -    end +    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false)      test "GET /api/pleroma/admin/users/:nickname requires " <>             "read:accounts or admin:read:accounts or broader scope", @@ -581,13 +576,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "POST /api/pleroma/admin/email_invite, with valid config" do -    clear_config([:instance, :registrations_open]) do -      Config.put([:instance, :registrations_open], false) -    end - -    clear_config([:instance, :invites_enabled]) do -      Config.put([:instance, :invites_enabled], true) -    end +    setup do: clear_config([:instance, :registrations_open], false) +    setup do: clear_config([:instance, :invites_enabled], true)      test "sends invitation and returns 204", %{admin: admin, conn: conn} do        recipient_email = "foo@bar.com" @@ -638,8 +628,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do -    clear_config([:instance, :registrations_open]) -    clear_config([:instance, :invites_enabled]) +    setup do: clear_config([:instance, :registrations_open]) +    setup do: clear_config([:instance, :invites_enabled])      test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn} do        Config.put([:instance, :registrations_open], false) @@ -1595,208 +1585,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "GET /api/pleroma/admin/grouped_reports" do -    setup do -      [reporter, target_user] = insert_pair(:user) - -      date1 = (DateTime.to_unix(DateTime.utc_now()) + 1000) |> DateTime.from_unix!() -      date2 = (DateTime.to_unix(DateTime.utc_now()) + 2000) |> DateTime.from_unix!() -      date3 = (DateTime.to_unix(DateTime.utc_now()) + 3000) |> DateTime.from_unix!() - -      first_status = -        insert(:note_activity, user: target_user, data_attrs: %{"published" => date1}) - -      second_status = -        insert(:note_activity, user: target_user, data_attrs: %{"published" => date2}) - -      third_status = -        insert(:note_activity, user: target_user, data_attrs: %{"published" => date3}) - -      {:ok, first_report} = -        CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "status_ids" => [first_status.id, second_status.id, third_status.id] -        }) - -      {:ok, second_report} = -        CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "status_ids" => [first_status.id, second_status.id] -        }) - -      {:ok, third_report} = -        CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "status_ids" => [first_status.id] -        }) - -      %{ -        first_status: Activity.get_by_ap_id_with_object(first_status.data["id"]), -        second_status: Activity.get_by_ap_id_with_object(second_status.data["id"]), -        third_status: Activity.get_by_ap_id_with_object(third_status.data["id"]), -        first_report: first_report, -        first_status_reports: [first_report, second_report, third_report], -        second_status_reports: [first_report, second_report], -        third_status_reports: [first_report], -        target_user: target_user, -        reporter: reporter -      } -    end - -    test "returns reports grouped by status", %{ -      conn: conn, -      first_status: first_status, -      second_status: second_status, -      third_status: third_status, -      first_status_reports: first_status_reports, -      second_status_reports: second_status_reports, -      third_status_reports: third_status_reports, -      target_user: target_user, -      reporter: reporter -    } do -      response = -        conn -        |> get("/api/pleroma/admin/grouped_reports") -        |> json_response(:ok) - -      assert length(response["reports"]) == 3 - -      first_group = Enum.find(response["reports"], &(&1["status"]["id"] == first_status.id)) - -      second_group = Enum.find(response["reports"], &(&1["status"]["id"] == second_status.id)) - -      third_group = Enum.find(response["reports"], &(&1["status"]["id"] == third_status.id)) - -      assert length(first_group["reports"]) == 3 -      assert length(second_group["reports"]) == 2 -      assert length(third_group["reports"]) == 1 - -      assert first_group["date"] == -               Enum.max_by(first_status_reports, fn act -> -                 NaiveDateTime.from_iso8601!(act.data["published"]) -               end).data["published"] - -      assert first_group["status"] == -               Map.put( -                 stringify_keys(StatusView.render("show.json", %{activity: first_status})), -                 "deleted", -                 false -               ) - -      assert(first_group["account"]["id"] == target_user.id) - -      assert length(first_group["actors"]) == 1 -      assert hd(first_group["actors"])["id"] == reporter.id - -      assert Enum.map(first_group["reports"], & &1["id"]) -- -               Enum.map(first_status_reports, & &1.id) == [] - -      assert second_group["date"] == -               Enum.max_by(second_status_reports, fn act -> -                 NaiveDateTime.from_iso8601!(act.data["published"]) -               end).data["published"] - -      assert second_group["status"] == -               Map.put( -                 stringify_keys(StatusView.render("show.json", %{activity: second_status})), -                 "deleted", -                 false -               ) - -      assert second_group["account"]["id"] == target_user.id - -      assert length(second_group["actors"]) == 1 -      assert hd(second_group["actors"])["id"] == reporter.id - -      assert Enum.map(second_group["reports"], & &1["id"]) -- -               Enum.map(second_status_reports, & &1.id) == [] - -      assert third_group["date"] == -               Enum.max_by(third_status_reports, fn act -> -                 NaiveDateTime.from_iso8601!(act.data["published"]) -               end).data["published"] - -      assert third_group["status"] == -               Map.put( -                 stringify_keys(StatusView.render("show.json", %{activity: third_status})), -                 "deleted", -                 false -               ) - -      assert third_group["account"]["id"] == target_user.id - -      assert length(third_group["actors"]) == 1 -      assert hd(third_group["actors"])["id"] == reporter.id - -      assert Enum.map(third_group["reports"], & &1["id"]) -- -               Enum.map(third_status_reports, & &1.id) == [] -    end - -    test "reopened report renders status data", %{ -      conn: conn, -      first_report: first_report, -      first_status: first_status -    } do -      {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") - -      response = -        conn -        |> get("/api/pleroma/admin/grouped_reports") -        |> json_response(:ok) - -      first_group = Enum.find(response["reports"], &(&1["status"]["id"] == first_status.id)) - -      assert first_group["status"] == -               Map.put( -                 stringify_keys(StatusView.render("show.json", %{activity: first_status})), -                 "deleted", -                 false -               ) -    end - -    test "reopened report does not render status data if status has been deleted", %{ -      conn: conn, -      first_report: first_report, -      first_status: first_status, -      target_user: target_user -    } do -      {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") -      {:ok, _} = CommonAPI.delete(first_status.id, target_user) - -      refute Activity.get_by_ap_id(first_status.id) - -      response = -        conn -        |> get("/api/pleroma/admin/grouped_reports") -        |> json_response(:ok) - -      assert Enum.find(response["reports"], &(&1["status"]["deleted"] == true))["status"][ -               "deleted" -             ] == true - -      assert length(Enum.filter(response["reports"], &(&1["status"]["deleted"] == false))) == 2 -    end - -    test "account not empty if status was deleted", %{ -      conn: conn, -      first_report: first_report, -      first_status: first_status, -      target_user: target_user -    } do -      {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") -      {:ok, _} = CommonAPI.delete(first_status.id, target_user) - -      refute Activity.get_by_ap_id(first_status.id) - -      response = -        conn -        |> get("/api/pleroma/admin/grouped_reports") -        |> json_response(:ok) - -      assert Enum.find(response["reports"], &(&1["status"]["deleted"] == true))["account"] -    end -  end -    describe "PUT /api/pleroma/admin/statuses/:id" do      setup do        activity = insert(:note_activity) @@ -1888,9 +1676,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "GET /api/pleroma/admin/config" do -    clear_config(:configurable_from_database) do -      Config.put(:configurable_from_database, true) -    end +    setup do: clear_config(:configurable_from_database, true)      test "when configuration from database is off", %{conn: conn} do        Config.put(:configurable_from_database, false) @@ -2041,9 +1827,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        end)      end -    clear_config(:configurable_from_database) do -      Config.put(:configurable_from_database, true) -    end +    setup do: clear_config(:configurable_from_database, true)      @tag capture_log: true      test "create new config setting in db", %{conn: conn} do @@ -2585,9 +2369,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end      test "common config example", %{conn: conn} do -      adapter = Application.get_env(:tesla, :adapter) -      on_exit(fn -> Application.put_env(:tesla, :adapter, adapter) end) -        conn =          post(conn, "/api/pleroma/admin/config", %{            configs: [ @@ -2600,23 +2381,16 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                  %{"tuple" => [":seconds_valid", 60]},                  %{"tuple" => [":path", ""]},                  %{"tuple" => [":key1", nil]}, -                %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]},                  %{"tuple" => [":regex1", "~r/https:\/\/example.com/"]},                  %{"tuple" => [":regex2", "~r/https:\/\/example.com/u"]},                  %{"tuple" => [":regex3", "~r/https:\/\/example.com/i"]},                  %{"tuple" => [":regex4", "~r/https:\/\/example.com/s"]},                  %{"tuple" => [":name", "Pleroma"]}                ] -            }, -            %{ -              "group" => ":tesla", -              "key" => ":adapter", -              "value" => "Tesla.Adapter.Httpc"              }            ]          }) -      assert Application.get_env(:tesla, :adapter) == Tesla.Adapter.Httpc        assert Config.get([Pleroma.Captcha.NotReal, :name]) == "Pleroma"        assert json_response(conn, 200) == %{ @@ -2630,7 +2404,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                       %{"tuple" => [":seconds_valid", 60]},                       %{"tuple" => [":path", ""]},                       %{"tuple" => [":key1", nil]}, -                     %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]},                       %{"tuple" => [":regex1", "~r/https:\\/\\/example.com/"]},                       %{"tuple" => [":regex2", "~r/https:\\/\\/example.com/u"]},                       %{"tuple" => [":regex3", "~r/https:\\/\\/example.com/i"]}, @@ -2643,19 +2416,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                       ":seconds_valid",                       ":path",                       ":key1", -                     ":partial_chain",                       ":regex1",                       ":regex2",                       ":regex3",                       ":regex4",                       ":name"                     ] -                 }, -                 %{ -                   "group" => ":tesla", -                   "key" => ":adapter", -                   "value" => "Tesla.Adapter.Httpc", -                   "db" => [":adapter"]                   }                 ]               } @@ -3052,9 +2818,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "GET /api/pleroma/admin/restart" do -    clear_config(:configurable_from_database) do -      Config.put(:configurable_from_database, true) -    end +    setup do: clear_config(:configurable_from_database, true)      test "pleroma restarts", %{conn: conn} do        capture_log(fn -> @@ -3389,6 +3153,75 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end +  describe "GET /users/:nickname/credentials" do +    test "gets the user credentials", %{conn: conn} do +      user = insert(:user) +      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials") + +      response = assert json_response(conn, 200) +      assert response["email"] == user.email +    end + +    test "returns 403 if requested by a non-admin" do +      user = insert(:user) + +      conn = +        build_conn() +        |> assign(:user, user) +        |> get("/api/pleroma/admin/users/#{user.nickname}/credentials") + +      assert json_response(conn, :forbidden) +    end +  end + +  describe "PATCH /users/:nickname/credentials" do +    test "changes password and email", %{conn: conn, admin: admin} do +      user = insert(:user) +      assert user.password_reset_pending == false + +      conn = +        patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ +          "password" => "new_password", +          "email" => "new_email@example.com", +          "name" => "new_name" +        }) + +      assert json_response(conn, 200) == %{"status" => "success"} + +      ObanHelpers.perform_all() + +      updated_user = User.get_by_id(user.id) + +      assert updated_user.email == "new_email@example.com" +      assert updated_user.name == "new_name" +      assert updated_user.password_hash != user.password_hash +      assert updated_user.password_reset_pending == true + +      [log_entry2, log_entry1] = ModerationLog |> Repo.all() |> Enum.sort() + +      assert ModerationLog.get_log_entry_message(log_entry1) == +               "@#{admin.nickname} updated users: @#{user.nickname}" + +      assert ModerationLog.get_log_entry_message(log_entry2) == +               "@#{admin.nickname} forced password reset for users: @#{user.nickname}" +    end + +    test "returns 403 if requested by a non-admin" do +      user = insert(:user) + +      conn = +        build_conn() +        |> assign(:user, user) +        |> patch("/api/pleroma/admin/users/#{user.nickname}/credentials", %{ +          "password" => "new_password", +          "email" => "new_email@example.com", +          "name" => "new_name" +        }) + +      assert json_response(conn, :forbidden) +    end +  end +    describe "PATCH /users/:nickname/force_password_reset" do      test "sets password_reset_pending to true", %{conn: conn} do        user = insert(:user) diff --git a/test/web/chat_channel_test.exs b/test/web/chat_channel_test.exs index 68c24a9f9..f18f3a212 100644 --- a/test/web/chat_channel_test.exs +++ b/test/web/chat_channel_test.exs @@ -21,7 +21,7 @@ defmodule Pleroma.Web.ChatChannelTest do    end    describe "message lengths" do -    clear_config([:instance, :chat_limit]) +    setup do: clear_config([:instance, :chat_limit])      test "it ignores messages of length zero", %{socket: socket} do        push(socket, "new_msg", %{"text" => ""}) diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index c2ed1c789..f46ad0272 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -17,9 +17,9 @@ defmodule Pleroma.Web.CommonAPITest do    require Pleroma.Constants -  clear_config([:instance, :safe_dm_mentions]) -  clear_config([:instance, :limit]) -  clear_config([:instance, :max_pinned_statuses]) +  setup do: clear_config([:instance, :safe_dm_mentions]) +  setup do: clear_config([:instance, :limit]) +  setup do: clear_config([:instance, :max_pinned_statuses])    test "when replying to a conversation / participation, it will set the correct context id even if no explicit reply_to is given" do      user = insert(:user) diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs index 45fc94522..d383d1714 100644 --- a/test/web/common_api/common_api_utils_test.exs +++ b/test/web/common_api/common_api_utils_test.exs @@ -472,6 +472,13 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        activity = insert(:note_activity, user: user, note: object)        Pleroma.Repo.delete(object) +      obj_url = activity.data["object"] + +      Tesla.Mock.mock(fn +        %{method: :get, url: ^obj_url} -> +          %Tesla.Env{status: 404, body: ""} +      end) +        assert Utils.maybe_notify_mentioned_recipients(["test-test"], activity) == [                 "test-test"               ] diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs index d2ee2267c..da844c24c 100644 --- a/test/web/federator_test.exs +++ b/test/web/federator_test.exs @@ -21,13 +21,10 @@ defmodule Pleroma.Web.FederatorTest do      :ok    end -  clear_config_all([:instance, :federating]) do -    Pleroma.Config.put([:instance, :federating], true) -  end - -  clear_config([:instance, :allow_relay]) -  clear_config([:instance, :rewrite_policy]) -  clear_config([:mrf_keyword]) +  setup_all do: clear_config([:instance, :federating], true) +  setup do: clear_config([:instance, :allow_relay]) +  setup do: clear_config([:instance, :rewrite_policy]) +  setup do: clear_config([:mrf_keyword])    describe "Publish an activity" do      setup do diff --git a/test/web/feed/tag_controller_test.exs b/test/web/feed/tag_controller_test.exs index 5950605e8..e863df86b 100644 --- a/test/web/feed/tag_controller_test.exs +++ b/test/web/feed/tag_controller_test.exs @@ -8,9 +8,11 @@ defmodule Pleroma.Web.Feed.TagControllerTest do    import Pleroma.Factory    import SweetXml +  alias Pleroma.Object +  alias Pleroma.Web.CommonAPI    alias Pleroma.Web.Feed.FeedView -  clear_config([:feed]) +  setup do: clear_config([:feed])    test "gets a feed (ATOM)", %{conn: conn} do      Pleroma.Config.put( @@ -19,9 +21,9 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      )      user = insert(:user) -    {:ok, activity1} = Pleroma.Web.CommonAPI.post(user, %{"status" => "yeah #PleromaArt"}) +    {:ok, activity1} = CommonAPI.post(user, %{"status" => "yeah #PleromaArt"}) -    object = Pleroma.Object.normalize(activity1) +    object = Object.normalize(activity1)      object_data =        Map.put(object.data, "attachment", [ @@ -41,14 +43,13 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      |> Ecto.Changeset.change(data: object_data)      |> Pleroma.Repo.update() -    {:ok, _activity2} = -      Pleroma.Web.CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"}) +    {:ok, activity2} = CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"}) -    {:ok, _activity3} = Pleroma.Web.CommonAPI.post(user, %{"status" => "This is :moominmamma"}) +    {:ok, _activity3} = CommonAPI.post(user, %{"status" => "This is :moominmamma"})      response =        conn -      |> put_req_header("content-type", "application/atom+xml") +      |> put_req_header("accept", "application/atom+xml")        |> get(tag_feed_path(conn, :feed, "pleromaart.atom"))        |> response(200) @@ -63,6 +64,21 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      assert xpath(xml, ~x"//feed/entry/author/name/text()"ls) == [user.nickname, user.nickname]      assert xpath(xml, ~x"//feed/entry/author/id/text()"ls) == [user.ap_id, user.ap_id] + +    conn = +      conn +      |> put_req_header("accept", "application/atom+xml") +      |> get("/tags/pleromaart.atom", %{"max_id" => activity2.id}) + +    assert get_resp_header(conn, "content-type") == ["application/atom+xml; charset=utf-8"] +    resp = response(conn, 200) +    xml = parse(resp) + +    assert xpath(xml, ~x"//feed/title/text()") == '#pleromaart' + +    assert xpath(xml, ~x"//feed/entry/title/text()"l) == [ +             'yeah #PleromaArt' +           ]    end    test "gets a feed (RSS)", %{conn: conn} do @@ -72,9 +88,9 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      )      user = insert(:user) -    {:ok, activity1} = Pleroma.Web.CommonAPI.post(user, %{"status" => "yeah #PleromaArt"}) +    {:ok, activity1} = CommonAPI.post(user, %{"status" => "yeah #PleromaArt"}) -    object = Pleroma.Object.normalize(activity1) +    object = Object.normalize(activity1)      object_data =        Map.put(object.data, "attachment", [ @@ -94,14 +110,13 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      |> Ecto.Changeset.change(data: object_data)      |> Pleroma.Repo.update() -    {:ok, activity2} = -      Pleroma.Web.CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"}) +    {:ok, activity2} = CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"}) -    {:ok, _activity3} = Pleroma.Web.CommonAPI.post(user, %{"status" => "This is :moominmamma"}) +    {:ok, _activity3} = CommonAPI.post(user, %{"status" => "This is :moominmamma"})      response =        conn -      |> put_req_header("content-type", "application/rss+xml") +      |> put_req_header("accept", "application/rss+xml")        |> get(tag_feed_path(conn, :feed, "pleromaart.rss"))        |> response(200) @@ -131,8 +146,8 @@ defmodule Pleroma.Web.Feed.TagControllerTest do               "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4"             ] -    obj1 = Pleroma.Object.normalize(activity1) -    obj2 = Pleroma.Object.normalize(activity2) +    obj1 = Object.normalize(activity1) +    obj2 = Object.normalize(activity2)      assert xpath(xml, ~x"//channel/item/description/text()"sl) == [               HtmlEntities.decode(FeedView.activity_content(obj2)), @@ -141,7 +156,7 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      response =        conn -      |> put_req_header("content-type", "application/atom+xml") +      |> put_req_header("accept", "application/rss+xml")        |> get(tag_feed_path(conn, :feed, "pleromaart"))        |> response(200) @@ -150,5 +165,20 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      assert xpath(xml, ~x"//channel/description/text()"s) ==               "These are public toots tagged with #pleromaart. You can interact with them if you have an account anywhere in the fediverse." + +    conn = +      conn +      |> put_req_header("accept", "application/rss+xml") +      |> get("/tags/pleromaart.rss", %{"max_id" => activity2.id}) + +    assert get_resp_header(conn, "content-type") == ["application/rss+xml; charset=utf-8"] +    resp = response(conn, 200) +    xml = parse(resp) + +    assert xpath(xml, ~x"//channel/title/text()") == '#pleromaart' + +    assert xpath(xml, ~x"//channel/item/title/text()"l) == [ +             'yeah #PleromaArt' +           ]    end  end diff --git a/test/web/feed/user_controller_test.exs b/test/web/feed/user_controller_test.exs index 00c50f003..05ad427c2 100644 --- a/test/web/feed/user_controller_test.exs +++ b/test/web/feed/user_controller_test.exs @@ -12,12 +12,10 @@ defmodule Pleroma.Web.Feed.UserControllerTest do    alias Pleroma.Object    alias Pleroma.User -  clear_config([:instance, :federating]) do -    Config.put([:instance, :federating], true) -  end +  setup do: clear_config([:instance, :federating], true)    describe "feed" do -    clear_config([:feed]) +    setup do: clear_config([:feed])      test "gets a feed", %{conn: conn} do        Config.put( @@ -54,12 +52,12 @@ defmodule Pleroma.Web.Feed.UserControllerTest do            }          ) -      _note_activity2 = insert(:note_activity, note: note2) +      note_activity2 = insert(:note_activity, note: note2)        object = Object.normalize(note_activity)        resp =          conn -        |> put_req_header("content-type", "application/atom+xml") +        |> put_req_header("accept", "application/atom+xml")          |> get(user_feed_path(conn, :feed, user.nickname))          |> response(200) @@ -70,12 +68,91 @@ defmodule Pleroma.Web.Feed.UserControllerTest do        assert activity_titles == ['42 This...', 'This is...']        assert resp =~ object.data["content"] + +      resp = +        conn +        |> put_req_header("accept", "application/atom+xml") +        |> get("/users/#{user.nickname}/feed", %{"max_id" => note_activity2.id}) +        |> response(200) + +      activity_titles = +        resp +        |> SweetXml.parse() +        |> SweetXml.xpath(~x"//entry/title/text()"l) + +      assert activity_titles == ['This is...'] +    end + +    test "gets a rss feed", %{conn: conn} do +      Pleroma.Config.put( +        [:feed, :post_title], +        %{max_length: 10, omission: "..."} +      ) + +      activity = insert(:note_activity) + +      note = +        insert(:note, +          data: %{ +            "content" => "This is :moominmamma: note ", +            "attachment" => [ +              %{ +                "url" => [ +                  %{"mediaType" => "image/png", "href" => "https://pleroma.gov/image.png"} +                ] +              } +            ], +            "inReplyTo" => activity.data["id"] +          } +        ) + +      note_activity = insert(:note_activity, note: note) +      user = User.get_cached_by_ap_id(note_activity.data["actor"]) + +      note2 = +        insert(:note, +          user: user, +          data: %{ +            "content" => "42 This is :moominmamma: note ", +            "inReplyTo" => activity.data["id"] +          } +        ) + +      note_activity2 = insert(:note_activity, note: note2) +      object = Object.normalize(note_activity) + +      resp = +        conn +        |> put_req_header("accept", "application/rss+xml") +        |> get("/users/#{user.nickname}/feed.rss") +        |> response(200) + +      activity_titles = +        resp +        |> SweetXml.parse() +        |> SweetXml.xpath(~x"//item/title/text()"l) + +      assert activity_titles == ['42 This...', 'This is...'] +      assert resp =~ object.data["content"] + +      resp = +        conn +        |> put_req_header("accept", "application/rss+xml") +        |> get("/users/#{user.nickname}/feed.rss", %{"max_id" => note_activity2.id}) +        |> response(200) + +      activity_titles = +        resp +        |> SweetXml.parse() +        |> SweetXml.xpath(~x"//item/title/text()"l) + +      assert activity_titles == ['This is...']      end      test "returns 404 for a missing feed", %{conn: conn} do        conn =          conn -        |> put_req_header("content-type", "application/atom+xml") +        |> put_req_header("accept", "application/atom+xml")          |> get(user_feed_path(conn, :feed, "nonexisting"))        assert response(conn, 404) diff --git a/test/web/instances/instance_test.exs b/test/web/instances/instance_test.exs index a3c93b986..e463200ca 100644 --- a/test/web/instances/instance_test.exs +++ b/test/web/instances/instance_test.exs @@ -10,9 +10,7 @@ defmodule Pleroma.Instances.InstanceTest do    import Pleroma.Factory -  clear_config_all([:instance, :federation_reachability_timeout_days]) do -    Pleroma.Config.put([:instance, :federation_reachability_timeout_days], 1) -  end +  setup_all do: clear_config([:instance, :federation_reachability_timeout_days], 1)    describe "set_reachable/1" do      test "clears `unreachable_since` of existing matching Instance record having non-nil `unreachable_since`" do diff --git a/test/web/instances/instances_test.exs b/test/web/instances/instances_test.exs index c5d6abc9c..d2618025c 100644 --- a/test/web/instances/instances_test.exs +++ b/test/web/instances/instances_test.exs @@ -7,9 +7,7 @@ defmodule Pleroma.InstancesTest do    use Pleroma.DataCase -  clear_config_all([:instance, :federation_reachability_timeout_days]) do -    Pleroma.Config.put([:instance, :federation_reachability_timeout_days], 1) -  end +  setup_all do: clear_config([:instance, :federation_reachability_timeout_days], 1)    describe "reachable?/1" do      test "returns `true` for host / url with unknown reachability status" do diff --git a/test/web/masto_fe_controller_test.exs b/test/web/masto_fe_controller_test.exs index 9a2d76e0b..1d107d56c 100644 --- a/test/web/masto_fe_controller_test.exs +++ b/test/web/masto_fe_controller_test.exs @@ -10,7 +10,7 @@ defmodule Pleroma.Web.MastodonAPI.MastoFEController do    import Pleroma.Factory -  clear_config([:instance, :public]) +  setup do: clear_config([:instance, :public])    test "put settings", %{conn: conn} do      user = insert(:user) diff --git a/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs b/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs index cba68859e..b693c1a47 100644 --- a/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs +++ b/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs @@ -9,7 +9,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do    use Pleroma.Web.ConnCase    import Pleroma.Factory -  clear_config([:instance, :max_account_fields]) + +  setup do: clear_config([:instance, :max_account_fields])    describe "updating credentials" do      setup do: oauth_access(["write:accounts"]) @@ -75,7 +76,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        conn =          patch(conn, "/api/v1/accounts/update_credentials", %{ -          "note" => "I drink #cofe with @#{user2.nickname}" +          "note" => "I drink #cofe with @#{user2.nickname}\n\nsuya.."          })        assert user_data = json_response(conn, 200) @@ -83,7 +84,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        assert user_data["note"] ==                 ~s(I drink <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe">#cofe</a> with <span class="h-card"><a data-user="#{                   user2.id -               }" class="u-url mention" href="#{user2.ap_id}" rel="ugc">@<span>#{user2.nickname}</span></a></span>) +               }" class="u-url mention" href="#{user2.ap_id}" rel="ugc">@<span>#{user2.nickname}</span></a></span><br/><br/>suya..)      end      test "updates the user's locking status", %{conn: conn} do @@ -117,6 +118,18 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        assert user_data["pleroma"]["hide_followers"] == true      end +    test "updates the user's discoverable status", %{conn: conn} do +      assert %{"source" => %{"pleroma" => %{"discoverable" => true}}} = +               conn +               |> patch("/api/v1/accounts/update_credentials", %{discoverable: "true"}) +               |> json_response(:ok) + +      assert %{"source" => %{"pleroma" => %{"discoverable" => false}}} = +               conn +               |> patch("/api/v1/accounts/update_credentials", %{discoverable: "false"}) +               |> json_response(:ok) +    end +      test "updates the user's hide_followers_count and hide_follows_count", %{conn: conn} do        conn =          patch(conn, "/api/v1/accounts/update_credentials", %{ diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 7efccd9c4..a9fa0ce48 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -5,6 +5,7 @@  defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do    use Pleroma.Web.ConnCase +  alias Pleroma.Config    alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub @@ -15,7 +16,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do    import Pleroma.Factory    describe "account fetching" do -    clear_config([:instance, :limit_to_local_content]) +    setup do: clear_config([:instance, :limit_to_local_content])      test "works by id" do        user = insert(:user) @@ -46,7 +47,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end      test "works by nickname for remote users" do -      Pleroma.Config.put([:instance, :limit_to_local_content], false) +      Config.put([:instance, :limit_to_local_content], false)        user = insert(:user, nickname: "user@example.com", local: false)        conn = @@ -58,7 +59,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end      test "respects limit_to_local_content == :all for remote user nicknames" do -      Pleroma.Config.put([:instance, :limit_to_local_content], :all) +      Config.put([:instance, :limit_to_local_content], :all)        user = insert(:user, nickname: "user@example.com", local: false) @@ -70,7 +71,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end      test "respects limit_to_local_content == :unauthenticated for remote user nicknames" do -      Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated) +      Config.put([:instance, :limit_to_local_content], :unauthenticated)        user = insert(:user, nickname: "user@example.com", local: false)        reading_user = insert(:user) @@ -140,6 +141,98 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end    end +  defp local_and_remote_users do +    local = insert(:user) +    remote = insert(:user, local: false) +    {:ok, local: local, remote: remote} +  end + +  describe "user fetching with restrict unauthenticated profiles for local and remote" do +    setup do: local_and_remote_users() + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :local], true) + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end + +  describe "user fetching with restrict unauthenticated profiles for local" do +    setup do: local_and_remote_users() + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :local], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end + +  describe "user fetching with restrict unauthenticated profiles for remote" do +    setup do: local_and_remote_users() + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end +    describe "user timelines" do      setup do: oauth_access(["read:statuses"]) @@ -293,6 +386,102 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end    end +  defp local_and_remote_activities(%{local: local, remote: remote}) do +    insert(:note_activity, user: local) +    insert(:note_activity, user: remote, local: false) + +    :ok +  end + +  describe "statuses with restrict unauthenticated profiles for local and remote" do +    setup do: local_and_remote_users() +    setup :local_and_remote_activities + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :local], true) + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 +    end +  end + +  describe "statuses with restrict unauthenticated profiles for local" do +    setup do: local_and_remote_users() +    setup :local_and_remote_activities + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :local], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 +    end +  end + +  describe "statuses with restrict unauthenticated profiles for remote" do +    setup do: local_and_remote_users() +    setup :local_and_remote_activities + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 +    end +  end +    describe "followers" do      setup do: oauth_access(["read:accounts"]) @@ -601,7 +790,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        [valid_params: valid_params]      end -    clear_config([:instance, :account_activation_required]) +    setup do: clear_config([:instance, :account_activation_required])      test "Account registration via Application", %{conn: conn} do        conn = @@ -699,7 +888,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        end)      end -    clear_config([:instance, :account_activation_required]) +    setup do: clear_config([:instance, :account_activation_required])      test "returns bad_request if missing email params when :account_activation_required is enabled",           %{conn: conn, valid_params: valid_params} do @@ -756,9 +945,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do    end    describe "create account by app / rate limit" do -    clear_config([:rate_limit, :app_account_creation]) do -      Pleroma.Config.put([:rate_limit, :app_account_creation], {10_000, 2}) -    end +    setup do: clear_config([:rate_limit, :app_account_creation], {10_000, 2})      test "respects rate limit setting", %{conn: conn} do        app_token = insert(:oauth_token, user: nil) diff --git a/test/web/mastodon_api/controllers/media_controller_test.exs b/test/web/mastodon_api/controllers/media_controller_test.exs index 203fa73b0..6ac4cf63b 100644 --- a/test/web/mastodon_api/controllers/media_controller_test.exs +++ b/test/web/mastodon_api/controllers/media_controller_test.exs @@ -22,8 +22,8 @@ defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do        [image: image]      end -    clear_config([:media_proxy]) -    clear_config([Pleroma.Upload]) +    setup do: clear_config([:media_proxy]) +    setup do: clear_config([Pleroma.Upload])      test "returns uploaded image", %{conn: conn, image: image} do        desc = "Description of the image" diff --git a/test/web/mastodon_api/controllers/notification_controller_test.exs b/test/web/mastodon_api/controllers/notification_controller_test.exs index adbb78da6..344eabb4a 100644 --- a/test/web/mastodon_api/controllers/notification_controller_test.exs +++ b/test/web/mastodon_api/controllers/notification_controller_test.exs @@ -452,11 +452,24 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert length(json_response(conn, 200)) == 1    end +  @tag capture_log: true    test "see move notifications" do      old_user = insert(:user)      new_user = insert(:user, also_known_as: [old_user.ap_id])      %{user: follower, conn: conn} = oauth_access(["read:notifications"]) +    old_user_url = old_user.ap_id + +    body = +      File.read!("test/fixtures/users_mock/localhost.json") +      |> String.replace("{{nickname}}", old_user.nickname) +      |> Jason.encode!() + +    Tesla.Mock.mock(fn +      %{method: :get, url: ^old_user_url} -> +        %Tesla.Env{status: 200, body: body} +    end) +      User.follow(follower, old_user)      Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)      Pleroma.Tests.ObanHelpers.perform_all() diff --git a/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs b/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs index 3cd08c189..f86274d57 100644 --- a/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs +++ b/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs @@ -11,7 +11,7 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do    import Pleroma.Factory    import Ecto.Query -  clear_config([ScheduledActivity, :enabled]) +  setup do: clear_config([ScheduledActivity, :enabled])    test "shows scheduled activities" do      %{user: user, conn: conn} = oauth_access(["read:statuses"]) diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index f36552041..cd9ca4973 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -19,9 +19,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do    import Pleroma.Factory -  clear_config([:instance, :federating]) -  clear_config([:instance, :allow_relay]) -  clear_config([:rich_media, :enabled]) +  setup do: clear_config([:instance, :federating]) +  setup do: clear_config([:instance, :allow_relay]) +  setup do: clear_config([:rich_media, :enabled])    describe "posting statuses" do      setup do: oauth_access(["write:statuses"]) @@ -476,6 +476,95 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      assert id == to_string(activity.id)    end +  defp local_and_remote_activities do +    local = insert(:note_activity) +    remote = insert(:note_activity, local: false) +    {:ok, local: local, remote: remote} +  end + +  describe "status with restrict unauthenticated activities for local and remote" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :local], true) + +    setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Record not found" +             } + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Record not found" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end + +  describe "status with restrict unauthenticated activities for local" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :local], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Record not found" +             } + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end + +  describe "status with restrict unauthenticated activities for remote" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Record not found" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end +    test "getting a status that doesn't exist returns 404" do      %{conn: conn} = oauth_access(["read:statuses"])      activity = insert(:note_activity) @@ -514,6 +603,70 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      assert [%{"id" => ^id1}, %{"id" => ^id2}] = Enum.sort_by(json_response(conn, :ok), & &1["id"])    end +  describe "getting statuses by ids with restricted unauthenticated for local and remote" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :local], true) + +    setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      assert json_response(res_conn, 200) == [] +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      assert length(json_response(res_conn, 200)) == 2 +    end +  end + +  describe "getting statuses by ids with restricted unauthenticated for local" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :local], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      remote_id = remote.id +      assert [%{"id" => ^remote_id}] = json_response(res_conn, 200) +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      assert length(json_response(res_conn, 200)) == 2 +    end +  end + +  describe "getting statuses by ids with restricted unauthenticated for remote" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      local_id = local.id +      assert [%{"id" => ^local_id}] = json_response(res_conn, 200) +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      assert length(json_response(res_conn, 200)) == 2 +    end +  end +    describe "deleting a status" do      test "when you created it" do        %{user: author, conn: conn} = oauth_access(["write:statuses"]) @@ -743,9 +896,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        %{activity: activity}      end -    clear_config([:instance, :max_pinned_statuses]) do -      Config.put([:instance, :max_pinned_statuses], 1) -    end +    setup do: clear_config([:instance, :max_pinned_statuses], 1)      test "pin status", %{conn: conn, user: user, activity: activity} do        id_str = to_string(activity.id) diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index 2c03b0a75..97b1c3e66 100644 --- a/test/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/web/mastodon_api/controllers/timeline_controller_test.exs @@ -12,8 +12,6 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do    alias Pleroma.User    alias Pleroma.Web.CommonAPI -  clear_config([:instance, :public]) -    setup do      mock(fn env -> apply(HttpRequestMock, :request, [env]) end)      :ok @@ -23,9 +21,12 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do      setup do: oauth_access(["read:statuses"])      test "the home timeline", %{user: user, conn: conn} do -      following = insert(:user) +      following = insert(:user, nickname: "followed") +      third_user = insert(:user, nickname: "repeated") -      {:ok, _activity} = CommonAPI.post(following, %{"status" => "test"}) +      {:ok, _activity} = CommonAPI.post(following, %{"status" => "post"}) +      {:ok, activity} = CommonAPI.post(third_user, %{"status" => "repeated post"}) +      {:ok, _, _} = CommonAPI.repeat(activity.id, following)        ret_conn = get(conn, "/api/v1/timelines/home") @@ -33,9 +34,54 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        {:ok, _user} = User.follow(user, following) -      conn = get(conn, "/api/v1/timelines/home") +      ret_conn = get(conn, "/api/v1/timelines/home") -      assert [%{"content" => "test"}] = json_response(conn, :ok) +      assert [ +               %{ +                 "reblog" => %{ +                   "content" => "repeated post", +                   "account" => %{ +                     "pleroma" => %{ +                       "relationship" => %{"following" => false, "followed_by" => false} +                     } +                   } +                 }, +                 "account" => %{"pleroma" => %{"relationship" => %{"following" => true}}} +               }, +               %{ +                 "content" => "post", +                 "account" => %{ +                   "acct" => "followed", +                   "pleroma" => %{"relationship" => %{"following" => true}} +                 } +               } +             ] = json_response(ret_conn, :ok) + +      {:ok, _user} = User.follow(third_user, user) + +      ret_conn = get(conn, "/api/v1/timelines/home") + +      assert [ +               %{ +                 "reblog" => %{ +                   "content" => "repeated post", +                   "account" => %{ +                     "acct" => "repeated", +                     "pleroma" => %{ +                       "relationship" => %{"following" => false, "followed_by" => true} +                     } +                   } +                 }, +                 "account" => %{"pleroma" => %{"relationship" => %{"following" => true}}} +               }, +               %{ +                 "content" => "post", +                 "account" => %{ +                   "acct" => "followed", +                   "pleroma" => %{"relationship" => %{"following" => true}} +                 } +               } +             ] = json_response(ret_conn, :ok)      end      test "the home timeline when the direct messages are excluded", %{user: user, conn: conn} do @@ -80,15 +126,6 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        assert [%{"content" => "test"}] = json_response(conn, :ok)      end -    test "the public timeline when public is set to false", %{conn: conn} do -      Config.put([:instance, :public], false) - -      assert %{"error" => "This resource requires authentication."} == -               conn -               |> get("/api/v1/timelines/public", %{"local" => "False"}) -               |> json_response(:forbidden) -    end -      test "the public timeline includes only public statuses for an authenticated user" do        %{user: user, conn: conn} = oauth_access(["read:statuses"]) @@ -102,6 +139,98 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do      end    end +  defp local_and_remote_activities do +    insert(:note_activity) +    insert(:note_activity, local: false) +    :ok +  end + +  describe "public with restrict unauthenticated timeline for local and federated timelines" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :timelines, :local], true) + +    setup do: clear_config([:restrict_unauthenticated, :timelines, :federated], true) + +    test "if user is unauthenticated", %{conn: conn} do +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) + +      assert json_response(res_conn, :unauthorized) == %{ +               "error" => "authorization required for timeline view" +             } + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) + +      assert json_response(res_conn, :unauthorized) == %{ +               "error" => "authorization required for timeline view" +             } +    end + +    test "if user is authenticated" do +      %{conn: conn} = oauth_access(["read:statuses"]) + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) +      assert length(json_response(res_conn, 200)) == 2 +    end +  end + +  describe "public with restrict unauthenticated timeline for local" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :timelines, :local], true) + +    test "if user is unauthenticated", %{conn: conn} do +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) + +      assert json_response(res_conn, :unauthorized) == %{ +               "error" => "authorization required for timeline view" +             } + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) +      assert length(json_response(res_conn, 200)) == 2 +    end + +    test "if user is authenticated", %{conn: _conn} do +      %{conn: conn} = oauth_access(["read:statuses"]) + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) +      assert length(json_response(res_conn, 200)) == 2 +    end +  end + +  describe "public with restrict unauthenticated timeline for remote" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :timelines, :federated], true) + +    test "if user is unauthenticated", %{conn: conn} do +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) + +      assert json_response(res_conn, :unauthorized) == %{ +               "error" => "authorization required for timeline view" +             } +    end + +    test "if user is authenticated", %{conn: _conn} do +      %{conn: conn} = oauth_access(["read:statuses"]) + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) +      assert length(json_response(res_conn, 200)) == 2 +    end +  end +    describe "direct" do      test "direct timeline", %{conn: conn} do        user_one = insert(:user) diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index d60ed7b64..4435f69ff 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -4,11 +4,20 @@  defmodule Pleroma.Web.MastodonAPI.AccountViewTest do    use Pleroma.DataCase -  import Pleroma.Factory +    alias Pleroma.User +  alias Pleroma.UserRelationship    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.MastodonAPI.AccountView +  import Pleroma.Factory +  import Tesla.Mock + +  setup do +    mock(fn env -> apply(HttpRequestMock, :request, [env]) end) +    :ok +  end +    test "Represent a user account" do      source_data = %{        "tag" => [ @@ -32,7 +41,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do          background: background_image,          nickname: "shp@shitposter.club",          name: ":karjalanpiirakka: shp", -        bio: "<script src=\"invalid-html\"></script><span>valid html</span>", +        bio: +          "<script src=\"invalid-html\"></script><span>valid html</span>. a<br>b<br/>c<br >d<br />f",          inserted_at: ~N[2017-08-15 15:47:06.597036]        }) @@ -46,7 +56,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        followers_count: 3,        following_count: 0,        statuses_count: 5, -      note: "<span>valid html</span>", +      note: "<span>valid html</span>. a<br/>b<br/>c<br/>d<br/>f",        url: user.ap_id,        avatar: "http://localhost:4001/images/avi.png",        avatar_static: "http://localhost:4001/images/avi.png", @@ -63,7 +73,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        fields: [],        bot: false,        source: %{ -        note: "valid html", +        note: "valid html. a\nb\nc\nd\nf",          sensitive: false,          pleroma: %{            actor_type: "Person", @@ -160,6 +170,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      assert expected == AccountView.render("show.json", %{user: user})    end +  test "Represent a Funkwhale channel" do +    {:ok, user} = +      User.get_or_fetch_by_ap_id( +        "https://channels.tests.funkwhale.audio/federation/actors/compositions" +      ) + +    assert represented = AccountView.render("show.json", %{user: user}) +    assert represented.acct == "compositions@channels.tests.funkwhale.audio" +    assert represented.url == "https://channels.tests.funkwhale.audio/channels/compositions" +  end +    test "Represent a deactivated user for an admin" do      admin = insert(:user, is_admin: true)      deactivated_user = insert(:user, deactivated: true) @@ -181,6 +202,32 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do    end    describe "relationship" do +    defp test_relationship_rendering(user, other_user, expected_result) do +      opts = %{user: user, target: other_user, relationships: nil} +      assert expected_result == AccountView.render("relationship.json", opts) + +      relationships_opt = UserRelationship.view_relationships_option(user, [other_user]) +      opts = Map.put(opts, :relationships, relationships_opt) +      assert expected_result == AccountView.render("relationship.json", opts) + +      assert [expected_result] == +               AccountView.render("relationships.json", %{user: user, targets: [other_user]}) +    end + +    @blank_response %{ +      following: false, +      followed_by: false, +      blocking: false, +      blocked_by: false, +      muting: false, +      muting_notifications: false, +      subscribing: false, +      requested: false, +      domain_blocking: false, +      showing_reblogs: true, +      endorsed: false +    } +      test "represent a relationship for the following and followed user" do        user = insert(:user)        other_user = insert(:user) @@ -191,23 +238,21 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        {:ok, _user_relationships} = User.mute(user, other_user, true)        {:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, other_user) -      expected = %{ -        id: to_string(other_user.id), -        following: true, -        followed_by: true, -        blocking: false, -        blocked_by: false, -        muting: true, -        muting_notifications: true, -        subscribing: true, -        requested: false, -        domain_blocking: false, -        showing_reblogs: false, -        endorsed: false -      } - -      assert expected == -               AccountView.render("relationship.json", %{user: user, target: other_user}) +      expected = +        Map.merge( +          @blank_response, +          %{ +            following: true, +            followed_by: true, +            muting: true, +            muting_notifications: true, +            subscribing: true, +            showing_reblogs: false, +            id: to_string(other_user.id) +          } +        ) + +      test_relationship_rendering(user, other_user, expected)      end      test "represent a relationship for the blocking and blocked user" do @@ -219,23 +264,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        {:ok, _user_relationship} = User.block(user, other_user)        {:ok, _user_relationship} = User.block(other_user, user) -      expected = %{ -        id: to_string(other_user.id), -        following: false, -        followed_by: false, -        blocking: true, -        blocked_by: true, -        muting: false, -        muting_notifications: false, -        subscribing: false, -        requested: false, -        domain_blocking: false, -        showing_reblogs: true, -        endorsed: false -      } +      expected = +        Map.merge( +          @blank_response, +          %{following: false, blocking: true, blocked_by: true, id: to_string(other_user.id)} +        ) -      assert expected == -               AccountView.render("relationship.json", %{user: user, target: other_user}) +      test_relationship_rendering(user, other_user, expected)      end      test "represent a relationship for the user blocking a domain" do @@ -244,8 +279,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        {:ok, user} = User.block_domain(user, "bad.site") -      assert %{domain_blocking: true, blocking: false} = -               AccountView.render("relationship.json", %{user: user, target: other_user}) +      expected = +        Map.merge( +          @blank_response, +          %{domain_blocking: true, blocking: false, id: to_string(other_user.id)} +        ) + +      test_relationship_rendering(user, other_user, expected)      end      test "represent a relationship for the user with a pending follow request" do @@ -256,23 +296,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        user = User.get_cached_by_id(user.id)        other_user = User.get_cached_by_id(other_user.id) -      expected = %{ -        id: to_string(other_user.id), -        following: false, -        followed_by: false, -        blocking: false, -        blocked_by: false, -        muting: false, -        muting_notifications: false, -        subscribing: false, -        requested: true, -        domain_blocking: false, -        showing_reblogs: true, -        endorsed: false -      } +      expected = +        Map.merge( +          @blank_response, +          %{requested: true, following: false, id: to_string(other_user.id)} +        ) -      assert expected == -               AccountView.render("relationship.json", %{user: user, target: other_user}) +      test_relationship_rendering(user, other_user, expected)      end    end diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index 5fe37a6bf..c3ec9dfec 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -16,6 +16,21 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do    alias Pleroma.Web.MastodonAPI.StatusView    import Pleroma.Factory +  defp test_notifications_rendering(notifications, user, expected_result) do +    result = NotificationView.render("index.json", %{notifications: notifications, for: user}) + +    assert expected_result == result + +    result = +      NotificationView.render("index.json", %{ +        notifications: notifications, +        for: user, +        relationships: nil +      }) + +    assert expected_result == result +  end +    test "Mention notification" do      user = insert(:user)      mentioned_user = insert(:user) @@ -32,10 +47,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    result = -      NotificationView.render("index.json", %{notifications: [notification], for: mentioned_user}) - -    assert [expected] == result +    test_notifications_rendering([notification], mentioned_user, [expected])    end    test "Favourite notification" do @@ -55,9 +67,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    result = NotificationView.render("index.json", %{notifications: [notification], for: user}) - -    assert [expected] == result +    test_notifications_rendering([notification], user, [expected])    end    test "Reblog notification" do @@ -77,9 +87,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    result = NotificationView.render("index.json", %{notifications: [notification], for: user}) - -    assert [expected] == result +    test_notifications_rendering([notification], user, [expected])    end    test "Follow notification" do @@ -96,23 +104,32 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    result = -      NotificationView.render("index.json", %{notifications: [notification], for: followed}) - -    assert [expected] == result +    test_notifications_rendering([notification], followed, [expected])      User.perform(:delete, follower)      notification = Notification |> Repo.one() |> Repo.preload(:activity) -    assert [] == -             NotificationView.render("index.json", %{notifications: [notification], for: followed}) +    test_notifications_rendering([notification], followed, [])    end +  @tag capture_log: true    test "Move notification" do      old_user = insert(:user)      new_user = insert(:user, also_known_as: [old_user.ap_id])      follower = insert(:user) +    old_user_url = old_user.ap_id + +    body = +      File.read!("test/fixtures/users_mock/localhost.json") +      |> String.replace("{{nickname}}", old_user.nickname) +      |> Jason.encode!() + +    Tesla.Mock.mock(fn +      %{method: :get, url: ^old_user_url} -> +        %Tesla.Env{status: 200, body: body} +    end) +      User.follow(follower, old_user)      Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)      Pleroma.Tests.ObanHelpers.perform_all() @@ -131,8 +148,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    assert [expected] == -             NotificationView.render("index.json", %{notifications: [notification], for: follower}) +    test_notifications_rendering([notification], follower, [expected])    end    test "EmojiReact notification" do @@ -158,7 +174,6 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    assert expected == -             NotificationView.render("show.json", %{notification: notification, for: user}) +    test_notifications_rendering([notification], user, [expected])    end  end diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index 191895c6f..6791c2fb0 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -12,10 +12,12 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do    alias Pleroma.Object    alias Pleroma.Repo    alias Pleroma.User +  alias Pleroma.UserRelationship    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.CommonAPI.Utils    alias Pleroma.Web.MastodonAPI.AccountView    alias Pleroma.Web.MastodonAPI.StatusView +    import Pleroma.Factory    import Tesla.Mock @@ -92,6 +94,23 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      Repo.delete(user)      Cachex.clear(:user_cache) +    finger_url = +      "https://localhost/.well-known/webfinger?resource=acct:#{user.nickname}@localhost" + +    Tesla.Mock.mock_global(fn +      %{method: :get, url: "http://localhost/.well-known/host-meta"} -> +        %Tesla.Env{status: 404, body: ""} + +      %{method: :get, url: "https://localhost/.well-known/host-meta"} -> +        %Tesla.Env{status: 404, body: ""} + +      %{ +        method: :get, +        url: ^finger_url +      } -> +        %Tesla.Env{status: 404, body: ""} +    end) +      %{account: ms_user} = StatusView.render("show.json", activity: activity)      assert ms_user.acct == "erroruser@example.com" @@ -212,12 +231,21 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      {:ok, _user_relationships} = User.mute(user, other_user)      {:ok, activity} = CommonAPI.post(other_user, %{"status" => "test"}) -    status = StatusView.render("show.json", %{activity: activity}) +    relationships_opt = UserRelationship.view_relationships_option(user, [other_user]) + +    opts = %{activity: activity} +    status = StatusView.render("show.json", opts)      assert status.muted == false -    status = StatusView.render("show.json", %{activity: activity, for: user}) +    status = StatusView.render("show.json", Map.put(opts, :relationships, relationships_opt)) +    assert status.muted == false + +    for_opts = %{activity: activity, for: user} +    status = StatusView.render("show.json", for_opts) +    assert status.muted == true +    status = StatusView.render("show.json", Map.put(for_opts, :relationships, relationships_opt))      assert status.muted == true    end @@ -420,6 +448,22 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      assert length(represented[:media_attachments]) == 1    end +  test "funkwhale audio" do +    user = insert(:user) + +    {:ok, object} = +      Pleroma.Object.Fetcher.fetch_object_from_id( +        "https://channels.tests.funkwhale.audio/federation/music/uploads/42342395-0208-4fee-a38d-259a6dae0871" +      ) + +    %Activity{} = activity = Activity.get_create_by_object_ap_id(object.data["id"]) + +    represented = StatusView.render("show.json", %{for: user, activity: activity}) + +    assert represented[:id] == to_string(activity.id) +    assert length(represented[:media_attachments]) == 1 +  end +    test "a Mobilizon event" do      user = insert(:user) diff --git a/test/web/media_proxy/media_proxy_controller_test.exs b/test/web/media_proxy/media_proxy_controller_test.exs index 7ac7e4af1..da79d38a5 100644 --- a/test/web/media_proxy/media_proxy_controller_test.exs +++ b/test/web/media_proxy/media_proxy_controller_test.exs @@ -7,8 +7,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do    import Mock    alias Pleroma.Config -  clear_config(:media_proxy) -  clear_config([Pleroma.Web.Endpoint, :secret_key_base]) +  setup do: clear_config(:media_proxy) +  setup do: clear_config([Pleroma.Web.Endpoint, :secret_key_base])    test "it returns 404 when MediaProxy disabled", %{conn: conn} do      Config.put([:media_proxy, :enabled], false) diff --git a/test/web/media_proxy/media_proxy_test.exs b/test/web/media_proxy/media_proxy_test.exs index 8f5fcf2eb..69c2d5dae 100644 --- a/test/web/media_proxy/media_proxy_test.exs +++ b/test/web/media_proxy/media_proxy_test.exs @@ -8,8 +8,8 @@ defmodule Pleroma.Web.MediaProxyTest do    import Pleroma.Web.MediaProxy    alias Pleroma.Web.MediaProxy.MediaProxyController -  clear_config([:media_proxy, :enabled]) -  clear_config(Pleroma.Upload) +  setup do: clear_config([:media_proxy, :enabled]) +  setup do: clear_config(Pleroma.Upload)    describe "when enabled" do      setup do diff --git a/test/web/metadata/metadata_test.exs b/test/web/metadata/metadata_test.exs new file mode 100644 index 000000000..3f8b29e58 --- /dev/null +++ b/test/web/metadata/metadata_test.exs @@ -0,0 +1,25 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.MetadataTest do +  use Pleroma.DataCase, async: true + +  import Pleroma.Factory + +  describe "restrict indexing remote users" do +    test "for remote user" do +      user = insert(:user, local: false) + +      assert Pleroma.Web.Metadata.build_tags(%{user: user}) =~ +               "<meta content=\"noindex, noarchive\" name=\"robots\">" +    end + +    test "for local user" do +      user = insert(:user) + +      refute Pleroma.Web.Metadata.build_tags(%{user: user}) =~ +               "<meta content=\"noindex, noarchive\" name=\"robots\">" +    end +  end +end diff --git a/test/web/metadata/opengraph_test.exs b/test/web/metadata/opengraph_test.exs index 9d7c009eb..218540e6c 100644 --- a/test/web/metadata/opengraph_test.exs +++ b/test/web/metadata/opengraph_test.exs @@ -7,7 +7,7 @@ defmodule Pleroma.Web.Metadata.Providers.OpenGraphTest do    import Pleroma.Factory    alias Pleroma.Web.Metadata.Providers.OpenGraph -  clear_config([Pleroma.Web.Metadata, :unfurl_nsfw]) +  setup do: clear_config([Pleroma.Web.Metadata, :unfurl_nsfw])    test "it renders all supported types of attachments and skips unknown types" do      user = insert(:user) diff --git a/test/web/metadata/restrict_indexing_test.exs b/test/web/metadata/restrict_indexing_test.exs new file mode 100644 index 000000000..aad0bac42 --- /dev/null +++ b/test/web/metadata/restrict_indexing_test.exs @@ -0,0 +1,21 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Metadata.Providers.RestrictIndexingTest do +  use ExUnit.Case, async: true + +  describe "build_tags/1" do +    test "for remote user" do +      assert Pleroma.Web.Metadata.Providers.RestrictIndexing.build_tags(%{ +               user: %Pleroma.User{local: false} +             }) == [{:meta, [name: "robots", content: "noindex, noarchive"], []}] +    end + +    test "for local user" do +      assert Pleroma.Web.Metadata.Providers.RestrictIndexing.build_tags(%{ +               user: %Pleroma.User{local: true} +             }) == [] +    end +  end +end diff --git a/test/web/metadata/twitter_card_test.exs b/test/web/metadata/twitter_card_test.exs index 3d75d1ed5..9e9c6853a 100644 --- a/test/web/metadata/twitter_card_test.exs +++ b/test/web/metadata/twitter_card_test.exs @@ -13,7 +13,7 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do    alias Pleroma.Web.Metadata.Utils    alias Pleroma.Web.Router -  clear_config([Pleroma.Web.Metadata, :unfurl_nsfw]) +  setup do: clear_config([Pleroma.Web.Metadata, :unfurl_nsfw])    test "it renders twitter card for user info" do      user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994") diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs index ee10ad5db..9bcc07b37 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -7,8 +7,10 @@ defmodule Pleroma.Web.NodeInfoTest do    import Pleroma.Factory -  clear_config([:mrf_simple]) -  clear_config(:instance) +  alias Pleroma.Config + +  setup do: clear_config([:mrf_simple]) +  setup do: clear_config(:instance)    test "GET /.well-known/nodeinfo", %{conn: conn} do      links = @@ -47,7 +49,7 @@ defmodule Pleroma.Web.NodeInfoTest do      assert result = json_response(conn, 200) -    assert Pleroma.Config.get([Pleroma.User, :restricted_nicknames]) == +    assert Config.get([Pleroma.User, :restricted_nicknames]) ==               result["metadata"]["restrictedNicknames"]    end @@ -65,10 +67,10 @@ defmodule Pleroma.Web.NodeInfoTest do    end    test "returns fieldsLimits field", %{conn: conn} do -    Pleroma.Config.put([:instance, :max_account_fields], 10) -    Pleroma.Config.put([:instance, :max_remote_account_fields], 15) -    Pleroma.Config.put([:instance, :account_field_name_length], 255) -    Pleroma.Config.put([:instance, :account_field_value_length], 2048) +    Config.put([:instance, :max_account_fields], 10) +    Config.put([:instance, :max_remote_account_fields], 15) +    Config.put([:instance, :account_field_name_length], 255) +    Config.put([:instance, :account_field_value_length], 2048)      response =        conn @@ -82,8 +84,8 @@ defmodule Pleroma.Web.NodeInfoTest do    end    test "it returns the safe_dm_mentions feature if enabled", %{conn: conn} do -    option = Pleroma.Config.get([:instance, :safe_dm_mentions]) -    Pleroma.Config.put([:instance, :safe_dm_mentions], true) +    option = Config.get([:instance, :safe_dm_mentions]) +    Config.put([:instance, :safe_dm_mentions], true)      response =        conn @@ -92,7 +94,7 @@ defmodule Pleroma.Web.NodeInfoTest do      assert "safe_dm_mentions" in response["metadata"]["features"] -    Pleroma.Config.put([:instance, :safe_dm_mentions], false) +    Config.put([:instance, :safe_dm_mentions], false)      response =        conn @@ -101,14 +103,14 @@ defmodule Pleroma.Web.NodeInfoTest do      refute "safe_dm_mentions" in response["metadata"]["features"] -    Pleroma.Config.put([:instance, :safe_dm_mentions], option) +    Config.put([:instance, :safe_dm_mentions], option)    end    describe "`metadata/federation/enabled`" do -    clear_config([:instance, :federating]) +    setup do: clear_config([:instance, :federating])      test "it shows if federation is enabled/disabled", %{conn: conn} do -      Pleroma.Config.put([:instance, :federating], true) +      Config.put([:instance, :federating], true)        response =          conn @@ -117,7 +119,7 @@ defmodule Pleroma.Web.NodeInfoTest do        assert response["metadata"]["federation"]["enabled"] == true -      Pleroma.Config.put([:instance, :federating], false) +      Config.put([:instance, :federating], false)        response =          conn @@ -128,15 +130,39 @@ defmodule Pleroma.Web.NodeInfoTest do      end    end +  test "it shows default features flags", %{conn: conn} do +    response = +      conn +      |> get("/nodeinfo/2.1.json") +      |> json_response(:ok) + +    default_features = [ +      "pleroma_api", +      "mastodon_api", +      "mastodon_api_streaming", +      "polls", +      "pleroma_explicit_addressing", +      "shareable_emoji_packs", +      "multifetch", +      "pleroma_emoji_reactions", +      "pleroma:api/v1/notifications:include_types_filter" +    ] + +    assert MapSet.subset?( +             MapSet.new(default_features), +             MapSet.new(response["metadata"]["features"]) +           ) +  end +    test "it shows MRF transparency data if enabled", %{conn: conn} do -    config = Pleroma.Config.get([:instance, :rewrite_policy]) -    Pleroma.Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) +    config = Config.get([:instance, :rewrite_policy]) +    Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) -    option = Pleroma.Config.get([:instance, :mrf_transparency]) -    Pleroma.Config.put([:instance, :mrf_transparency], true) +    option = Config.get([:instance, :mrf_transparency]) +    Config.put([:instance, :mrf_transparency], true)      simple_config = %{"reject" => ["example.com"]} -    Pleroma.Config.put(:mrf_simple, simple_config) +    Config.put(:mrf_simple, simple_config)      response =        conn @@ -145,25 +171,25 @@ defmodule Pleroma.Web.NodeInfoTest do      assert response["metadata"]["federation"]["mrf_simple"] == simple_config -    Pleroma.Config.put([:instance, :rewrite_policy], config) -    Pleroma.Config.put([:instance, :mrf_transparency], option) -    Pleroma.Config.put(:mrf_simple, %{}) +    Config.put([:instance, :rewrite_policy], config) +    Config.put([:instance, :mrf_transparency], option) +    Config.put(:mrf_simple, %{})    end    test "it performs exclusions from MRF transparency data if configured", %{conn: conn} do -    config = Pleroma.Config.get([:instance, :rewrite_policy]) -    Pleroma.Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) +    config = Config.get([:instance, :rewrite_policy]) +    Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) -    option = Pleroma.Config.get([:instance, :mrf_transparency]) -    Pleroma.Config.put([:instance, :mrf_transparency], true) +    option = Config.get([:instance, :mrf_transparency]) +    Config.put([:instance, :mrf_transparency], true) -    exclusions = Pleroma.Config.get([:instance, :mrf_transparency_exclusions]) -    Pleroma.Config.put([:instance, :mrf_transparency_exclusions], ["other.site"]) +    exclusions = Config.get([:instance, :mrf_transparency_exclusions]) +    Config.put([:instance, :mrf_transparency_exclusions], ["other.site"])      simple_config = %{"reject" => ["example.com", "other.site"]}      expected_config = %{"reject" => ["example.com"]} -    Pleroma.Config.put(:mrf_simple, simple_config) +    Config.put(:mrf_simple, simple_config)      response =        conn @@ -173,9 +199,9 @@ defmodule Pleroma.Web.NodeInfoTest do      assert response["metadata"]["federation"]["mrf_simple"] == expected_config      assert response["metadata"]["federation"]["exclusions"] == true -    Pleroma.Config.put([:instance, :rewrite_policy], config) -    Pleroma.Config.put([:instance, :mrf_transparency], option) -    Pleroma.Config.put([:instance, :mrf_transparency_exclusions], exclusions) -    Pleroma.Config.put(:mrf_simple, %{}) +    Config.put([:instance, :rewrite_policy], config) +    Config.put([:instance, :mrf_transparency], option) +    Config.put([:instance, :mrf_transparency_exclusions], exclusions) +    Config.put(:mrf_simple, %{})    end  end diff --git a/test/web/oauth/ldap_authorization_test.exs b/test/web/oauth/ldap_authorization_test.exs index c55b0ffc5..a8fe8a841 100644 --- a/test/web/oauth/ldap_authorization_test.exs +++ b/test/web/oauth/ldap_authorization_test.exs @@ -12,13 +12,9 @@ defmodule Pleroma.Web.OAuth.LDAPAuthorizationTest do    @skip if !Code.ensure_loaded?(:eldap), do: :skip -  clear_config_all([:ldap, :enabled]) do -    Pleroma.Config.put([:ldap, :enabled], true) -  end +  setup_all do: clear_config([:ldap, :enabled], true) -  clear_config_all(Pleroma.Web.Auth.Authenticator) do -    Pleroma.Config.put(Pleroma.Web.Auth.Authenticator, Pleroma.Web.Auth.LDAPAuthenticator) -  end +  setup_all do: clear_config(Pleroma.Web.Auth.Authenticator, Pleroma.Web.Auth.LDAPAuthenticator)    @tag @skip    test "authorizes the existing user using LDAP credentials" do diff --git a/test/web/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs index cff469c28..f2f98d768 100644 --- a/test/web/oauth/oauth_controller_test.exs +++ b/test/web/oauth/oauth_controller_test.exs @@ -17,8 +17,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do      key: "_test",      signing_salt: "cooldude"    ] - -  clear_config([:instance, :account_activation_required]) +  setup do: clear_config([:instance, :account_activation_required])    describe "in OAuth consumer mode, " do      setup do @@ -31,12 +30,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        ]      end -    clear_config([:auth, :oauth_consumer_strategies]) do -      Pleroma.Config.put( -        [:auth, :oauth_consumer_strategies], -        ~w(twitter facebook) -      ) -    end +    setup do: clear_config([:auth, :oauth_consumer_strategies], ~w(twitter facebook))      test "GET /oauth/authorize renders auth forms, including OAuth consumer form", %{        app: app, @@ -581,7 +575,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        # In case scope param is missing, expecting _all_ app-supported scopes to be granted        for user <- [non_admin, admin],            {requested_scopes, expected_scopes} <- -            %{scopes_subset => scopes_subset, nil => app_scopes} do +            %{scopes_subset => scopes_subset, nil: app_scopes} do          conn =            post(              build_conn(), @@ -944,7 +938,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do    end    describe "POST /oauth/token - refresh token" do -    clear_config([:oauth2, :issue_new_refresh_token]) +    setup do: clear_config([:oauth2, :issue_new_refresh_token])      test "issues a new access token with keep fresh token" do        Pleroma.Config.put([:oauth2, :issue_new_refresh_token], true) diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index ae99e37fe..bb349cb19 100644 --- a/test/web/ostatus/ostatus_controller_test.exs +++ b/test/web/ostatus/ostatus_controller_test.exs @@ -17,9 +17,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do      :ok    end -  clear_config([:instance, :federating]) do -    Config.put([:instance, :federating], true) -  end +  setup do: clear_config([:instance, :federating], true)    # Note: see ActivityPubControllerTest for JSON format tests    describe "GET /objects/:uuid (text/html)" do diff --git a/test/web/pleroma_api/controllers/account_controller_test.exs b/test/web/pleroma_api/controllers/account_controller_test.exs index 3853a9bbb..ae5334015 100644 --- a/test/web/pleroma_api/controllers/account_controller_test.exs +++ b/test/web/pleroma_api/controllers/account_controller_test.exs @@ -27,9 +27,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do        [user: user]      end -    clear_config([:instance, :account_activation_required]) do -      Config.put([:instance, :account_activation_required], true) -    end +    setup do: clear_config([:instance, :account_activation_required], true)      test "resend account confirmation email", %{conn: conn, user: user} do        conn diff --git a/test/web/pleroma_api/controllers/emoji_api_controller_test.exs b/test/web/pleroma_api/controllers/emoji_api_controller_test.exs index 4b9f5cf9a..435fb6592 100644 --- a/test/web/pleroma_api/controllers/emoji_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_api_controller_test.exs @@ -12,10 +12,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do                      Pleroma.Config.get!([:instance, :static_dir]),                      "emoji"                    ) - -  clear_config([:auth, :enforce_oauth_admin_scope_usage]) do -    Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], false) -  end +  setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false)    test "shared & non-shared pack information in list_packs is ok" do      conn = build_conn() diff --git a/test/web/plugs/federating_plug_test.exs b/test/web/plugs/federating_plug_test.exs index 13edc4359..2f8aadadc 100644 --- a/test/web/plugs/federating_plug_test.exs +++ b/test/web/plugs/federating_plug_test.exs @@ -5,7 +5,7 @@  defmodule Pleroma.Web.FederatingPlugTest do    use Pleroma.Web.ConnCase -  clear_config([:instance, :federating]) +  setup do: clear_config([:instance, :federating])    test "returns and halt the conn when federating is disabled" do      Pleroma.Config.put([:instance, :federating], false) diff --git a/test/web/push/impl_test.exs b/test/web/push/impl_test.exs index b90e31f94..9121d90e7 100644 --- a/test/web/push/impl_test.exs +++ b/test/web/push/impl_test.exs @@ -134,7 +134,7 @@ defmodule Pleroma.Web.Push.ImplTest do      user = insert(:user, nickname: "Bob")      other_user = insert(:user)      {:ok, _, _, activity} = CommonAPI.follow(user, other_user) -    object = Object.normalize(activity) +    object = Object.normalize(activity, false)      assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has followed you" diff --git a/test/web/rich_media/helpers_test.exs b/test/web/rich_media/helpers_test.exs index 8237802a7..aa0c5c830 100644 --- a/test/web/rich_media/helpers_test.exs +++ b/test/web/rich_media/helpers_test.exs @@ -19,7 +19,7 @@ defmodule Pleroma.Web.RichMedia.HelpersTest do      :ok    end -  clear_config([:rich_media, :enabled]) +  setup do: clear_config([:rich_media, :enabled])    test "refuses to crawl incomplete URLs" do      user = insert(:user) diff --git a/test/web/static_fe/static_fe_controller_test.exs b/test/web/static_fe/static_fe_controller_test.exs index c3d2ae3b4..430683ea0 100644 --- a/test/web/static_fe/static_fe_controller_test.exs +++ b/test/web/static_fe/static_fe_controller_test.exs @@ -8,13 +8,8 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do    import Pleroma.Factory -  clear_config_all([:static_fe, :enabled]) do -    Config.put([:static_fe, :enabled], true) -  end - -  clear_config([:instance, :federating]) do -    Config.put([:instance, :federating], true) -  end +  setup_all do: clear_config([:static_fe, :enabled], true) +  setup do: clear_config([:instance, :federating], true)    setup %{conn: conn} do      conn = put_req_header(conn, "accept", "text/html") diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index f0bafc093..b3fe22920 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -19,8 +19,7 @@ defmodule Pleroma.Web.StreamerTest do    @streamer_timeout 150    @streamer_start_wait 10 - -  clear_config([:instance, :skip_thread_containment]) +  setup do: clear_config([:instance, :skip_thread_containment])    describe "user streams" do      setup do @@ -122,6 +121,18 @@ defmodule Pleroma.Web.StreamerTest do      test "it sends follow activities to the 'user:notification' stream", %{        user: user      } do +      user_url = user.ap_id + +      body = +        File.read!("test/fixtures/users_mock/localhost.json") +        |> String.replace("{{nickname}}", user.nickname) +        |> Jason.encode!() + +      Tesla.Mock.mock_global(fn +        %{method: :get, url: ^user_url} -> +          %Tesla.Env{status: 200, body: body} +      end) +        user2 = insert(:user)        task = Task.async(fn -> assert_receive {:text, _}, @streamer_timeout end) diff --git a/test/web/twitter_api/remote_follow_controller_test.exs b/test/web/twitter_api/remote_follow_controller_test.exs index 73062f18f..5ff8694a8 100644 --- a/test/web/twitter_api/remote_follow_controller_test.exs +++ b/test/web/twitter_api/remote_follow_controller_test.exs @@ -17,13 +17,10 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do      :ok    end -  clear_config_all([:instance, :federating]) do -    Config.put([:instance, :federating], true) -  end - -  clear_config([:instance]) -  clear_config([:frontend_configurations, :pleroma_fe]) -  clear_config([:user, :deny_follow_blocked]) +  setup_all do: clear_config([:instance, :federating], true) +  setup do: clear_config([:instance]) +  setup do: clear_config([:frontend_configurations, :pleroma_fe]) +  setup do: clear_config([:user, :deny_follow_blocked])    describe "GET /ostatus_subscribe - remote_follow/2" do      test "adds status to pleroma instance if the `acct` is a status", %{conn: conn} do diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index 14eed5f27..92f9aa0f5 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -117,9 +117,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "register with one time token" do -    clear_config([:instance, :registrations_open]) do -      Pleroma.Config.put([:instance, :registrations_open], false) -    end +    setup do: clear_config([:instance, :registrations_open], false)      test "returns user on success" do        {:ok, invite} = UserInviteToken.create_invite() @@ -184,9 +182,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "registers with date limited token" do -    clear_config([:instance, :registrations_open]) do -      Pleroma.Config.put([:instance, :registrations_open], false) -    end +    setup do: clear_config([:instance, :registrations_open], false)      setup do        data = %{ @@ -246,9 +242,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "registers with reusable token" do -    clear_config([:instance, :registrations_open]) do -      Pleroma.Config.put([:instance, :registrations_open], false) -    end +    setup do: clear_config([:instance, :registrations_open], false)      test "returns user on success, after him registration fails" do        {:ok, invite} = UserInviteToken.create_invite(%{max_use: 100}) @@ -292,9 +286,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "registers with reusable date limited token" do -    clear_config([:instance, :registrations_open]) do -      Pleroma.Config.put([:instance, :registrations_open], false) -    end +    setup do: clear_config([:instance, :registrations_open], false)      test "returns user on success" do        {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 100}) diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 9d757b5ef..30e54bebd 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -18,8 +18,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      :ok    end -  clear_config([:instance]) -  clear_config([:frontend_configurations, :pleroma_fe]) +  setup do: clear_config([:instance]) +  setup do: clear_config([:frontend_configurations, :pleroma_fe])    describe "POST /api/pleroma/follow_import" do      setup do: oauth_access(["follow"]) @@ -318,7 +318,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    end    describe "GET /api/pleroma/healthcheck" do -    clear_config([:instance, :healthcheck]) +    setup do: clear_config([:instance, :healthcheck])      test "returns 503 when healthcheck disabled", %{conn: conn} do        Config.put([:instance, :healthcheck], false) @@ -427,9 +427,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    end    describe "POST /main/ostatus - remote_subscribe/2" do -    clear_config([:instance, :federating]) do -      Config.put([:instance, :federating], true) -    end +    setup do: clear_config([:instance, :federating], true)      test "renders subscribe form", %{conn: conn} do        user = insert(:user) diff --git a/test/web/web_finger/web_finger_controller_test.exs b/test/web/web_finger/web_finger_controller_test.exs index b65bf5904..0023f1e81 100644 --- a/test/web/web_finger/web_finger_controller_test.exs +++ b/test/web/web_finger/web_finger_controller_test.exs @@ -14,9 +14,7 @@ defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do      :ok    end -  clear_config_all([:instance, :federating]) do -    Pleroma.Config.put([:instance, :federating], true) -  end +  setup_all do: clear_config([:instance, :federating], true)    test "GET host-meta" do      response = | 
