Merge branch 'develop' into 'remove-twitter-api'
[akkoma] / test / tasks / config_test.exs
index b967dfddeacce487a519a2d9e156656e98e0c6db..04bc947a97643bfd4b50e4b31eccefe5f5e3c878 100644 (file)
@@ -1,11 +1,12 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Mix.Tasks.Pleroma.ConfigTest do
   use Pleroma.DataCase
+
+  alias Pleroma.ConfigDB
   alias Pleroma.Repo
-  alias Pleroma.Web.AdminAPI.Config
 
   setup_all do
     Mix.shell(Mix.Shell.Process)
@@ -19,29 +20,54 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do
     :ok
   end
 
-  clear_config_all([:configurable_from_database]) do
-    Pleroma.Config.put([:configurable_from_database], true)
+  setup_all do: clear_config(:configurable_from_database, true)
+
+  test "error if file with custom settings doesn't exist" do
+    Mix.Tasks.Pleroma.Config.migrate_to_db("config/not_existance_config_file.exs")
+
+    assert_receive {:mix_shell, :info,
+                    [
+                      "To migrate settings, you must define custom settings in config/not_existance_config_file.exs."
+                    ]},
+                   15
   end
 
-  test "settings are migrated to db" do
-    initial = Application.get_env(:quack, :level)
-    on_exit(fn -> Application.put_env(:quack, :level, initial) end)
-    assert Repo.all(Config) == []
+  describe "migrate_to_db/1" do
+    setup do
+      initial = Application.get_env(:quack, :level)
+      on_exit(fn -> Application.put_env(:quack, :level, initial) end)
+    end
+
+    test "filtered settings are migrated to db" do
+      assert Repo.all(ConfigDB) == []
 
-    Application.put_env(:pleroma, :first_setting, key: "value", key2: [Repo])
-    Application.put_env(:pleroma, :second_setting, key: "value2", key2: ["Activity"])
-    Application.put_env(:quack, :level, :info)
+      Mix.Tasks.Pleroma.Config.migrate_to_db("test/fixtures/config/temp.secret.exs")
 
-    Mix.Tasks.Pleroma.Config.run(["migrate_to_db"])
+      config1 = ConfigDB.get_by_params(%{group: ":pleroma", key: ":first_setting"})
+      config2 = ConfigDB.get_by_params(%{group: ":pleroma", key: ":second_setting"})
+      config3 = ConfigDB.get_by_params(%{group: ":quack", key: ":level"})
+      refute ConfigDB.get_by_params(%{group: ":pleroma", key: "Pleroma.Repo"})
+      refute ConfigDB.get_by_params(%{group: ":postgrex", key: ":json_library"})
 
-    config1 = Config.get_by_params(%{group: ":pleroma", key: ":first_setting"})
-    config2 = Config.get_by_params(%{group: ":pleroma", key: ":second_setting"})
-    config3 = Config.get_by_params(%{group: ":quack", key: ":level"})
-    refute Config.get_by_params(%{group: ":pleroma", key: "Pleroma.Repo"})
+      assert ConfigDB.from_binary(config1.value) == [key: "value", key2: [Repo]]
+      assert ConfigDB.from_binary(config2.value) == [key: "value2", key2: ["Activity"]]
+      assert ConfigDB.from_binary(config3.value) == :info
+    end
 
-    assert Config.from_binary(config1.value) == [key: "value", key2: [Repo]]
-    assert Config.from_binary(config2.value) == [key: "value2", key2: ["Activity"]]
-    assert Config.from_binary(config3.value) == :info
+    test "config table is truncated before migration" do
+      ConfigDB.create(%{
+        group: ":pleroma",
+        key: ":first_setting",
+        value: [key: "value", key2: ["Activity"]]
+      })
+
+      assert Repo.aggregate(ConfigDB, :count, :id) == 1
+
+      Mix.Tasks.Pleroma.Config.migrate_to_db("test/fixtures/config/temp.secret.exs")
+
+      config = ConfigDB.get_by_params(%{group: ":pleroma", key: ":first_setting"})
+      assert ConfigDB.from_binary(config.value) == [key: "value", key2: [Repo]]
+    end
   end
 
   describe "with deletion temp file" do
@@ -56,23 +82,23 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do
     end
 
     test "settings are migrated to file and deleted from db", %{temp_file: temp_file} do
