logo

pleroma

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

update_credentials_test.exs (25983B)


  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 "Strip / from upload files", %{user: user, conn: conn} do
  320. new_image = %Plug.Upload{
  321. content_type: "image/jpeg",
  322. path: Path.absname("test/fixtures/image.jpg"),
  323. filename: "../../../../nested/an_image.jpg"
  324. }
  325. assert user.avatar == %{}
  326. res =
  327. patch(conn, "/api/v1/accounts/update_credentials", %{
  328. "avatar" => new_image,
  329. "header" => new_image,
  330. "pleroma_background_image" => new_image
  331. })
  332. assert user_response = json_response_and_validate_schema(res, 200)
  333. assert user_response["avatar"]
  334. assert user_response["header"]
  335. assert user_response["pleroma"]["background_image"]
  336. refute Regex.match?(~r"/nested/", user_response["avatar"])
  337. refute Regex.match?(~r"/nested/", user_response["header"])
  338. refute Regex.match?(~r"/nested/", user_response["pleroma"]["background_image"])
  339. user = User.get_by_id(user.id)
  340. refute user.avatar == %{}
  341. end
  342. test "requires 'write:accounts' permission" do
  343. token1 = insert(:oauth_token, scopes: ["read"])
  344. token2 = insert(:oauth_token, scopes: ["write", "follow"])
  345. for token <- [token1, token2] do
  346. conn =
  347. build_conn()
  348. |> put_req_header("content-type", "multipart/form-data")
  349. |> put_req_header("authorization", "Bearer #{token.token}")
  350. |> patch("/api/v1/accounts/update_credentials", %{})
  351. if token == token1 do
  352. assert %{"error" => "Insufficient permissions: write:accounts."} ==
  353. json_response_and_validate_schema(conn, 403)
  354. else
  355. assert json_response_and_validate_schema(conn, 200)
  356. end
  357. end
  358. end
  359. test "updates profile emojos", %{user: user, conn: conn} do
  360. note = "*sips :blank:*"
  361. name = "I am :firefox:"
  362. ret_conn =
  363. patch(conn, "/api/v1/accounts/update_credentials", %{
  364. "note" => note,
  365. "display_name" => name
  366. })
  367. assert json_response_and_validate_schema(ret_conn, 200)
  368. conn = get(conn, "/api/v1/accounts/#{user.id}")
  369. assert user_data = json_response_and_validate_schema(conn, 200)
  370. assert user_data["note"] == note
  371. assert user_data["display_name"] == name
  372. assert [%{"shortcode" => "blank"}, %{"shortcode" => "firefox"}] = user_data["emojis"]
  373. end
  374. test "update fields", %{conn: conn} do
  375. fields = [
  376. %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "<script>bar</script>"},
  377. %{"name" => "link.io", "value" => "http://cofe.io"}
  378. ]
  379. account_data =
  380. conn
  381. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  382. |> json_response_and_validate_schema(200)
  383. assert account_data["fields"] == [
  384. %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "bar"},
  385. %{
  386. "name" => "link.io",
  387. "value" => ~S(<a href="http://cofe.io" rel="ugc">http://cofe.io</a>)
  388. }
  389. ]
  390. assert account_data["source"]["fields"] == [
  391. %{
  392. "name" => "<a href=\"http://google.com\">foo</a>",
  393. "value" => "<script>bar</script>"
  394. },
  395. %{"name" => "link.io", "value" => "http://cofe.io"}
  396. ]
  397. end
  398. test "updates birth date", %{conn: conn} do
  399. res =
  400. patch(conn, "/api/v1/accounts/update_credentials", %{
  401. "birthday" => "2001-02-12"
  402. })
  403. assert user_data = json_response_and_validate_schema(res, 200)
  404. assert user_data["pleroma"]["birthday"] == "2001-02-12"
  405. end
  406. test "updates the user's show_birthday status", %{conn: conn} do
  407. res =
  408. patch(conn, "/api/v1/accounts/update_credentials", %{
  409. "show_birthday" => true
  410. })
  411. assert user_data = json_response_and_validate_schema(res, 200)
  412. assert user_data["source"]["pleroma"]["show_birthday"] == true
  413. end
  414. test "unsets birth date", %{conn: conn} do
  415. patch(conn, "/api/v1/accounts/update_credentials", %{
  416. "birthday" => "2001-02-12"
  417. })
  418. res =
  419. patch(conn, "/api/v1/accounts/update_credentials", %{
  420. "birthday" => ""
  421. })
  422. assert user_data = json_response_and_validate_schema(res, 200)
  423. assert user_data["pleroma"]["birthday"] == nil
  424. end
  425. test "emojis in fields labels", %{conn: conn} do
  426. fields = [
  427. %{"name" => ":firefox:", "value" => "is best 2hu"},
  428. %{"name" => "they wins", "value" => ":blank:"}
  429. ]
  430. account_data =
  431. conn
  432. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  433. |> json_response_and_validate_schema(200)
  434. assert account_data["fields"] == [
  435. %{"name" => ":firefox:", "value" => "is best 2hu"},
  436. %{"name" => "they wins", "value" => ":blank:"}
  437. ]
  438. assert account_data["source"]["fields"] == [
  439. %{"name" => ":firefox:", "value" => "is best 2hu"},
  440. %{"name" => "they wins", "value" => ":blank:"}
  441. ]
  442. assert [%{"shortcode" => "blank"}, %{"shortcode" => "firefox"}] = account_data["emojis"]
  443. end
  444. test "update fields via x-www-form-urlencoded", %{conn: conn} do
  445. fields =
  446. [
  447. "fields_attributes[1][name]=link",
  448. "fields_attributes[1][value]=http://cofe.io",
  449. "fields_attributes[0][name]=foo",
  450. "fields_attributes[0][value]=bar"
  451. ]
  452. |> Enum.join("&")
  453. account =
  454. conn
  455. |> put_req_header("content-type", "application/x-www-form-urlencoded")
  456. |> patch("/api/v1/accounts/update_credentials", fields)
  457. |> json_response_and_validate_schema(200)
  458. assert account["fields"] == [
  459. %{"name" => "foo", "value" => "bar"},
  460. %{
  461. "name" => "link",
  462. "value" => ~S(<a href="http://cofe.io" rel="ugc">http://cofe.io</a>)
  463. }
  464. ]
  465. assert account["source"]["fields"] == [
  466. %{"name" => "foo", "value" => "bar"},
  467. %{"name" => "link", "value" => "http://cofe.io"}
  468. ]
  469. end
  470. test "update fields with empty name", %{conn: conn} do
  471. fields = [
  472. %{"name" => "foo", "value" => ""},
  473. %{"name" => "", "value" => "bar"}
  474. ]
  475. account =
  476. conn
  477. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  478. |> json_response_and_validate_schema(200)
  479. assert account["fields"] == [
  480. %{"name" => "foo", "value" => ""}
  481. ]
  482. end
  483. test "update fields when invalid request", %{conn: conn} do
  484. name_limit = Pleroma.Config.get([:instance, :account_field_name_length])
  485. value_limit = Pleroma.Config.get([:instance, :account_field_value_length])
  486. long_name = Enum.map(0..name_limit, fn _ -> "x" end) |> Enum.join()
  487. long_value = Enum.map(0..value_limit, fn _ -> "x" end) |> Enum.join()
  488. fields = [%{"name" => "foo", "value" => long_value}]
  489. assert %{"error" => "One or more field entries are too long"} ==
  490. conn
  491. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  492. |> json_response_and_validate_schema(413)
  493. fields = [%{"name" => long_name, "value" => "bar"}]
  494. assert %{"error" => "One or more field entries are too long"} ==
  495. conn
  496. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  497. |> json_response_and_validate_schema(413)
  498. clear_config([:instance, :max_account_fields], 1)
  499. fields = [
  500. %{"name" => "foo", "value" => "bar"},
  501. %{"name" => "link", "value" => "http://cofe.io"}
  502. ]
  503. assert %{"error" => "Too many field entries"} ==
  504. conn
  505. |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields})
  506. |> json_response_and_validate_schema(413)
  507. end
  508. end
  509. describe "Mark account as bot" do
  510. setup do: oauth_access(["write:accounts"])
  511. setup :request_content_type
  512. test "changing actor_type to Service makes account a bot", %{conn: conn} do
  513. account =
  514. conn
  515. |> patch("/api/v1/accounts/update_credentials", %{actor_type: "Service"})
  516. |> json_response_and_validate_schema(200)
  517. assert account["bot"]
  518. assert account["source"]["pleroma"]["actor_type"] == "Service"
  519. end
  520. test "changing actor_type to Person makes account a human", %{conn: conn} do
  521. account =
  522. conn
  523. |> patch("/api/v1/accounts/update_credentials", %{actor_type: "Person"})
  524. |> json_response_and_validate_schema(200)
  525. refute account["bot"]
  526. assert account["source"]["pleroma"]["actor_type"] == "Person"
  527. end
  528. test "changing actor_type to Application causes error", %{conn: conn} do
  529. response =
  530. conn
  531. |> patch("/api/v1/accounts/update_credentials", %{actor_type: "Application"})
  532. |> json_response_and_validate_schema(403)
  533. assert %{"error" => "Invalid request"} == response
  534. end
  535. test "changing bot field to true changes actor_type to Service", %{conn: conn} do
  536. account =
  537. conn
  538. |> patch("/api/v1/accounts/update_credentials", %{bot: "true"})
  539. |> json_response_and_validate_schema(200)
  540. assert account["bot"]
  541. assert account["source"]["pleroma"]["actor_type"] == "Service"
  542. end
  543. test "changing bot field to false changes actor_type to Person", %{conn: conn} do
  544. account =
  545. conn
  546. |> patch("/api/v1/accounts/update_credentials", %{bot: "false"})
  547. |> json_response_and_validate_schema(200)
  548. refute account["bot"]
  549. assert account["source"]["pleroma"]["actor_type"] == "Person"
  550. end
  551. test "actor_type field has a higher priority than bot", %{conn: conn} do
  552. account =
  553. conn
  554. |> patch("/api/v1/accounts/update_credentials", %{
  555. actor_type: "Person",
  556. bot: "true"
  557. })
  558. |> json_response_and_validate_schema(200)
  559. refute account["bot"]
  560. assert account["source"]["pleroma"]["actor_type"] == "Person"
  561. end
  562. end
  563. describe "Mark account as group" do
  564. setup do: oauth_access(["write:accounts"])
  565. setup :request_content_type
  566. test "changing actor_type to Group makes account a Group and enables bot indicator for backward compatibility",
  567. %{conn: conn} do
  568. account =
  569. conn
  570. |> patch("/api/v1/accounts/update_credentials", %{actor_type: "Group"})
  571. |> json_response_and_validate_schema(200)
  572. assert account["bot"]
  573. assert account["source"]["pleroma"]["actor_type"] == "Group"
  574. end
  575. end
  576. end