diff options
Diffstat (limited to 'test/web')
114 files changed, 3034 insertions, 1377 deletions
diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index ba2ce1dd9..fbacb3993 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-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.ActivityPubControllerTest do @@ -8,6 +8,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do    import Pleroma.Factory    alias Pleroma.Activity +  alias Pleroma.Config    alias Pleroma.Delivery    alias Pleroma.Instances    alias Pleroma.Object @@ -25,12 +26,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      :ok    end -  clear_config_all([:instance, :federating], -    do: Pleroma.Config.put([:instance, :federating], true) -  ) +  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 = @@ -42,12 +41,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      end      test "with the relay disabled, it returns 404", %{conn: conn} do -      Pleroma.Config.put([:instance, :allow_relay], false) +      Config.put([:instance, :allow_relay], false)        conn        |> get(activity_pub_path(conn, :relay))        |> json_response(404) -      |> assert +    end + +    test "on non-federating instance, it returns 404", %{conn: conn} do +      Config.put([:instance, :federating], false) +      user = insert(:user) + +      conn +      |> assign(:user, user) +      |> get(activity_pub_path(conn, :relay)) +      |> json_response(404)      end    end @@ -60,6 +68,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert res["id"] =~ "/fetch"      end + +    test "on non-federating instance, it returns 404", %{conn: conn} do +      Config.put([:instance, :federating], false) +      user = insert(:user) + +      conn +      |> assign(:user, user) +      |> get(activity_pub_path(conn, :internal_fetch)) +      |> json_response(404) +    end    end    describe "/users/:nickname" do @@ -123,9 +141,34 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert json_response(conn, 404)      end + +    test "it returns error when user is not found", %{conn: conn} do +      response = +        conn +        |> put_req_header("accept", "application/json") +        |> get("/users/jimm") +        |> json_response(404) + +      assert response == "Not found" +    end + +    test "it requires authentication if instance is NOT federating", %{ +      conn: conn +    } do +      user = insert(:user) + +      conn = +        put_req_header( +          conn, +          "accept", +          "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"" +        ) + +      ensure_federating_or_authenticated(conn, "/users/#{user.nickname}.json", user) +    end    end -  describe "/object/:uuid" do +  describe "/objects/:uuid" do      test "it returns a json representation of the object with accept application/json", %{        conn: conn      } do @@ -236,6 +279,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert "Not found" == json_response(conn2, :not_found)      end + +    test "it requires authentication if instance is NOT federating", %{ +      conn: conn +    } do +      user = insert(:user) +      note = insert(:note) +      uuid = String.split(note.data["id"], "/") |> List.last() + +      conn = put_req_header(conn, "accept", "application/activity+json") + +      ensure_federating_or_authenticated(conn, "/objects/#{uuid}", user) +    end    end    describe "/activities/:uuid" do @@ -307,6 +362,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert "Not found" == json_response(conn2, :not_found)      end + +    test "it requires authentication if instance is NOT federating", %{ +      conn: conn +    } do +      user = insert(:user) +      activity = insert(:note_activity) +      uuid = String.split(activity.data["id"], "/") |> List.last() + +      conn = put_req_header(conn, "accept", "application/activity+json") + +      ensure_federating_or_authenticated(conn, "/activities/#{uuid}", user) +    end    end    describe "/inbox" do @@ -341,6 +408,72 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert "ok" == json_response(conn, 200)        assert Instances.reachable?(sender_url)      end + +    test "accept follow activity", %{conn: conn} do +      Pleroma.Config.put([:instance, :federating], true) +      relay = Relay.get_actor() + +      assert {:ok, %Activity{} = activity} = Relay.follow("https://relay.mastodon.host/actor") + +      followed_relay = Pleroma.User.get_by_ap_id("https://relay.mastodon.host/actor") +      relay = refresh_record(relay) + +      accept = +        File.read!("test/fixtures/relay/accept-follow.json") +        |> String.replace("{{ap_id}}", relay.ap_id) +        |> String.replace("{{activity_id}}", activity.data["id"]) + +      assert "ok" == +               conn +               |> assign(:valid_signature, true) +               |> put_req_header("content-type", "application/activity+json") +               |> post("/inbox", accept) +               |> json_response(200) + +      ObanHelpers.perform(all_enqueued(worker: ReceiverWorker)) + +      assert Pleroma.FollowingRelationship.following?( +               relay, +               followed_relay +             ) + +      Mix.shell(Mix.Shell.Process) + +      on_exit(fn -> +        Mix.shell(Mix.Shell.IO) +      end) + +      :ok = Mix.Tasks.Pleroma.Relay.run(["list"]) +      assert_receive {:mix_shell, :info, ["relay.mastodon.host"]} +    end + +    test "without valid signature, " <> +           "it only accepts Create activities and requires enabled federation", +         %{conn: conn} do +      data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!() +      non_create_data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!() + +      conn = put_req_header(conn, "content-type", "application/activity+json") + +      Config.put([:instance, :federating], false) + +      conn +      |> post("/inbox", data) +      |> json_response(403) + +      conn +      |> post("/inbox", non_create_data) +      |> json_response(403) + +      Config.put([:instance, :federating], true) + +      ret_conn = post(conn, "/inbox", data) +      assert "ok" == json_response(ret_conn, 200) + +      conn +      |> post("/inbox", non_create_data) +      |> json_response(400) +    end    end    describe "/users/:nickname/inbox" do @@ -479,22 +612,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      test "it rejects reads from other users", %{conn: conn} do        user = insert(:user) -      otheruser = insert(:user) - -      conn = -        conn -        |> assign(:user, otheruser) -        |> put_req_header("accept", "application/activity+json") -        |> get("/users/#{user.nickname}/inbox") - -      assert json_response(conn, 403) -    end - -    test "it doesn't crash without an authenticated user", %{conn: conn} do -      user = insert(:user) +      other_user = insert(:user)        conn =          conn +        |> assign(:user, other_user)          |> put_req_header("accept", "application/activity+json")          |> get("/users/#{user.nickname}/inbox") @@ -575,14 +697,30 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        refute recipient.follower_address in activity.data["cc"]        refute recipient.follower_address in activity.data["to"]      end + +    test "it requires authentication", %{conn: conn} do +      user = insert(:user) +      conn = put_req_header(conn, "accept", "application/activity+json") + +      ret_conn = get(conn, "/users/#{user.nickname}/inbox") +      assert json_response(ret_conn, 403) + +      ret_conn = +        conn +        |> assign(:user, user) +        |> get("/users/#{user.nickname}/inbox") + +      assert json_response(ret_conn, 200) +    end    end -  describe "/users/:nickname/outbox" do -    test "it will not bomb when there is no activity", %{conn: conn} do +  describe "GET /users/:nickname/outbox" do +    test "it returns 200 even if there're no activities", %{conn: conn} do        user = insert(:user)        conn =          conn +        |> assign(:user, user)          |> put_req_header("accept", "application/activity+json")          |> get("/users/#{user.nickname}/outbox") @@ -597,6 +735,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        conn =          conn +        |> assign(:user, user)          |> put_req_header("accept", "application/activity+json")          |> get("/users/#{user.nickname}/outbox?page=true") @@ -609,24 +748,38 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        conn =          conn +        |> assign(:user, user)          |> put_req_header("accept", "application/activity+json")          |> get("/users/#{user.nickname}/outbox?page=true")        assert response(conn, 200) =~ announce_activity.data["object"]      end -    test "it rejects posts from other users", %{conn: conn} do +    test "it requires authentication if instance is NOT federating", %{ +      conn: conn +    } do +      user = insert(:user) +      conn = put_req_header(conn, "accept", "application/activity+json") + +      ensure_federating_or_authenticated(conn, "/users/#{user.nickname}/outbox", user) +    end +  end + +  describe "POST /users/:nickname/outbox" do +    test "it rejects posts from other users / unauuthenticated users", %{conn: conn} do        data = File.read!("test/fixtures/activitypub-client-post-activity.json") |> Poison.decode!()        user = insert(:user) -      otheruser = insert(:user) +      other_user = insert(:user) +      conn = put_req_header(conn, "content-type", "application/activity+json") -      conn = -        conn -        |> assign(:user, otheruser) -        |> put_req_header("content-type", "application/activity+json") -        |> post("/users/#{user.nickname}/outbox", data) +      conn +      |> post("/users/#{user.nickname}/outbox", data) +      |> json_response(403) -      assert json_response(conn, 403) +      conn +      |> assign(:user, other_user) +      |> post("/users/#{user.nickname}/outbox", data) +      |> json_response(403)      end      test "it inserts an incoming create activity into the database", %{conn: conn} do @@ -741,24 +894,42 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        result =          conn -        |> assign(:relay, true)          |> get("/relay/followers")          |> json_response(200)        assert result["first"]["orderedItems"] == [user.ap_id]      end + +    test "on non-federating instance, it returns 404", %{conn: conn} do +      Config.put([:instance, :federating], false) +      user = insert(:user) + +      conn +      |> assign(:user, user) +      |> get("/relay/followers") +      |> json_response(404) +    end    end    describe "/relay/following" do      test "it returns relay following", %{conn: conn} do        result =          conn -        |> assign(:relay, true)          |> get("/relay/following")          |> json_response(200)        assert result["first"]["orderedItems"] == []      end + +    test "on non-federating instance, it returns 404", %{conn: conn} do +      Config.put([:instance, :federating], false) +      user = insert(:user) + +      conn +      |> assign(:user, user) +      |> get("/relay/following") +      |> json_response(404) +    end    end    describe "/users/:nickname/followers" do @@ -769,32 +940,36 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        result =          conn +        |> assign(:user, user_two)          |> get("/users/#{user_two.nickname}/followers")          |> json_response(200)        assert result["first"]["orderedItems"] == [user.ap_id]      end -    test "it returns returns a uri if the user has 'hide_followers' set", %{conn: conn} do +    test "it returns a uri if the user has 'hide_followers' set", %{conn: conn} do        user = insert(:user)        user_two = insert(:user, hide_followers: true)        User.follow(user, user_two)        result =          conn +        |> assign(:user, user)          |> get("/users/#{user_two.nickname}/followers")          |> json_response(200)        assert is_binary(result["first"])      end -    test "it returns a 403 error on pages, if the user has 'hide_followers' set and the request is not authenticated", +    test "it returns a 403 error on pages, if the user has 'hide_followers' set and the request is from another user",           %{conn: conn} do -      user = insert(:user, hide_followers: true) +      user = insert(:user) +      other_user = insert(:user, hide_followers: true)        result =          conn -        |> get("/users/#{user.nickname}/followers?page=1") +        |> assign(:user, user) +        |> get("/users/#{other_user.nickname}/followers?page=1")        assert result.status == 403        assert result.resp_body == "" @@ -826,6 +1001,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        result =          conn +        |> assign(:user, user)          |> get("/users/#{user.nickname}/followers")          |> json_response(200) @@ -835,12 +1011,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        result =          conn +        |> assign(:user, user)          |> get("/users/#{user.nickname}/followers?page=2")          |> json_response(200)        assert length(result["orderedItems"]) == 5        assert result["totalItems"] == 15      end + +    test "returns 403 if requester is not logged in", %{conn: conn} do +      user = insert(:user) + +      conn +      |> get("/users/#{user.nickname}/followers") +      |> json_response(403) +    end    end    describe "/users/:nickname/following" do @@ -851,6 +1036,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        result =          conn +        |> assign(:user, user)          |> get("/users/#{user.nickname}/following")          |> json_response(200) @@ -858,25 +1044,28 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      end      test "it returns a uri if the user has 'hide_follows' set", %{conn: conn} do -      user = insert(:user, hide_follows: true) -      user_two = insert(:user) +      user = insert(:user) +      user_two = insert(:user, hide_follows: true)        User.follow(user, user_two)        result =          conn -        |> get("/users/#{user.nickname}/following") +        |> assign(:user, user) +        |> get("/users/#{user_two.nickname}/following")          |> json_response(200)        assert is_binary(result["first"])      end -    test "it returns a 403 error on pages, if the user has 'hide_follows' set and the request is not authenticated", +    test "it returns a 403 error on pages, if the user has 'hide_follows' set and the request is from another user",           %{conn: conn} do -      user = insert(:user, hide_follows: true) +      user = insert(:user) +      user_two = insert(:user, hide_follows: true)        result =          conn -        |> get("/users/#{user.nickname}/following?page=1") +        |> assign(:user, user) +        |> get("/users/#{user_two.nickname}/following?page=1")        assert result.status == 403        assert result.resp_body == "" @@ -909,6 +1098,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        result =          conn +        |> assign(:user, user)          |> get("/users/#{user.nickname}/following")          |> json_response(200) @@ -918,12 +1108,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        result =          conn +        |> assign(:user, user)          |> get("/users/#{user.nickname}/following?page=2")          |> json_response(200)        assert length(result["orderedItems"]) == 5        assert result["totalItems"] == 15      end + +    test "returns 403 if requester is not logged in", %{conn: conn} do +      user = insert(:user) + +      conn +      |> get("/users/#{user.nickname}/following") +      |> json_response(403) +    end    end    describe "delivery tracking" do @@ -1008,8 +1207,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      end    end -  describe "Additionnal ActivityPub C2S endpoints" do -    test "/api/ap/whoami", %{conn: conn} do +  describe "Additional ActivityPub C2S endpoints" do +    test "GET /api/ap/whoami", %{conn: conn} do        user = insert(:user)        conn = @@ -1020,12 +1219,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        user = User.get_cached_by_id(user.id)        assert UserView.render("user.json", %{user: user}) == json_response(conn, 200) + +      conn +      |> get("/api/ap/whoami") +      |> 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 "uploadMedia", %{conn: conn} do +    test "POST /api/ap/upload_media", %{conn: conn} do        user = insert(:user)        desc = "Description of the image" @@ -1036,15 +1239,59 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do          filename: "an_image.jpg"        } -      conn = +      object =          conn          |> assign(:user, user)          |> post("/api/ap/upload_media", %{"file" => image, "description" => desc}) +        |> json_response(:created) -      assert object = json_response(conn, :created)        assert object["name"] == desc        assert object["type"] == "Document"        assert object["actor"] == user.ap_id +      assert [%{"href" => object_href, "mediaType" => object_mediatype}] = object["url"] +      assert is_binary(object_href) +      assert object_mediatype == "image/jpeg" + +      activity_request = %{ +        "@context" => "https://www.w3.org/ns/activitystreams", +        "type" => "Create", +        "object" => %{ +          "type" => "Note", +          "content" => "AP C2S test, attachment", +          "attachment" => [object] +        }, +        "to" => "https://www.w3.org/ns/activitystreams#Public", +        "cc" => [] +      } + +      activity_response = +        conn +        |> assign(:user, user) +        |> post("/users/#{user.nickname}/outbox", activity_request) +        |> json_response(:created) + +      assert activity_response["id"] +      assert activity_response["object"] +      assert activity_response["actor"] == user.ap_id + +      assert %Object{data: %{"attachment" => [attachment]}} = +               Object.normalize(activity_response["object"]) + +      assert attachment["type"] == "Document" +      assert attachment["name"] == desc + +      assert [ +               %{ +                 "href" => ^object_href, +                 "type" => "Link", +                 "mediaType" => ^object_mediatype +               } +             ] = attachment["url"] + +      # Fails if unauthenticated +      conn +      |> post("/api/ap/upload_media", %{"file" => image, "description" => desc}) +      |> json_response(403)      end    end  end diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 3dd3dd04d..6410df49b 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 @@ -180,7 +180,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        {:ok, user} = ActivityPub.make_user_from_ap_id(user_id)        assert user.ap_id == user_id        assert user.nickname == "admin@mastodon.example.org" -      assert user.source_data        assert user.ap_enabled        assert user.follower_address == "http://mastodon.example.org/users/admin/followers"      end @@ -1396,7 +1395,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 +1424,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 +1585,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) @@ -1894,14 +1899,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        {:ok, a4} = CommonAPI.post(user2, %{"status" => "Agent Smith "})        {:ok, a5} = CommonAPI.post(user1, %{"status" => "Red or Blue "}) -      {:ok, _, _} = CommonAPI.favorite(a4.id, user) -      {:ok, _, _} = CommonAPI.favorite(a3.id, other_user) -      {:ok, _, _} = CommonAPI.favorite(a3.id, user) -      {:ok, _, _} = CommonAPI.favorite(a5.id, other_user) -      {:ok, _, _} = CommonAPI.favorite(a5.id, user) -      {:ok, _, _} = CommonAPI.favorite(a4.id, other_user) -      {:ok, _, _} = CommonAPI.favorite(a1.id, user) -      {:ok, _, _} = CommonAPI.favorite(a1.id, other_user) +      {:ok, _} = CommonAPI.favorite(user, a4.id) +      {:ok, _} = CommonAPI.favorite(other_user, a3.id) +      {:ok, _} = CommonAPI.favorite(user, a3.id) +      {:ok, _} = CommonAPI.favorite(other_user, a5.id) +      {:ok, _} = CommonAPI.favorite(user, a5.id) +      {:ok, _} = CommonAPI.favorite(other_user, a4.id) +      {:ok, _} = CommonAPI.favorite(user, a1.id) +      {:ok, _} = CommonAPI.favorite(other_user, a1.id)        result = ActivityPub.fetch_favourites(user)        assert Enum.map(result, & &1.id) == [a1.id, a5.id, a3.id, a4.id] @@ -1955,11 +1960,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        activity = %Activity{activity | object: nil} -      assert [%Notification{activity: ^activity}] = -               Notification.for_user(follower, %{with_move: true}) +      assert [%Notification{activity: ^activity}] = Notification.for_user(follower) -      assert [%Notification{activity: ^activity}] = -               Notification.for_user(follower_move_opted_out, %{with_move: true}) +      assert [%Notification{activity: ^activity}] = Notification.for_user(follower_move_opted_out)      end      test "old user must be in the new user's `also_known_as` list" do 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/mediaproxy_warming_policy_test.exs b/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs index 95a809d25..313d59a66 100644 --- a/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs +++ b/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-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.MediaProxyWarmingPolicyTest do 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..b0fb753bd 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,38 +9,49 @@ 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)      :ok    end +  defp get_old_message do +    File.read!("test/fixtures/mastodon-post-activity.json") +    |> Poison.decode!() +  end + +  defp get_new_message do +    old_message = get_old_message() + +    new_object = +      old_message +      |> Map.get("object") +      |> Map.put("published", DateTime.utc_now() |> DateTime.to_iso8601()) + +    old_message +    |> Map.put("object", new_object) +  end +    describe "with reject action" do      test "it rejects an old post" do        Config.put([:mrf_object_age, :actions], [:reject]) -      data = -        File.read!("test/fixtures/mastodon-post-activity.json") -        |> Poison.decode!() +      data = get_old_message() -      {:reject, _} = ObjectAgePolicy.filter(data) +      assert match?({:reject, _}, ObjectAgePolicy.filter(data))      end      test "it allows a new post" do        Config.put([:mrf_object_age, :actions], [:reject]) -      data = -        File.read!("test/fixtures/mastodon-post-activity.json") -        |> Poison.decode!() -        |> Map.put("published", DateTime.utc_now() |> DateTime.to_iso8601()) +      data = get_new_message() -      {:ok, _} = ObjectAgePolicy.filter(data) +      assert match?({:ok, _}, ObjectAgePolicy.filter(data))      end    end @@ -48,9 +59,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do      test "it delists an old post" do        Config.put([:mrf_object_age, :actions], [:delist]) -      data = -        File.read!("test/fixtures/mastodon-post-activity.json") -        |> Poison.decode!() +      data = get_old_message()        {:ok, _u} = User.get_or_fetch_by_ap_id(data["actor"]) @@ -62,14 +71,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do      test "it allows a new post" do        Config.put([:mrf_object_age, :actions], [:delist]) -      data = -        File.read!("test/fixtures/mastodon-post-activity.json") -        |> Poison.decode!() -        |> Map.put("published", DateTime.utc_now() |> DateTime.to_iso8601()) +      data = get_new_message()        {:ok, _user} = User.get_or_fetch_by_ap_id(data["actor"]) -      {:ok, ^data} = ObjectAgePolicy.filter(data) +      assert match?({:ok, ^data}, ObjectAgePolicy.filter(data))      end    end @@ -77,9 +83,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do      test "it strips followers collections from an old post" do        Config.put([:mrf_object_age, :actions], [:strip_followers]) -      data = -        File.read!("test/fixtures/mastodon-post-activity.json") -        |> Poison.decode!() +      data = get_old_message()        {:ok, user} = User.get_or_fetch_by_ap_id(data["actor"]) @@ -92,14 +96,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do      test "it allows a new post" do        Config.put([:mrf_object_age, :actions], [:strip_followers]) -      data = -        File.read!("test/fixtures/mastodon-post-activity.json") -        |> Poison.decode!() -        |> Map.put("published", DateTime.utc_now() |> DateTime.to_iso8601()) +      data = get_new_message()        {:ok, _u} = User.get_or_fetch_by_ap_id(data["actor"]) -      {:ok, ^data} = ObjectAgePolicy.filter(data) +      assert match?({:ok, ^data}, ObjectAgePolicy.filter(data))      end    end  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..b7b9bc6a2 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,18 @@ 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: [], +            reject_deletes: [] +          )    describe "when :media_removal" do      test "is empty" do @@ -383,6 +383,66 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end    end +  describe "when :reject_deletes is empty" do +    setup do: Config.put([:mrf_simple, :reject_deletes], []) + +    test "it accepts deletions even from rejected servers" do +      Config.put([:mrf_simple, :reject], ["remote.instance"]) + +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} +    end + +    test "it accepts deletions even from non-whitelisted servers" do +      Config.put([:mrf_simple, :accept], ["non.matching.remote"]) + +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} +    end +  end + +  describe "when :reject_deletes is not empty but it doesn't have a matching host" do +    setup do: Config.put([:mrf_simple, :reject_deletes], ["non.matching.remote"]) + +    test "it accepts deletions even from rejected servers" do +      Config.put([:mrf_simple, :reject], ["remote.instance"]) + +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} +    end + +    test "it accepts deletions even from non-whitelisted servers" do +      Config.put([:mrf_simple, :accept], ["non.matching.remote"]) + +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:ok, deletion_message} +    end +  end + +  describe "when :reject_deletes has a matching host" do +    setup do: Config.put([:mrf_simple, :reject_deletes], ["remote.instance"]) + +    test "it rejects the deletion" do +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:reject, nil} +    end +  end + +  describe "when :reject_deletes match with wildcard domain" do +    setup do: Config.put([:mrf_simple, :reject_deletes], ["*.remote.instance"]) + +    test "it rejects the deletion" do +      deletion_message = build_remote_deletion_message() + +      assert SimplePolicy.filter(deletion_message) == {:reject, nil} +    end +  end +    defp build_local_message do      %{        "actor" => "#{Pleroma.Web.base_url()}/users/alice", @@ -409,4 +469,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do        "type" => "Person"      }    end + +  defp build_remote_deletion_message do +    %{ +      "type" => "Delete", +      "actor" => "https://remote.instance/users/bob" +    } +  end  end 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/tag_policy_test.exs b/test/web/activity_pub/mrf/tag_policy_test.exs index 4aa35311e..e7793641a 100644 --- a/test/web/activity_pub/mrf/tag_policy_test.exs +++ b/test/web/activity_pub/mrf/tag_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-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.TagPolicyTest do 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 72084c0fd..724bae058 100644 --- a/test/web/activity_pub/mrf/user_allowlist_policy_test.exs +++ b/test/web/activity_pub/mrf/user_allowlist_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-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.UserAllowListPolicyTest do    use Pleroma.DataCase @@ -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 38309f9f1..69f22bb77 100644 --- a/test/web/activity_pub/mrf/vocabulary_policy_test.exs +++ b/test/web/activity_pub/mrf/vocabulary_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-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.VocabularyPolicyTest do @@ -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/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs new file mode 100644 index 000000000..3c5c3696e --- /dev/null +++ b/test/web/activity_pub/object_validator_test.exs @@ -0,0 +1,83 @@ +defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do +  use Pleroma.DataCase + +  alias Pleroma.Web.ActivityPub.ObjectValidator +  alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator +  alias Pleroma.Web.ActivityPub.Utils +  alias Pleroma.Web.CommonAPI + +  import Pleroma.Factory + +  describe "likes" do +    setup do +      user = insert(:user) +      {:ok, post_activity} = CommonAPI.post(user, %{"status" => "uguu"}) + +      valid_like = %{ +        "to" => [user.ap_id], +        "cc" => [], +        "type" => "Like", +        "id" => Utils.generate_activity_id(), +        "object" => post_activity.data["object"], +        "actor" => user.ap_id, +        "context" => "a context" +      } + +      %{valid_like: valid_like, user: user, post_activity: post_activity} +    end + +    test "returns ok when called in the ObjectValidator", %{valid_like: valid_like} do +      {:ok, object, _meta} = ObjectValidator.validate(valid_like, []) + +      assert "id" in Map.keys(object) +    end + +    test "is valid for a valid object", %{valid_like: valid_like} do +      assert LikeValidator.cast_and_validate(valid_like).valid? +    end + +    test "it errors when the actor is missing or not known", %{valid_like: valid_like} do +      without_actor = Map.delete(valid_like, "actor") + +      refute LikeValidator.cast_and_validate(without_actor).valid? + +      with_invalid_actor = Map.put(valid_like, "actor", "invalidactor") + +      refute LikeValidator.cast_and_validate(with_invalid_actor).valid? +    end + +    test "it errors when the object is missing or not known", %{valid_like: valid_like} do +      without_object = Map.delete(valid_like, "object") + +      refute LikeValidator.cast_and_validate(without_object).valid? + +      with_invalid_object = Map.put(valid_like, "object", "invalidobject") + +      refute LikeValidator.cast_and_validate(with_invalid_object).valid? +    end + +    test "it errors when the actor has already like the object", %{ +      valid_like: valid_like, +      user: user, +      post_activity: post_activity +    } do +      _like = CommonAPI.favorite(user, post_activity.id) + +      refute LikeValidator.cast_and_validate(valid_like).valid? +    end + +    test "it works when actor or object are wrapped in maps", %{valid_like: valid_like} do +      wrapped_like = +        valid_like +        |> Map.put("actor", %{"id" => valid_like["actor"]}) +        |> Map.put("object", %{"id" => valid_like["object"]}) + +      validated = LikeValidator.cast_and_validate(wrapped_like) + +      assert validated.valid? + +      assert {:actor, valid_like["actor"]} in validated.changes +      assert {:object, valid_like["object"]} in validated.changes +    end +  end +end diff --git a/test/web/activity_pub/object_validators/note_validator_test.exs b/test/web/activity_pub/object_validators/note_validator_test.exs new file mode 100644 index 000000000..30c481ffb --- /dev/null +++ b/test/web/activity_pub/object_validators/note_validator_test.exs @@ -0,0 +1,35 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidatorTest do +  use Pleroma.DataCase + +  alias Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator +  alias Pleroma.Web.ActivityPub.Utils + +  import Pleroma.Factory + +  describe "Notes" do +    setup do +      user = insert(:user) + +      note = %{ +        "id" => Utils.generate_activity_id(), +        "type" => "Note", +        "actor" => user.ap_id, +        "to" => [user.follower_address], +        "cc" => [], +        "content" => "Hellow this is content.", +        "context" => "xxx", +        "summary" => "a post" +      } + +      %{user: user, note: note} +    end + +    test "a basic note validates", %{note: note} do +      %{valid?: true} = NoteValidator.cast_and_validate(note) +    end +  end +end diff --git a/test/web/activity_pub/object_validators/types/date_time_test.exs b/test/web/activity_pub/object_validators/types/date_time_test.exs new file mode 100644 index 000000000..3e17a9497 --- /dev/null +++ b/test/web/activity_pub/object_validators/types/date_time_test.exs @@ -0,0 +1,32 @@ +defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTimeTest do +  alias Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTime +  use Pleroma.DataCase + +  test "it validates an xsd:Datetime" do +    valid_strings = [ +      "2004-04-12T13:20:00", +      "2004-04-12T13:20:15.5", +      "2004-04-12T13:20:00-05:00", +      "2004-04-12T13:20:00Z" +    ] + +    invalid_strings = [ +      "2004-04-12T13:00", +      "2004-04-1213:20:00", +      "99-04-12T13:00", +      "2004-04-12" +    ] + +    assert {:ok, "2004-04-01T12:00:00Z"} == DateTime.cast("2004-04-01T12:00:00Z") + +    Enum.each(valid_strings, fn date_time -> +      result = DateTime.cast(date_time) +      assert {:ok, _} = result +    end) + +    Enum.each(invalid_strings, fn date_time -> +      result = DateTime.cast(date_time) +      assert :error == result +    end) +  end +end diff --git a/test/web/activity_pub/object_validators/types/object_id_test.exs b/test/web/activity_pub/object_validators/types/object_id_test.exs new file mode 100644 index 000000000..834213182 --- /dev/null +++ b/test/web/activity_pub/object_validators/types/object_id_test.exs @@ -0,0 +1,37 @@ +defmodule Pleroma.Web.ObjectValidators.Types.ObjectIDTest do +  alias Pleroma.Web.ActivityPub.ObjectValidators.Types.ObjectID +  use Pleroma.DataCase + +  @uris [ +    "http://lain.com/users/lain", +    "http://lain.com", +    "https://lain.com/object/1" +  ] + +  @non_uris [ +    "https://", +    "rin", +    1, +    :x, +    %{"1" => 2} +  ] + +  test "it accepts http uris" do +    Enum.each(@uris, fn uri -> +      assert {:ok, uri} == ObjectID.cast(uri) +    end) +  end + +  test "it accepts an object with a nested uri id" do +    Enum.each(@uris, fn uri -> +      assert {:ok, uri} == ObjectID.cast(%{"id" => uri}) +    end) +  end + +  test "it rejects non-uri strings" do +    Enum.each(@non_uris, fn non_uri -> +      assert :error == ObjectID.cast(non_uri) +      assert :error == ObjectID.cast(%{"id" => non_uri}) +    end) +  end +end diff --git a/test/web/activity_pub/pipeline_test.exs b/test/web/activity_pub/pipeline_test.exs new file mode 100644 index 000000000..f3c437498 --- /dev/null +++ b/test/web/activity_pub/pipeline_test.exs @@ -0,0 +1,87 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.PipelineTest do +  use Pleroma.DataCase + +  import Mock +  import Pleroma.Factory + +  describe "common_pipeline/2" do +    test "it goes through validation, filtering, persisting, side effects and federation for local activities" do +      activity = insert(:note_activity) +      meta = [local: true] + +      with_mocks([ +        {Pleroma.Web.ActivityPub.ObjectValidator, [], [validate: fn o, m -> {:ok, o, m} end]}, +        { +          Pleroma.Web.ActivityPub.MRF, +          [], +          [filter: fn o -> {:ok, o} end] +        }, +        { +          Pleroma.Web.ActivityPub.ActivityPub, +          [], +          [persist: fn o, m -> {:ok, o, m} end] +        }, +        { +          Pleroma.Web.ActivityPub.SideEffects, +          [], +          [handle: fn o, m -> {:ok, o, m} end] +        }, +        { +          Pleroma.Web.Federator, +          [], +          [publish: fn _o -> :ok end] +        } +      ]) do +        assert {:ok, ^activity, ^meta} = +                 Pleroma.Web.ActivityPub.Pipeline.common_pipeline(activity, meta) + +        assert_called(Pleroma.Web.ActivityPub.ObjectValidator.validate(activity, meta)) +        assert_called(Pleroma.Web.ActivityPub.MRF.filter(activity)) +        assert_called(Pleroma.Web.ActivityPub.ActivityPub.persist(activity, meta)) +        assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta)) +        assert_called(Pleroma.Web.Federator.publish(activity)) +      end +    end + +    test "it goes through validation, filtering, persisting, side effects without federation for remote activities" do +      activity = insert(:note_activity) +      meta = [local: false] + +      with_mocks([ +        {Pleroma.Web.ActivityPub.ObjectValidator, [], [validate: fn o, m -> {:ok, o, m} end]}, +        { +          Pleroma.Web.ActivityPub.MRF, +          [], +          [filter: fn o -> {:ok, o} end] +        }, +        { +          Pleroma.Web.ActivityPub.ActivityPub, +          [], +          [persist: fn o, m -> {:ok, o, m} end] +        }, +        { +          Pleroma.Web.ActivityPub.SideEffects, +          [], +          [handle: fn o, m -> {:ok, o, m} end] +        }, +        { +          Pleroma.Web.Federator, +          [], +          [] +        } +      ]) do +        assert {:ok, ^activity, ^meta} = +                 Pleroma.Web.ActivityPub.Pipeline.common_pipeline(activity, meta) + +        assert_called(Pleroma.Web.ActivityPub.ObjectValidator.validate(activity, meta)) +        assert_called(Pleroma.Web.ActivityPub.MRF.filter(activity)) +        assert_called(Pleroma.Web.ActivityPub.ActivityPub.persist(activity, meta)) +        assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta)) +      end +    end +  end +end diff --git a/test/web/activity_pub/publisher_test.exs b/test/web/activity_pub/publisher_test.exs index 3404848d4..c2bc38d52 100644 --- a/test/web/activity_pub/publisher_test.exs +++ b/test/web/activity_pub/publisher_test.exs @@ -23,6 +23,8 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      :ok    end +  setup_all do: clear_config([:instance, :federating], true) +    describe "gather_webfinger_links/1" do      test "it returns links" do        user = insert(:user) @@ -46,10 +48,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do    describe "determine_inbox/2" do      test "it returns sharedInbox for messages involving as:Public in to" do -      user = -        insert(:user, %{ -          source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} -        }) +      user = insert(:user, %{shared_inbox: "http://example.com/inbox"})        activity = %Activity{          data: %{"to" => [@as_public], "cc" => [user.follower_address]} @@ -59,10 +58,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      end      test "it returns sharedInbox for messages involving as:Public in cc" do -      user = -        insert(:user, %{ -          source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} -        }) +      user = insert(:user, %{shared_inbox: "http://example.com/inbox"})        activity = %Activity{          data: %{"cc" => [@as_public], "to" => [user.follower_address]} @@ -72,11 +68,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      end      test "it returns sharedInbox for messages involving multiple recipients in to" do -      user = -        insert(:user, %{ -          source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} -        }) - +      user = insert(:user, %{shared_inbox: "http://example.com/inbox"})        user_two = insert(:user)        user_three = insert(:user) @@ -88,11 +80,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      end      test "it returns sharedInbox for messages involving multiple recipients in cc" do -      user = -        insert(:user, %{ -          source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} -        }) - +      user = insert(:user, %{shared_inbox: "http://example.com/inbox"})        user_two = insert(:user)        user_three = insert(:user) @@ -105,12 +93,10 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      test "it returns sharedInbox for messages involving multiple recipients in total" do        user = -        insert(:user, -          source_data: %{ -            "inbox" => "http://example.com/personal-inbox", -            "endpoints" => %{"sharedInbox" => "http://example.com/inbox"} -          } -        ) +        insert(:user, %{ +          shared_inbox: "http://example.com/inbox", +          inbox: "http://example.com/personal-inbox" +        })        user_two = insert(:user) @@ -123,12 +109,10 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      test "it returns inbox for messages involving single recipients in total" do        user = -        insert(:user, -          source_data: %{ -            "inbox" => "http://example.com/personal-inbox", -            "endpoints" => %{"sharedInbox" => "http://example.com/inbox"} -          } -        ) +        insert(:user, %{ +          shared_inbox: "http://example.com/inbox", +          inbox: "http://example.com/personal-inbox" +        })        activity = %Activity{          data: %{"to" => [user.ap_id], "cc" => []} @@ -256,11 +240,11 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do                     [:passthrough],                     [] do        follower = -        insert(:user, +        insert(:user, %{            local: false, -          source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"}, +          inbox: "https://domain.com/users/nick1/inbox",            ap_enabled: true -        ) +        })        actor = insert(:user, follower_address: follower.ap_id)        user = insert(:user) @@ -293,14 +277,14 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do        fetcher =          insert(:user,            local: false, -          source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"}, +          inbox: "https://domain.com/users/nick1/inbox",            ap_enabled: true          )        another_fetcher =          insert(:user,            local: false, -          source_data: %{"inbox" => "https://domain2.com/users/nick1/inbox"}, +          inbox: "https://domain2.com/users/nick1/inbox",            ap_enabled: true          ) diff --git a/test/web/activity_pub/relay_test.exs b/test/web/activity_pub/relay_test.exs index 98dc78f46..9e16e39c4 100644 --- a/test/web/activity_pub/relay_test.exs +++ b/test/web/activity_pub/relay_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-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.RelayTest do @@ -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/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs new file mode 100644 index 000000000..0b6b55156 --- /dev/null +++ b/test/web/activity_pub/side_effects_test.exs @@ -0,0 +1,42 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.SideEffectsTest do +  use Pleroma.DataCase + +  alias Pleroma.Notification +  alias Pleroma.Object +  alias Pleroma.Repo +  alias Pleroma.Web.ActivityPub.ActivityPub +  alias Pleroma.Web.ActivityPub.Builder +  alias Pleroma.Web.ActivityPub.SideEffects +  alias Pleroma.Web.CommonAPI + +  import Pleroma.Factory + +  describe "like objects" do +    setup do +      poster = insert(:user) +      user = insert(:user) +      {:ok, post} = CommonAPI.post(poster, %{"status" => "hey"}) + +      {:ok, like_data, _meta} = Builder.like(user, post.object) +      {:ok, like, _meta} = ActivityPub.persist(like_data, local: true) + +      %{like: like, user: user, poster: poster} +    end + +    test "add the like to the original object", %{like: like, user: user} do +      {:ok, like, _} = SideEffects.handle(like) +      object = Object.get_by_ap_id(like.data["object"]) +      assert object.data["like_count"] == 1 +      assert user.ap_id in object.data["likes"] +    end + +    test "creates a notification", %{like: like, poster: poster} do +      {:ok, like, _} = SideEffects.handle(like) +      assert Repo.get_by(Notification, user_id: poster.id, activity_id: like.id) +    end +  end +end 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 efbca82f6..6057e360a 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 @@ -334,7 +334,9 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do          |> Poison.decode!()          |> Map.put("object", activity.data["object"]) -      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) +      {:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data) + +      refute Enum.empty?(activity.recipients)        assert data["actor"] == "http://mastodon.example.org/users/admin"        assert data["type"] == "Like" @@ -744,7 +746,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        user = User.get_cached_by_ap_id(activity.actor) -      assert User.fields(user) == [ +      assert user.fields == [                 %{"name" => "foo", "value" => "bar"},                 %{"name" => "foo1", "value" => "bar1"}               ] @@ -765,7 +767,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        user = User.get_cached_by_ap_id(user.ap_id) -      assert User.fields(user) == [ +      assert user.fields == [                 %{"name" => "foo", "value" => "updated"},                 %{"name" => "foo1", "value" => "updated"}               ] @@ -783,7 +785,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        user = User.get_cached_by_ap_id(user.ap_id) -      assert User.fields(user) == [ +      assert user.fields == [                 %{"name" => "foo", "value" => "updated"},                 %{"name" => "foo1", "value" => "updated"}               ] @@ -794,7 +796,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        user = User.get_cached_by_ap_id(user.ap_id) -      assert User.fields(user) == [] +      assert user.fields == []      end      test "it works for incoming update activities which lock the account" do @@ -1228,19 +1230,13 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        attachment = %{          "type" => "Link",          "mediaType" => "video/mp4", -        "href" => -          "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4", -        "mimeType" => "video/mp4", -        "size" => 5_015_880,          "url" => [            %{              "href" =>                "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4", -            "mediaType" => "video/mp4", -            "type" => "Link" +            "mediaType" => "video/mp4"            } -        ], -        "width" => 480 +        ]        }        assert object.data["url"] == @@ -1351,11 +1347,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 = @@ -1394,11 +1387,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) @@ -1628,7 +1618,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do          })        user_two = insert(:user) -      Pleroma.FollowingRelationship.follow(user_two, user, "accept") +      Pleroma.FollowingRelationship.follow(user_two, user, :follow_accept)        {:ok, activity} = CommonAPI.post(user, %{"status" => "test"})        {:ok, unrelated_activity} = CommonAPI.post(user_two, %{"status" => "test"}) @@ -1882,7 +1872,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")) @@ -2067,11 +2057,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do                   %{                     "mediaType" => "video/mp4",                     "url" => [ -                     %{ -                       "href" => "https://peertube.moe/stat-480.mp4", -                       "mediaType" => "video/mp4", -                       "type" => "Link" -                     } +                     %{"href" => "https://peertube.moe/stat-480.mp4", "mediaType" => "video/mp4"}                     ]                   }                 ] @@ -2089,23 +2075,13 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do                   %{                     "mediaType" => "video/mp4",                     "url" => [ -                     %{ -                       "href" => "https://pe.er/stat-480.mp4", -                       "mediaType" => "video/mp4", -                       "type" => "Link" -                     } +                     %{"href" => "https://pe.er/stat-480.mp4", "mediaType" => "video/mp4"}                     ]                   },                   %{ -                   "href" => "https://pe.er/stat-480.mp4",                     "mediaType" => "video/mp4", -                   "mimeType" => "video/mp4",                     "url" => [ -                     %{ -                       "href" => "https://pe.er/stat-480.mp4", -                       "mediaType" => "video/mp4", -                       "type" => "Link" -                     } +                     %{"href" => "https://pe.er/stat-480.mp4", "mediaType" => "video/mp4"}                     ]                   }                 ] @@ -2145,9 +2121,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")) @@ -2188,4 +2162,18 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do                 Transmogrifier.set_replies(object.data)["replies"]      end    end + +  test "take_emoji_tags/1" do +    user = insert(:user, %{emoji: %{"firefox" => "https://example.org/firefox.png"}}) + +    assert Transmogrifier.take_emoji_tags(user) == [ +             %{ +               "icon" => %{"type" => "Image", "url" => "https://example.org/firefox.png"}, +               "id" => "https://example.org/firefox.png", +               "name" => ":firefox:", +               "type" => "Emoji", +               "updated" => "1970-01-01T00:00:00Z" +             } +           ] +  end  end diff --git a/test/web/activity_pub/utils_test.exs b/test/web/activity_pub/utils_test.exs index e5ab54dd4..e913a5148 100644 --- a/test/web/activity_pub/utils_test.exs +++ b/test/web/activity_pub/utils_test.exs @@ -177,71 +177,6 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do      end    end -  describe "fetch_ordered_collection" do -    import Tesla.Mock - -    test "fetches the first OrderedCollectionPage when an OrderedCollection is encountered" do -      mock(fn -        %{method: :get, url: "http://mastodon.com/outbox"} -> -          json(%{"type" => "OrderedCollection", "first" => "http://mastodon.com/outbox?page=true"}) - -        %{method: :get, url: "http://mastodon.com/outbox?page=true"} -> -          json(%{"type" => "OrderedCollectionPage", "orderedItems" => ["ok"]}) -      end) - -      assert Utils.fetch_ordered_collection("http://mastodon.com/outbox", 1) == ["ok"] -    end - -    test "fetches several pages in the right order one after another, but only the specified amount" do -      mock(fn -        %{method: :get, url: "http://example.com/outbox"} -> -          json(%{ -            "type" => "OrderedCollectionPage", -            "orderedItems" => [0], -            "next" => "http://example.com/outbox?page=1" -          }) - -        %{method: :get, url: "http://example.com/outbox?page=1"} -> -          json(%{ -            "type" => "OrderedCollectionPage", -            "orderedItems" => [1], -            "next" => "http://example.com/outbox?page=2" -          }) - -        %{method: :get, url: "http://example.com/outbox?page=2"} -> -          json(%{"type" => "OrderedCollectionPage", "orderedItems" => [2]}) -      end) - -      assert Utils.fetch_ordered_collection("http://example.com/outbox", 0) == [0] -      assert Utils.fetch_ordered_collection("http://example.com/outbox", 1) == [0, 1] -    end - -    test "returns an error if the url doesn't have an OrderedCollection/Page" do -      mock(fn -        %{method: :get, url: "http://example.com/not-an-outbox"} -> -          json(%{"type" => "NotAnOutbox"}) -      end) - -      assert {:error, _} = Utils.fetch_ordered_collection("http://example.com/not-an-outbox", 1) -    end - -    test "returns the what was collected if there are less pages than specified" do -      mock(fn -        %{method: :get, url: "http://example.com/outbox"} -> -          json(%{ -            "type" => "OrderedCollectionPage", -            "orderedItems" => [0], -            "next" => "http://example.com/outbox?page=1" -          }) - -        %{method: :get, url: "http://example.com/outbox?page=1"} -> -          json(%{"type" => "OrderedCollectionPage", "orderedItems" => [1]}) -      end) - -      assert Utils.fetch_ordered_collection("http://example.com/outbox", 5) == [0, 1] -    end -  end -    test "make_json_ld_header/0" do      assert Utils.make_json_ld_header() == %{               "@context" => [ diff --git a/test/web/activity_pub/views/object_view_test.exs b/test/web/activity_pub/views/object_view_test.exs index 09866e99b..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) @@ -61,7 +59,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectViewTest do      object = Object.normalize(note)      user = insert(:user) -    {:ok, like_activity, _} = CommonAPI.favorite(note.id, user) +    {:ok, like_activity} = CommonAPI.favorite(user, note.id)      result = ObjectView.render("object.json", %{object: like_activity}) diff --git a/test/web/activity_pub/views/user_view_test.exs b/test/web/activity_pub/views/user_view_test.exs index 8374b8d23..8d00893a5 100644 --- a/test/web/activity_pub/views/user_view_test.exs +++ b/test/web/activity_pub/views/user_view_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-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.UserViewTest do @@ -29,7 +29,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do      {:ok, user} =        insert(:user) -      |> User.upgrade_changeset(%{fields: fields}) +      |> User.update_changeset(%{fields: fields})        |> User.update_and_set_cache()      assert %{ @@ -38,7 +38,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do    end    test "Renders with emoji tags" do -    user = insert(:user, emoji: [%{"bib" => "/test"}]) +    user = insert(:user, emoji: %{"bib" => "/test"})      assert %{               "tag" => [ diff --git a/test/web/activity_pub/visibilty_test.exs b/test/web/activity_pub/visibilty_test.exs index 4c2e0d207..5b91630d4 100644 --- a/test/web/activity_pub/visibilty_test.exs +++ b/test/web/activity_pub/visibilty_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-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.VisibilityTest do diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index 45b22ea24..f80dbf8dd 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" @@ -635,11 +625,44 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert json_response(conn, :forbidden)      end + +    test "email with +", %{conn: conn, admin: admin} do +      recipient_email = "foo+bar@baz.com" + +      conn +      |> put_req_header("content-type", "application/json;charset=utf-8") +      |> post("/api/pleroma/admin/users/email_invite", %{email: recipient_email}) +      |> json_response(:no_content) + +      token_record = +        Pleroma.UserInviteToken +        |> Repo.all() +        |> List.last() + +      assert token_record +      refute token_record.used + +      notify_email = Config.get([:instance, :notify_email]) +      instance_name = Config.get([:instance, :name]) + +      email = +        Pleroma.Emails.UserEmail.user_invitation_email( +          admin, +          token_record, +          recipient_email +        ) + +      Swoosh.TestAssertions.assert_email_sent( +        from: {instance_name, notify_email}, +        to: recipient_email, +        html_body: email.html_body +      ) +    end    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) @@ -647,7 +670,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        conn = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") -      assert json_response(conn, :internal_server_error) +      assert json_response(conn, :bad_request) == +               "To send invites you need to set the `invites_enabled` option to true."      end      test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do @@ -656,7 +680,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        conn = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") -      assert json_response(conn, :internal_server_error) +      assert json_response(conn, :bad_request) == +               "To send invites you need to set the `registrations_open` option to false."      end    end @@ -1595,208 +1620,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) @@ -1880,17 +1703,15 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 "@#{admin.nickname} deleted status ##{id}"      end -    test "returns error when status is not exist", %{conn: conn} do +    test "returns 404 when the status does not exist", %{conn: conn} do        conn = delete(conn, "/api/pleroma/admin/statuses/test") -      assert json_response(conn, :bad_request) == "Could not delete" +      assert json_response(conn, :not_found) == "Not found"      end    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 +1862,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 @@ -2291,7 +2110,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          |> get("/api/pleroma/admin/config")          |> json_response(200) -      refute Map.has_key?(configs, "need_reboot") +      assert configs["need_reboot"] == false      end      test "update setting which need reboot, don't change reboot flag until reboot", %{conn: conn} do @@ -2347,7 +2166,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          |> get("/api/pleroma/admin/config")          |> json_response(200) -      refute Map.has_key?(configs, "need_reboot") +      assert configs["need_reboot"] == false      end      test "saving config with nested merge", %{conn: conn} do @@ -2454,13 +2273,17 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do            value: :erlang.term_to_binary([])          ) +      Pleroma.Config.TransferTask.load_and_update_env([], false) + +      assert Application.get_env(:logger, :backends) == [] +        conn =          post(conn, "/api/pleroma/admin/config", %{            configs: [              %{                group: config.group,                key: config.key, -              value: [":console", %{"tuple" => ["ExSyslogger", ":ex_syslogger"]}] +              value: [":console"]              }            ]          }) @@ -2471,8 +2294,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                     "group" => ":logger",                     "key" => ":backends",                     "value" => [ -                     ":console", -                     %{"tuple" => ["ExSyslogger", ":ex_syslogger"]} +                     ":console"                     ],                     "db" => [":backends"]                   } @@ -2480,14 +2302,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do               }        assert Application.get_env(:logger, :backends) == [ -               :console, -               {ExSyslogger, :ex_syslogger} +               :console               ] - -      capture_log(fn -> -        require Logger -        Logger.warn("Ooops...") -      end) =~ "Ooops..."      end      test "saving full setting if value is not keyword", %{conn: conn} do @@ -2585,9 +2401,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 +2413,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 +2436,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 +2448,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 +2850,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 -> @@ -3065,8 +2861,22 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end +  test "need_reboot flag", %{conn: conn} do +    assert conn +           |> get("/api/pleroma/admin/need_reboot") +           |> json_response(200) == %{"need_reboot" => false} + +    Restarter.Pleroma.need_reboot() + +    assert conn +           |> get("/api/pleroma/admin/need_reboot") +           |> json_response(200) == %{"need_reboot" => true} + +    on_exit(fn -> Restarter.Pleroma.refresh() end) +  end +    describe "GET /api/pleroma/admin/statuses" do -    test "returns all public, unlisted, and direct statuses", %{conn: conn, admin: admin} do +    test "returns all public and unlisted statuses", %{conn: conn, admin: admin} do        blocked = insert(:user)        user = insert(:user)        User.block(admin, blocked) @@ -3085,7 +2895,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          |> json_response(200)        refute "private" in Enum.map(response, & &1["visibility"]) -      assert length(response) == 4 +      assert length(response) == 3      end      test "returns only local statuses with local_only on", %{conn: conn} do @@ -3102,12 +2912,16 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert length(response) == 1      end -    test "returns private statuses with godmode on", %{conn: conn} do +    test "returns private and direct statuses with godmode on", %{conn: conn, admin: admin} do        user = insert(:user) + +      {:ok, _} = +        CommonAPI.post(user, %{"status" => "@#{admin.nickname}", "visibility" => "direct"}) +        {:ok, _} = CommonAPI.post(user, %{"status" => ".", "visibility" => "private"})        {:ok, _} = CommonAPI.post(user, %{"status" => ".", "visibility" => "public"})        conn = get(conn, "/api/pleroma/admin/statuses?godmode=true") -      assert json_response(conn, 200) |> length() == 2 +      assert json_response(conn, 200) |> length() == 3      end    end @@ -3385,6 +3199,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) @@ -3634,6 +3517,191 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 response["status_visibility"]      end    end + +  describe "POST /api/pleroma/admin/oauth_app" do +    test "errors", %{conn: conn} do +      response = conn |> post("/api/pleroma/admin/oauth_app", %{}) |> json_response(200) + +      assert response == %{"name" => "can't be blank", "redirect_uris" => "can't be blank"} +    end + +    test "success", %{conn: conn} do +      base_url = Pleroma.Web.base_url() +      app_name = "Trusted app" + +      response = +        conn +        |> post("/api/pleroma/admin/oauth_app", %{ +          name: app_name, +          redirect_uris: base_url +        }) +        |> json_response(200) + +      assert %{ +               "client_id" => _, +               "client_secret" => _, +               "name" => ^app_name, +               "redirect_uri" => ^base_url, +               "trusted" => false +             } = response +    end + +    test "with trusted", %{conn: conn} do +      base_url = Pleroma.Web.base_url() +      app_name = "Trusted app" + +      response = +        conn +        |> post("/api/pleroma/admin/oauth_app", %{ +          name: app_name, +          redirect_uris: base_url, +          trusted: true +        }) +        |> json_response(200) + +      assert %{ +               "client_id" => _, +               "client_secret" => _, +               "name" => ^app_name, +               "redirect_uri" => ^base_url, +               "trusted" => true +             } = response +    end +  end + +  describe "GET /api/pleroma/admin/oauth_app" do +    setup do +      app = insert(:oauth_app) +      {:ok, app: app} +    end + +    test "list", %{conn: conn} do +      response = +        conn +        |> get("/api/pleroma/admin/oauth_app") +        |> json_response(200) + +      assert %{"apps" => apps, "count" => count, "page_size" => _} = response + +      assert length(apps) == count +    end + +    test "with page size", %{conn: conn} do +      insert(:oauth_app) +      page_size = 1 + +      response = +        conn +        |> get("/api/pleroma/admin/oauth_app", %{page_size: to_string(page_size)}) +        |> json_response(200) + +      assert %{"apps" => apps, "count" => _, "page_size" => ^page_size} = response + +      assert length(apps) == page_size +    end + +    test "search by client name", %{conn: conn, app: app} do +      response = +        conn +        |> get("/api/pleroma/admin/oauth_app", %{name: app.client_name}) +        |> json_response(200) + +      assert %{"apps" => [returned], "count" => _, "page_size" => _} = response + +      assert returned["client_id"] == app.client_id +      assert returned["name"] == app.client_name +    end + +    test "search by client id", %{conn: conn, app: app} do +      response = +        conn +        |> get("/api/pleroma/admin/oauth_app", %{client_id: app.client_id}) +        |> json_response(200) + +      assert %{"apps" => [returned], "count" => _, "page_size" => _} = response + +      assert returned["client_id"] == app.client_id +      assert returned["name"] == app.client_name +    end + +    test "only trusted", %{conn: conn} do +      app = insert(:oauth_app, trusted: true) + +      response = +        conn +        |> get("/api/pleroma/admin/oauth_app", %{trusted: true}) +        |> json_response(200) + +      assert %{"apps" => [returned], "count" => _, "page_size" => _} = response + +      assert returned["client_id"] == app.client_id +      assert returned["name"] == app.client_name +    end +  end + +  describe "DELETE /api/pleroma/admin/oauth_app/:id" do +    test "with id", %{conn: conn} do +      app = insert(:oauth_app) + +      response = +        conn +        |> delete("/api/pleroma/admin/oauth_app/" <> to_string(app.id)) +        |> json_response(:no_content) + +      assert response == "" +    end + +    test "with non existance id", %{conn: conn} do +      response = +        conn +        |> delete("/api/pleroma/admin/oauth_app/0") +        |> json_response(:bad_request) + +      assert response == "" +    end +  end + +  describe "PATCH /api/pleroma/admin/oauth_app/:id" do +    test "with id", %{conn: conn} do +      app = insert(:oauth_app) + +      name = "another name" +      url = "https://example.com" +      scopes = ["admin"] +      id = app.id +      website = "http://website.com" + +      response = +        conn +        |> patch("/api/pleroma/admin/oauth_app/" <> to_string(app.id), %{ +          name: name, +          trusted: true, +          redirect_uris: url, +          scopes: scopes, +          website: website +        }) +        |> json_response(200) + +      assert %{ +               "client_id" => _, +               "client_secret" => _, +               "id" => ^id, +               "name" => ^name, +               "redirect_uri" => ^url, +               "trusted" => true, +               "website" => ^website +             } = response +    end + +    test "without id", %{conn: conn} do +      response = +        conn +        |> patch("/api/pleroma/admin/oauth_app/0") +        |> json_response(:bad_request) + +      assert response == "" +    end +  end  end  # Needed for testing diff --git a/test/web/admin_api/search_test.exs b/test/web/admin_api/search_test.exs index 082e691c4..e0e3d4153 100644 --- a/test/web/admin_api/search_test.exs +++ b/test/web/admin_api/search_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.AdminAPI.SearchTest do diff --git a/test/web/admin_api/views/report_view_test.exs b/test/web/admin_api/views/report_view_test.exs index a0c6eab3c..5db6629f2 100644 --- a/test/web/admin_api/views/report_view_test.exs +++ b/test/web/admin_api/views/report_view_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.AdminAPI.ReportViewTest do diff --git a/test/web/api_spec/app_operation_test.exs b/test/web/api_spec/app_operation_test.exs new file mode 100644 index 000000000..5b96abb44 --- /dev/null +++ b/test/web/api_spec/app_operation_test.exs @@ -0,0 +1,45 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.AppOperationTest do +  use Pleroma.Web.ConnCase, async: true + +  alias Pleroma.Web.ApiSpec +  alias Pleroma.Web.ApiSpec.Schemas.AppCreateRequest +  alias Pleroma.Web.ApiSpec.Schemas.AppCreateResponse + +  import OpenApiSpex.TestAssertions +  import Pleroma.Factory + +  test "AppCreateRequest example matches schema" do +    api_spec = ApiSpec.spec() +    schema = AppCreateRequest.schema() +    assert_schema(schema.example, "AppCreateRequest", api_spec) +  end + +  test "AppCreateResponse example matches schema" do +    api_spec = ApiSpec.spec() +    schema = AppCreateResponse.schema() +    assert_schema(schema.example, "AppCreateResponse", api_spec) +  end + +  test "AppController produces a AppCreateResponse", %{conn: conn} do +    api_spec = ApiSpec.spec() +    app_attrs = build(:oauth_app) + +    json = +      conn +      |> put_req_header("content-type", "application/json") +      |> post( +        "/api/v1/apps", +        Jason.encode!(%{ +          client_name: app_attrs.client_name, +          redirect_uris: app_attrs.redirect_uris +        }) +      ) +      |> json_response(200) + +    assert_schema(json, "AppCreateResponse", api_spec) +  end +end diff --git a/test/web/auth/authenticator_test.exs b/test/web/auth/authenticator_test.exs index fea5c8209..d54253343 100644 --- a/test/web/auth/authenticator_test.exs +++ b/test/web/auth/authenticator_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Auth.AuthenticatorTest do diff --git a/test/web/auth/basic_auth_test.exs b/test/web/auth/basic_auth_test.exs new file mode 100644 index 000000000..64f8a6863 --- /dev/null +++ b/test/web/auth/basic_auth_test.exs @@ -0,0 +1,46 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Auth.BasicAuthTest do +  use Pleroma.Web.ConnCase + +  import Pleroma.Factory + +  test "with HTTP Basic Auth used, grants access to OAuth scope-restricted endpoints", %{ +    conn: conn +  } do +    user = insert(:user) +    assert Comeonin.Pbkdf2.checkpw("test", user.password_hash) + +    basic_auth_contents = +      (URI.encode_www_form(user.nickname) <> ":" <> URI.encode_www_form("test")) +      |> Base.encode64() + +    # Succeeds with HTTP Basic Auth +    response = +      conn +      |> put_req_header("authorization", "Basic " <> basic_auth_contents) +      |> get("/api/v1/accounts/verify_credentials") +      |> json_response(200) + +    user_nickname = user.nickname +    assert %{"username" => ^user_nickname} = response + +    # Succeeds with a properly scoped OAuth token +    valid_token = insert(:oauth_token, scopes: ["read:accounts"]) + +    conn +    |> put_req_header("authorization", "Bearer #{valid_token.token}") +    |> get("/api/v1/accounts/verify_credentials") +    |> json_response(200) + +    # Fails with a wrong-scoped OAuth token (proof of restriction) +    invalid_token = insert(:oauth_token, scopes: ["read:something"]) + +    conn +    |> put_req_header("authorization", "Bearer #{invalid_token.token}") +    |> get("/api/v1/accounts/verify_credentials") +    |> json_response(403) +  end +end diff --git a/test/web/auth/oauth_test_controller_test.exs b/test/web/auth/oauth_test_controller_test.exs new file mode 100644 index 000000000..a2f6009ac --- /dev/null +++ b/test/web/auth/oauth_test_controller_test.exs @@ -0,0 +1,49 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Tests.OAuthTestControllerTest do +  use Pleroma.Web.ConnCase + +  import Pleroma.Factory + +  setup %{conn: conn} do +    user = insert(:user) +    conn = assign(conn, :user, user) +    %{conn: conn, user: user} +  end + +  test "missed_oauth", %{conn: conn} do +    res = +      conn +      |> get("/test/authenticated_api/missed_oauth") +      |> json_response(403) + +    assert res == +             %{ +               "error" => +                 "Security violation: OAuth scopes check was neither handled nor explicitly skipped." +             } +  end + +  test "skipped_oauth", %{conn: conn} do +    conn +    |> assign(:token, nil) +    |> get("/test/authenticated_api/skipped_oauth") +    |> json_response(200) +  end + +  test "performed_oauth", %{user: user} do +    %{conn: good_token_conn} = oauth_access(["read"], user: user) + +    good_token_conn +    |> get("/test/authenticated_api/performed_oauth") +    |> json_response(200) + +    %{conn: bad_token_conn} = oauth_access(["follow"], user: user) + +    bad_token_conn +    |> get("/test/authenticated_api/performed_oauth") +    |> json_response(403) +  end +end 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 299d968db..e130736ec 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) @@ -97,18 +97,6 @@ defmodule Pleroma.Web.CommonAPITest do      assert Object.normalize(activity).data["emoji"]["firefox"]    end -  test "it adds emoji when updating profiles" do -    user = insert(:user, %{name: ":firefox:"}) - -    {:ok, activity} = CommonAPI.update(user) -    user = User.get_cached_by_ap_id(user.ap_id) -    [firefox] = user.source_data["tag"] - -    assert firefox["name"] == ":firefox:" - -    assert Pleroma.Constants.as_public() in activity.recipients -  end -    describe "posting" do      test "it supports explicit addressing" do        user = insert(:user) @@ -202,13 +190,15 @@ defmodule Pleroma.Web.CommonAPITest do                 CommonAPI.post(user, %{"status" => ""})      end -    test "it returns error when character limit is exceeded" do +    test "it validates character limits are correctly enforced" do        Pleroma.Config.put([:instance, :limit], 5)        user = insert(:user)        assert {:error, "The status is over the character limit"} =                 CommonAPI.post(user, %{"status" => "foobar"}) + +      assert {:ok, activity} = CommonAPI.post(user, %{"status" => "12345"})      end      test "it can handle activities that expire" do @@ -282,9 +272,12 @@ defmodule Pleroma.Web.CommonAPITest do        user = insert(:user)        other_user = insert(:user) -      {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) +      {:ok, post_activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) -      {:ok, %Activity{}, _} = CommonAPI.favorite(activity.id, user) +      {:ok, %Activity{data: data}} = CommonAPI.favorite(user, post_activity.id) +      assert data["type"] == "Like" +      assert data["actor"] == user.ap_id +      assert data["object"] == post_activity.data["object"]      end      test "retweeting a status twice returns the status" do @@ -296,13 +289,13 @@ defmodule Pleroma.Web.CommonAPITest do        {:ok, ^activity, ^object} = CommonAPI.repeat(activity.id, user)      end -    test "favoriting a status twice returns the status" do +    test "favoriting a status twice returns ok, but without the like activity" do        user = insert(:user)        other_user = insert(:user)        {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) -      {:ok, %Activity{} = activity, object} = CommonAPI.favorite(activity.id, user) -      {:ok, ^activity, ^object} = CommonAPI.favorite(activity.id, user) +      {:ok, %Activity{}} = CommonAPI.favorite(user, activity.id) +      assert {:ok, :already_liked} = CommonAPI.favorite(user, activity.id)      end    end @@ -560,7 +553,7 @@ defmodule Pleroma.Web.CommonAPITest do        assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} =                 CommonAPI.follow(follower, followed) -      assert User.get_follow_state(follower, followed) == "pending" +      assert User.get_follow_state(follower, followed) == :follow_pending        assert {:ok, follower} = CommonAPI.unfollow(follower, followed)        assert User.get_follow_state(follower, followed) == nil @@ -582,7 +575,7 @@ defmodule Pleroma.Web.CommonAPITest do        assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} =                 CommonAPI.follow(follower, followed) -      assert User.get_follow_state(follower, followed) == "pending" +      assert User.get_follow_state(follower, followed) == :follow_pending        assert {:ok, follower} = CommonAPI.unfollow(follower, followed)        assert User.get_follow_state(follower, followed) == nil diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs index b380d10d8..b21445fe9 100644 --- a/test/web/common_api/common_api_utils_test.exs +++ b/test/web/common_api/common_api_utils_test.exs @@ -7,7 +7,6 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do    alias Pleroma.Object    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.CommonAPI.Utils -  alias Pleroma.Web.Endpoint    use Pleroma.DataCase    import ExUnit.CaptureLog @@ -42,28 +41,6 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do      end    end -  test "parses emoji from name and bio" do -    {:ok, user} = UserBuilder.insert(%{name: ":blank:", bio: ":firefox:"}) - -    expected = [ -      %{ -        "type" => "Emoji", -        "icon" => %{"type" => "Image", "url" => "#{Endpoint.url()}/emoji/Firefox.gif"}, -        "name" => ":firefox:" -      }, -      %{ -        "type" => "Emoji", -        "icon" => %{ -          "type" => "Image", -          "url" => "#{Endpoint.url()}/emoji/blank.png" -        }, -        "name" => ":blank:" -      } -    ] - -    assert expected == Utils.emoji_from_profile(user) -  end -    describe "format_input/3" do      test "works for bare text/plain" do        text = "hello world!" @@ -89,8 +66,8 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        assert output == expected -      text = "<p>hello world!</p>\n\n<p>second paragraph</p>" -      expected = "<p>hello world!</p>\n\n<p>second paragraph</p>" +      text = "<p>hello world!</p><br/>\n<p>second paragraph</p>" +      expected = "<p>hello world!</p><br/>\n<p>second paragraph</p>"        {output, [], []} = Utils.format_input(text, "text/html") @@ -99,14 +76,14 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do      test "works for bare text/markdown" do        text = "**hello world**" -      expected = "<p><strong>hello world</strong></p>\n" +      expected = "<p><strong>hello world</strong></p>"        {output, [], []} = Utils.format_input(text, "text/markdown")        assert output == expected        text = "**hello world**\n\n*another paragraph*" -      expected = "<p><strong>hello world</strong></p>\n<p><em>another paragraph</em></p>\n" +      expected = "<p><strong>hello world</strong></p><p><em>another paragraph</em></p>"        {output, [], []} = Utils.format_input(text, "text/markdown") @@ -118,7 +95,7 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        by someone        """ -      expected = "<blockquote><p>cool quote</p>\n</blockquote>\n<p>by someone</p>\n" +      expected = "<blockquote><p>cool quote</p></blockquote><p>by someone</p>"        {output, [], []} = Utils.format_input(text, "text/markdown") @@ -134,7 +111,7 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        assert output == expected        text = "[b]hello world![/b]\n\nsecond paragraph!" -      expected = "<strong>hello world!</strong><br>\n<br>\nsecond paragraph!" +      expected = "<strong>hello world!</strong><br><br>second paragraph!"        {output, [], []} = Utils.format_input(text, "text/bbcode") @@ -143,7 +120,7 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        text = "[b]hello world![/b]\n\n<strong>second paragraph!</strong>"        expected = -        "<strong>hello world!</strong><br>\n<br>\n<strong>second paragraph!</strong>" +        "<strong>hello world!</strong><br><br><strong>second paragraph!</strong>"        {output, [], []} = Utils.format_input(text, "text/bbcode") @@ -156,16 +133,14 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        text = "**hello world**\n\n*another @user__test and @user__test google.com paragraph*" -      expected = -        ~s(<p><strong>hello world</strong></p>\n<p><em>another <span class="h-card"><a data-user="#{ -          user.id -        }" class="u-url mention" href="http://foo.com/user__test" rel="ugc">@<span>user__test</span></a></span> and <span class="h-card"><a data-user="#{ -          user.id -        }" class="u-url mention" href="http://foo.com/user__test" rel="ugc">@<span>user__test</span></a></span> <a href="http://google.com" rel="ugc">google.com</a> paragraph</em></p>\n) -        {output, _, _} = Utils.format_input(text, "text/markdown") -      assert output == expected +      assert output == +               ~s(<p><strong>hello world</strong></p><p><em>another <span class="h-card"><a class="u-url mention" data-user="#{ +                 user.id +               }" href="http://foo.com/user__test" rel="ugc">@<span>user__test</span></a></span> and <span class="h-card"><a class="u-url mention" data-user="#{ +                 user.id +               }" href="http://foo.com/user__test" rel="ugc">@<span>user__test</span></a></span> <a href="http://google.com" rel="ugc">google.com</a> paragraph</em></p>)      end    end @@ -474,6 +449,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/fallback_test.exs b/test/web/fallback_test.exs index c13db9526..3919ef93a 100644 --- a/test/web/fallback_test.exs +++ b/test/web/fallback_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.FallbackTest do diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs index c224197c3..59e53bb03 100644 --- a/test/web/federator_test.exs +++ b/test/web/federator_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.FederatorTest do @@ -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 @@ -81,7 +78,7 @@ defmodule Pleroma.Web.FederatorTest do          local: false,          nickname: "nick1@domain.com",          ap_id: "https://domain.com/users/nick1", -        source_data: %{"inbox" => inbox1}, +        inbox: inbox1,          ap_enabled: true        }) @@ -89,7 +86,7 @@ defmodule Pleroma.Web.FederatorTest do          local: false,          nickname: "nick2@domain2.com",          ap_id: "https://domain2.com/users/nick2", -        source_data: %{"inbox" => inbox2}, +        inbox: inbox2,          ap_enabled: true        }) diff --git a/test/web/feed/tag_controller_test.exs b/test/web/feed/tag_controller_test.exs index 5950605e8..d95aac108 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,17 +146,17 @@ 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)), -             HtmlEntities.decode(FeedView.activity_content(obj1)) +             HtmlEntities.decode(FeedView.activity_content(obj2.data)), +             HtmlEntities.decode(FeedView.activity_content(obj1.data))             ]      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 19a019060..05ad427c2 100644 --- a/test/web/feed/user_controller_test.exs +++ b/test/web/feed/user_controller_test.exs @@ -8,244 +8,207 @@ defmodule Pleroma.Web.Feed.UserControllerTest do    import Pleroma.Factory    import SweetXml +  alias Pleroma.Config    alias Pleroma.Object    alias Pleroma.User -  clear_config([:feed]) - -  test "gets a 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"] -        } -      ) +  setup do: clear_config([:instance, :federating], true) -    note_activity = insert(:note_activity, note: note) -    user = User.get_cached_by_ap_id(note_activity.data["actor"]) +  describe "feed" do +    setup do: clear_config([:feed]) -    note2 = -      insert(:note, -        user: user, -        data: %{"content" => "42 This is :moominmamma: note ", "inReplyTo" => activity.data["id"]} +    test "gets a feed", %{conn: conn} do +      Config.put( +        [:feed, :post_title], +        %{max_length: 10, omission: "..."}        ) -    _note_activity2 = insert(:note_activity, note: note2) -    object = Object.normalize(note_activity) - -    resp = -      conn -      |> put_req_header("content-type", "application/atom+xml") -      |> get(user_feed_path(conn, :feed, user.nickname)) -      |> response(200) +      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"]) -    activity_titles = -      resp -      |> SweetXml.parse() -      |> SweetXml.xpath(~x"//entry/title/text()"l) +      note2 = +        insert(:note, +          user: user, +          data: %{ +            "content" => "42 This is :moominmamma: note ", +            "inReplyTo" => activity.data["id"] +          } +        ) -    assert activity_titles == ['42 This...', 'This is...'] -    assert resp =~ object.data["content"] -  end +      note_activity2 = insert(:note_activity, note: note2) +      object = Object.normalize(note_activity) -  test "returns 404 for a missing feed", %{conn: conn} do -    conn = -      conn -      |> put_req_header("content-type", "application/atom+xml") -      |> get(user_feed_path(conn, :feed, "nonexisting")) +      resp = +        conn +        |> put_req_header("accept", "application/atom+xml") +        |> get(user_feed_path(conn, :feed, user.nickname)) +        |> response(200) -    assert response(conn, 404) -  end +      activity_titles = +        resp +        |> SweetXml.parse() +        |> SweetXml.xpath(~x"//entry/title/text()"l) -  describe "feed_redirect" do -    test "undefined format. it redirects to feed", %{conn: conn} do -      note_activity = insert(:note_activity) -      user = User.get_cached_by_ap_id(note_activity.data["actor"]) +      assert activity_titles == ['42 This...', 'This is...'] +      assert resp =~ object.data["content"] -      response = +      resp =          conn -        |> put_req_header("accept", "application/xml") -        |> get("/users/#{user.nickname}") -        |> response(302) +        |> put_req_header("accept", "application/atom+xml") +        |> get("/users/#{user.nickname}/feed", %{"max_id" => note_activity2.id}) +        |> response(200) -      assert response == -               "<html><body>You are being <a href=\"#{Pleroma.Web.base_url()}/users/#{ -                 user.nickname -               }/feed.atom\">redirected</a>.</body></html>" +      activity_titles = +        resp +        |> SweetXml.parse() +        |> SweetXml.xpath(~x"//entry/title/text()"l) + +      assert activity_titles == ['This is...']      end -    test "undefined format. it returns error when user not found", %{conn: conn} do -      response = +    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/xml") -        |> get(user_feed_path(conn, :feed, "jimm")) -        |> response(404) +        |> put_req_header("accept", "application/rss+xml") +        |> get("/users/#{user.nickname}/feed.rss") +        |> response(200) -      assert response == ~S({"error":"Not found"}) -    end +      activity_titles = +        resp +        |> SweetXml.parse() +        |> SweetXml.xpath(~x"//item/title/text()"l) -    test "activity+json format. it redirects on actual feed of user", %{conn: conn} do -      note_activity = insert(:note_activity) -      user = User.get_cached_by_ap_id(note_activity.data["actor"]) +      assert activity_titles == ['42 This...', 'This is...'] +      assert resp =~ object.data["content"] -      response = +      resp =          conn -        |> put_req_header("accept", "application/activity+json") -        |> get("/users/#{user.nickname}") -        |> json_response(200) - -      assert response["endpoints"] == %{ -               "oauthAuthorizationEndpoint" => "#{Pleroma.Web.base_url()}/oauth/authorize", -               "oauthRegistrationEndpoint" => "#{Pleroma.Web.base_url()}/api/v1/apps", -               "oauthTokenEndpoint" => "#{Pleroma.Web.base_url()}/oauth/token", -               "sharedInbox" => "#{Pleroma.Web.base_url()}/inbox", -               "uploadMedia" => "#{Pleroma.Web.base_url()}/api/ap/upload_media" -             } - -      assert response["@context"] == [ -               "https://www.w3.org/ns/activitystreams", -               "http://localhost:4001/schemas/litepub-0.1.jsonld", -               %{"@language" => "und"} -             ] - -      assert Map.take(response, [ -               "followers", -               "following", -               "id", -               "inbox", -               "manuallyApprovesFollowers", -               "name", -               "outbox", -               "preferredUsername", -               "summary", -               "tag", -               "type", -               "url" -             ]) == %{ -               "followers" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/followers", -               "following" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/following", -               "id" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}", -               "inbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/inbox", -               "manuallyApprovesFollowers" => false, -               "name" => user.name, -               "outbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/outbox", -               "preferredUsername" => user.nickname, -               "summary" => user.bio, -               "tag" => [], -               "type" => "Person", -               "url" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}" -             } +        |> 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 "activity+json format. it returns error whe use not found", %{conn: conn} do -      response = +    test "returns 404 for a missing feed", %{conn: conn} do +      conn =          conn -        |> put_req_header("accept", "application/activity+json") -        |> get("/users/jimm") -        |> json_response(404) +        |> put_req_header("accept", "application/atom+xml") +        |> get(user_feed_path(conn, :feed, "nonexisting")) -      assert response == "Not found" +      assert response(conn, 404)      end +  end -    test "json format. it redirects on actual feed of user", %{conn: conn} do +  # Note: see ActivityPubControllerTest for JSON format tests +  describe "feed_redirect" do +    test "with html format, it redirects to user feed", %{conn: conn} do        note_activity = insert(:note_activity)        user = User.get_cached_by_ap_id(note_activity.data["actor"])        response =          conn -        |> put_req_header("accept", "application/json")          |> get("/users/#{user.nickname}") -        |> json_response(200) - -      assert response["endpoints"] == %{ -               "oauthAuthorizationEndpoint" => "#{Pleroma.Web.base_url()}/oauth/authorize", -               "oauthRegistrationEndpoint" => "#{Pleroma.Web.base_url()}/api/v1/apps", -               "oauthTokenEndpoint" => "#{Pleroma.Web.base_url()}/oauth/token", -               "sharedInbox" => "#{Pleroma.Web.base_url()}/inbox", -               "uploadMedia" => "#{Pleroma.Web.base_url()}/api/ap/upload_media" -             } - -      assert response["@context"] == [ -               "https://www.w3.org/ns/activitystreams", -               "http://localhost:4001/schemas/litepub-0.1.jsonld", -               %{"@language" => "und"} -             ] - -      assert Map.take(response, [ -               "followers", -               "following", -               "id", -               "inbox", -               "manuallyApprovesFollowers", -               "name", -               "outbox", -               "preferredUsername", -               "summary", -               "tag", -               "type", -               "url" -             ]) == %{ -               "followers" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/followers", -               "following" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/following", -               "id" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}", -               "inbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/inbox", -               "manuallyApprovesFollowers" => false, -               "name" => user.name, -               "outbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/outbox", -               "preferredUsername" => user.nickname, -               "summary" => user.bio, -               "tag" => [], -               "type" => "Person", -               "url" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}" -             } +        |> response(200) + +      assert response == +               Fallback.RedirectController.redirector_with_meta( +                 conn, +                 %{user: user} +               ).resp_body      end -    test "json format. it returns error whe use not found", %{conn: conn} do +    test "with html format, it returns error when user is not found", %{conn: conn} do        response =          conn -        |> put_req_header("accept", "application/json")          |> get("/users/jimm")          |> json_response(404) -      assert response == "Not found" +      assert response == %{"error" => "Not found"}      end -    test "html format. it redirects on actual feed of user", %{conn: conn} do +    test "with non-html / non-json format, it redirects to user feed in atom format", %{ +      conn: conn +    } do        note_activity = insert(:note_activity)        user = User.get_cached_by_ap_id(note_activity.data["actor"]) -      response = +      conn =          conn +        |> put_req_header("accept", "application/xml")          |> get("/users/#{user.nickname}") -        |> response(200) -      assert response == -               Fallback.RedirectController.redirector_with_meta( -                 conn, -                 %{user: user} -               ).resp_body +      assert conn.status == 302 +      assert redirected_to(conn) == "#{Pleroma.Web.base_url()}/users/#{user.nickname}/feed.atom"      end -    test "html format. it returns error when user not found", %{conn: conn} do +    test "with non-html / non-json format, it returns error when user is not found", %{conn: conn} do        response =          conn -        |> get("/users/jimm") -        |> json_response(404) +        |> put_req_header("accept", "application/xml") +        |> get(user_feed_path(conn, :feed, "jimm")) +        |> response(404) -      assert response == %{"error" => "Not found"} +      assert response == ~S({"error":"Not found"})      end    end  end diff --git a/test/web/instances/instance_test.exs b/test/web/instances/instance_test.exs index e54d708ad..e463200ca 100644 --- a/test/web/instances/instance_test.exs +++ b/test/web/instances/instance_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Instances.InstanceTest do @@ -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 65b03b155..d2618025c 100644 --- a/test/web/instances/instances_test.exs +++ b/test/web/instances/instances_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.InstancesTest do @@ -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..2d256f63c 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,15 +76,15 @@ 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)        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="#{ +               ~s(I drink <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe">#cofe</a> with <span class="h-card"><a class="u-url mention" data-user="#{                   user2.id -               }" class="u-url mention" href="#{user2.ap_id}" rel="ugc">@<span>#{user2.nickname}</span></a></span>) +               }" 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", %{ @@ -260,7 +273,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do      test "update fields", %{conn: conn} do        fields = [          %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "<script>bar</script>"}, -        %{"name" => "link", "value" => "cofe.io"} +        %{"name" => "link.io", "value" => "cofe.io"}        ]        account_data = @@ -270,7 +283,10 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        assert account_data["fields"] == [                 %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "bar"}, -               %{"name" => "link", "value" => ~S(<a href="http://cofe.io" rel="ugc">cofe.io</a>)} +               %{ +                 "name" => "link.io", +                 "value" => ~S(<a href="http://cofe.io" rel="ugc">cofe.io</a>) +               }               ]        assert account_data["source"]["fields"] == [ @@ -278,14 +294,16 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do                   "name" => "<a href=\"http://google.com\">foo</a>",                   "value" => "<script>bar</script>"                 }, -               %{"name" => "link", "value" => "cofe.io"} +               %{"name" => "link.io", "value" => "cofe.io"}               ] +    end +    test "update fields via x-www-form-urlencoded", %{conn: conn} do        fields =          [            "fields_attributes[1][name]=link", -          "fields_attributes[1][value]=cofe.io", -          "fields_attributes[0][name]=<a href=\"http://google.com\">foo</a>", +          "fields_attributes[1][value]=http://cofe.io", +          "fields_attributes[0][name]=foo",            "fields_attributes[0][value]=bar"          ]          |> Enum.join("&") @@ -297,32 +315,49 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do          |> json_response(200)        assert account["fields"] == [ -               %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "bar"}, -               %{"name" => "link", "value" => ~S(<a href="http://cofe.io" rel="ugc">cofe.io</a>)} +               %{"name" => "foo", "value" => "bar"}, +               %{ +                 "name" => "link", +                 "value" => ~S(<a href="http://cofe.io" rel="ugc">http://cofe.io</a>) +               }               ]        assert account["source"]["fields"] == [ -               %{ -                 "name" => "<a href=\"http://google.com\">foo</a>", -                 "value" => "bar" -               }, -               %{"name" => "link", "value" => "cofe.io"} +               %{"name" => "foo", "value" => "bar"}, +               %{"name" => "link", "value" => "http://cofe.io"}               ] +    end + +    test "update fields with empty name", %{conn: conn} do +      fields = [ +        %{"name" => "foo", "value" => ""}, +        %{"name" => "", "value" => "bar"} +      ] +      account = +        conn +        |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) +        |> json_response(200) + +      assert account["fields"] == [ +               %{"name" => "foo", "value" => ""} +             ] +    end + +    test "update fields when invalid request", %{conn: conn} do        name_limit = Pleroma.Config.get([:instance, :account_field_name_length])        value_limit = Pleroma.Config.get([:instance, :account_field_value_length]) +      long_name = Enum.map(0..name_limit, fn _ -> "x" end) |> Enum.join()        long_value = Enum.map(0..value_limit, fn _ -> "x" end) |> Enum.join() -      fields = [%{"name" => "<b>foo<b>", "value" => long_value}] +      fields = [%{"name" => "foo", "value" => long_value}]        assert %{"error" => "Invalid request"} ==                 conn                 |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})                 |> json_response(403) -      long_name = Enum.map(0..name_limit, fn _ -> "x" end) |> Enum.join() -        fields = [%{"name" => long_name, "value" => "bar"}]        assert %{"error" => "Invalid request"} == @@ -333,7 +368,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        Pleroma.Config.put([:instance, :max_account_fields], 1)        fields = [ -        %{"name" => "<b>foo<b>", "value" => "<i>bar</i>"}, +        %{"name" => "foo", "value" => "bar"},          %{"name" => "link", "value" => "cofe.io"}        ] @@ -341,20 +376,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do                 conn                 |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})                 |> json_response(403) - -      fields = [ -        %{"name" => "foo", "value" => ""}, -        %{"name" => "", "value" => "bar"} -      ] - -      account = -        conn -        |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) -        |> json_response(200) - -      assert account["fields"] == [ -               %{"name" => "foo", "value" => ""} -             ]      end    end  end diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 57d0f4416..61c2697b2 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,9 +790,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        [valid_params: valid_params]      end +    setup do: clear_config([:instance, :account_activation_required]) +      test "Account registration via Application", %{conn: conn} do        conn = -        post(conn, "/api/v1/apps", %{ +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/v1/apps", %{            client_name: "client_name",            redirect_uris: "urn:ietf:wg:oauth:2.0:oob",            scopes: "read, write, follow" @@ -685,7 +878,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert json_response(res, 200)        [{127, 0, 0, 1}, {127, 0, 0, 2}, {127, 0, 0, 3}, {127, 0, 0, 4}] -      |> Stream.zip(valid_params) +      |> Stream.zip(Map.delete(valid_params, :email))        |> Enum.each(fn {ip, {attr, _}} ->          res =            conn @@ -697,22 +890,131 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        end)      end +    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 +      Pleroma.Config.put([:instance, :account_activation_required], true) + +      app_token = insert(:oauth_token, user: nil) +      conn = put_req_header(conn, "authorization", "Bearer " <> app_token.token) + +      res = +        conn +        |> Map.put(:remote_ip, {127, 0, 0, 5}) +        |> post("/api/v1/accounts", Map.delete(valid_params, :email)) + +      assert json_response(res, 400) == %{"error" => "Missing parameters"} + +      res = +        conn +        |> Map.put(:remote_ip, {127, 0, 0, 6}) +        |> post("/api/v1/accounts", Map.put(valid_params, :email, "")) + +      assert json_response(res, 400) == %{"error" => "{\"email\":[\"can't be blank\"]}"} +    end + +    test "allow registration without an email", %{conn: conn, valid_params: valid_params} do +      app_token = insert(:oauth_token, user: nil) +      conn = put_req_header(conn, "authorization", "Bearer " <> app_token.token) + +      res = +        conn +        |> Map.put(:remote_ip, {127, 0, 0, 7}) +        |> post("/api/v1/accounts", Map.delete(valid_params, :email)) + +      assert json_response(res, 200) +    end + +    test "allow registration with an empty email", %{conn: conn, valid_params: valid_params} do +      app_token = insert(:oauth_token, user: nil) +      conn = put_req_header(conn, "authorization", "Bearer " <> app_token.token) + +      res = +        conn +        |> Map.put(:remote_ip, {127, 0, 0, 8}) +        |> post("/api/v1/accounts", Map.put(valid_params, :email, "")) + +      assert json_response(res, 200) +    end +      test "returns forbidden if token is invalid", %{conn: conn, valid_params: valid_params} do        conn = put_req_header(conn, "authorization", "Bearer " <> "invalid-token")        res = post(conn, "/api/v1/accounts", valid_params)        assert json_response(res, 403) == %{"error" => "Invalid credentials"}      end -  end -  describe "create account by app / rate limit" do -    clear_config([Pleroma.Plugs.RemoteIp, :enabled]) do -      Pleroma.Config.put([Pleroma.Plugs.RemoteIp, :enabled], true) -    end +    test "registration from trusted app" do +      clear_config([Pleroma.Captcha, :enabled], true) +      app = insert(:oauth_app, trusted: true, scopes: ["read", "write", "follow", "push"]) + +      conn = +        build_conn() +        |> post("/oauth/token", %{ +          "grant_type" => "client_credentials", +          "client_id" => app.client_id, +          "client_secret" => app.client_secret +        }) + +      assert %{"access_token" => token, "token_type" => "Bearer"} = json_response(conn, 200) + +      response = +        build_conn() +        |> Plug.Conn.put_req_header("authorization", "Bearer " <> token) +        |> post("/api/v1/accounts", %{ +          nickname: "nickanme", +          agreement: true, +          email: "email@example.com", +          fullname: "Lain", +          username: "Lain", +          password: "some_password", +          confirm: "some_password" +        }) +        |> json_response(200) + +      assert %{ +               "access_token" => access_token, +               "created_at" => _, +               "scope" => ["read", "write", "follow", "push"], +               "token_type" => "Bearer" +             } = response + +      response = +        build_conn() +        |> Plug.Conn.put_req_header("authorization", "Bearer " <> access_token) +        |> get("/api/v1/accounts/verify_credentials") +        |> json_response(200) -    clear_config([:rate_limit, :app_account_creation]) do -      Pleroma.Config.put([:rate_limit, :app_account_creation], {10_000, 2}) +      assert %{ +               "acct" => "Lain", +               "bot" => false, +               "display_name" => "Lain", +               "follow_requests_count" => 0, +               "followers_count" => 0, +               "following_count" => 0, +               "locked" => false, +               "note" => "", +               "source" => %{ +                 "fields" => [], +                 "note" => "", +                 "pleroma" => %{ +                   "actor_type" => "Person", +                   "discoverable" => false, +                   "no_rich_text" => false, +                   "show_role" => true +                 }, +                 "privacy" => "public", +                 "sensitive" => false +               }, +               "statuses_count" => 0, +               "username" => "Lain" +             } = response      end +  end + +  describe "create account by app / rate limit" do +    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/app_controller_test.exs b/test/web/mastodon_api/controllers/app_controller_test.exs index 51788155b..e7b11d14e 100644 --- a/test/web/mastodon_api/controllers/app_controller_test.exs +++ b/test/web/mastodon_api/controllers/app_controller_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.AppControllerTest do @@ -16,8 +16,7 @@ defmodule Pleroma.Web.MastodonAPI.AppControllerTest do      conn =        conn -      |> assign(:user, token.user) -      |> assign(:token, token) +      |> put_req_header("authorization", "Bearer #{token.token}")        |> get("/api/v1/apps/verify_credentials")      app = Repo.preload(token, :app).app @@ -37,6 +36,7 @@ defmodule Pleroma.Web.MastodonAPI.AppControllerTest do      conn =        conn +      |> put_req_header("content-type", "application/json")        |> assign(:user, user)        |> post("/api/v1/apps", %{          client_name: app_attrs.client_name, diff --git a/test/web/mastodon_api/controllers/auth_controller_test.exs b/test/web/mastodon_api/controllers/auth_controller_test.exs index 98b2a82e7..a485f8e41 100644 --- a/test/web/mastodon_api/controllers/auth_controller_test.exs +++ b/test/web/mastodon_api/controllers/auth_controller_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.AuthControllerTest do @@ -85,6 +85,37 @@ defmodule Pleroma.Web.MastodonAPI.AuthControllerTest do      end    end +  describe "POST /auth/password, with nickname" do +    test "it returns 204", %{conn: conn} do +      user = insert(:user) + +      assert conn +             |> post("/auth/password?nickname=#{user.nickname}") +             |> json_response(:no_content) + +      ObanHelpers.perform_all() +      token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id) + +      email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token) +      notify_email = Config.get([:instance, :notify_email]) +      instance_name = Config.get([:instance, :name]) + +      assert_email_sent( +        from: {instance_name, notify_email}, +        to: {user.name, user.email}, +        html_body: email.html_body +      ) +    end + +    test "it doesn't fail when a user has no email", %{conn: conn} do +      user = insert(:user, %{email: nil}) + +      assert conn +             |> post("/auth/password?nickname=#{user.nickname}") +             |> json_response(:no_content) +    end +  end +    describe "POST /auth/password, with invalid parameters" do      setup do        user = insert(:user) diff --git a/test/web/mastodon_api/controllers/custom_emoji_controller_test.exs b/test/web/mastodon_api/controllers/custom_emoji_controller_test.exs index 2d988b0b8..0b2ffa470 100644 --- a/test/web/mastodon_api/controllers/custom_emoji_controller_test.exs +++ b/test/web/mastodon_api/controllers/custom_emoji_controller_test.exs @@ -1,16 +1,21 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.CustomEmojiControllerTest do    use Pleroma.Web.ConnCase, async: true +  alias Pleroma.Web.ApiSpec +  alias Pleroma.Web.ApiSpec.Schemas.CustomEmoji +  alias Pleroma.Web.ApiSpec.Schemas.CustomEmojisResponse +  import OpenApiSpex.TestAssertions    test "with tags", %{conn: conn} do -    [emoji | _body] = -      conn -      |> get("/api/v1/custom_emojis") -      |> json_response(200) +    assert resp = +             conn +             |> get("/api/v1/custom_emojis") +             |> json_response(200) +    assert [emoji | _body] = resp      assert Map.has_key?(emoji, "shortcode")      assert Map.has_key?(emoji, "static_url")      assert Map.has_key?(emoji, "tags") @@ -18,5 +23,19 @@ defmodule Pleroma.Web.MastodonAPI.CustomEmojiControllerTest do      assert Map.has_key?(emoji, "category")      assert Map.has_key?(emoji, "url")      assert Map.has_key?(emoji, "visible_in_picker") +    assert_schema(resp, "CustomEmojisResponse", ApiSpec.spec()) +    assert_schema(emoji, "CustomEmoji", ApiSpec.spec()) +  end + +  test "CustomEmoji example matches schema" do +    api_spec = ApiSpec.spec() +    schema = CustomEmoji.schema() +    assert_schema(schema.example, "CustomEmoji", api_spec) +  end + +  test "CustomEmojisResponse example matches schema" do +    api_spec = ApiSpec.spec() +    schema = CustomEmojisResponse.schema() +    assert_schema(schema.example, "CustomEmojisResponse", api_spec)    end  end diff --git a/test/web/mastodon_api/controllers/domain_block_controller_test.exs b/test/web/mastodon_api/controllers/domain_block_controller_test.exs index 8d24b3b88..d66190c90 100644 --- a/test/web/mastodon_api/controllers/domain_block_controller_test.exs +++ b/test/web/mastodon_api/controllers/domain_block_controller_test.exs @@ -6,20 +6,29 @@ defmodule Pleroma.Web.MastodonAPI.DomainBlockControllerTest do    use Pleroma.Web.ConnCase    alias Pleroma.User +  alias Pleroma.Web.ApiSpec +  alias Pleroma.Web.ApiSpec.Schemas.DomainBlocksResponse    import Pleroma.Factory +  import OpenApiSpex.TestAssertions    test "blocking / unblocking a domain" do      %{user: user, conn: conn} = oauth_access(["write:blocks"])      other_user = insert(:user, %{ap_id: "https://dogwhistle.zone/@pundit"}) -    ret_conn = post(conn, "/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"}) +    ret_conn = +      conn +      |> put_req_header("content-type", "application/json") +      |> post("/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"})      assert %{} = json_response(ret_conn, 200)      user = User.get_cached_by_ap_id(user.ap_id)      assert User.blocks?(user, other_user) -    ret_conn = delete(conn, "/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"}) +    ret_conn = +      conn +      |> put_req_header("content-type", "application/json") +      |> delete("/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"})      assert %{} = json_response(ret_conn, 200)      user = User.get_cached_by_ap_id(user.ap_id) @@ -41,5 +50,12 @@ defmodule Pleroma.Web.MastodonAPI.DomainBlockControllerTest do      assert "bad.site" in domain_blocks      assert "even.worse.site" in domain_blocks +    assert_schema(domain_blocks, "DomainBlocksResponse", ApiSpec.spec()) +  end + +  test "DomainBlocksResponse example matches schema" do +    api_spec = ApiSpec.spec() +    schema = DomainBlocksResponse.schema() +    assert_schema(schema.example, "DomainBlocksResponse", api_spec)    end  end diff --git a/test/web/mastodon_api/controllers/follow_request_controller_test.exs b/test/web/mastodon_api/controllers/follow_request_controller_test.exs index dd848821a..d8dbe4800 100644 --- a/test/web/mastodon_api/controllers/follow_request_controller_test.exs +++ b/test/web/mastodon_api/controllers/follow_request_controller_test.exs @@ -21,7 +21,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do        other_user = insert(:user)        {:ok, _activity} = ActivityPub.follow(other_user, user) -      {:ok, other_user} = User.follow(other_user, user, "pending") +      {:ok, other_user} = User.follow(other_user, user, :follow_pending)        assert User.following?(other_user, user) == false @@ -35,7 +35,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do        other_user = insert(:user)        {:ok, _activity} = ActivityPub.follow(other_user, user) -      {:ok, other_user} = User.follow(other_user, user, "pending") +      {:ok, other_user} = User.follow(other_user, user, :follow_pending)        user = User.get_cached_by_id(user.id)        other_user = User.get_cached_by_id(other_user.id) diff --git a/test/web/mastodon_api/controllers/instance_controller_test.exs b/test/web/mastodon_api/controllers/instance_controller_test.exs index e00de6b18..2737dcaba 100644 --- a/test/web/mastodon_api/controllers/instance_controller_test.exs +++ b/test/web/mastodon_api/controllers/instance_controller_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do diff --git a/test/web/mastodon_api/controllers/marker_controller_test.exs b/test/web/mastodon_api/controllers/marker_controller_test.exs index 1fcad873d..919f295bd 100644 --- a/test/web/mastodon_api/controllers/marker_controller_test.exs +++ b/test/web/mastodon_api/controllers/marker_controller_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do 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 d452ddbdd..8c815b415 100644 --- a/test/web/mastodon_api/controllers/notification_controller_test.exs +++ b/test/web/mastodon_api/controllers/notification_controller_test.exs @@ -12,6 +12,26 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do    import Pleroma.Factory +  test "does NOT render account/pleroma/relationship if this is disabled by default" do +    clear_config([:extensions, :output_relationships_in_statuses_by_default], false) + +    %{user: user, conn: conn} = oauth_access(["read:notifications"]) +    other_user = insert(:user) + +    {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) +    {:ok, [_notification]} = Notification.create_notifications(activity) + +    response = +      conn +      |> assign(:user, user) +      |> get("/api/v1/notifications") +      |> json_response(200) + +    assert Enum.all?(response, fn n -> +             get_in(n, ["account", "pleroma", "relationship"]) == %{} +           end) +  end +    test "list of notifications" do      %{user: user, conn: conn} = oauth_access(["read:notifications"])      other_user = insert(:user) @@ -26,7 +46,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        |> get("/api/v1/notifications")      expected_response = -      "hi <span class=\"h-card\"><a data-user=\"#{user.id}\" class=\"u-url mention\" href=\"#{ +      "hi <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{user.id}\" href=\"#{          user.ap_id        }\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>" @@ -45,7 +65,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      conn = get(conn, "/api/v1/notifications/#{notification.id}")      expected_response = -      "hi <span class=\"h-card\"><a data-user=\"#{user.id}\" class=\"u-url mention\" href=\"#{ +      "hi <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{user.id}\" href=\"#{          user.ap_id        }\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>" @@ -53,7 +73,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert response == expected_response    end -  test "dismissing a single notification" do +  test "dismissing a single notification (deprecated endpoint)" do      %{user: user, conn: conn} = oauth_access(["write:notifications"])      other_user = insert(:user) @@ -69,6 +89,22 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert %{} = json_response(conn, 200)    end +  test "dismissing a single notification" do +    %{user: user, conn: conn} = oauth_access(["write:notifications"]) +    other_user = insert(:user) + +    {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) + +    {:ok, [notification]} = Notification.create_notifications(activity) + +    conn = +      conn +      |> assign(:user, user) +      |> post("/api/v1/notifications/#{notification.id}/dismiss") + +    assert %{} = json_response(conn, 200) +  end +    test "clearing all notifications" do      %{user: user, conn: conn} = oauth_access(["write:notifications", "read:notifications"])      other_user = insert(:user) @@ -194,10 +230,10 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        {:ok, private_activity} =          CommonAPI.post(other_user, %{"status" => ".", "visibility" => "private"}) -      {:ok, _, _} = CommonAPI.favorite(public_activity.id, user) -      {:ok, _, _} = CommonAPI.favorite(direct_activity.id, user) -      {:ok, _, _} = CommonAPI.favorite(unlisted_activity.id, user) -      {:ok, _, _} = CommonAPI.favorite(private_activity.id, user) +      {:ok, _} = CommonAPI.favorite(user, public_activity.id) +      {:ok, _} = CommonAPI.favorite(user, direct_activity.id) +      {:ok, _} = CommonAPI.favorite(user, unlisted_activity.id) +      {:ok, _} = CommonAPI.favorite(user, private_activity.id)        activity_ids =          conn @@ -274,7 +310,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      {:ok, mention_activity} = CommonAPI.post(other_user, %{"status" => "hey @#{user.nickname}"})      {:ok, create_activity} = CommonAPI.post(user, %{"status" => "hey"}) -    {:ok, favorite_activity, _} = CommonAPI.favorite(create_activity.id, other_user) +    {:ok, favorite_activity} = CommonAPI.favorite(other_user, create_activity.id)      {:ok, reblog_activity, _} = CommonAPI.repeat(create_activity.id, other_user)      {:ok, _, _, follow_activity} = CommonAPI.follow(other_user, user) @@ -304,6 +340,51 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert [%{"id" => ^reblog_notification_id}] = json_response(conn_res, 200)    end +  test "filters notifications using include_types" do +    %{user: user, conn: conn} = oauth_access(["read:notifications"]) +    other_user = insert(:user) + +    {:ok, mention_activity} = CommonAPI.post(other_user, %{"status" => "hey @#{user.nickname}"}) +    {:ok, create_activity} = CommonAPI.post(user, %{"status" => "hey"}) +    {:ok, favorite_activity} = CommonAPI.favorite(other_user, create_activity.id) +    {:ok, reblog_activity, _} = CommonAPI.repeat(create_activity.id, other_user) +    {:ok, _, _, follow_activity} = CommonAPI.follow(other_user, user) + +    mention_notification_id = get_notification_id_by_activity(mention_activity) +    favorite_notification_id = get_notification_id_by_activity(favorite_activity) +    reblog_notification_id = get_notification_id_by_activity(reblog_activity) +    follow_notification_id = get_notification_id_by_activity(follow_activity) + +    conn_res = get(conn, "/api/v1/notifications", %{include_types: ["follow"]}) + +    assert [%{"id" => ^follow_notification_id}] = json_response(conn_res, 200) + +    conn_res = get(conn, "/api/v1/notifications", %{include_types: ["mention"]}) + +    assert [%{"id" => ^mention_notification_id}] = json_response(conn_res, 200) + +    conn_res = get(conn, "/api/v1/notifications", %{include_types: ["favourite"]}) + +    assert [%{"id" => ^favorite_notification_id}] = json_response(conn_res, 200) + +    conn_res = get(conn, "/api/v1/notifications", %{include_types: ["reblog"]}) + +    assert [%{"id" => ^reblog_notification_id}] = json_response(conn_res, 200) + +    result = conn |> get("/api/v1/notifications") |> json_response(200) + +    assert length(result) == 4 + +    result = +      conn +      |> get("/api/v1/notifications", %{ +        include_types: ["follow", "mention", "favourite", "reblog"] +      }) +      |> json_response(200) + +    assert length(result) == 4 +  end +    test "destroy multiple" do      %{user: user, conn: conn} = oauth_access(["read:notifications", "write:notifications"])      other_user = insert(:user) @@ -407,20 +488,29 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert length(json_response(conn, 200)) == 1    end -  test "see move notifications with `with_move` parameter" do +  @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() -    ret_conn = get(conn, "/api/v1/notifications") - -    assert json_response(ret_conn, 200) == [] - -    conn = get(conn, "/api/v1/notifications", %{"with_move" => "true"}) +    conn = get(conn, "/api/v1/notifications")      assert length(json_response(conn, 200)) == 1    end diff --git a/test/web/mastodon_api/controllers/report_controller_test.exs b/test/web/mastodon_api/controllers/report_controller_test.exs index 1361b1420..34ec8119e 100644 --- a/test/web/mastodon_api/controllers/report_controller_test.exs +++ b/test/web/mastodon_api/controllers/report_controller_test.exs @@ -75,4 +75,13 @@ defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do      assert json_response(conn, 400) == %{"error" => "Account not found"}    end + +  test "doesn't fail if an admin has no email", %{conn: conn, target_user: target_user} do +    insert(:user, %{is_admin: true, email: nil}) + +    assert %{"action_taken" => false, "id" => _} = +             conn +             |> post("/api/v1/reports", %{"account_id" => target_user.id}) +             |> json_response(200) +  end  end 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 9c2ceda5d..162f7b1b2 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,104 @@ 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) + +    conn = get(conn, "/api/v1/statuses/#{String.downcase(activity.id)}") + +    assert json_response(conn, 404) == %{"error" => "Record not found"} +  end +    test "get a direct status" do      %{user: user, conn: conn} = oauth_access(["read:statuses"])      other_user = insert(:user) @@ -505,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"]) @@ -520,6 +682,18 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        refute Activity.get_by_id(activity.id)      end +    test "when it doesn't exist" do +      %{user: author, conn: conn} = oauth_access(["write:statuses"]) +      activity = insert(:note_activity, user: author) + +      conn = +        conn +        |> assign(:user, author) +        |> delete("/api/v1/statuses/#{String.downcase(activity.id)}") + +      assert %{"error" => "Record not found"} == json_response(conn, 404) +    end +      test "when you didn't create it" do        %{conn: conn} = oauth_access(["write:statuses"])        activity = insert(:note_activity) @@ -574,6 +748,14 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        assert to_string(activity.id) == id      end +    test "returns 404 if the reblogged status doesn't exist", %{conn: conn} do +      activity = insert(:note_activity) + +      conn = post(conn, "/api/v1/statuses/#{String.downcase(activity.id)}/reblog") + +      assert %{"error" => "Record not found"} = json_response(conn, 404) +    end +      test "reblogs privately and returns the reblogged status", %{conn: conn} do        activity = insert(:note_activity) @@ -593,7 +775,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        user1 = insert(:user)        user2 = insert(:user)        user3 = insert(:user) -      CommonAPI.favorite(activity.id, user2) +      {:ok, _} = CommonAPI.favorite(user2, activity.id)        {:ok, _bookmark} = Pleroma.Bookmark.create(user2.id, activity.id)        {:ok, reblog_activity1, _object} = CommonAPI.repeat(activity.id, user1)        {:ok, _, _object} = CommonAPI.repeat(activity.id, user2) @@ -626,12 +808,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        assert to_string(activity.id) == id      end - -    test "returns 400 error when activity is not exist", %{conn: conn} do -      conn = post(conn, "/api/v1/statuses/foo/reblog") - -      assert json_response(conn, 400) == %{"error" => "Could not repeat"} -    end    end    describe "unreblogging" do @@ -649,10 +825,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        assert to_string(activity.id) == id      end -    test "returns 400 error when activity is not exist", %{conn: conn} do +    test "returns 404 error when activity does not exist", %{conn: conn} do        conn = post(conn, "/api/v1/statuses/foo/unreblog") -      assert json_response(conn, 400) == %{"error" => "Could not unrepeat"} +      assert json_response(conn, 404) == %{"error" => "Record not found"}      end    end @@ -674,13 +850,17 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        activity = insert(:note_activity)        post(conn, "/api/v1/statuses/#{activity.id}/favourite") -      assert post(conn, "/api/v1/statuses/#{activity.id}/favourite") |> json_response(200) + +      assert post(conn, "/api/v1/statuses/#{activity.id}/favourite") +             |> json_response(200)      end -    test "returns 400 error for a wrong id", %{conn: conn} do -      conn = post(conn, "/api/v1/statuses/1/favourite") +    test "returns 404 error for a wrong id", %{conn: conn} do +      conn = +        conn +        |> post("/api/v1/statuses/1/favourite") -      assert json_response(conn, 400) == %{"error" => "Could not favorite"} +      assert json_response(conn, 404) == %{"error" => "Record not found"}      end    end @@ -690,7 +870,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      test "unfavorites a status and returns it", %{user: user, conn: conn} do        activity = insert(:note_activity) -      {:ok, _, _} = CommonAPI.favorite(activity.id, user) +      {:ok, _} = CommonAPI.favorite(user, activity.id)        conn = post(conn, "/api/v1/statuses/#{activity.id}/unfavourite") @@ -700,10 +880,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        assert to_string(activity.id) == id      end -    test "returns 400 error for a wrong id", %{conn: conn} do +    test "returns 404 error for a wrong id", %{conn: conn} do        conn = post(conn, "/api/v1/statuses/1/unfavourite") -      assert json_response(conn, 400) == %{"error" => "Could not unfavorite"} +      assert json_response(conn, 404) == %{"error" => "Record not found"}      end    end @@ -716,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) @@ -869,6 +1047,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do    end    test "bookmarks" do +    bookmarks_uri = "/api/v1/bookmarks?with_relationships=true" +      %{conn: conn} = oauth_access(["write:bookmarks", "read:bookmarks"])      author = insert(:user) @@ -890,7 +1070,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      assert json_response(response2, 200)["bookmarked"] == true -    bookmarks = get(conn, "/api/v1/bookmarks") +    bookmarks = get(conn, bookmarks_uri)      assert [json_response(response2, 200), json_response(response1, 200)] ==               json_response(bookmarks, 200) @@ -899,7 +1079,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      assert json_response(response1, 200)["bookmarked"] == false -    bookmarks = get(conn, "/api/v1/bookmarks") +    bookmarks = get(conn, bookmarks_uri)      assert [json_response(response2, 200)] == json_response(bookmarks, 200)    end @@ -1002,7 +1182,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      test "returns users who have favorited the status", %{conn: conn, activity: activity} do        other_user = insert(:user) -      {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) +      {:ok, _} = CommonAPI.favorite(other_user, activity.id)        response =          conn @@ -1033,7 +1213,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        other_user = insert(:user)        {:ok, _user_relationship} = User.block(user, other_user) -      {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) +      {:ok, _} = CommonAPI.favorite(other_user, activity.id)        response =          conn @@ -1045,7 +1225,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      test "does not fail on an unauthenticated request", %{activity: activity} do        other_user = insert(:user) -      {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) +      {:ok, _} = CommonAPI.favorite(other_user, activity.id)        response =          build_conn() @@ -1065,7 +1245,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do            "visibility" => "direct"          }) -      {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) +      {:ok, _} = CommonAPI.favorite(other_user, activity.id)        favourited_by_url = "/api/v1/statuses/#{activity.id}/favourited_by" @@ -1225,7 +1405,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      {:ok, _} = CommonAPI.post(other_user, %{"status" => "bla"})      {:ok, activity} = CommonAPI.post(other_user, %{"status" => "traps are happy"}) -    {:ok, _, _} = CommonAPI.favorite(activity.id, user) +    {:ok, _} = CommonAPI.favorite(user, activity.id)      first_conn = get(conn, "/api/v1/favourites") @@ -1242,7 +1422,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do            "Trees Are Never Sad Look At Them Every Once In Awhile They're Quite Beautiful."        }) -    {:ok, _, _} = CommonAPI.favorite(second_activity.id, user) +    {:ok, _} = CommonAPI.favorite(user, second_activity.id)      last_like = status["id"] diff --git a/test/web/mastodon_api/controllers/subscription_controller_test.exs b/test/web/mastodon_api/controllers/subscription_controller_test.exs index 7dfb02f63..5682498c0 100644 --- a/test/web/mastodon_api/controllers/subscription_controller_test.exs +++ b/test/web/mastodon_api/controllers/subscription_controller_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do @@ -35,7 +35,10 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do      quote do        vapid_details = Application.get_env(:web_push_encryption, :vapid_details, [])        Application.put_env(:web_push_encryption, :vapid_details, []) -      assert "Something went wrong" == unquote(yield) + +      assert %{"error" => "Web push subscription is disabled on this Pleroma instance"} == +               unquote(yield) +        Application.put_env(:web_push_encryption, :vapid_details, vapid_details)      end    end @@ -45,7 +48,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        assert_error_when_disable_push do          conn          |> post("/api/v1/push/subscription", %{}) -        |> json_response(500) +        |> json_response(403)        end      end @@ -74,7 +77,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        assert_error_when_disable_push do          conn          |> get("/api/v1/push/subscription", %{}) -        |> json_response(500) +        |> json_response(403)        end      end @@ -127,7 +130,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        assert_error_when_disable_push do          conn          |> put("/api/v1/push/subscription", %{data: %{"alerts" => %{"mention" => false}}}) -        |> json_response(500) +        |> json_response(403)        end      end @@ -155,7 +158,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        assert_error_when_disable_push do          conn          |> delete("/api/v1/push/subscription", %{}) -        |> json_response(500) +        |> json_response(403)        end      end diff --git a/test/web/mastodon_api/controllers/suggestion_controller_test.exs b/test/web/mastodon_api/controllers/suggestion_controller_test.exs index c697a39f8..8d0e70db8 100644 --- a/test/web/mastodon_api/controllers/suggestion_controller_test.exs +++ b/test/web/mastodon_api/controllers/suggestion_controller_test.exs @@ -7,34 +7,8 @@ defmodule Pleroma.Web.MastodonAPI.SuggestionControllerTest do    alias Pleroma.Config -  import Pleroma.Factory -  import Tesla.Mock -    setup do: oauth_access(["read"]) -  setup %{user: user} do -    other_user = insert(:user) -    host = Config.get([Pleroma.Web.Endpoint, :url, :host]) -    url500 = "http://test500?#{host}&#{user.nickname}" -    url200 = "http://test200?#{host}&#{user.nickname}" - -    mock(fn -      %{method: :get, url: ^url500} -> -        %Tesla.Env{status: 500, body: "bad request"} - -      %{method: :get, url: ^url200} -> -        %Tesla.Env{ -          status: 200, -          body: -            ~s([{"acct":"yj455","avatar":"https://social.heldscal.la/avatar/201.jpeg","avatar_static":"https://social.heldscal.la/avatar/s/201.jpeg"}, {"acct":"#{ -              other_user.ap_id -            }","avatar":"https://social.heldscal.la/avatar/202.jpeg","avatar_static":"https://social.heldscal.la/avatar/s/202.jpeg"}]) -        } -    end) - -    [other_user: other_user] -  end -    test "returns empty result", %{conn: conn} do      res =        conn diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index 2c03b0a75..06efdc901 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 @@ -22,20 +20,91 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do    describe "home" do      setup do: oauth_access(["read:statuses"]) +    test "does NOT render account/pleroma/relationship if this is disabled by default", %{ +      user: user, +      conn: conn +    } do +      clear_config([:extensions, :output_relationships_in_statuses_by_default], false) + +      other_user = insert(:user) + +      {:ok, _} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) + +      response = +        conn +        |> assign(:user, user) +        |> get("/api/v1/timelines/home") +        |> json_response(200) + +      assert Enum.all?(response, fn n -> +               get_in(n, ["account", "pleroma", "relationship"]) == %{} +             end) +    end +      test "the home timeline", %{user: user, conn: conn} do -      following = insert(:user) +      uri = "/api/v1/timelines/home?with_relationships=true" -      {:ok, _activity} = CommonAPI.post(following, %{"status" => "test"}) +      following = insert(:user, nickname: "followed") +      third_user = insert(:user, nickname: "repeated") -      ret_conn = get(conn, "/api/v1/timelines/home") +      {: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, uri)        assert Enum.empty?(json_response(ret_conn, :ok))        {:ok, _user} = User.follow(user, following) -      conn = get(conn, "/api/v1/timelines/home") - -      assert [%{"content" => "test"}] = json_response(conn, :ok) +      ret_conn = get(conn, uri) + +      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, uri) + +      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 +149,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 +162,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/mastodon_api_test.exs b/test/web/mastodon_api/mastodon_api_test.exs index 561ef05aa..cb971806a 100644 --- a/test/web/mastodon_api/mastodon_api_test.exs +++ b/test/web/mastodon_api/mastodon_api_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.MastodonAPITest do diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index d60ed7b64..85fa4f6a2 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -4,22 +4,21 @@  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 -  test "Represent a user account" do -    source_data = %{ -      "tag" => [ -        %{ -          "type" => "Emoji", -          "icon" => %{"url" => "/file.png"}, -          "name" => ":karjalanpiirakka:" -        } -      ] -    } +  import Pleroma.Factory +  import Tesla.Mock +  setup do +    mock(fn env -> apply(HttpRequestMock, :request, [env]) end) +    :ok +  end + +  test "Represent a user account" do      background_image = %{        "url" => [%{"href" => "https://example.com/images/asuka_hospital.png"}]      } @@ -28,12 +27,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        insert(:user, %{          follower_count: 3,          note_count: 5, -        source_data: source_data,          background: background_image,          nickname: "shp@shitposter.club",          name: ":karjalanpiirakka: shp", -        bio: "<script src=\"invalid-html\"></script><span>valid html</span>", -        inserted_at: ~N[2017-08-15 15:47:06.597036] +        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], +        emoji: %{"karjalanpiirakka" => "/file.png"}        })      expected = %{ @@ -46,7 +46,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 +63,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", @@ -107,7 +107,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        insert(:user, %{          follower_count: 3,          note_count: 5, -        source_data: %{},          actor_type: "Service",          nickname: "shp@shitposter.club",          inserted_at: ~N[2017-08-15 15:47:06.597036] @@ -160,6 +159,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 +191,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 +227,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 +253,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 +268,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 +285,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 @@ -281,7 +300,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        insert(:user, %{          follower_count: 0,          note_count: 5, -        source_data: %{},          actor_type: "Service",          nickname: "shp@shitposter.club",          inserted_at: ~N[2017-08-15 15:47:06.597036] diff --git a/test/web/mastodon_api/views/conversation_view_test.exs b/test/web/mastodon_api/views/conversation_view_test.exs index 6ed22597d..dbf3c51e2 100644 --- a/test/web/mastodon_api/views/conversation_view_test.exs +++ b/test/web/mastodon_api/views/conversation_view_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.ConversationViewTest do diff --git a/test/web/mastodon_api/views/list_view_test.exs b/test/web/mastodon_api/views/list_view_test.exs index 59e896a7c..ca99242cb 100644 --- a/test/web/mastodon_api/views/list_view_test.exs +++ b/test/web/mastodon_api/views/list_view_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.ListViewTest do diff --git a/test/web/mastodon_api/views/marker_view_test.exs b/test/web/mastodon_api/views/marker_view_test.exs index 8a5c89d56..893cf8857 100644 --- a/test/web/mastodon_api/views/marker_view_test.exs +++ b/test/web/mastodon_api/views/marker_view_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.MarkerViewTest do diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index 4df9c3c03..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,17 +47,14 @@ 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      user = insert(:user)      another_user = insert(:user)      {:ok, create_activity} = CommonAPI.post(user, %{"status" => "hey"}) -    {:ok, favorite_activity, _object} = CommonAPI.favorite(create_activity.id, another_user) +    {:ok, favorite_activity} = CommonAPI.favorite(another_user, create_activity.id)      {:ok, [notification]} = Notification.create_notifications(favorite_activity)      create_activity = Activity.get_by_id(create_activity.id) @@ -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() @@ -120,7 +137,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do      old_user = refresh_record(old_user)      new_user = refresh_record(new_user) -    [notification] = Notification.for_user(follower, %{with_move: true}) +    [notification] = Notification.for_user(follower)      expected = %{        id: to_string(notification.id), @@ -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/poll_view_test.exs b/test/web/mastodon_api/views/poll_view_test.exs index 8cd7636a5..6211fa888 100644 --- a/test/web/mastodon_api/views/poll_view_test.exs +++ b/test/web/mastodon_api/views/poll_view_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.PollViewTest do diff --git a/test/web/mastodon_api/views/scheduled_activity_view_test.exs b/test/web/mastodon_api/views/scheduled_activity_view_test.exs index 6387e4555..0c0987593 100644 --- a/test/web/mastodon_api/views/scheduled_activity_view_test.exs +++ b/test/web/mastodon_api/views/scheduled_activity_view_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.ScheduledActivityViewTest do 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/mastodon_api/views/push_subscription_view_test.exs b/test/web/mastodon_api/views/subscription_view_test.exs index 4e4f5b7e6..981524c0e 100644 --- a/test/web/mastodon_api/views/push_subscription_view_test.exs +++ b/test/web/mastodon_api/views/subscription_view_test.exs @@ -1,11 +1,11 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.MastodonAPI.PushSubscriptionViewTest do +defmodule Pleroma.Web.MastodonAPI.SubscriptionViewTest do    use Pleroma.DataCase    import Pleroma.Factory -  alias Pleroma.Web.MastodonAPI.PushSubscriptionView, as: View +  alias Pleroma.Web.MastodonAPI.SubscriptionView, as: View    alias Pleroma.Web.Push    test "Represent a subscription" do @@ -18,6 +18,6 @@ defmodule Pleroma.Web.MastodonAPI.PushSubscriptionViewTest do        server_key: Keyword.get(Push.vapid_config(), :public_key)      } -    assert expected == View.render("push_subscription.json", %{subscription: subscription}) +    assert expected == View.render("show.json", %{subscription: subscription})    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 f035dfeee..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) @@ -52,9 +52,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do      url = Pleroma.Web.MediaProxy.encode_url("https://google.fn/test.png")      invalid_url = String.replace(url, "test.png", "test-file.png")      response = get(conn, invalid_url) -    html = "<html><body>You are being <a href=\"#{url}\">redirected</a>.</body></html>"      assert response.status == 302 -    assert response.resp_body == html +    assert redirected_to(response) == url    end    test "it performs ReverseProxy.call when signature valid", %{conn: conn} do 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/feed_test.exs b/test/web/metadata/feed_test.exs index 50e9ce52e..e6e5cc5ed 100644 --- a/test/web/metadata/feed_test.exs +++ b/test/web/metadata/feed_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Metadata.Providers.FeedTest 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/player_view_test.exs b/test/web/metadata/player_view_test.exs index 742b0ed8b..e6c990242 100644 --- a/test/web/metadata/player_view_test.exs +++ b/test/web/metadata/player_view_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Metadata.PlayerViewTest do diff --git a/test/web/metadata/rel_me_test.exs b/test/web/metadata/rel_me_test.exs index 3874e077b..4107a8459 100644 --- a/test/web/metadata/rel_me_test.exs +++ b/test/web/metadata/rel_me_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Metadata.Providers.RelMeTest do 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/mongooseim/mongoose_im_controller_test.exs b/test/web/mongooseim/mongoose_im_controller_test.exs index eb83999bb..291ae54fc 100644 --- a/test/web/mongooseim/mongoose_im_controller_test.exs +++ b/test/web/mongooseim/mongoose_im_controller_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MongooseIMController do 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/authorization_test.exs b/test/web/oauth/authorization_test.exs index 2e82a7b79..d74b26cf8 100644 --- a/test/web/oauth/authorization_test.exs +++ b/test/web/oauth/authorization_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.OAuth.AuthorizationTest do diff --git a/test/web/oauth/ldap_authorization_test.exs b/test/web/oauth/ldap_authorization_test.exs index 1cbe133b7..a8fe8a841 100644 --- a/test/web/oauth/ldap_authorization_test.exs +++ b/test/web/oauth/ldap_authorization_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.OAuth.LDAPAuthorizationTest do @@ -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/oauth/token/utils_test.exs b/test/web/oauth/token/utils_test.exs index dc1f9a986..a610d92f8 100644 --- a/test/web/oauth/token/utils_test.exs +++ b/test/web/oauth/token/utils_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.OAuth.Token.UtilsTest do diff --git a/test/web/oauth/token_test.exs b/test/web/oauth/token_test.exs index 5359940f8..40d71eb59 100644 --- a/test/web/oauth/token_test.exs +++ b/test/web/oauth/token_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.OAuth.TokenTest do diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index 50235dfef..bb349cb19 100644 --- a/test/web/ostatus/ostatus_controller_test.exs +++ b/test/web/ostatus/ostatus_controller_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.OStatus.OStatusControllerTest do @@ -7,6 +7,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do    import Pleroma.Factory +  alias Pleroma.Config    alias Pleroma.Object    alias Pleroma.User    alias Pleroma.Web.CommonAPI @@ -16,22 +17,22 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do      :ok    end -  clear_config_all([:instance, :federating]) do -    Pleroma.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 +    setup %{conn: conn} do +      conn = put_req_header(conn, "accept", "text/html") +      %{conn: conn} +    end -  describe "GET object/2" do      test "redirects to /notice/id for html format", %{conn: conn} do        note_activity = insert(:note_activity)        object = Object.normalize(note_activity)        [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, object.data["id"]))        url = "/objects/#{uuid}" -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get(url) - +      conn = get(conn, url)        assert redirected_to(conn) == "/notice/#{note_activity.id}"      end @@ -45,23 +46,25 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        |> response(404)      end -    test "404s on nonexisting objects", %{conn: conn} do +    test "404s on non-existing objects", %{conn: conn} do        conn        |> get("/objects/123")        |> response(404)      end    end -  describe "GET activity/2" do +  # Note: see ActivityPubControllerTest for JSON format tests +  describe "GET /activities/:uuid (text/html)" do +    setup %{conn: conn} do +      conn = put_req_header(conn, "accept", "text/html") +      %{conn: conn} +    end +      test "redirects to /notice/id for html format", %{conn: conn} do        note_activity = insert(:note_activity)        [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"])) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/activities/#{uuid}") - +      conn = get(conn, "/activities/#{uuid}")        assert redirected_to(conn) == "/notice/#{note_activity.id}"      end @@ -79,19 +82,6 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        |> get("/activities/123")        |> response(404)      end - -    test "gets an activity in AS2 format", %{conn: conn} do -      note_activity = insert(:note_activity) -      [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"])) -      url = "/activities/#{uuid}" - -      conn = -        conn -        |> put_req_header("accept", "application/activity+json") -        |> get(url) - -      assert json_response(conn, 200) -    end    end    describe "GET notice/2" do @@ -146,7 +136,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        user = insert(:user) -      {:ok, like_activity, _} = CommonAPI.favorite(note_activity.id, user) +      {:ok, like_activity} = CommonAPI.favorite(user, note_activity.id)        assert like_activity.data["type"] == "Like" @@ -170,7 +160,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        assert response(conn, 404)      end -    test "404s a nonexisting notice", %{conn: conn} do +    test "404s a non-existing notice", %{conn: conn} do        url = "/notice/123"        conn = @@ -179,10 +169,21 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        assert response(conn, 404)      end + +    test "it requires authentication if instance is NOT federating", %{ +      conn: conn +    } do +      user = insert(:user) +      note_activity = insert(:note_activity) + +      conn = put_req_header(conn, "accept", "text/html") + +      ensure_federating_or_authenticated(conn, "/notice/#{note_activity.id}", user) +    end    end    describe "GET /notice/:id/embed_player" do -    test "render embed player", %{conn: conn} do +    setup do        note_activity = insert(:note_activity)        object = Pleroma.Object.normalize(note_activity) @@ -204,9 +205,11 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        |> Ecto.Changeset.change(data: object_data)        |> Pleroma.Repo.update() -      conn = -        conn -        |> get("/notice/#{note_activity.id}/embed_player") +      %{note_activity: note_activity} +    end + +    test "renders embed player", %{conn: conn, note_activity: note_activity} do +      conn = get(conn, "/notice/#{note_activity.id}/embed_player")        assert Plug.Conn.get_resp_header(conn, "x-frame-options") == ["ALLOW"] @@ -272,9 +275,19 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        |> Ecto.Changeset.change(data: object_data)        |> Pleroma.Repo.update() -      assert conn -             |> get("/notice/#{note_activity.id}/embed_player") -             |> response(404) +      conn +      |> get("/notice/#{note_activity.id}/embed_player") +      |> response(404) +    end + +    test "it requires authentication if instance is NOT federating", %{ +      conn: conn, +      note_activity: note_activity +    } do +      user = insert(:user) +      conn = put_req_header(conn, "accept", "text/html") + +      ensure_federating_or_authenticated(conn, "/notice/#{note_activity.id}/embed_player", user)      end    end  end diff --git a/test/web/pleroma_api/controllers/account_controller_test.exs b/test/web/pleroma_api/controllers/account_controller_test.exs index 245cc1579..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 @@ -140,7 +138,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do        user: user      } do        [activity | _] = insert_pair(:note_activity) -      CommonAPI.favorite(activity.id, user) +      CommonAPI.favorite(user, activity.id)        response =          conn @@ -157,7 +155,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do        user: user      } do        activity = insert(:note_activity) -      CommonAPI.favorite(activity.id, user) +      CommonAPI.favorite(user, activity.id)        build_conn()        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") @@ -174,7 +172,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do            "visibility" => "direct"          }) -      CommonAPI.favorite(direct.id, user) +      CommonAPI.favorite(user, direct.id)        for u <- [user, current_user] do          response = @@ -204,7 +202,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do            "visibility" => "direct"          }) -      CommonAPI.favorite(direct.id, user) +      CommonAPI.favorite(user, direct.id)        response =          conn @@ -221,7 +219,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do        activities = insert_list(10, :note_activity)        Enum.each(activities, fn activity -> -        CommonAPI.favorite(activity.id, user) +        CommonAPI.favorite(user, activity.id)        end)        third_activity = Enum.at(activities, 2) @@ -247,7 +245,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do        7        |> insert_list(:note_activity)        |> Enum.each(fn activity -> -        CommonAPI.favorite(activity.id, user) +        CommonAPI.favorite(user, activity.id)        end)        response = @@ -279,7 +277,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do      test "returns 403 error when user has hidden own favorites", %{conn: conn} do        user = insert(:user, hide_favorites: true)        activity = insert(:note_activity) -      CommonAPI.favorite(activity.id, user) +      CommonAPI.favorite(user, activity.id)        conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites") @@ -289,7 +287,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do      test "hides favorites for new users by default", %{conn: conn} do        user = insert(:user)        activity = insert(:note_activity) -      CommonAPI.favorite(activity.id, user) +      CommonAPI.favorite(user, activity.id)        assert user.hide_favorites        conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites") 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/pleroma_api/controllers/pleroma_api_controller_test.exs b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs index 32250f06f..61a1689b9 100644 --- a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs @@ -169,6 +169,23 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do      id_one = activity.id      id_two = activity_two.id      assert [%{"id" => ^id_one}, %{"id" => ^id_two}] = result + +    {:ok, %{id: id_three}} = +      CommonAPI.post(other_user, %{ +        "status" => "Bye!", +        "in_reply_to_status_id" => activity.id, +        "in_reply_to_conversation_id" => participation.id +      }) + +    assert [%{"id" => ^id_two}, %{"id" => ^id_three}] = +             conn +             |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?limit=2") +             |> json_response(:ok) + +    assert [%{"id" => ^id_three}] = +             conn +             |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?min_id=#{id_two}") +             |> json_response(:ok)    end    test "PATCH /api/v1/pleroma/conversations/:id" do @@ -203,7 +220,7 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do    test "POST /api/v1/pleroma/conversations/read" do      user = insert(:user) -    %{user: other_user, conn: conn} = oauth_access(["write:notifications"]) +    %{user: other_user, conn: conn} = oauth_access(["write:conversations"])      {:ok, _activity} =        CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}", "visibility" => "direct"}) 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 089d55577..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" @@ -170,7 +170,7 @@ defmodule Pleroma.Web.Push.ImplTest do            "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."        }) -    {:ok, activity, _} = CommonAPI.favorite(activity.id, user) +    {:ok, activity} = CommonAPI.favorite(user, activity.id)      object = Object.normalize(activity)      assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has favorited your post" diff --git a/test/web/rel_me_test.exs b/test/web/rel_me_test.exs index 77b5d5dc6..e05a8863d 100644 --- a/test/web/rel_me_test.exs +++ b/test/web/rel_me_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.RelMeTest do diff --git a/test/web/rich_media/aws_signed_url_test.exs b/test/web/rich_media/aws_signed_url_test.exs index a3a50cbb1..b30f4400e 100644 --- a/test/web/rich_media/aws_signed_url_test.exs +++ b/test/web/rich_media/aws_signed_url_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.RichMedia.TTL.AwsSignedUrlTest do diff --git a/test/web/rich_media/helpers_test.exs b/test/web/rich_media/helpers_test.exs index 48884319d..aa0c5c830 100644 --- a/test/web/rich_media/helpers_test.exs +++ b/test/web/rich_media/helpers_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.RichMedia.HelpersTest do @@ -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/rich_media/parser_test.exs b/test/web/rich_media/parser_test.exs index b75bdf96f..e54a13bc8 100644 --- a/test/web/rich_media/parser_test.exs +++ b/test/web/rich_media/parser_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.RichMedia.ParserTest do diff --git a/test/web/static_fe/static_fe_controller_test.exs b/test/web/static_fe/static_fe_controller_test.exs index 2ce8f9fa3..430683ea0 100644 --- a/test/web/static_fe/static_fe_controller_test.exs +++ b/test/web/static_fe/static_fe_controller_test.exs @@ -1,56 +1,41 @@  defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do    use Pleroma.Web.ConnCase +    alias Pleroma.Activity +  alias Pleroma.Config    alias Pleroma.Web.ActivityPub.Transmogrifier    alias Pleroma.Web.CommonAPI    import Pleroma.Factory -  clear_config_all([:static_fe, :enabled]) do -    Pleroma.Config.put([:static_fe, :enabled], true) -  end - -  describe "user profile page" do -    test "just the profile as HTML", %{conn: conn} do -      user = insert(:user) - -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/users/#{user.nickname}") +  setup_all do: clear_config([:static_fe, :enabled], true) +  setup do: clear_config([:instance, :federating], true) -      assert html_response(conn, 200) =~ user.nickname -    end +  setup %{conn: conn} do +    conn = put_req_header(conn, "accept", "text/html") +    user = insert(:user) -    test "renders json unless there's an html accept header", %{conn: conn} do -      user = insert(:user) +    %{conn: conn, user: user} +  end -      conn = -        conn -        |> put_req_header("accept", "application/json") -        |> get("/users/#{user.nickname}") +  describe "user profile html" do +    test "just the profile as HTML", %{conn: conn, user: user} do +      conn = get(conn, "/users/#{user.nickname}") -      assert json_response(conn, 200) +      assert html_response(conn, 200) =~ user.nickname      end      test "404 when user not found", %{conn: conn} do -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/users/limpopo") +      conn = get(conn, "/users/limpopo")        assert html_response(conn, 404) =~ "not found"      end -    test "profile does not include private messages", %{conn: conn} do -      user = insert(:user) +    test "profile does not include private messages", %{conn: conn, user: user} do        CommonAPI.post(user, %{"status" => "public"})        CommonAPI.post(user, %{"status" => "private", "visibility" => "private"}) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/users/#{user.nickname}") +      conn = get(conn, "/users/#{user.nickname}")        html = html_response(conn, 200) @@ -58,14 +43,10 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do        refute html =~ ">private<"      end -    test "pagination", %{conn: conn} do -      user = insert(:user) +    test "pagination", %{conn: conn, user: user} do        Enum.map(1..30, fn i -> CommonAPI.post(user, %{"status" => "test#{i}"}) end) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/users/#{user.nickname}") +      conn = get(conn, "/users/#{user.nickname}")        html = html_response(conn, 200) @@ -75,15 +56,11 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do        refute html =~ ">test1<"      end -    test "pagination, page 2", %{conn: conn} do -      user = insert(:user) +    test "pagination, page 2", %{conn: conn, user: user} do        activities = Enum.map(1..30, fn i -> CommonAPI.post(user, %{"status" => "test#{i}"}) end)        {:ok, a11} = Enum.at(activities, 11) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/users/#{user.nickname}?max_id=#{a11.id}") +      conn = get(conn, "/users/#{user.nickname}?max_id=#{a11.id}")        html = html_response(conn, 200) @@ -92,17 +69,17 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do        refute html =~ ">test20<"        refute html =~ ">test29<"      end + +    test "it requires authentication if instance is NOT federating", %{conn: conn, user: user} do +      ensure_federating_or_authenticated(conn, "/users/#{user.nickname}", user) +    end    end -  describe "notice rendering" do -    test "single notice page", %{conn: conn} do -      user = insert(:user) +  describe "notice html" do +    test "single notice page", %{conn: conn, user: user} do        {:ok, activity} = CommonAPI.post(user, %{"status" => "testing a thing!"}) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/notice/#{activity.id}") +      conn = get(conn, "/notice/#{activity.id}")        html = html_response(conn, 200)        assert html =~ "<header>" @@ -110,8 +87,20 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do        assert html =~ "testing a thing!"      end -    test "shows the whole thread", %{conn: conn} do +    test "filters HTML tags", %{conn: conn} do        user = insert(:user) +      {:ok, activity} = CommonAPI.post(user, %{"status" => "<script>alert('xss')</script>"}) + +      conn = +        conn +        |> put_req_header("accept", "text/html") +        |> get("/notice/#{activity.id}") + +      html = html_response(conn, 200) +      assert html =~ ~s[<script>alert('xss')</script>] +    end + +    test "shows the whole thread", %{conn: conn, user: user} do        {:ok, activity} = CommonAPI.post(user, %{"status" => "space: the final frontier"})        CommonAPI.post(user, %{ @@ -119,70 +108,47 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do          "in_reply_to_status_id" => activity.id        }) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/notice/#{activity.id}") +      conn = get(conn, "/notice/#{activity.id}")        html = html_response(conn, 200)        assert html =~ "the final frontier"        assert html =~ "voyages"      end -    test "redirect by AP object ID", %{conn: conn} do -      user = insert(:user) - +    test "redirect by AP object ID", %{conn: conn, user: user} do        {:ok, %Activity{data: %{"object" => object_url}}} =          CommonAPI.post(user, %{"status" => "beam me up"}) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get(URI.parse(object_url).path) +      conn = get(conn, URI.parse(object_url).path)        assert html_response(conn, 302) =~ "redirected"      end -    test "redirect by activity ID", %{conn: conn} do -      user = insert(:user) - +    test "redirect by activity ID", %{conn: conn, user: user} do        {:ok, %Activity{data: %{"id" => id}}} =          CommonAPI.post(user, %{"status" => "I'm a doctor, not a devops!"}) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get(URI.parse(id).path) +      conn = get(conn, URI.parse(id).path)        assert html_response(conn, 302) =~ "redirected"      end      test "404 when notice not found", %{conn: conn} do -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/notice/88c9c317") +      conn = get(conn, "/notice/88c9c317")        assert html_response(conn, 404) =~ "not found"      end -    test "404 for private status", %{conn: conn} do -      user = insert(:user) - +    test "404 for private status", %{conn: conn, user: user} do        {:ok, activity} =          CommonAPI.post(user, %{"status" => "don't show me!", "visibility" => "private"}) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/notice/#{activity.id}") +      conn = get(conn, "/notice/#{activity.id}")        assert html_response(conn, 404) =~ "not found"      end -    test "302 for remote cached status", %{conn: conn} do -      user = insert(:user) - +    test "302 for remote cached status", %{conn: conn, user: user} do        message = %{          "@context" => "https://www.w3.org/ns/activitystreams",          "to" => user.follower_address, @@ -199,12 +165,15 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do        assert {:ok, activity} = Transmogrifier.handle_incoming(message) -      conn = -        conn -        |> put_req_header("accept", "text/html") -        |> get("/notice/#{activity.id}") +      conn = get(conn, "/notice/#{activity.id}")        assert html_response(conn, 302) =~ "redirected"      end + +    test "it requires authentication if instance is NOT federating", %{conn: conn, user: user} do +      {:ok, activity} = CommonAPI.post(user, %{"status" => "testing a thing!"}) + +      ensure_federating_or_authenticated(conn, "/notice/#{activity.id}", user) +    end    end  end diff --git a/test/web/streamer/ping_test.exs b/test/web/streamer/ping_test.exs index 3d52c00e4..5df6c1cc3 100644 --- a/test/web/streamer/ping_test.exs +++ b/test/web/streamer/ping_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.PingTest do diff --git a/test/web/streamer/state_test.exs b/test/web/streamer/state_test.exs index d1aeac541..a755e75c0 100644 --- a/test/web/streamer/state_test.exs +++ b/test/web/streamer/state_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.StateTest do diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index 339f99bbf..eb082b79f 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 @@ -65,9 +64,6 @@ 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( @@ -75,6 +71,9 @@ defmodule Pleroma.Web.StreamerTest do          %{transport_pid: task.pid, assigns: %{user: user}}        ) +      {:ok, activity} = CommonAPI.post(user, %{"status" => ":("}) +      {:ok, notif} = CommonAPI.favorite(blocked, activity.id) +        Streamer.stream("user:notification", notif)        Task.await(task)      end @@ -84,10 +83,6 @@ defmodule Pleroma.Web.StreamerTest do      } 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( @@ -95,6 +90,10 @@ 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(user2, activity.id) +        Streamer.stream("user:notification", notif)        Task.await(task)      end @@ -104,10 +103,6 @@ defmodule Pleroma.Web.StreamerTest do      } 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( @@ -115,6 +110,10 @@ 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(user2, activity.id) +        Streamer.stream("user:notification", notif)        Task.await(task)      end @@ -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) @@ -198,7 +209,7 @@ defmodule Pleroma.Web.StreamerTest do        Pleroma.Config.put([:instance, :skip_thread_containment], false)        author = insert(:user)        user = insert(:user) -      User.follow(user, author, "accept") +      User.follow(user, author, :follow_accept)        activity =          insert(:note_activity, @@ -221,7 +232,7 @@ defmodule Pleroma.Web.StreamerTest do        Pleroma.Config.put([:instance, :skip_thread_containment], true)        author = insert(:user)        user = insert(:user) -      User.follow(user, author, "accept") +      User.follow(user, author, :follow_accept)        activity =          insert(:note_activity, @@ -244,7 +255,7 @@ defmodule Pleroma.Web.StreamerTest do        Pleroma.Config.put([:instance, :skip_thread_containment], false)        author = insert(:user)        user = insert(:user, skip_thread_containment: true) -      User.follow(user, author, "accept") +      User.follow(user, author, :follow_accept)        activity =          insert(:note_activity, @@ -465,7 +476,7 @@ defmodule Pleroma.Web.StreamerTest do      CommonAPI.hide_reblogs(user1, user2)      {:ok, create_activity} = CommonAPI.post(user3, %{"status" => "I'm kawen"}) -    {:ok, favorite_activity, _} = CommonAPI.favorite(create_activity.id, user2) +    {:ok, favorite_activity} = CommonAPI.favorite(user2, create_activity.id)      task =        Task.async(fn -> diff --git a/test/web/twitter_api/remote_follow_controller_test.exs b/test/web/twitter_api/remote_follow_controller_test.exs index 80a42989d..5ff8694a8 100644 --- a/test/web/twitter_api/remote_follow_controller_test.exs +++ b/test/web/twitter_api/remote_follow_controller_test.exs @@ -5,8 +5,10 @@  defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do    use Pleroma.Web.ConnCase +  alias Pleroma.Config    alias Pleroma.User    alias Pleroma.Web.CommonAPI +    import ExUnit.CaptureLog    import Pleroma.Factory @@ -15,9 +17,10 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do      :ok    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..f6e13b661 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -109,7 +109,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      {:ok, user2} = TwitterAPI.register_user(data2)      expected_text = -      ~s(<span class="h-card"><a data-user="#{user1.id}" class="u-url mention" href="#{ +      ~s(<span class="h-card"><a class="u-url mention" data-user="#{user1.id}" href="#{          user1.ap_id        }" rel="ugc">@<span>john</span></a></span> test) @@ -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 d464ce215..30e54bebd 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    use Pleroma.Web.ConnCase    use Oban.Testing, repo: Pleroma.Repo +  alias Pleroma.Config    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User @@ -17,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"]) @@ -178,7 +179,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    describe "GET /api/statusnet/config" do      test "it returns config in xml format", %{conn: conn} do -      instance = Pleroma.Config.get(:instance) +      instance = Config.get(:instance)        response =          conn @@ -195,12 +196,12 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "it returns config in json format", %{conn: conn} do -      instance = Pleroma.Config.get(:instance) -      Pleroma.Config.put([:instance, :managed_config], true) -      Pleroma.Config.put([:instance, :registrations_open], false) -      Pleroma.Config.put([:instance, :invites_enabled], true) -      Pleroma.Config.put([:instance, :public], false) -      Pleroma.Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"}) +      instance = Config.get(:instance) +      Config.put([:instance, :managed_config], true) +      Config.put([:instance, :registrations_open], false) +      Config.put([:instance, :invites_enabled], true) +      Config.put([:instance, :public], false) +      Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"})        response =          conn @@ -234,7 +235,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "returns the state of safe_dm_mentions flag", %{conn: conn} do -      Pleroma.Config.put([:instance, :safe_dm_mentions], true) +      Config.put([:instance, :safe_dm_mentions], true)        response =          conn @@ -243,7 +244,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert response["site"]["safeDMMentionsEnabled"] == "1" -      Pleroma.Config.put([:instance, :safe_dm_mentions], false) +      Config.put([:instance, :safe_dm_mentions], false)        response =          conn @@ -254,8 +255,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "it returns the managed config", %{conn: conn} do -      Pleroma.Config.put([:instance, :managed_config], false) -      Pleroma.Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"}) +      Config.put([:instance, :managed_config], false) +      Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"})        response =          conn @@ -264,7 +265,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        refute response["site"]["pleromafe"] -      Pleroma.Config.put([:instance, :managed_config], true) +      Config.put([:instance, :managed_config], true)        response =          conn @@ -287,7 +288,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do          }        ] -      Pleroma.Config.put(:frontend_configurations, config) +      Config.put(:frontend_configurations, config)        response =          conn @@ -317,10 +318,10 @@ 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 -      Pleroma.Config.put([:instance, :healthcheck], false) +      Config.put([:instance, :healthcheck], false)        response =          conn @@ -331,7 +332,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "returns 200 when healthcheck enabled and all ok", %{conn: conn} do -      Pleroma.Config.put([:instance, :healthcheck], true) +      Config.put([:instance, :healthcheck], true)        with_mock Pleroma.Healthcheck,          system_info: fn -> %Pleroma.Healthcheck{healthy: true} end do @@ -351,7 +352,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "returns 503 when healthcheck enabled and health is false", %{conn: conn} do -      Pleroma.Config.put([:instance, :healthcheck], true) +      Config.put([:instance, :healthcheck], true)        with_mock Pleroma.Healthcheck,          system_info: fn -> %Pleroma.Healthcheck{healthy: false} end do @@ -426,6 +427,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    end    describe "POST /main/ostatus - remote_subscribe/2" do +    setup do: clear_config([:instance, :federating], true) +      test "renders subscribe form", %{conn: conn} do        user = insert(:user) diff --git a/test/web/uploader_controller_test.exs b/test/web/uploader_controller_test.exs index 7c7f9a6ea..21e518236 100644 --- a/test/web/uploader_controller_test.exs +++ b/test/web/uploader_controller_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.UploaderControllerTest do diff --git a/test/web/views/error_view_test.exs b/test/web/views/error_view_test.exs index 4e5398c83..8dbbd18b4 100644 --- a/test/web/views/error_view_test.exs +++ b/test/web/views/error_view_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ErrorViewTest do diff --git a/test/web/web_finger/web_finger_controller_test.exs b/test/web/web_finger/web_finger_controller_test.exs index 49cd1460b..0023f1e81 100644 --- a/test/web/web_finger/web_finger_controller_test.exs +++ b/test/web/web_finger/web_finger_controller_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do @@ -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 = diff --git a/test/web/web_finger/web_finger_test.exs b/test/web/web_finger/web_finger_test.exs index 5aa8c73cf..4b4282727 100644 --- a/test/web/web_finger/web_finger_test.exs +++ b/test/web/web_finger/web_finger_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.WebFingerTest do  | 
