diff options
| author | lain <lain@soykaf.club> | 2020-05-06 11:44:30 +0200 | 
|---|---|---|
| committer | lain <lain@soykaf.club> | 2020-05-06 11:44:30 +0200 | 
| commit | 205313e54146c00374e3edfa951132a7229fa16d (patch) | |
| tree | db392c5ef71a2a40fb8a041635d2536b34dc454d /test | |
| parent | 9637cded21cef1e6c531dd46d5f5245c4c3ed03c (diff) | |
| parent | 07e7c80bc9e919cd92ca9dda1e21384142e5bd77 (diff) | |
| download | pleroma-205313e54146c00374e3edfa951132a7229fa16d.tar.gz pleroma-205313e54146c00374e3edfa951132a7229fa16d.zip | |
Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into remake-remodel-dms
Diffstat (limited to 'test')
19 files changed, 356 insertions, 109 deletions
| diff --git a/test/filter_test.exs b/test/filter_test.exs index b2a8330ee..63a30c736 100644 --- a/test/filter_test.exs +++ b/test/filter_test.exs @@ -141,17 +141,15 @@ defmodule Pleroma.FilterTest do        context: ["home"]      } -    query_two = %Pleroma.Filter{ -      user_id: user.id, -      filter_id: 1, +    changes = %{        phrase: "who",        context: ["home", "timeline"]      }      {:ok, filter_one} = Pleroma.Filter.create(query_one) -    {:ok, filter_two} = Pleroma.Filter.update(query_two) +    {:ok, filter_two} = Pleroma.Filter.update(filter_one, changes)      assert filter_one != filter_two -    assert filter_two.phrase == query_two.phrase -    assert filter_two.context == query_two.context +    assert filter_two.phrase == changes.phrase +    assert filter_two.context == changes.context    end  end diff --git a/test/plugs/ensure_authenticated_plug_test.exs b/test/plugs/ensure_authenticated_plug_test.exs index 689fe757f..4e6142aab 100644 --- a/test/plugs/ensure_authenticated_plug_test.exs +++ b/test/plugs/ensure_authenticated_plug_test.exs @@ -27,8 +27,8 @@ defmodule Pleroma.Plugs.EnsureAuthenticatedPlugTest do    describe "with :if_func / :unless_func options" do      setup do        %{ -        true_fn: fn -> true end, -        false_fn: fn -> false end +        true_fn: fn _conn -> true end, +        false_fn: fn _conn -> false end        }      end diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index fa30a0c41..91c03b1a8 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -74,7 +74,7 @@ defmodule Pleroma.Web.ConnCase do          status = Plug.Conn.Status.code(status)          unless lookup[op_id].responses[status] do -          err = "Response schema not found for #{conn.status} #{conn.method} #{conn.request_path}" +          err = "Response schema not found for #{status} #{conn.method} #{conn.request_path}"            flunk(err)          end diff --git a/test/support/helpers.ex b/test/support/helpers.ex index e68e9bfd2..26281b45e 100644 --- a/test/support/helpers.ex +++ b/test/support/helpers.ex @@ -40,12 +40,18 @@ defmodule Pleroma.Tests.Helpers do            clear_config: 2          ] -      def to_datetime(naive_datetime) do +      def to_datetime(%NaiveDateTime{} = naive_datetime) do          naive_datetime          |> DateTime.from_naive!("Etc/UTC")          |> DateTime.truncate(:second)        end +      def to_datetime(datetime) when is_binary(datetime) do +        datetime +        |> NaiveDateTime.from_iso8601!() +        |> to_datetime() +      end +        def collect_ids(collection) do          collection          |> Enum.map(& &1.id) diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index 9624cb0f7..3a95e92da 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -211,7 +211,7 @@ defmodule HttpRequestMock do    end    def get( -        "https://squeet.me/xrd/?uri=lain@squeet.me", +        "https://squeet.me/xrd/?uri=acct:lain@squeet.me",          _,          _,          [{"accept", "application/xrd+xml,application/jrd+json"}] @@ -870,7 +870,7 @@ defmodule HttpRequestMock do    end    def get( -        "https://social.heldscal.la/.well-known/webfinger?resource=shp@social.heldscal.la", +        "https://social.heldscal.la/.well-known/webfinger?resource=acct:shp@social.heldscal.la",          _,          _,          [{"accept", "application/xrd+xml,application/jrd+json"}] @@ -883,7 +883,7 @@ defmodule HttpRequestMock do    end    def get( -        "https://social.heldscal.la/.well-known/webfinger?resource=invalid_content@social.heldscal.la", +        "https://social.heldscal.la/.well-known/webfinger?resource=acct:invalid_content@social.heldscal.la",          _,          _,          [{"accept", "application/xrd+xml,application/jrd+json"}] @@ -900,7 +900,7 @@ defmodule HttpRequestMock do    end    def get( -        "http://framatube.org/main/xrd?uri=framasoft@framatube.org", +        "http://framatube.org/main/xrd?uri=acct:framasoft@framatube.org",          _,          _,          [{"accept", "application/xrd+xml,application/jrd+json"}] @@ -959,7 +959,7 @@ defmodule HttpRequestMock do    end    def get( -        "https://gerzilla.de/xrd/?uri=kaniini@gerzilla.de", +        "https://gerzilla.de/xrd/?uri=acct:kaniini@gerzilla.de",          _,          _,          [{"accept", "application/xrd+xml,application/jrd+json"}] @@ -1155,7 +1155,7 @@ defmodule HttpRequestMock do    end    def get( -        "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=lain@zetsubou.xn--q9jyb4c", +        "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=acct:lain@zetsubou.xn--q9jyb4c",          _,          _,          [{"accept", "application/xrd+xml,application/jrd+json"}] @@ -1168,7 +1168,7 @@ defmodule HttpRequestMock do    end    def get( -        "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=https://zetsubou.xn--q9jyb4c/users/lain", +        "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=acct:https://zetsubou.xn--q9jyb4c/users/lain",          _,          _,          [{"accept", "application/xrd+xml,application/jrd+json"}] diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index a8f1f0e26..5c8d20ac4 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -820,21 +820,29 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        activity: activity      } do        user = insert(:user) +      conn = assign(conn, :user, user)        object = Map.put(activity["object"], "sensitive", true)        activity = Map.put(activity, "object", object) -      result = +      response =          conn -        |> assign(:user, user)          |> put_req_header("content-type", "application/activity+json")          |> post("/users/#{user.nickname}/outbox", activity)          |> json_response(201) -      assert Activity.get_by_ap_id(result["id"]) -      assert result["object"] -      assert %Object{data: object} = Object.normalize(result["object"]) -      assert object["sensitive"] == activity["object"]["sensitive"] -      assert object["content"] == activity["object"]["content"] +      assert Activity.get_by_ap_id(response["id"]) +      assert response["object"] +      assert %Object{data: response_object} = Object.normalize(response["object"]) +      assert response_object["sensitive"] == true +      assert response_object["content"] == activity["object"]["content"] + +      representation = +        conn +        |> put_req_header("accept", "application/activity+json") +        |> get(response["id"]) +        |> json_response(200) + +      assert representation["object"]["sensitive"] == true      end      test "it rejects an incoming activity with bogus type", %{conn: conn, activity: activity} do diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index edd7dfb22..84ead93bb 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -18,9 +18,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.Federator +  import ExUnit.CaptureLog +  import Mock    import Pleroma.Factory    import Tesla.Mock -  import Mock    setup do      mock(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -2403,4 +2404,51 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do       u3: %{r1: r3_1.id, r2: r3_2.id},       u4: %{r1: r4_1.id}}    end + +  describe "maybe_update_follow_information/1" do +    setup do +      clear_config([:instance, :external_user_synchronization], true) + +      user = %{ +        local: false, +        ap_id: "https://gensokyo.2hu/users/raymoo", +        following_address: "https://gensokyo.2hu/users/following", +        follower_address: "https://gensokyo.2hu/users/followers", +        type: "Person" +      } + +      %{user: user} +    end + +    test "logs an error when it can't fetch the info", %{user: user} do +      assert capture_log(fn -> +               ActivityPub.maybe_update_follow_information(user) +             end) =~ "Follower/Following counter update for #{user.ap_id} failed" +    end + +    test "just returns the input if the user type is Application", %{ +      user: user +    } do +      user = +        user +        |> Map.put(:type, "Application") + +      refute capture_log(fn -> +               assert ^user = ActivityPub.maybe_update_follow_information(user) +             end) =~ "Follower/Following counter update for #{user.ap_id} failed" +    end + +    test "it just returns the input if the user has no following/follower addresses", %{ +      user: user +    } do +      user = +        user +        |> Map.put(:following_address, nil) +        |> Map.put(:follower_address, nil) + +      refute capture_log(fn -> +               assert ^user = ActivityPub.maybe_update_follow_information(user) +             end) =~ "Follower/Following counter update for #{user.ap_id} failed" +    end +  end  end diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index 1862a9589..78c79bb07 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -19,6 +19,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User    alias Pleroma.UserInviteToken +  alias Pleroma.Web    alias Pleroma.Web.ActivityPub.Relay    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.MediaProxy @@ -737,6 +738,39 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do               }      end +    test "pagination works correctly with service users", %{conn: conn} do +      service1 = insert(:user, ap_id: Web.base_url() <> "/relay") +      service2 = insert(:user, ap_id: Web.base_url() <> "/internal/fetch") +      insert_list(25, :user) + +      assert %{"count" => 26, "page_size" => 10, "users" => users1} = +               conn +               |> get("/api/pleroma/admin/users?page=1&filters=", %{page_size: "10"}) +               |> json_response(200) + +      assert Enum.count(users1) == 10 +      assert service1 not in [users1] +      assert service2 not in [users1] + +      assert %{"count" => 26, "page_size" => 10, "users" => users2} = +               conn +               |> get("/api/pleroma/admin/users?page=2&filters=", %{page_size: "10"}) +               |> json_response(200) + +      assert Enum.count(users2) == 10 +      assert service1 not in [users2] +      assert service2 not in [users2] + +      assert %{"count" => 26, "page_size" => 10, "users" => users3} = +               conn +               |> get("/api/pleroma/admin/users?page=3&filters=", %{page_size: "10"}) +               |> json_response(200) + +      assert Enum.count(users3) == 6 +      assert service1 not in [users3] +      assert service2 not in [users3] +    end +      test "renders empty array for the second page", %{conn: conn} do        insert(:user) @@ -1620,6 +1654,25 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end +  describe "GET /api/pleroma/admin/statuses/:id" do +    test "not found", %{conn: conn} do +      assert conn +             |> get("/api/pleroma/admin/statuses/not_found") +             |> json_response(:not_found) +    end + +    test "shows activity", %{conn: conn} do +      activity = insert(:note_activity) + +      response = +        conn +        |> get("/api/pleroma/admin/statuses/#{activity.id}") +        |> json_response(200) + +      assert response["id"] == activity.id +    end +  end +    describe "PUT /api/pleroma/admin/statuses/:id" do      setup do        activity = insert(:note_activity) @@ -3526,7 +3579,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end      test "success", %{conn: conn} do -      base_url = Pleroma.Web.base_url() +      base_url = Web.base_url()        app_name = "Trusted app"        response = @@ -3547,7 +3600,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end      test "with trusted", %{conn: conn} do -      base_url = Pleroma.Web.base_url() +      base_url = Web.base_url()        app_name = "Trusted app"        response = diff --git a/test/web/mastodon_api/controllers/conversation_controller_test.exs b/test/web/mastodon_api/controllers/conversation_controller_test.exs index 801b0259b..04695572e 100644 --- a/test/web/mastodon_api/controllers/conversation_controller_test.exs +++ b/test/web/mastodon_api/controllers/conversation_controller_test.exs @@ -36,7 +36,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do      res_conn = get(conn, "/api/v1/conversations") -    assert response = json_response(res_conn, 200) +    assert response = json_response_and_validate_schema(res_conn, 200)      assert [               %{ @@ -91,18 +91,18 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do          "visibility" => "direct"        }) -    [conversation1, conversation2] = -      conn -      |> get("/api/v1/conversations", %{"recipients" => [user_two.id]}) -      |> json_response(200) +    assert [conversation1, conversation2] = +             conn +             |> get("/api/v1/conversations?recipients[]=#{user_two.id}") +             |> json_response_and_validate_schema(200)      assert conversation1["last_status"]["id"] == direct5.id      assert conversation2["last_status"]["id"] == direct1.id      [conversation1] =        conn -      |> get("/api/v1/conversations", %{"recipients" => [user_two.id, user_three.id]}) -      |> json_response(200) +      |> get("/api/v1/conversations?recipients[]=#{user_two.id}&recipients[]=#{user_three.id}") +      |> json_response_and_validate_schema(200)      assert conversation1["last_status"]["id"] == direct3.id    end @@ -126,7 +126,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do      [%{"last_status" => res_last_status}] =        conn        |> get("/api/v1/conversations") -      |> json_response(200) +      |> json_response_and_validate_schema(200)      assert res_last_status["id"] == direct_reply.id    end @@ -154,12 +154,12 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do      [%{"id" => direct_conversation_id, "unread" => true}] =        user_two_conn        |> get("/api/v1/conversations") -      |> json_response(200) +      |> json_response_and_validate_schema(200)      %{"unread" => false} =        user_two_conn        |> post("/api/v1/conversations/#{direct_conversation_id}/read") -      |> json_response(200) +      |> json_response_and_validate_schema(200)      assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0      assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 @@ -175,7 +175,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do      [%{"unread" => true}] =        conn        |> get("/api/v1/conversations") -      |> json_response(200) +      |> json_response_and_validate_schema(200)      assert User.get_cached_by_id(user_one.id).unread_conversation_count == 1      assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 diff --git a/test/web/mastodon_api/controllers/filter_controller_test.exs b/test/web/mastodon_api/controllers/filter_controller_test.exs index 97ab005e0..f29547d13 100644 --- a/test/web/mastodon_api/controllers/filter_controller_test.exs +++ b/test/web/mastodon_api/controllers/filter_controller_test.exs @@ -15,9 +15,12 @@ defmodule Pleroma.Web.MastodonAPI.FilterControllerTest do        context: ["home"]      } -    conn = post(conn, "/api/v1/filters", %{"phrase" => filter.phrase, context: filter.context}) +    conn = +      conn +      |> put_req_header("content-type", "application/json") +      |> post("/api/v1/filters", %{"phrase" => filter.phrase, context: filter.context}) -    assert response = json_response(conn, 200) +    assert response = json_response_and_validate_schema(conn, 200)      assert response["phrase"] == filter.phrase      assert response["context"] == filter.context      assert response["irreversible"] == false @@ -48,12 +51,12 @@ defmodule Pleroma.Web.MastodonAPI.FilterControllerTest do      response =        conn        |> get("/api/v1/filters") -      |> json_response(200) +      |> json_response_and_validate_schema(200)      assert response ==               render_json(                 FilterView, -               "filters.json", +               "index.json",                 filters: [filter_two, filter_one]               )    end @@ -72,7 +75,7 @@ defmodule Pleroma.Web.MastodonAPI.FilterControllerTest do      conn = get(conn, "/api/v1/filters/#{filter.filter_id}") -    assert _response = json_response(conn, 200) +    assert response = json_response_and_validate_schema(conn, 200)    end    test "update a filter" do @@ -82,7 +85,8 @@ defmodule Pleroma.Web.MastodonAPI.FilterControllerTest do        user_id: user.id,        filter_id: 2,        phrase: "knight", -      context: ["home"] +      context: ["home"], +      hide: true      }      {:ok, _filter} = Pleroma.Filter.create(query) @@ -93,14 +97,17 @@ defmodule Pleroma.Web.MastodonAPI.FilterControllerTest do      }      conn = -      put(conn, "/api/v1/filters/#{query.filter_id}", %{ +      conn +      |> put_req_header("content-type", "application/json") +      |> put("/api/v1/filters/#{query.filter_id}", %{          phrase: new.phrase,          context: new.context        }) -    assert response = json_response(conn, 200) +    assert response = json_response_and_validate_schema(conn, 200)      assert response["phrase"] == new.phrase      assert response["context"] == new.context +    assert response["irreversible"] == true    end    test "delete a filter" do @@ -117,7 +124,6 @@ defmodule Pleroma.Web.MastodonAPI.FilterControllerTest do      conn = delete(conn, "/api/v1/filters/#{filter.filter_id}") -    assert response = json_response(conn, 200) -    assert response == %{} +    assert json_response_and_validate_schema(conn, 200) == %{}    end  end diff --git a/test/web/mastodon_api/controllers/follow_request_controller_test.exs b/test/web/mastodon_api/controllers/follow_request_controller_test.exs index d8dbe4800..44e12d15a 100644 --- a/test/web/mastodon_api/controllers/follow_request_controller_test.exs +++ b/test/web/mastodon_api/controllers/follow_request_controller_test.exs @@ -27,7 +27,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do        conn = get(conn, "/api/v1/follow_requests") -      assert [relationship] = json_response(conn, 200) +      assert [relationship] = json_response_and_validate_schema(conn, 200)        assert to_string(other_user.id) == relationship["id"]      end @@ -44,7 +44,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do        conn = post(conn, "/api/v1/follow_requests/#{other_user.id}/authorize") -      assert relationship = json_response(conn, 200) +      assert relationship = json_response_and_validate_schema(conn, 200)        assert to_string(other_user.id) == relationship["id"]        user = User.get_cached_by_id(user.id) @@ -62,7 +62,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do        conn = post(conn, "/api/v1/follow_requests/#{other_user.id}/reject") -      assert relationship = json_response(conn, 200) +      assert relationship = json_response_and_validate_schema(conn, 200)        assert to_string(other_user.id) == relationship["id"]        user = User.get_cached_by_id(user.id) diff --git a/test/web/mastodon_api/controllers/instance_controller_test.exs b/test/web/mastodon_api/controllers/instance_controller_test.exs index 2c7fd9fd0..90840d5ab 100644 --- a/test/web/mastodon_api/controllers/instance_controller_test.exs +++ b/test/web/mastodon_api/controllers/instance_controller_test.exs @@ -10,7 +10,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do    test "get instance information", %{conn: conn} do      conn = get(conn, "/api/v1/instance") -    assert result = json_response(conn, 200) +    assert result = json_response_and_validate_schema(conn, 200)      email = Pleroma.Config.get([:instance, :email])      # Note: not checking for "max_toot_chars" since it's optional @@ -56,7 +56,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do      conn = get(conn, "/api/v1/instance") -    assert result = json_response(conn, 200) +    assert result = json_response_and_validate_schema(conn, 200)      stats = result["stats"] @@ -74,7 +74,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do      conn = get(conn, "/api/v1/instance/peers") -    assert result = json_response(conn, 200) +    assert result = json_response_and_validate_schema(conn, 200)      assert ["peer1.com", "peer2.com"] == Enum.sort(result)    end diff --git a/test/web/mastodon_api/controllers/list_controller_test.exs b/test/web/mastodon_api/controllers/list_controller_test.exs index c9c4cbb49..57a9ef4a4 100644 --- a/test/web/mastodon_api/controllers/list_controller_test.exs +++ b/test/web/mastodon_api/controllers/list_controller_test.exs @@ -12,37 +12,44 @@ defmodule Pleroma.Web.MastodonAPI.ListControllerTest do    test "creating a list" do      %{conn: conn} = oauth_access(["write:lists"]) -    conn = post(conn, "/api/v1/lists", %{"title" => "cuties"}) - -    assert %{"title" => title} = json_response(conn, 200) -    assert title == "cuties" +    assert %{"title" => "cuties"} = +             conn +             |> put_req_header("content-type", "application/json") +             |> post("/api/v1/lists", %{"title" => "cuties"}) +             |> json_response_and_validate_schema(:ok)    end    test "renders error for invalid params" do      %{conn: conn} = oauth_access(["write:lists"]) -    conn = post(conn, "/api/v1/lists", %{"title" => nil}) +    conn = +      conn +      |> put_req_header("content-type", "application/json") +      |> post("/api/v1/lists", %{"title" => nil}) -    assert %{"error" => "can't be blank"} == json_response(conn, :unprocessable_entity) +    assert %{"error" => "title - null value where string expected."} = +             json_response_and_validate_schema(conn, 400)    end    test "listing a user's lists" do      %{conn: conn} = oauth_access(["read:lists", "write:lists"])      conn +    |> put_req_header("content-type", "application/json")      |> post("/api/v1/lists", %{"title" => "cuties"}) -    |> json_response(:ok) +    |> json_response_and_validate_schema(:ok)      conn +    |> put_req_header("content-type", "application/json")      |> post("/api/v1/lists", %{"title" => "cofe"}) -    |> json_response(:ok) +    |> json_response_and_validate_schema(:ok)      conn = get(conn, "/api/v1/lists")      assert [               %{"id" => _, "title" => "cofe"},               %{"id" => _, "title" => "cuties"} -           ] = json_response(conn, :ok) +           ] = json_response_and_validate_schema(conn, :ok)    end    test "adding users to a list" do @@ -50,9 +57,12 @@ defmodule Pleroma.Web.MastodonAPI.ListControllerTest do      other_user = insert(:user)      {:ok, list} = Pleroma.List.create("name", user) -    conn = post(conn, "/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]}) +    assert %{} == +             conn +             |> put_req_header("content-type", "application/json") +             |> post("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]}) +             |> json_response_and_validate_schema(:ok) -    assert %{} == json_response(conn, 200)      %Pleroma.List{following: following} = Pleroma.List.get(list.id, user)      assert following == [other_user.follower_address]    end @@ -65,9 +75,12 @@ defmodule Pleroma.Web.MastodonAPI.ListControllerTest do      {:ok, list} = Pleroma.List.follow(list, other_user)      {:ok, list} = Pleroma.List.follow(list, third_user) -    conn = delete(conn, "/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]}) +    assert %{} == +             conn +             |> put_req_header("content-type", "application/json") +             |> delete("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]}) +             |> json_response_and_validate_schema(:ok) -    assert %{} == json_response(conn, 200)      %Pleroma.List{following: following} = Pleroma.List.get(list.id, user)      assert following == [third_user.follower_address]    end @@ -83,7 +96,7 @@ defmodule Pleroma.Web.MastodonAPI.ListControllerTest do        |> assign(:user, user)        |> get("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]}) -    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 @@ -96,7 +109,7 @@ defmodule Pleroma.Web.MastodonAPI.ListControllerTest do        |> assign(:user, user)        |> get("/api/v1/lists/#{list.id}") -    assert %{"id" => id} = json_response(conn, 200) +    assert %{"id" => id} = json_response_and_validate_schema(conn, 200)      assert id == to_string(list.id)    end @@ -105,17 +118,18 @@ defmodule Pleroma.Web.MastodonAPI.ListControllerTest do      conn = get(conn, "/api/v1/lists/666") -    assert %{"error" => "List not found"} = json_response(conn, :not_found) +    assert %{"error" => "List not found"} = json_response_and_validate_schema(conn, :not_found)    end    test "renaming a list" do      %{user: user, conn: conn} = oauth_access(["write:lists"])      {:ok, list} = Pleroma.List.create("name", user) -    conn = put(conn, "/api/v1/lists/#{list.id}", %{"title" => "newname"}) - -    assert %{"title" => name} = json_response(conn, 200) -    assert name == "newname" +    assert %{"title" => "newname"} = +             conn +             |> put_req_header("content-type", "application/json") +             |> put("/api/v1/lists/#{list.id}", %{"title" => "newname"}) +             |> json_response_and_validate_schema(:ok)    end    test "validates title when renaming a list" do @@ -125,9 +139,11 @@ defmodule Pleroma.Web.MastodonAPI.ListControllerTest do      conn =        conn        |> assign(:user, user) +      |> put_req_header("content-type", "application/json")        |> put("/api/v1/lists/#{list.id}", %{"title" => "  "}) -    assert %{"error" => "can't be blank"} == json_response(conn, :unprocessable_entity) +    assert %{"error" => "can't be blank"} == +             json_response_and_validate_schema(conn, :unprocessable_entity)    end    test "deleting a list" do @@ -136,7 +152,7 @@ defmodule Pleroma.Web.MastodonAPI.ListControllerTest do      conn = delete(conn, "/api/v1/lists/#{list.id}") -    assert %{} = json_response(conn, 200) +    assert %{} = json_response_and_validate_schema(conn, 200)      assert is_nil(Repo.get(Pleroma.List, list.id))    end  end diff --git a/test/web/mastodon_api/controllers/marker_controller_test.exs b/test/web/mastodon_api/controllers/marker_controller_test.exs index 919f295bd..bce719bea 100644 --- a/test/web/mastodon_api/controllers/marker_controller_test.exs +++ b/test/web/mastodon_api/controllers/marker_controller_test.exs @@ -22,8 +22,8 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do          conn          |> assign(:user, user)          |> assign(:token, token) -        |> get("/api/v1/markers", %{timeline: ["notifications"]}) -        |> json_response(200) +        |> get("/api/v1/markers?timeline[]=notifications") +        |> json_response_and_validate_schema(200)        assert response == %{                 "notifications" => %{ @@ -45,7 +45,7 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do          |> assign(:user, user)          |> assign(:token, token)          |> get("/api/v1/markers", %{timeline: ["notifications"]}) -        |> json_response(403) +        |> json_response_and_validate_schema(403)        assert response == %{"error" => "Insufficient permissions: read:statuses."}      end @@ -60,11 +60,12 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do          conn          |> assign(:user, user)          |> assign(:token, token) +        |> put_req_header("content-type", "application/json")          |> post("/api/v1/markers", %{            home: %{last_read_id: "777"},            notifications: %{"last_read_id" => "69420"}          }) -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert %{                 "notifications" => %{ @@ -89,11 +90,12 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do          conn          |> assign(:user, user)          |> assign(:token, token) +        |> put_req_header("content-type", "application/json")          |> post("/api/v1/markers", %{            home: %{last_read_id: "777"},            notifications: %{"last_read_id" => "69888"}          }) -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert response == %{                 "notifications" => %{ @@ -112,11 +114,12 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do          conn          |> assign(:user, user)          |> assign(:token, token) +        |> put_req_header("content-type", "application/json")          |> post("/api/v1/markers", %{            home: %{last_read_id: "777"},            notifications: %{"last_read_id" => "69420"}          }) -        |> json_response(403) +        |> json_response_and_validate_schema(403)        assert response == %{"error" => "Insufficient permissions: write:statuses."}      end diff --git a/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs b/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs index f86274d57..1ff871c89 100644 --- a/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs +++ b/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs @@ -24,19 +24,19 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do      # min_id      conn_res = get(conn, "/api/v1/scheduled_statuses?limit=2&min_id=#{scheduled_activity_id1}") -    result = json_response(conn_res, 200) +    result = json_response_and_validate_schema(conn_res, 200)      assert [%{"id" => ^scheduled_activity_id3}, %{"id" => ^scheduled_activity_id2}] = result      # since_id      conn_res = get(conn, "/api/v1/scheduled_statuses?limit=2&since_id=#{scheduled_activity_id1}") -    result = json_response(conn_res, 200) +    result = json_response_and_validate_schema(conn_res, 200)      assert [%{"id" => ^scheduled_activity_id4}, %{"id" => ^scheduled_activity_id3}] = result      # max_id      conn_res = get(conn, "/api/v1/scheduled_statuses?limit=2&max_id=#{scheduled_activity_id4}") -    result = json_response(conn_res, 200) +    result = json_response_and_validate_schema(conn_res, 200)      assert [%{"id" => ^scheduled_activity_id3}, %{"id" => ^scheduled_activity_id2}] = result    end @@ -46,12 +46,12 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do      res_conn = get(conn, "/api/v1/scheduled_statuses/#{scheduled_activity.id}") -    assert %{"id" => scheduled_activity_id} = json_response(res_conn, 200) +    assert %{"id" => scheduled_activity_id} = json_response_and_validate_schema(res_conn, 200)      assert scheduled_activity_id == scheduled_activity.id |> to_string()      res_conn = get(conn, "/api/v1/scheduled_statuses/404") -    assert %{"error" => "Record not found"} = json_response(res_conn, 404) +    assert %{"error" => "Record not found"} = json_response_and_validate_schema(res_conn, 404)    end    test "updates a scheduled activity" do @@ -74,22 +74,32 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do      assert job.args == %{"activity_id" => scheduled_activity.id}      assert DateTime.truncate(job.scheduled_at, :second) == to_datetime(scheduled_at) -    new_scheduled_at = Timex.shift(NaiveDateTime.utc_now(), minutes: 120) +    new_scheduled_at = +      NaiveDateTime.utc_now() +      |> Timex.shift(minutes: 120) +      |> Timex.format!("%Y-%m-%dT%H:%M:%S.%fZ", :strftime)      res_conn = -      put(conn, "/api/v1/scheduled_statuses/#{scheduled_activity.id}", %{ +      conn +      |> put_req_header("content-type", "application/json") +      |> put("/api/v1/scheduled_statuses/#{scheduled_activity.id}", %{          scheduled_at: new_scheduled_at        }) -    assert %{"scheduled_at" => expected_scheduled_at} = json_response(res_conn, 200) +    assert %{"scheduled_at" => expected_scheduled_at} = +             json_response_and_validate_schema(res_conn, 200) +      assert expected_scheduled_at == Pleroma.Web.CommonAPI.Utils.to_masto_date(new_scheduled_at)      job = refresh_record(job)      assert DateTime.truncate(job.scheduled_at, :second) == to_datetime(new_scheduled_at) -    res_conn = put(conn, "/api/v1/scheduled_statuses/404", %{scheduled_at: new_scheduled_at}) +    res_conn = +      conn +      |> put_req_header("content-type", "application/json") +      |> put("/api/v1/scheduled_statuses/404", %{scheduled_at: new_scheduled_at}) -    assert %{"error" => "Record not found"} = json_response(res_conn, 404) +    assert %{"error" => "Record not found"} = json_response_and_validate_schema(res_conn, 404)    end    test "deletes a scheduled activity" do @@ -115,7 +125,7 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do        |> assign(:user, user)        |> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}") -    assert %{} = json_response(res_conn, 200) +    assert %{} = json_response_and_validate_schema(res_conn, 200)      refute Repo.get(ScheduledActivity, scheduled_activity.id)      refute Repo.get(Oban.Job, job.id) @@ -124,6 +134,6 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do        |> assign(:user, user)        |> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}") -    assert %{"error" => "Record not found"} = json_response(res_conn, 404) +    assert %{"error" => "Record not found"} = json_response_and_validate_schema(res_conn, 404)    end  end diff --git a/test/web/mastodon_api/controllers/subscription_controller_test.exs b/test/web/mastodon_api/controllers/subscription_controller_test.exs index 5682498c0..4aa260663 100644 --- a/test/web/mastodon_api/controllers/subscription_controller_test.exs +++ b/test/web/mastodon_api/controllers/subscription_controller_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do    use Pleroma.Web.ConnCase    import Pleroma.Factory +    alias Pleroma.Web.Push    alias Pleroma.Web.Push.Subscription @@ -27,6 +28,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        build_conn()        |> assign(:user, user)        |> assign(:token, token) +      |> put_req_header("content-type", "application/json")      %{conn: conn, user: user, token: token}    end @@ -47,8 +49,8 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do      test "returns error when push disabled ", %{conn: conn} do        assert_error_when_disable_push do          conn -        |> post("/api/v1/push/subscription", %{}) -        |> json_response(403) +        |> post("/api/v1/push/subscription", %{subscription: @sub}) +        |> json_response_and_validate_schema(403)        end      end @@ -59,7 +61,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do            "data" => %{"alerts" => %{"mention" => true, "test" => true}},            "subscription" => @sub          }) -        |> json_response(200) +        |> json_response_and_validate_schema(200)        [subscription] = Pleroma.Repo.all(Subscription) @@ -77,7 +79,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        assert_error_when_disable_push do          conn          |> get("/api/v1/push/subscription", %{}) -        |> json_response(403) +        |> json_response_and_validate_schema(403)        end      end @@ -85,9 +87,9 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        res =          conn          |> get("/api/v1/push/subscription", %{}) -        |> json_response(404) +        |> json_response_and_validate_schema(404) -      assert "Not found" == res +      assert %{"error" => "Record not found"} == res      end      test "returns a user subsciption", %{conn: conn, user: user, token: token} do @@ -101,7 +103,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        res =          conn          |> get("/api/v1/push/subscription", %{}) -        |> json_response(200) +        |> json_response_and_validate_schema(200)        expect = %{          "alerts" => %{"mention" => true}, @@ -130,7 +132,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        assert_error_when_disable_push do          conn          |> put("/api/v1/push/subscription", %{data: %{"alerts" => %{"mention" => false}}}) -        |> json_response(403) +        |> json_response_and_validate_schema(403)        end      end @@ -140,7 +142,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do          |> put("/api/v1/push/subscription", %{            data: %{"alerts" => %{"mention" => false, "follow" => true}}          }) -        |> json_response(200) +        |> json_response_and_validate_schema(200)        expect = %{          "alerts" => %{"follow" => true, "mention" => false}, @@ -158,7 +160,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        assert_error_when_disable_push do          conn          |> delete("/api/v1/push/subscription", %{}) -        |> json_response(403) +        |> json_response_and_validate_schema(403)        end      end @@ -166,9 +168,9 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        res =          conn          |> delete("/api/v1/push/subscription", %{}) -        |> json_response(404) +        |> json_response_and_validate_schema(404) -      assert "Not found" == res +      assert %{"error" => "Record not found"} == res      end      test "returns empty result and delete user subsciption", %{ @@ -186,7 +188,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do        res =          conn          |> delete("/api/v1/push/subscription", %{}) -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert %{} == res        refute Pleroma.Repo.get(Subscription, subscription.id) diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index 6791c2fb0..451723e60 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -402,11 +402,17 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do        pleroma: %{mime_type: "image/png"}      } +    api_spec = Pleroma.Web.ApiSpec.spec() +      assert expected == StatusView.render("attachment.json", %{attachment: object}) +    OpenApiSpex.TestAssertions.assert_schema(expected, "Attachment", api_spec)      # If theres a "id", use that instead of the generated one      object = Map.put(object, "id", 2) -    assert %{id: "2"} = StatusView.render("attachment.json", %{attachment: object}) +    result = StatusView.render("attachment.json", %{attachment: object}) + +    assert %{id: "2"} = result +    OpenApiSpex.TestAssertions.assert_schema(result, "Attachment", api_spec)    end    test "put the url advertised in the Activity in to the url attribute" do diff --git a/test/web/plugs/plug_test.exs b/test/web/plugs/plug_test.exs new file mode 100644 index 000000000..943e484e7 --- /dev/null +++ b/test/web/plugs/plug_test.exs @@ -0,0 +1,91 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PlugTest do +  @moduledoc "Tests for the functionality added via `use Pleroma.Web, :plug`" + +  alias Pleroma.Plugs.ExpectAuthenticatedCheckPlug +  alias Pleroma.Plugs.ExpectPublicOrAuthenticatedCheckPlug +  alias Pleroma.Plugs.PlugHelper + +  import Mock + +  use Pleroma.Web.ConnCase + +  describe "when plug is skipped, " do +    setup_with_mocks( +      [ +        {ExpectPublicOrAuthenticatedCheckPlug, [:passthrough], []} +      ], +      %{conn: conn} +    ) do +      conn = ExpectPublicOrAuthenticatedCheckPlug.skip_plug(conn) +      %{conn: conn} +    end + +    test "it neither adds plug to called plugs list nor calls `perform/2`, " <> +           "regardless of :if_func / :unless_func options", +         %{conn: conn} do +      for opts <- [%{}, %{if_func: fn _ -> true end}, %{unless_func: fn _ -> false end}] do +        ret_conn = ExpectPublicOrAuthenticatedCheckPlug.call(conn, opts) + +        refute called(ExpectPublicOrAuthenticatedCheckPlug.perform(:_, :_)) +        refute PlugHelper.plug_called?(ret_conn, ExpectPublicOrAuthenticatedCheckPlug) +      end +    end +  end + +  describe "when plug is NOT skipped, " do +    setup_with_mocks([{ExpectAuthenticatedCheckPlug, [:passthrough], []}]) do +      :ok +    end + +    test "with no pre-run checks, adds plug to called plugs list and calls `perform/2`", %{ +      conn: conn +    } do +      ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{}) + +      assert called(ExpectAuthenticatedCheckPlug.perform(ret_conn, :_)) +      assert PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) +    end + +    test "when :if_func option is given, calls the plug only if provided function evals tru-ish", +         %{conn: conn} do +      ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{if_func: fn _ -> false end}) + +      refute called(ExpectAuthenticatedCheckPlug.perform(:_, :_)) +      refute PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) + +      ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{if_func: fn _ -> true end}) + +      assert called(ExpectAuthenticatedCheckPlug.perform(ret_conn, :_)) +      assert PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) +    end + +    test "if :unless_func option is given, calls the plug only if provided function evals falsy", +         %{conn: conn} do +      ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{unless_func: fn _ -> true end}) + +      refute called(ExpectAuthenticatedCheckPlug.perform(:_, :_)) +      refute PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) + +      ret_conn = ExpectAuthenticatedCheckPlug.call(conn, %{unless_func: fn _ -> false end}) + +      assert called(ExpectAuthenticatedCheckPlug.perform(ret_conn, :_)) +      assert PlugHelper.plug_called?(ret_conn, ExpectAuthenticatedCheckPlug) +    end + +    test "allows a plug to be called multiple times (even if it's in called plugs list)", %{ +      conn: conn +    } do +      conn = ExpectAuthenticatedCheckPlug.call(conn, %{an_option: :value1}) +      assert called(ExpectAuthenticatedCheckPlug.perform(conn, %{an_option: :value1})) + +      assert PlugHelper.plug_called?(conn, ExpectAuthenticatedCheckPlug) + +      conn = ExpectAuthenticatedCheckPlug.call(conn, %{an_option: :value2}) +      assert called(ExpectAuthenticatedCheckPlug.perform(conn, %{an_option: :value2})) +    end +  end +end diff --git a/test/web/web_finger/web_finger_test.exs b/test/web/web_finger/web_finger_test.exs index 4b4282727..f4884e0a2 100644 --- a/test/web/web_finger/web_finger_test.exs +++ b/test/web/web_finger/web_finger_test.exs @@ -67,7 +67,7 @@ defmodule Pleroma.Web.WebFingerTest do        assert data["magic_key"] == nil        assert data["salmon"] == nil -      assert data["topic"] == "https://mstdn.jp/users/kPherox.atom" +      assert data["topic"] == nil        assert data["subject"] == "acct:kPherox@mstdn.jp"        assert data["ap_id"] == "https://mstdn.jp/users/kPherox"        assert data["subscribe_address"] == "https://mstdn.jp/authorize_interaction?acct={uri}" | 