-      Config.create(%{
+      ConfigDB.create(%{
         group: ":pleroma",
         key: ":setting_first",
         value: [key: "value", key2: ["Activity"]]
       })
 
-      Config.create(%{
+      ConfigDB.create(%{
         group: ":pleroma",
         key: ":setting_second",
         value: [key: "value2", key2: [Repo]]
       })
 
-      Config.create(%{group: ":quack", key: ":level", value: :info})
+      ConfigDB.create(%{group: ":quack", key: ":level", value: :info})
 
       Mix.Tasks.Pleroma.Config.run(["migrate_from_db", "--env", "temp", "-d"])
 
-      assert Repo.all(Config) == []
+      assert Repo.all(ConfigDB) == []
 
       file = File.read!(temp_file)
       assert file =~ "config :pleroma, :setting_first,"
@@ -81,7 +107,7 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do
     end
 
     test "load a settings with large values and pass to file", %{temp_file: temp_file} do
-      Config.create(%{
+      ConfigDB.create(%{
         group: ":pleroma",
         key: ":instance",
         value: [
@@ -118,7 +144,7 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do
           mrf_transparency_exclusions: [],
           autofollowed_nicknames: [],
           max_pinned_statuses: 1,
-          no_attachment_links: true,
+          attachment_links: false,
           welcome_user_nickname: nil,
           welcome_message: nil,
           max_report_comment_size: 1000,
@@ -151,12 +177,19 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do
 
       Mix.Tasks.Pleroma.Config.run(["migrate_from_db", "--env", "temp", "-d"])
 
-      assert Repo.all(Config) == []
+      assert Repo.all(ConfigDB) == []
       assert File.exists?(temp_file)
       {:ok, file} = File.read(temp_file)
 
+      header =
+        if Code.ensure_loaded?(Config.Reader) do
+          "import Config"
+        else
+          "use Mix.Config"
+        end
+
       assert file ==
-               "use Mix.Config\n\nconfig :pleroma, :instance,\n  name: \"Pleroma\",\n  email: \"example@example.com\",\n  notify_email: \"noreply@example.com\",\n  description: \"A Pleroma instance, an alternative fediverse server\",\n  limit: 5000,\n  chat_limit: 5000,\n  remote_limit: 100_000,\n  upload_limit: 16_000_000,\n  avatar_upload_limit: 2_000_000,\n  background_upload_limit: 4_000_000,\n  banner_upload_limit: 4_000_000,\n  poll_limits: %{\n    max_expiration: 31_536_000,\n    max_option_chars: 200,\n    max_options: 20,\n    min_expiration: 0\n  },\n  registrations_open: true,\n  federating: true,\n  federation_incoming_replies_max_depth: 100,\n  federation_reachability_timeout_days: 7,\n  federation_publisher_modules: [Pleroma.Web.ActivityPub.Publisher],\n  allow_relay: true,\n  rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy,\n  public: true,\n  quarantined_instances: [],\n  managed_config: true,\n  static_dir: \"instance/static/\",\n  allowed_post_formats: [\"text/plain\", \"text/html\", \"text/markdown\", \"text/bbcode\"],\n  mrf_transparency: true,\n  mrf_transparency_exclusions: [],\n  autofollowed_nicknames: [],\n  max_pinned_statuses: 1,\n  no_attachment_links: true,\n  welcome_user_nickname: nil,\n  welcome_message: nil,\n  max_report_comment_size: 1000,\n  safe_dm_mentions: false,\n  healthcheck: false,\n  remote_post_retention_days: 90,\n  skip_thread_containment: true,\n  limit_to_local_content: :unauthenticated,\n  user_bio_length: 5000,\n  user_name_length: 100,\n  max_account_fields: 10,\n  max_remote_account_fields: 20,\n  account_field_name_length: 512,\n  account_field_value_length: 2048,\n  external_user_synchronization: true,\n  extended_nickname_format: true,\n  multi_factor_authentication: [\n    totp: [digits: 6, period: 30],\n    backup_codes: [number: 2, length: 6]\n  ]\n"
+               "#{header}\n\nconfig :pleroma, :instance,\n  name: \"Pleroma\",\n  email: \"example@example.com\",\n  notify_email: \"noreply@example.com\",\n  description: \"A Pleroma instance, an alternative fediverse server\",\n  limit: 5000,\n  chat_limit: 5000,\n  remote_limit: 100_000,\n  upload_limit: 16_000_000,\n  avatar_upload_limit: 2_000_000,\n  background_upload_limit: 4_000_000,\n  banner_upload_limit: 4_000_000,\n  poll_limits: %{\n    max_expiration: 31_536_000,\n    max_option_chars: 200,\n    max_options: 20,\n    min_expiration: 0\n  },\n  registrations_open: true,\n  federating: true,\n  federation_incoming_replies_max_depth: 100,\n  federation_reachability_timeout_days: 7,\n  federation_publisher_modules: [Pleroma.Web.ActivityPub.Publisher],\n  allow_relay: true,\n  rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy,\n  public: true,\n  quarantined_instances: [],\n  managed_config: true,\n  static_dir: \"instance/static/\",\n  allowed_post_formats: [\"text/plain\", \"text/html\", \"text/markdown\", \"text/bbcode\"],\n  mrf_transparency: true,\n  mrf_transparency_exclusions: [],\n  autofollowed_nicknames: [],\n  max_pinned_statuses: 1,\n  attachment_links: false,\n  welcome_user_nickname: nil,\n  welcome_message: nil,\n  max_report_comment_size: 1000,\n  safe_dm_mentions: false,\n  healthcheck: false,\n  remote_post_retention_days: 90,\n  skip_thread_containment: true,\n  limit_to_local_content: :unauthenticated,\n  user_bio_length: 5000,\n  user_name_length: 100,\n  max_account_fields: 10,\n  max_remote_account_fields: 20,\n  account_field_name_length: 512,\n  account_field_value_length: 2048,\n  external_user_synchronization: true,\n  extended_nickname_format: true,\n  multi_factor_authentication: [\n    totp: [digits: 6, period: 30],\n    backup_codes: [number: 2, length: 6]\n  ]\n"
     end
   end
 end