diff options
| author | Egor Kislitsyn <egor@kislitsyn.com> | 2020-05-05 14:28:54 +0400 | 
|---|---|---|
| committer | Egor Kislitsyn <egor@kislitsyn.com> | 2020-05-05 14:28:54 +0400 | 
| commit | decaa64f75f8bd69622fa5fba757f99719f09808 (patch) | |
| tree | 52d3bfc7318230beae31865c7f0a12e02b7f68b5 /test/web/mastodon_api | |
| parent | 764b4f95a8e9e751d5a6136fc2be44d61a082443 (diff) | |
| parent | c297667f16db40654bb16608c01dc4a2dc7c0e4b (diff) | |
| download | pleroma-decaa64f75f8bd69622fa5fba757f99719f09808.tar.gz pleroma-decaa64f75f8bd69622fa5fba757f99719f09808.zip | |
Merge branch 'develop' into global-status-expiration
Diffstat (limited to 'test/web/mastodon_api')
8 files changed, 568 insertions, 438 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 2d256f63c..fdb6d4c5d 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 @@ -14,6 +14,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do    describe "updating credentials" do      setup do: oauth_access(["write:accounts"]) +    setup :request_content_type      test "sets user settings in a generic way", %{conn: conn} do        res_conn = @@ -25,7 +26,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do            }          }) -      assert user_data = json_response(res_conn, 200) +      assert user_data = json_response_and_validate_schema(res_conn, 200)        assert user_data["pleroma"]["settings_store"] == %{"pleroma_fe" => %{"theme" => "bla"}}        user = Repo.get(User, user_data["id"]) @@ -41,7 +42,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do            }          }) -      assert user_data = json_response(res_conn, 200) +      assert user_data = json_response_and_validate_schema(res_conn, 200)        assert user_data["pleroma"]["settings_store"] ==                 %{ @@ -62,7 +63,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do            }          }) -      assert user_data = json_response(res_conn, 200) +      assert user_data = json_response_and_validate_schema(res_conn, 200)        assert user_data["pleroma"]["settings_store"] ==                 %{ @@ -79,7 +80,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do            "note" => "I drink #cofe with @#{user2.nickname}\n\nsuya.."          }) -      assert user_data = json_response(conn, 200) +      assert user_data = json_response_and_validate_schema(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 class="u-url mention" data-user="#{ @@ -90,7 +91,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do      test "updates the user's locking status", %{conn: conn} do        conn = patch(conn, "/api/v1/accounts/update_credentials", %{locked: "true"}) -      assert user_data = json_response(conn, 200) +      assert user_data = json_response_and_validate_schema(conn, 200)        assert user_data["locked"] == true      end @@ -100,21 +101,21 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        conn = patch(conn, "/api/v1/accounts/update_credentials", %{allow_following_move: "false"})        assert refresh_record(user).allow_following_move == false -      assert user_data = json_response(conn, 200) +      assert user_data = json_response_and_validate_schema(conn, 200)        assert user_data["pleroma"]["allow_following_move"] == false      end      test "updates the user's default scope", %{conn: conn} do -      conn = patch(conn, "/api/v1/accounts/update_credentials", %{default_scope: "cofe"}) +      conn = patch(conn, "/api/v1/accounts/update_credentials", %{default_scope: "unlisted"}) -      assert user_data = json_response(conn, 200) -      assert user_data["source"]["privacy"] == "cofe" +      assert user_data = json_response_and_validate_schema(conn, 200) +      assert user_data["source"]["privacy"] == "unlisted"      end      test "updates the user's hide_followers status", %{conn: conn} do        conn = patch(conn, "/api/v1/accounts/update_credentials", %{hide_followers: "true"}) -      assert user_data = json_response(conn, 200) +      assert user_data = json_response_and_validate_schema(conn, 200)        assert user_data["pleroma"]["hide_followers"] == true      end @@ -122,12 +123,12 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        assert %{"source" => %{"pleroma" => %{"discoverable" => true}}} =                 conn                 |> patch("/api/v1/accounts/update_credentials", %{discoverable: "true"}) -               |> json_response(:ok) +               |> json_response_and_validate_schema(:ok)        assert %{"source" => %{"pleroma" => %{"discoverable" => false}}} =                 conn                 |> patch("/api/v1/accounts/update_credentials", %{discoverable: "false"}) -               |> json_response(:ok) +               |> json_response_and_validate_schema(:ok)      end      test "updates the user's hide_followers_count and hide_follows_count", %{conn: conn} do @@ -137,7 +138,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do            hide_follows_count: "true"          }) -      assert user_data = json_response(conn, 200) +      assert user_data = json_response_and_validate_schema(conn, 200)        assert user_data["pleroma"]["hide_followers_count"] == true        assert user_data["pleroma"]["hide_follows_count"] == true      end @@ -146,7 +147,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        response =          conn          |> patch("/api/v1/accounts/update_credentials", %{skip_thread_containment: "true"}) -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert response["pleroma"]["skip_thread_containment"] == true        assert refresh_record(user).skip_thread_containment @@ -155,28 +156,28 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do      test "updates the user's hide_follows status", %{conn: conn} do        conn = patch(conn, "/api/v1/accounts/update_credentials", %{hide_follows: "true"}) -      assert user_data = json_response(conn, 200) +      assert user_data = json_response_and_validate_schema(conn, 200)        assert user_data["pleroma"]["hide_follows"] == true      end      test "updates the user's hide_favorites status", %{conn: conn} do        conn = patch(conn, "/api/v1/accounts/update_credentials", %{hide_favorites: "true"}) -      assert user_data = json_response(conn, 200) +      assert user_data = json_response_and_validate_schema(conn, 200)        assert user_data["pleroma"]["hide_favorites"] == true      end      test "updates the user's show_role status", %{conn: conn} do        conn = patch(conn, "/api/v1/accounts/update_credentials", %{show_role: "false"}) -      assert user_data = json_response(conn, 200) +      assert user_data = json_response_and_validate_schema(conn, 200)        assert user_data["source"]["pleroma"]["show_role"] == false      end      test "updates the user's no_rich_text status", %{conn: conn} do        conn = patch(conn, "/api/v1/accounts/update_credentials", %{no_rich_text: "true"}) -      assert user_data = json_response(conn, 200) +      assert user_data = json_response_and_validate_schema(conn, 200)        assert user_data["source"]["pleroma"]["no_rich_text"] == true      end @@ -184,7 +185,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        conn =          patch(conn, "/api/v1/accounts/update_credentials", %{"display_name" => "markorepairs"}) -      assert user_data = json_response(conn, 200) +      assert user_data = json_response_and_validate_schema(conn, 200)        assert user_data["display_name"] == "markorepairs"      end @@ -197,7 +198,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        conn = patch(conn, "/api/v1/accounts/update_credentials", %{"avatar" => new_avatar}) -      assert user_response = json_response(conn, 200) +      assert user_response = json_response_and_validate_schema(conn, 200)        assert user_response["avatar"] != User.avatar_url(user)      end @@ -210,7 +211,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        conn = patch(conn, "/api/v1/accounts/update_credentials", %{"header" => new_header}) -      assert user_response = json_response(conn, 200) +      assert user_response = json_response_and_validate_schema(conn, 200)        assert user_response["header"] != User.banner_url(user)      end @@ -226,7 +227,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do            "pleroma_background_image" => new_header          }) -      assert user_response = json_response(conn, 200) +      assert user_response = json_response_and_validate_schema(conn, 200)        assert user_response["pleroma"]["background_image"]      end @@ -237,14 +238,15 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        for token <- [token1, token2] do          conn =            build_conn() +          |> put_req_header("content-type", "multipart/form-data")            |> put_req_header("authorization", "Bearer #{token.token}")            |> patch("/api/v1/accounts/update_credentials", %{})          if token == token1 do            assert %{"error" => "Insufficient permissions: write:accounts."} == -                   json_response(conn, 403) +                   json_response_and_validate_schema(conn, 403)          else -          assert json_response(conn, 200) +          assert json_response_and_validate_schema(conn, 200)          end        end      end @@ -259,11 +261,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do            "display_name" => name          }) -      assert json_response(ret_conn, 200) +      assert json_response_and_validate_schema(ret_conn, 200)        conn = get(conn, "/api/v1/accounts/#{user.id}") -      assert user_data = json_response(conn, 200) +      assert user_data = json_response_and_validate_schema(conn, 200)        assert user_data["note"] == note        assert user_data["display_name"] == name @@ -279,7 +281,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        account_data =          conn          |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert account_data["fields"] == [                 %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "bar"}, @@ -312,7 +314,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do          conn          |> put_req_header("content-type", "application/x-www-form-urlencoded")          |> patch("/api/v1/accounts/update_credentials", fields) -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert account["fields"] == [                 %{"name" => "foo", "value" => "bar"}, @@ -337,7 +339,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        account =          conn          |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert account["fields"] == [                 %{"name" => "foo", "value" => ""} @@ -356,14 +358,14 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        assert %{"error" => "Invalid request"} ==                 conn                 |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) -               |> json_response(403) +               |> json_response_and_validate_schema(403)        fields = [%{"name" => long_name, "value" => "bar"}]        assert %{"error" => "Invalid request"} ==                 conn                 |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) -               |> json_response(403) +               |> json_response_and_validate_schema(403)        Pleroma.Config.put([:instance, :max_account_fields], 1) @@ -375,7 +377,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        assert %{"error" => "Invalid request"} ==                 conn                 |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) -               |> json_response(403) +               |> json_response_and_validate_schema(403)      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 8c428efee..b9da7e924 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -19,43 +19,37 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      setup do: clear_config([:instance, :limit_to_local_content])      test "works by id" do -      user = insert(:user) - -      conn = -        build_conn() -        |> get("/api/v1/accounts/#{user.id}") +      %User{id: user_id} = insert(:user) -      assert %{"id" => id} = json_response(conn, 200) -      assert id == to_string(user.id) +      assert %{"id" => ^user_id} = +               build_conn() +               |> get("/api/v1/accounts/#{user_id}") +               |> json_response_and_validate_schema(200) -      conn = -        build_conn() -        |> get("/api/v1/accounts/-1") - -      assert %{"error" => "Can't find user"} = json_response(conn, 404) +      assert %{"error" => "Can't find user"} = +               build_conn() +               |> get("/api/v1/accounts/-1") +               |> json_response_and_validate_schema(404)      end      test "works by nickname" do        user = insert(:user) -      conn = -        build_conn() -        |> get("/api/v1/accounts/#{user.nickname}") - -      assert %{"id" => id} = json_response(conn, 200) -      assert id == user.id +      assert %{"id" => user_id} = +               build_conn() +               |> get("/api/v1/accounts/#{user.nickname}") +               |> json_response_and_validate_schema(200)      end      test "works by nickname for remote users" do        Config.put([:instance, :limit_to_local_content], false) -      user = insert(:user, nickname: "user@example.com", local: false) -      conn = -        build_conn() -        |> get("/api/v1/accounts/#{user.nickname}") +      user = insert(:user, nickname: "user@example.com", local: false) -      assert %{"id" => id} = json_response(conn, 200) -      assert id == user.id +      assert %{"id" => user_id} = +               build_conn() +               |> get("/api/v1/accounts/#{user.nickname}") +               |> json_response_and_validate_schema(200)      end      test "respects limit_to_local_content == :all for remote user nicknames" do @@ -63,11 +57,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        user = insert(:user, nickname: "user@example.com", local: false) -      conn = -        build_conn() -        |> get("/api/v1/accounts/#{user.nickname}") - -      assert json_response(conn, 404) +      assert build_conn() +             |> get("/api/v1/accounts/#{user.nickname}") +             |> json_response_and_validate_schema(404)      end      test "respects limit_to_local_content == :unauthenticated for remote user nicknames" do @@ -80,7 +72,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          build_conn()          |> get("/api/v1/accounts/#{user.nickname}") -      assert json_response(conn, 404) +      assert json_response_and_validate_schema(conn, 404)        conn =          build_conn() @@ -88,7 +80,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          |> assign(:token, insert(:oauth_token, user: reading_user, scopes: ["read:accounts"]))          |> get("/api/v1/accounts/#{user.nickname}") -      assert %{"id" => id} = json_response(conn, 200) +      assert %{"id" => id} = json_response_and_validate_schema(conn, 200)        assert id == user.id      end @@ -99,21 +91,21 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        user_one = insert(:user, %{id: 1212})        user_two = insert(:user, %{nickname: "#{user_one.id}garbage"}) -      resp_one = +      acc_one =          conn          |> get("/api/v1/accounts/#{user_one.id}") +        |> json_response_and_validate_schema(:ok) -      resp_two = +      acc_two =          conn          |> get("/api/v1/accounts/#{user_two.nickname}") +        |> json_response_and_validate_schema(:ok) -      resp_three = +      acc_three =          conn          |> get("/api/v1/accounts/#{user_two.id}") +        |> json_response_and_validate_schema(:ok) -      acc_one = json_response(resp_one, 200) -      acc_two = json_response(resp_two, 200) -      acc_three = json_response(resp_three, 200)        refute acc_one == acc_two        assert acc_two == acc_three      end @@ -121,23 +113,19 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      test "returns 404 when user is invisible", %{conn: conn} do        user = insert(:user, %{invisible: true}) -      resp = -        conn -        |> get("/api/v1/accounts/#{user.nickname}") -        |> json_response(404) - -      assert %{"error" => "Can't find user"} = resp +      assert %{"error" => "Can't find user"} = +               conn +               |> get("/api/v1/accounts/#{user.nickname}") +               |> json_response_and_validate_schema(404)      end      test "returns 404 for internal.fetch actor", %{conn: conn} do        %User{nickname: "internal.fetch"} = InternalFetchActor.get_actor() -      resp = -        conn -        |> get("/api/v1/accounts/internal.fetch") -        |> json_response(404) - -      assert %{"error" => "Can't find user"} = resp +      assert %{"error" => "Can't find user"} = +               conn +               |> get("/api/v1/accounts/internal.fetch") +               |> json_response_and_validate_schema(404)      end    end @@ -155,27 +143,25 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      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" -             } +      assert %{"error" => "Can't find user"} == +               conn +               |> get("/api/v1/accounts/#{local.id}") +               |> json_response_and_validate_schema(:not_found) + +      assert %{"error" => "Can't find user"} == +               conn +               |> get("/api/v1/accounts/#{remote.id}") +               |> json_response_and_validate_schema(:not_found)      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) +      assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200)        res_conn = get(conn, "/api/v1/accounts/#{remote.id}") -      assert %{"id" => _} = json_response(res_conn, 200) +      assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200)      end    end @@ -187,22 +173,22 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      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) == %{ +      assert json_response_and_validate_schema(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) +      assert %{"id" => _} = json_response_and_validate_schema(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) +      assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200)        res_conn = get(conn, "/api/v1/accounts/#{remote.id}") -      assert %{"id" => _} = json_response(res_conn, 200) +      assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200)      end    end @@ -213,11 +199,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      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) +      assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200)        res_conn = get(conn, "/api/v1/accounts/#{remote.id}") -      assert json_response(res_conn, :not_found) == %{ +      assert json_response_and_validate_schema(res_conn, :not_found) == %{                 "error" => "Can't find user"               }      end @@ -226,10 +212,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        %{conn: conn} = oauth_access(["read"])        res_conn = get(conn, "/api/v1/accounts/#{local.id}") -      assert %{"id" => _} = json_response(res_conn, 200) +      assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200)        res_conn = get(conn, "/api/v1/accounts/#{remote.id}") -      assert %{"id" => _} = json_response(res_conn, 200) +      assert %{"id" => _} = json_response_and_validate_schema(res_conn, 200)      end    end @@ -245,27 +231,37 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        {:ok, activity} = CommonAPI.post(user_two, %{"status" => "User one sux0rz"})        {:ok, repeat, _} = CommonAPI.repeat(activity.id, user_three) -      resp = get(conn, "/api/v1/accounts/#{user_two.id}/statuses") +      assert resp = +               conn +               |> get("/api/v1/accounts/#{user_two.id}/statuses") +               |> json_response_and_validate_schema(200) -      assert [%{"id" => id}] = json_response(resp, 200) +      assert [%{"id" => id}] = resp        assert id == activity.id        # Even a blocked user will deliver the full user timeline, there would be        #   no point in looking at a blocked users timeline otherwise -      resp = get(conn, "/api/v1/accounts/#{user_two.id}/statuses") +      assert resp = +               conn +               |> get("/api/v1/accounts/#{user_two.id}/statuses") +               |> json_response_and_validate_schema(200) -      assert [%{"id" => id}] = json_response(resp, 200) +      assert [%{"id" => id}] = resp        assert id == activity.id        # Third user's timeline includes the repeat when viewed by unauthenticated user -      resp = get(build_conn(), "/api/v1/accounts/#{user_three.id}/statuses") -      assert [%{"id" => id}] = json_response(resp, 200) +      resp = +        build_conn() +        |> get("/api/v1/accounts/#{user_three.id}/statuses") +        |> json_response_and_validate_schema(200) + +      assert [%{"id" => id}] = resp        assert id == repeat.id        # When viewing a third user's timeline, the blocked users' statuses will NOT be shown        resp = get(conn, "/api/v1/accounts/#{user_three.id}/statuses") -      assert [] = json_response(resp, 200) +      assert [] == json_response_and_validate_schema(resp, 200)      end      test "gets users statuses", %{conn: conn} do @@ -286,9 +282,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        {:ok, private_activity} =          CommonAPI.post(user_one, %{"status" => "private", "visibility" => "private"}) -      resp = get(conn, "/api/v1/accounts/#{user_one.id}/statuses") +      # TODO!!! +      resp = +        conn +        |> get("/api/v1/accounts/#{user_one.id}/statuses") +        |> json_response_and_validate_schema(200) -      assert [%{"id" => id}] = json_response(resp, 200) +      assert [%{"id" => id}] = resp        assert id == to_string(activity.id)        resp = @@ -296,8 +296,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          |> assign(:user, user_two)          |> assign(:token, insert(:oauth_token, user: user_two, scopes: ["read:statuses"]))          |> get("/api/v1/accounts/#{user_one.id}/statuses") +        |> json_response_and_validate_schema(200) -      assert [%{"id" => id_one}, %{"id" => id_two}] = json_response(resp, 200) +      assert [%{"id" => id_one}, %{"id" => id_two}] = resp        assert id_one == to_string(direct_activity.id)        assert id_two == to_string(activity.id) @@ -306,8 +307,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          |> assign(:user, user_three)          |> assign(:token, insert(:oauth_token, user: user_three, scopes: ["read:statuses"]))          |> get("/api/v1/accounts/#{user_one.id}/statuses") +        |> json_response_and_validate_schema(200) -      assert [%{"id" => id_one}, %{"id" => id_two}] = json_response(resp, 200) +      assert [%{"id" => id_one}, %{"id" => id_two}] = resp        assert id_one == to_string(private_activity.id)        assert id_two == to_string(activity.id)      end @@ -318,7 +320,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?pinned=true") -      assert json_response(conn, 200) == [] +      assert json_response_and_validate_schema(conn, 200) == []      end      test "gets an users media", %{conn: conn} do @@ -333,56 +335,48 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        {:ok, %{id: media_id}} = ActivityPub.upload(file, actor: user.ap_id) -      {:ok, image_post} = CommonAPI.post(user, %{"status" => "cofe", "media_ids" => [media_id]}) +      {:ok, %{id: image_post_id}} = +        CommonAPI.post(user, %{"status" => "cofe", "media_ids" => [media_id]}) -      conn = get(conn, "/api/v1/accounts/#{user.id}/statuses", %{"only_media" => "true"}) +      conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?only_media=true") -      assert [%{"id" => id}] = json_response(conn, 200) -      assert id == to_string(image_post.id) +      assert [%{"id" => ^image_post_id}] = json_response_and_validate_schema(conn, 200) -      conn = get(build_conn(), "/api/v1/accounts/#{user.id}/statuses", %{"only_media" => "1"}) +      conn = get(build_conn(), "/api/v1/accounts/#{user.id}/statuses?only_media=1") -      assert [%{"id" => id}] = json_response(conn, 200) -      assert id == to_string(image_post.id) +      assert [%{"id" => ^image_post_id}] = json_response_and_validate_schema(conn, 200)      end      test "gets a user's statuses without reblogs", %{user: user, conn: conn} do -      {:ok, post} = CommonAPI.post(user, %{"status" => "HI!!!"}) -      {:ok, _, _} = CommonAPI.repeat(post.id, user) - -      conn = get(conn, "/api/v1/accounts/#{user.id}/statuses", %{"exclude_reblogs" => "true"}) - -      assert [%{"id" => id}] = json_response(conn, 200) -      assert id == to_string(post.id) +      {:ok, %{id: post_id}} = CommonAPI.post(user, %{"status" => "HI!!!"}) +      {:ok, _, _} = CommonAPI.repeat(post_id, user) -      conn = get(conn, "/api/v1/accounts/#{user.id}/statuses", %{"exclude_reblogs" => "1"}) +      conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?exclude_reblogs=true") +      assert [%{"id" => ^post_id}] = json_response_and_validate_schema(conn, 200) -      assert [%{"id" => id}] = json_response(conn, 200) -      assert id == to_string(post.id) +      conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?exclude_reblogs=1") +      assert [%{"id" => ^post_id}] = json_response_and_validate_schema(conn, 200)      end      test "filters user's statuses by a hashtag", %{user: user, conn: conn} do -      {:ok, post} = CommonAPI.post(user, %{"status" => "#hashtag"}) +      {:ok, %{id: post_id}} = CommonAPI.post(user, %{"status" => "#hashtag"})        {:ok, _post} = CommonAPI.post(user, %{"status" => "hashtag"}) -      conn = get(conn, "/api/v1/accounts/#{user.id}/statuses", %{"tagged" => "hashtag"}) - -      assert [%{"id" => id}] = json_response(conn, 200) -      assert id == to_string(post.id) +      conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?tagged=hashtag") +      assert [%{"id" => ^post_id}] = json_response_and_validate_schema(conn, 200)      end      test "the user views their own timelines and excludes direct messages", %{        user: user,        conn: conn      } do -      {:ok, public_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "public"}) -      {:ok, _direct_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"}) +      {:ok, %{id: public_activity_id}} = +        CommonAPI.post(user, %{"status" => ".", "visibility" => "public"}) -      conn = -        get(conn, "/api/v1/accounts/#{user.id}/statuses", %{"exclude_visibilities" => ["direct"]}) +      {:ok, _direct_activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"}) -      assert [%{"id" => id}] = json_response(conn, 200) -      assert id == to_string(public_activity.id) +      conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?exclude_visibilities[]=direct") +      assert [%{"id" => ^public_activity_id}] = json_response_and_validate_schema(conn, 200)      end    end @@ -402,27 +396,25 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      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" -             } +      assert %{"error" => "Can't find user"} == +               conn +               |> get("/api/v1/accounts/#{local.id}/statuses") +               |> json_response_and_validate_schema(:not_found) + +      assert %{"error" => "Can't find user"} == +               conn +               |> get("/api/v1/accounts/#{remote.id}/statuses") +               |> json_response_and_validate_schema(:not_found)      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 +      assert length(json_response_and_validate_schema(res_conn, 200)) == 1        res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") -      assert length(json_response(res_conn, 200)) == 1 +      assert length(json_response_and_validate_schema(res_conn, 200)) == 1      end    end @@ -433,24 +425,23 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      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" -             } +      assert %{"error" => "Can't find user"} == +               conn +               |> get("/api/v1/accounts/#{local.id}/statuses") +               |> json_response_and_validate_schema(:not_found)        res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") -      assert length(json_response(res_conn, 200)) == 1 +      assert length(json_response_and_validate_schema(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 +      assert length(json_response_and_validate_schema(res_conn, 200)) == 1        res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") -      assert length(json_response(res_conn, 200)) == 1 +      assert length(json_response_and_validate_schema(res_conn, 200)) == 1      end    end @@ -462,23 +453,22 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      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 length(json_response_and_validate_schema(res_conn, 200)) == 1 -      assert json_response(res_conn, :not_found) == %{ -               "error" => "Can't find user" -             } +      assert %{"error" => "Can't find user"} == +               conn +               |> get("/api/v1/accounts/#{remote.id}/statuses") +               |> json_response_and_validate_schema(:not_found)      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 +      assert length(json_response_and_validate_schema(res_conn, 200)) == 1        res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") -      assert length(json_response(res_conn, 200)) == 1 +      assert length(json_response_and_validate_schema(res_conn, 200)) == 1      end    end @@ -487,12 +477,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      test "getting followers", %{user: user, conn: conn} do        other_user = insert(:user) -      {:ok, user} = User.follow(user, other_user) +      {:ok, %{id: user_id}} = User.follow(user, other_user)        conn = get(conn, "/api/v1/accounts/#{other_user.id}/followers") -      assert [%{"id" => id}] = json_response(conn, 200) -      assert id == to_string(user.id) +      assert [%{"id" => ^user_id}] = json_response_and_validate_schema(conn, 200)      end      test "getting followers, hide_followers", %{user: user, conn: conn} do @@ -501,7 +490,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        conn = get(conn, "/api/v1/accounts/#{other_user.id}/followers") -      assert [] == json_response(conn, 200) +      assert [] == json_response_and_validate_schema(conn, 200)      end      test "getting followers, hide_followers, same user requesting" do @@ -515,37 +504,31 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:accounts"]))          |> get("/api/v1/accounts/#{other_user.id}/followers") -      refute [] == json_response(conn, 200) +      refute [] == json_response_and_validate_schema(conn, 200)      end      test "getting followers, pagination", %{user: user, conn: conn} do -      follower1 = insert(:user) -      follower2 = insert(:user) -      follower3 = insert(:user) -      {:ok, _} = User.follow(follower1, user) -      {:ok, _} = User.follow(follower2, user) -      {:ok, _} = User.follow(follower3, user) - -      res_conn = get(conn, "/api/v1/accounts/#{user.id}/followers?since_id=#{follower1.id}") - -      assert [%{"id" => id3}, %{"id" => id2}] = json_response(res_conn, 200) -      assert id3 == follower3.id -      assert id2 == follower2.id +      {:ok, %User{id: follower1_id}} = :user |> insert() |> User.follow(user) +      {:ok, %User{id: follower2_id}} = :user |> insert() |> User.follow(user) +      {:ok, %User{id: follower3_id}} = :user |> insert() |> User.follow(user) -      res_conn = get(conn, "/api/v1/accounts/#{user.id}/followers?max_id=#{follower3.id}") +      assert [%{"id" => ^follower3_id}, %{"id" => ^follower2_id}] = +               conn +               |> get("/api/v1/accounts/#{user.id}/followers?since_id=#{follower1_id}") +               |> json_response_and_validate_schema(200) -      assert [%{"id" => id2}, %{"id" => id1}] = json_response(res_conn, 200) -      assert id2 == follower2.id -      assert id1 == follower1.id +      assert [%{"id" => ^follower2_id}, %{"id" => ^follower1_id}] = +               conn +               |> get("/api/v1/accounts/#{user.id}/followers?max_id=#{follower3_id}") +               |> json_response_and_validate_schema(200) -      res_conn = get(conn, "/api/v1/accounts/#{user.id}/followers?limit=1&max_id=#{follower3.id}") +      res_conn = get(conn, "/api/v1/accounts/#{user.id}/followers?limit=1&max_id=#{follower3_id}") -      assert [%{"id" => id2}] = json_response(res_conn, 200) -      assert id2 == follower2.id +      assert [%{"id" => ^follower2_id}] = json_response_and_validate_schema(res_conn, 200)        assert [link_header] = get_resp_header(res_conn, "link") -      assert link_header =~ ~r/min_id=#{follower2.id}/ -      assert link_header =~ ~r/max_id=#{follower2.id}/ +      assert link_header =~ ~r/min_id=#{follower2_id}/ +      assert link_header =~ ~r/max_id=#{follower2_id}/      end    end @@ -558,7 +541,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        conn = get(conn, "/api/v1/accounts/#{user.id}/following") -      assert [%{"id" => id}] = json_response(conn, 200) +      assert [%{"id" => id}] = json_response_and_validate_schema(conn, 200)        assert id == to_string(other_user.id)      end @@ -573,7 +556,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:accounts"]))          |> get("/api/v1/accounts/#{user.id}/following") -      assert [] == json_response(conn, 200) +      assert [] == json_response_and_validate_schema(conn, 200)      end      test "getting following, hide_follows, same user requesting" do @@ -587,7 +570,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          |> assign(:token, insert(:oauth_token, user: user, scopes: ["read:accounts"]))          |> get("/api/v1/accounts/#{user.id}/following") -      refute [] == json_response(conn, 200) +      refute [] == json_response_and_validate_schema(conn, 200)      end      test "getting following, pagination", %{user: user, conn: conn} do @@ -600,20 +583,20 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        res_conn = get(conn, "/api/v1/accounts/#{user.id}/following?since_id=#{following1.id}") -      assert [%{"id" => id3}, %{"id" => id2}] = json_response(res_conn, 200) +      assert [%{"id" => id3}, %{"id" => id2}] = json_response_and_validate_schema(res_conn, 200)        assert id3 == following3.id        assert id2 == following2.id        res_conn = get(conn, "/api/v1/accounts/#{user.id}/following?max_id=#{following3.id}") -      assert [%{"id" => id2}, %{"id" => id1}] = json_response(res_conn, 200) +      assert [%{"id" => id2}, %{"id" => id1}] = json_response_and_validate_schema(res_conn, 200)        assert id2 == following2.id        assert id1 == following1.id        res_conn =          get(conn, "/api/v1/accounts/#{user.id}/following?limit=1&max_id=#{following3.id}") -      assert [%{"id" => id2}] = json_response(res_conn, 200) +      assert [%{"id" => id2}] = json_response_and_validate_schema(res_conn, 200)        assert id2 == following2.id        assert [link_header] = get_resp_header(res_conn, "link") @@ -626,30 +609,37 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      setup do: oauth_access(["follow"])      test "following / unfollowing a user", %{conn: conn} do -      other_user = insert(:user) - -      ret_conn = post(conn, "/api/v1/accounts/#{other_user.id}/follow") - -      assert %{"id" => _id, "following" => true} = json_response(ret_conn, 200) - -      ret_conn = post(conn, "/api/v1/accounts/#{other_user.id}/unfollow") - -      assert %{"id" => _id, "following" => false} = json_response(ret_conn, 200) - -      conn = post(conn, "/api/v1/follows", %{"uri" => other_user.nickname}) - -      assert %{"id" => id} = json_response(conn, 200) -      assert id == to_string(other_user.id) +      %{id: other_user_id, nickname: other_user_nickname} = insert(:user) + +      assert %{"id" => _id, "following" => true} = +               conn +               |> post("/api/v1/accounts/#{other_user_id}/follow") +               |> json_response_and_validate_schema(200) + +      assert %{"id" => _id, "following" => false} = +               conn +               |> post("/api/v1/accounts/#{other_user_id}/unfollow") +               |> json_response_and_validate_schema(200) + +      assert %{"id" => ^other_user_id} = +               conn +               |> put_req_header("content-type", "application/json") +               |> post("/api/v1/follows", %{"uri" => other_user_nickname}) +               |> json_response_and_validate_schema(200)      end      test "cancelling follow request", %{conn: conn} do        %{id: other_user_id} = insert(:user, %{locked: true})        assert %{"id" => ^other_user_id, "following" => false, "requested" => true} = -               conn |> post("/api/v1/accounts/#{other_user_id}/follow") |> json_response(:ok) +               conn +               |> post("/api/v1/accounts/#{other_user_id}/follow") +               |> json_response_and_validate_schema(:ok)        assert %{"id" => ^other_user_id, "following" => false, "requested" => false} = -               conn |> post("/api/v1/accounts/#{other_user_id}/unfollow") |> json_response(:ok) +               conn +               |> post("/api/v1/accounts/#{other_user_id}/unfollow") +               |> json_response_and_validate_schema(:ok)      end      test "following without reblogs" do @@ -659,51 +649,65 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        ret_conn = post(conn, "/api/v1/accounts/#{followed.id}/follow?reblogs=false") -      assert %{"showing_reblogs" => false} = json_response(ret_conn, 200) +      assert %{"showing_reblogs" => false} = json_response_and_validate_schema(ret_conn, 200)        {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hey"}) -      {:ok, reblog, _} = CommonAPI.repeat(activity.id, followed) - -      ret_conn = get(conn, "/api/v1/timelines/home") - -      assert [] == json_response(ret_conn, 200) - -      ret_conn = post(conn, "/api/v1/accounts/#{followed.id}/follow?reblogs=true") - -      assert %{"showing_reblogs" => true} = json_response(ret_conn, 200) - -      conn = get(conn, "/api/v1/timelines/home") - -      expected_activity_id = reblog.id -      assert [%{"id" => ^expected_activity_id}] = json_response(conn, 200) +      {:ok, %{id: reblog_id}, _} = CommonAPI.repeat(activity.id, followed) + +      assert [] == +               conn +               |> get("/api/v1/timelines/home") +               |> json_response(200) + +      assert %{"showing_reblogs" => true} = +               conn +               |> post("/api/v1/accounts/#{followed.id}/follow?reblogs=true") +               |> json_response_and_validate_schema(200) + +      assert [%{"id" => ^reblog_id}] = +               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") -      assert %{"error" => "Can not follow yourself"} = json_response(conn_res, 400) + +      assert %{"error" => "Can not follow yourself"} = +               json_response_and_validate_schema(conn_res, 400)        # self unfollow        user = User.get_cached_by_id(user.id)        conn_res = post(conn, "/api/v1/accounts/#{user.id}/unfollow") -      assert %{"error" => "Can not unfollow yourself"} = json_response(conn_res, 400) + +      assert %{"error" => "Can not unfollow yourself"} = +               json_response_and_validate_schema(conn_res, 400)        # self follow via uri        user = User.get_cached_by_id(user.id) -      conn_res = post(conn, "/api/v1/follows", %{"uri" => user.nickname}) -      assert %{"error" => "Can not follow yourself"} = json_response(conn_res, 400) + +      assert %{"error" => "Can not follow yourself"} = +               conn +               |> put_req_header("content-type", "multipart/form-data") +               |> post("/api/v1/follows", %{"uri" => user.nickname}) +               |> json_response_and_validate_schema(400)        # follow non existing user        conn_res = post(conn, "/api/v1/accounts/doesntexist/follow") -      assert %{"error" => "Record not found"} = json_response(conn_res, 404) +      assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn_res, 404)        # follow non existing user via uri -      conn_res = post(conn, "/api/v1/follows", %{"uri" => "doesntexist"}) -      assert %{"error" => "Record not found"} = json_response(conn_res, 404) +      conn_res = +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/v1/follows", %{"uri" => "doesntexist"}) + +      assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn_res, 404)        # unfollow non existing user        conn_res = post(conn, "/api/v1/accounts/doesntexist/unfollow") -      assert %{"error" => "Record not found"} = json_response(conn_res, 404) +      assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn_res, 404)      end    end @@ -713,32 +717,33 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      test "with notifications", %{conn: conn} do        other_user = insert(:user) -      ret_conn = post(conn, "/api/v1/accounts/#{other_user.id}/mute") - -      response = json_response(ret_conn, 200) - -      assert %{"id" => _id, "muting" => true, "muting_notifications" => true} = response +      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)        conn = post(conn, "/api/v1/accounts/#{other_user.id}/unmute") -      response = json_response(conn, 200) -      assert %{"id" => _id, "muting" => false, "muting_notifications" => false} = response +      assert %{"id" => _id, "muting" => false, "muting_notifications" => false} = +               json_response_and_validate_schema(conn, 200)      end      test "without notifications", %{conn: conn} do        other_user = insert(:user)        ret_conn = -        post(conn, "/api/v1/accounts/#{other_user.id}/mute", %{"notifications" => "false"}) - -      response = json_response(ret_conn, 200) +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/v1/accounts/#{other_user.id}/mute", %{"notifications" => "false"}) -      assert %{"id" => _id, "muting" => true, "muting_notifications" => false} = response +      assert %{"id" => _id, "muting" => true, "muting_notifications" => false} = +               json_response_and_validate_schema(ret_conn, 200)        conn = post(conn, "/api/v1/accounts/#{other_user.id}/unmute") -      response = json_response(conn, 200) -      assert %{"id" => _id, "muting" => false, "muting_notifications" => false} = response +      assert %{"id" => _id, "muting" => false, "muting_notifications" => false} = +               json_response_and_validate_schema(conn, 200)      end    end @@ -751,17 +756,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        [conn: conn, user: user, activity: activity]      end -    test "returns pinned statuses", %{conn: conn, user: user, activity: activity} do -      {:ok, _} = CommonAPI.pin(activity.id, user) - -      result = -        conn -        |> get("/api/v1/accounts/#{user.id}/statuses?pinned=true") -        |> json_response(200) - -      id_str = to_string(activity.id) +    test "returns pinned statuses", %{conn: conn, user: user, activity: %{id: activity_id}} do +      {:ok, _} = CommonAPI.pin(activity_id, user) -      assert [%{"id" => ^id_str, "pinned" => true}] = result +      assert [%{"id" => ^activity_id, "pinned" => true}] = +               conn +               |> get("/api/v1/accounts/#{user.id}/statuses?pinned=true") +               |> json_response_and_validate_schema(200)      end    end @@ -771,11 +772,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      ret_conn = post(conn, "/api/v1/accounts/#{other_user.id}/block") -    assert %{"id" => _id, "blocking" => true} = json_response(ret_conn, 200) +    assert %{"id" => _id, "blocking" => true} = json_response_and_validate_schema(ret_conn, 200)      conn = post(conn, "/api/v1/accounts/#{other_user.id}/unblock") -    assert %{"id" => _id, "blocking" => false} = json_response(conn, 200) +    assert %{"id" => _id, "blocking" => false} = json_response_and_validate_schema(conn, 200)    end    describe "create account by app" do @@ -802,15 +803,15 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do            scopes: "read, write, follow"          }) -      %{ -        "client_id" => client_id, -        "client_secret" => client_secret, -        "id" => _, -        "name" => "client_name", -        "redirect_uri" => "urn:ietf:wg:oauth:2.0:oob", -        "vapid_key" => _, -        "website" => nil -      } = json_response(conn, 200) +      assert %{ +               "client_id" => client_id, +               "client_secret" => client_secret, +               "id" => _, +               "name" => "client_name", +               "redirect_uri" => "urn:ietf:wg:oauth:2.0:oob", +               "vapid_key" => _, +               "website" => nil +             } = json_response_and_validate_schema(conn, 200)        conn =          post(conn, "/oauth/token", %{ @@ -830,6 +831,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        conn =          build_conn() +        |> put_req_header("content-type", "multipart/form-data")          |> put_req_header("authorization", "Bearer " <> token)          |> post("/api/v1/accounts", %{            username: "lain", @@ -844,7 +846,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          "created_at" => _created_at,          "scope" => _scope,          "token_type" => "Bearer" -      } = json_response(conn, 200) +      } = json_response_and_validate_schema(conn, 200)        token_from_db = Repo.get_by(Token, token: token)        assert token_from_db @@ -858,12 +860,15 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        _user = insert(:user, email: "lain@example.org")        app_token = insert(:oauth_token, user: nil) -      conn = +      res =          conn          |> put_req_header("authorization", "Bearer " <> app_token.token) +        |> put_req_header("content-type", "application/json") +        |> post("/api/v1/accounts", valid_params) -      res = post(conn, "/api/v1/accounts", valid_params) -      assert json_response(res, 400) == %{"error" => "{\"email\":[\"has already been taken\"]}"} +      assert json_response_and_validate_schema(res, 400) == %{ +               "error" => "{\"email\":[\"has already been taken\"]}" +             }      end      test "returns bad_request if missing required params", %{ @@ -872,10 +877,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      } do        app_token = insert(:oauth_token, user: nil) -      conn = put_req_header(conn, "authorization", "Bearer " <> app_token.token) +      conn = +        conn +        |> put_req_header("authorization", "Bearer " <> app_token.token) +        |> put_req_header("content-type", "application/json")        res = post(conn, "/api/v1/accounts", valid_params) -      assert json_response(res, 200) +      assert json_response_and_validate_schema(res, 200)        [{127, 0, 0, 1}, {127, 0, 0, 2}, {127, 0, 0, 3}, {127, 0, 0, 4}]        |> Stream.zip(Map.delete(valid_params, :email)) @@ -884,9 +892,18 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do            conn            |> Map.put(:remote_ip, ip)            |> post("/api/v1/accounts", Map.delete(valid_params, attr)) -          |> json_response(400) - -        assert res == %{"error" => "Missing parameters"} +          |> json_response_and_validate_schema(400) + +        assert res == %{ +                 "error" => "Missing field: #{attr}.", +                 "errors" => [ +                   %{ +                     "message" => "Missing field: #{attr}", +                     "source" => %{"pointer" => "/#{attr}"}, +                     "title" => "Invalid value" +                   } +                 ] +               }        end)      end @@ -897,21 +914,28 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest 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) + +      conn = +        conn +        |> put_req_header("authorization", "Bearer " <> app_token.token) +        |> put_req_header("content-type", "application/json")        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"} +      assert json_response_and_validate_schema(res, 400) == +               %{"error" => "Missing parameter: email"}        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\"]}"} +      assert json_response_and_validate_schema(res, 400) == %{ +               "error" => "{\"email\":[\"can't be blank\"]}" +             }      end      test "allow registration without an email", %{conn: conn, valid_params: valid_params} do @@ -920,10 +944,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        res =          conn +        |> put_req_header("content-type", "application/json")          |> Map.put(:remote_ip, {127, 0, 0, 7})          |> post("/api/v1/accounts", Map.delete(valid_params, :email)) -      assert json_response(res, 200) +      assert json_response_and_validate_schema(res, 200)      end      test "allow registration with an empty email", %{conn: conn, valid_params: valid_params} do @@ -932,17 +957,21 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        res =          conn +        |> put_req_header("content-type", "application/json")          |> Map.put(:remote_ip, {127, 0, 0, 8})          |> post("/api/v1/accounts", Map.put(valid_params, :email, "")) -      assert json_response(res, 200) +      assert json_response_and_validate_schema(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 = +        conn +        |> put_req_header("authorization", "Bearer " <> "invalid-token") +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/v1/accounts", valid_params) -      res = post(conn, "/api/v1/accounts", valid_params) -      assert json_response(res, 403) == %{"error" => "Invalid credentials"} +      assert json_response_and_validate_schema(res, 403) == %{"error" => "Invalid credentials"}      end      test "registration from trusted app" do @@ -962,6 +991,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        response =          build_conn()          |> Plug.Conn.put_req_header("authorization", "Bearer " <> token) +        |> put_req_header("content-type", "multipart/form-data")          |> post("/api/v1/accounts", %{            nickname: "nickanme",            agreement: true, @@ -971,7 +1001,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do            password: "some_password",            confirm: "some_password"          }) -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert %{                 "access_token" => access_token, @@ -984,7 +1014,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          build_conn()          |> Plug.Conn.put_req_header("authorization", "Bearer " <> access_token)          |> get("/api/v1/accounts/verify_credentials") -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert %{                 "acct" => "Lain", @@ -1023,10 +1053,12 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do          conn          |> put_req_header("authorization", "Bearer " <> app_token.token)          |> Map.put(:remote_ip, {15, 15, 15, 15}) +        |> put_req_header("content-type", "multipart/form-data")        for i <- 1..2 do          conn = -          post(conn, "/api/v1/accounts", %{ +          conn +          |> post("/api/v1/accounts", %{              username: "#{i}lain",              email: "#{i}lain@example.org",              password: "PlzDontHackLain", @@ -1038,7 +1070,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do            "created_at" => _created_at,            "scope" => _scope,            "token_type" => "Bearer" -        } = json_response(conn, 200) +        } = json_response_and_validate_schema(conn, 200)          token_from_db = Repo.get_by(Token, token: token)          assert token_from_db @@ -1056,7 +1088,94 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do            agreement: true          }) -      assert json_response(conn, :too_many_requests) == %{"error" => "Throttled"} +      assert json_response_and_validate_schema(conn, :too_many_requests) == %{ +               "error" => "Throttled" +             } +    end +  end + +  describe "create account with enabled captcha" do +    setup %{conn: conn} do +      app_token = insert(:oauth_token, user: nil) + +      conn = +        conn +        |> put_req_header("authorization", "Bearer " <> app_token.token) +        |> put_req_header("content-type", "multipart/form-data") + +      [conn: conn] +    end + +    setup do: clear_config([Pleroma.Captcha, :enabled], true) + +    test "creates an account and returns 200 if captcha is valid", %{conn: conn} do +      %{token: token, answer_data: answer_data} = Pleroma.Captcha.new() + +      params = %{ +        username: "lain", +        email: "lain@example.org", +        password: "PlzDontHackLain", +        agreement: true, +        captcha_solution: Pleroma.Captcha.Mock.solution(), +        captcha_token: token, +        captcha_answer_data: answer_data +      } + +      assert %{ +               "access_token" => access_token, +               "created_at" => _, +               "scope" => ["read"], +               "token_type" => "Bearer" +             } = +               conn +               |> post("/api/v1/accounts", params) +               |> json_response_and_validate_schema(:ok) + +      assert Token |> Repo.get_by(token: access_token) |> Repo.preload(:user) |> Map.get(:user) + +      Cachex.del(:used_captcha_cache, token) +    end + +    test "returns 400 if any captcha field is not provided", %{conn: conn} do +      captcha_fields = [:captcha_solution, :captcha_token, :captcha_answer_data] + +      valid_params = %{ +        username: "lain", +        email: "lain@example.org", +        password: "PlzDontHackLain", +        agreement: true, +        captcha_solution: "xx", +        captcha_token: "xx", +        captcha_answer_data: "xx" +      } + +      for field <- captcha_fields do +        expected = %{ +          "error" => "{\"captcha\":[\"Invalid CAPTCHA (Missing parameter: #{field})\"]}" +        } + +        assert expected == +                 conn +                 |> post("/api/v1/accounts", Map.delete(valid_params, field)) +                 |> json_response_and_validate_schema(:bad_request) +      end +    end + +    test "returns an error if captcha is invalid", %{conn: conn} do +      params = %{ +        username: "lain", +        email: "lain@example.org", +        password: "PlzDontHackLain", +        agreement: true, +        captcha_solution: "cofe", +        captcha_token: "cofe", +        captcha_answer_data: "cofe" +      } + +      assert %{"error" => "{\"captcha\":[\"Invalid answer data\"]}"} == +               conn +               |> post("/api/v1/accounts", params) +               |> json_response_and_validate_schema(:bad_request)      end    end @@ -1064,15 +1183,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      test "returns lists to which the account belongs" do        %{user: user, conn: conn} = oauth_access(["read:lists"])        other_user = insert(:user) -      assert {:ok, %Pleroma.List{} = list} = Pleroma.List.create("Test List", user) +      assert {:ok, %Pleroma.List{id: list_id} = list} = Pleroma.List.create("Test List", user)        {:ok, %{following: _following}} = Pleroma.List.follow(list, other_user) -      res = -        conn -        |> get("/api/v1/accounts/#{other_user.id}/lists") -        |> json_response(200) - -      assert res == [%{"id" => to_string(list.id), "title" => "Test List"}] +      assert [%{"id" => list_id, "title" => "Test List"}] = +               conn +               |> get("/api/v1/accounts/#{other_user.id}/lists") +               |> json_response_and_validate_schema(200)      end    end @@ -1081,7 +1198,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        %{user: user, conn: conn} = oauth_access(["read:accounts"])        conn = get(conn, "/api/v1/accounts/verify_credentials") -      response = json_response(conn, 200) +      response = json_response_and_validate_schema(conn, 200)        assert %{"id" => id, "source" => %{"privacy" => "public"}} = response        assert response["pleroma"]["chat_token"] @@ -1094,7 +1211,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        conn = get(conn, "/api/v1/accounts/verify_credentials") -      assert %{"id" => id, "source" => %{"privacy" => "unlisted"}} = json_response(conn, 200) +      assert %{"id" => id, "source" => %{"privacy" => "unlisted"}} = +               json_response_and_validate_schema(conn, 200) +        assert id == to_string(user.id)      end @@ -1104,7 +1223,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        conn = get(conn, "/api/v1/accounts/verify_credentials") -      assert %{"id" => id, "source" => %{"privacy" => "private"}} = json_response(conn, 200) +      assert %{"id" => id, "source" => %{"privacy" => "private"}} = +               json_response_and_validate_schema(conn, 200) +        assert id == to_string(user.id)      end    end @@ -1113,20 +1234,24 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      setup do: oauth_access(["read:follows"])      test "returns the relationships for the current user", %{user: user, conn: conn} do -      other_user = insert(:user) +      %{id: other_user_id} = other_user = insert(:user)        {:ok, _user} = User.follow(user, other_user) -      conn = get(conn, "/api/v1/accounts/relationships", %{"id" => [other_user.id]}) - -      assert [relationship] = json_response(conn, 200) +      assert [%{"id" => ^other_user_id}] = +               conn +               |> get("/api/v1/accounts/relationships?id=#{other_user.id}") +               |> json_response_and_validate_schema(200) -      assert to_string(other_user.id) == relationship["id"] +      assert [%{"id" => ^other_user_id}] = +               conn +               |> get("/api/v1/accounts/relationships?id[]=#{other_user.id}") +               |> json_response_and_validate_schema(200)      end      test "returns an empty list on a bad request", %{conn: conn} do        conn = get(conn, "/api/v1/accounts/relationships", %{}) -      assert [] = json_response(conn, 200) +      assert [] = json_response_and_validate_schema(conn, 200)      end    end @@ -1139,7 +1264,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      conn = get(conn, "/api/v1/mutes")      other_user_id = to_string(other_user.id) -    assert [%{"id" => ^other_user_id}] = json_response(conn, 200) +    assert [%{"id" => ^other_user_id}] = json_response_and_validate_schema(conn, 200)    end    test "getting a list of blocks" do @@ -1154,6 +1279,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        |> get("/api/v1/blocks")      other_user_id = to_string(other_user.id) -    assert [%{"id" => ^other_user_id}] = json_response(conn, 200) +    assert [%{"id" => ^other_user_id}] = json_response_and_validate_schema(conn, 200)    end  end 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 4222556a4..ab0027f90 100644 --- a/test/web/mastodon_api/controllers/custom_emoji_controller_test.exs +++ b/test/web/mastodon_api/controllers/custom_emoji_controller_test.exs @@ -4,8 +4,6 @@  defmodule Pleroma.Web.MastodonAPI.CustomEmojiControllerTest do    use Pleroma.Web.ConnCase, async: true -  alias Pleroma.Web.ApiSpec -  import OpenApiSpex.TestAssertions    test "with tags", %{conn: conn} do      assert resp = @@ -21,6 +19,5 @@ 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(emoji, "CustomEmoji", ApiSpec.spec())    end  end diff --git a/test/web/mastodon_api/controllers/instance_controller_test.exs b/test/web/mastodon_api/controllers/instance_controller_test.exs index 2737dcaba..2c7fd9fd0 100644 --- a/test/web/mastodon_api/controllers/instance_controller_test.exs +++ b/test/web/mastodon_api/controllers/instance_controller_test.exs @@ -34,6 +34,10 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do               "banner_upload_limit" => _             } = result +    assert result["pleroma"]["metadata"]["features"] +    assert result["pleroma"]["metadata"]["federation"] +    assert result["pleroma"]["vapid_public_key"] +      assert email == from_config_email    end diff --git a/test/web/mastodon_api/controllers/notification_controller_test.exs b/test/web/mastodon_api/controllers/notification_controller_test.exs index 8c815b415..db380f76a 100644 --- a/test/web/mastodon_api/controllers/notification_controller_test.exs +++ b/test/web/mastodon_api/controllers/notification_controller_test.exs @@ -25,7 +25,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        conn        |> assign(:user, user)        |> get("/api/v1/notifications") -      |> json_response(200) +      |> json_response_and_validate_schema(200)      assert Enum.all?(response, fn n ->               get_in(n, ["account", "pleroma", "relationship"]) == %{} @@ -50,7 +50,9 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do          user.ap_id        }\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>" -    assert [%{"status" => %{"content" => response}} | _rest] = json_response(conn, 200) +    assert [%{"status" => %{"content" => response}} | _rest] = +             json_response_and_validate_schema(conn, 200) +      assert response == expected_response    end @@ -69,7 +71,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do          user.ap_id        }\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>" -    assert %{"status" => %{"content" => response}} = json_response(conn, 200) +    assert %{"status" => %{"content" => response}} = json_response_and_validate_schema(conn, 200)      assert response == expected_response    end @@ -84,9 +86,10 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      conn =        conn        |> assign(:user, user) -      |> post("/api/v1/notifications/dismiss", %{"id" => notification.id}) +      |> put_req_header("content-type", "application/json") +      |> post("/api/v1/notifications/dismiss", %{"id" => to_string(notification.id)}) -    assert %{} = json_response(conn, 200) +    assert %{} = json_response_and_validate_schema(conn, 200)    end    test "dismissing a single notification" do @@ -102,7 +105,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        |> assign(:user, user)        |> post("/api/v1/notifications/#{notification.id}/dismiss") -    assert %{} = json_response(conn, 200) +    assert %{} = json_response_and_validate_schema(conn, 200)    end    test "clearing all notifications" do @@ -115,11 +118,11 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      ret_conn = post(conn, "/api/v1/notifications/clear") -    assert %{} = json_response(ret_conn, 200) +    assert %{} = json_response_and_validate_schema(ret_conn, 200)      ret_conn = get(conn, "/api/v1/notifications") -    assert all = json_response(ret_conn, 200) +    assert all = json_response_and_validate_schema(ret_conn, 200)      assert all == []    end @@ -143,7 +146,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      result =        conn        |> get("/api/v1/notifications?limit=2&min_id=#{notification1_id}") -      |> json_response(:ok) +      |> json_response_and_validate_schema(:ok)      assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result @@ -151,7 +154,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      result =        conn        |> get("/api/v1/notifications?limit=2&since_id=#{notification1_id}") -      |> json_response(:ok) +      |> json_response_and_validate_schema(:ok)      assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result @@ -159,7 +162,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      result =        conn        |> get("/api/v1/notifications?limit=2&max_id=#{notification4_id}") -      |> json_response(:ok) +      |> json_response_and_validate_schema(:ok)      assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result    end @@ -181,36 +184,28 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        {:ok, private_activity} =          CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "private"}) -      conn_res = -        get(conn, "/api/v1/notifications", %{ -          exclude_visibilities: ["public", "unlisted", "private"] -        }) +      query = params_to_query(%{exclude_visibilities: ["public", "unlisted", "private"]}) +      conn_res = get(conn, "/api/v1/notifications?" <> query) -      assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) +      assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)        assert id == direct_activity.id -      conn_res = -        get(conn, "/api/v1/notifications", %{ -          exclude_visibilities: ["public", "unlisted", "direct"] -        }) +      query = params_to_query(%{exclude_visibilities: ["public", "unlisted", "direct"]}) +      conn_res = get(conn, "/api/v1/notifications?" <> query) -      assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) +      assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)        assert id == private_activity.id -      conn_res = -        get(conn, "/api/v1/notifications", %{ -          exclude_visibilities: ["public", "private", "direct"] -        }) +      query = params_to_query(%{exclude_visibilities: ["public", "private", "direct"]}) +      conn_res = get(conn, "/api/v1/notifications?" <> query) -      assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) +      assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)        assert id == unlisted_activity.id -      conn_res = -        get(conn, "/api/v1/notifications", %{ -          exclude_visibilities: ["unlisted", "private", "direct"] -        }) +      query = params_to_query(%{exclude_visibilities: ["unlisted", "private", "direct"]}) +      conn_res = get(conn, "/api/v1/notifications?" <> query) -      assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) +      assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)        assert id == public_activity.id      end @@ -237,8 +232,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        activity_ids =          conn -        |> get("/api/v1/notifications", %{exclude_visibilities: ["direct"]}) -        |> json_response(200) +        |> get("/api/v1/notifications?exclude_visibilities[]=direct") +        |> json_response_and_validate_schema(200)          |> Enum.map(& &1["status"]["id"])        assert public_activity.id in activity_ids @@ -248,8 +243,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        activity_ids =          conn -        |> get("/api/v1/notifications", %{exclude_visibilities: ["unlisted"]}) -        |> json_response(200) +        |> get("/api/v1/notifications?exclude_visibilities[]=unlisted") +        |> json_response_and_validate_schema(200)          |> Enum.map(& &1["status"]["id"])        assert public_activity.id in activity_ids @@ -259,8 +254,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        activity_ids =          conn -        |> get("/api/v1/notifications", %{exclude_visibilities: ["private"]}) -        |> json_response(200) +        |> get("/api/v1/notifications?exclude_visibilities[]=private") +        |> json_response_and_validate_schema(200)          |> Enum.map(& &1["status"]["id"])        assert public_activity.id in activity_ids @@ -270,8 +265,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        activity_ids =          conn -        |> get("/api/v1/notifications", %{exclude_visibilities: ["public"]}) -        |> json_response(200) +        |> get("/api/v1/notifications?exclude_visibilities[]=public") +        |> json_response_and_validate_schema(200)          |> Enum.map(& &1["status"]["id"])        refute public_activity.id in activity_ids @@ -295,8 +290,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        activity_ids =          conn -        |> get("/api/v1/notifications", %{exclude_visibilities: ["unlisted"]}) -        |> json_response(200) +        |> get("/api/v1/notifications?exclude_visibilities[]=unlisted") +        |> json_response_and_validate_schema(200)          |> Enum.map(& &1["status"]["id"])        assert public_activity.id in activity_ids @@ -319,25 +314,27 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      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", %{exclude_types: ["mention", "favourite", "reblog"]}) +    query = params_to_query(%{exclude_types: ["mention", "favourite", "reblog"]}) +    conn_res = get(conn, "/api/v1/notifications?" <> query) -    assert [%{"id" => ^follow_notification_id}] = json_response(conn_res, 200) +    assert [%{"id" => ^follow_notification_id}] = json_response_and_validate_schema(conn_res, 200) -    conn_res = -      get(conn, "/api/v1/notifications", %{exclude_types: ["favourite", "reblog", "follow"]}) +    query = params_to_query(%{exclude_types: ["favourite", "reblog", "follow"]}) +    conn_res = get(conn, "/api/v1/notifications?" <> query) -    assert [%{"id" => ^mention_notification_id}] = json_response(conn_res, 200) +    assert [%{"id" => ^mention_notification_id}] = +             json_response_and_validate_schema(conn_res, 200) -    conn_res = -      get(conn, "/api/v1/notifications", %{exclude_types: ["reblog", "follow", "mention"]}) +    query = params_to_query(%{exclude_types: ["reblog", "follow", "mention"]}) +    conn_res = get(conn, "/api/v1/notifications?" <> query) -    assert [%{"id" => ^favorite_notification_id}] = json_response(conn_res, 200) +    assert [%{"id" => ^favorite_notification_id}] = +             json_response_and_validate_schema(conn_res, 200) -    conn_res = -      get(conn, "/api/v1/notifications", %{exclude_types: ["follow", "mention", "favourite"]}) +    query = params_to_query(%{exclude_types: ["follow", "mention", "favourite"]}) +    conn_res = get(conn, "/api/v1/notifications?" <> query) -    assert [%{"id" => ^reblog_notification_id}] = json_response(conn_res, 200) +    assert [%{"id" => ^reblog_notification_id}] = json_response_and_validate_schema(conn_res, 200)    end    test "filters notifications using include_types" do @@ -355,32 +352,34 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      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"]}) +    conn_res = get(conn, "/api/v1/notifications?include_types[]=follow") -    assert [%{"id" => ^follow_notification_id}] = json_response(conn_res, 200) +    assert [%{"id" => ^follow_notification_id}] = json_response_and_validate_schema(conn_res, 200) -    conn_res = get(conn, "/api/v1/notifications", %{include_types: ["mention"]}) +    conn_res = get(conn, "/api/v1/notifications?include_types[]=mention") -    assert [%{"id" => ^mention_notification_id}] = json_response(conn_res, 200) +    assert [%{"id" => ^mention_notification_id}] = +             json_response_and_validate_schema(conn_res, 200) -    conn_res = get(conn, "/api/v1/notifications", %{include_types: ["favourite"]}) +    conn_res = get(conn, "/api/v1/notifications?include_types[]=favourite") -    assert [%{"id" => ^favorite_notification_id}] = json_response(conn_res, 200) +    assert [%{"id" => ^favorite_notification_id}] = +             json_response_and_validate_schema(conn_res, 200) -    conn_res = get(conn, "/api/v1/notifications", %{include_types: ["reblog"]}) +    conn_res = get(conn, "/api/v1/notifications?include_types[]=reblog") -    assert [%{"id" => ^reblog_notification_id}] = json_response(conn_res, 200) +    assert [%{"id" => ^reblog_notification_id}] = json_response_and_validate_schema(conn_res, 200) -    result = conn |> get("/api/v1/notifications") |> json_response(200) +    result = conn |> get("/api/v1/notifications") |> json_response_and_validate_schema(200)      assert length(result) == 4 +    query = params_to_query(%{include_types: ["follow", "mention", "favourite", "reblog"]}) +      result =        conn -      |> get("/api/v1/notifications", %{ -        include_types: ["follow", "mention", "favourite", "reblog"] -      }) -      |> json_response(200) +      |> get("/api/v1/notifications?" <> query) +      |> json_response_and_validate_schema(200)      assert length(result) == 4    end @@ -402,7 +401,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      result =        conn        |> get("/api/v1/notifications") -      |> json_response(:ok) +      |> json_response_and_validate_schema(:ok)      assert [%{"id" => ^notification2_id}, %{"id" => ^notification1_id}] = result @@ -414,22 +413,19 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      result =        conn2        |> get("/api/v1/notifications") -      |> json_response(:ok) +      |> json_response_and_validate_schema(:ok)      assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result -    conn_destroy = -      conn -      |> delete("/api/v1/notifications/destroy_multiple", %{ -        "ids" => [notification1_id, notification2_id] -      }) +    query = params_to_query(%{ids: [notification1_id, notification2_id]}) +    conn_destroy = delete(conn, "/api/v1/notifications/destroy_multiple?" <> query) -    assert json_response(conn_destroy, 200) == %{} +    assert json_response_and_validate_schema(conn_destroy, 200) == %{}      result =        conn2        |> get("/api/v1/notifications") -      |> json_response(:ok) +      |> json_response_and_validate_schema(:ok)      assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result    end @@ -443,13 +439,13 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      ret_conn = get(conn, "/api/v1/notifications") -    assert length(json_response(ret_conn, 200)) == 1 +    assert length(json_response_and_validate_schema(ret_conn, 200)) == 1      {:ok, _user_relationships} = User.mute(user, user2)      conn = get(conn, "/api/v1/notifications") -    assert json_response(conn, 200) == [] +    assert json_response_and_validate_schema(conn, 200) == []    end    test "see notifications after muting user without notifications" do @@ -461,13 +457,13 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      ret_conn = get(conn, "/api/v1/notifications") -    assert length(json_response(ret_conn, 200)) == 1 +    assert length(json_response_and_validate_schema(ret_conn, 200)) == 1      {:ok, _user_relationships} = User.mute(user, user2, false)      conn = get(conn, "/api/v1/notifications") -    assert length(json_response(conn, 200)) == 1 +    assert length(json_response_and_validate_schema(conn, 200)) == 1    end    test "see notifications after muting user with notifications and with_muted parameter" do @@ -479,13 +475,13 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      ret_conn = get(conn, "/api/v1/notifications") -    assert length(json_response(ret_conn, 200)) == 1 +    assert length(json_response_and_validate_schema(ret_conn, 200)) == 1      {:ok, _user_relationships} = User.mute(user, user2) -    conn = get(conn, "/api/v1/notifications", %{"with_muted" => "true"}) +    conn = get(conn, "/api/v1/notifications?with_muted=true") -    assert length(json_response(conn, 200)) == 1 +    assert length(json_response_and_validate_schema(conn, 200)) == 1    end    @tag capture_log: true @@ -512,7 +508,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      conn = get(conn, "/api/v1/notifications") -    assert length(json_response(conn, 200)) == 1 +    assert length(json_response_and_validate_schema(conn, 200)) == 1    end    describe "link headers" do @@ -538,10 +534,10 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        conn =          conn          |> assign(:user, user) -        |> get("/api/v1/notifications", %{media_only: true}) +        |> get("/api/v1/notifications?limit=5")        assert [link_header] = get_resp_header(conn, "link") -      assert link_header =~ ~r/media_only=true/ +      assert link_header =~ ~r/limit=5/        assert link_header =~ ~r/min_id=#{notification2.id}/        assert link_header =~ ~r/max_id=#{notification1.id}/      end @@ -560,14 +556,14 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        assert [%{"account" => %{"id" => ^account_id}}] =                 conn                 |> assign(:user, user) -               |> get("/api/v1/notifications", %{account_id: account_id}) -               |> json_response(200) +               |> get("/api/v1/notifications?account_id=#{account_id}") +               |> json_response_and_validate_schema(200)        assert %{"error" => "Account is not found"} =                 conn                 |> assign(:user, user) -               |> get("/api/v1/notifications", %{account_id: "cofe"}) -               |> json_response(404) +               |> get("/api/v1/notifications?account_id=cofe") +               |> json_response_and_validate_schema(404)      end    end @@ -577,4 +573,11 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      |> Map.get(:id)      |> to_string()    end + +  defp params_to_query(%{} = params) do +    Enum.map_join(params, "&", fn +      {k, v} when is_list(v) -> Enum.map_join(v, "&", &"#{k}[]=#{&1}") +      {k, v} -> k <> "=" <> v +    end) +  end  end diff --git a/test/web/mastodon_api/controllers/report_controller_test.exs b/test/web/mastodon_api/controllers/report_controller_test.exs index 34ec8119e..21b037237 100644 --- a/test/web/mastodon_api/controllers/report_controller_test.exs +++ b/test/web/mastodon_api/controllers/report_controller_test.exs @@ -22,8 +22,9 @@ defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do    test "submit a basic report", %{conn: conn, target_user: target_user} do      assert %{"action_taken" => false, "id" => _} =               conn +             |> put_req_header("content-type", "application/json")               |> post("/api/v1/reports", %{"account_id" => target_user.id}) -             |> json_response(200) +             |> json_response_and_validate_schema(200)    end    test "submit a report with statuses and comment", %{ @@ -33,23 +34,25 @@ defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do    } do      assert %{"action_taken" => false, "id" => _} =               conn +             |> put_req_header("content-type", "application/json")               |> post("/api/v1/reports", %{                 "account_id" => target_user.id,                 "status_ids" => [activity.id],                 "comment" => "bad status!",                 "forward" => "false"               }) -             |> json_response(200) +             |> json_response_and_validate_schema(200)    end    test "account_id is required", %{      conn: conn,      activity: activity    } do -    assert %{"error" => "Valid `account_id` required"} = +    assert %{"error" => "Missing field: account_id."} =               conn +             |> put_req_header("content-type", "application/json")               |> post("/api/v1/reports", %{"status_ids" => [activity.id]}) -             |> json_response(400) +             |> json_response_and_validate_schema(400)    end    test "comment must be up to the size specified in the config", %{ @@ -63,17 +66,21 @@ defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do      assert ^error =               conn +             |> put_req_header("content-type", "application/json")               |> post("/api/v1/reports", %{"account_id" => target_user.id, "comment" => comment}) -             |> json_response(400) +             |> json_response_and_validate_schema(400)    end    test "returns error when account is not exist", %{      conn: conn,      activity: activity    } do -    conn = post(conn, "/api/v1/reports", %{"status_ids" => [activity.id], "account_id" => "foo"}) +    conn = +      conn +      |> put_req_header("content-type", "application/json") +      |> post("/api/v1/reports", %{"status_ids" => [activity.id], "account_id" => "foo"}) -    assert json_response(conn, 400) == %{"error" => "Account not found"} +    assert json_response_and_validate_schema(conn, 400) == %{"error" => "Account not found"}    end    test "doesn't fail if an admin has no email", %{conn: conn, target_user: target_user} do @@ -81,7 +88,8 @@ defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do      assert %{"action_taken" => false, "id" => _} =               conn +             |> put_req_header("content-type", "application/json")               |> post("/api/v1/reports", %{"account_id" => target_user.id}) -             |> json_response(200) +             |> json_response_and_validate_schema(200)    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 8d0e70db8..f120bd0cd 100644 --- a/test/web/mastodon_api/controllers/suggestion_controller_test.exs +++ b/test/web/mastodon_api/controllers/suggestion_controller_test.exs @@ -5,8 +5,6 @@  defmodule Pleroma.Web.MastodonAPI.SuggestionControllerTest do    use Pleroma.Web.ConnCase -  alias Pleroma.Config -    setup do: oauth_access(["read"])    test "returns empty result", %{conn: conn} do diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs index 75f184242..bb4bc4396 100644 --- a/test/web/mastodon_api/mastodon_api_controller_test.exs +++ b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -7,35 +7,28 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do    describe "empty_array/2 (stubs)" do      test "GET /api/v1/accounts/:id/identity_proofs" do -      %{user: user, conn: conn} = oauth_access(["n/a"]) +      %{user: user, conn: conn} = oauth_access(["read:accounts"]) -      res = -        conn -        |> assign(:user, user) -        |> get("/api/v1/accounts/#{user.id}/identity_proofs") -        |> json_response(200) - -      assert res == [] +      assert [] == +               conn +               |> get("/api/v1/accounts/#{user.id}/identity_proofs") +               |> json_response(200)      end      test "GET /api/v1/endorsements" do        %{conn: conn} = oauth_access(["read:accounts"]) -      res = -        conn -        |> get("/api/v1/endorsements") -        |> json_response(200) - -      assert res == [] +      assert [] == +               conn +               |> get("/api/v1/endorsements") +               |> json_response(200)      end      test "GET /api/v1/trends", %{conn: conn} do -      res = -        conn -        |> get("/api/v1/trends") -        |> json_response(200) - -      assert res == [] +      assert [] == +               conn +               |> get("/api/v1/trends") +               |> json_response(200)      end    end  end | 
