logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

util_controller_test.exs (29681B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
  5. use Pleroma.Web.ConnCase
  6. use Oban.Testing, repo: Pleroma.Repo
  7. alias Pleroma.Tests.ObanHelpers
  8. alias Pleroma.User
  9. import Pleroma.Factory
  10. import Mock
  11. setup do
  12. Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
  13. :ok
  14. end
  15. setup do: clear_config([:instance])
  16. setup do: clear_config([:frontend_configurations, :pleroma_fe])
  17. describe "PUT /api/pleroma/notification_settings" do
  18. setup do: oauth_access(["write:accounts"])
  19. test "it updates notification settings", %{user: user, conn: conn} do
  20. conn
  21. |> put(
  22. "/api/pleroma/notification_settings?#{URI.encode_query(%{block_from_strangers: true})}"
  23. )
  24. |> json_response_and_validate_schema(:ok)
  25. user = refresh_record(user)
  26. assert %Pleroma.User.NotificationSetting{
  27. block_from_strangers: true,
  28. hide_notification_contents: false
  29. } == user.notification_settings
  30. end
  31. test "it updates notification settings to enable hiding contents", %{user: user, conn: conn} do
  32. conn
  33. |> put(
  34. "/api/pleroma/notification_settings?#{URI.encode_query(%{hide_notification_contents: 1})}"
  35. )
  36. |> json_response_and_validate_schema(:ok)
  37. user = refresh_record(user)
  38. assert %Pleroma.User.NotificationSetting{
  39. block_from_strangers: false,
  40. hide_notification_contents: true
  41. } == user.notification_settings
  42. end
  43. end
  44. describe "GET /api/pleroma/frontend_configurations" do
  45. test "returns everything in :pleroma, :frontend_configurations", %{conn: conn} do
  46. config = [
  47. frontend_a: %{
  48. x: 1,
  49. y: 2
  50. },
  51. frontend_b: %{
  52. z: 3
  53. }
  54. ]
  55. clear_config(:frontend_configurations, config)
  56. response =
  57. conn
  58. |> get("/api/pleroma/frontend_configurations")
  59. |> json_response_and_validate_schema(:ok)
  60. assert response == Jason.encode!(config |> Enum.into(%{})) |> Jason.decode!()
  61. end
  62. end
  63. describe "/api/pleroma/emoji" do
  64. test "returns json with custom emoji with tags", %{conn: conn} do
  65. emoji =
  66. conn
  67. |> get("/api/pleroma/emoji")
  68. |> json_response_and_validate_schema(200)
  69. assert Enum.all?(emoji, fn
  70. {_key,
  71. %{
  72. "image_url" => url,
  73. "tags" => tags
  74. }} ->
  75. is_binary(url) and is_list(tags)
  76. end)
  77. end
  78. end
  79. describe "GET /api/pleroma/healthcheck" do
  80. setup do: clear_config([:instance, :healthcheck])
  81. test "returns 503 when healthcheck disabled", %{conn: conn} do
  82. clear_config([:instance, :healthcheck], false)
  83. response =
  84. conn
  85. |> get("/api/pleroma/healthcheck")
  86. |> json_response_and_validate_schema(503)
  87. assert response == %{"error" => "Healthcheck disabled"}
  88. end
  89. test "returns 200 when healthcheck enabled and all ok", %{conn: conn} do
  90. clear_config([:instance, :healthcheck], true)
  91. with_mock Pleroma.Healthcheck,
  92. system_info: fn -> %Pleroma.Healthcheck{healthy: true} end do
  93. response =
  94. conn
  95. |> get("/api/pleroma/healthcheck")
  96. |> json_response_and_validate_schema(200)
  97. assert %{
  98. "active" => _,
  99. "healthy" => true,
  100. "idle" => _,
  101. "memory_used" => _,
  102. "pool_size" => _
  103. } = response
  104. end
  105. end
  106. test "returns 503 when healthcheck enabled and health is false", %{conn: conn} do
  107. clear_config([:instance, :healthcheck], true)
  108. with_mock Pleroma.Healthcheck,
  109. system_info: fn -> %Pleroma.Healthcheck{healthy: false} end do
  110. response =
  111. conn
  112. |> get("/api/pleroma/healthcheck")
  113. |> json_response_and_validate_schema(503)
  114. assert %{
  115. "active" => _,
  116. "healthy" => false,
  117. "idle" => _,
  118. "memory_used" => _,
  119. "pool_size" => _
  120. } = response
  121. end
  122. end
  123. end
  124. describe "POST /api/pleroma/disable_account" do
  125. setup do: oauth_access(["write:accounts"])
  126. test "with valid permissions and password, it disables the account", %{conn: conn, user: user} do
  127. response =
  128. conn
  129. |> post("/api/pleroma/disable_account?password=test")
  130. |> json_response_and_validate_schema(:ok)
  131. assert response == %{"status" => "success"}
  132. ObanHelpers.perform_all()
  133. user = User.get_cached_by_id(user.id)
  134. refute user.is_active
  135. end
  136. test "with valid permissions and invalid password, it returns an error", %{conn: conn} do
  137. user = insert(:user)
  138. response =
  139. conn
  140. |> post("/api/pleroma/disable_account?password=test1")
  141. |> json_response_and_validate_schema(:ok)
  142. assert response == %{"error" => "Invalid password."}
  143. user = User.get_cached_by_id(user.id)
  144. assert user.is_active
  145. end
  146. end
  147. describe "POST /main/ostatus - remote_subscribe/2" do
  148. setup do: clear_config([:instance, :federating], true)
  149. test "renders subscribe form", %{conn: conn} do
  150. user = insert(:user)
  151. response =
  152. conn
  153. |> post("/main/ostatus", %{"nickname" => user.nickname, "profile" => ""})
  154. |> response(:ok)
  155. refute response =~ "Could not find user"
  156. assert response =~ "Remotely follow #{user.nickname}"
  157. end
  158. test "renders subscribe form with error when user not found", %{conn: conn} do
  159. response =
  160. conn
  161. |> post("/main/ostatus", %{"nickname" => "nickname", "profile" => ""})
  162. |> response(:ok)
  163. assert response =~ "Could not find user"
  164. refute response =~ "Remotely follow"
  165. end
  166. test "it redirect to webfinger url", %{conn: conn} do
  167. user = insert(:user)
  168. user2 = insert(:user, ap_id: "shp@social.heldscal.la")
  169. conn =
  170. conn
  171. |> post("/main/ostatus", %{
  172. "user" => %{"nickname" => user.nickname, "profile" => user2.ap_id}
  173. })
  174. assert redirected_to(conn) ==
  175. "https://social.heldscal.la/main/ostatussub?profile=#{user.ap_id}"
  176. end
  177. test "it renders form with error when user not found", %{conn: conn} do
  178. user2 = insert(:user, ap_id: "shp@social.heldscal.la")
  179. response =
  180. conn
  181. |> post("/main/ostatus", %{"user" => %{"nickname" => "jimm", "profile" => user2.ap_id}})
  182. |> response(:ok)
  183. assert response =~ "Something went wrong."
  184. end
  185. end
  186. describe "POST /main/ostatus - remote_subscribe/2 - with statuses" do
  187. setup do: clear_config([:instance, :federating], true)
  188. test "renders subscribe form", %{conn: conn} do
  189. user = insert(:user)
  190. status = insert(:note_activity, %{user: user})
  191. status_id = status.id
  192. assert is_binary(status_id)
  193. response =
  194. conn
  195. |> post("/main/ostatus", %{"status_id" => status_id, "profile" => ""})
  196. |> response(:ok)
  197. refute response =~ "Could not find status"
  198. assert response =~ "Interacting with"
  199. end
  200. test "renders subscribe form with error when status not found", %{conn: conn} do
  201. response =
  202. conn
  203. |> post("/main/ostatus", %{"status_id" => "somerandomid", "profile" => ""})
  204. |> response(:ok)
  205. assert response =~ "Could not find status"
  206. refute response =~ "Interacting with"
  207. end
  208. test "it redirect to webfinger url", %{conn: conn} do
  209. user = insert(:user)
  210. status = insert(:note_activity, %{user: user})
  211. status_id = status.id
  212. status_ap_id = status.data["object"]
  213. assert is_binary(status_id)
  214. assert is_binary(status_ap_id)
  215. user2 = insert(:user, ap_id: "shp@social.heldscal.la")
  216. conn =
  217. conn
  218. |> post("/main/ostatus", %{
  219. "status" => %{"status_id" => status_id, "profile" => user2.ap_id}
  220. })
  221. assert redirected_to(conn) ==
  222. "https://social.heldscal.la/main/ostatussub?profile=#{status_ap_id}"
  223. end
  224. test "it renders form with error when status not found", %{conn: conn} do
  225. user2 = insert(:user, ap_id: "shp@social.heldscal.la")
  226. response =
  227. conn
  228. |> post("/main/ostatus", %{
  229. "status" => %{"status_id" => "somerandomid", "profile" => user2.ap_id}
  230. })
  231. |> response(:ok)
  232. assert response =~ "Something went wrong."
  233. end
  234. end
  235. describe "GET /main/ostatus - show_subscribe_form/2" do
  236. setup do: clear_config([:instance, :federating], true)
  237. test "it works with users", %{conn: conn} do
  238. user = insert(:user)
  239. response =
  240. conn
  241. |> get("/main/ostatus", %{"nickname" => user.nickname})
  242. |> response(:ok)
  243. refute response =~ "Could not find user"
  244. assert response =~ "Remotely follow #{user.nickname}"
  245. end
  246. test "it works with statuses", %{conn: conn} do
  247. user = insert(:user)
  248. status = insert(:note_activity, %{user: user})
  249. status_id = status.id
  250. assert is_binary(status_id)
  251. response =
  252. conn
  253. |> get("/main/ostatus", %{"status_id" => status_id})
  254. |> response(:ok)
  255. refute response =~ "Could not find status"
  256. assert response =~ "Interacting with"
  257. end
  258. end
  259. test "it returns new captcha", %{conn: conn} do
  260. with_mock Pleroma.Captcha,
  261. new: fn -> "test_captcha" end do
  262. resp =
  263. conn
  264. |> get("/api/pleroma/captcha")
  265. |> response(200)
  266. assert resp == "\"test_captcha\""
  267. assert called(Pleroma.Captcha.new())
  268. end
  269. end
  270. describe "POST /api/pleroma/change_email" do
  271. setup do: oauth_access(["write:accounts"])
  272. test "without permissions", %{conn: conn} do
  273. conn =
  274. conn
  275. |> assign(:token, nil)
  276. |> put_req_header("content-type", "multipart/form-data")
  277. |> post("/api/pleroma/change_email", %{password: "hi", email: "test@test.com"})
  278. assert json_response_and_validate_schema(conn, 403) == %{
  279. "error" => "Insufficient permissions: write:accounts."
  280. }
  281. end
  282. test "with proper permissions and invalid password", %{conn: conn} do
  283. conn =
  284. conn
  285. |> put_req_header("content-type", "multipart/form-data")
  286. |> post("/api/pleroma/change_email", %{password: "hi", email: "test@test.com"})
  287. assert json_response_and_validate_schema(conn, 200) == %{"error" => "Invalid password."}
  288. end
  289. test "with proper permissions, valid password and invalid email", %{
  290. conn: conn
  291. } do
  292. conn =
  293. conn
  294. |> put_req_header("content-type", "multipart/form-data")
  295. |> post("/api/pleroma/change_email", %{password: "test", email: "foobar"})
  296. assert json_response_and_validate_schema(conn, 200) == %{
  297. "error" => "Email has invalid format."
  298. }
  299. end
  300. test "with proper permissions, valid password and no email", %{
  301. conn: conn
  302. } do
  303. conn =
  304. conn
  305. |> put_req_header("content-type", "multipart/form-data")
  306. |> post("/api/pleroma/change_email", %{password: "test"})
  307. assert %{"error" => "Missing field: email."} = json_response_and_validate_schema(conn, 400)
  308. end
  309. test "with proper permissions, valid password and blank email, when instance requires user email",
  310. %{
  311. conn: conn
  312. } do
  313. orig_account_activation_required =
  314. Pleroma.Config.get([:instance, :account_activation_required])
  315. Pleroma.Config.put([:instance, :account_activation_required], true)
  316. on_exit(fn ->
  317. Pleroma.Config.put(
  318. [:instance, :account_activation_required],
  319. orig_account_activation_required
  320. )
  321. end)
  322. conn =
  323. conn
  324. |> put_req_header("content-type", "multipart/form-data")
  325. |> post("/api/pleroma/change_email", %{password: "test", email: ""})
  326. assert json_response_and_validate_schema(conn, 200) == %{"error" => "Email can't be blank."}
  327. end
  328. test "with proper permissions, valid password and blank email, when instance does not require user email",
  329. %{
  330. conn: conn
  331. } do
  332. orig_account_activation_required =
  333. Pleroma.Config.get([:instance, :account_activation_required])
  334. Pleroma.Config.put([:instance, :account_activation_required], false)
  335. on_exit(fn ->
  336. Pleroma.Config.put(
  337. [:instance, :account_activation_required],
  338. orig_account_activation_required
  339. )
  340. end)
  341. conn =
  342. conn
  343. |> put_req_header("content-type", "multipart/form-data")
  344. |> post("/api/pleroma/change_email", %{password: "test", email: ""})
  345. assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
  346. end
  347. test "with proper permissions, valid password and non unique email", %{
  348. conn: conn
  349. } do
  350. user = insert(:user)
  351. conn =
  352. conn
  353. |> put_req_header("content-type", "multipart/form-data")
  354. |> post("/api/pleroma/change_email", %{password: "test", email: user.email})
  355. assert json_response_and_validate_schema(conn, 200) == %{
  356. "error" => "Email has already been taken."
  357. }
  358. end
  359. test "with proper permissions, valid password and valid email", %{
  360. conn: conn
  361. } do
  362. conn =
  363. conn
  364. |> put_req_header("content-type", "multipart/form-data")
  365. |> post("/api/pleroma/change_email", %{password: "test", email: "cofe@foobar.com"})
  366. assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
  367. end
  368. end
  369. describe "POST /api/pleroma/change_password" do
  370. setup do: oauth_access(["write:accounts"])
  371. test "without permissions", %{conn: conn} do
  372. conn =
  373. conn
  374. |> assign(:token, nil)
  375. |> put_req_header("content-type", "multipart/form-data")
  376. |> post("/api/pleroma/change_password", %{
  377. "password" => "hi",
  378. "new_password" => "newpass",
  379. "new_password_confirmation" => "newpass"
  380. })
  381. assert json_response_and_validate_schema(conn, 403) == %{
  382. "error" => "Insufficient permissions: write:accounts."
  383. }
  384. end
  385. test "with proper permissions and invalid password", %{conn: conn} do
  386. conn =
  387. conn
  388. |> put_req_header("content-type", "multipart/form-data")
  389. |> post("/api/pleroma/change_password", %{
  390. "password" => "hi",
  391. "new_password" => "newpass",
  392. "new_password_confirmation" => "newpass"
  393. })
  394. assert json_response_and_validate_schema(conn, 200) == %{"error" => "Invalid password."}
  395. end
  396. test "with proper permissions, valid password and new password and confirmation not matching",
  397. %{
  398. conn: conn
  399. } do
  400. conn =
  401. conn
  402. |> put_req_header("content-type", "multipart/form-data")
  403. |> post("/api/pleroma/change_password", %{
  404. "password" => "test",
  405. "new_password" => "newpass",
  406. "new_password_confirmation" => "notnewpass"
  407. })
  408. assert json_response_and_validate_schema(conn, 200) == %{
  409. "error" => "New password does not match confirmation."
  410. }
  411. end
  412. test "with proper permissions, valid password and invalid new password", %{
  413. conn: conn
  414. } do
  415. conn =
  416. conn
  417. |> put_req_header("content-type", "multipart/form-data")
  418. |> post("/api/pleroma/change_password", %{
  419. password: "test",
  420. new_password: "",
  421. new_password_confirmation: ""
  422. })
  423. assert json_response_and_validate_schema(conn, 200) == %{
  424. "error" => "New password can't be blank."
  425. }
  426. end
  427. test "with proper permissions, valid password and matching new password and confirmation", %{
  428. conn: conn,
  429. user: user
  430. } do
  431. conn =
  432. conn
  433. |> put_req_header("content-type", "multipart/form-data")
  434. |> post(
  435. "/api/pleroma/change_password",
  436. %{
  437. password: "test",
  438. new_password: "newpass",
  439. new_password_confirmation: "newpass"
  440. }
  441. )
  442. assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
  443. fetched_user = User.get_cached_by_id(user.id)
  444. assert Pleroma.Password.Pbkdf2.verify_pass("newpass", fetched_user.password_hash) == true
  445. end
  446. end
  447. describe "POST /api/pleroma/delete_account" do
  448. setup do: oauth_access(["write:accounts"])
  449. test "without permissions", %{conn: conn} do
  450. conn =
  451. conn
  452. |> assign(:token, nil)
  453. |> post("/api/pleroma/delete_account")
  454. assert json_response_and_validate_schema(conn, 403) ==
  455. %{"error" => "Insufficient permissions: write:accounts."}
  456. end
  457. test "with proper permissions and wrong or missing password", %{conn: conn} do
  458. for params <- [%{"password" => "hi"}, %{}] do
  459. ret_conn =
  460. conn
  461. |> put_req_header("content-type", "application/json")
  462. |> post("/api/pleroma/delete_account", params)
  463. assert json_response_and_validate_schema(ret_conn, 200) == %{
  464. "error" => "Invalid password."
  465. }
  466. end
  467. end
  468. test "with proper permissions and valid password (URL query)", %{conn: conn, user: user} do
  469. conn =
  470. conn
  471. |> put_req_header("content-type", "application/json")
  472. |> post("/api/pleroma/delete_account?password=test")
  473. ObanHelpers.perform_all()
  474. assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
  475. user = User.get_by_id(user.id)
  476. refute user.is_active
  477. assert user.name == nil
  478. assert user.bio == ""
  479. assert user.password_hash == nil
  480. end
  481. test "with proper permissions and valid password (JSON body)", %{conn: conn, user: user} do
  482. conn =
  483. conn
  484. |> put_req_header("content-type", "application/json")
  485. |> post("/api/pleroma/delete_account", %{password: "test"})
  486. ObanHelpers.perform_all()
  487. assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
  488. user = User.get_by_id(user.id)
  489. refute user.is_active
  490. assert user.name == nil
  491. assert user.bio == ""
  492. assert user.password_hash == nil
  493. end
  494. end
  495. describe "POST /api/pleroma/move_account" do
  496. setup do: oauth_access(["write:accounts"])
  497. test "without permissions", %{conn: conn} do
  498. target_user = insert(:user)
  499. target_nick = target_user |> User.full_nickname()
  500. conn =
  501. conn
  502. |> assign(:token, nil)
  503. |> put_req_header("content-type", "multipart/form-data")
  504. |> post("/api/pleroma/move_account", %{
  505. "password" => "hi",
  506. "target_account" => target_nick
  507. })
  508. assert json_response_and_validate_schema(conn, 403) == %{
  509. "error" => "Insufficient permissions: write:accounts."
  510. }
  511. end
  512. test "with proper permissions and invalid password", %{conn: conn} do
  513. target_user = insert(:user)
  514. target_nick = target_user |> User.full_nickname()
  515. conn =
  516. conn
  517. |> put_req_header("content-type", "multipart/form-data")
  518. |> post("/api/pleroma/move_account", %{
  519. "password" => "hi",
  520. "target_account" => target_nick
  521. })
  522. assert json_response_and_validate_schema(conn, 200) == %{"error" => "Invalid password."}
  523. end
  524. test "with proper permissions, valid password and target account does not alias it",
  525. %{
  526. conn: conn
  527. } do
  528. target_user = insert(:user)
  529. target_nick = target_user |> User.full_nickname()
  530. conn =
  531. conn
  532. |> put_req_header("content-type", "multipart/form-data")
  533. |> post("/api/pleroma/move_account", %{
  534. "password" => "test",
  535. "target_account" => target_nick
  536. })
  537. assert json_response_and_validate_schema(conn, 200) == %{
  538. "error" => "Target account must have the origin in `alsoKnownAs`"
  539. }
  540. end
  541. test "with proper permissions, valid password and target account does not exist",
  542. %{
  543. conn: conn
  544. } do
  545. target_nick = "not_found@mastodon.social"
  546. conn =
  547. conn
  548. |> put_req_header("content-type", "multipart/form-data")
  549. |> post("/api/pleroma/move_account", %{
  550. "password" => "test",
  551. "target_account" => target_nick
  552. })
  553. assert json_response_and_validate_schema(conn, 404) == %{
  554. "error" => "Target account not found."
  555. }
  556. end
  557. test "with proper permissions, valid password, remote target account aliases it and local cache does not exist",
  558. %{} do
  559. user = insert(:user, ap_id: "https://lm.kazv.moe/users/testuser")
  560. %{user: _user, conn: conn} = oauth_access(["write:accounts"], user: user)
  561. target_nick = "mewmew@lm.kazv.moe"
  562. conn =
  563. conn
  564. |> put_req_header("content-type", "multipart/form-data")
  565. |> post("/api/pleroma/move_account", %{
  566. "password" => "test",
  567. "target_account" => target_nick
  568. })
  569. assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
  570. end
  571. test "with proper permissions, valid password, remote target account aliases it and local cache does not aliases it",
  572. %{} do
  573. user = insert(:user, ap_id: "https://lm.kazv.moe/users/testuser")
  574. %{user: _user, conn: conn} = oauth_access(["write:accounts"], user: user)
  575. target_user =
  576. insert(
  577. :user,
  578. ap_id: "https://lm.kazv.moe/users/mewmew",
  579. nickname: "mewmew@lm.kazv.moe",
  580. local: false
  581. )
  582. target_nick = target_user |> User.full_nickname()
  583. conn =
  584. conn
  585. |> put_req_header("content-type", "multipart/form-data")
  586. |> post("/api/pleroma/move_account", %{
  587. "password" => "test",
  588. "target_account" => target_nick
  589. })
  590. assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
  591. end
  592. test "with proper permissions, valid password, remote target account does not aliases it and local cache aliases it",
  593. %{
  594. user: user,
  595. conn: conn
  596. } do
  597. target_user =
  598. insert(
  599. :user,
  600. ap_id: "https://lm.kazv.moe/users/mewmew",
  601. nickname: "mewmew@lm.kazv.moe",
  602. local: false,
  603. also_known_as: [user.ap_id]
  604. )
  605. target_nick = target_user |> User.full_nickname()
  606. conn =
  607. conn
  608. |> put_req_header("content-type", "multipart/form-data")
  609. |> post("/api/pleroma/move_account", %{
  610. "password" => "test",
  611. "target_account" => target_nick
  612. })
  613. assert json_response_and_validate_schema(conn, 200) == %{
  614. "error" => "Target account must have the origin in `alsoKnownAs`"
  615. }
  616. end
  617. test "with proper permissions, valid password and target account aliases it", %{
  618. conn: conn,
  619. user: user
  620. } do
  621. target_user = insert(:user, also_known_as: [user.ap_id])
  622. target_nick = target_user |> User.full_nickname()
  623. follower = insert(:user)
  624. User.follow(follower, user)
  625. assert User.following?(follower, user)
  626. conn =
  627. conn
  628. |> put_req_header("content-type", "multipart/form-data")
  629. |> post(
  630. "/api/pleroma/move_account",
  631. %{
  632. password: "test",
  633. target_account: target_nick
  634. }
  635. )
  636. assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
  637. params = %{
  638. "op" => "move_following",
  639. "origin_id" => user.id,
  640. "target_id" => target_user.id
  641. }
  642. assert_enqueued(worker: Pleroma.Workers.BackgroundWorker, args: params)
  643. Pleroma.Workers.BackgroundWorker.perform(%Oban.Job{args: params})
  644. refute User.following?(follower, user)
  645. assert User.following?(follower, target_user)
  646. end
  647. test "prefix nickname by @ should work", %{
  648. conn: conn,
  649. user: user
  650. } do
  651. target_user = insert(:user, also_known_as: [user.ap_id])
  652. target_nick = target_user |> User.full_nickname()
  653. follower = insert(:user)
  654. User.follow(follower, user)
  655. assert User.following?(follower, user)
  656. conn =
  657. conn
  658. |> put_req_header("content-type", "multipart/form-data")
  659. |> post(
  660. "/api/pleroma/move_account",
  661. %{
  662. password: "test",
  663. target_account: "@" <> target_nick
  664. }
  665. )
  666. assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
  667. params = %{
  668. "op" => "move_following",
  669. "origin_id" => user.id,
  670. "target_id" => target_user.id
  671. }
  672. assert_enqueued(worker: Pleroma.Workers.BackgroundWorker, args: params)
  673. Pleroma.Workers.BackgroundWorker.perform(%Oban.Job{args: params})
  674. refute User.following?(follower, user)
  675. assert User.following?(follower, target_user)
  676. end
  677. end
  678. describe "GET /api/pleroma/aliases" do
  679. setup do: oauth_access(["read:accounts"])
  680. test "without permissions", %{conn: conn} do
  681. conn =
  682. conn
  683. |> assign(:token, nil)
  684. |> get("/api/pleroma/aliases")
  685. assert json_response_and_validate_schema(conn, 403) == %{
  686. "error" => "Insufficient permissions: read:accounts."
  687. }
  688. end
  689. test "with permissions", %{
  690. conn: conn
  691. } do
  692. assert %{"aliases" => []} =
  693. conn
  694. |> get("/api/pleroma/aliases")
  695. |> json_response_and_validate_schema(200)
  696. end
  697. test "with permissions and aliases", %{} do
  698. user = insert(:user)
  699. user2 = insert(:user)
  700. assert {:ok, user} = user |> User.add_alias(user2)
  701. %{user: _user, conn: conn} = oauth_access(["read:accounts"], user: user)
  702. assert %{"aliases" => aliases} =
  703. conn
  704. |> get("/api/pleroma/aliases")
  705. |> json_response_and_validate_schema(200)
  706. assert aliases == [user2 |> User.full_nickname()]
  707. end
  708. end
  709. describe "PUT /api/pleroma/aliases" do
  710. setup do: oauth_access(["write:accounts"])
  711. test "without permissions", %{conn: conn} do
  712. conn =
  713. conn
  714. |> assign(:token, nil)
  715. |> put_req_header("content-type", "application/json")
  716. |> put("/api/pleroma/aliases", %{alias: "none"})
  717. assert json_response_and_validate_schema(conn, 403) == %{
  718. "error" => "Insufficient permissions: write:accounts."
  719. }
  720. end
  721. test "with permissions, no alias param", %{
  722. conn: conn
  723. } do
  724. conn =
  725. conn
  726. |> put_req_header("content-type", "application/json")
  727. |> put("/api/pleroma/aliases", %{})
  728. assert %{"error" => "Missing field: alias."} = json_response_and_validate_schema(conn, 400)
  729. end
  730. test "with permissions, with alias param", %{
  731. conn: conn
  732. } do
  733. user2 = insert(:user)
  734. conn =
  735. conn
  736. |> put_req_header("content-type", "application/json")
  737. |> put("/api/pleroma/aliases", %{alias: user2 |> User.full_nickname()})
  738. assert json_response_and_validate_schema(conn, 200) == %{
  739. "status" => "success"
  740. }
  741. end
  742. end
  743. describe "DELETE /api/pleroma/aliases" do
  744. setup do
  745. alias_user = insert(:user)
  746. non_alias_user = insert(:user)
  747. user = insert(:user, also_known_as: [alias_user.ap_id])
  748. oauth_access(["write:accounts"], user: user)
  749. |> Map.put(:alias_user, alias_user)
  750. |> Map.put(:non_alias_user, non_alias_user)
  751. end
  752. test "without permissions", %{conn: conn} do
  753. conn =
  754. conn
  755. |> assign(:token, nil)
  756. |> put_req_header("content-type", "application/json")
  757. |> delete("/api/pleroma/aliases", %{alias: "none"})
  758. assert json_response_and_validate_schema(conn, 403) == %{
  759. "error" => "Insufficient permissions: write:accounts."
  760. }
  761. end
  762. test "with permissions, no alias param", %{conn: conn} do
  763. conn =
  764. conn
  765. |> put_req_header("content-type", "application/json")
  766. |> delete("/api/pleroma/aliases", %{})
  767. assert %{"error" => "Missing field: alias."} = json_response_and_validate_schema(conn, 400)
  768. end
  769. test "with permissions, account does not have such alias", %{
  770. conn: conn,
  771. non_alias_user: non_alias_user
  772. } do
  773. conn =
  774. conn
  775. |> put_req_header("content-type", "application/json")
  776. |> delete("/api/pleroma/aliases", %{alias: non_alias_user |> User.full_nickname()})
  777. assert %{"error" => "Account has no such alias."} =
  778. json_response_and_validate_schema(conn, 404)
  779. end
  780. test "with permissions, account does have such alias", %{
  781. conn: conn,
  782. alias_user: alias_user
  783. } do
  784. conn =
  785. conn
  786. |> put_req_header("content-type", "application/json")
  787. |> delete("/api/pleroma/aliases", %{alias: alias_user |> User.full_nickname()})
  788. assert %{"status" => "success"} = json_response_and_validate_schema(conn, 200)
  789. end
  790. end
  791. end