+ |> get("/api/v1/conversations")
+ |> json_response(200)
+
+ assert res_last_status["id"] == direct_reply.id
+ end
+
+ test "the user marks a conversation as read", %{user: user_one, conn: conn} do
+ user_two = insert(:user)
+
+ {:ok, direct} =
+ CommonAPI.post(user_one, %{
+ "status" => "Hi @#{user_two.nickname}",
+ "visibility" => "direct"
+ })
+
+ 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 == 1
+
+ user_two_conn =
+ build_conn()
+ |> assign(:user, user_two)
+ |> assign(
+ :token,
+ insert(:oauth_token, user: user_two, scopes: ["read:statuses", "write:conversations"])
+ )
+
+ [%{"id" => direct_conversation_id, "unread" => true}] =
+ user_two_conn
+ |> get("/api/v1/conversations")
+ |> json_response(200)
+
+ %{"unread" => false} =
+ user_two_conn
+ |> post("/api/v1/conversations/#{direct_conversation_id}/read")
+ |> json_response(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
+
+ # The conversation is marked as unread on reply
+ {:ok, _} =
+ CommonAPI.post(user_two, %{
+ "status" => "reply",
+ "visibility" => "direct",
+ "in_reply_to_status_id" => direct.id
+ })
+
+ [%{"unread" => true}] =
+ conn
+ |> get("/api/v1/conversations")
+ |> json_response(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
+
+ # A reply doesn't increment the user's unread_conversation_count if the conversation is unread
+ {:ok, _} =
+ CommonAPI.post(user_two, %{
+ "status" => "reply",
+ "visibility" => "direct",
+ "in_reply_to_status_id" => direct.id
+ })
+
+ 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
+ end
+
+ test "(vanilla) Mastodon frontend behaviour", %{user: user_one, conn: conn} do
+ user_two = insert(:user)
+
+ {:ok, direct} =
+ CommonAPI.post(user_one, %{
+ "status" => "Hi @#{user_two.nickname}!",
+ "visibility" => "direct"
+ })
+
+ res_conn = get(conn, "/api/v1/statuses/#{direct.id}/context")