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.

712 lines
24KB

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