diff options
Diffstat (limited to 'test/web/mastodon_api')
4 files changed, 206 insertions, 109 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 696228203..7c420985d 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 @@ -8,6 +8,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do    use Pleroma.Web.ConnCase +  import Mock    import Pleroma.Factory    setup do: clear_config([:instance, :max_account_fields]) @@ -52,24 +53,31 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        user = Repo.get(User, user_data["id"]) -      res_conn = -        conn -        |> assign(:user, user) -        |> patch("/api/v1/accounts/update_credentials", %{ -          "pleroma_settings_store" => %{ -            masto_fe: %{ -              theme: "blub" +      clear_config([:instance, :federating], true) + +      with_mock Pleroma.Web.Federator, +        publish: fn _activity -> :ok end do +        res_conn = +          conn +          |> assign(:user, user) +          |> patch("/api/v1/accounts/update_credentials", %{ +            "pleroma_settings_store" => %{ +              masto_fe: %{ +                theme: "blub" +              }              } -          } -        }) +          }) -      assert user_data = json_response_and_validate_schema(res_conn, 200) +        assert user_data = json_response_and_validate_schema(res_conn, 200) -      assert user_data["pleroma"]["settings_store"] == -               %{ -                 "pleroma_fe" => %{"theme" => "bla"}, -                 "masto_fe" => %{"theme" => "blub"} -               } +        assert user_data["pleroma"]["settings_store"] == +                 %{ +                   "pleroma_fe" => %{"theme" => "bla"}, +                   "masto_fe" => %{"theme" => "blub"} +                 } + +        assert_called(Pleroma.Web.Federator.publish(:_)) +      end      end      test "updates the user's bio", %{conn: conn} do diff --git a/test/web/mastodon_api/controllers/conversation_controller_test.exs b/test/web/mastodon_api/controllers/conversation_controller_test.exs index 693ba51e5..3e21e6bf1 100644 --- a/test/web/mastodon_api/controllers/conversation_controller_test.exs +++ b/test/web/mastodon_api/controllers/conversation_controller_test.exs @@ -12,84 +12,88 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do    setup do: oauth_access(["read:statuses"]) -  test "returns a list of conversations", %{user: user_one, conn: conn} do -    user_two = insert(:user) -    user_three = insert(:user) - -    {:ok, user_two} = User.follow(user_two, user_one) - -    assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 - -    {:ok, direct} = -      CommonAPI.post(user_one, %{ -        status: "Hi @#{user_two.nickname}, @#{user_three.nickname}!", -        visibility: "direct" -      }) - -    assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 - -    {:ok, _follower_only} = -      CommonAPI.post(user_one, %{ -        status: "Hi @#{user_two.nickname}!", -        visibility: "private" -      }) - -    res_conn = get(conn, "/api/v1/conversations") - -    assert response = json_response_and_validate_schema(res_conn, 200) - -    assert [ -             %{ -               "id" => res_id, -               "accounts" => res_accounts, -               "last_status" => res_last_status, -               "unread" => unread -             } -           ] = response - -    account_ids = Enum.map(res_accounts, & &1["id"]) -    assert length(res_accounts) == 2 -    assert user_two.id in account_ids -    assert user_three.id in account_ids -    assert is_binary(res_id) -    assert unread == false -    assert res_last_status["id"] == direct.id -    assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 +  describe "returns a list of conversations" do +    setup(%{user: user_one, conn: conn}) do +      user_two = insert(:user) +      user_three = insert(:user) + +      {:ok, user_two} = User.follow(user_two, user_one) + +      {:ok, %{user: user_one, user_two: user_two, user_three: user_three, conn: conn}} +    end + +    test "returns correct conversations", %{ +      user: user_one, +      user_two: user_two, +      user_three: user_three, +      conn: conn +    } do +      assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 +      {:ok, direct} = create_direct_message(user_one, [user_two, user_three]) + +      assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 + +      {:ok, _follower_only} = +        CommonAPI.post(user_one, %{ +          status: "Hi @#{user_two.nickname}!", +          visibility: "private" +        }) + +      res_conn = get(conn, "/api/v1/conversations") + +      assert response = json_response_and_validate_schema(res_conn, 200) + +      assert [ +               %{ +                 "id" => res_id, +                 "accounts" => res_accounts, +                 "last_status" => res_last_status, +                 "unread" => unread +               } +             ] = response + +      account_ids = Enum.map(res_accounts, & &1["id"]) +      assert length(res_accounts) == 2 +      assert user_two.id in account_ids +      assert user_three.id in account_ids +      assert is_binary(res_id) +      assert unread == false +      assert res_last_status["id"] == direct.id +      assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 +    end + +    test "observes limit params", %{ +      user: user_one, +      user_two: user_two, +      user_three: user_three, +      conn: conn +    } do +      {:ok, _} = create_direct_message(user_one, [user_two, user_three]) +      {:ok, _} = create_direct_message(user_two, [user_one, user_three]) +      {:ok, _} = create_direct_message(user_three, [user_two, user_one]) + +      res_conn = get(conn, "/api/v1/conversations?limit=1") + +      assert response = json_response_and_validate_schema(res_conn, 200) + +      assert Enum.count(response) == 1 + +      res_conn = get(conn, "/api/v1/conversations?limit=2") + +      assert response = json_response_and_validate_schema(res_conn, 200) + +      assert Enum.count(response) == 2 +    end    end    test "filters conversations by recipients", %{user: user_one, conn: conn} do      user_two = insert(:user)      user_three = insert(:user) - -    {:ok, direct1} = -      CommonAPI.post(user_one, %{ -        status: "Hi @#{user_two.nickname}!", -        visibility: "direct" -      }) - -    {:ok, _direct2} = -      CommonAPI.post(user_one, %{ -        status: "Hi @#{user_three.nickname}!", -        visibility: "direct" -      }) - -    {:ok, direct3} = -      CommonAPI.post(user_one, %{ -        status: "Hi @#{user_two.nickname}, @#{user_three.nickname}!", -        visibility: "direct" -      }) - -    {:ok, _direct4} = -      CommonAPI.post(user_two, %{ -        status: "Hi @#{user_three.nickname}!", -        visibility: "direct" -      }) - -    {:ok, direct5} = -      CommonAPI.post(user_two, %{ -        status: "Hi @#{user_one.nickname}!", -        visibility: "direct" -      }) +    {:ok, direct1} = create_direct_message(user_one, [user_two]) +    {:ok, _direct2} = create_direct_message(user_one, [user_three]) +    {:ok, direct3} = create_direct_message(user_one, [user_two, user_three]) +    {:ok, _direct4} = create_direct_message(user_two, [user_three]) +    {:ok, direct5} = create_direct_message(user_two, [user_one])      assert [conversation1, conversation2] =               conn @@ -109,12 +113,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do    test "updates the last_status on reply", %{user: user_one, conn: conn} do      user_two = insert(:user) - -    {:ok, direct} = -      CommonAPI.post(user_one, %{ -        status: "Hi @#{user_two.nickname}", -        visibility: "direct" -      }) +    {:ok, direct} = create_direct_message(user_one, [user_two])      {:ok, direct_reply} =        CommonAPI.post(user_two, %{ @@ -133,12 +132,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do    test "the user marks a conversation as read", %{user: user_one, conn: conn} do      user_two = insert(:user) - -    {:ok, direct} = -      CommonAPI.post(user_one, %{ -        status: "Hi @#{user_two.nickname}", -        visibility: "direct" -      }) +    {:ok, direct} = create_direct_message(user_one, [user_two])      assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0      assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 @@ -194,15 +188,22 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do    test "(vanilla) Mastodon frontend behaviour", %{user: user_one, conn: conn} do      user_two = insert(:user) - -    {:ok, direct} = -      CommonAPI.post(user_one, %{ -        status: "Hi @#{user_two.nickname}!", -        visibility: "direct" -      }) +    {:ok, direct} = create_direct_message(user_one, [user_two])      res_conn = get(conn, "/api/v1/statuses/#{direct.id}/context")      assert %{"ancestors" => [], "descendants" => []} == json_response(res_conn, 200)    end + +  defp create_direct_message(sender, recips) do +    hellos = +      recips +      |> Enum.map(fn s -> "@#{s.nickname}" end) +      |> Enum.join(", ") + +    CommonAPI.post(sender, %{ +      status: "Hi #{hellos}!", +      visibility: "direct" +    }) +  end  end diff --git a/test/web/mastodon_api/controllers/search_controller_test.exs b/test/web/mastodon_api/controllers/search_controller_test.exs index 7d0cafccc..84d46895e 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -71,10 +71,48 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do          get(conn, "/api/v2/search?q=天子")          |> json_response_and_validate_schema(200) +      assert results["hashtags"] == [ +               %{"name" => "天子", "url" => "#{Web.base_url()}/tag/天子"} +             ] +        [status] = results["statuses"]        assert status["id"] == to_string(activity.id)      end +    test "constructs hashtags from search query", %{conn: conn} do +      results = +        conn +        |> get("/api/v2/search?#{URI.encode_query(%{q: "some text with #explicit #hashtags"})}") +        |> json_response_and_validate_schema(200) + +      assert results["hashtags"] == [ +               %{"name" => "explicit", "url" => "#{Web.base_url()}/tag/explicit"}, +               %{"name" => "hashtags", "url" => "#{Web.base_url()}/tag/hashtags"} +             ] + +      results = +        conn +        |> get("/api/v2/search?#{URI.encode_query(%{q: "john doe JOHN DOE"})}") +        |> json_response_and_validate_schema(200) + +      assert results["hashtags"] == [ +               %{"name" => "john", "url" => "#{Web.base_url()}/tag/john"}, +               %{"name" => "doe", "url" => "#{Web.base_url()}/tag/doe"}, +               %{"name" => "JohnDoe", "url" => "#{Web.base_url()}/tag/JohnDoe"} +             ] + +      results = +        conn +        |> get("/api/v2/search?#{URI.encode_query(%{q: "accident-prone"})}") +        |> json_response_and_validate_schema(200) + +      assert results["hashtags"] == [ +               %{"name" => "accident", "url" => "#{Web.base_url()}/tag/accident"}, +               %{"name" => "prone", "url" => "#{Web.base_url()}/tag/prone"}, +               %{"name" => "AccidentProne", "url" => "#{Web.base_url()}/tag/AccidentProne"} +             ] +    end +      test "excludes a blocked users from search results", %{conn: conn} do        user = insert(:user)        user_smith = insert(:user, %{nickname: "Agent", name: "I love 2hu"}) @@ -179,7 +217,7 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do        [account | _] = results["accounts"]        assert account["id"] == to_string(user_three.id) -      assert results["hashtags"] == [] +      assert results["hashtags"] == ["2hu"]        [status] = results["statuses"]        assert status["id"] == to_string(activity.id) diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index 2375ac8e8..f069390c1 100644 --- a/test/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/web/mastodon_api/controllers/timeline_controller_test.exs @@ -60,9 +60,9 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do    describe "public" do      @tag capture_log: true      test "the public timeline", %{conn: conn} do -      following = insert(:user) +      user = insert(:user) -      {:ok, _activity} = CommonAPI.post(following, %{status: "test"}) +      {:ok, activity} = CommonAPI.post(user, %{status: "test"})        _activity = insert(:note_activity, local: false) @@ -77,6 +77,13 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        conn = get(build_conn(), "/api/v1/timelines/public?local=1")        assert [%{"content" => "test"}] = json_response_and_validate_schema(conn, :ok) + +      # does not contain repeats +      {:ok, _} = CommonAPI.repeat(activity.id, user) + +      conn = get(build_conn(), "/api/v1/timelines/public?local=true") + +      assert [_] = json_response_and_validate_schema(conn, :ok)      end      test "the public timeline includes only public statuses for an authenticated user" do @@ -90,6 +97,49 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        res_conn = get(conn, "/api/v1/timelines/public")        assert length(json_response_and_validate_schema(res_conn, 200)) == 1      end + +    test "doesn't return replies if follower is posting with blocked user" do +      %{conn: conn, user: blocker} = oauth_access(["read:statuses"]) +      [blockee, friend] = insert_list(2, :user) +      {:ok, blocker} = User.follow(blocker, friend) +      {:ok, _} = User.block(blocker, blockee) + +      conn = assign(conn, :user, blocker) + +      {:ok, %{id: activity_id} = activity} = CommonAPI.post(friend, %{status: "hey!"}) + +      {:ok, reply_from_blockee} = +        CommonAPI.post(blockee, %{status: "heya", in_reply_to_status_id: activity}) + +      {:ok, _reply_from_friend} = +        CommonAPI.post(friend, %{status: "status", in_reply_to_status_id: reply_from_blockee}) + +      res_conn = get(conn, "/api/v1/timelines/public") +      [%{"id" => ^activity_id}] = json_response_and_validate_schema(res_conn, 200) +    end + +    test "doesn't return replies if follow is posting with users from blocked domain" do +      %{conn: conn, user: blocker} = oauth_access(["read:statuses"]) +      friend = insert(:user) +      blockee = insert(:user, ap_id: "https://example.com/users/blocked") +      {:ok, blocker} = User.follow(blocker, friend) +      {:ok, blocker} = User.block_domain(blocker, "example.com") + +      conn = assign(conn, :user, blocker) + +      {:ok, %{id: activity_id} = activity} = CommonAPI.post(friend, %{status: "hey!"}) + +      {:ok, reply_from_blockee} = +        CommonAPI.post(blockee, %{status: "heya", in_reply_to_status_id: activity}) + +      {:ok, _reply_from_friend} = +        CommonAPI.post(friend, %{status: "status", in_reply_to_status_id: reply_from_blockee}) + +      res_conn = get(conn, "/api/v1/timelines/public") + +      activities = json_response_and_validate_schema(res_conn, 200) +      [%{"id" => ^activity_id}] = activities +    end    end    defp local_and_remote_activities do | 
