diff options
| author | Ivan Tashkinov <ivantashkinov@gmail.com> | 2020-04-28 19:56:20 +0300 | 
|---|---|---|
| committer | Ivan Tashkinov <ivantashkinov@gmail.com> | 2020-04-28 19:56:20 +0300 | 
| commit | 908cf22a6cb07044eb0fb44c9673c8adcf22c0db (patch) | |
| tree | b522172092989cb1d1312f846974ff55493fbee9 /test/web/mastodon_api/controllers | |
| parent | b4139cc5472079a34f0256ac9991a0222844d44c (diff) | |
| parent | 699fc9569fa06278baaec6804348375cb9891185 (diff) | |
| download | pleroma-908cf22a6cb07044eb0fb44c9673c8adcf22c0db.tar.gz pleroma-908cf22a6cb07044eb0fb44c9673c8adcf22c0db.zip | |
Merge remote-tracking branch 'remotes/origin/develop' into automatic-authentication-and-instance-publicity-checks
# Conflicts:
#	lib/pleroma/web/mastodon_api/controllers/account_controller.ex
Diffstat (limited to 'test/web/mastodon_api/controllers')
6 files changed, 378 insertions, 358 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..ba70ba66c 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) +      %User{id: user_id} = insert(:user) -      conn = -        build_conn() -        |> get("/api/v1/accounts/#{user.id}") - -      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"}) +      {:ok, %{id: post_id}} = CommonAPI.post(user, %{"status" => "HI!!!"}) +      {:ok, _, _} = CommonAPI.repeat(post_id, user) -      assert [%{"id" => id}] = json_response(conn, 200) -      assert id == to_string(post.id) +      conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?exclude_reblogs=true") +      assert [%{"id" => ^post_id}] = json_response_and_validate_schema(conn, 200) -      conn = get(conn, "/api/v1/accounts/#{user.id}/statuses", %{"exclude_reblogs" => "1"}) - -      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}") +      {: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) -      assert [%{"id" => id3}, %{"id" => id2}] = json_response(res_conn, 200) -      assert id3 == follower3.id -      assert id2 == follower2.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) -      res_conn = get(conn, "/api/v1/accounts/#{user.id}/followers?max_id=#{follower3.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) -      assert [%{"id" => id2}, %{"id" => id1}] = json_response(res_conn, 200) -      assert id2 == follower2.id -      assert id1 == follower1.id +      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) +    test "returns pinned statuses", %{conn: conn, user: user, activity: %{id: activity_id}} 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) - -      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,27 @@ 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 parameters"}        res =          conn          |> Map.put(:remote_ip, {127, 0, 0, 6})          |> post("/api/v1/accounts", Map.put(valid_params, :email, "")) -      assert json_response(res, 400) == %{"error" => "{\"email\":[\"can't be blank\"]}"} +      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 +943,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 +956,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 +990,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 +1000,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 +1013,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 +1052,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 +1069,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 +1087,9 @@ 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 @@ -1064,15 +1097,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 +1112,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 +1125,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 +1137,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 +1148,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 +1178,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 +1193,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/app_controller_test.exs b/test/web/mastodon_api/controllers/app_controller_test.exs index e7b11d14e..a0b8b126c 100644 --- a/test/web/mastodon_api/controllers/app_controller_test.exs +++ b/test/web/mastodon_api/controllers/app_controller_test.exs @@ -27,7 +27,7 @@ defmodule Pleroma.Web.MastodonAPI.AppControllerTest do        "vapid_key" => Push.vapid_config() |> Keyword.get(:public_key)      } -    assert expected == json_response(conn, 200) +    assert expected == json_response_and_validate_schema(conn, 200)    end    test "creates an oauth app", %{conn: conn} do @@ -55,6 +55,6 @@ defmodule Pleroma.Web.MastodonAPI.AppControllerTest do        "vapid_key" => Push.vapid_config() |> Keyword.get(:public_key)      } -    assert expected == json_response(conn, 200) +    assert expected == 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 0b2ffa470..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,16 +4,12 @@  defmodule Pleroma.Web.MastodonAPI.CustomEmojiControllerTest do    use Pleroma.Web.ConnCase, async: true -  alias Pleroma.Web.ApiSpec -  alias Pleroma.Web.ApiSpec.Schemas.CustomEmoji -  alias Pleroma.Web.ApiSpec.Schemas.CustomEmojisResponse -  import OpenApiSpex.TestAssertions    test "with tags", %{conn: conn} do      assert resp =               conn               |> get("/api/v1/custom_emojis") -             |> json_response(200) +             |> json_response_and_validate_schema(200)      assert [emoji | _body] = resp      assert Map.has_key?(emoji, "shortcode") @@ -23,19 +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(resp, "CustomEmojisResponse", ApiSpec.spec()) -    assert_schema(emoji, "CustomEmoji", ApiSpec.spec()) -  end - -  test "CustomEmoji example matches schema" do -    api_spec = ApiSpec.spec() -    schema = CustomEmoji.schema() -    assert_schema(schema.example, "CustomEmoji", api_spec) -  end - -  test "CustomEmojisResponse example matches schema" do -    api_spec = ApiSpec.spec() -    schema = CustomEmojisResponse.schema() -    assert_schema(schema.example, "CustomEmojisResponse", api_spec)    end  end diff --git a/test/web/mastodon_api/controllers/domain_block_controller_test.exs b/test/web/mastodon_api/controllers/domain_block_controller_test.exs index d66190c90..01a24afcf 100644 --- a/test/web/mastodon_api/controllers/domain_block_controller_test.exs +++ b/test/web/mastodon_api/controllers/domain_block_controller_test.exs @@ -6,11 +6,8 @@ defmodule Pleroma.Web.MastodonAPI.DomainBlockControllerTest do    use Pleroma.Web.ConnCase    alias Pleroma.User -  alias Pleroma.Web.ApiSpec -  alias Pleroma.Web.ApiSpec.Schemas.DomainBlocksResponse    import Pleroma.Factory -  import OpenApiSpex.TestAssertions    test "blocking / unblocking a domain" do      %{user: user, conn: conn} = oauth_access(["write:blocks"]) @@ -21,7 +18,7 @@ defmodule Pleroma.Web.MastodonAPI.DomainBlockControllerTest do        |> put_req_header("content-type", "application/json")        |> post("/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"}) -    assert %{} = json_response(ret_conn, 200) +    assert %{} == json_response_and_validate_schema(ret_conn, 200)      user = User.get_cached_by_ap_id(user.ap_id)      assert User.blocks?(user, other_user) @@ -30,7 +27,7 @@ defmodule Pleroma.Web.MastodonAPI.DomainBlockControllerTest do        |> put_req_header("content-type", "application/json")        |> delete("/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"}) -    assert %{} = json_response(ret_conn, 200) +    assert %{} == json_response_and_validate_schema(ret_conn, 200)      user = User.get_cached_by_ap_id(user.ap_id)      refute User.blocks?(user, other_user)    end @@ -41,21 +38,10 @@ defmodule Pleroma.Web.MastodonAPI.DomainBlockControllerTest do      {:ok, user} = User.block_domain(user, "bad.site")      {:ok, user} = User.block_domain(user, "even.worse.site") -    conn = -      conn -      |> assign(:user, user) -      |> get("/api/v1/domain_blocks") - -    domain_blocks = json_response(conn, 200) - -    assert "bad.site" in domain_blocks -    assert "even.worse.site" in domain_blocks -    assert_schema(domain_blocks, "DomainBlocksResponse", ApiSpec.spec()) -  end - -  test "DomainBlocksResponse example matches schema" do -    api_spec = ApiSpec.spec() -    schema = DomainBlocksResponse.schema() -    assert_schema(schema.example, "DomainBlocksResponse", api_spec) +    assert ["even.worse.site", "bad.site"] == +             conn +             |> assign(:user, user) +             |> get("/api/v1/domain_blocks") +             |> json_response_and_validate_schema(200)    end  end diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index 162f7b1b2..85068edd0 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -302,6 +302,17 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        assert [] == Repo.all(Activity)      end +    test "ignores nil values", %{conn: conn} do +      conn = +        post(conn, "/api/v1/statuses", %{ +          "status" => "not scheduled", +          "scheduled_at" => nil +        }) + +      assert result = json_response(conn, 200) +      assert Activity.get_by_id(result["id"]) +    end +      test "creates a scheduled activity with a media attachment", %{user: user, conn: conn} do        scheduled_at = NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(120), :millisecond) | 
