logo

pleroma

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

announcement_controller_test.exs (12004B)


  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.AdminAPI.AnnouncementControllerTest do
  5. use Pleroma.Web.ConnCase, async: false
  6. import Pleroma.Factory
  7. setup do
  8. clear_config([:instance, :admin_privileges], [:announcements_manage_announcements])
  9. admin = insert(:user, is_admin: true)
  10. token = insert(:oauth_admin_token, user: admin)
  11. conn =
  12. build_conn()
  13. |> assign(:user, admin)
  14. |> assign(:token, token)
  15. {:ok, %{admin: admin, token: token, conn: conn}}
  16. end
  17. describe "GET /api/v1/pleroma/admin/announcements" do
  18. test "it lists all announcements", %{conn: conn} do
  19. %{id: id} = insert(:announcement)
  20. response =
  21. conn
  22. |> get("/api/v1/pleroma/admin/announcements")
  23. |> json_response_and_validate_schema(:ok)
  24. assert [%{"id" => ^id}] = response
  25. end
  26. test "it requires privileged role :announcements_manage_announcements", %{conn: conn} do
  27. conn
  28. |> get("/api/v1/pleroma/admin/announcements")
  29. |> json_response_and_validate_schema(:ok)
  30. clear_config([:instance, :admin_privileges], [])
  31. conn
  32. |> get("/api/v1/pleroma/admin/announcements")
  33. |> json_response(:forbidden)
  34. end
  35. test "it paginates announcements", %{conn: conn} do
  36. _announcements = Enum.map(0..20, fn _ -> insert(:announcement) end)
  37. response =
  38. conn
  39. |> get("/api/v1/pleroma/admin/announcements")
  40. |> json_response_and_validate_schema(:ok)
  41. assert length(response) == 20
  42. end
  43. test "it paginates announcements with custom params", %{conn: conn} do
  44. announcements = Enum.map(0..20, fn _ -> insert(:announcement) end)
  45. response =
  46. conn
  47. |> get("/api/v1/pleroma/admin/announcements", limit: 5, offset: 7)
  48. |> json_response_and_validate_schema(:ok)
  49. assert length(response) == 5
  50. assert Enum.at(response, 0)["id"] == Enum.at(announcements, 7).id
  51. end
  52. test "it returns empty list with out-of-bounds offset", %{conn: conn} do
  53. _announcements = Enum.map(0..20, fn _ -> insert(:announcement) end)
  54. response =
  55. conn
  56. |> get("/api/v1/pleroma/admin/announcements", offset: 21)
  57. |> json_response_and_validate_schema(:ok)
  58. assert [] = response
  59. end
  60. test "it rejects invalid pagination params", %{conn: conn} do
  61. conn
  62. |> get("/api/v1/pleroma/admin/announcements", limit: 0)
  63. |> json_response_and_validate_schema(400)
  64. conn
  65. |> get("/api/v1/pleroma/admin/announcements", limit: -1)
  66. |> json_response_and_validate_schema(400)
  67. conn
  68. |> get("/api/v1/pleroma/admin/announcements", offset: -1)
  69. |> json_response_and_validate_schema(400)
  70. end
  71. end
  72. describe "GET /api/v1/pleroma/admin/announcements/:id" do
  73. test "it displays one announcement", %{conn: conn} do
  74. %{id: id} = insert(:announcement)
  75. response =
  76. conn
  77. |> get("/api/v1/pleroma/admin/announcements/#{id}")
  78. |> json_response_and_validate_schema(:ok)
  79. assert %{"id" => ^id} = response
  80. end
  81. test "it requires privileged role :announcements_manage_announcements", %{conn: conn} do
  82. %{id: id} = insert(:announcement)
  83. conn
  84. |> get("/api/v1/pleroma/admin/announcements/#{id}")
  85. |> json_response_and_validate_schema(:ok)
  86. clear_config([:instance, :admin_privileges], [])
  87. conn
  88. |> get("/api/v1/pleroma/admin/announcements/#{id}")
  89. |> json_response(:forbidden)
  90. end
  91. test "it returns not found for non-existent id", %{conn: conn} do
  92. %{id: id} = insert(:announcement)
  93. _response =
  94. conn
  95. |> get("/api/v1/pleroma/admin/announcements/#{id}xxx")
  96. |> json_response_and_validate_schema(:not_found)
  97. end
  98. end
  99. describe "DELETE /api/v1/pleroma/admin/announcements/:id" do
  100. test "it deletes specified announcement", %{conn: conn} do
  101. %{id: id} = insert(:announcement)
  102. _response =
  103. conn
  104. |> delete("/api/v1/pleroma/admin/announcements/#{id}")
  105. |> json_response_and_validate_schema(:ok)
  106. end
  107. test "it requires privileged role :announcements_manage_announcements", %{conn: conn} do
  108. %{id: id} = insert(:announcement)
  109. conn
  110. |> delete("/api/v1/pleroma/admin/announcements/#{id}")
  111. |> json_response_and_validate_schema(:ok)
  112. clear_config([:instance, :admin_privileges], [])
  113. conn
  114. |> delete("/api/v1/pleroma/admin/announcements/#{id}")
  115. |> json_response(:forbidden)
  116. end
  117. test "it returns not found for non-existent id", %{conn: conn} do
  118. %{id: id} = insert(:announcement)
  119. _response =
  120. conn
  121. |> delete("/api/v1/pleroma/admin/announcements/#{id}xxx")
  122. |> json_response_and_validate_schema(:not_found)
  123. assert %{id: ^id} = Pleroma.Announcement.get_by_id(id)
  124. end
  125. end
  126. describe "PATCH /api/v1/pleroma/admin/announcements/:id" do
  127. test "it returns not found for non-existent id", %{conn: conn} do
  128. %{id: id} = insert(:announcement)
  129. _response =
  130. conn
  131. |> put_req_header("content-type", "application/json")
  132. |> patch("/api/v1/pleroma/admin/announcements/#{id}xxx", %{})
  133. |> json_response_and_validate_schema(:not_found)
  134. assert %{id: ^id} = Pleroma.Announcement.get_by_id(id)
  135. end
  136. test "it updates a field", %{conn: conn} do
  137. %{id: id} = insert(:announcement)
  138. now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
  139. starts_at = NaiveDateTime.add(now, -10, :second)
  140. _response =
  141. conn
  142. |> put_req_header("content-type", "application/json")
  143. |> patch("/api/v1/pleroma/admin/announcements/#{id}", %{
  144. starts_at: NaiveDateTime.to_iso8601(starts_at)
  145. })
  146. |> json_response_and_validate_schema(:ok)
  147. new = Pleroma.Announcement.get_by_id(id)
  148. assert NaiveDateTime.compare(new.starts_at, starts_at) == :eq
  149. end
  150. test "it requires privileged role :announcements_manage_announcements", %{conn: conn} do
  151. %{id: id} = insert(:announcement)
  152. now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
  153. starts_at = NaiveDateTime.add(now, -10, :second)
  154. conn
  155. |> put_req_header("content-type", "application/json")
  156. |> patch("/api/v1/pleroma/admin/announcements/#{id}", %{
  157. starts_at: NaiveDateTime.to_iso8601(starts_at)
  158. })
  159. |> json_response_and_validate_schema(:ok)
  160. clear_config([:instance, :admin_privileges], [])
  161. conn
  162. |> put_req_header("content-type", "application/json")
  163. |> patch("/api/v1/pleroma/admin/announcements/#{id}", %{
  164. starts_at: NaiveDateTime.to_iso8601(starts_at)
  165. })
  166. |> json_response(:forbidden)
  167. end
  168. test "it updates with time with utc timezone", %{conn: conn} do
  169. %{id: id} = insert(:announcement)
  170. now = DateTime.now("Etc/UTC") |> elem(1) |> DateTime.truncate(:second)
  171. starts_at = DateTime.add(now, -10, :second)
  172. _response =
  173. conn
  174. |> put_req_header("content-type", "application/json")
  175. |> patch("/api/v1/pleroma/admin/announcements/#{id}", %{
  176. starts_at: DateTime.to_iso8601(starts_at)
  177. })
  178. |> json_response_and_validate_schema(:ok)
  179. new = Pleroma.Announcement.get_by_id(id)
  180. assert DateTime.compare(new.starts_at, starts_at) == :eq
  181. end
  182. test "it updates a data field", %{conn: conn} do
  183. %{id: id} = announcement = insert(:announcement, data: %{"all_day" => true})
  184. assert announcement.data["all_day"] == true
  185. new_content = "new content"
  186. response =
  187. conn
  188. |> put_req_header("content-type", "application/json")
  189. |> patch("/api/v1/pleroma/admin/announcements/#{id}", %{
  190. content: new_content
  191. })
  192. |> json_response_and_validate_schema(:ok)
  193. assert response["content"] == new_content
  194. assert response["all_day"] == true
  195. new = Pleroma.Announcement.get_by_id(id)
  196. assert new.data["content"] == new_content
  197. assert new.data["all_day"] == true
  198. end
  199. test "it nullifies a nullable field", %{conn: conn} do
  200. now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
  201. starts_at = NaiveDateTime.add(now, -10, :second)
  202. %{id: id} = insert(:announcement, starts_at: starts_at)
  203. response =
  204. conn
  205. |> put_req_header("content-type", "application/json")
  206. |> patch("/api/v1/pleroma/admin/announcements/#{id}", %{
  207. starts_at: nil
  208. })
  209. |> json_response_and_validate_schema(:ok)
  210. assert response["starts_at"] == nil
  211. new = Pleroma.Announcement.get_by_id(id)
  212. assert new.starts_at == nil
  213. end
  214. end
  215. describe "POST /api/v1/pleroma/admin/announcements" do
  216. test "it creates an announcement", %{conn: conn} do
  217. content = "test post announcement api"
  218. now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
  219. starts_at = NaiveDateTime.add(now, -10, :second)
  220. ends_at = NaiveDateTime.add(now, 10, :second)
  221. response =
  222. conn
  223. |> put_req_header("content-type", "application/json")
  224. |> post("/api/v1/pleroma/admin/announcements", %{
  225. "content" => content,
  226. "starts_at" => NaiveDateTime.to_iso8601(starts_at),
  227. "ends_at" => NaiveDateTime.to_iso8601(ends_at),
  228. "all_day" => true
  229. })
  230. |> json_response_and_validate_schema(:ok)
  231. assert %{"content" => ^content, "all_day" => true} = response
  232. announcement = Pleroma.Announcement.get_by_id(response["id"])
  233. assert not is_nil(announcement)
  234. assert NaiveDateTime.compare(announcement.starts_at, starts_at) == :eq
  235. assert NaiveDateTime.compare(announcement.ends_at, ends_at) == :eq
  236. end
  237. test "it requires privileged role :announcements_manage_announcements", %{conn: conn} do
  238. content = "test post announcement api"
  239. now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
  240. starts_at = NaiveDateTime.add(now, -10, :second)
  241. ends_at = NaiveDateTime.add(now, 10, :second)
  242. conn
  243. |> put_req_header("content-type", "application/json")
  244. |> post("/api/v1/pleroma/admin/announcements", %{
  245. "content" => content,
  246. "starts_at" => NaiveDateTime.to_iso8601(starts_at),
  247. "ends_at" => NaiveDateTime.to_iso8601(ends_at),
  248. "all_day" => true
  249. })
  250. |> json_response_and_validate_schema(:ok)
  251. clear_config([:instance, :admin_privileges], [])
  252. conn
  253. |> put_req_header("content-type", "application/json")
  254. |> post("/api/v1/pleroma/admin/announcements", %{
  255. "content" => content,
  256. "starts_at" => NaiveDateTime.to_iso8601(starts_at),
  257. "ends_at" => NaiveDateTime.to_iso8601(ends_at),
  258. "all_day" => true
  259. })
  260. |> json_response(:forbidden)
  261. end
  262. test "creating with time with utc timezones", %{conn: conn} do
  263. content = "test post announcement api"
  264. now = DateTime.now("Etc/UTC") |> elem(1) |> DateTime.truncate(:second)
  265. starts_at = DateTime.add(now, -10, :second)
  266. ends_at = DateTime.add(now, 10, :second)
  267. response =
  268. conn
  269. |> put_req_header("content-type", "application/json")
  270. |> post("/api/v1/pleroma/admin/announcements", %{
  271. "content" => content,
  272. "starts_at" => DateTime.to_iso8601(starts_at),
  273. "ends_at" => DateTime.to_iso8601(ends_at),
  274. "all_day" => true
  275. })
  276. |> json_response_and_validate_schema(:ok)
  277. assert %{"content" => ^content, "all_day" => true} = response
  278. announcement = Pleroma.Announcement.get_by_id(response["id"])
  279. assert not is_nil(announcement)
  280. assert DateTime.compare(announcement.starts_at, starts_at) == :eq
  281. assert DateTime.compare(announcement.ends_at, ends_at) == :eq
  282. end
  283. end
  284. end