Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

498 lines
17KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.AdminAPI.ConfigTest do
  5. use Pleroma.DataCase, async: true
  6. import Pleroma.Factory
  7. alias Pleroma.Web.AdminAPI.Config
  8. test "get_by_key/1" do
  9. config = insert(:config)
  10. insert(:config)
  11. assert config == Config.get_by_params(%{group: config.group, key: config.key})
  12. end
  13. test "create/1" do
  14. {:ok, config} = Config.create(%{group: "pleroma", key: "some_key", value: "some_value"})
  15. assert config == Config.get_by_params(%{group: "pleroma", key: "some_key"})
  16. end
  17. test "update/1" do
  18. config = insert(:config)
  19. {:ok, updated} = Config.update(config, %{value: "some_value"})
  20. loaded = Config.get_by_params(%{group: config.group, key: config.key})
  21. assert loaded == updated
  22. end
  23. test "update_or_create/1" do
  24. config = insert(:config)
  25. key2 = "another_key"
  26. params = [
  27. %{group: "pleroma", key: key2, value: "another_value"},
  28. %{group: config.group, key: config.key, value: "new_value"}
  29. ]
  30. assert Repo.all(Config) |> length() == 1
  31. Enum.each(params, &Config.update_or_create(&1))
  32. assert Repo.all(Config) |> length() == 2
  33. config1 = Config.get_by_params(%{group: config.group, key: config.key})
  34. config2 = Config.get_by_params(%{group: "pleroma", key: key2})
  35. assert config1.value == Config.transform("new_value")
  36. assert config2.value == Config.transform("another_value")
  37. end
  38. test "delete/1" do
  39. config = insert(:config)
  40. {:ok, _} = Config.delete(%{key: config.key, group: config.group})
  41. refute Config.get_by_params(%{key: config.key, group: config.group})
  42. end
  43. describe "transform/1" do
  44. test "string" do
  45. binary = Config.transform("value as string")
  46. assert binary == :erlang.term_to_binary("value as string")
  47. assert Config.from_binary(binary) == "value as string"
  48. end
  49. test "boolean" do
  50. binary = Config.transform(false)
  51. assert binary == :erlang.term_to_binary(false)
  52. assert Config.from_binary(binary) == false
  53. end
  54. test "nil" do
  55. binary = Config.transform(nil)
  56. assert binary == :erlang.term_to_binary(nil)
  57. assert Config.from_binary(binary) == nil
  58. end
  59. test "integer" do
  60. binary = Config.transform(150)
  61. assert binary == :erlang.term_to_binary(150)
  62. assert Config.from_binary(binary) == 150
  63. end
  64. test "atom" do
  65. binary = Config.transform(":atom")
  66. assert binary == :erlang.term_to_binary(:atom)
  67. assert Config.from_binary(binary) == :atom
  68. end
  69. test "pleroma module" do
  70. binary = Config.transform("Pleroma.Bookmark")
  71. assert binary == :erlang.term_to_binary(Pleroma.Bookmark)
  72. assert Config.from_binary(binary) == Pleroma.Bookmark
  73. end
  74. test "phoenix module" do
  75. binary = Config.transform("Phoenix.Socket.V1.JSONSerializer")
  76. assert binary == :erlang.term_to_binary(Phoenix.Socket.V1.JSONSerializer)
  77. assert Config.from_binary(binary) == Phoenix.Socket.V1.JSONSerializer
  78. end
  79. test "sigil" do
  80. binary = Config.transform("~r/comp[lL][aA][iI][nN]er/")
  81. assert binary == :erlang.term_to_binary(~r/comp[lL][aA][iI][nN]er/)
  82. assert Config.from_binary(binary) == ~r/comp[lL][aA][iI][nN]er/
  83. end
  84. test "link sigil" do
  85. binary = Config.transform("~r/https:\/\/example.com/")
  86. assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/)
  87. assert Config.from_binary(binary) == ~r/https:\/\/example.com/
  88. end
  89. test "link sigil with u modifier" do
  90. binary = Config.transform("~r/https:\/\/example.com/u")
  91. assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/u)
  92. assert Config.from_binary(binary) == ~r/https:\/\/example.com/u
  93. end
  94. test "link sigil with i modifier" do
  95. binary = Config.transform("~r/https:\/\/example.com/i")
  96. assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/i)
  97. assert Config.from_binary(binary) == ~r/https:\/\/example.com/i
  98. end
  99. test "link sigil with s modifier" do
  100. binary = Config.transform("~r/https:\/\/example.com/s")
  101. assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/s)
  102. assert Config.from_binary(binary) == ~r/https:\/\/example.com/s
  103. end
  104. test "2 child tuple" do
  105. binary = Config.transform(%{"tuple" => ["v1", ":v2"]})
  106. assert binary == :erlang.term_to_binary({"v1", :v2})
  107. assert Config.from_binary(binary) == {"v1", :v2}
  108. end
  109. test "tuple with n childs" do
  110. binary =
  111. Config.transform(%{
  112. "tuple" => [
  113. "v1",
  114. ":v2",
  115. "Pleroma.Bookmark",
  116. 150,
  117. false,
  118. "Phoenix.Socket.V1.JSONSerializer"
  119. ]
  120. })
  121. assert binary ==
  122. :erlang.term_to_binary(
  123. {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer}
  124. )
  125. assert Config.from_binary(binary) ==
  126. {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer}
  127. end
  128. test "tuple with dispatch key" do
  129. binary = Config.transform(%{"tuple" => [":dispatch", ["{:_,
  130. [
  131. {\"/api/v1/streaming\", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
  132. {\"/websocket\", Phoenix.Endpoint.CowboyWebSocket,
  133. {Phoenix.Transports.WebSocket,
  134. {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: \"/websocket\"]}}},
  135. {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
  136. ]}"]]})
  137. assert binary ==
  138. :erlang.term_to_binary(
  139. {:dispatch,
  140. [
  141. {:_,
  142. [
  143. {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
  144. {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
  145. {Phoenix.Transports.WebSocket,
  146. {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: "/websocket"]}}},
  147. {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
  148. ]}
  149. ]}
  150. )
  151. assert Config.from_binary(binary) ==
  152. {:dispatch,
  153. [
  154. {:_,
  155. [
  156. {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
  157. {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
  158. {Phoenix.Transports.WebSocket,
  159. {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: "/websocket"]}}},
  160. {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
  161. ]}
  162. ]}
  163. end
  164. test "map with string key" do
  165. binary = Config.transform(%{"key" => "value"})
  166. assert binary == :erlang.term_to_binary(%{"key" => "value"})
  167. assert Config.from_binary(binary) == %{"key" => "value"}
  168. end
  169. test "map with atom key" do
  170. binary = Config.transform(%{":key" => "value"})
  171. assert binary == :erlang.term_to_binary(%{key: "value"})
  172. assert Config.from_binary(binary) == %{key: "value"}
  173. end
  174. test "list of strings" do
  175. binary = Config.transform(["v1", "v2", "v3"])
  176. assert binary == :erlang.term_to_binary(["v1", "v2", "v3"])
  177. assert Config.from_binary(binary) == ["v1", "v2", "v3"]
  178. end
  179. test "list of modules" do
  180. binary = Config.transform(["Pleroma.Repo", "Pleroma.Activity"])
  181. assert binary == :erlang.term_to_binary([Pleroma.Repo, Pleroma.Activity])
  182. assert Config.from_binary(binary) == [Pleroma.Repo, Pleroma.Activity]
  183. end
  184. test "list of atoms" do
  185. binary = Config.transform([":v1", ":v2", ":v3"])
  186. assert binary == :erlang.term_to_binary([:v1, :v2, :v3])
  187. assert Config.from_binary(binary) == [:v1, :v2, :v3]
  188. end
  189. test "list of mixed values" do
  190. binary =
  191. Config.transform([
  192. "v1",
  193. ":v2",
  194. "Pleroma.Repo",
  195. "Phoenix.Socket.V1.JSONSerializer",
  196. 15,
  197. false
  198. ])
  199. assert binary ==
  200. :erlang.term_to_binary([
  201. "v1",
  202. :v2,
  203. Pleroma.Repo,
  204. Phoenix.Socket.V1.JSONSerializer,
  205. 15,
  206. false
  207. ])
  208. assert Config.from_binary(binary) == [
  209. "v1",
  210. :v2,
  211. Pleroma.Repo,
  212. Phoenix.Socket.V1.JSONSerializer,
  213. 15,
  214. false
  215. ]
  216. end
  217. test "simple keyword" do
  218. binary = Config.transform([%{"tuple" => [":key", "value"]}])
  219. assert binary == :erlang.term_to_binary([{:key, "value"}])
  220. assert Config.from_binary(binary) == [{:key, "value"}]
  221. assert Config.from_binary(binary) == [key: "value"]
  222. end
  223. test "keyword with partial_chain key" do
  224. binary =
  225. Config.transform([%{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}])
  226. assert binary == :erlang.term_to_binary(partial_chain: &:hackney_connect.partial_chain/1)
  227. assert Config.from_binary(binary) == [partial_chain: &:hackney_connect.partial_chain/1]
  228. end
  229. test "keyword" do
  230. binary =
  231. Config.transform([
  232. %{"tuple" => [":types", "Pleroma.PostgresTypes"]},
  233. %{"tuple" => [":telemetry_event", ["Pleroma.Repo.Instrumenter"]]},
  234. %{"tuple" => [":migration_lock", nil]},
  235. %{"tuple" => [":key1", 150]},
  236. %{"tuple" => [":key2", "string"]}
  237. ])
  238. assert binary ==
  239. :erlang.term_to_binary(
  240. types: Pleroma.PostgresTypes,
  241. telemetry_event: [Pleroma.Repo.Instrumenter],
  242. migration_lock: nil,
  243. key1: 150,
  244. key2: "string"
  245. )
  246. assert Config.from_binary(binary) == [
  247. types: Pleroma.PostgresTypes,
  248. telemetry_event: [Pleroma.Repo.Instrumenter],
  249. migration_lock: nil,
  250. key1: 150,
  251. key2: "string"
  252. ]
  253. end
  254. test "complex keyword with nested mixed childs" do
  255. binary =
  256. Config.transform([
  257. %{"tuple" => [":uploader", "Pleroma.Uploaders.Local"]},
  258. %{"tuple" => [":filters", ["Pleroma.Upload.Filter.Dedupe"]]},
  259. %{"tuple" => [":link_name", true]},
  260. %{"tuple" => [":proxy_remote", false]},
  261. %{"tuple" => [":common_map", %{":key" => "value"}]},
  262. %{
  263. "tuple" => [
  264. ":proxy_opts",
  265. [
  266. %{"tuple" => [":redirect_on_failure", false]},
  267. %{"tuple" => [":max_body_length", 1_048_576]},
  268. %{
  269. "tuple" => [
  270. ":http",
  271. [%{"tuple" => [":follow_redirect", true]}, %{"tuple" => [":pool", ":upload"]}]
  272. ]
  273. }
  274. ]
  275. ]
  276. }
  277. ])
  278. assert binary ==
  279. :erlang.term_to_binary(
  280. uploader: Pleroma.Uploaders.Local,
  281. filters: [Pleroma.Upload.Filter.Dedupe],
  282. link_name: true,
  283. proxy_remote: false,
  284. common_map: %{key: "value"},
  285. proxy_opts: [
  286. redirect_on_failure: false,
  287. max_body_length: 1_048_576,
  288. http: [
  289. follow_redirect: true,
  290. pool: :upload
  291. ]
  292. ]
  293. )
  294. assert Config.from_binary(binary) ==
  295. [
  296. uploader: Pleroma.Uploaders.Local,
  297. filters: [Pleroma.Upload.Filter.Dedupe],
  298. link_name: true,
  299. proxy_remote: false,
  300. common_map: %{key: "value"},
  301. proxy_opts: [
  302. redirect_on_failure: false,
  303. max_body_length: 1_048_576,
  304. http: [
  305. follow_redirect: true,
  306. pool: :upload
  307. ]
  308. ]
  309. ]
  310. end
  311. test "common keyword" do
  312. binary =
  313. Config.transform([
  314. %{"tuple" => [":level", ":warn"]},
  315. %{"tuple" => [":meta", [":all"]]},
  316. %{"tuple" => [":path", ""]},
  317. %{"tuple" => [":val", nil]},
  318. %{"tuple" => [":webhook_url", "https://hooks.slack.com/services/YOUR-KEY-HERE"]}
  319. ])
  320. assert binary ==
  321. :erlang.term_to_binary(
  322. level: :warn,
  323. meta: [:all],
  324. path: "",
  325. val: nil,
  326. webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE"
  327. )
  328. assert Config.from_binary(binary) == [
  329. level: :warn,
  330. meta: [:all],
  331. path: "",
  332. val: nil,
  333. webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE"
  334. ]
  335. end
  336. test "complex keyword with sigil" do
  337. binary =
  338. Config.transform([
  339. %{"tuple" => [":federated_timeline_removal", []]},
  340. %{"tuple" => [":reject", ["~r/comp[lL][aA][iI][nN]er/"]]},
  341. %{"tuple" => [":replace", []]}
  342. ])
  343. assert binary ==
  344. :erlang.term_to_binary(
  345. federated_timeline_removal: [],
  346. reject: [~r/comp[lL][aA][iI][nN]er/],
  347. replace: []
  348. )
  349. assert Config.from_binary(binary) ==
  350. [federated_timeline_removal: [], reject: [~r/comp[lL][aA][iI][nN]er/], replace: []]
  351. end
  352. test "complex keyword with tuples with more than 2 values" do
  353. binary =
  354. Config.transform([
  355. %{
  356. "tuple" => [
  357. ":http",
  358. [
  359. %{
  360. "tuple" => [
  361. ":key1",
  362. [
  363. %{
  364. "tuple" => [
  365. ":_",
  366. [
  367. %{
  368. "tuple" => [
  369. "/api/v1/streaming",
  370. "Pleroma.Web.MastodonAPI.WebsocketHandler",
  371. []
  372. ]
  373. },
  374. %{
  375. "tuple" => [
  376. "/websocket",
  377. "Phoenix.Endpoint.CowboyWebSocket",
  378. %{
  379. "tuple" => [
  380. "Phoenix.Transports.WebSocket",
  381. %{
  382. "tuple" => [
  383. "Pleroma.Web.Endpoint",
  384. "Pleroma.Web.UserSocket",
  385. []
  386. ]
  387. }
  388. ]
  389. }
  390. ]
  391. },
  392. %{
  393. "tuple" => [
  394. ":_",
  395. "Phoenix.Endpoint.Cowboy2Handler",
  396. %{"tuple" => ["Pleroma.Web.Endpoint", []]}
  397. ]
  398. }
  399. ]
  400. ]
  401. }
  402. ]
  403. ]
  404. }
  405. ]
  406. ]
  407. }
  408. ])
  409. assert binary ==
  410. :erlang.term_to_binary(
  411. http: [
  412. key1: [
  413. _: [
  414. {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
  415. {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
  416. {Phoenix.Transports.WebSocket,
  417. {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}},
  418. {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
  419. ]
  420. ]
  421. ]
  422. )
  423. assert Config.from_binary(binary) == [
  424. http: [
  425. key1: [
  426. {:_,
  427. [
  428. {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
  429. {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
  430. {Phoenix.Transports.WebSocket,
  431. {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}},
  432. {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
  433. ]}
  434. ]
  435. ]
  436. ]
  437. end
  438. end
  439. end