1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do
6 use Pleroma.Web.ConnCase
9 alias Pleroma.Web.CommonAPI
11 import Pleroma.Factory
13 setup do: oauth_access(["read:statuses"])
15 test "returns a list of conversations", %{user: user_one, conn: conn} do
16 user_two = insert(:user)
17 user_three = insert(:user)
19 {:ok, user_two} = User.follow(user_two, user_one)
21 assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0
24 CommonAPI.post(user_one, %{
25 status: "Hi @#{user_two.nickname}, @#{user_three.nickname}!",
29 assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1
31 {:ok, _follower_only} =
32 CommonAPI.post(user_one, %{
33 status: "Hi @#{user_two.nickname}!",
37 res_conn = get(conn, "/api/v1/conversations")
39 assert response = json_response_and_validate_schema(res_conn, 200)
44 "accounts" => res_accounts,
45 "last_status" => res_last_status,
50 account_ids = Enum.map(res_accounts, & &1["id"])
51 assert length(res_accounts) == 2
52 assert user_two.id in account_ids
53 assert user_three.id in account_ids
54 assert is_binary(res_id)
55 assert unread == false
56 assert res_last_status["id"] == direct.id
57 assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0
60 test "filters conversations by recipients", %{user: user_one, conn: conn} do
61 user_two = insert(:user)
62 user_three = insert(:user)
65 CommonAPI.post(user_one, %{
66 status: "Hi @#{user_two.nickname}!",
71 CommonAPI.post(user_one, %{
72 status: "Hi @#{user_three.nickname}!",
77 CommonAPI.post(user_one, %{
78 status: "Hi @#{user_two.nickname}, @#{user_three.nickname}!",
83 CommonAPI.post(user_two, %{
84 status: "Hi @#{user_three.nickname}!",
89 CommonAPI.post(user_two, %{
90 status: "Hi @#{user_one.nickname}!",
94 assert [conversation1, conversation2] =
96 |> get("/api/v1/conversations?recipients[]=#{user_two.id}")
97 |> json_response_and_validate_schema(200)
99 assert conversation1["last_status"]["id"] == direct5.id
100 assert conversation2["last_status"]["id"] == direct1.id
104 |> get("/api/v1/conversations?recipients[]=#{user_two.id}&recipients[]=#{user_three.id}")
105 |> json_response_and_validate_schema(200)
107 assert conversation1["last_status"]["id"] == direct3.id
110 test "updates the last_status on reply", %{user: user_one, conn: conn} do
111 user_two = insert(:user)
114 CommonAPI.post(user_one, %{
115 status: "Hi @#{user_two.nickname}",
119 {:ok, direct_reply} =
120 CommonAPI.post(user_two, %{
122 visibility: "direct",
123 in_reply_to_status_id: direct.id
126 [%{"last_status" => res_last_status}] =
128 |> get("/api/v1/conversations")
129 |> json_response_and_validate_schema(200)
131 assert res_last_status["id"] == direct_reply.id
134 test "the user marks a conversation as read", %{user: user_one, conn: conn} do
135 user_two = insert(:user)
138 CommonAPI.post(user_one, %{
139 status: "Hi @#{user_two.nickname}",
143 assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0
144 assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1
148 |> assign(:user, user_two)
151 insert(:oauth_token, user: user_two, scopes: ["read:statuses", "write:conversations"])
154 [%{"id" => direct_conversation_id, "unread" => true}] =
156 |> get("/api/v1/conversations")
157 |> json_response_and_validate_schema(200)
159 %{"unread" => false} =
161 |> post("/api/v1/conversations/#{direct_conversation_id}/read")
162 |> json_response_and_validate_schema(200)
164 assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0
165 assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0
167 # The conversation is marked as unread on reply
169 CommonAPI.post(user_two, %{
171 visibility: "direct",
172 in_reply_to_status_id: direct.id
175 [%{"unread" => true}] =
177 |> get("/api/v1/conversations")
178 |> json_response_and_validate_schema(200)
180 assert User.get_cached_by_id(user_one.id).unread_conversation_count == 1
181 assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0
183 # A reply doesn't increment the user's unread_conversation_count if the conversation is unread
185 CommonAPI.post(user_two, %{
187 visibility: "direct",
188 in_reply_to_status_id: direct.id
191 assert User.get_cached_by_id(user_one.id).unread_conversation_count == 1
192 assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0
195 test "(vanilla) Mastodon frontend behaviour", %{user: user_one, conn: conn} do
196 user_two = insert(:user)
199 CommonAPI.post(user_one, %{
200 status: "Hi @#{user_two.nickname}!",
204 res_conn = get(conn, "/api/v1/statuses/#{direct.id}/context")
206 assert %{"ancestors" => [], "descendants" => []} == json_response(res_conn, 200)