Merge branch 'feat/openapi-spec-export' into 'develop'
[akkoma] / test / pleroma / web / mastodon_api / controllers / poll_controller_test.exs
index f41de64485ec40bbe558dfeabf0f915da5c94806..da0a631a93de7d657c2b046133b09e319b4a53e7 100644 (file)
@@ -1,9 +1,9 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.MastodonAPI.PollControllerTest do
-  use Pleroma.Web.ConnCase
+  use Pleroma.Web.ConnCase, async: true
 
   alias Pleroma.Object
   alias Pleroma.Web.CommonAPI
@@ -20,7 +20,7 @@ defmodule Pleroma.Web.MastodonAPI.PollControllerTest do
           poll: %{options: ["what Mastodon't", "n't what Mastodoes"], expires_in: 20}
         })
 
-      object = Object.normalize(activity)
+      object = Object.normalize(activity, fetch: false)
 
       conn = get(conn, "/api/v1/polls/#{object.id}")
 
@@ -39,7 +39,7 @@ defmodule Pleroma.Web.MastodonAPI.PollControllerTest do
           visibility: "private"
         })
 
-      object = Object.normalize(activity)
+      object = Object.normalize(activity, fetch: false)
 
       conn = get(conn, "/api/v1/polls/#{object.id}")
 
@@ -47,6 +47,78 @@ defmodule Pleroma.Web.MastodonAPI.PollControllerTest do
     end
   end
 
+  test "own_votes" do
+    %{conn: conn} = oauth_access(["write:statuses", "read:statuses"])
+
+    other_user = insert(:user)
+
+    {:ok, activity} =
+      CommonAPI.post(other_user, %{
+        status: "A very delicious sandwich",
+        poll: %{
+          options: ["Lettuce", "Grilled Bacon", "Tomato"],
+          expires_in: 20,
+          multiple: true
+        }
+      })
+
+    object = Object.normalize(activity, fetch: false)
+
+    conn
+    |> put_req_header("content-type", "application/json")
+    |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [0, 2]})
+    |> json_response_and_validate_schema(200)
+
+    object = Object.get_by_id(object.id)
+
+    assert [
+             %{
+               "name" => "Lettuce",
+               "replies" => %{"totalItems" => 1, "type" => "Collection"},
+               "type" => "Note"
+             },
+             %{
+               "name" => "Grilled Bacon",
+               "replies" => %{"totalItems" => 0, "type" => "Collection"},
+               "type" => "Note"
+             },
+             %{
+               "name" => "Tomato",
+               "replies" => %{"totalItems" => 1, "type" => "Collection"},
+               "type" => "Note"
+             }
+           ] == object.data["anyOf"]
+
+    assert %{"replies" => %{"totalItems" => 0}} =
+             Enum.find(object.data["anyOf"], fn %{"name" => name} -> name == "Grilled Bacon" end)
+
+    Enum.each(["Lettuce", "Tomato"], fn title ->
+      %{"replies" => %{"totalItems" => total_items}} =
+        Enum.find(object.data["anyOf"], fn %{"name" => name} -> name == title end)
+
+      assert total_items == 1
+    end)
+
+    assert %{
+             "own_votes" => own_votes,
+             "voted" => true
+           } =
+             conn
+             |> get("/api/v1/polls/#{object.id}")
+             |> json_response_and_validate_schema(200)
+
+    assert 0 in own_votes
+    assert 2 in own_votes
+    # for non authenticated user
+    response =
+      build_conn()
+      |> get("/api/v1/polls/#{object.id}")
+      |> json_response_and_validate_schema(200)
+
+    refute Map.has_key?(response, "own_votes")
+    refute Map.has_key?(response, "voted")
+  end
+
   describe "POST /api/v1/polls/:id/votes" do
     setup do: oauth_access(["write:statuses"])
 
@@ -63,14 +135,13 @@ defmodule Pleroma.Web.MastodonAPI.PollControllerTest do
           }
         })
 
-      object = Object.normalize(activity)
+      object = Object.normalize(activity, fetch: false)
 
-      conn =
-        conn
-        |> put_req_header("content-type", "application/json")
-        |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [0, 1, 2]})
+      conn
+      |> put_req_header("content-type", "application/json")
+      |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [0, 1, 2]})
+      |> json_response_and_validate_schema(200)
 
-      assert json_response_and_validate_schema(conn, 200)
       object = Object.get_by_id(object.id)
 
       assert Enum.all?(object.data["anyOf"], fn %{"replies" => %{"totalItems" => total_items}} ->
@@ -85,7 +156,7 @@ defmodule Pleroma.Web.MastodonAPI.PollControllerTest do
           poll: %{options: ["Yes", "No"], expires_in: 20}
         })
 
-      object = Object.normalize(activity)
+      object = Object.normalize(activity, fetch: false)
 
       assert conn
              |> put_req_header("content-type", "application/json")
@@ -106,7 +177,7 @@ defmodule Pleroma.Web.MastodonAPI.PollControllerTest do
           poll: %{options: ["half empty", "half full"], expires_in: 20}
         })
 
-      object = Object.normalize(activity)
+      object = Object.normalize(activity, fetch: false)
 
       assert conn
              |> put_req_header("content-type", "application/json")
@@ -129,7 +200,7 @@ defmodule Pleroma.Web.MastodonAPI.PollControllerTest do
           poll: %{options: ["Yes", "No"], expires_in: 20}
         })
 
-      object = Object.normalize(activity)
+      object = Object.normalize(activity, fetch: false)
 
       conn =
         conn
@@ -158,7 +229,7 @@ defmodule Pleroma.Web.MastodonAPI.PollControllerTest do
           visibility: "private"
         })
 
-      object = Object.normalize(activity)
+      object = Object.normalize(activity, fetch: false)
 
       conn =
         conn