logo

pleroma

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

update_credentials_test.exs (28376B)


  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.MastodonAPI.UpdateCredentialsTest do
  5. alias Pleroma.Repo
  6. alias Pleroma.UnstubbedConfigMock, as: ConfigMock
  7. alias Pleroma.User
  8. use Pleroma.Web.ConnCase
  9. import Mock
  10. import Mox
  11. import Pleroma.Factory
  12. setup do
  13. ConfigMock
  14. |> stub_with(Pleroma.Test.StaticConfig)
  15. :ok
  16. end
  17. describe "updating credentials" do
  18. setup do: oauth_access(["write:accounts"])
  19. setup :request_content_type
  20. test "sets user settings in a generic way", %{conn: conn} do
  21. res_conn =
  22. patch(conn, "/api/v1/accounts/update_credentials", %{
  23. "pleroma_settings_store" => %{
  24. pleroma_fe: %{
  25. theme: "bla"
  26. }
  27. }
  28. })
  29. assert user_data = json_response_and_validate_schema(res_conn, 200)
  30. assert user_data["pleroma"]["settings_store"] == %{"pleroma_fe" => %{"theme" => "bla"}}
  31. user = Repo.get(User, user_data["id"])
  32. res_conn =
  33. conn
  34. |> assign(:user, user)
  35. |> patch("/api/v1/accounts/update_credentials", %{
  36. "pleroma_settings_store" => %{
  37. soapbox_fe: %{
  38. themeMode: "bla"
  39. }
  40. }
  41. })
  42. assert user_data = json_response_and_validate_schema(res_conn, 200)
  43. assert user_data["pleroma"]["settings_store"] ==
  44. %{
  45. "pleroma_fe" => %{"theme" => "bla"},
  46. "soapbox_fe" => %{"themeMode" => "bla"}
  47. }
  48. user = Repo.get(User, user_data["id"])
  49. clear_config([:instance, :federating], true)
  50. with_mock Pleroma.Web.Federator,
  51. publish: fn _activity -> :ok end do
  52. res_conn =
  53. conn
  54. |> assign(:user, user)
  55. |> patch("/api/v1/accounts/update_credentials", %{
  56. "pleroma_settings_store" => %{
  57. soapbox_fe: %{
  58. themeMode: "blub"
  59. }
  60. }
  61. })
  62. assert user_data = json_response_and_validate_schema(res_conn, 200)
  63. assert user_data["pleroma"]["settings_store"] ==
  64. %{
  65. "pleroma_fe" => %{"theme" => "bla"},
  66. "soapbox_fe" => %{"themeMode" => "blub"}
  67. }
  68. assert_called(Pleroma.Web.Federator.publish(:_))
  69. end
  70. end
  71. test "updates the user's bio", %{conn: conn} do
  72. user2 = insert(:user)
  73. raw_bio = "I drink #cofe with @#{user2.nickname}\n\nsuya.."
  74. conn = patch(conn, "/api/v1/accounts/update_credentials", %{"note" => raw_bio})
  75. assert user_data = json_response_and_validate_schema(conn, 200)
  76. assert user_data["note"] ==
  77. ~s(I drink <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe">#cofe</a> with <span class="h-card"><a class="u-url mention" data-user="#{user2.id}" href="#{user2.ap_id}" rel="ugc">@<span>#{user2.nickname}</span></a></span><br/><br/>suya..)
  78. assert user_data["source"]["note"] == raw_bio
  79. user = Repo.get(User, user_data["id"])
  80. assert user.raw_bio == raw_bio
  81. end
  82. test "updating bio honours bio limit", %{conn: conn} do
  83. bio_limit = Config.get([:instance, :user_bio_length], 5000)
  84. raw_bio = String.duplicate(".", bio_limit + 1)
  85. conn = patch(conn, "/api/v1/accounts/update_credentials", %{"note" => raw_bio})
  86. assert %{"error" => "Bio is too long"} = json_response_and_validate_schema(conn, 413)
  87. end
  88. test "updating name honours name limit", %{conn: conn} do
  89. name_limit = Config.get([:instance, :user_name_length], 100)
  90. name = String.duplicate(".", name_limit + 1)
  91. conn = patch(conn, "/api/v1/accounts/update_credentials", %{"display_name" => name})
  92. assert %{"error" => "Name is too long"} = json_response_and_validate_schema(conn, 413)
  93. end
  94. test "when both name and bio exceeds the limit, display name error", %{conn: conn} do
  95. name_limit = Config.get([:instance, :user_name_length], 100)
  96. bio_limit = Config.get([:instance, :user_bio_length], 5000)
  97. name = String.duplicate(".", name_limit + 1)
  98. raw_bio = String.duplicate(".", bio_limit + 1)
  99. conn =
  100. patch(conn, "/api/v1/accounts/update_credentials", %{
  101. "display_name" => name,
  102. "note" => raw_bio
  103. })
  104. assert %{"error" => "Name is too long"} = json_response_and_validate_schema(conn, 413)
  105. end
  106. test "updates the user's locking status", %{conn: conn} do
  107. conn = patch(conn, "/api/v1/accounts/update_credentials", %{locked: "true"})
  108. assert user_data = json_response_and_validate_schema(conn, 200)
  109. assert user_data["locked"] == true
  110. end
  111. test "updates the user's chat acceptance status", %{conn: conn} do
  112. conn = patch(conn, "/api/v1/accounts/update_credentials", %{accepts_chat_messages: "false"})
  113. assert user_data = json_response_and_validate_schema(conn, 200)
  114. assert user_data["pleroma"]["accepts_chat_messages"] == false
  115. end
  116. test "updates the user's allow_following_move", %{user: user, conn: conn} do
  117. assert user.allow_following_move == true
  118. conn = patch(conn, "/api/v1/accounts/update_credentials", %{allow_following_move: "false"})
  119. assert refresh_record(user).allow_following_move == false
  120. assert user_data = json_response_and_validate_schema(conn, 200)
  121. assert user_data["pleroma"]["allow_following_move"] == false
  122. end
  123. test "updates the user's default scope", %{conn: conn} do
  124. conn = patch(conn, "/api/v1/accounts/update_credentials", %{default_scope: "unlisted"})
  125. assert user_data = json_response_and_validate_schema(conn, 200)
  126. assert user_data["source"]["privacy"] == "unlisted"
  127. end
  128. test "updates the user's privacy", %{conn: conn} do
  129. conn = patch(conn, "/api/v1/accounts/update_credentials", %{source: %{privacy: "unlisted"}})
  130. assert user_data = json_response_and_validate_schema(conn, 200)
  131. assert user_data["source"]["privacy"] == "unlisted"
  132. end
  133. test "updates the user's hide_followers status", %{conn: conn} do
  134. conn = patch(conn, "/api/v1/accounts/update_credentials", %{hide_followers: "true"})
  135. assert user_data = json_response_and_validate_schema(conn, 200)
  136. assert user_data["pleroma"]["hide_followers"] == true
  137. end
  138. test "updates the user's discoverable status", %{conn: conn} do
  139. assert %{"source" => %{"pleroma" => %{"discoverable" => true}}} =
  140. conn
  141. |> patch("/api/v1/accounts/update_credentials", %{discoverable: "true"})
  142. |> json_response_and_validate_schema(:ok)
  143. assert %{"source" => %{"pleroma" => %{"discoverable" => false}}} =
  144. conn
  145. |> patch("/api/v1/accounts/update_credentials", %{discoverable: "false"})
  146. |> json_response_and_validate_schema(:ok)
  147. end
  148. test "updates the user's hide_followers_count and hide_follows_count", %{conn: conn} do
  149. conn =
  150. patch(conn, "/api/v1/accounts/update_credentials", %{
  151. hide_followers_count: "true",
  152. hide_follows_count: "true"
  153. })
  154. assert user_data = json_response_and_validate_schema(conn, 200)
  155. assert user_data["pleroma"]["hide_followers_count"] == true
  156. assert user_data["pleroma"]["hide_follows_count"] == true
  157. end
  158. test "updates the user's skip_thread_containment option", %{user: user, conn: conn} do
  159. response =
  160. conn
  161. |> patch("/api/v1/accounts/update_credentials", %{skip_thread_containment: "true"})
  162. |> json_response_and_validate_schema(200)
  163. assert response["pleroma"]["skip_thread_containment"] == true
  164. assert refresh_record(user).skip_thread_containment
  165. end
  166. test "updates the user's hide_follows status", %{conn: conn} do
  167. conn = patch(conn, "/api/v1/accounts/update_credentials", %{hide_follows: "true"})
  168. assert user_data = json_response_and_validate_schema(conn, 200)
  169. assert user_data["pleroma"]["hide_follows"] == true
  170. end
  171. test "updates the user's hide_favorites status", %{conn: conn} do
  172. conn = patch(conn, "/api/v1/accounts/update_credentials", %{hide_favorites: "true"})
  173. assert user_data = json_response_and_validate_schema(conn, 200)
  174. assert user_data["pleroma"]["hide_favorites"] == true
  175. end
  176. test "updates the user's show_role status", %{conn: conn} do
  177. conn = patch(conn, "/api/v1/accounts/update_credentials", %{show_role: "false"})
  178. assert user_data = json_response_and_validate_schema(conn, 200)
  179. assert user_data["source"]["pleroma"]["show_role"] == false
  180. end
  181. test "updates the user's no_rich_text status", %{conn: conn} do
  182. conn = patch(conn, "/api/v1/accounts/update_credentials", %{no_rich_text: "true"})
  183. assert user_data = json_response_and_validate_schema(conn, 200)
  184. assert user_data["source"]["pleroma"]["no_rich_text"] == true
  185. end
  186. test "updates the user's name", %{conn: conn} do
  187. conn =
  188. patch(conn, "/api/v1/accounts/update_credentials", %{"display_name" => "markorepairs"})
  189. assert user_data = json_response_and_validate_schema(conn, 200)
  190. assert user_data["display_name"] == "markorepairs"
  191. update_activity = Repo.one(Pleroma.Activity)
  192. assert update_activity.data["type"] == "Update"
  193. assert update_activity.data["object"]["name"] == "markorepairs"
  194. end
  195. test "updates the user's AKAs", %{conn: conn} do
  196. conn =
  197. patch(conn, "/api/v1/accounts/update_credentials", %{
  198. "also_known_as" => ["https://mushroom.kingdom/users/mario"]
  199. })
  200. assert user_data = json_response_and_validate_schema(conn, 200)
  201. assert user_data["pleroma"]["also_known_as"] == ["https://mushroom.kingdom/users/mario"]
  202. end
  203. test "doesn't update non-url akas", %{conn: conn} do
  204. conn =
  205. patch(conn, "/api/v1/accounts/update_credentials", %{
  206. "also_known_as" => ["aReallyCoolGuy"]
  207. })
  208. assert json_response_and_validate_schema(conn, 403)
  209. end
  210. test "updates the user's avatar", %{user: user, conn: conn} do
  211. new_avatar = %Plug.Upload{
  212. content_type: "image/jpeg",
  213. path: Path.absname("test/fixtures/image.jpg"),
  214. filename: "an_image.jpg"
  215. }
  216. assert user.avatar == %{}
  217. res = patch(conn, "/api/v1/accounts/update_credentials", %{"avatar" => new_avatar})
  218. assert user_response = json_response_and_validate_schema(res, 200)
  219. assert user_response["avatar"] != User.avatar_url(user)
  220. user = User.get_by_id(user.id)
  221. refute user.avatar == %{}
  222. # Also resets it
  223. _res = patch(conn, "/api/v1/accounts/update_credentials", %{"avatar" => ""})
  224. user = User.get_by_id(user.id)
  225. assert user.avatar == nil
  226. end
  227. test "updates the user's avatar, upload_limit, returns a HTTP 413", %{conn: conn, user: user} do
  228. upload_limit = Config.get([:instance, :upload_limit]) * 8 + 8
  229. assert :ok ==
  230. File.write(Path.absname("test/tmp/large_binary.data"), <<0::size(upload_limit)>>)
  231. new_avatar_oversized = %Plug.Upload{
  232. content_type: nil,
  233. path: Path.absname("test/tmp/large_binary.data"),
  234. filename: "large_binary.data"
  235. }
  236. assert user.avatar == %{}
  237. res =
  238. patch(conn, "/api/v1/accounts/update_credentials", %{"avatar" => new_avatar_oversized})
  239. assert user_response = json_response_and_validate_schema(res, 413)
  240. assert user_response["avatar"] != User.avatar_url(user)
  241. user = User.get_by_id(user.id)
  242. assert user.avatar == %{}
  243. clear_config([:instance, :upload_limit], upload_limit)
  244. assert :ok == File.rm(Path.absname("test/tmp/large_binary.data"))
  245. end
  246. test "updates the user's banner", %{user: user, conn: conn} do
  247. new_header = %Plug.Upload{
  248. content_type: "image/jpeg",
  249. path: Path.absname("test/fixtures/image.jpg"),
  250. filename: "an_image.jpg"
  251. }
  252. res = patch(conn, "/api/v1/accounts/update_credentials", %{"header" => new_header})
  253. assert user_response = json_response_and_validate_schema(res, 200)
  254. assert user_response["header"] != User.banner_url(user)
  255. # Also resets it
  256. _res = patch(conn, "/api/v1/accounts/update_credentials", %{"header" => ""})
  257. user = User.get_by_id(user.id)
  258. assert user.banner == nil
  259. end
  260. test "updates the user's banner, upload_limit, returns a HTTP 413", %{conn: conn, user: user} do
  261. upload_limit = Config.get([:instance, :upload_limit]) * 8 + 8
  262. assert :ok ==
  263. File.write(Path.absname("test/tmp/large_binary.data"), <<0::size(upload_limit)>>)
  264. new_header_oversized = %Plug.Upload{
  265. content_type: nil,
  266. path: Path.absname("test/tmp/large_binary.data"),
  267. filename: "large_binary.data"
  268. }
  269. res =
  270. patch(conn, "/api/v1/accounts/update_credentials", %{"header" => new_header_oversized})
  271. assert user_response = json_response_and_validate_schema(res, 413)
  272. assert user_response["header"] != User.banner_url(user)
  273. user = User.get_by_id(user.id)
  274. assert user.banner == %{}
  275. clear_config([:instance, :upload_limit], upload_limit)
  276. assert :ok == File.rm(Path.absname("test/tmp/large_binary.data"))
  277. end
  278. test "updates the user's background", %{conn: conn, user: user} do
  279. new_header = %Plug.Upload{
  280. content_type: "image/jpeg",
  281. path: Path.absname("test/fixtures/image.jpg"),
  282. filename: "an_image.jpg"
  283. }
  284. res =
  285. patch(conn, "/api/v1/accounts/update_credentials", %{
  286. "pleroma_background_image" => new_header
  287. })
  288. assert user_response = json_response_and_validate_schema(res, 200)
  289. assert user_response["pleroma"]["background_image"]
  290. #
  291. # Also resets it
  292. _res =
  293. patch(conn, "/api/v1/accounts/update_credentials", %{"pleroma_background_image" => ""})
  294. user = User.get_by_id(user.id)
  295. assert user.background == nil
  296. end
  297. test "updates the user's background, upload_limit, returns a HTTP 413", %{
  298. conn: conn,
  299. user: user
  300. } do
  301. upload_limit = Config.get([:instance, :upload_limit]) * 8 + 8
  302. assert :ok ==
  303. File.write(Path.absname("test/tmp/large_binary.data"), <<0::size(upload_limit)>>)
  304. new_background_oversized = %Plug.Upload{
  305. content_type: nil,
  306. path: Path.absname("test/tmp/large_binary.data"),
  307. filename: "large_binary.data"
  308. }
  309. res =
  310. patch(conn, "/api/v1/accounts/update_credentials", %{
  311. "pleroma_background_image" => new_background_oversized
  312. })
  313. assert %{"error" => "File is too large"} == json_response_and_validate_schema(res, 413)
  314. user = Repo.get(User, user.id)
  315. assert user.background == %{}
  316. clear_config([:instance, :upload_limit], upload_limit)
  317. assert :ok == File.rm(Path.absname("test/tmp/large_binary.data"))
  318. end
  319. test "adds avatar description with a new avatar", %{user: user, conn: conn} do
  320. new_avatar = %Plug.Upload{
  321. content_type: "image/jpeg",
  322. path: Path.absname("test/fixtures/image.jpg"),
  323. filename: "an_image.jpg"
  324. }
  325. res =
  326. patch(conn, "/api/v1/accounts/update_credentials", %{
  327. "avatar" => new_avatar,
  328. "avatar_description" => "me and pleroma tan"
  329. })
  330. assert json_response_and_validate_schema(res, 200)
  331. user = User.get_by_id(user.id)
  332. assert user.avatar["name"] == "me and pleroma tan"
  333. end
  334. test "adds avatar description to existing avatar", %{user: user, conn: conn} do
  335. new_avatar = %Plug.Upload{
  336. content_type: "image/jpeg",
  337. path: Path.absname("test/fixtures/image.jpg"),
  338. filename: "an_image.jpg"
  339. }
  340. assert user.avatar == %{}
  341. conn
  342. |> patch("/api/v1/accounts/update_credentials", %{"avatar" => new_avatar})
  343. assert conn
  344. |> assign(:user, User.get_by_id(user.id))
  345. |> patch("/api/v1/accounts/update_credentials", %{
  346. "avatar_description" => "me and pleroma tan"
  347. })
  348. |> json_response_and_validate_schema(200)
  349. user = User.get_by_id(user.id)
  350. assert user.avatar["name"] == "me and pleroma tan"
  351. end
  352. test "limit", %{user: user, conn: conn} do
  353. new_header = %Plug.Upload{
  354. content_type: "image/jpeg",
  355. path: Path.absname("test/fixtures/image.jpg"),
  356. filename: "an_image.jpg"
  357. }
  358. assert user.banner == %{}
  359. conn
  360. |> patch("/api/v1/accounts/update_credentials", %{"header" => new_header})
  361. description_limit = Config.get([:instance, :description_limit], 100)
  362. description = String.duplicate(".", description_limit + 1)
  363. conn =
  364. conn
  365. |> assign(:user, User.get_by_id(user.id))
  366. |> patch("/api/v1/accounts/update_credentials", %{
  367. "header_description" => description
  368. })
  369. assert %{"error" => "Banner description is too long"} =
  370. json_response_and_validate_schema(conn, 413)
  371. end
  372. test "Strip / from upload files", %{user: user, conn: conn} do
  373. new_image = %Plug.Upload{
  374. content_type: "image/jpeg",
  375. path: Path.absname("test/fixtures/image.jpg"),
  376. filename: "../../../../nested/an_image.jpg"
  377. }
  378. assert user.avatar == %{}
  379. res =
  380. patch(conn, "/api/v1/accounts/update_credentials", %{
  381. "avatar" => new_image,
  382. "header" => new_image,
  383. "pleroma_background_image" => new_image
  384. })
  385. assert user_response = json_response_and_validate_schema(res, 200)
  386. assert user_response["avatar"]
  387. assert user_response["header"]
  388. assert user_response["pleroma"]["background_image"]
  389. refute Regex.match?(~r"/nested/", user_response["avatar"])
  390. refute Regex.match?(~r"/nested/", user_response["header"])
  391. refute Regex.match?(~r"/nested/", user_response["pleroma"]["background_image"])
  392. user = User.get_by_id(user.id)
  393. refute user.avatar == %{}
  394. end
  395. test "requires 'write:accounts' permission" do
  396. token1 = insert(:oauth_token, scopes: ["read"])
  397. token2 = insert(:oauth_token, scopes: ["write", "follow"])
  398. for token <- [token1, token2] do
  399. conn =
  400. build_conn()
  401. |> put_req_header("content-type", "multipart/form-data")
  402. |> put_req_header("authorization", "Bearer #{token.token}")
  403. |> patch("/api/v1/accounts/update_credentials", %{})
  404. if token == token1 do
  405. assert %{"error" => "Insufficient permissions: write:accounts."} ==
  406. json_response_and_validate_schema(conn, 403)
  407. else
  408. assert json_response_and_validate_schema(conn, 200)
  409. end
  410. end
  411. end
  412. test "updates profile emojos", %{user: user, conn: conn} do
  413. note = "*sips :blank:*"
  414. name = "I am :firefox:"
  415. ret_conn =
  416. patch(conn, "/api/v1/accounts/update_credentials", %{
  417. "note" => note,
  418. "display_name" => name
  419. })
  420. assert json_response_and_validate_schema(ret_conn, 200)
  421. conn = get(conn, "/api/v1/accounts/#{user.id}")
  422. assert user_data = json_response_and_validate_schema(conn, 200)
  423. assert user_data["note"] == note
  424. assert user_data["display_name"] == name
  425. assert [%{"shortcode" => "blank"}, %{"shortcode" => "firefox"}] = user_data["emojis"]
  426. end
  427. test "update fields", %{conn: conn} do
  428. fields = [
  429. %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "<script>bar</script>"},
  430. %{"name" => "link.io", "value" => "http://cofe.io"}
  431. ]
  432. account_data =
  433. conn
  434. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  435. |> json_response_and_validate_schema(200)
  436. assert account_data["fields"] == [
  437. %{
  438. "name" => "<a href=\"http://google.com\">foo</a>",
  439. "value" => "bar",
  440. "verified_at" => nil
  441. },
  442. %{
  443. "name" => "link.io",
  444. "value" => ~S(<a href="http://cofe.io" rel="ugc">http://cofe.io</a>)
  445. "verified_at" => nil
  446. }
  447. ]
  448. assert account_data["source"]["fields"] == [
  449. %{
  450. "name" => "<a href=\"http://google.com\">foo</a>",
  451. "value" => "<script>bar</script>"
  452. },
  453. %{"name" => "link.io", "value" => "http://cofe.io"}
  454. ]
  455. end
  456. test "updates birth date", %{conn: conn} do
  457. res =
  458. patch(conn, "/api/v1/accounts/update_credentials", %{
  459. "birthday" => "2001-02-12"
  460. })
  461. assert user_data = json_response_and_validate_schema(res, 200)
  462. assert user_data["pleroma"]["birthday"] == "2001-02-12"
  463. end
  464. test "updates the user's show_birthday status", %{conn: conn} do
  465. res =
  466. patch(conn, "/api/v1/accounts/update_credentials", %{
  467. "show_birthday" => true
  468. })
  469. assert user_data = json_response_and_validate_schema(res, 200)
  470. assert user_data["source"]["pleroma"]["show_birthday"] == true
  471. end
  472. test "unsets birth date", %{conn: conn} do
  473. patch(conn, "/api/v1/accounts/update_credentials", %{
  474. "birthday" => "2001-02-12"
  475. })
  476. res =
  477. patch(conn, "/api/v1/accounts/update_credentials", %{
  478. "birthday" => ""
  479. })
  480. assert user_data = json_response_and_validate_schema(res, 200)
  481. assert user_data["pleroma"]["birthday"] == nil
  482. end
  483. test "emojis in fields labels", %{conn: conn} do
  484. fields = [
  485. %{"name" => ":firefox:", "value" => "is best 2hu"},
  486. %{"name" => "they wins", "value" => ":blank:"}
  487. ]
  488. account_data =
  489. conn
  490. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  491. |> json_response_and_validate_schema(200)
  492. assert account_data["fields"] == [
  493. %{"name" => ":firefox:", "value" => "is best 2hu", "verified_at" => nil},
  494. %{"name" => "they wins", "value" => ":blank:", "verified_at" => nil}
  495. ]
  496. assert account_data["source"]["fields"] == [
  497. %{"name" => ":firefox:", "value" => "is best 2hu"},
  498. %{"name" => "they wins", "value" => ":blank:"}
  499. ]
  500. assert [%{"shortcode" => "blank"}, %{"shortcode" => "firefox"}] = account_data["emojis"]
  501. end
  502. test "update fields via x-www-form-urlencoded", %{conn: conn} do
  503. fields =
  504. [
  505. "fields_attributes[1][name]=link",
  506. "fields_attributes[1][value]=http://cofe.io",
  507. "fields_attributes[0][name]=foo",
  508. "fields_attributes[0][value]=bar"
  509. ]
  510. |> Enum.join("&")
  511. account =
  512. conn
  513. |> put_req_header("content-type", "application/x-www-form-urlencoded")
  514. |> patch("/api/v1/accounts/update_credentials", fields)
  515. |> json_response_and_validate_schema(200)
  516. assert account["fields"] == [
  517. %{"name" => "foo", "value" => "bar", "verified_at" => nil},
  518. %{
  519. "name" => "link",
  520. "value" => ~S(<a href="http://cofe.io" rel="ugc">http://cofe.io</a>),
  521. "verified_at" => nil
  522. }
  523. ]
  524. assert account["source"]["fields"] == [
  525. %{"name" => "foo", "value" => "bar"},
  526. %{"name" => "link", "value" => "http://cofe.io"}
  527. ]
  528. end
  529. test "update fields with empty name", %{conn: conn} do
  530. fields = [
  531. %{"name" => "foo", "value" => ""},
  532. %{"name" => "", "value" => "bar"}
  533. ]
  534. account =
  535. conn
  536. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  537. |> json_response_and_validate_schema(200)
  538. assert account["fields"] == [
  539. %{"name" => "foo", "value" => "", "verified_at" => nil}
  540. ]
  541. end
  542. test "update fields when invalid request", %{conn: conn} do
  543. name_limit = Pleroma.Config.get([:instance, :account_field_name_length])
  544. value_limit = Pleroma.Config.get([:instance, :account_field_value_length])
  545. long_name = Enum.map(0..name_limit, fn _ -> "x" end) |> Enum.join()
  546. long_value = Enum.map(0..value_limit, fn _ -> "x" end) |> Enum.join()
  547. fields = [%{"name" => "foo", "value" => long_value}]
  548. assert %{"error" => "One or more field entries are too long"} ==
  549. conn
  550. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  551. |> json_response_and_validate_schema(413)
  552. fields = [%{"name" => long_name, "value" => "bar"}]
  553. assert %{"error" => "One or more field entries are too long"} ==
  554. conn
  555. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  556. |> json_response_and_validate_schema(413)
  557. clear_config([:instance, :max_account_fields], 1)
  558. fields = [
  559. %{"name" => "foo", "value" => "bar"},
  560. %{"name" => "link", "value" => "http://cofe.io"}
  561. ]
  562. assert %{"error" => "Too many field entries"} ==
  563. conn
  564. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  565. |> json_response_and_validate_schema(413)
  566. end
  567. end
  568. describe "Mark account as bot" do
  569. setup do: oauth_access(["write:accounts"])
  570. setup :request_content_type
  571. test "changing actor_type to Service makes account a bot", %{conn: conn} do
  572. account =
  573. conn
  574. |> patch("/api/v1/accounts/update_credentials", %{actor_type: "Service"})
  575. |> json_response_and_validate_schema(200)
  576. assert account["bot"]
  577. assert account["source"]["pleroma"]["actor_type"] == "Service"
  578. end
  579. test "changing actor_type to Person makes account a human", %{conn: conn} do
  580. account =
  581. conn
  582. |> patch("/api/v1/accounts/update_credentials", %{actor_type: "Person"})
  583. |> json_response_and_validate_schema(200)
  584. refute account["bot"]
  585. assert account["source"]["pleroma"]["actor_type"] == "Person"
  586. end
  587. test "changing actor_type to Application causes error", %{conn: conn} do
  588. response =
  589. conn
  590. |> patch("/api/v1/accounts/update_credentials", %{actor_type: "Application"})
  591. |> json_response_and_validate_schema(403)
  592. assert %{"error" => "Invalid request"} == response
  593. end
  594. test "changing bot field to true changes actor_type to Service", %{conn: conn} do
  595. account =
  596. conn
  597. |> patch("/api/v1/accounts/update_credentials", %{bot: "true"})
  598. |> json_response_and_validate_schema(200)
  599. assert account["bot"]
  600. assert account["source"]["pleroma"]["actor_type"] == "Service"
  601. end
  602. test "changing bot field to false changes actor_type to Person", %{conn: conn} do
  603. account =
  604. conn
  605. |> patch("/api/v1/accounts/update_credentials", %{bot: "false"})
  606. |> json_response_and_validate_schema(200)
  607. refute account["bot"]
  608. assert account["source"]["pleroma"]["actor_type"] == "Person"
  609. end
  610. test "actor_type field has a higher priority than bot", %{conn: conn} do
  611. account =
  612. conn
  613. |> patch("/api/v1/accounts/update_credentials", %{
  614. actor_type: "Person",
  615. bot: "true"
  616. })
  617. |> json_response_and_validate_schema(200)
  618. refute account["bot"]
  619. assert account["source"]["pleroma"]["actor_type"] == "Person"
  620. end
  621. end
  622. describe "Mark account as group" do
  623. setup do: oauth_access(["write:accounts"])
  624. setup :request_content_type
  625. test "changing actor_type to Group makes account a Group and enables bot indicator for backward compatibility",
  626. %{conn: conn} do
  627. account =
  628. conn
  629. |> patch("/api/v1/accounts/update_credentials", %{actor_type: "Group"})
  630. |> json_response_and_validate_schema(200)
  631. assert account["bot"]
  632. assert account["source"]["pleroma"]["actor_type"] == "Group"
  633. end
  634. end
  635. end