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.

714 lines
24KB

  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.ConfigDBTest do
  5. use Pleroma.DataCase, async: true
  6. import Pleroma.Factory
  7. alias Pleroma.ConfigDB
  8. test "get_by_key/1" do
  9. config = insert(:config)
  10. insert(:config)
  11. assert config == ConfigDB.get_by_params(%{group: config.group, key: config.key})
  12. end
  13. test "create/1" do
  14. {:ok, config} = ConfigDB.create(%{group: ":pleroma", key: ":some_key", value: "some_value"})
  15. assert config == ConfigDB.get_by_params(%{group: ":pleroma", key: ":some_key"})
  16. end
  17. test "update/1" do
  18. config = insert(:config)
  19. {:ok, updated} = ConfigDB.update(config, %{value: "some_value"})
  20. loaded = ConfigDB.get_by_params(%{group: config.group, key: config.key})
  21. assert loaded == updated
  22. end
  23. test "get_all_as_keyword/0" do
  24. saved = insert(:config)
  25. insert(:config, group: ":quack", key: ":level", value: ConfigDB.to_binary(:info))
  26. insert(:config, group: ":quack", key: ":meta", value: ConfigDB.to_binary([:none]))
  27. insert(:config,
  28. group: ":quack",
  29. key: ":webhook_url",
  30. value: ConfigDB.to_binary("https://hooks.slack.com/services/KEY/some_val")
  31. )
  32. config = ConfigDB.get_all_as_keyword()
  33. assert config[:pleroma] == [
  34. {ConfigDB.from_string(saved.key), ConfigDB.from_binary(saved.value)}
  35. ]
  36. assert config[:quack] == [
  37. level: :info,
  38. meta: [:none],
  39. webhook_url: "https://hooks.slack.com/services/KEY/some_val"
  40. ]
  41. end
  42. describe "update_or_create/1" do
  43. test "common" do
  44. config = insert(:config)
  45. key2 = "another_key"
  46. params = [
  47. %{group: "pleroma", key: key2, value: "another_value"},
  48. %{group: config.group, key: config.key, value: "new_value"}
  49. ]
  50. assert Repo.all(ConfigDB) |> length() == 1
  51. Enum.each(params, &ConfigDB.update_or_create(&1))
  52. assert Repo.all(ConfigDB) |> length() == 2
  53. config1 = ConfigDB.get_by_params(%{group: config.group, key: config.key})
  54. config2 = ConfigDB.get_by_params(%{group: "pleroma", key: key2})
  55. assert config1.value == ConfigDB.transform("new_value")
  56. assert config2.value == ConfigDB.transform("another_value")
  57. end
  58. test "partial update" do
  59. config = insert(:config, value: ConfigDB.to_binary(key1: "val1", key2: :val2))
  60. {:ok, _config} =
  61. ConfigDB.update_or_create(%{
  62. group: config.group,
  63. key: config.key,
  64. value: [key1: :val1, key3: :val3]
  65. })
  66. updated = ConfigDB.get_by_params(%{group: config.group, key: config.key})
  67. value = ConfigDB.from_binary(updated.value)
  68. assert length(value) == 3
  69. assert value[:key1] == :val1
  70. assert value[:key2] == :val2
  71. assert value[:key3] == :val3
  72. end
  73. test "deep merge" do
  74. config = insert(:config, value: ConfigDB.to_binary(key1: "val1", key2: [k1: :v1, k2: "v2"]))
  75. {:ok, config} =
  76. ConfigDB.update_or_create(%{
  77. group: config.group,
  78. key: config.key,
  79. value: [key1: :val1, key2: [k2: :v2, k3: :v3], key3: :val3]
  80. })
  81. updated = ConfigDB.get_by_params(%{group: config.group, key: config.key})
  82. assert config.value == updated.value
  83. value = ConfigDB.from_binary(updated.value)
  84. assert value[:key1] == :val1
  85. assert value[:key2] == [k1: :v1, k2: :v2, k3: :v3]
  86. assert value[:key3] == :val3
  87. end
  88. test "only full update for some keys" do
  89. config1 = insert(:config, key: ":ecto_repos", value: ConfigDB.to_binary(repo: Pleroma.Repo))
  90. config2 =
  91. insert(:config, group: ":cors_plug", key: ":max_age", value: ConfigDB.to_binary(18))
  92. {:ok, _config} =
  93. ConfigDB.update_or_create(%{
  94. group: config1.group,
  95. key: config1.key,
  96. value: [another_repo: [Pleroma.Repo]]
  97. })
  98. {:ok, _config} =
  99. ConfigDB.update_or_create(%{
  100. group: config2.group,
  101. key: config2.key,
  102. value: 777
  103. })
  104. updated1 = ConfigDB.get_by_params(%{group: config1.group, key: config1.key})
  105. updated2 = ConfigDB.get_by_params(%{group: config2.group, key: config2.key})
  106. assert ConfigDB.from_binary(updated1.value) == [another_repo: [Pleroma.Repo]]
  107. assert ConfigDB.from_binary(updated2.value) == 777
  108. end
  109. test "full update if value is not keyword" do
  110. config =
  111. insert(:config,
  112. group: ":tesla",
  113. key: ":adapter",
  114. value: ConfigDB.to_binary(Tesla.Adapter.Hackney)
  115. )
  116. {:ok, _config} =
  117. ConfigDB.update_or_create(%{
  118. group: config.group,
  119. key: config.key,
  120. value: Tesla.Adapter.Httpc
  121. })
  122. updated = ConfigDB.get_by_params(%{group: config.group, key: config.key})
  123. assert ConfigDB.from_binary(updated.value) == Tesla.Adapter.Httpc
  124. end
  125. test "only full update for some subkeys" do
  126. config1 =
  127. insert(:config,
  128. key: ":emoji",
  129. value: ConfigDB.to_binary(groups: [a: 1, b: 2], key: [a: 1])
  130. )
  131. config2 =
  132. insert(:config,
  133. key: ":assets",
  134. value: ConfigDB.to_binary(mascots: [a: 1, b: 2], key: [a: 1])
  135. )
  136. {:ok, _config} =
  137. ConfigDB.update_or_create(%{
  138. group: config1.group,
  139. key: config1.key,
  140. value: [groups: [c: 3, d: 4], key: [b: 2]]
  141. })
  142. {:ok, _config} =
  143. ConfigDB.update_or_create(%{
  144. group: config2.group,
  145. key: config2.key,
  146. value: [mascots: [c: 3, d: 4], key: [b: 2]]
  147. })
  148. updated1 = ConfigDB.get_by_params(%{group: config1.group, key: config1.key})
  149. updated2 = ConfigDB.get_by_params(%{group: config2.group, key: config2.key})
  150. assert ConfigDB.from_binary(updated1.value) == [groups: [c: 3, d: 4], key: [a: 1, b: 2]]
  151. assert ConfigDB.from_binary(updated2.value) == [mascots: [c: 3, d: 4], key: [a: 1, b: 2]]
  152. end
  153. end
  154. describe "delete/1" do
  155. test "error on deleting non existing setting" do
  156. {:error, error} = ConfigDB.delete(%{group: ":pleroma", key: ":key"})
  157. assert error =~ "Config with params %{group: \":pleroma\", key: \":key\"} not found"
  158. end
  159. test "full delete" do
  160. config = insert(:config)
  161. {:ok, deleted} = ConfigDB.delete(%{group: config.group, key: config.key})
  162. assert Ecto.get_meta(deleted, :state) == :deleted
  163. refute ConfigDB.get_by_params(%{group: config.group, key: config.key})
  164. end
  165. test "partial subkeys delete" do
  166. config = insert(:config, value: ConfigDB.to_binary(groups: [a: 1, b: 2], key: [a: 1]))
  167. {:ok, deleted} =
  168. ConfigDB.delete(%{group: config.group, key: config.key, subkeys: [":groups"]})
  169. assert Ecto.get_meta(deleted, :state) == :loaded
  170. assert deleted.value == ConfigDB.to_binary(key: [a: 1])
  171. updated = ConfigDB.get_by_params(%{group: config.group, key: config.key})
  172. assert updated.value == deleted.value
  173. end
  174. test "full delete if remaining value after subkeys deletion is empty list" do
  175. config = insert(:config, value: ConfigDB.to_binary(groups: [a: 1, b: 2]))
  176. {:ok, deleted} =
  177. ConfigDB.delete(%{group: config.group, key: config.key, subkeys: [":groups"]})
  178. assert Ecto.get_meta(deleted, :state) == :deleted
  179. refute ConfigDB.get_by_params(%{group: config.group, key: config.key})
  180. end
  181. end
  182. describe "transform/1" do
  183. test "string" do
  184. binary = ConfigDB.transform("value as string")
  185. assert binary == :erlang.term_to_binary("value as string")
  186. assert ConfigDB.from_binary(binary) == "value as string"
  187. end
  188. test "boolean" do
  189. binary = ConfigDB.transform(false)
  190. assert binary == :erlang.term_to_binary(false)
  191. assert ConfigDB.from_binary(binary) == false
  192. end
  193. test "nil" do
  194. binary = ConfigDB.transform(nil)
  195. assert binary == :erlang.term_to_binary(nil)
  196. assert ConfigDB.from_binary(binary) == nil
  197. end
  198. test "integer" do
  199. binary = ConfigDB.transform(150)
  200. assert binary == :erlang.term_to_binary(150)
  201. assert ConfigDB.from_binary(binary) == 150
  202. end
  203. test "atom" do
  204. binary = ConfigDB.transform(":atom")
  205. assert binary == :erlang.term_to_binary(:atom)
  206. assert ConfigDB.from_binary(binary) == :atom
  207. end
  208. test "ssl options" do
  209. binary = ConfigDB.transform([":tlsv1", ":tlsv1.1", ":tlsv1.2"])
  210. assert binary == :erlang.term_to_binary([:tlsv1, :"tlsv1.1", :"tlsv1.2"])
  211. assert ConfigDB.from_binary(binary) == [:tlsv1, :"tlsv1.1", :"tlsv1.2"]
  212. end
  213. test "pleroma module" do
  214. binary = ConfigDB.transform("Pleroma.Bookmark")
  215. assert binary == :erlang.term_to_binary(Pleroma.Bookmark)
  216. assert ConfigDB.from_binary(binary) == Pleroma.Bookmark
  217. end
  218. test "pleroma string" do
  219. binary = ConfigDB.transform("Pleroma")
  220. assert binary == :erlang.term_to_binary("Pleroma")
  221. assert ConfigDB.from_binary(binary) == "Pleroma"
  222. end
  223. test "phoenix module" do
  224. binary = ConfigDB.transform("Phoenix.Socket.V1.JSONSerializer")
  225. assert binary == :erlang.term_to_binary(Phoenix.Socket.V1.JSONSerializer)
  226. assert ConfigDB.from_binary(binary) == Phoenix.Socket.V1.JSONSerializer
  227. end
  228. test "tesla module" do
  229. binary = ConfigDB.transform("Tesla.Adapter.Hackney")
  230. assert binary == :erlang.term_to_binary(Tesla.Adapter.Hackney)
  231. assert ConfigDB.from_binary(binary) == Tesla.Adapter.Hackney
  232. end
  233. test "ExSyslogger module" do
  234. binary = ConfigDB.transform("ExSyslogger")
  235. assert binary == :erlang.term_to_binary(ExSyslogger)
  236. assert ConfigDB.from_binary(binary) == ExSyslogger
  237. end
  238. test "Quack.Logger module" do
  239. binary = ConfigDB.transform("Quack.Logger")
  240. assert binary == :erlang.term_to_binary(Quack.Logger)
  241. assert ConfigDB.from_binary(binary) == Quack.Logger
  242. end
  243. test "Swoosh.Adapters modules" do
  244. binary = ConfigDB.transform("Swoosh.Adapters.SMTP")
  245. assert binary == :erlang.term_to_binary(Swoosh.Adapters.SMTP)
  246. assert ConfigDB.from_binary(binary) == Swoosh.Adapters.SMTP
  247. binary = ConfigDB.transform("Swoosh.Adapters.AmazonSES")
  248. assert binary == :erlang.term_to_binary(Swoosh.Adapters.AmazonSES)
  249. assert ConfigDB.from_binary(binary) == Swoosh.Adapters.AmazonSES
  250. end
  251. test "sigil" do
  252. binary = ConfigDB.transform("~r[comp[lL][aA][iI][nN]er]")
  253. assert binary == :erlang.term_to_binary(~r/comp[lL][aA][iI][nN]er/)
  254. assert ConfigDB.from_binary(binary) == ~r/comp[lL][aA][iI][nN]er/
  255. end
  256. test "link sigil" do
  257. binary = ConfigDB.transform("~r/https:\/\/example.com/")
  258. assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/)
  259. assert ConfigDB.from_binary(binary) == ~r/https:\/\/example.com/
  260. end
  261. test "link sigil with um modifiers" do
  262. binary = ConfigDB.transform("~r/https:\/\/example.com/um")
  263. assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/um)
  264. assert ConfigDB.from_binary(binary) == ~r/https:\/\/example.com/um
  265. end
  266. test "link sigil with i modifier" do
  267. binary = ConfigDB.transform("~r/https:\/\/example.com/i")
  268. assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/i)
  269. assert ConfigDB.from_binary(binary) == ~r/https:\/\/example.com/i
  270. end
  271. test "link sigil with s modifier" do
  272. binary = ConfigDB.transform("~r/https:\/\/example.com/s")
  273. assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/s)
  274. assert ConfigDB.from_binary(binary) == ~r/https:\/\/example.com/s
  275. end
  276. test "raise if valid delimiter not found" do
  277. assert_raise ArgumentError, "valid delimiter for Regex expression not found", fn ->
  278. ConfigDB.transform("~r/https://[]{}<>\"'()|example.com/s")
  279. end
  280. end
  281. test "2 child tuple" do
  282. binary = ConfigDB.transform(%{"tuple" => ["v1", ":v2"]})
  283. assert binary == :erlang.term_to_binary({"v1", :v2})
  284. assert ConfigDB.from_binary(binary) == {"v1", :v2}
  285. end
  286. test "proxy tuple with localhost" do
  287. binary =
  288. ConfigDB.transform(%{
  289. "tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]
  290. })
  291. assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, :localhost, 1234}})
  292. assert ConfigDB.from_binary(binary) == {:proxy_url, {:socks5, :localhost, 1234}}
  293. end
  294. test "proxy tuple with domain" do
  295. binary =
  296. ConfigDB.transform(%{
  297. "tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]
  298. })
  299. assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, 'domain.com', 1234}})
  300. assert ConfigDB.from_binary(binary) == {:proxy_url, {:socks5, 'domain.com', 1234}}
  301. end
  302. test "proxy tuple with ip" do
  303. binary =
  304. ConfigDB.transform(%{
  305. "tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]
  306. })
  307. assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, {127, 0, 0, 1}, 1234}})
  308. assert ConfigDB.from_binary(binary) == {:proxy_url, {:socks5, {127, 0, 0, 1}, 1234}}
  309. end
  310. test "tuple with n childs" do
  311. binary =
  312. ConfigDB.transform(%{
  313. "tuple" => [
  314. "v1",
  315. ":v2",
  316. "Pleroma.Bookmark",
  317. 150,
  318. false,
  319. "Phoenix.Socket.V1.JSONSerializer"
  320. ]
  321. })
  322. assert binary ==
  323. :erlang.term_to_binary(
  324. {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer}
  325. )
  326. assert ConfigDB.from_binary(binary) ==
  327. {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer}
  328. end
  329. test "map with string key" do
  330. binary = ConfigDB.transform(%{"key" => "value"})
  331. assert binary == :erlang.term_to_binary(%{"key" => "value"})
  332. assert ConfigDB.from_binary(binary) == %{"key" => "value"}
  333. end
  334. test "map with atom key" do
  335. binary = ConfigDB.transform(%{":key" => "value"})
  336. assert binary == :erlang.term_to_binary(%{key: "value"})
  337. assert ConfigDB.from_binary(binary) == %{key: "value"}
  338. end
  339. test "list of strings" do
  340. binary = ConfigDB.transform(["v1", "v2", "v3"])
  341. assert binary == :erlang.term_to_binary(["v1", "v2", "v3"])
  342. assert ConfigDB.from_binary(binary) == ["v1", "v2", "v3"]
  343. end
  344. test "list of modules" do
  345. binary = ConfigDB.transform(["Pleroma.Repo", "Pleroma.Activity"])
  346. assert binary == :erlang.term_to_binary([Pleroma.Repo, Pleroma.Activity])
  347. assert ConfigDB.from_binary(binary) == [Pleroma.Repo, Pleroma.Activity]
  348. end
  349. test "list of atoms" do
  350. binary = ConfigDB.transform([":v1", ":v2", ":v3"])
  351. assert binary == :erlang.term_to_binary([:v1, :v2, :v3])
  352. assert ConfigDB.from_binary(binary) == [:v1, :v2, :v3]
  353. end
  354. test "list of mixed values" do
  355. binary =
  356. ConfigDB.transform([
  357. "v1",
  358. ":v2",
  359. "Pleroma.Repo",
  360. "Phoenix.Socket.V1.JSONSerializer",
  361. 15,
  362. false
  363. ])
  364. assert binary ==
  365. :erlang.term_to_binary([
  366. "v1",
  367. :v2,
  368. Pleroma.Repo,
  369. Phoenix.Socket.V1.JSONSerializer,
  370. 15,
  371. false
  372. ])
  373. assert ConfigDB.from_binary(binary) == [
  374. "v1",
  375. :v2,
  376. Pleroma.Repo,
  377. Phoenix.Socket.V1.JSONSerializer,
  378. 15,
  379. false
  380. ]
  381. end
  382. test "simple keyword" do
  383. binary = ConfigDB.transform([%{"tuple" => [":key", "value"]}])
  384. assert binary == :erlang.term_to_binary([{:key, "value"}])
  385. assert ConfigDB.from_binary(binary) == [{:key, "value"}]
  386. assert ConfigDB.from_binary(binary) == [key: "value"]
  387. end
  388. test "keyword with partial_chain key" do
  389. binary =
  390. ConfigDB.transform([%{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}])
  391. assert binary == :erlang.term_to_binary(partial_chain: &:hackney_connect.partial_chain/1)
  392. assert ConfigDB.from_binary(binary) == [partial_chain: &:hackney_connect.partial_chain/1]
  393. end
  394. test "keyword" do
  395. binary =
  396. ConfigDB.transform([
  397. %{"tuple" => [":types", "Pleroma.PostgresTypes"]},
  398. %{"tuple" => [":telemetry_event", ["Pleroma.Repo.Instrumenter"]]},
  399. %{"tuple" => [":migration_lock", nil]},
  400. %{"tuple" => [":key1", 150]},
  401. %{"tuple" => [":key2", "string"]}
  402. ])
  403. assert binary ==
  404. :erlang.term_to_binary(
  405. types: Pleroma.PostgresTypes,
  406. telemetry_event: [Pleroma.Repo.Instrumenter],
  407. migration_lock: nil,
  408. key1: 150,
  409. key2: "string"
  410. )
  411. assert ConfigDB.from_binary(binary) == [
  412. types: Pleroma.PostgresTypes,
  413. telemetry_event: [Pleroma.Repo.Instrumenter],
  414. migration_lock: nil,
  415. key1: 150,
  416. key2: "string"
  417. ]
  418. end
  419. test "complex keyword with nested mixed childs" do
  420. binary =
  421. ConfigDB.transform([
  422. %{"tuple" => [":uploader", "Pleroma.Uploaders.Local"]},
  423. %{"tuple" => [":filters", ["Pleroma.Upload.Filter.Dedupe"]]},
  424. %{"tuple" => [":link_name", true]},
  425. %{"tuple" => [":proxy_remote", false]},
  426. %{"tuple" => [":common_map", %{":key" => "value"}]},
  427. %{
  428. "tuple" => [
  429. ":proxy_opts",
  430. [
  431. %{"tuple" => [":redirect_on_failure", false]},
  432. %{"tuple" => [":max_body_length", 1_048_576]},
  433. %{
  434. "tuple" => [
  435. ":http",
  436. [%{"tuple" => [":follow_redirect", true]}, %{"tuple" => [":pool", ":upload"]}]
  437. ]
  438. }
  439. ]
  440. ]
  441. }
  442. ])
  443. assert binary ==
  444. :erlang.term_to_binary(
  445. uploader: Pleroma.Uploaders.Local,
  446. filters: [Pleroma.Upload.Filter.Dedupe],
  447. link_name: true,
  448. proxy_remote: false,
  449. common_map: %{key: "value"},
  450. proxy_opts: [
  451. redirect_on_failure: false,
  452. max_body_length: 1_048_576,
  453. http: [
  454. follow_redirect: true,
  455. pool: :upload
  456. ]
  457. ]
  458. )
  459. assert ConfigDB.from_binary(binary) ==
  460. [
  461. uploader: Pleroma.Uploaders.Local,
  462. filters: [Pleroma.Upload.Filter.Dedupe],
  463. link_name: true,
  464. proxy_remote: false,
  465. common_map: %{key: "value"},
  466. proxy_opts: [
  467. redirect_on_failure: false,
  468. max_body_length: 1_048_576,
  469. http: [
  470. follow_redirect: true,
  471. pool: :upload
  472. ]
  473. ]
  474. ]
  475. end
  476. test "common keyword" do
  477. binary =
  478. ConfigDB.transform([
  479. %{"tuple" => [":level", ":warn"]},
  480. %{"tuple" => [":meta", [":all"]]},
  481. %{"tuple" => [":path", ""]},
  482. %{"tuple" => [":val", nil]},
  483. %{"tuple" => [":webhook_url", "https://hooks.slack.com/services/YOUR-KEY-HERE"]}
  484. ])
  485. assert binary ==
  486. :erlang.term_to_binary(
  487. level: :warn,
  488. meta: [:all],
  489. path: "",
  490. val: nil,
  491. webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE"
  492. )
  493. assert ConfigDB.from_binary(binary) == [
  494. level: :warn,
  495. meta: [:all],
  496. path: "",
  497. val: nil,
  498. webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE"
  499. ]
  500. end
  501. test "complex keyword with sigil" do
  502. binary =
  503. ConfigDB.transform([
  504. %{"tuple" => [":federated_timeline_removal", []]},
  505. %{"tuple" => [":reject", ["~r/comp[lL][aA][iI][nN]er/"]]},
  506. %{"tuple" => [":replace", []]}
  507. ])
  508. assert binary ==
  509. :erlang.term_to_binary(
  510. federated_timeline_removal: [],
  511. reject: [~r/comp[lL][aA][iI][nN]er/],
  512. replace: []
  513. )
  514. assert ConfigDB.from_binary(binary) ==
  515. [federated_timeline_removal: [], reject: [~r/comp[lL][aA][iI][nN]er/], replace: []]
  516. end
  517. test "complex keyword with tuples with more than 2 values" do
  518. binary =
  519. ConfigDB.transform([
  520. %{
  521. "tuple" => [
  522. ":http",
  523. [
  524. %{
  525. "tuple" => [
  526. ":key1",
  527. [
  528. %{
  529. "tuple" => [
  530. ":_",
  531. [
  532. %{
  533. "tuple" => [
  534. "/api/v1/streaming",
  535. "Pleroma.Web.MastodonAPI.WebsocketHandler",
  536. []
  537. ]
  538. },
  539. %{
  540. "tuple" => [
  541. "/websocket",
  542. "Phoenix.Endpoint.CowboyWebSocket",
  543. %{
  544. "tuple" => [
  545. "Phoenix.Transports.WebSocket",
  546. %{
  547. "tuple" => [
  548. "Pleroma.Web.Endpoint",
  549. "Pleroma.Web.UserSocket",
  550. []
  551. ]
  552. }
  553. ]
  554. }
  555. ]
  556. },
  557. %{
  558. "tuple" => [
  559. ":_",
  560. "Phoenix.Endpoint.Cowboy2Handler",
  561. %{"tuple" => ["Pleroma.Web.Endpoint", []]}
  562. ]
  563. }
  564. ]
  565. ]
  566. }
  567. ]
  568. ]
  569. }
  570. ]
  571. ]
  572. }
  573. ])
  574. assert binary ==
  575. :erlang.term_to_binary(
  576. http: [
  577. key1: [
  578. _: [
  579. {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
  580. {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
  581. {Phoenix.Transports.WebSocket,
  582. {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}},
  583. {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
  584. ]
  585. ]
  586. ]
  587. )
  588. assert ConfigDB.from_binary(binary) == [
  589. http: [
  590. key1: [
  591. {:_,
  592. [
  593. {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
  594. {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
  595. {Phoenix.Transports.WebSocket,
  596. {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}},
  597. {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
  598. ]}
  599. ]
  600. ]
  601. ]
  602. end
  603. end
  604. end