Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

384 řádky
12KB

  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. |> put_req_header("content-type", "application/json")
  26. |> post("/api/v1/pleroma/accounts/confirmation_resend?email=#{user.email}")
  27. |> json_response_and_validate_schema(:no_content)
  28. ObanHelpers.perform_all()
  29. email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
  30. notify_email = Config.get([:instance, :notify_email])
  31. instance_name = Config.get([:instance, :name])
  32. assert_email_sent(
  33. from: {instance_name, notify_email},
  34. to: {user.name, user.email},
  35. html_body: email.html_body
  36. )
  37. end
  38. test "resend account confirmation email (with nickname)", %{conn: conn, user: user} do
  39. conn
  40. |> put_req_header("content-type", "application/json")
  41. |> post("/api/v1/pleroma/accounts/confirmation_resend?nickname=#{user.nickname}")
  42. |> json_response_and_validate_schema(:no_content)
  43. ObanHelpers.perform_all()
  44. email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
  45. notify_email = Config.get([:instance, :notify_email])
  46. instance_name = Config.get([:instance, :name])
  47. assert_email_sent(
  48. from: {instance_name, notify_email},
  49. to: {user.name, user.email},
  50. html_body: email.html_body
  51. )
  52. end
  53. end
  54. describe "PATCH /api/v1/pleroma/accounts/update_avatar" do
  55. setup do: oauth_access(["write:accounts"])
  56. test "user avatar can be set", %{user: user, conn: conn} do
  57. avatar_image = File.read!("test/fixtures/avatar_data_uri")
  58. conn =
  59. conn
  60. |> put_req_header("content-type", "multipart/form-data")
  61. |> patch("/api/v1/pleroma/accounts/update_avatar", %{img: avatar_image})
  62. user = refresh_record(user)
  63. assert %{
  64. "name" => _,
  65. "type" => _,
  66. "url" => [
  67. %{
  68. "href" => _,
  69. "mediaType" => _,
  70. "type" => _
  71. }
  72. ]
  73. } = user.avatar
  74. assert %{"url" => _} = json_response_and_validate_schema(conn, 200)
  75. end
  76. test "user avatar can be reset", %{user: user, conn: conn} do
  77. conn =
  78. conn
  79. |> put_req_header("content-type", "multipart/form-data")
  80. |> patch("/api/v1/pleroma/accounts/update_avatar", %{img: ""})
  81. user = User.get_cached_by_id(user.id)
  82. assert user.avatar == nil
  83. assert %{"url" => nil} = json_response_and_validate_schema(conn, 200)
  84. end
  85. end
  86. describe "PATCH /api/v1/pleroma/accounts/update_banner" do
  87. setup do: oauth_access(["write:accounts"])
  88. test "can set profile banner", %{user: user, conn: conn} do
  89. conn =
  90. conn
  91. |> put_req_header("content-type", "multipart/form-data")
  92. |> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => @image})
  93. user = refresh_record(user)
  94. assert user.banner["type"] == "Image"
  95. assert %{"url" => _} = json_response_and_validate_schema(conn, 200)
  96. end
  97. test "can reset profile banner", %{user: user, conn: conn} do
  98. conn =
  99. conn
  100. |> put_req_header("content-type", "multipart/form-data")
  101. |> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => ""})
  102. user = refresh_record(user)
  103. assert user.banner == %{}
  104. assert %{"url" => nil} = json_response_and_validate_schema(conn, 200)
  105. end
  106. end
  107. describe "PATCH /api/v1/pleroma/accounts/update_background" do
  108. setup do: oauth_access(["write:accounts"])
  109. test "background image can be set", %{user: user, conn: conn} do
  110. conn =
  111. conn
  112. |> put_req_header("content-type", "multipart/form-data")
  113. |> patch("/api/v1/pleroma/accounts/update_background", %{"img" => @image})
  114. user = refresh_record(user)
  115. assert user.background["type"] == "Image"
  116. # assert %{"url" => _} = json_response(conn, 200)
  117. assert %{"url" => _} = json_response_and_validate_schema(conn, 200)
  118. end
  119. test "background image can be reset", %{user: user, conn: conn} do
  120. conn =
  121. conn
  122. |> put_req_header("content-type", "multipart/form-data")
  123. |> patch("/api/v1/pleroma/accounts/update_background", %{"img" => ""})
  124. user = refresh_record(user)
  125. assert user.background == %{}
  126. assert %{"url" => nil} = json_response_and_validate_schema(conn, 200)
  127. end
  128. end
  129. describe "getting favorites timeline of specified user" do
  130. setup do
  131. [current_user, user] = insert_pair(:user, hide_favorites: false)
  132. %{user: current_user, conn: conn} = oauth_access(["read:favourites"], user: current_user)
  133. [current_user: current_user, user: user, conn: conn]
  134. end
  135. test "returns list of statuses favorited by specified user", %{
  136. conn: conn,
  137. user: user
  138. } do
  139. [activity | _] = insert_pair(:note_activity)
  140. CommonAPI.favorite(user, activity.id)
  141. response =
  142. conn
  143. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  144. |> json_response_and_validate_schema(:ok)
  145. [like] = response
  146. assert length(response) == 1
  147. assert like["id"] == activity.id
  148. end
  149. test "returns favorites for specified user_id when requester is not logged in", %{
  150. user: user
  151. } do
  152. activity = insert(:note_activity)
  153. CommonAPI.favorite(user, activity.id)
  154. response =
  155. build_conn()
  156. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  157. |> json_response_and_validate_schema(200)
  158. assert length(response) == 1
  159. end
  160. test "returns favorited DM only when user is logged in and he is one of recipients", %{
  161. current_user: current_user,
  162. user: user
  163. } do
  164. {:ok, direct} =
  165. CommonAPI.post(current_user, %{
  166. status: "Hi @#{user.nickname}!",
  167. visibility: "direct"
  168. })
  169. CommonAPI.favorite(user, direct.id)
  170. for u <- [user, current_user] do
  171. response =
  172. build_conn()
  173. |> assign(:user, u)
  174. |> assign(:token, insert(:oauth_token, user: u, scopes: ["read:favourites"]))
  175. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  176. |> json_response_and_validate_schema(:ok)
  177. assert length(response) == 1
  178. end
  179. response =
  180. build_conn()
  181. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  182. |> json_response_and_validate_schema(200)
  183. assert length(response) == 0
  184. end
  185. test "does not return others' favorited DM when user is not one of recipients", %{
  186. conn: conn,
  187. user: user
  188. } do
  189. user_two = insert(:user)
  190. {:ok, direct} =
  191. CommonAPI.post(user_two, %{
  192. status: "Hi @#{user.nickname}!",
  193. visibility: "direct"
  194. })
  195. CommonAPI.favorite(user, direct.id)
  196. response =
  197. conn
  198. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  199. |> json_response_and_validate_schema(:ok)
  200. assert Enum.empty?(response)
  201. end
  202. test "paginates favorites using since_id and max_id", %{
  203. conn: conn,
  204. user: user
  205. } do
  206. activities = insert_list(10, :note_activity)
  207. Enum.each(activities, fn activity ->
  208. CommonAPI.favorite(user, activity.id)
  209. end)
  210. third_activity = Enum.at(activities, 2)
  211. seventh_activity = Enum.at(activities, 6)
  212. response =
  213. conn
  214. |> get(
  215. "/api/v1/pleroma/accounts/#{user.id}/favourites?since_id=#{third_activity.id}&max_id=#{
  216. seventh_activity.id
  217. }"
  218. )
  219. |> json_response_and_validate_schema(:ok)
  220. assert length(response) == 3
  221. refute third_activity in response
  222. refute seventh_activity in response
  223. end
  224. test "limits favorites using limit parameter", %{
  225. conn: conn,
  226. user: user
  227. } do
  228. 7
  229. |> insert_list(:note_activity)
  230. |> Enum.each(fn activity ->
  231. CommonAPI.favorite(user, activity.id)
  232. end)
  233. response =
  234. conn
  235. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites?limit=3")
  236. |> json_response_and_validate_schema(:ok)
  237. assert length(response) == 3
  238. end
  239. test "returns empty response when user does not have any favorited statuses", %{
  240. conn: conn,
  241. user: user
  242. } do
  243. response =
  244. conn
  245. |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
  246. |> json_response_and_validate_schema(:ok)
  247. assert Enum.empty?(response)
  248. end
  249. test "returns 404 error when specified user is not exist", %{conn: conn} do
  250. conn = get(conn, "/api/v1/pleroma/accounts/test/favourites")
  251. assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"}
  252. end
  253. test "returns 403 error when user has hidden own favorites", %{conn: conn} do
  254. user = insert(:user, hide_favorites: true)
  255. activity = insert(:note_activity)
  256. CommonAPI.favorite(user, activity.id)
  257. conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites")
  258. assert json_response_and_validate_schema(conn, 403) == %{"error" => "Can't get favorites"}
  259. end
  260. test "hides favorites for new users by default", %{conn: conn} do
  261. user = insert(:user)
  262. activity = insert(:note_activity)
  263. CommonAPI.favorite(user, activity.id)
  264. assert user.hide_favorites
  265. conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites")
  266. assert json_response_and_validate_schema(conn, 403) == %{"error" => "Can't get favorites"}
  267. end
  268. end
  269. describe "subscribing / unsubscribing" do
  270. test "subscribing / unsubscribing to a user" do
  271. %{user: user, conn: conn} = oauth_access(["follow"])
  272. subscription_target = insert(:user)
  273. ret_conn =
  274. conn
  275. |> assign(:user, user)
  276. |> post("/api/v1/pleroma/accounts/#{subscription_target.id}/subscribe")
  277. assert %{"id" => _id, "subscribing" => true} =
  278. json_response_and_validate_schema(ret_conn, 200)
  279. conn = post(conn, "/api/v1/pleroma/accounts/#{subscription_target.id}/unsubscribe")
  280. assert %{"id" => _id, "subscribing" => false} = json_response_and_validate_schema(conn, 200)
  281. end
  282. end
  283. describe "subscribing" do
  284. test "returns 404 when subscription_target not found" do
  285. %{conn: conn} = oauth_access(["write:follows"])
  286. conn = post(conn, "/api/v1/pleroma/accounts/target_id/subscribe")
  287. assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn, 404)
  288. end
  289. end
  290. describe "unsubscribing" do
  291. test "returns 404 when subscription_target not found" do
  292. %{conn: conn} = oauth_access(["follow"])
  293. conn = post(conn, "/api/v1/pleroma/accounts/target_id/unsubscribe")
  294. assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn, 404)
  295. end
  296. end
  297. end