diff options
Diffstat (limited to 'test/web/mastodon_api/controllers')
7 files changed, 208 insertions, 22 deletions
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 f67d294ba..b888e4c71 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 @@ -108,6 +108,13 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        assert user_data["locked"] == true      end +    test "updates the user's chat acceptance status", %{conn: conn} do +      conn = patch(conn, "/api/v1/accounts/update_credentials", %{accepts_chat_messages: "false"}) + +      assert user_data = json_response_and_validate_schema(conn, 200) +      assert user_data["pleroma"]["accepts_chat_messages"] == false +    end +      test "updates the user's allow_following_move", %{user: user, conn: conn} do        assert user.allow_following_move == true @@ -216,10 +223,21 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do          filename: "an_image.jpg"        } -      conn = patch(conn, "/api/v1/accounts/update_credentials", %{"avatar" => new_avatar}) +      assert user.avatar == %{} -      assert user_response = json_response_and_validate_schema(conn, 200) +      res = patch(conn, "/api/v1/accounts/update_credentials", %{"avatar" => new_avatar}) + +      assert user_response = json_response_and_validate_schema(res, 200)        assert user_response["avatar"] != User.avatar_url(user) + +      user = User.get_by_id(user.id) +      refute user.avatar == %{} + +      # Also resets it +      _res = patch(conn, "/api/v1/accounts/update_credentials", %{"avatar" => ""}) + +      user = User.get_by_id(user.id) +      assert user.avatar == nil      end      test "updates the user's banner", %{user: user, conn: conn} do @@ -229,26 +247,39 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do          filename: "an_image.jpg"        } -      conn = patch(conn, "/api/v1/accounts/update_credentials", %{"header" => new_header}) +      res = patch(conn, "/api/v1/accounts/update_credentials", %{"header" => new_header}) -      assert user_response = json_response_and_validate_schema(conn, 200) +      assert user_response = json_response_and_validate_schema(res, 200)        assert user_response["header"] != User.banner_url(user) + +      # Also resets it +      _res = patch(conn, "/api/v1/accounts/update_credentials", %{"header" => ""}) + +      user = User.get_by_id(user.id) +      assert user.banner == nil      end -    test "updates the user's background", %{conn: conn} do +    test "updates the user's background", %{conn: conn, user: user} do        new_header = %Plug.Upload{          content_type: "image/jpg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } -      conn = +      res =          patch(conn, "/api/v1/accounts/update_credentials", %{            "pleroma_background_image" => new_header          }) -      assert user_response = json_response_and_validate_schema(conn, 200) +      assert user_response = json_response_and_validate_schema(res, 200)        assert user_response["pleroma"]["background_image"] +      # +      # Also resets it +      _res = +        patch(conn, "/api/v1/accounts/update_credentials", %{"pleroma_background_image" => ""}) + +      user = User.get_by_id(user.id) +      assert user.background == nil      end      test "requires 'write:accounts' permission" do @@ -320,6 +351,30 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do               ]      end +    test "emojis in fields labels", %{conn: conn} do +      fields = [ +        %{"name" => ":firefox:", "value" => "is best 2hu"}, +        %{"name" => "they wins", "value" => ":blank:"} +      ] + +      account_data = +        conn +        |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) +        |> json_response_and_validate_schema(200) + +      assert account_data["fields"] == [ +               %{"name" => ":firefox:", "value" => "is best 2hu"}, +               %{"name" => "they wins", "value" => ":blank:"} +             ] + +      assert account_data["source"]["fields"] == [ +               %{"name" => ":firefox:", "value" => "is best 2hu"}, +               %{"name" => "they wins", "value" => ":blank:"} +             ] + +      assert [%{"shortcode" => "blank"}, %{"shortcode" => "firefox"}] = account_data["emojis"] +    end +      test "update fields via x-www-form-urlencoded", %{conn: conn} do        fields =          [ diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index ebfcedd01..9c7b5e9b2 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -708,7 +708,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        followed = insert(:user)        other_user = insert(:user) -      ret_conn = post(conn, "/api/v1/accounts/#{followed.id}/follow?reblogs=false") +      ret_conn = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/v1/accounts/#{followed.id}/follow", %{reblogs: false})        assert %{"showing_reblogs" => false} = json_response_and_validate_schema(ret_conn, 200) @@ -722,7 +725,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert %{"showing_reblogs" => true} =                 conn -               |> post("/api/v1/accounts/#{followed.id}/follow?reblogs=true") +               |> put_req_header("content-type", "application/json") +               |> post("/api/v1/accounts/#{followed.id}/follow", %{reblogs: true})                 |> json_response_and_validate_schema(200)        assert [%{"id" => ^reblog_id}] = @@ -731,6 +735,35 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do                 |> json_response(200)      end +    test "following with reblogs" do +      %{conn: conn} = oauth_access(["follow", "read:statuses"]) +      followed = insert(:user) +      other_user = insert(:user) + +      ret_conn = post(conn, "/api/v1/accounts/#{followed.id}/follow") + +      assert %{"showing_reblogs" => true} = json_response_and_validate_schema(ret_conn, 200) + +      {:ok, activity} = CommonAPI.post(other_user, %{status: "hey"}) +      {:ok, %{id: reblog_id}} = CommonAPI.repeat(activity.id, followed) + +      assert [%{"id" => ^reblog_id}] = +               conn +               |> get("/api/v1/timelines/home") +               |> json_response(200) + +      assert %{"showing_reblogs" => false} = +               conn +               |> put_req_header("content-type", "application/json") +               |> post("/api/v1/accounts/#{followed.id}/follow", %{reblogs: false}) +               |> json_response_and_validate_schema(200) + +      assert [] == +               conn +               |> get("/api/v1/timelines/home") +               |> json_response(200) +    end +      test "following / unfollowing errors", %{user: user, conn: conn} do        # self follow        conn_res = post(conn, "/api/v1/accounts/#{user.id}/follow") @@ -780,7 +813,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert %{"id" => _id, "muting" => true, "muting_notifications" => true} =                 conn -               |> put_req_header("content-type", "application/json")                 |> post("/api/v1/accounts/#{other_user.id}/mute")                 |> json_response_and_validate_schema(200) @@ -905,7 +937,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        %{          "access_token" => token,          "created_at" => _created_at, -        "scope" => _scope, +        "scope" => ^scope,          "token_type" => "Bearer"        } = json_response_and_validate_schema(conn, 200) @@ -1067,7 +1099,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert %{                 "access_token" => access_token,                 "created_at" => _, -               "scope" => ["read", "write", "follow", "push"], +               "scope" => "read write follow push",                 "token_type" => "Bearer"               } = response @@ -1185,7 +1217,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert %{                 "access_token" => access_token,                 "created_at" => _, -               "scope" => ["read"], +               "scope" => "read",                 "token_type" => "Bearer"               } =                 conn 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 44e12d15a..6749e0e83 100644 --- a/test/web/mastodon_api/controllers/follow_request_controller_test.exs +++ b/test/web/mastodon_api/controllers/follow_request_controller_test.exs @@ -6,7 +6,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do    use Pleroma.Web.ConnCase    alias Pleroma.User -  alias Pleroma.Web.ActivityPub.ActivityPub +  alias Pleroma.Web.CommonAPI    import Pleroma.Factory @@ -20,7 +20,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do      test "/api/v1/follow_requests works", %{user: user, conn: conn} do        other_user = insert(:user) -      {:ok, _activity} = ActivityPub.follow(other_user, user) +      {:ok, _, _, _activity} = CommonAPI.follow(other_user, user)        {:ok, other_user} = User.follow(other_user, user, :follow_pending)        assert User.following?(other_user, user) == false @@ -34,7 +34,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do      test "/api/v1/follow_requests/:id/authorize works", %{user: user, conn: conn} do        other_user = insert(:user) -      {:ok, _activity} = ActivityPub.follow(other_user, user) +      {:ok, _, _, _activity} = CommonAPI.follow(other_user, user)        {:ok, other_user} = User.follow(other_user, user, :follow_pending)        user = User.get_cached_by_id(user.id) @@ -56,7 +56,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do      test "/api/v1/follow_requests/:id/reject works", %{user: user, conn: conn} do        other_user = insert(:user) -      {:ok, _activity} = ActivityPub.follow(other_user, user) +      {:ok, _, _, _activity} = CommonAPI.follow(other_user, user)        user = User.get_cached_by_id(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 8bdfdddd1..cc880d82c 100644 --- a/test/web/mastodon_api/controllers/instance_controller_test.exs +++ b/test/web/mastodon_api/controllers/instance_controller_test.exs @@ -32,11 +32,15 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do               "avatar_upload_limit" => _,               "background_upload_limit" => _,               "banner_upload_limit" => _, -             "background_image" => _ +             "background_image" => _, +             "chat_limit" => _, +             "description_limit" => _             } = result +    assert result["pleroma"]["metadata"]["account_activation_required"] != nil      assert result["pleroma"]["metadata"]["features"]      assert result["pleroma"]["metadata"]["federation"] +    assert result["pleroma"]["metadata"]["fields_limits"]      assert result["pleroma"]["vapid_public_key"]      assert email == from_config_email diff --git a/test/web/mastodon_api/controllers/search_controller_test.exs b/test/web/mastodon_api/controllers/search_controller_test.exs index 826f37fbc..24d1959f8 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -79,6 +79,7 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do        assert status["id"] == to_string(activity.id)      end +    @tag capture_log: true      test "constructs hashtags from search query", %{conn: conn} do        results =          conn @@ -318,11 +319,13 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do      test "search fetches remote accounts", %{conn: conn} do        user = insert(:user) +      query = URI.encode_query(%{q: "       mike@osada.macgirvin.com          ", resolve: true}) +        results =          conn          |> assign(:user, user)          |> assign(:token, insert(:oauth_token, user: user, scopes: ["read"])) -        |> get("/api/v1/search?q=mike@osada.macgirvin.com&resolve=true") +        |> get("/api/v1/search?#{query}")          |> json_response_and_validate_schema(200)        [account] = results["accounts"] diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index a98e939e8..d34f300da 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -22,6 +22,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do    setup do: clear_config([:instance, :federating])    setup do: clear_config([:instance, :allow_relay])    setup do: clear_config([:rich_media, :enabled]) +  setup do: clear_config([:mrf, :policies]) +  setup do: clear_config([:mrf_keyword, :reject])    describe "posting statuses" do      setup do: oauth_access(["write:statuses"]) @@ -157,6 +159,17 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do                 |> json_response_and_validate_schema(422)      end +    test "Get MRF reason when posting a status is rejected by one", %{conn: conn} do +      Pleroma.Config.put([:mrf_keyword, :reject], ["GNO"]) +      Pleroma.Config.put([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.KeywordPolicy]) + +      assert %{"error" => "[KeywordPolicy] Matches with rejected keyword"} = +               conn +               |> put_req_header("content-type", "application/json") +               |> post("api/v1/statuses", %{"status" => "GNO/Linux"}) +               |> json_response_and_validate_schema(422) +    end +      test "posting an undefined status with an attachment", %{user: user, conn: conn} do        file = %Plug.Upload{          content_type: "image/jpg", @@ -760,13 +773,18 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      test "when you created it" do        %{user: author, conn: conn} = oauth_access(["write:statuses"])        activity = insert(:note_activity, user: author) +      object = Object.normalize(activity) -      conn = +      content = object.data["content"] +      source = object.data["source"] + +      result =          conn          |> assign(:user, author)          |> delete("/api/v1/statuses/#{activity.id}") +        |> json_response_and_validate_schema(200) -      assert %{} = json_response_and_validate_schema(conn, 200) +      assert match?(%{"content" => ^content, "text" => ^source}, result)        refute Activity.get_by_id(activity.id)      end @@ -789,7 +807,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        conn = delete(conn, "/api/v1/statuses/#{activity.id}") -      assert %{"error" => _} = json_response_and_validate_schema(conn, 403) +      assert %{"error" => "Record not found"} == json_response_and_validate_schema(conn, 404)        assert Activity.get_by_id(activity.id) == activity      end diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index f069390c1..50e0d783d 100644 --- a/test/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/web/mastodon_api/controllers/timeline_controller_test.exs @@ -418,4 +418,78 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        assert [status_none] == json_response_and_validate_schema(all_test, :ok)      end    end + +  describe "hashtag timeline handling of :restrict_unauthenticated setting" do +    setup do +      user = insert(:user) +      {:ok, activity1} = CommonAPI.post(user, %{status: "test #tag1"}) +      {:ok, _activity2} = CommonAPI.post(user, %{status: "test #tag1"}) + +      activity1 +      |> Ecto.Changeset.change(%{local: false}) +      |> Pleroma.Repo.update() + +      base_uri = "/api/v1/timelines/tag/tag1" +      error_response = %{"error" => "authorization required for timeline view"} + +      %{base_uri: base_uri, error_response: error_response} +    end + +    defp ensure_authenticated_access(base_uri) do +      %{conn: auth_conn} = oauth_access(["read:statuses"]) + +      res_conn = get(auth_conn, "#{base_uri}?local=true") +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(auth_conn, "#{base_uri}?local=false") +      assert length(json_response(res_conn, 200)) == 2 +    end + +    test "with `%{local: true, federated: true}`, returns 403 for unauthenticated users", %{ +      conn: conn, +      base_uri: base_uri, +      error_response: error_response +    } do +      clear_config([:restrict_unauthenticated, :timelines, :local], true) +      clear_config([:restrict_unauthenticated, :timelines, :federated], true) + +      for local <- [true, false] do +        res_conn = get(conn, "#{base_uri}?local=#{local}") + +        assert json_response(res_conn, :unauthorized) == error_response +      end + +      ensure_authenticated_access(base_uri) +    end + +    test "with `%{local: false, federated: true}`, forbids unauthenticated access to federated timeline", +         %{conn: conn, base_uri: base_uri, error_response: error_response} do +      clear_config([:restrict_unauthenticated, :timelines, :local], false) +      clear_config([:restrict_unauthenticated, :timelines, :federated], true) + +      res_conn = get(conn, "#{base_uri}?local=true") +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "#{base_uri}?local=false") +      assert json_response(res_conn, :unauthorized) == error_response + +      ensure_authenticated_access(base_uri) +    end + +    test "with `%{local: true, federated: false}`, forbids unauthenticated access to public timeline" <> +           "(but not to local public activities which are delivered as part of federated timeline)", +         %{conn: conn, base_uri: base_uri, error_response: error_response} do +      clear_config([:restrict_unauthenticated, :timelines, :local], true) +      clear_config([:restrict_unauthenticated, :timelines, :federated], false) + +      res_conn = get(conn, "#{base_uri}?local=true") +      assert json_response(res_conn, :unauthorized) == error_response + +      # Note: local activities get delivered as part of federated timeline +      res_conn = get(conn, "#{base_uri}?local=false") +      assert length(json_response(res_conn, 200)) == 2 + +      ensure_authenticated_access(base_uri) +    end +  end  end  | 
