diff options
Diffstat (limited to 'test/web')
31 files changed, 679 insertions, 216 deletions
| diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index ff4604a52..9b7cfee63 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -877,7 +877,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert reaction_activity        assert reaction_activity.data["actor"] == reactor.ap_id -      assert reaction_activity.data["type"] == "EmojiReaction" +      assert reaction_activity.data["type"] == "EmojiReact"        assert reaction_activity.data["content"] == "🔥"        assert reaction_activity.data["object"] == object.data["id"]        assert reaction_activity.data["to"] == [User.ap_followers(reactor), activity.data["actor"]] @@ -1174,6 +1174,23 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert embedded_object["object"] == followed.ap_id        assert embedded_object["id"] == follow_activity.data["id"]      end + +    test "creates an undo activity for a pending follow request" do +      follower = insert(:user) +      followed = insert(:user, %{locked: true}) + +      {:ok, follow_activity} = ActivityPub.follow(follower, followed) +      {:ok, activity} = ActivityPub.unfollow(follower, followed) + +      assert activity.data["type"] == "Undo" +      assert activity.data["actor"] == follower.ap_id + +      embedded_object = activity.data["object"] +      assert is_map(embedded_object) +      assert embedded_object["type"] == "Follow" +      assert embedded_object["object"] == followed.ap_id +      assert embedded_object["id"] == follow_activity.data["id"] +    end    end    describe "blocking / unblocking" do @@ -1207,6 +1224,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    end    describe "deletion" do +    clear_config([:instance, :rewrite_policy]) +      test "it creates a delete activity and deletes the original object" do        note = insert(:note_activity)        object = Object.normalize(note) @@ -1310,11 +1329,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      end      test "it passes delete activity through MRF before deleting the object" do -      rewrite_policy = Pleroma.Config.get([:instance, :rewrite_policy])        Pleroma.Config.put([:instance, :rewrite_policy], Pleroma.Web.ActivityPub.MRF.DropPolicy) -      on_exit(fn -> Pleroma.Config.put([:instance, :rewrite_policy], rewrite_policy) end) -        note = insert(:note_activity)        object = Object.normalize(note) @@ -1379,6 +1395,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    end    describe "update" do +    clear_config([:instance, :max_pinned_statuses]) +      test "it creates an update activity with the new user data" do        user = insert(:user)        {:ok, user} = User.ensure_keys_present(user) diff --git a/test/web/activity_pub/mrf/hellthread_policy_test.exs b/test/web/activity_pub/mrf/hellthread_policy_test.exs index eb6ee4d04..a78752a12 100644 --- a/test/web/activity_pub/mrf/hellthread_policy_test.exs +++ b/test/web/activity_pub/mrf/hellthread_policy_test.exs @@ -26,6 +26,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicyTest do      [user: user, message: message]    end +  clear_config(:mrf_hellthread) +    describe "reject" do      test "rejects the message if the recipient count is above reject_threshold", %{        message: message diff --git a/test/web/activity_pub/mrf/keyword_policy_test.exs b/test/web/activity_pub/mrf/keyword_policy_test.exs index 602892a37..d950ddd56 100644 --- a/test/web/activity_pub/mrf/keyword_policy_test.exs +++ b/test/web/activity_pub/mrf/keyword_policy_test.exs @@ -7,6 +7,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicyTest do    alias Pleroma.Web.ActivityPub.MRF.KeywordPolicy +  clear_config(:mrf_keyword) +    setup do      Pleroma.Config.put([:mrf_keyword], %{reject: [], federated_timeline_removal: [], replace: []})    end diff --git a/test/web/activity_pub/mrf/mention_policy_test.exs b/test/web/activity_pub/mrf/mention_policy_test.exs index 9fd9c31df..93a55850f 100644 --- a/test/web/activity_pub/mrf/mention_policy_test.exs +++ b/test/web/activity_pub/mrf/mention_policy_test.exs @@ -7,6 +7,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do    alias Pleroma.Web.ActivityPub.MRF.MentionPolicy +  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/subchain_policy_test.exs b/test/web/activity_pub/mrf/subchain_policy_test.exs index f7cbcad48..29065f612 100644 --- a/test/web/activity_pub/mrf/subchain_policy_test.exs +++ b/test/web/activity_pub/mrf/subchain_policy_test.exs @@ -14,6 +14,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.SubchainPolicyTest do      "object" => %{"content" => "hi"}    } +  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], %{        ~r/^https:\/\/banned.com/s => [DropPolicy] diff --git a/test/web/activity_pub/transmogrifier/follow_handling_test.exs b/test/web/activity_pub/transmogrifier/follow_handling_test.exs index 1c88b05c2..fd771ac54 100644 --- a/test/web/activity_pub/transmogrifier/follow_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/follow_handling_test.exs @@ -19,6 +19,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do    end    describe "handle_incoming" 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 5da358c43..1b12ee3a9 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -340,7 +340,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["object"] == activity.data["object"]      end -    test "it works for incoming misskey likes, turning them into EmojiReactions" do +    test "it works for incoming misskey likes, turning them into EmojiReacts" do        user = insert(:user)        {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) @@ -352,13 +352,13 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)        assert data["actor"] == data["actor"] -      assert data["type"] == "EmojiReaction" +      assert data["type"] == "EmojiReact"        assert data["id"] == data["id"]        assert data["object"] == activity.data["object"]        assert data["content"] == "🍮"      end -    test "it works for incoming misskey likes that contain unicode emojis, turning them into EmojiReactions" do +    test "it works for incoming misskey likes that contain unicode emojis, turning them into EmojiReacts" do        user = insert(:user)        {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) @@ -371,7 +371,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)        assert data["actor"] == data["actor"] -      assert data["type"] == "EmojiReaction" +      assert data["type"] == "EmojiReact"        assert data["id"] == data["id"]        assert data["object"] == activity.data["object"]        assert data["content"] == "⭐" @@ -389,12 +389,31 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)        assert data["actor"] == "http://mastodon.example.org/users/admin" -      assert data["type"] == "EmojiReaction" +      assert data["type"] == "EmojiReact"        assert data["id"] == "http://mastodon.example.org/users/admin#reactions/2"        assert data["object"] == activity.data["object"]        assert data["content"] == "👌"      end +    test "it reject invalid emoji reactions" do +      user = insert(:user) +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) + +      data = +        File.read!("test/fixtures/emoji-reaction-too-long.json") +        |> Poison.decode!() +        |> Map.put("object", activity.data["object"]) + +      assert :error = Transmogrifier.handle_incoming(data) + +      data = +        File.read!("test/fixtures/emoji-reaction-no-emoji.json") +        |> Poison.decode!() +        |> Map.put("object", activity.data["object"]) + +      assert :error = Transmogrifier.handle_incoming(data) +    end +      test "it works for incoming emoji reaction undos" 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 5c767219a..908ef4d37 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -6,7 +6,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    use Pleroma.Web.ConnCase    use Oban.Testing, repo: Pleroma.Repo +  import Pleroma.Factory +  import ExUnit.CaptureLog +    alias Pleroma.Activity +  alias Pleroma.Config    alias Pleroma.ConfigDB    alias Pleroma.HTML    alias Pleroma.ModerationLog @@ -19,7 +23,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.MastodonAPI.StatusView    alias Pleroma.Web.MediaProxy -  import Pleroma.Factory    setup_all do      Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -41,7 +44,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    describe "with [:auth, :enforce_oauth_admin_scope_usage]," do      clear_config([:auth, :enforce_oauth_admin_scope_usage]) do -      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], true) +      Config.put([:auth, :enforce_oauth_admin_scope_usage], true)      end      test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope", @@ -91,7 +94,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    describe "unless [:auth, :enforce_oauth_admin_scope_usage]," do      clear_config([:auth, :enforce_oauth_admin_scope_usage]) do -      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], false) +      Config.put([:auth, :enforce_oauth_admin_scope_usage], false)      end      test "GET /api/pleroma/admin/users/:nickname requires " <> @@ -579,11 +582,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    describe "POST /api/pleroma/admin/email_invite, with valid config" do      clear_config([:instance, :registrations_open]) do -      Pleroma.Config.put([:instance, :registrations_open], false) +      Config.put([:instance, :registrations_open], false)      end      clear_config([:instance, :invites_enabled]) do -      Pleroma.Config.put([:instance, :invites_enabled], true) +      Config.put([:instance, :invites_enabled], true)      end      test "sends invitation and returns 204", %{admin: admin, conn: conn} do @@ -602,8 +605,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert token_record        refute token_record.used -      notify_email = Pleroma.Config.get([:instance, :notify_email]) -      instance_name = Pleroma.Config.get([:instance, :name]) +      notify_email = Config.get([:instance, :notify_email]) +      instance_name = Config.get([:instance, :name])        email =          Pleroma.Emails.UserEmail.user_invitation_email( @@ -639,8 +642,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      clear_config([:instance, :invites_enabled])      test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn} do -      Pleroma.Config.put([:instance, :registrations_open], false) -      Pleroma.Config.put([:instance, :invites_enabled], false) +      Config.put([:instance, :registrations_open], false) +      Config.put([:instance, :invites_enabled], false)        conn = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") @@ -648,8 +651,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end      test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do -      Pleroma.Config.put([:instance, :registrations_open], true) -      Pleroma.Config.put([:instance, :invites_enabled], true) +      Config.put([:instance, :registrations_open], true) +      Config.put([:instance, :invites_enabled], true)        conn = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") @@ -1886,26 +1889,17 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    describe "GET /api/pleroma/admin/config" do      clear_config(:configurable_from_database) do -      Pleroma.Config.put(:configurable_from_database, true) +      Config.put(:configurable_from_database, true)      end      test "when configuration from database is off", %{conn: conn} do -      initial = Pleroma.Config.get(:configurable_from_database) -      Pleroma.Config.put(:configurable_from_database, false) -      on_exit(fn -> Pleroma.Config.put(:configurable_from_database, initial) end) +      Config.put(:configurable_from_database, false)        conn = get(conn, "/api/pleroma/admin/config")        assert json_response(conn, 400) ==                 "To use this endpoint you need to enable configuration from database."      end -    test "without any settings in db", %{conn: conn} do -      conn = get(conn, "/api/pleroma/admin/config") - -      assert json_response(conn, 400) == -               "To use configuration from database migrate your settings to database." -    end -      test "with settings only in db", %{conn: conn} do        config1 = insert(:config)        config2 = insert(:config) @@ -2043,12 +2037,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          Application.delete_env(:pleroma, Pleroma.Captcha.NotReal)          Application.put_env(:pleroma, :http, http)          Application.put_env(:tesla, :adapter, Tesla.Mock) -        :ok = File.rm("config/test.exported_from_db.secret.exs") +        Restarter.Pleroma.refresh()        end)      end      clear_config(:configurable_from_database) do -      Pleroma.Config.put(:configurable_from_database, true) +      Config.put(:configurable_from_database, true)      end      @tag capture_log: true @@ -2170,7 +2164,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert Application.get_env(:idna, :key5) == {"string", Pleroma.Captcha.NotReal, []}      end -    test "save config setting without key", %{conn: conn} do +    test "save configs setting without explicit key", %{conn: conn} do        level = Application.get_env(:quack, :level)        meta = Application.get_env(:quack, :meta)        webhook_url = Application.get_env(:quack, :webhook_url) @@ -2256,6 +2250,106 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do               }      end +    test "saving config which need pleroma reboot", %{conn: conn} do +      chat = Config.get(:chat) +      on_exit(fn -> Config.put(:chat, chat) end) + +      assert post( +               conn, +               "/api/pleroma/admin/config", +               %{ +                 configs: [ +                   %{group: ":pleroma", key: ":chat", value: [%{"tuple" => [":enabled", true]}]} +                 ] +               } +             ) +             |> json_response(200) == %{ +               "configs" => [ +                 %{ +                   "db" => [":enabled"], +                   "group" => ":pleroma", +                   "key" => ":chat", +                   "value" => [%{"tuple" => [":enabled", true]}] +                 } +               ], +               "need_reboot" => true +             } + +      configs = +        conn +        |> get("/api/pleroma/admin/config") +        |> json_response(200) + +      assert configs["need_reboot"] + +      capture_log(fn -> +        assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} +      end) =~ "pleroma restarted" + +      configs = +        conn +        |> get("/api/pleroma/admin/config") +        |> json_response(200) + +      refute Map.has_key?(configs, "need_reboot") +    end + +    test "update setting which need reboot, don't change reboot flag until reboot", %{conn: conn} do +      chat = Config.get(:chat) +      on_exit(fn -> Config.put(:chat, chat) end) + +      assert post( +               conn, +               "/api/pleroma/admin/config", +               %{ +                 configs: [ +                   %{group: ":pleroma", key: ":chat", value: [%{"tuple" => [":enabled", true]}]} +                 ] +               } +             ) +             |> json_response(200) == %{ +               "configs" => [ +                 %{ +                   "db" => [":enabled"], +                   "group" => ":pleroma", +                   "key" => ":chat", +                   "value" => [%{"tuple" => [":enabled", true]}] +                 } +               ], +               "need_reboot" => true +             } + +      assert post(conn, "/api/pleroma/admin/config", %{ +               configs: [ +                 %{group: ":pleroma", key: ":key1", value: [%{"tuple" => [":key3", 3]}]} +               ] +             }) +             |> json_response(200) == %{ +               "configs" => [ +                 %{ +                   "group" => ":pleroma", +                   "key" => ":key1", +                   "value" => [ +                     %{"tuple" => [":key3", 3]} +                   ], +                   "db" => [":key3"] +                 } +               ], +               "need_reboot" => true +             } + +      capture_log(fn -> +        assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} +      end) =~ "pleroma restarted" + +      configs = +        conn +        |> get("/api/pleroma/admin/config") +        |> json_response(200) + +      refute Map.has_key?(configs, "need_reboot") +    end +      test "saving config with nested merge", %{conn: conn} do        config =          insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: [k1: 1, k2: 2])) @@ -2390,7 +2484,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 {ExSyslogger, :ex_syslogger}               ] -      ExUnit.CaptureLog.capture_log(fn -> +      capture_log(fn ->          require Logger          Logger.warn("Ooops...")        end) =~ "Ooops..." @@ -2523,7 +2617,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          })        assert Application.get_env(:tesla, :adapter) == Tesla.Adapter.Httpc -      assert Pleroma.Config.get([Pleroma.Captcha.NotReal, :name]) == "Pleroma" +      assert Config.get([Pleroma.Captcha.NotReal, :name]) == "Pleroma"        assert json_response(conn, 200) == %{                 "configs" => [ @@ -2957,47 +3051,17 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "config mix tasks run" do -    setup do -      Mix.shell(Mix.Shell.Quiet) - -      on_exit(fn -> -        Mix.shell(Mix.Shell.IO) -      end) - -      :ok -    end - +  describe "GET /api/pleroma/admin/restart" do      clear_config(:configurable_from_database) do -      Pleroma.Config.put(:configurable_from_database, true) +      Config.put(:configurable_from_database, true)      end -    clear_config([:feed, :post_title]) do -      Pleroma.Config.put([:feed, :post_title], %{max_length: 100, omission: "…"}) -    end - -    test "transfer settings to DB and to file", %{conn: conn} do -      assert Repo.all(Pleroma.ConfigDB) == [] -      Mix.Tasks.Pleroma.Config.migrate_to_db("test/fixtures/config/temp.secret.exs") -      assert Repo.aggregate(Pleroma.ConfigDB, :count, :id) > 0 - -      conn = get(conn, "/api/pleroma/admin/config/migrate_from_db") - -      assert json_response(conn, 200) == %{} -      assert Repo.all(Pleroma.ConfigDB) == [] -    end - -    test "returns error if configuration from database is off", %{conn: conn} do -      initial = Pleroma.Config.get(:configurable_from_database) -      on_exit(fn -> Pleroma.Config.put(:configurable_from_database, initial) end) -      Pleroma.Config.put(:configurable_from_database, false) - -      conn = get(conn, "/api/pleroma/admin/config/migrate_from_db") - -      assert json_response(conn, 400) == -               "To use this endpoint you need to enable configuration from database." +    test "pleroma restarts", %{conn: conn} do +      capture_log(fn -> +        assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} +      end) =~ "pleroma restarted" -      assert Repo.all(Pleroma.ConfigDB) == [] +      refute Restarter.Pleroma.need_reboot?()      end    end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index f8963e42e..601c32954 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -68,6 +68,7 @@ defmodule Pleroma.Web.CommonAPITest do      har = insert(:user)      jafnhar = insert(:user)      tridi = insert(:user) +      Pleroma.Config.put([:instance, :safe_dm_mentions], true)      {:ok, activity} = @@ -238,7 +239,9 @@ defmodule Pleroma.Web.CommonAPITest do        assert reaction.data["actor"] == user.ap_id        assert reaction.data["content"] == "👍" -      # TODO: test error case. +      {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) + +      {:error, _} = CommonAPI.react_with_emoji(activity.id, user, ".")      end      test "unreacting to a status with an emoji" do @@ -322,6 +325,21 @@ defmodule Pleroma.Web.CommonAPITest do        assert %User{pinned_activities: [^id]} = user      end +    test "pin poll", %{user: user} do +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "How is fediverse today?", +          "poll" => %{"options" => ["Absolutely outstanding", "Not good"], "expires_in" => 20} +        }) + +      assert {:ok, ^activity} = CommonAPI.pin(activity.id, user) + +      id = activity.id +      user = refresh_record(user) + +      assert %User{pinned_activities: [^id]} = user +    end +      test "unlisted statuses can be pinned", %{user: user} do        {:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!", "visibility" => "unlisted"})        assert {:ok, ^activity} = CommonAPI.pin(activity.id, user) @@ -534,6 +552,50 @@ defmodule Pleroma.Web.CommonAPITest do        refute User.subscribed_to?(follower, followed)      end + +    test "cancels a pending follow for a local user" do +      follower = insert(:user) +      followed = insert(:user, locked: true) + +      assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} = +               CommonAPI.follow(follower, followed) + +      assert User.get_follow_state(follower, followed) == "pending" +      assert {:ok, follower} = CommonAPI.unfollow(follower, followed) +      assert User.get_follow_state(follower, followed) == nil + +      assert %{id: ^activity_id, data: %{"state" => "cancelled"}} = +               Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(follower, followed) + +      assert %{ +               data: %{ +                 "type" => "Undo", +                 "object" => %{"type" => "Follow", "state" => "cancelled"} +               } +             } = Pleroma.Web.ActivityPub.Utils.fetch_latest_undo(follower) +    end + +    test "cancels a pending follow for a remote user" do +      follower = insert(:user) +      followed = insert(:user, locked: true, local: false, ap_enabled: true) + +      assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} = +               CommonAPI.follow(follower, followed) + +      assert User.get_follow_state(follower, followed) == "pending" +      assert {:ok, follower} = CommonAPI.unfollow(follower, followed) +      assert User.get_follow_state(follower, followed) == nil + +      assert %{id: ^activity_id, data: %{"state" => "cancelled"}} = +               Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(follower, followed) + +      assert %{ +               data: %{ +                 "type" => "Undo", +                 "object" => %{"type" => "Follow", "state" => "cancelled"} +               } +             } = Pleroma.Web.ActivityPub.Utils.fetch_latest_undo(follower) +    end    end    describe "accept_follow_request/2" do diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs index 4b761e039..848300ef3 100644 --- a/test/web/common_api/common_api_utils_test.exs +++ b/test/web/common_api/common_api_utils_test.exs @@ -575,11 +575,11 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do    end    describe "maybe_add_attachments/3" do -    test "returns parsed results when no_links is true" do +    test "returns parsed results when attachment_links is false" do        assert Utils.maybe_add_attachments(                 {"test", [], ["tags"]},                 [], -               true +               false               ) == {"test", [], ["tags"]}      end @@ -589,7 +589,7 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        assert Utils.maybe_add_attachments(                 {"test", [], ["tags"]},                 [attachment], -               false +               true               ) == {                 "test<br><a href=\"SakuraPM.png\" class='attachment'>SakuraPM.png</a>",                 [], 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 09bdc46e0..82d9e7d2f 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 @@ -269,7 +269,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do          |> json_response(200)        assert account_data["fields"] == [ -               %{"name" => "foo", "value" => "bar"}, +               %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "bar"},                 %{"name" => "link", "value" => ~S(<a href="http://cofe.io" rel="ugc">cofe.io</a>)}               ] @@ -297,7 +297,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do          |> json_response(200)        assert account["fields"] == [ -               %{"name" => "foo", "value" => "bar"}, +               %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "bar"},                 %{"name" => "link", "value" => ~S(<a href="http://cofe.io" rel="ugc">cofe.io</a>)}               ] diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 0d4860a42..8625bb9cf 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -15,6 +15,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do    import Pleroma.Factory    describe "account fetching" do +    clear_config([:instance, :limit_to_local_content]) +      test "works by id" do        user = insert(:user) @@ -44,7 +46,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end      test "works by nickname for remote users" do -      limit_to_local = Pleroma.Config.get([:instance, :limit_to_local_content])        Pleroma.Config.put([:instance, :limit_to_local_content], false)        user = insert(:user, nickname: "user@example.com", local: false) @@ -52,13 +53,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          build_conn()          |> get("/api/v1/accounts/#{user.nickname}") -      Pleroma.Config.put([:instance, :limit_to_local_content], limit_to_local)        assert %{"id" => id} = json_response(conn, 200)        assert id == user.id      end      test "respects limit_to_local_content == :all for remote user nicknames" do -      limit_to_local = Pleroma.Config.get([:instance, :limit_to_local_content])        Pleroma.Config.put([:instance, :limit_to_local_content], :all)        user = insert(:user, nickname: "user@example.com", local: false) @@ -67,12 +66,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          build_conn()          |> get("/api/v1/accounts/#{user.nickname}") -      Pleroma.Config.put([:instance, :limit_to_local_content], limit_to_local)        assert json_response(conn, 404)      end      test "respects limit_to_local_content == :unauthenticated for remote user nicknames" do -      limit_to_local = Pleroma.Config.get([:instance, :limit_to_local_content])        Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)        user = insert(:user, nickname: "user@example.com", local: false) @@ -90,7 +87,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          |> assign(:token, insert(:oauth_token, user: reading_user, scopes: ["read:accounts"]))          |> get("/api/v1/accounts/#{user.nickname}") -      Pleroma.Config.put([:instance, :limit_to_local_content], limit_to_local)        assert %{"id" => id} = json_response(conn, 200)        assert id == user.id      end @@ -457,6 +453,16 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert id == to_string(other_user.id)      end +    test "cancelling follow request", %{conn: conn} do +      %{id: other_user_id} = insert(:user, %{locked: true}) + +      assert %{"id" => ^other_user_id, "following" => false, "requested" => true} = +               conn |> post("/api/v1/accounts/#{other_user_id}/follow") |> json_response(:ok) + +      assert %{"id" => ^other_user_id, "following" => false, "requested" => false} = +               conn |> post("/api/v1/accounts/#{other_user_id}/unfollow") |> json_response(:ok) +    end +      test "following without reblogs" do        %{conn: conn} = oauth_access(["follow", "read:statuses"])        followed = insert(:user) @@ -667,7 +673,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert json_response(res, 400) == %{"error" => "{\"email\":[\"has already been taken\"]}"}      end +    clear_config([Pleroma.Plugs.RemoteIp, :enabled]) +      test "rate limit", %{conn: conn} do +      Pleroma.Config.put([Pleroma.Plugs.RemoteIp, :enabled], true)        app_token = insert(:oauth_token, user: nil)        conn = 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 9666a7f2e..6317d1b47 100644 --- a/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs +++ b/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs @@ -9,6 +9,9 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do    alias Pleroma.ScheduledActivity    import Pleroma.Factory +  import Ecto.Query + +  clear_config([ScheduledActivity, :enabled])    test "shows scheduled activities" do      %{user: user, conn: conn} = oauth_access(["read:statuses"]) @@ -52,11 +55,26 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do    end    test "updates a scheduled activity" do +    Pleroma.Config.put([ScheduledActivity, :enabled], true)      %{user: user, conn: conn} = oauth_access(["write:statuses"]) -    scheduled_activity = insert(:scheduled_activity, user: user) -    new_scheduled_at = -      NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(120), :millisecond) +    scheduled_at = Timex.shift(NaiveDateTime.utc_now(), minutes: 60) + +    {:ok, scheduled_activity} = +      ScheduledActivity.create( +        user, +        %{ +          scheduled_at: scheduled_at, +          params: build(:note).data +        } +      ) + +    job = Repo.one(from(j in Oban.Job, where: j.queue == "scheduled_activities")) + +    assert job.args == %{"activity_id" => scheduled_activity.id} +    assert DateTime.truncate(job.scheduled_at, :second) == to_datetime(scheduled_at) + +    new_scheduled_at = Timex.shift(NaiveDateTime.utc_now(), minutes: 120)      res_conn =        put(conn, "/api/v1/scheduled_statuses/#{scheduled_activity.id}", %{ @@ -65,6 +83,9 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do      assert %{"scheduled_at" => expected_scheduled_at} = json_response(res_conn, 200)      assert expected_scheduled_at == Pleroma.Web.CommonAPI.Utils.to_masto_date(new_scheduled_at) +    job = refresh_record(job) + +    assert DateTime.truncate(job.scheduled_at, :second) == to_datetime(new_scheduled_at)      res_conn = put(conn, "/api/v1/scheduled_statuses/404", %{scheduled_at: new_scheduled_at}) @@ -72,8 +93,22 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do    end    test "deletes a scheduled activity" do +    Pleroma.Config.put([ScheduledActivity, :enabled], true)      %{user: user, conn: conn} = oauth_access(["write:statuses"]) -    scheduled_activity = insert(:scheduled_activity, user: user) +    scheduled_at = Timex.shift(NaiveDateTime.utc_now(), minutes: 60) + +    {:ok, scheduled_activity} = +      ScheduledActivity.create( +        user, +        %{ +          scheduled_at: scheduled_at, +          params: build(:note).data +        } +      ) + +    job = Repo.one(from(j in Oban.Job, where: j.queue == "scheduled_activities")) + +    assert job.args == %{"activity_id" => scheduled_activity.id}      res_conn =        conn @@ -81,7 +116,8 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do        |> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}")      assert %{} = json_response(res_conn, 200) -    assert nil == Repo.get(ScheduledActivity, scheduled_activity.id) +    refute Repo.get(ScheduledActivity, scheduled_activity.id) +    refute Repo.get(Oban.Job, job.id)      res_conn =        conn diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index b03b4b344..781c3f7dc 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -21,6 +21,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do    clear_config([:instance, :federating])    clear_config([:instance, :allow_relay]) +  clear_config([:rich_media, :enabled])    describe "posting statuses" do      setup do: oauth_access(["write:statuses"]) @@ -121,6 +122,32 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do                 NaiveDateTime.to_iso8601(expiration.scheduled_at)      end +    test "it fails to create a status if `expires_in` is less or equal than an hour", %{ +      conn: conn +    } do +      # 1 hour +      expires_in = 60 * 60 + +      assert %{"error" => "Expiry date is too soon"} = +               conn +               |> post("api/v1/statuses", %{ +                 "status" => "oolong", +                 "expires_in" => expires_in +               }) +               |> json_response(422) + +      # 30 minutes +      expires_in = 30 * 60 + +      assert %{"error" => "Expiry date is too soon"} = +               conn +               |> post("api/v1/statuses", %{ +                 "status" => "oolong", +                 "expires_in" => expires_in +               }) +               |> json_response(422) +    end +      test "posting an undefined status with an attachment", %{user: user, conn: conn} do        file = %Plug.Upload{          content_type: "image/jpg", @@ -370,6 +397,11 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        assert NaiveDateTime.diff(NaiveDateTime.from_iso8601!(response["poll"]["expires_at"]), time) in 420..430        refute response["poll"]["expred"] + +      question = Object.get_by_id(response["poll"]["id"]) + +      # closed contains utc timezone +      assert question.data["closed"] =~ "Z"      end      test "option limit is enforced", %{conn: conn} do @@ -1223,4 +1255,23 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      assert [] = json_response(third_conn, 200)    end + +  test "expires_at is nil for another user" do +    %{conn: conn, user: user} = oauth_access(["read:statuses"]) +    {:ok, activity} = CommonAPI.post(user, %{"status" => "foobar", "expires_in" => 1_000_000}) + +    expires_at = +      activity.id +      |> ActivityExpiration.get_by_activity_id() +      |> Map.get(:scheduled_at) +      |> NaiveDateTime.to_iso8601() + +    assert %{"pleroma" => %{"expires_at" => ^expires_at}} = +             conn |> get("/api/v1/statuses/#{activity.id}") |> json_response(:ok) + +    %{conn: conn} = oauth_access(["read:statuses"]) + +    assert %{"pleroma" => %{"expires_at" => nil}} = +             conn |> get("/api/v1/statuses/#{activity.id}") |> json_response(:ok) +  end  end diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index 2107bb85c..00c294845 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -368,10 +368,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      assert result.pleroma[:settings_store] == nil    end -  test "sanitizes display names" do +  test "doesn't sanitize display names" do      user = insert(:user, name: "<marquee> username </marquee>")      result = AccountView.render("show.json", %{user: user}) -    refute result.display_name == "<marquee> username </marquee>" +    assert result.display_name == "<marquee> username </marquee>"    end    test "never display nil user follow counts" do diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index 1fe83cb2c..2ac75c2ff 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -135,7 +135,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do               NotificationView.render("index.json", %{notifications: [notification], for: follower})    end -  test "EmojiReaction notification" do +  test "EmojiReact notification" do      user = insert(:user)      other_user = insert(:user) diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index 25777b011..560f8179f 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -37,8 +37,15 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      status = StatusView.render("show.json", activity: activity)      assert status[:pleroma][:emoji_reactions] == [ -             %{emoji: "☕", count: 2}, -             %{emoji: "🍵", count: 1} +             %{name: "☕", count: 2, me: false}, +             %{name: "🍵", count: 1, me: false} +           ] + +    status = StatusView.render("show.json", activity: activity, for: user) + +    assert status[:pleroma][:emoji_reactions] == [ +             %{name: "☕", count: 2, me: true}, +             %{name: "🍵", count: 1, me: false}             ]    end @@ -484,7 +491,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do          title: "Example website"        } -      %{provider_name: "Example site name"} = +      %{provider_name: "example.com"} =          StatusView.render("card.json", %{page_url: page_url, rich_media: card})      end @@ -499,7 +506,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do          description: "Example description"        } -      %{provider_name: "Example site name"} = +      %{provider_name: "example.com"} =          StatusView.render("card.json", %{page_url: page_url, rich_media: card})      end    end diff --git a/test/web/media_proxy/media_proxy_controller_test.exs b/test/web/media_proxy/media_proxy_controller_test.exs index fdfdb5ec6..8c0c2a0e2 100644 --- a/test/web/media_proxy/media_proxy_controller_test.exs +++ b/test/web/media_proxy/media_proxy_controller_test.exs @@ -7,11 +7,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do    import Mock    alias Pleroma.Config -  setup do -    media_proxy_config = Config.get([:media_proxy]) || [] -    on_exit(fn -> Config.put([:media_proxy], media_proxy_config) end) -    :ok -  end +  clear_config(:media_proxy) +  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 96bdde219..2be5c9de0 100644 --- a/test/web/media_proxy/media_proxy_test.exs +++ b/test/web/media_proxy/media_proxy_test.exs @@ -9,6 +9,7 @@ defmodule Pleroma.Web.MediaProxyTest do    alias Pleroma.Web.MediaProxy.MediaProxyController    clear_config([:media_proxy, :enabled]) +  clear_config(Pleroma.Upload)    describe "when enabled" do      setup do @@ -224,7 +225,6 @@ defmodule Pleroma.Web.MediaProxyTest do      end      test "ensure Pleroma.Upload base_url is always whitelisted" do -      upload_config = Pleroma.Config.get([Pleroma.Upload])        media_url = "https://media.pleroma.social"        Pleroma.Config.put([Pleroma.Upload, :base_url], media_url) @@ -232,8 +232,6 @@ defmodule Pleroma.Web.MediaProxyTest do        encoded = url(url)        assert String.starts_with?(encoded, media_url) - -      Pleroma.Config.put([Pleroma.Upload], upload_config)      end    end  end diff --git a/test/web/metadata/opengraph_test.exs b/test/web/metadata/opengraph_test.exs index 4283f72cd..0d47b1cb8 100644 --- a/test/web/metadata/opengraph_test.exs +++ b/test/web/metadata/opengraph_test.exs @@ -7,6 +7,8 @@ defmodule Pleroma.Web.Metadata.Providers.OpenGraphTest do    import Pleroma.Factory    alias Pleroma.Web.Metadata.Providers.OpenGraph +  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/twitter_card_test.exs b/test/web/metadata/twitter_card_test.exs index 85a654f52..faf347cc6 100644 --- a/test/web/metadata/twitter_card_test.exs +++ b/test/web/metadata/twitter_card_test.exs @@ -13,6 +13,8 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do    alias Pleroma.Web.Metadata.Utils    alias Pleroma.Web.Router +  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")      avatar_url = Utils.attachment_url(User.avatar_url(user)) diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs index 9a574a38d..d1d7a3ce8 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -7,6 +7,9 @@ defmodule Pleroma.Web.NodeInfoTest do    import Pleroma.Factory +  clear_config([:mrf_simple]) +  clear_config(:instance) +    test "GET /.well-known/nodeinfo", %{conn: conn} do      links =        conn @@ -62,11 +65,6 @@ defmodule Pleroma.Web.NodeInfoTest do    end    test "returns fieldsLimits field", %{conn: conn} do -    max_account_fields = Pleroma.Config.get([:instance, :max_account_fields]) -    max_remote_account_fields = Pleroma.Config.get([:instance, :max_remote_account_fields]) -    account_field_name_length = Pleroma.Config.get([:instance, :account_field_name_length]) -    account_field_value_length = Pleroma.Config.get([:instance, :account_field_value_length]) -      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) @@ -81,11 +79,6 @@ defmodule Pleroma.Web.NodeInfoTest do      assert response["metadata"]["fieldsLimits"]["maxRemoteFields"] == 15      assert response["metadata"]["fieldsLimits"]["nameLength"] == 255      assert response["metadata"]["fieldsLimits"]["valueLength"] == 2048 - -    Pleroma.Config.put([:instance, :max_account_fields], max_account_fields) -    Pleroma.Config.put([:instance, :max_remote_account_fields], max_remote_account_fields) -    Pleroma.Config.put([:instance, :account_field_name_length], account_field_name_length) -    Pleroma.Config.put([:instance, :account_field_value_length], account_field_value_length)    end    test "it returns the safe_dm_mentions feature if enabled", %{conn: conn} do @@ -111,28 +104,28 @@ defmodule Pleroma.Web.NodeInfoTest do      Pleroma.Config.put([:instance, :safe_dm_mentions], option)    end -  test "it shows if federation is enabled/disabled", %{conn: conn} do -    original = Pleroma.Config.get([:instance, :federating]) +  describe "`metadata/federation/enabled`" do +    clear_config([:instance, :federating]) -    Pleroma.Config.put([:instance, :federating], true) - -    response = -      conn -      |> get("/nodeinfo/2.1.json") -      |> json_response(:ok) +    test "it shows if federation is enabled/disabled", %{conn: conn} do +      Pleroma.Config.put([:instance, :federating], true) -    assert response["metadata"]["federation"]["enabled"] == true +      response = +        conn +        |> get("/nodeinfo/2.1.json") +        |> json_response(:ok) -    Pleroma.Config.put([:instance, :federating], false) +      assert response["metadata"]["federation"]["enabled"] == true -    response = -      conn -      |> get("/nodeinfo/2.1.json") -      |> json_response(:ok) +      Pleroma.Config.put([:instance, :federating], false) -    assert response["metadata"]["federation"]["enabled"] == false +      response = +        conn +        |> get("/nodeinfo/2.1.json") +        |> json_response(:ok) -    Pleroma.Config.put([:instance, :federating], original) +      assert response["metadata"]["federation"]["enabled"] == false +    end    end    test "it shows MRF transparency data if enabled", %{conn: conn} do diff --git a/test/web/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs index adeff8e25..89fcf8c36 100644 --- a/test/web/oauth/oauth_controller_test.exs +++ b/test/web/oauth/oauth_controller_test.exs @@ -17,7 +17,8 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do      key: "_test",      signing_salt: "cooldude"    ] -  clear_config_all([:instance, :account_activation_required]) + +  clear_config([:instance, :account_activation_required])    describe "in OAuth consumer mode, " do      setup do 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 8e76f2f3d..6f1ea78ec 100644 --- a/test/web/pleroma_api/controllers/emoji_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_api_controller_test.exs @@ -6,7 +6,6 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do    use Pleroma.Web.ConnCase    import Tesla.Mock -    import Pleroma.Factory    @emoji_dir_path Path.join( diff --git a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs index 3978c2ec5..36868db38 100644 --- a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs @@ -14,7 +14,7 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do    import Pleroma.Factory -  test "POST /api/v1/pleroma/statuses/:id/react_with_emoji", %{conn: conn} do +  test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do      user = insert(:user)      other_user = insert(:user) @@ -24,13 +24,19 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do        conn        |> assign(:user, other_user)        |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) -      |> post("/api/v1/pleroma/statuses/#{activity.id}/react_with_emoji", %{"emoji" => "☕"}) +      |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") +      |> json_response(200) -    assert %{"id" => id} = json_response(result, 200) +    # We return the status, but this our implementation detail. +    assert %{"id" => id} = result      assert to_string(activity.id) == id + +    assert result["pleroma"]["emoji_reactions"] == [ +             %{"name" => "☕", "count" => 1, "me" => true} +           ]    end -  test "POST /api/v1/pleroma/statuses/:id/unreact_with_emoji", %{conn: conn} do +  test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do      user = insert(:user)      other_user = insert(:user) @@ -41,7 +47,7 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do        conn        |> assign(:user, other_user)        |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) -      |> post("/api/v1/pleroma/statuses/#{activity.id}/unreact_with_emoji", %{"emoji" => "☕"}) +      |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕")      assert %{"id" => id} = json_response(result, 200)      assert to_string(activity.id) == id @@ -51,28 +57,43 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do      assert object.data["reaction_count"] == 0    end -  test "GET /api/v1/pleroma/statuses/:id/emoji_reactions_by", %{conn: conn} do +  test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do      user = insert(:user)      other_user = insert(:user) +    doomed_user = insert(:user)      {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})      result =        conn -      |> get("/api/v1/pleroma/statuses/#{activity.id}/emoji_reactions_by") +      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions")        |> json_response(200)      assert result == []      {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") +    {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅") + +    User.perform(:delete, doomed_user)      result =        conn -      |> get("/api/v1/pleroma/statuses/#{activity.id}/emoji_reactions_by") +      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions")        |> json_response(200) -    [%{"emoji" => "🎅", "count" => 1, "accounts" => [represented_user]}] = result +    [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result +      assert represented_user["id"] == other_user.id + +    result = +      conn +      |> assign(:user, other_user) +      |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:statuses"])) +      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") +      |> json_response(200) + +    assert [%{"name" => "🎅", "count" => 1, "accounts" => [_represented_user], "me" => true}] = +             result    end    test "/api/v1/pleroma/conversations/:id" do diff --git a/test/web/plugs/federating_plug_test.exs b/test/web/plugs/federating_plug_test.exs index 9dcab93da..c26b487d9 100644 --- a/test/web/plugs/federating_plug_test.exs +++ b/test/web/plugs/federating_plug_test.exs @@ -4,7 +4,8 @@  defmodule Pleroma.Web.FederatingPlugTest do    use Pleroma.Web.ConnCase -  clear_config_all([:instance, :federating]) + +  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/rich_media/parsers/twitter_card_test.exs b/test/web/rich_media/parsers/twitter_card_test.exs index e2610f4c2..f2ebbde7e 100644 --- a/test/web/rich_media/parsers/twitter_card_test.exs +++ b/test/web/rich_media/parsers/twitter_card_test.exs @@ -7,11 +7,14 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do    alias Pleroma.Web.RichMedia.Parsers.TwitterCard    test "returns error when html not contains twitter card" do -    assert TwitterCard.parse("", %{}) == {:error, "No twitter card metadata found"} +    assert TwitterCard.parse([{"html", [], [{"head", [], []}, {"body", [], []}]}], %{}) == +             {:error, "No twitter card metadata found"}    end    test "parses twitter card with only name attributes" do -    html = File.read!("test/fixtures/nypd-facial-recognition-children-teenagers3.html") +    html = +      File.read!("test/fixtures/nypd-facial-recognition-children-teenagers3.html") +      |> Floki.parse_document!()      assert TwitterCard.parse(html, %{}) ==               {:ok, @@ -26,7 +29,9 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do    end    test "parses twitter card with only property attributes" do -    html = File.read!("test/fixtures/nypd-facial-recognition-children-teenagers2.html") +    html = +      File.read!("test/fixtures/nypd-facial-recognition-children-teenagers2.html") +      |> Floki.parse_document!()      assert TwitterCard.parse(html, %{}) ==               {:ok, @@ -45,7 +50,9 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do    end    test "parses twitter card with name & property attributes" do -    html = File.read!("test/fixtures/nypd-facial-recognition-children-teenagers.html") +    html = +      File.read!("test/fixtures/nypd-facial-recognition-children-teenagers.html") +      |> Floki.parse_document!()      assert TwitterCard.parse(html, %{}) ==               {:ok, @@ -73,7 +80,8 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do          "YTQ5MF9EQVIgZXhodW1hdGlvbiBvZiBNYXJnYXJldCBDb3JiaW4gZ3JhdmUgMTkyNi5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9" <>          "yaWVudCJdLFsicCIsInRodW1iIiwiNjAweD4iXV0/DAR%20exhumation%20of%20Margaret%20Corbin%20grave%201926.jpg" -    html = File.read!("test/fixtures/margaret-corbin-grave-west-point.html") +    html = +      File.read!("test/fixtures/margaret-corbin-grave-west-point.html") |> Floki.parse_document!()      assert TwitterCard.parse(html, %{}) ==               {:ok, @@ -85,4 +93,21 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do                  image: image_path                }}    end + +  test "takes first founded title in html head if there is html markup error" do +    html = +      File.read!("test/fixtures/nypd-facial-recognition-children-teenagers4.html") +      |> Floki.parse_document!() + +    assert TwitterCard.parse(html, %{}) == +             {:ok, +              %{ +                site: nil, +                title: +                  "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database. - The New York Times", +                "app:id:googleplay": "com.nytimes.android", +                "app:name:googleplay": "NYTimes", +                "app:url:googleplay": "nytimes://reader/id/100000006583622" +              }} +  end  end diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index 7166d6f0b..1cf20f1c2 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -20,7 +20,7 @@ defmodule Pleroma.Web.StreamerTest do    @streamer_timeout 150    @streamer_start_wait 10 -  clear_config_all([:instance, :skip_thread_containment]) +  clear_config([:instance, :skip_thread_containment])    describe "user streams" do      setup do @@ -65,6 +65,9 @@ defmodule Pleroma.Web.StreamerTest do        blocked = insert(:user)        {:ok, _user_relationship} = User.block(user, blocked) +      {:ok, activity} = CommonAPI.post(user, %{"status" => ":("}) +      {:ok, notif, _} = CommonAPI.favorite(activity.id, blocked) +        task = Task.async(fn -> refute_receive {:text, _}, @streamer_timeout end)        Streamer.add_socket( @@ -72,9 +75,6 @@ defmodule Pleroma.Web.StreamerTest do          %{transport_pid: task.pid, assigns: %{user: user}}        ) -      {:ok, activity} = CommonAPI.post(user, %{"status" => ":("}) -      {:ok, notif, _} = CommonAPI.favorite(activity.id, blocked) -        Streamer.stream("user:notification", notif)        Task.await(task)      end @@ -83,6 +83,11 @@ defmodule Pleroma.Web.StreamerTest do        user: user      } do        user2 = insert(:user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"}) +      {:ok, activity} = CommonAPI.add_mute(user, activity) +      {:ok, notif, _} = CommonAPI.favorite(activity.id, user2) +        task = Task.async(fn -> refute_receive {:text, _}, @streamer_timeout end)        Streamer.add_socket( @@ -90,9 +95,6 @@ defmodule Pleroma.Web.StreamerTest do          %{transport_pid: task.pid, assigns: %{user: user}}        ) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"}) -      {:ok, activity} = CommonAPI.add_mute(user, activity) -      {:ok, notif, _} = CommonAPI.favorite(activity.id, user2)        Streamer.stream("user:notification", notif)        Task.await(task)      end @@ -101,6 +103,11 @@ defmodule Pleroma.Web.StreamerTest do        user: user      } do        user2 = insert(:user, %{ap_id: "https://hecking-lewd-place.com/user/meanie"}) + +      {:ok, user} = User.block_domain(user, "hecking-lewd-place.com") +      {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"}) +      {:ok, notif, _} = CommonAPI.favorite(activity.id, user2) +        task = Task.async(fn -> refute_receive {:text, _}, @streamer_timeout end)        Streamer.add_socket( @@ -108,10 +115,6 @@ defmodule Pleroma.Web.StreamerTest do          %{transport_pid: task.pid, assigns: %{user: user}}        ) -      {:ok, user} = User.block_domain(user, "hecking-lewd-place.com") -      {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"}) -      {:ok, notif, _} = CommonAPI.favorite(activity.id, user2) -        Streamer.stream("user:notification", notif)        Task.await(task)      end @@ -267,6 +270,8 @@ defmodule Pleroma.Web.StreamerTest do        blocked_user = insert(:user)        {:ok, _user_relationship} = User.block(user, blocked_user) +      {:ok, activity} = CommonAPI.post(blocked_user, %{"status" => "Test"}) +        task =          Task.async(fn ->            refute_receive {:text, _}, 1_000 @@ -277,8 +282,6 @@ defmodule Pleroma.Web.StreamerTest do          user: user        } -      {:ok, activity} = CommonAPI.post(blocked_user, %{"status" => "Test"}) -        topics = %{          "public" => [fake_socket]        } @@ -335,6 +338,12 @@ defmodule Pleroma.Web.StreamerTest do      {:ok, list} = List.create("Test", user_a)      {:ok, list} = List.follow(list, user_b) +    {:ok, activity} = +      CommonAPI.post(user_b, %{ +        "status" => "@#{user_c.nickname} Test", +        "visibility" => "direct" +      }) +      task =        Task.async(fn ->          refute_receive {:text, _}, 1_000 @@ -345,12 +354,6 @@ defmodule Pleroma.Web.StreamerTest do        user: user_a      } -    {:ok, activity} = -      CommonAPI.post(user_b, %{ -        "status" => "@#{user_c.nickname} Test", -        "visibility" => "direct" -      }) -      topics = %{        "list:#{list.id}" => [fake_socket]      } @@ -367,6 +370,12 @@ defmodule Pleroma.Web.StreamerTest do      {:ok, list} = List.create("Test", user_a)      {:ok, list} = List.follow(list, user_b) +    {:ok, activity} = +      CommonAPI.post(user_b, %{ +        "status" => "Test", +        "visibility" => "private" +      }) +      task =        Task.async(fn ->          refute_receive {:text, _}, 1_000 @@ -377,12 +386,6 @@ defmodule Pleroma.Web.StreamerTest do        user: user_a      } -    {:ok, activity} = -      CommonAPI.post(user_b, %{ -        "status" => "Test", -        "visibility" => "private" -      }) -      topics = %{        "list:#{list.id}" => [fake_socket]      } @@ -401,6 +404,12 @@ defmodule Pleroma.Web.StreamerTest do      {:ok, list} = List.create("Test", user_a)      {:ok, list} = List.follow(list, user_b) +    {:ok, activity} = +      CommonAPI.post(user_b, %{ +        "status" => "Test", +        "visibility" => "private" +      }) +      task =        Task.async(fn ->          assert_receive {:text, _}, 1_000 @@ -411,12 +420,6 @@ defmodule Pleroma.Web.StreamerTest do        user: user_a      } -    {:ok, activity} = -      CommonAPI.post(user_b, %{ -        "status" => "Test", -        "visibility" => "private" -      }) -      Streamer.add_socket(        "list:#{list.id}",        fake_socket @@ -433,6 +436,9 @@ defmodule Pleroma.Web.StreamerTest do      user3 = insert(:user)      CommonAPI.hide_reblogs(user1, user2) +    {:ok, create_activity} = CommonAPI.post(user3, %{"status" => "I'm kawen"}) +    {:ok, announce_activity, _} = CommonAPI.repeat(create_activity.id, user2) +      task =        Task.async(fn ->          refute_receive {:text, _}, 1_000 @@ -443,14 +449,39 @@ defmodule Pleroma.Web.StreamerTest do        user: user1      } +    topics = %{ +      "public" => [fake_socket] +    } + +    Worker.push_to_socket(topics, "public", announce_activity) + +    Task.await(task) +  end + +  test "it does send non-reblog notification for reblog-muted actors" do +    user1 = insert(:user) +    user2 = insert(:user) +    user3 = insert(:user) +    CommonAPI.hide_reblogs(user1, user2) +      {:ok, create_activity} = CommonAPI.post(user3, %{"status" => "I'm kawen"}) -    {:ok, announce_activity, _} = CommonAPI.repeat(create_activity.id, user2) +    {:ok, favorite_activity, _} = CommonAPI.favorite(create_activity.id, user2) + +    task = +      Task.async(fn -> +        assert_receive {:text, _}, 1_000 +      end) + +    fake_socket = %StreamerSocket{ +      transport_pid: task.pid, +      user: user1 +    }      topics = %{        "public" => [fake_socket]      } -    Worker.push_to_socket(topics, "public", announce_activity) +    Worker.push_to_socket(topics, "public", favorite_activity)      Task.await(task)    end diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs new file mode 100644 index 000000000..ab0a2c3df --- /dev/null +++ b/test/web/twitter_api/twitter_api_controller_test.exs @@ -0,0 +1,142 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.TwitterAPI.ControllerTest do +  use Pleroma.Web.ConnCase + +  alias Pleroma.Builders.ActivityBuilder +  alias Pleroma.Repo +  alias Pleroma.User +  alias Pleroma.Web.OAuth.Token + +  import Pleroma.Factory + +  describe "POST /api/qvitter/statuses/notifications/read" do +    test "without valid credentials", %{conn: conn} do +      conn = post(conn, "/api/qvitter/statuses/notifications/read", %{"latest_id" => 1_234_567}) +      assert json_response(conn, 403) == %{"error" => "Invalid credentials."} +    end + +    test "with credentials, without any params" do +      %{user: current_user, conn: conn} = +        oauth_access(["read:notifications", "write:notifications"]) + +      conn = +        conn +        |> assign(:user, current_user) +        |> post("/api/qvitter/statuses/notifications/read") + +      assert json_response(conn, 400) == %{ +               "error" => "You need to specify latest_id", +               "request" => "/api/qvitter/statuses/notifications/read" +             } +    end + +    test "with credentials, with params" do +      %{user: current_user, conn: conn} = +        oauth_access(["read:notifications", "write:notifications"]) + +      other_user = insert(:user) + +      {:ok, _activity} = +        ActivityBuilder.insert(%{"to" => [current_user.ap_id]}, %{user: other_user}) + +      response_conn = +        conn +        |> assign(:user, current_user) +        |> get("/api/v1/notifications") + +      [notification] = response = json_response(response_conn, 200) + +      assert length(response) == 1 + +      assert notification["pleroma"]["is_seen"] == false + +      response_conn = +        conn +        |> assign(:user, current_user) +        |> post("/api/qvitter/statuses/notifications/read", %{"latest_id" => notification["id"]}) + +      [notification] = response = json_response(response_conn, 200) + +      assert length(response) == 1 + +      assert notification["pleroma"]["is_seen"] == true +    end +  end + +  describe "GET /api/account/confirm_email/:id/:token" do +    setup do +      {:ok, user} = +        insert(:user) +        |> User.confirmation_changeset(need_confirmation: true) +        |> Repo.update() + +      assert user.confirmation_pending + +      [user: user] +    end + +    test "it redirects to root url", %{conn: conn, user: user} do +      conn = get(conn, "/api/account/confirm_email/#{user.id}/#{user.confirmation_token}") + +      assert 302 == conn.status +    end + +    test "it confirms the user account", %{conn: conn, user: user} do +      get(conn, "/api/account/confirm_email/#{user.id}/#{user.confirmation_token}") + +      user = User.get_cached_by_id(user.id) + +      refute user.confirmation_pending +      refute user.confirmation_token +    end + +    test "it returns 500 if user cannot be found by id", %{conn: conn, user: user} do +      conn = get(conn, "/api/account/confirm_email/0/#{user.confirmation_token}") + +      assert 500 == conn.status +    end + +    test "it returns 500 if token is invalid", %{conn: conn, user: user} do +      conn = get(conn, "/api/account/confirm_email/#{user.id}/wrong_token") + +      assert 500 == conn.status +    end +  end + +  describe "GET /api/oauth_tokens" do +    setup do +      token = insert(:oauth_token) |> Repo.preload(:user) + +      %{token: token} +    end + +    test "renders list", %{token: token} do +      response = +        build_conn() +        |> assign(:user, token.user) +        |> get("/api/oauth_tokens") + +      keys = +        json_response(response, 200) +        |> hd() +        |> Map.keys() + +      assert keys -- ["id", "app_name", "valid_until"] == [] +    end + +    test "revoke token", %{token: token} do +      response = +        build_conn() +        |> assign(:user, token.user) +        |> delete("/api/oauth_tokens/#{token.id}") + +      tokens = Token.get_user_tokens(token.user) + +      assert tokens == [] +      assert response.status == 201 +    end +  end +end diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index 85a9be3e0..7650238f2 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -117,15 +117,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "register with one time token" do -    setup do -      setting = Pleroma.Config.get([:instance, :registrations_open]) - -      if setting do -        Pleroma.Config.put([:instance, :registrations_open], false) -        on_exit(fn -> Pleroma.Config.put([:instance, :registrations_open], setting) end) -      end - -      :ok +    clear_config([:instance, :registrations_open]) do +      Pleroma.Config.put([:instance, :registrations_open], false)      end      test "returns user on success" do @@ -191,14 +184,11 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "registers with date limited token" do -    setup do -      setting = Pleroma.Config.get([:instance, :registrations_open]) - -      if setting do -        Pleroma.Config.put([:instance, :registrations_open], false) -        on_exit(fn -> Pleroma.Config.put([:instance, :registrations_open], setting) end) -      end +    clear_config([:instance, :registrations_open]) do +      Pleroma.Config.put([:instance, :registrations_open], false) +    end +    setup do        data = %{          "nickname" => "vinny",          "email" => "pasta@pizza.vs", @@ -256,15 +246,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "registers with reusable token" do -    setup do -      setting = Pleroma.Config.get([:instance, :registrations_open]) - -      if setting do -        Pleroma.Config.put([:instance, :registrations_open], false) -        on_exit(fn -> Pleroma.Config.put([:instance, :registrations_open], setting) end) -      end - -      :ok +    clear_config([:instance, :registrations_open]) do +      Pleroma.Config.put([:instance, :registrations_open], false)      end      test "returns user on success, after him registration fails" do @@ -309,15 +292,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "registers with reusable date limited token" do -    setup do -      setting = Pleroma.Config.get([:instance, :registrations_open]) - -      if setting do -        Pleroma.Config.put([:instance, :registrations_open], false) -        on_exit(fn -> Pleroma.Config.put([:instance, :registrations_open], setting) end) -      end - -      :ok +    clear_config([:instance, :registrations_open]) do +      Pleroma.Config.put([:instance, :registrations_open], false)      end      test "returns user on success" do diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 5d60c0d51..56633ffce 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -19,7 +19,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    clear_config([:instance])    clear_config([:frontend_configurations, :pleroma_fe]) -  clear_config([:user, :deny_follow_blocked])    describe "POST /api/pleroma/follow_import" do      setup do: oauth_access(["follow"]) | 
