1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.AdminAPI.ConfigTest do
6 use Pleroma.DataCase, async: true
8 alias Pleroma.Web.AdminAPI.Config
10 test "get_by_key/1" do
11 config = insert(:config)
14 assert config == Config.get_by_params(%{group: config.group, key: config.key})
18 {:ok, config} = Config.create(%{group: "pleroma", key: "some_key", value: "some_value"})
19 assert config == Config.get_by_params(%{group: "pleroma", key: "some_key"})
23 config = insert(:config)
24 {:ok, updated} = Config.update(config, %{value: "some_value"})
25 loaded = Config.get_by_params(%{group: config.group, key: config.key})
26 assert loaded == updated
29 test "update_or_create/1" do
30 config = insert(:config)
34 %{group: "pleroma", key: key2, value: "another_value"},
35 %{group: config.group, key: config.key, value: "new_value"}
38 assert Repo.all(Config) |> length() == 1
40 Enum.each(params, &Config.update_or_create(&1))
42 assert Repo.all(Config) |> length() == 2
44 config1 = Config.get_by_params(%{group: config.group, key: config.key})
45 config2 = Config.get_by_params(%{group: "pleroma", key: key2})
47 assert config1.value == Config.transform("new_value")
48 assert config2.value == Config.transform("another_value")
52 config = insert(:config)
53 {:ok, _} = Config.delete(%{key: config.key, group: config.group})
54 refute Config.get_by_params(%{key: config.key, group: config.group})
57 describe "transform/1" do
59 binary = Config.transform("value as string")
60 assert binary == :erlang.term_to_binary("value as string")
61 assert Config.from_binary(binary) == "value as string"
65 binary = Config.transform(false)
66 assert binary == :erlang.term_to_binary(false)
67 assert Config.from_binary(binary) == false
71 binary = Config.transform(nil)
72 assert binary == :erlang.term_to_binary(nil)
73 assert Config.from_binary(binary) == nil
77 binary = Config.transform(150)
78 assert binary == :erlang.term_to_binary(150)
79 assert Config.from_binary(binary) == 150
83 binary = Config.transform(":atom")
84 assert binary == :erlang.term_to_binary(:atom)
85 assert Config.from_binary(binary) == :atom
88 test "pleroma module" do
89 binary = Config.transform("Pleroma.Bookmark")
90 assert binary == :erlang.term_to_binary(Pleroma.Bookmark)
91 assert Config.from_binary(binary) == Pleroma.Bookmark
94 test "phoenix module" do
95 binary = Config.transform("Phoenix.Socket.V1.JSONSerializer")
96 assert binary == :erlang.term_to_binary(Phoenix.Socket.V1.JSONSerializer)
97 assert Config.from_binary(binary) == Phoenix.Socket.V1.JSONSerializer
101 binary = Config.transform("~r/comp[lL][aA][iI][nN]er/")
102 assert binary == :erlang.term_to_binary(~r/comp[lL][aA][iI][nN]er/)
103 assert Config.from_binary(binary) == ~r/comp[lL][aA][iI][nN]er/
106 test "2 child tuple" do
107 binary = Config.transform(%{"tuple" => ["v1", ":v2"]})
108 assert binary == :erlang.term_to_binary({"v1", :v2})
109 assert Config.from_binary(binary) == {"v1", :v2}
112 test "tuple with n childs" do
121 "Phoenix.Socket.V1.JSONSerializer"
126 :erlang.term_to_binary(
127 {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer}
130 assert Config.from_binary(binary) ==
131 {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer}
134 test "tuple with dispatch key" do
135 binary = Config.transform(%{"tuple" => [":dispatch", ["{:_,
137 {\"/api/v1/streaming\", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
138 {\"/websocket\", Phoenix.Endpoint.CowboyWebSocket,
139 {Phoenix.Transports.WebSocket,
140 {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: \"/websocket\"]}}},
141 {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
145 :erlang.term_to_binary(
150 {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
151 {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
152 {Phoenix.Transports.WebSocket,
153 {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: "/websocket"]}}},
154 {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
159 assert Config.from_binary(binary) ==
164 {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
165 {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
166 {Phoenix.Transports.WebSocket,
167 {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: "/websocket"]}}},
168 {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
173 test "map with string key" do
174 binary = Config.transform(%{"key" => "value"})
175 assert binary == :erlang.term_to_binary(%{"key" => "value"})
176 assert Config.from_binary(binary) == %{"key" => "value"}
179 test "map with atom key" do
180 binary = Config.transform(%{":key" => "value"})
181 assert binary == :erlang.term_to_binary(%{key: "value"})
182 assert Config.from_binary(binary) == %{key: "value"}
185 test "list of strings" do
186 binary = Config.transform(["v1", "v2", "v3"])
187 assert binary == :erlang.term_to_binary(["v1", "v2", "v3"])
188 assert Config.from_binary(binary) == ["v1", "v2", "v3"]
191 test "list of modules" do
192 binary = Config.transform(["Pleroma.Repo", "Pleroma.Activity"])
193 assert binary == :erlang.term_to_binary([Pleroma.Repo, Pleroma.Activity])
194 assert Config.from_binary(binary) == [Pleroma.Repo, Pleroma.Activity]
197 test "list of atoms" do
198 binary = Config.transform([":v1", ":v2", ":v3"])
199 assert binary == :erlang.term_to_binary([:v1, :v2, :v3])
200 assert Config.from_binary(binary) == [:v1, :v2, :v3]
203 test "list of mixed values" do
209 "Phoenix.Socket.V1.JSONSerializer",
215 :erlang.term_to_binary([
219 Phoenix.Socket.V1.JSONSerializer,
224 assert Config.from_binary(binary) == [
228 Phoenix.Socket.V1.JSONSerializer,
234 test "simple keyword" do
235 binary = Config.transform([%{"tuple" => [":key", "value"]}])
236 assert binary == :erlang.term_to_binary([{:key, "value"}])
237 assert Config.from_binary(binary) == [{:key, "value"}]
238 assert Config.from_binary(binary) == [key: "value"]
241 test "keyword with partial_chain key" do
243 Config.transform([%{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}])
245 assert binary == :erlang.term_to_binary(partial_chain: &:hackney_connect.partial_chain/1)
246 assert Config.from_binary(binary) == [partial_chain: &:hackney_connect.partial_chain/1]
252 %{"tuple" => [":types", "Pleroma.PostgresTypes"]},
253 %{"tuple" => [":telemetry_event", ["Pleroma.Repo.Instrumenter"]]},
254 %{"tuple" => [":migration_lock", nil]},
255 %{"tuple" => [":key1", 150]},
256 %{"tuple" => [":key2", "string"]}
260 :erlang.term_to_binary(
261 types: Pleroma.PostgresTypes,
262 telemetry_event: [Pleroma.Repo.Instrumenter],
268 assert Config.from_binary(binary) == [
269 types: Pleroma.PostgresTypes,
270 telemetry_event: [Pleroma.Repo.Instrumenter],
277 test "complex keyword with nested mixed childs" do
280 %{"tuple" => [":uploader", "Pleroma.Uploaders.Local"]},
281 %{"tuple" => [":filters", ["Pleroma.Upload.Filter.Dedupe"]]},
282 %{"tuple" => [":link_name", true]},
283 %{"tuple" => [":proxy_remote", false]},
284 %{"tuple" => [":common_map", %{":key" => "value"}]},
289 %{"tuple" => [":redirect_on_failure", false]},
290 %{"tuple" => [":max_body_length", 1_048_576]},
294 [%{"tuple" => [":follow_redirect", true]}, %{"tuple" => [":pool", ":upload"]}]
303 :erlang.term_to_binary(
304 uploader: Pleroma.Uploaders.Local,
305 filters: [Pleroma.Upload.Filter.Dedupe],
308 common_map: %{key: "value"},
310 redirect_on_failure: false,
311 max_body_length: 1_048_576,
313 follow_redirect: true,
319 assert Config.from_binary(binary) ==
321 uploader: Pleroma.Uploaders.Local,
322 filters: [Pleroma.Upload.Filter.Dedupe],
325 common_map: %{key: "value"},
327 redirect_on_failure: false,
328 max_body_length: 1_048_576,
330 follow_redirect: true,
337 test "common keyword" do
340 %{"tuple" => [":level", ":warn"]},
341 %{"tuple" => [":meta", [":all"]]},
342 %{"tuple" => [":path", ""]},
343 %{"tuple" => [":val", nil]},
344 %{"tuple" => [":webhook_url", "https://hooks.slack.com/services/YOUR-KEY-HERE"]}
348 :erlang.term_to_binary(
353 webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE"
356 assert Config.from_binary(binary) == [
361 webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE"
365 test "complex keyword with sigil" do
368 %{"tuple" => [":federated_timeline_removal", []]},
369 %{"tuple" => [":reject", ["~r/comp[lL][aA][iI][nN]er/"]]},
370 %{"tuple" => [":replace", []]}
374 :erlang.term_to_binary(
375 federated_timeline_removal: [],
376 reject: [~r/comp[lL][aA][iI][nN]er/],
380 assert Config.from_binary(binary) ==
381 [federated_timeline_removal: [], reject: [~r/comp[lL][aA][iI][nN]er/], replace: []]
384 test "complex keyword with tuples with more than 2 values" do
402 "Pleroma.Web.MastodonAPI.WebsocketHandler",
409 "Phoenix.Endpoint.CowboyWebSocket",
412 "Phoenix.Transports.WebSocket",
415 "Pleroma.Web.Endpoint",
416 "Pleroma.Web.UserSocket",
427 "Phoenix.Endpoint.Cowboy2Handler",
428 %{"tuple" => ["Pleroma.Web.Endpoint", []]}
443 :erlang.term_to_binary(
447 {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
448 {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
449 {Phoenix.Transports.WebSocket,
450 {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}},
451 {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
457 assert Config.from_binary(binary) == [
462 {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
463 {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
464 {Phoenix.Transports.WebSocket,
465 {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}},
466 {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}