Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

337 lines
9.9KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
  5. use Pleroma.Web.ConnCase
  6. alias Pleroma.Config
  7. alias Pleroma.Tests.ObanHelpers
  8. alias Pleroma.User
  9. alias Pleroma.Web.CommonAPI
  10. import Pleroma.Factory
  11. import Swoosh.TestAssertions
  12. @image "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7"
  13. describe "POST /api/v1/pleroma/accounts/confirmation_resend" do
  14. setup do
  15. {:ok, user} =
  16. insert(:user)
  17. |> User.confirmation_changeset(need_confirmation: true)
  18. |> User.update_and_set_cache()
  19. assert user.confirmation_pending
  20. [user: user]
  21. end
  22. setup do: clear_config([:instance, :account_activation_required], true)
  23. test "resend account confirmation email", %{conn: conn, user: user} do
  24. conn
  25. |> post("/api/v1/pleroma/accounts/confirmation_resend?email=#{user.email}")
  26. |> json_response(:no_content)
  27. ObanHelpers.perform_all()
  28. email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
  29. notify_email = Config.get([:instance, :notify_email])
  30. instance_name = Config.get([:instance, :name])
  31. assert_email_sent(
  32. from: {instance_name, notify_email},
  33. to: {user.name, user.email},
  34. html_body: email.html_body
  35. )
  36. end
  37. end
  38. describe "PATCH /api/v1/pleroma/accounts/update_avatar" do
  39. setup do: oauth_access(["write:accounts"])
  40. test "user avatar can be set", %{user: user, conn: conn} do
  41. avatar_image = File.read!("test/fixtures/avatar_data_uri")
  42. conn = patch(conn, "/api/v1/pleroma/accounts/update_avatar", %{img: avatar_image})
  43. user = refresh_record(user)
  44. assert %{
  45. "name" => _,
  46. "type" => _,
  47. "url" => [
  48. %{
  49. "href" => _,
  50. "mediaType" => _,
  51. "type" => _
  52. }
  53. ]
  54. } = user.avatar
  55. assert %{"url" => _} = json_response(conn, 200)
  56. end
  57. test "user avatar can be reset", %{user: user, conn: conn} do
  58. conn = patch(conn, "/api/v1/pleroma/accounts/update_avatar", %{img: ""})
  59. user = User.get_cached_by_id(user.id)
  60. assert user.avatar == nil
  61. assert %{"url" => nil} = json_response(conn, 200)
  62. end
  63. end
  64. describe "PATCH /api/v1/pleroma/accounts/update_banner" do
  65. setup do: oauth_access(["write:accounts"])
  66. test "can set profile banner", %{user: user, conn: conn} do
  67. conn = patch(conn, "/api/v1/pleroma/accounts/update_banner", %{"banner" => @image})
  68. user = refresh_record(user)
  69. assert user.banner["type"] == "Image"
  70. assert %{"url" => _} = json_response(conn, 200)
  71. end
  72. test "can reset profile banner", %{user: user, conn: conn} do
  73. conn = patch(conn, "/api/v1/pleroma/accounts/update_banner", %{"banner" => ""})
  74. user = refresh_record(user)
  75. assert user.banner == %{}
  76. assert %{"url" => nil} = json_response(conn, 200)
  77. end
  78. end
  79. describe "PATCH /api/v1/pleroma/accounts/update_background" do
  80. setup do: oauth_access(["write:accounts"])
  81. test "background image can be set", %{user: user, conn: conn} do
  82. conn = patch(conn, "/api/v1/pleroma/accounts/update_background", %{"img" => @image})
  83. user = refresh_record(user)
  84. assert user.background["type"] == "Image"
  85. assert %{"url" => _} = json_response(conn, 200)
  86. end
  87. test "background image can be reset", %{user: user, conn: conn} do
  88. conn = patch(conn, "/api/v1/pleroma/accounts/update_background", %{"img" => ""})
  89. user = refresh_record(user)
  90. assert user.background == %{}
  91. assert %{"url" => nil} = json_response(conn, 200)
  92. end
  93. end
  94. describe "getting favorites timeline of specified user" do
  95. setup do
  96. [current_user, user] = insert_pair(:user, hide_favorites: false)
  97. %{user: current_user, conn: conn} = oauth_access(["read:favourites"], user: current_user)
  98. [current_user: current_user, user: user, conn: conn]
  99. end
  100. test "returns list of statuses favorited by specified user", %{
  101. conn: conn,
  102. user: user
  103. } do
  104. [activity | _] = insert_pair(:note_activity)
  105. CommonAPI.favorite(activity.id, user)
  106. response =
  107. conn
  108. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  109. |> json_response(:ok)
  110. [like] = response
  111. assert length(response) == 1
  112. assert like["id"] == activity.id
  113. end
  114. test "does not return favorites for specified user_id when user is not logged in", %{
  115. user: user
  116. } do
  117. activity = insert(:note_activity)
  118. CommonAPI.favorite(activity.id, user)
  119. build_conn()
  120. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  121. |> json_response(403)
  122. end
  123. test "returns favorited DM only when user is logged in and he is one of recipients", %{
  124. current_user: current_user,
  125. user: user
  126. } do
  127. {:ok, direct} =
  128. CommonAPI.post(current_user, %{
  129. "status" => "Hi @#{user.nickname}!",
  130. "visibility" => "direct"
  131. })
  132. CommonAPI.favorite(direct.id, user)
  133. for u <- [user, current_user] do
  134. response =
  135. build_conn()
  136. |> assign(:user, u)
  137. |> assign(:token, insert(:oauth_token, user: u, scopes: ["read:favourites"]))
  138. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  139. |> json_response(:ok)
  140. assert length(response) == 1
  141. end
  142. build_conn()
  143. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  144. |> json_response(403)
  145. end
  146. test "does not return others' favorited DM when user is not one of recipients", %{
  147. conn: conn,
  148. user: user
  149. } do
  150. user_two = insert(:user)
  151. {:ok, direct} =
  152. CommonAPI.post(user_two, %{
  153. "status" => "Hi @#{user.nickname}!",
  154. "visibility" => "direct"
  155. })
  156. CommonAPI.favorite(direct.id, user)
  157. response =
  158. conn
  159. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  160. |> json_response(:ok)
  161. assert Enum.empty?(response)
  162. end
  163. test "paginates favorites using since_id and max_id", %{
  164. conn: conn,
  165. user: user
  166. } do
  167. activities = insert_list(10, :note_activity)
  168. Enum.each(activities, fn activity ->
  169. CommonAPI.favorite(activity.id, user)
  170. end)
  171. third_activity = Enum.at(activities, 2)
  172. seventh_activity = Enum.at(activities, 6)
  173. response =
  174. conn
  175. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites", %{
  176. since_id: third_activity.id,
  177. max_id: seventh_activity.id
  178. })
  179. |> json_response(:ok)
  180. assert length(response) == 3
  181. refute third_activity in response
  182. refute seventh_activity in response
  183. end
  184. test "limits favorites using limit parameter", %{
  185. conn: conn,
  186. user: user
  187. } do
  188. 7
  189. |> insert_list(:note_activity)
  190. |> Enum.each(fn activity ->
  191. CommonAPI.favorite(activity.id, user)
  192. end)
  193. response =
  194. conn
  195. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites", %{limit: "3"})
  196. |> json_response(:ok)
  197. assert length(response) == 3
  198. end
  199. test "returns empty response when user does not have any favorited statuses", %{
  200. conn: conn,
  201. user: user
  202. } do
  203. response =
  204. conn
  205. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  206. |> json_response(:ok)
  207. assert Enum.empty?(response)
  208. end
  209. test "returns 404 error when specified user is not exist", %{conn: conn} do
  210. conn = get(conn, "/api/v1/pleroma/accounts/test/favourites")
  211. assert json_response(conn, 404) == %{"error" => "Record not found"}
  212. end
  213. test "returns 403 error when user has hidden own favorites", %{conn: conn} do
  214. user = insert(:user, hide_favorites: true)
  215. activity = insert(:note_activity)
  216. CommonAPI.favorite(activity.id, user)
  217. conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites")
  218. assert json_response(conn, 403) == %{"error" => "Can't get favorites"}
  219. end
  220. test "hides favorites for new users by default", %{conn: conn} do
  221. user = insert(:user)
  222. activity = insert(:note_activity)
  223. CommonAPI.favorite(activity.id, user)
  224. assert user.hide_favorites
  225. conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites")
  226. assert json_response(conn, 403) == %{"error" => "Can't get favorites"}
  227. end
  228. end
  229. describe "subscribing / unsubscribing" do
  230. test "subscribing / unsubscribing to a user" do
  231. %{user: user, conn: conn} = oauth_access(["follow"])
  232. subscription_target = insert(:user)
  233. ret_conn =
  234. conn
  235. |> assign(:user, user)
  236. |> post("/api/v1/pleroma/accounts/#{subscription_target.id}/subscribe")
  237. assert %{"id" => _id, "subscribing" => true} = json_response(ret_conn, 200)
  238. conn = post(conn, "/api/v1/pleroma/accounts/#{subscription_target.id}/unsubscribe")
  239. assert %{"id" => _id, "subscribing" => false} = json_response(conn, 200)
  240. end
  241. end
  242. describe "subscribing" do
  243. test "returns 404 when subscription_target not found" do
  244. %{conn: conn} = oauth_access(["write:follows"])
  245. conn = post(conn, "/api/v1/pleroma/accounts/target_id/subscribe")
  246. assert %{"error" => "Record not found"} = json_response(conn, 404)
  247. end
  248. end
  249. describe "unsubscribing" do
  250. test "returns 404 when subscription_target not found" do
  251. %{conn: conn} = oauth_access(["follow"])
  252. conn = post(conn, "/api/v1/pleroma/accounts/target_id/unsubscribe")
  253. assert %{"error" => "Record not found"} = json_response(conn, 404)
  254. end
  255. end
  256. end