diff options
Diffstat (limited to 'test/pleroma/config_db_test.exs')
-rw-r--r-- | test/pleroma/config_db_test.exs | 538 |
1 files changed, 206 insertions, 332 deletions
diff --git a/test/pleroma/config_db_test.exs b/test/pleroma/config_db_test.exs index d42123fb4..26704169a 100644 --- a/test/pleroma/config_db_test.exs +++ b/test/pleroma/config_db_test.exs @@ -14,7 +14,7 @@ defmodule Pleroma.ConfigDBTest do assert config == ConfigDB.get_by_params(%{group: config.group, key: config.key}) end - test "get_all_as_keyword/0" do + test "all_as_keyword/0" do saved = insert(:config) insert(:config, group: ":quack", key: ":level", value: :info) insert(:config, group: ":quack", key: ":meta", value: [:none]) @@ -25,7 +25,7 @@ defmodule Pleroma.ConfigDBTest do value: "https://hooks.slack.com/services/KEY/some_val" ) - config = ConfigDB.get_all_as_keyword() + config = ConfigDB.all_as_keyword() assert config[:pleroma] == [ {saved.key, saved.value} @@ -38,12 +38,12 @@ defmodule Pleroma.ConfigDBTest do describe "update_or_create/1" do test "common" do - config = insert(:config) + config1 = insert(:config, value: []) key2 = :another_key params = [ - %{group: :pleroma, key: key2, value: "another_value"}, - %{group: :pleroma, key: config.key, value: [a: 1, b: 2, c: "new_value"]} + %{group: :pleroma, key: config1.key, value: [a: 1, b: 2, c: "new_value"]}, + %{group: :pleroma, key: key2, value: [new_val: "another_value"]} ] assert Repo.all(ConfigDB) |> length() == 1 @@ -52,11 +52,11 @@ defmodule Pleroma.ConfigDBTest do assert Repo.all(ConfigDB) |> length() == 2 - config1 = ConfigDB.get_by_params(%{group: config.group, key: config.key}) + config1 = ConfigDB.get_by_params(%{group: config1.group, key: config1.key}) config2 = ConfigDB.get_by_params(%{group: :pleroma, key: key2}) assert config1.value == [a: 1, b: 2, c: "new_value"] - assert config2.value == "another_value" + assert config2.value == [new_val: "another_value"] end test "partial update" do @@ -95,50 +95,18 @@ defmodule Pleroma.ConfigDBTest do assert updated.value[:key3] == :val3 end - test "only full update for some keys" do - config1 = insert(:config, key: :ecto_repos, value: [repo: Pleroma.Repo]) - - config2 = insert(:config, group: :cors_plug, key: :max_age, value: 18) - - {:ok, _config} = - ConfigDB.update_or_create(%{ - group: config1.group, - key: config1.key, - value: [another_repo: [Pleroma.Repo]] - }) - - {:ok, _config} = - ConfigDB.update_or_create(%{ - group: config2.group, - key: config2.key, - value: 777 - }) - - updated1 = ConfigDB.get_by_params(%{group: config1.group, key: config1.key}) - updated2 = ConfigDB.get_by_params(%{group: config2.group, key: config2.key}) - - assert updated1.value == [another_repo: [Pleroma.Repo]] - assert updated2.value == 777 - end - - test "full update if value is not keyword" do - config = - insert(:config, - group: ":tesla", - key: ":adapter", - value: Tesla.Adapter.Hackney - ) + test "only full update for groups without keys" do + config = insert(:config, group: :cors_plug, key: nil, value: [max_age: 18]) {:ok, _config} = ConfigDB.update_or_create(%{ group: config.group, - key: config.key, - value: Tesla.Adapter.Httpc + key: nil, + value: [max_age: 25, credentials: true] }) updated = ConfigDB.get_by_params(%{group: config.group, key: config.key}) - - assert updated.value == Tesla.Adapter.Httpc + assert updated.value == [max_age: 25, credentials: true] end test "only full update for some subkeys" do @@ -176,15 +144,14 @@ defmodule Pleroma.ConfigDBTest do end end - describe "delete/1" do + describe "delete_or_update/1" do test "error on deleting non existing setting" do - {:error, error} = ConfigDB.delete(%{group: ":pleroma", key: ":key"}) - assert error =~ "Config with params %{group: \":pleroma\", key: \":key\"} not found" + assert {:ok, nil} == ConfigDB.delete_or_update(%{group: :pleroma, key: :key}) end test "full delete" do config = insert(:config) - {:ok, deleted} = ConfigDB.delete(%{group: config.group, key: config.key}) + {:ok, deleted} = ConfigDB.delete_or_update(%{group: config.group, key: config.key}) assert Ecto.get_meta(deleted, :state) == :deleted refute ConfigDB.get_by_params(%{group: config.group, key: config.key}) end @@ -193,7 +160,7 @@ defmodule Pleroma.ConfigDBTest do config = insert(:config, value: [groups: [a: 1, b: 2], key: [a: 1]]) {:ok, deleted} = - ConfigDB.delete(%{group: config.group, key: config.key, subkeys: [":groups"]}) + ConfigDB.delete_or_update(%{group: config.group, key: config.key, subkeys: [:groups]}) assert Ecto.get_meta(deleted, :state) == :loaded @@ -208,339 +175,246 @@ defmodule Pleroma.ConfigDBTest do config = insert(:config, value: [groups: [a: 1, b: 2]]) {:ok, deleted} = - ConfigDB.delete(%{group: config.group, key: config.key, subkeys: [":groups"]}) + ConfigDB.delete_or_update(%{group: config.group, key: config.key, subkeys: [:groups]}) assert Ecto.get_meta(deleted, :state) == :deleted refute ConfigDB.get_by_params(%{group: config.group, key: config.key}) end - end - - describe "to_elixir_types/1" do - test "string" do - assert ConfigDB.to_elixir_types("value as string") == "value as string" - end - - test "boolean" do - assert ConfigDB.to_elixir_types(false) == false - end - test "nil" do - assert ConfigDB.to_elixir_types(nil) == nil + test "delete struct" do + config = insert(:config) + {:ok, config} = ConfigDB.delete(config) + assert Ecto.get_meta(config, :state) == :deleted + assert Pleroma.Repo.aggregate(ConfigDB, :count) == 0 end + end - test "integer" do - assert ConfigDB.to_elixir_types(150) == 150 - end + test "all/0" do + config = insert(:config) - test "atom" do - assert ConfigDB.to_elixir_types(":atom") == :atom - end + assert [^config] = ConfigDB.all() + end - test "ssl options" do - assert ConfigDB.to_elixir_types([":tlsv1", ":tlsv1.1", ":tlsv1.2"]) == [ - :tlsv1, - :"tlsv1.1", - :"tlsv1.2" - ] - end + describe "reduce_defaults_and_merge_with_changes/2" do + test "common changes" do + defaults = [ + pleroma: [ + key1: [k1: 1, k2: 1, k3: 1], + key2: [k1: 2, k2: 2, k3: 2] + ], + logger: [k1: 3, k2: 3] + ] - test "pleroma module" do - assert ConfigDB.to_elixir_types("Pleroma.Bookmark") == Pleroma.Bookmark - end + config1 = insert(:config, key: :key1, value: [k1: 4, k2: 4]) + config2 = insert(:config, key: :key2, value: [k1: 5, k2: 5]) - test "pleroma string" do - assert ConfigDB.to_elixir_types("Pleroma") == "Pleroma" - end + {changes, [logger: [k1: 3, k2: 3]]} = + ConfigDB.reduce_defaults_and_merge_with_changes([config1, config2], defaults) - test "phoenix module" do - assert ConfigDB.to_elixir_types("Phoenix.Socket.V1.JSONSerializer") == - Phoenix.Socket.V1.JSONSerializer - end + Enum.each(changes, fn + %{key: :key1, value: value} -> + assert value == [k3: 1, k1: 4, k2: 4] - test "tesla module" do - assert ConfigDB.to_elixir_types("Tesla.Adapter.Hackney") == Tesla.Adapter.Hackney + %{key: :key2, value: value} -> + assert value == [k3: 2, k1: 5, k2: 5] + end) end - test "ExSyslogger module" do - assert ConfigDB.to_elixir_types("ExSyslogger") == ExSyslogger - end + test "changes for group without key" do + defaults = [ + cors_plug: [ + max_age: 86_400, + methods: ["POST", "PUT", "DELETE", "GET", "PATCH", "OPTIONS"] + ], + pleroma: [key1: [k1: 1, k2: 1, k3: 1]] + ] - test "Quack.Logger module" do - assert ConfigDB.to_elixir_types("Quack.Logger") == Quack.Logger - end + config = insert(:config, group: :cors_plug, key: nil, value: [max_age: 60_000]) - test "Swoosh.Adapters modules" do - assert ConfigDB.to_elixir_types("Swoosh.Adapters.SMTP") == Swoosh.Adapters.SMTP - assert ConfigDB.to_elixir_types("Swoosh.Adapters.AmazonSES") == Swoosh.Adapters.AmazonSES - end + {[change], [pleroma: [key1: [k1: 1, k2: 1, k3: 1]]]} = + ConfigDB.reduce_defaults_and_merge_with_changes([config], defaults) - test "sigil" do - assert ConfigDB.to_elixir_types("~r[comp[lL][aA][iI][nN]er]") == ~r/comp[lL][aA][iI][nN]er/ + assert change.value == [ + methods: ["POST", "PUT", "DELETE", "GET", "PATCH", "OPTIONS"], + max_age: 60_000 + ] end - test "link sigil" do - assert ConfigDB.to_elixir_types("~r/https:\/\/example.com/") == ~r/https:\/\/example.com/ - end + test "for logger backend setting and others" do + defaults = [ + logger: [ + ex_syslogger: [k1: 1, k2: 1], + console: [k1: 2, k2: 2], + backends: [:ex_syslogger, :console], + key: 1 + ], + pleroma: [key1: 1, key2: 2] + ] - test "link sigil with um modifiers" do - assert ConfigDB.to_elixir_types("~r/https:\/\/example.com/um") == - ~r/https:\/\/example.com/um - end + logger = + insert(:config, + group: :logger, + key: nil, + value: [ex_syslogger: [k1: 3, k2: 4], backends: [:console]] + ) - test "link sigil with i modifier" do - assert ConfigDB.to_elixir_types("~r/https:\/\/example.com/i") == ~r/https:\/\/example.com/i - end + {[change], [pleroma: [key1: 1, key2: 2]]} = + ConfigDB.reduce_defaults_and_merge_with_changes([logger], defaults) - test "link sigil with s modifier" do - assert ConfigDB.to_elixir_types("~r/https:\/\/example.com/s") == ~r/https:\/\/example.com/s + assert change.value == [ + console: [k1: 2, k2: 2], + key: 1, + ex_syslogger: [k1: 3, k2: 4], + backends: [:console] + ] end - test "raise if valid delimiter not found" do - assert_raise ArgumentError, "valid delimiter for Regex expression not found", fn -> - ConfigDB.to_elixir_types("~r/https://[]{}<>\"'()|example.com/s") - end - end + test "with ex_syslogger, console and backends changes" do + defaults = [ + logger: [ + ex_syslogger: [k1: 1, k2: 1], + console: [k1: 2, k2: 2], + backends: [:ex_syslogger, :console], + key: 1 + ], + pleroma: [key1: 1, key2: 2] + ] - test "2 child tuple" do - assert ConfigDB.to_elixir_types(%{"tuple" => ["v1", ":v2"]}) == {"v1", :v2} - end + logger = + insert(:config, + group: :logger, + key: nil, + value: [console: [k1: 4, k2: 4], k1: 3, k2: 4, backends: [:console]] + ) - test "proxy tuple with localhost" do - assert ConfigDB.to_elixir_types(%{ - "tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}] - }) == {:proxy_url, {:socks5, :localhost, 1234}} - end + {[change], [pleroma: [key1: 1, key2: 2]]} = + ConfigDB.reduce_defaults_and_merge_with_changes([logger], defaults) - test "proxy tuple with domain" do - assert ConfigDB.to_elixir_types(%{ - "tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}] - }) == {:proxy_url, {:socks5, 'domain.com', 1234}} + assert change.value == [ + ex_syslogger: [k1: 1, k2: 1], + key: 1, + console: [k1: 4, k2: 4], + k1: 3, + k2: 4, + backends: [:console] + ] end + end - test "proxy tuple with ip" do - assert ConfigDB.to_elixir_types(%{ - "tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}] - }) == {:proxy_url, {:socks5, {127, 0, 0, 1}, 1234}} - end + test "all_with_db/0" do + config = insert(:config) + [change] = ConfigDB.all_with_db() + assert change.db == Keyword.keys(config.value) + end - test "tuple with n childs" do - assert ConfigDB.to_elixir_types(%{ - "tuple" => [ - "v1", - ":v2", - "Pleroma.Bookmark", - 150, - false, - "Phoenix.Socket.V1.JSONSerializer" + test "from_keyword_to_structs/2" do + keyword = [ + pleroma: [ + key1: [k1: 1, k2: 1, k3: 1], + key2: [k1: 2, k2: 2, k3: 2] + ], + logger: [k1: 3, k2: 3, ex_syslogger: [k1: 4, k2: 4], console: [k1: 5, k2: 5]] + ] + + changes = ConfigDB.from_keyword_to_structs(keyword) + + Enum.each(changes, fn + %{key: :key1} = change -> + assert change.group == :pleroma + assert change.value == [k1: 1, k2: 1, k3: 1] + + %{key: :key2} = change -> + assert change.group == :pleroma + assert change.value == [k1: 2, k2: 2, k3: 2] + + %{key: nil} = change -> + assert change.group == :logger + + assert change.value == [ + k1: 3, + k2: 3, + ex_syslogger: [k1: 4, k2: 4], + console: [k1: 5, k2: 5] ] - }) == {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer} - end + end) + end - test "map with string key" do - assert ConfigDB.to_elixir_types(%{"key" => "value"}) == %{"key" => "value"} - end + describe "merge_changes_with_defaults/2" do + test "with existance changes" do + defaults = [ + pleroma: [ + key1: [k1: 1, k2: 1, k3: 1], + key2: [k1: 2, k2: 2, k3: 2] + ], + logger: [k1: 3, k2: 3] + ] - test "map with atom key" do - assert ConfigDB.to_elixir_types(%{":key" => "value"}) == %{key: "value"} - end + config1 = insert(:config, key: :key1, value: [k1: 4, k2: 4]) + config2 = insert(:config, key: :key2, value: [k1: 5, k2: 5]) - test "list of strings" do - assert ConfigDB.to_elixir_types(["v1", "v2", "v3"]) == ["v1", "v2", "v3"] - end + changes = ConfigDB.merge_changes_with_defaults([config1, config2], defaults) - test "list of modules" do - assert ConfigDB.to_elixir_types(["Pleroma.Repo", "Pleroma.Activity"]) == [ - Pleroma.Repo, - Pleroma.Activity - ] + Enum.each(changes, fn + %{key: :key1} = change -> assert change.value == [k3: 1, k1: 4, k2: 4] + %{key: :key2} = change -> assert change.value == [k3: 2, k1: 5, k2: 5] + end) end - test "list of atoms" do - assert ConfigDB.to_elixir_types([":v1", ":v2", ":v3"]) == [:v1, :v2, :v3] - end + test "full subkey update and deep merge" do + defaults = [ + pleroma: [ + assets: [ + mascots: [3, 4], + subkey: [key1: [key: :val2, key2: :val2], key2: :val2], + key: 5 + ] + ] + ] - test "list of mixed values" do - assert ConfigDB.to_elixir_types([ - "v1", - ":v2", - "Pleroma.Repo", - "Phoenix.Socket.V1.JSONSerializer", - 15, - false - ]) == [ - "v1", - :v2, - Pleroma.Repo, - Phoenix.Socket.V1.JSONSerializer, - 15, - false - ] - end + config = + insert(:config, + group: :pleroma, + key: :assets, + value: [mascots: [1, 2], subkey: [key1: [key: :val1, key2: :val1], key2: :val1]] + ) - test "simple keyword" do - assert ConfigDB.to_elixir_types([%{"tuple" => [":key", "value"]}]) == [key: "value"] - end + [merged] = ConfigDB.merge_changes_with_defaults([config], defaults) - test "keyword" do - assert ConfigDB.to_elixir_types([ - %{"tuple" => [":types", "Pleroma.PostgresTypes"]}, - %{"tuple" => [":telemetry_event", ["Pleroma.Repo.Instrumenter"]]}, - %{"tuple" => [":migration_lock", nil]}, - %{"tuple" => [":key1", 150]}, - %{"tuple" => [":key2", "string"]} - ]) == [ - types: Pleroma.PostgresTypes, - telemetry_event: [Pleroma.Repo.Instrumenter], - migration_lock: nil, - key1: 150, - key2: "string" + assert merged.value == [ + mascots: [1, 2], + key: 5, + subkey: [key1: [key: :val1, key2: :val1], key2: :val1] ] end - test "trandformed keyword" do - assert ConfigDB.to_elixir_types(a: 1, b: 2, c: "string") == [a: 1, b: 2, c: "string"] - end + test "merge for other subkeys" do + defaults = [pleroma: [assets: [key: 5]]] - test "complex keyword with nested mixed childs" do - assert ConfigDB.to_elixir_types([ - %{"tuple" => [":uploader", "Pleroma.Uploaders.Local"]}, - %{"tuple" => [":filters", ["Pleroma.Upload.Filter.Dedupe"]]}, - %{"tuple" => [":link_name", true]}, - %{"tuple" => [":proxy_remote", false]}, - %{"tuple" => [":common_map", %{":key" => "value"}]}, - %{ - "tuple" => [ - ":proxy_opts", - [ - %{"tuple" => [":redirect_on_failure", false]}, - %{"tuple" => [":max_body_length", 1_048_576]}, - %{ - "tuple" => [ - ":http", - [ - %{"tuple" => [":follow_redirect", true]}, - %{"tuple" => [":pool", ":upload"]} - ] - ] - } - ] - ] - } - ]) == [ - uploader: Pleroma.Uploaders.Local, - filters: [Pleroma.Upload.Filter.Dedupe], - link_name: true, - proxy_remote: false, - common_map: %{key: "value"}, - proxy_opts: [ - redirect_on_failure: false, - max_body_length: 1_048_576, - http: [ - follow_redirect: true, - pool: :upload - ] - ] - ] - end + config = + insert(:config, + group: :pleroma, + key: :assets, + value: [subkey: 3, default_mascot: :test_mascot] + ) - test "common keyword" do - assert ConfigDB.to_elixir_types([ - %{"tuple" => [":level", ":warn"]}, - %{"tuple" => [":meta", [":all"]]}, - %{"tuple" => [":path", ""]}, - %{"tuple" => [":val", nil]}, - %{"tuple" => [":webhook_url", "https://hooks.slack.com/services/YOUR-KEY-HERE"]} - ]) == [ - level: :warn, - meta: [:all], - path: "", - val: nil, - webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE" - ] + [merged] = ConfigDB.merge_changes_with_defaults([config], defaults) + assert merged.value == [key: 5, subkey: 3, default_mascot: :test_mascot] end - test "complex keyword with sigil" do - assert ConfigDB.to_elixir_types([ - %{"tuple" => [":federated_timeline_removal", []]}, - %{"tuple" => [":reject", ["~r/comp[lL][aA][iI][nN]er/"]]}, - %{"tuple" => [":replace", []]} - ]) == [ - federated_timeline_removal: [], - reject: [~r/comp[lL][aA][iI][nN]er/], - replace: [] - ] - end + test "with change deletion" do + defaults = [pleroma: [assets: [key: 5]]] - test "complex keyword with tuples with more than 2 values" do - assert ConfigDB.to_elixir_types([ - %{ - "tuple" => [ - ":http", - [ - %{ - "tuple" => [ - ":key1", - [ - %{ - "tuple" => [ - ":_", - [ - %{ - "tuple" => [ - "/api/v1/streaming", - "Pleroma.Web.MastodonAPI.WebsocketHandler", - [] - ] - }, - %{ - "tuple" => [ - "/websocket", - "Phoenix.Endpoint.CowboyWebSocket", - %{ - "tuple" => [ - "Phoenix.Transports.WebSocket", - %{ - "tuple" => [ - "Pleroma.Web.Endpoint", - "Pleroma.Web.UserSocket", - [] - ] - } - ] - } - ] - }, - %{ - "tuple" => [ - ":_", - "Phoenix.Endpoint.Cowboy2Handler", - %{"tuple" => ["Pleroma.Web.Endpoint", []]} - ] - } - ] - ] - } - ] - ] - } - ] - ] - } - ]) == [ - http: [ - key1: [ - {:_, - [ - {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, - {"/websocket", Phoenix.Endpoint.CowboyWebSocket, - {Phoenix.Transports.WebSocket, - {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}}, - {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}} - ]} - ] - ] - ] + config = + insert(:config, + group: :pleroma, + key: :assets, + value: [subkey: 3, default_mascot: :test_mascot] + ) + + {:ok, config} = ConfigDB.delete(config) + [merged] = ConfigDB.merge_changes_with_defaults([config], defaults) + assert merged.value == [key: 5] end end end |