diff options
Diffstat (limited to 'test/web')
| -rw-r--r-- | test/web/activity_pub/activity_pub_controller_test.exs | 71 | ||||
| -rw-r--r-- | test/web/activity_pub/activity_pub_test.exs | 29 | ||||
| -rw-r--r-- | test/web/activity_pub/transmogrifier_test.exs | 130 | ||||
| -rw-r--r-- | test/web/activity_pub/visibilty_test.exs | 4 | ||||
| -rw-r--r-- | test/web/mastodon_api/account_view_test.exs | 6 | ||||
| -rw-r--r-- | test/web/mastodon_api/mastodon_api_controller_test.exs | 251 | ||||
| -rw-r--r-- | test/web/mastodon_api/status_view_test.exs | 103 | ||||
| -rw-r--r-- | test/web/twitter_api/util_controller_test.exs | 9 | ||||
| -rw-r--r-- | test/web/twitter_api/views/user_view_test.exs | 2 | 
9 files changed, 557 insertions, 48 deletions
| diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index 30adfda36..8b3233729 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ObjectView    alias Pleroma.Web.ActivityPub.UserView +  alias Pleroma.Web.ActivityPub.Utils    setup_all do      Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -234,13 +235,17 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do    end    describe "/users/:nickname/inbox" do -    test "it inserts an incoming activity into the database", %{conn: conn} do -      user = insert(:user) - +    setup do        data =          File.read!("test/fixtures/mastodon-post-activity.json")          |> Poison.decode!() -        |> Map.put("bcc", [user.ap_id]) + +      [data: data] +    end + +    test "it inserts an incoming activity into the database", %{conn: conn, data: data} do +      user = insert(:user) +      data = Map.put(data, "bcc", [user.ap_id])        conn =          conn @@ -253,16 +258,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert Activity.get_by_ap_id(data["id"])      end -    test "it accepts messages from actors that are followed by the user", %{conn: conn} do +    test "it accepts messages from actors that are followed by the user", %{ +      conn: conn, +      data: data +    } do        recipient = insert(:user)        actor = insert(:user, %{ap_id: "http://mastodon.example.org/users/actor"})        {:ok, recipient} = User.follow(recipient, actor) -      data = -        File.read!("test/fixtures/mastodon-post-activity.json") -        |> Poison.decode!() -        object =          data["object"]          |> Map.put("attributedTo", actor.ap_id) @@ -309,13 +313,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert response(conn, 200) =~ note_activity.data["object"]["content"]      end -    test "it clears `unreachable` federation status of the sender", %{conn: conn} do +    test "it clears `unreachable` federation status of the sender", %{conn: conn, data: data} do        user = insert(:user) - -      data = -        File.read!("test/fixtures/mastodon-post-activity.json") -        |> Poison.decode!() -        |> Map.put("bcc", [user.ap_id]) +      data = Map.put(data, "bcc", [user.ap_id])        sender_host = URI.parse(data["actor"]).host        Instances.set_consistently_unreachable(sender_host) @@ -330,6 +330,47 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert "ok" == json_response(conn, 200)        assert Instances.reachable?(sender_host)      end + +    test "it removes all follower collections but actor's", %{conn: conn} do +      [actor, recipient] = insert_pair(:user) + +      data = +        File.read!("test/fixtures/activitypub-client-post-activity.json") +        |> Poison.decode!() + +      object = Map.put(data["object"], "attributedTo", actor.ap_id) + +      data = +        data +        |> Map.put("id", Utils.generate_object_id()) +        |> Map.put("actor", actor.ap_id) +        |> Map.put("object", object) +        |> Map.put("cc", [ +          recipient.follower_address, +          actor.follower_address +        ]) +        |> Map.put("to", [ +          recipient.ap_id, +          recipient.follower_address, +          "https://www.w3.org/ns/activitystreams#Public" +        ]) + +      conn +      |> assign(:valid_signature, true) +      |> put_req_header("content-type", "application/activity+json") +      |> post("/users/#{recipient.nickname}/inbox", data) +      |> json_response(200) + +      activity = Activity.get_by_ap_id(data["id"]) + +      assert activity.id +      assert actor.follower_address in activity.recipients +      assert actor.follower_address in activity.data["cc"] + +      refute recipient.follower_address in activity.recipients +      refute recipient.follower_address in activity.data["cc"] +      refute recipient.follower_address in activity.data["to"] +    end    end    describe "/users/:nickname/outbox" do diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index f743f380b..76586ee4a 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -1186,4 +1186,33 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    def data_uri do      File.read!("test/fixtures/avatar_data_uri")    end + +  describe "fetch_activities_bounded" do +    test "fetches private posts for followed users" do +      user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "thought I looked cute might delete later :3", +          "visibility" => "private" +        }) + +      [result] = ActivityPub.fetch_activities_bounded([user.follower_address], []) +      assert result.id == activity.id +    end + +    test "fetches only public posts for other users" do +      user = insert(:user) +      {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe", "visibility" => "public"}) + +      {:ok, _private_activity} = +        CommonAPI.post(user, %{ +          "status" => "why is tenshi eating a corndog so cute?", +          "visibility" => "private" +        }) + +      [result] = ActivityPub.fetch_activities_bounded([], [user.follower_address]) +      assert result.id == activity.id +    end +  end  end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index c24b50f8c..89c8f79c9 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -113,6 +113,55 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert Enum.at(object.data["tag"], 2) == "moo"      end +    test "it works for incoming questions" do +      data = File.read!("test/fixtures/mastodon-question-activity.json") |> Poison.decode!() + +      {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data) + +      object = Object.normalize(activity) + +      assert Enum.all?(object.data["oneOf"], fn choice -> +               choice["name"] in [ +                 "Dunno", +                 "Everyone knows that!", +                 "25 char limit is dumb", +                 "I can't even fit a funny" +               ] +             end) +    end + +    test "it rewrites Note votes to Answers and increments vote counters on question activities" do +      user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "suya...", +          "poll" => %{"options" => ["suya", "suya.", "suya.."], "expires_in" => 10} +        }) + +      object = Object.normalize(activity) + +      data = +        File.read!("test/fixtures/mastodon-vote.json") +        |> Poison.decode!() +        |> Kernel.put_in(["to"], user.ap_id) +        |> Kernel.put_in(["object", "inReplyTo"], object.data["id"]) +        |> Kernel.put_in(["object", "to"], user.ap_id) + +      {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data) +      answer_object = Object.normalize(activity) +      assert answer_object.data["type"] == "Answer" +      object = Object.get_by_ap_id(object.data["id"]) + +      assert Enum.any?( +               object.data["oneOf"], +               fn +                 %{"name" => "suya..", "replies" => %{"totalItems" => 1}} -> true +                 _ -> false +               end +             ) +    end +      test "it works for incoming notices with contentMap" do        data =          File.read!("test/fixtures/mastodon-post-activity-contentmap.json") |> Poison.decode!() @@ -1209,4 +1258,85 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, _} = Transmogrifier.prepare_outgoing(activity.data)      end    end + +  test "Rewrites Answers to Notes" do +    user = insert(:user) + +    {:ok, poll_activity} = +      CommonAPI.post(user, %{ +        "status" => "suya...", +        "poll" => %{"options" => ["suya", "suya.", "suya.."], "expires_in" => 10} +      }) + +    poll_object = Object.normalize(poll_activity) +    # TODO: Replace with CommonAPI vote creation when implemented +    data = +      File.read!("test/fixtures/mastodon-vote.json") +      |> Poison.decode!() +      |> Kernel.put_in(["to"], user.ap_id) +      |> Kernel.put_in(["object", "inReplyTo"], poll_object.data["id"]) +      |> Kernel.put_in(["object", "to"], user.ap_id) + +    {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data) +    {:ok, data} = Transmogrifier.prepare_outgoing(activity.data) + +    assert data["object"]["type"] == "Note" +  end + +  describe "fix_explicit_addressing" do +    setup do +      user = insert(:user) +      [user: user] +    end + +    test "moves non-explicitly mentioned actors to cc", %{user: user} do +      explicitly_mentioned_actors = [ +        "https://pleroma.gold/users/user1", +        "https://pleroma.gold/user2" +      ] + +      object = %{ +        "actor" => user.ap_id, +        "to" => explicitly_mentioned_actors ++ ["https://social.beepboop.ga/users/dirb"], +        "cc" => [], +        "tag" => +          Enum.map(explicitly_mentioned_actors, fn href -> +            %{"type" => "Mention", "href" => href} +          end) +      } + +      fixed_object = Transmogrifier.fix_explicit_addressing(object) +      assert Enum.all?(explicitly_mentioned_actors, &(&1 in fixed_object["to"])) +      refute "https://social.beepboop.ga/users/dirb" in fixed_object["to"] +      assert "https://social.beepboop.ga/users/dirb" in fixed_object["cc"] +    end + +    test "does not move actor's follower collection to cc", %{user: user} do +      object = %{ +        "actor" => user.ap_id, +        "to" => [user.follower_address], +        "cc" => [] +      } + +      fixed_object = Transmogrifier.fix_explicit_addressing(object) +      assert user.follower_address in fixed_object["to"] +      refute user.follower_address in fixed_object["cc"] +    end + +    test "removes recipient's follower collection from cc", %{user: user} do +      recipient = insert(:user) + +      object = %{ +        "actor" => user.ap_id, +        "to" => [recipient.ap_id, "https://www.w3.org/ns/activitystreams#Public"], +        "cc" => [user.follower_address, recipient.follower_address] +      } + +      fixed_object = Transmogrifier.fix_explicit_addressing(object) + +      assert user.follower_address in fixed_object["cc"] +      refute recipient.follower_address in fixed_object["cc"] +      refute recipient.follower_address in fixed_object["to"] +    end +  end  end diff --git a/test/web/activity_pub/visibilty_test.exs b/test/web/activity_pub/visibilty_test.exs index e2584f635..466d980dc 100644 --- a/test/web/activity_pub/visibilty_test.exs +++ b/test/web/activity_pub/visibilty_test.exs @@ -117,4 +117,8 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do      assert Visibility.get_visibility(direct) == "direct"      assert Visibility.get_visibility(unlisted) == "unlisted"    end + +  test "get_visibility with directMessage flag" do +    assert Visibility.get_visibility(%{data: %{"directMessage" => true}}) == "direct" +  end  end diff --git a/test/web/mastodon_api/account_view_test.exs b/test/web/mastodon_api/account_view_test.exs index 5e6f1d00b..1611d937e 100644 --- a/test/web/mastodon_api/account_view_test.exs +++ b/test/web/mastodon_api/account_view_test.exs @@ -78,10 +78,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      user = insert(:user)      notification_settings = %{ -      "remote" => true, -      "local" => true,        "followers" => true, -      "follows" => true +      "follows" => true, +      "non_follows" => true, +      "non_followers" => true      }      privacy = user.info.default_scope diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs index 59a7967bd..b0cde649d 100644 --- a/test/web/mastodon_api/mastodon_api_controller_test.exs +++ b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -146,6 +146,103 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      refute id == third_id    end +  describe "posting polls" do +    test "posting a poll", %{conn: conn} do +      user = insert(:user) +      time = NaiveDateTime.utc_now() + +      conn = +        conn +        |> assign(:user, user) +        |> post("/api/v1/statuses", %{ +          "status" => "Who is the #bestgrill?", +          "poll" => %{"options" => ["Rei", "Asuka", "Misato"], "expires_in" => 420} +        }) + +      response = json_response(conn, 200) + +      assert Enum.all?(response["poll"]["options"], fn %{"title" => title} -> +               title in ["Rei", "Asuka", "Misato"] +             end) + +      assert NaiveDateTime.diff(NaiveDateTime.from_iso8601!(response["poll"]["expires_at"]), time) in 420..430 +      refute response["poll"]["expred"] +    end + +    test "option limit is enforced", %{conn: conn} do +      user = insert(:user) +      limit = Pleroma.Config.get([:instance, :poll_limits, :max_options]) + +      conn = +        conn +        |> assign(:user, user) +        |> post("/api/v1/statuses", %{ +          "status" => "desu~", +          "poll" => %{"options" => Enum.map(0..limit, fn _ -> "desu" end), "expires_in" => 1} +        }) + +      %{"error" => error} = json_response(conn, 422) +      assert error == "Poll can't contain more than #{limit} options" +    end + +    test "option character limit is enforced", %{conn: conn} do +      user = insert(:user) +      limit = Pleroma.Config.get([:instance, :poll_limits, :max_option_chars]) + +      conn = +        conn +        |> assign(:user, user) +        |> post("/api/v1/statuses", %{ +          "status" => "...", +          "poll" => %{ +            "options" => [Enum.reduce(0..limit, "", fn _, acc -> acc <> "." end)], +            "expires_in" => 1 +          } +        }) + +      %{"error" => error} = json_response(conn, 422) +      assert error == "Poll options cannot be longer than #{limit} characters each" +    end + +    test "minimal date limit is enforced", %{conn: conn} do +      user = insert(:user) +      limit = Pleroma.Config.get([:instance, :poll_limits, :min_expiration]) + +      conn = +        conn +        |> assign(:user, user) +        |> post("/api/v1/statuses", %{ +          "status" => "imagine arbitrary limits", +          "poll" => %{ +            "options" => ["this post was made by pleroma gang"], +            "expires_in" => limit - 1 +          } +        }) + +      %{"error" => error} = json_response(conn, 422) +      assert error == "Expiration date is too soon" +    end + +    test "maximum date limit is enforced", %{conn: conn} do +      user = insert(:user) +      limit = Pleroma.Config.get([:instance, :poll_limits, :max_expiration]) + +      conn = +        conn +        |> assign(:user, user) +        |> post("/api/v1/statuses", %{ +          "status" => "imagine arbitrary limits", +          "poll" => %{ +            "options" => ["this post was made by pleroma gang"], +            "expires_in" => limit + 1 +          } +        }) + +      %{"error" => error} = json_response(conn, 422) +      assert error == "Expiration date is too far in the future" +    end +  end +    test "posting a sensitive status", %{conn: conn} do      user = insert(:user) @@ -317,12 +414,13 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do    test "Conversations", %{conn: conn} do      user_one = insert(:user)      user_two = insert(:user) +    user_three = insert(:user)      {:ok, user_two} = User.follow(user_two, user_one)      {:ok, direct} =        CommonAPI.post(user_one, %{ -        "status" => "Hi @#{user_two.nickname}!", +        "status" => "Hi @#{user_two.nickname}, @#{user_three.nickname}!",          "visibility" => "direct"        }) @@ -348,7 +446,10 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do               }             ] = response +    account_ids = Enum.map(res_accounts, & &1["id"])      assert length(res_accounts) == 2 +    assert user_two.id in account_ids +    assert user_three.id in account_ids      assert is_binary(res_id)      assert unread == true      assert res_last_status["id"] == direct.id @@ -2598,7 +2699,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do               "stats" => _,               "thumbnail" => _,               "languages" => _, -             "registrations" => _ +             "registrations" => _, +             "poll_limits" => _             } = result      assert email == from_config_email @@ -2912,31 +3014,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      end    end -  test "flavours switching (Pleroma Extension)", %{conn: conn} do -    user = insert(:user) - -    get_old_flavour = -      conn -      |> assign(:user, user) -      |> get("/api/v1/pleroma/flavour") - -    assert "glitch" == json_response(get_old_flavour, 200) - -    set_flavour = -      conn -      |> assign(:user, user) -      |> post("/api/v1/pleroma/flavour/vanilla") - -    assert "vanilla" == json_response(set_flavour, 200) - -    get_new_flavour = -      conn -      |> assign(:user, user) -      |> post("/api/v1/pleroma/flavour/vanilla") - -    assert json_response(set_flavour, 200) == json_response(get_new_flavour, 200) -  end -    describe "reports" do      setup do        reporter = insert(:user) @@ -3522,4 +3599,124 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        assert json_response(conn, 403) == %{"error" => "Rate limit exceeded."}      end    end + +  describe "GET /api/v1/polls/:id" do +    test "returns poll entity for object id", %{conn: conn} do +      user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "Pleroma does", +          "poll" => %{"options" => ["what Mastodon't", "n't what Mastodoes"], "expires_in" => 20} +        }) + +      object = Object.normalize(activity) + +      conn = +        conn +        |> assign(:user, user) +        |> get("/api/v1/polls/#{object.id}") + +      response = json_response(conn, 200) +      id = object.id +      assert %{"id" => ^id, "expired" => false, "multiple" => false} = response +    end + +    test "does not expose polls for private statuses", %{conn: conn} do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "Pleroma does", +          "poll" => %{"options" => ["what Mastodon't", "n't what Mastodoes"], "expires_in" => 20}, +          "visibility" => "private" +        }) + +      object = Object.normalize(activity) + +      conn = +        conn +        |> assign(:user, other_user) +        |> get("/api/v1/polls/#{object.id}") + +      assert json_response(conn, 404) +    end +  end + +  describe "POST /api/v1/polls/:id/votes" do +    test "votes are added to the poll", %{conn: conn} do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "A very delicious sandwich", +          "poll" => %{ +            "options" => ["Lettuce", "Grilled Bacon", "Tomato"], +            "expires_in" => 20, +            "multiple" => true +          } +        }) + +      object = Object.normalize(activity) + +      conn = +        conn +        |> assign(:user, other_user) +        |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [0, 1, 2]}) + +      assert json_response(conn, 200) +      object = Object.get_by_id(object.id) + +      assert Enum.all?(object.data["anyOf"], fn %{"replies" => %{"totalItems" => total_items}} -> +               total_items == 1 +             end) +    end + +    test "author can't vote", %{conn: conn} do +      user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "Am I cute?", +          "poll" => %{"options" => ["Yes", "No"], "expires_in" => 20} +        }) + +      object = Object.normalize(activity) + +      assert conn +             |> assign(:user, user) +             |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [1]}) +             |> json_response(422) == %{"error" => "Poll's author can't vote"} + +      object = Object.get_by_id(object.id) + +      refute Enum.at(object.data["oneOf"], 1)["replies"]["totalItems"] == 1 +    end + +    test "does not allow multiple choices on a single-choice question", %{conn: conn} do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "The glass is", +          "poll" => %{"options" => ["half empty", "half full"], "expires_in" => 20} +        }) + +      object = Object.normalize(activity) + +      assert conn +             |> assign(:user, other_user) +             |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [0, 1]}) +             |> json_response(422) == %{"error" => "Too many choices"} + +      object = Object.get_by_id(object.id) + +      refute Enum.any?(object.data["oneOf"], fn %{"replies" => %{"totalItems" => total_items}} -> +               total_items == 1 +             end) +    end +  end  end diff --git a/test/web/mastodon_api/status_view_test.exs b/test/web/mastodon_api/status_view_test.exs index d7c800e83..ec75150ab 100644 --- a/test/web/mastodon_api/status_view_test.exs +++ b/test/web/mastodon_api/status_view_test.exs @@ -103,6 +103,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do        muted: false,        pinned: false,        sensitive: false, +      poll: nil,        spoiler_text: HtmlSanitizeEx.basic_html(note.data["object"]["summary"]),        visibility: "public",        media_attachments: [], @@ -341,4 +342,106 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do          StatusView.render("card.json", %{page_url: page_url, rich_media: card})      end    end + +  describe "poll view" do +    test "renders a poll" do +      user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "Is Tenshi eating a corndog cute?", +          "poll" => %{ +            "options" => ["absolutely!", "sure", "yes", "why are you even asking?"], +            "expires_in" => 20 +          } +        }) + +      object = Object.normalize(activity) + +      expected = %{ +        emojis: [], +        expired: false, +        id: object.id, +        multiple: false, +        options: [ +          %{title: "absolutely!", votes_count: 0}, +          %{title: "sure", votes_count: 0}, +          %{title: "yes", votes_count: 0}, +          %{title: "why are you even asking?", votes_count: 0} +        ], +        voted: false, +        votes_count: 0 +      } + +      result = StatusView.render("poll.json", %{object: object}) +      expires_at = result.expires_at +      result = Map.delete(result, :expires_at) + +      assert result == expected + +      expires_at = NaiveDateTime.from_iso8601!(expires_at) +      assert NaiveDateTime.diff(expires_at, NaiveDateTime.utc_now()) in 15..20 +    end + +    test "detects if it is multiple choice" do +      user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "Which Mastodon developer is your favourite?", +          "poll" => %{ +            "options" => ["Gargron", "Eugen"], +            "expires_in" => 20, +            "multiple" => true +          } +        }) + +      object = Object.normalize(activity) + +      assert %{multiple: true} = StatusView.render("poll.json", %{object: object}) +    end + +    test "detects emoji" do +      user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "What's with the smug face?", +          "poll" => %{ +            "options" => [":blank: sip", ":blank::blank: sip", ":blank::blank::blank: sip"], +            "expires_in" => 20 +          } +        }) + +      object = Object.normalize(activity) + +      assert %{emojis: [%{shortcode: "blank"}]} = +               StatusView.render("poll.json", %{object: object}) +    end + +    test "detects vote status" do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "Which input devices do you use?", +          "poll" => %{ +            "options" => ["mouse", "trackball", "trackpoint"], +            "multiple" => true, +            "expires_in" => 20 +          } +        }) + +      object = Object.normalize(activity) + +      {:ok, _, object} = CommonAPI.vote(other_user, object, [1, 2]) + +      result = StatusView.render("poll.json", %{object: object, for: other_user}) + +      assert result[:voted] == true +      assert Enum.at(result[:options], 1)[:votes_count] == 1 +      assert Enum.at(result[:options], 2)[:votes_count] == 1 +    end +  end  end diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 2cd82b3e7..cab9e5d90 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -102,7 +102,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        conn        |> assign(:user, user)        |> put("/api/pleroma/notification_settings", %{ -        "remote" => false,          "followers" => false,          "bar" => 1        }) @@ -110,8 +109,12 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        user = Repo.get(User, user.id) -      assert %{"remote" => false, "local" => true, "followers" => false, "follows" => true} == -               user.info.notification_settings +      assert %{ +               "followers" => false, +               "follows" => true, +               "non_follows" => true, +               "non_followers" => true +             } == user.info.notification_settings      end    end diff --git a/test/web/twitter_api/views/user_view_test.exs b/test/web/twitter_api/views/user_view_test.exs index 74526673c..a48fc9b78 100644 --- a/test/web/twitter_api/views/user_view_test.exs +++ b/test/web/twitter_api/views/user_view_test.exs @@ -112,9 +112,11 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do      as_user = UserView.render("show.json", %{user: user, for: user})      assert as_user["default_scope"] == user.info.default_scope      assert as_user["no_rich_text"] == user.info.no_rich_text +    assert as_user["pleroma"]["notification_settings"] == user.info.notification_settings      as_stranger = UserView.render("show.json", %{user: user})      refute as_stranger["default_scope"]      refute as_stranger["no_rich_text"] +    refute as_stranger["pleroma"]["notification_settings"]    end    test "A user for a given other follower", %{user: user} do | 
