diff options
Diffstat (limited to 'test')
108 files changed, 2585 insertions, 1128 deletions
| diff --git a/test/fixtures/activitypub-client-post-activity.json b/test/fixtures/activitypub-client-post-activity.json index c985e072b..e592081bc 100644 --- a/test/fixtures/activitypub-client-post-activity.json +++ b/test/fixtures/activitypub-client-post-activity.json @@ -3,6 +3,7 @@    "type": "Create",    "object": {      "type": "Note", +    "to": ["https://www.w3.org/ns/activitystreams#Public"],      "content": "It's a note"    },    "to": ["https://www.w3.org/ns/activitystreams#Public"] diff --git a/test/fixtures/config/temp.exported_from_db.secret.exs b/test/fixtures/config/temp.exported_from_db.secret.exs index 64bee7f32..dda5d0fa6 100644 --- a/test/fixtures/config/temp.exported_from_db.secret.exs +++ b/test/fixtures/config/temp.exported_from_db.secret.exs @@ -1,4 +1,4 @@ -use Mix.Config +import Config  config :pleroma, exported_config_merged: true diff --git a/test/fixtures/config/temp.secret.exs b/test/fixtures/config/temp.secret.exs index 4b3af39ec..9c5c88d98 100644 --- a/test/fixtures/config/temp.secret.exs +++ b/test/fixtures/config/temp.secret.exs @@ -2,7 +2,7 @@  # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only -use Mix.Config +import Config  config :pleroma, :first_setting, key: "value", key2: [Pleroma.Repo] diff --git a/test/fixtures/modules/good_mrf.ex b/test/fixtures/modules/good_mrf.ex index 39d0f14ec..5afa1c1d1 100644 --- a/test/fixtures/modules/good_mrf.ex +++ b/test/fixtures/modules/good_mrf.ex @@ -1,5 +1,5 @@  defmodule Fixtures.Modules.GoodMRF do -  @behaviour Pleroma.Web.ActivityPub.MRF +  @behaviour Pleroma.Web.ActivityPub.MRF.Policy    @impl true    def filter(a), do: {:ok, a} diff --git a/test/fixtures/tesla_mock/lemmy-page.json b/test/fixtures/tesla_mock/lemmy-page.json new file mode 100644 index 000000000..f07097a0e --- /dev/null +++ b/test/fixtures/tesla_mock/lemmy-page.json @@ -0,0 +1,17 @@ +{ +  "commentsEnabled": true, +  "sensitive": false, +  "stickied": false, +  "attributedTo": "https://enterprise.lemmy.ml/u/nutomic", +  "summary": "Hello Federation!", +  "url": "https://enterprise.lemmy.ml/pictrs/image/US52d9DPvf.jpg", +  "image": { +    "type": "Image", +    "url": "https://enterprise.lemmy.ml/pictrs/image/lwFAcXHUjS.jpg" +  }, +  "published": "2020-09-14T15:03:11.909105+00:00", +  "to": "https://enterprise.lemmy.ml/c/main", +  "@context": "https://www.w3.org/ns/activitystreams", +  "id": "https://enterprise.lemmy.ml/post/3", +  "type": "Page" +} diff --git a/test/fixtures/tesla_mock/lemmy-user.json b/test/fixtures/tesla_mock/lemmy-user.json new file mode 100644 index 000000000..d0e9066ac --- /dev/null +++ b/test/fixtures/tesla_mock/lemmy-user.json @@ -0,0 +1,27 @@ +{ +  "publicKey": { +    "id": "https://enterprise.lemmy.ml/u/nutomic#main-key", +    "owner": "https://enterprise.lemmy.ml/u/nutomic", +    "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvfwAYPxp1gOk2HcCRoUd\nupoecvmnpzRc5Gu6/N3YQyOyRsrYuiYLNQq2cgM3kcU80ZeEetkwkYgXkRJOKu/b\nBWb7i1zt2tdr5k6lUdW8dfCyjht8ooFPQdov8J3QYHfgBHyUYxuCNfSujryxx2wu\nLQcdjRQa5NIWcomSO8OXmCF5/Yhg2XWCbtnlxEq6Y+AFddr1mAlTOy5pBr5d+xZz\njLw/U3CioNJ79yGi/sJhgp6IyJqtUSoN3b4BgRIEts2QVvn44W1rQy9wCbRYQrO1\nBcB9Wel4k3rJJK8uHg+LpHVMaZppkNaWGkMBhMbzr8qmIlcNWNi7cbMK/p5vyviy\nSwIDAQAB\n-----END PUBLIC KEY-----\n" +  }, +  "inbox": "https://enterprise.lemmy.ml/u/nutomic/inbox", +  "preferredUsername": "Nutomic", +  "endpoints": { +    "sharedInbox": "https://enterprise.lemmy.ml/inbox" +  }, +  "summary": "some bio", +  "icon": { +    "type": "Image", +    "url": "https://enterprise.lemmy.ml/pictrs/image/F6Z7QcWZRJ.jpg" +  }, +  "image": { +    "type": "Image", +    "url": "https://enterprise.lemmy.ml:/pictrs/image/Q79N9oCDEG.png" +  }, +  "published": "2020-09-14T14:54:53.080949+00:00", +  "updated": "2020-10-14T10:58:28.139178+00:00", +  "@context": "https://www.w3.org/ns/activitystreams", +  "id": "https://enterprise.lemmy.ml/u/nutomic", +  "type": "Person", +  "name": "nutomic" +} diff --git a/test/fixtures/video.mp4 b/test/fixtures/video.mp4Binary files differ new file mode 100644 index 000000000..2021e3a5b --- /dev/null +++ b/test/fixtures/video.mp4 diff --git a/test/mix/tasks/pleroma/config_test.exs b/test/mix/tasks/pleroma/config_test.exs index 3ed1e94b8..2b8252db7 100644 --- a/test/mix/tasks/pleroma/config_test.exs +++ b/test/mix/tasks/pleroma/config_test.exs @@ -188,15 +188,8 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do        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 == -               "#{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  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  autofollowed_nicknames: [],\n  max_pinned_statuses: 1,\n  attachment_links: false,\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" +               "import 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  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  autofollowed_nicknames: [],\n  max_pinned_statuses: 1,\n  attachment_links: false,\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 diff --git a/test/mix/tasks/pleroma/ecto/migrate_test.exs b/test/mix/tasks/pleroma/ecto/migrate_test.exs index 5bdfd8f30..3bfdde1c0 100644 --- a/test/mix/tasks/pleroma/ecto/migrate_test.exs +++ b/test/mix/tasks/pleroma/ecto/migrate_test.exs @@ -13,7 +13,7 @@ defmodule Mix.Tasks.Pleroma.Ecto.MigrateTest do      assert capture_log(fn ->               Mix.Tasks.Pleroma.Ecto.Migrate.run() -           end) =~ "[info] Already up" +           end) =~ "[info] Migrations already up"      Logger.configure(level: level)    end diff --git a/test/pleroma/activity_test.exs b/test/pleroma/activity_test.exs index 962bc7e45..4f9144f91 100644 --- a/test/pleroma/activity_test.exs +++ b/test/pleroma/activity_test.exs @@ -123,7 +123,8 @@ defmodule Pleroma.ActivityTest do            "type" => "Note",            "content" => "find me!",            "id" => "http://mastodon.example.org/users/admin/objects/1", -          "attributedTo" => "http://mastodon.example.org/users/admin" +          "attributedTo" => "http://mastodon.example.org/users/admin", +          "to" => ["https://www.w3.org/ns/activitystreams#Public"]          },          "to" => ["https://www.w3.org/ns/activitystreams#Public"]        } @@ -132,6 +133,7 @@ defmodule Pleroma.ActivityTest do        {:ok, japanese_activity} = Pleroma.Web.CommonAPI.post(user, %{status: "更新情報"})        {:ok, job} = Pleroma.Web.Federator.incoming_ap_doc(params)        {:ok, remote_activity} = ObanHelpers.perform(job) +      remote_activity = Activity.get_by_id_with_object(remote_activity.id)        %{          japanese_activity: japanese_activity, diff --git a/test/pleroma/config/deprecation_warnings_test.exs b/test/pleroma/config/deprecation_warnings_test.exs index 15f4982ea..c5e2b20f4 100644 --- a/test/pleroma/config/deprecation_warnings_test.exs +++ b/test/pleroma/config/deprecation_warnings_test.exs @@ -11,6 +11,183 @@ defmodule Pleroma.Config.DeprecationWarningsTest do    alias Pleroma.Config    alias Pleroma.Config.DeprecationWarnings +  describe "simple policy tuples" do +    test "gives warning when there are still strings" do +      clear_config([:mrf_simple], +        media_removal: ["some.removal"], +        media_nsfw: ["some.nsfw"], +        federated_timeline_removal: ["some.tl.removal"], +        report_removal: ["some.report.removal"], +        reject: ["some.reject"], +        followers_only: ["some.followers.only"], +        accept: ["some.accept"], +        avatar_removal: ["some.avatar.removal"], +        banner_removal: ["some.banner.removal"], +        reject_deletes: ["some.reject.deletes"] +      ) + +      assert capture_log(fn -> DeprecationWarnings.check_simple_policy_tuples() end) =~ +               """ +               !!!DEPRECATION WARNING!!! +               Your config is using strings in the SimplePolicy configuration instead of tuples. They should work for now, but you are advised to change to the new configuration to prevent possible issues later: + +               ``` +               config :pleroma, :mrf_simple, +                 media_removal: ["instance.tld"], +                 media_nsfw: ["instance.tld"], +                 federated_timeline_removal: ["instance.tld"], +                 report_removal: ["instance.tld"], +                 reject: ["instance.tld"], +                 followers_only: ["instance.tld"], +                 accept: ["instance.tld"], +                 avatar_removal: ["instance.tld"], +                 banner_removal: ["instance.tld"], +                 reject_deletes: ["instance.tld"] +               ``` + +               Is now + + +               ``` +               config :pleroma, :mrf_simple, +                 media_removal: [{"instance.tld", "Reason for media removal"}], +                 media_nsfw: [{"instance.tld", "Reason for media nsfw"}], +                 federated_timeline_removal: [{"instance.tld", "Reason for federated timeline removal"}], +                 report_removal: [{"instance.tld", "Reason for report removal"}], +                 reject: [{"instance.tld", "Reason for reject"}], +                 followers_only: [{"instance.tld", "Reason for followers only"}], +                 accept: [{"instance.tld", "Reason for accept"}], +                 avatar_removal: [{"instance.tld", "Reason for avatar removal"}], +                 banner_removal: [{"instance.tld", "Reason for banner removal"}], +                 reject_deletes: [{"instance.tld", "Reason for reject deletes"}] +               ``` +               """ +    end + +    test "transforms config to tuples" do +      clear_config([:mrf_simple], +        media_removal: ["some.removal", {"some.other.instance", "Some reason"}] +      ) + +      expected_config = [ +        {:media_removal, [{"some.removal", ""}, {"some.other.instance", "Some reason"}]} +      ] + +      capture_log(fn -> DeprecationWarnings.warn() end) + +      assert Config.get([:mrf_simple]) == expected_config +    end + +    test "doesn't give a warning with correct config" do +      clear_config([:mrf_simple], +        media_removal: [{"some.removal", ""}, {"some.other.instance", "Some reason"}] +      ) + +      assert capture_log(fn -> DeprecationWarnings.check_simple_policy_tuples() end) == "" +    end +  end + +  describe "quarantined_instances tuples" do +    test "gives warning when there are still strings" do +      clear_config([:instance, :quarantined_instances], [ +        {"domain.com", "some reason"}, +        "somedomain.tld" +      ]) + +      assert capture_log(fn -> DeprecationWarnings.check_quarantined_instances_tuples() end) =~ +               """ +               !!!DEPRECATION WARNING!!! +               Your config is using strings in the quarantined_instances configuration instead of tuples. They should work for now, but you are advised to change to the new configuration to prevent possible issues later: + +               ``` +               config :pleroma, :instance, +                 quarantined_instances: ["instance.tld"] +               ``` + +               Is now + + +               ``` +               config :pleroma, :instance, +                 quarantined_instances: [{"instance.tld", "Reason for quarantine"}] +               ``` +               """ +    end + +    test "transforms config to tuples" do +      clear_config([:instance, :quarantined_instances], [ +        {"domain.com", "some reason"}, +        "some.tld" +      ]) + +      expected_config = [{"domain.com", "some reason"}, {"some.tld", ""}] + +      capture_log(fn -> DeprecationWarnings.warn() end) + +      assert Config.get([:instance, :quarantined_instances]) == expected_config +    end + +    test "doesn't give a warning with correct config" do +      clear_config([:instance, :quarantined_instances], [ +        {"domain.com", "some reason"}, +        {"some.tld", ""} +      ]) + +      assert capture_log(fn -> DeprecationWarnings.check_quarantined_instances_tuples() end) == "" +    end +  end + +  describe "transparency_exclusions tuples" do +    test "gives warning when there are still strings" do +      clear_config([:mrf, :transparency_exclusions], [ +        {"domain.com", "some reason"}, +        "somedomain.tld" +      ]) + +      assert capture_log(fn -> DeprecationWarnings.check_transparency_exclusions_tuples() end) =~ +               """ +               !!!DEPRECATION WARNING!!! +               Your config is using strings in the transparency_exclusions configuration instead of tuples. They should work for now, but you are advised to change to the new configuration to prevent possible issues later: + +               ``` +               config :pleroma, :mrf, +                 transparency_exclusions: ["instance.tld"] +               ``` + +               Is now + + +               ``` +               config :pleroma, :mrf, +                 transparency_exclusions: [{"instance.tld", "Reason to exlude transparency"}] +               ``` +               """ +    end + +    test "transforms config to tuples" do +      clear_config([:mrf, :transparency_exclusions], [ +        {"domain.com", "some reason"}, +        "some.tld" +      ]) + +      expected_config = [{"domain.com", "some reason"}, {"some.tld", ""}] + +      capture_log(fn -> DeprecationWarnings.warn() end) + +      assert Config.get([:mrf, :transparency_exclusions]) == expected_config +    end + +    test "doesn't give a warning with correct config" do +      clear_config([:mrf, :transparency_exclusions], [ +        {"domain.com", "some reason"}, +        {"some.tld", ""} +      ]) + +      assert capture_log(fn -> DeprecationWarnings.check_transparency_exclusions_tuples() end) == +               "" +    end +  end +    test "check_old_mrf_config/0" do      clear_config([:instance, :rewrite_policy], [])      clear_config([:instance, :mrf_transparency], true) @@ -146,4 +323,14 @@ defmodule Pleroma.Config.DeprecationWarningsTest do                 "Your config is using old setting name `timeout` instead of `recv_timeout` in pool settings"      end    end + +  test "check_old_chat_shoutbox/0" do +    clear_config([:instance, :chat_limit], 1_000) +    clear_config([:chat, :enabled], true) + +    assert capture_log(fn -> +             DeprecationWarnings.check_old_chat_shoutbox() +           end) =~ +             "Your config is using the old namespace for the Shoutbox configuration." +  end  end diff --git a/test/pleroma/config/transfer_task_test.exs b/test/pleroma/config/transfer_task_test.exs index 8ae5d3b81..9e3f11f1a 100644 --- a/test/pleroma/config/transfer_task_test.exs +++ b/test/pleroma/config/transfer_task_test.exs @@ -82,6 +82,7 @@ defmodule Pleroma.Config.TransferTaskTest do        on_exit(fn -> Restarter.Pleroma.refresh() end)      end +    @tag :erratic      test "don't restart if no reboot time settings were changed" do        clear_config(:emoji)        insert(:config, key: :emoji, value: [groups: [a: 1, b: 2]]) @@ -92,23 +93,26 @@ defmodule Pleroma.Config.TransferTaskTest do               )      end +    @tag :erratic      test "on reboot time key" do -      clear_config(:chat) -      insert(:config, key: :chat, value: [enabled: false]) +      clear_config(:shout) +      insert(:config, key: :shout, value: [enabled: false])        assert capture_log(fn -> TransferTask.start_link([]) end) =~ "pleroma restarted"      end +    @tag :erratic      test "on reboot time subkey" do        clear_config(Pleroma.Captcha)        insert(:config, key: Pleroma.Captcha, value: [seconds_valid: 60])        assert capture_log(fn -> TransferTask.start_link([]) end) =~ "pleroma restarted"      end +    @tag :erratic      test "don't restart pleroma on reboot time key and subkey if there is false flag" do -      clear_config(:chat) +      clear_config(:shout)        clear_config(Pleroma.Captcha) -      insert(:config, key: :chat, value: [enabled: false]) +      insert(:config, key: :shout, value: [enabled: false])        insert(:config, key: Pleroma.Captcha, value: [seconds_valid: 60])        refute String.contains?( diff --git a/test/pleroma/docs/generator_test.exs b/test/pleroma/docs/generator_test.exs index a9b09e577..8574c1d5e 100644 --- a/test/pleroma/docs/generator_test.exs +++ b/test/pleroma/docs/generator_test.exs @@ -23,7 +23,7 @@ defmodule Pleroma.Docs.GeneratorTest do            key: :filters,            type: {:list, :module},            description: "", -          suggestions: {:list_behaviour_implementations, Pleroma.Web.ActivityPub.MRF} +          suggestions: {:list_behaviour_implementations, Pleroma.Web.ActivityPub.MRF.Policy}          },          %{            key: Pleroma.Upload, diff --git a/test/pleroma/ecto_type/activity_pub/object_validators/recipients_test.exs b/test/pleroma/ecto_type/activity_pub/object_validators/recipients_test.exs index d3a2fd13f..4cdafa898 100644 --- a/test/pleroma/ecto_type/activity_pub/object_validators/recipients_test.exs +++ b/test/pleroma/ecto_type/activity_pub/object_validators/recipients_test.exs @@ -6,10 +6,10 @@ defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.RecipientsTest do    alias Pleroma.EctoType.ActivityPub.ObjectValidators.Recipients    use Pleroma.DataCase, async: true -  test "it asserts that all elements of the list are object ids" do +  test "it only keeps elements that are valid object ids" do      list = ["https://lain.com/users/lain", "invalid"] -    assert :error == Recipients.cast(list) +    assert {:ok, ["https://lain.com/users/lain"]} == Recipients.cast(list)    end    test "it works with a list" do diff --git a/test/pleroma/emails/admin_email_test.exs b/test/pleroma/emails/admin_email_test.exs index 04c907697..e65752c23 100644 --- a/test/pleroma/emails/admin_email_test.exs +++ b/test/pleroma/emails/admin_email_test.exs @@ -27,11 +27,7 @@ defmodule Pleroma.Emails.AdminEmailTest do      assert res.subject == "#{config[:name]} Report"      assert res.html_body == -             "<p>Reported by: <a href=\"#{reporter_url}\">#{reporter.nickname}</a></p>\n<p>Reported Account: <a href=\"#{ -               account_url -             }\">#{account.nickname}</a></p>\n<p>Comment: Test comment\n<p> Statuses:\n  <ul>\n    <li><a href=\"#{ -               status_url -             }\">#{status_url}</li>\n  </ul>\n</p>\n\n<p>\n<a href=\"http://localhost:4001/pleroma/admin/#/reports/index\">View Reports in AdminFE</a>\n" +             "<p>Reported by: <a href=\"#{reporter_url}\">#{reporter.nickname}</a></p>\n<p>Reported Account: <a href=\"#{account_url}\">#{account.nickname}</a></p>\n<p>Comment: Test comment\n<p> Statuses:\n  <ul>\n    <li><a href=\"#{status_url}\">#{status_url}</li>\n  </ul>\n</p>\n\n<p>\n<a href=\"http://localhost:4001/pleroma/admin/#/reports/index\">View Reports in AdminFE</a>\n"    end    test "it works when the reporter is a remote user without email" do diff --git a/test/pleroma/formatter_test.exs b/test/pleroma/formatter_test.exs index 7f54638fb..b0f9f41b1 100644 --- a/test/pleroma/formatter_test.exs +++ b/test/pleroma/formatter_test.exs @@ -151,13 +151,7 @@ defmodule Pleroma.FormatterTest do        assert length(mentions) == 3        expected_text = -        ~s(<span class="h-card"><a class="u-url mention" data-user="#{gsimg.id}" href="#{ -          gsimg.ap_id -        }" rel="ugc">@<span>gsimg</span></a></span> According to <span class="h-card"><a class="u-url mention" data-user="#{ -          archaeme.id -        }" href="#{"https://archeme/@archa_eme_"}" rel="ugc">@<span>archa_eme_</span></a></span>, that is @daggsy. Also hello <span class="h-card"><a class="u-url mention" data-user="#{ -          archaeme_remote.id -        }" href="#{archaeme_remote.ap_id}" rel="ugc">@<span>archaeme</span></a></span>) +        ~s(<span class="h-card"><a class="u-url mention" data-user="#{gsimg.id}" href="#{gsimg.ap_id}" rel="ugc">@<span>gsimg</span></a></span> According to <span class="h-card"><a class="u-url mention" data-user="#{archaeme.id}" href="#{"https://archeme/@archa_eme_"}" rel="ugc">@<span>archa_eme_</span></a></span>, that is @daggsy. Also hello <span class="h-card"><a class="u-url mention" data-user="#{archaeme_remote.id}" href="#{archaeme_remote.ap_id}" rel="ugc">@<span>archaeme</span></a></span>)        assert expected_text == text      end @@ -172,9 +166,7 @@ defmodule Pleroma.FormatterTest do        assert length(mentions) == 1        expected_text = -        ~s(<span class="h-card"><a class="u-url mention" data-user="#{mike.id}" href="#{ -          mike.ap_id -        }" rel="ugc">@<span>mike</span></a></span> test) +        ~s(<span class="h-card"><a class="u-url mention" data-user="#{mike.id}" href="#{mike.ap_id}" rel="ugc">@<span>mike</span></a></span> test)        assert expected_text == text      end @@ -210,13 +202,7 @@ defmodule Pleroma.FormatterTest do        assert mentions == [{"@#{user.nickname}", user}, {"@#{other_user.nickname}", other_user}]        assert expected_text == -               ~s(<span class="h-card"><a class="u-url mention" data-user="#{user.id}" href="#{ -                 user.ap_id -               }" rel="ugc">@<span>#{user.nickname}</span></a></span> <span class="h-card"><a class="u-url mention" data-user="#{ -                 other_user.id -               }" href="#{other_user.ap_id}" rel="ugc">@<span>#{other_user.nickname}</span></a></span> hey dudes i hate <span class="h-card"><a class="u-url mention" data-user="#{ -                 third_user.id -               }" href="#{third_user.ap_id}" rel="ugc">@<span>#{third_user.nickname}</span></a></span>) +               ~s(<span class="h-card"><a class="u-url mention" data-user="#{user.id}" href="#{user.ap_id}" rel="ugc">@<span>#{user.nickname}</span></a></span> <span class="h-card"><a class="u-url mention" data-user="#{other_user.id}" href="#{other_user.ap_id}" rel="ugc">@<span>#{other_user.nickname}</span></a></span> hey dudes i hate <span class="h-card"><a class="u-url mention" data-user="#{third_user.id}" href="#{third_user.ap_id}" rel="ugc">@<span>#{third_user.nickname}</span></a></span>)      end      test "given the 'safe_mention' option, it will still work without any mention" do diff --git a/test/pleroma/http/request_builder_test.exs b/test/pleroma/http/request_builder_test.exs index e9b0c4a8a..433beaac1 100644 --- a/test/pleroma/http/request_builder_test.exs +++ b/test/pleroma/http/request_builder_test.exs @@ -34,24 +34,32 @@ defmodule Pleroma.HTTP.RequestBuilderTest do    describe "add_param/4" do      test "add file parameter" do -      %Request{ -        body: %Tesla.Multipart{ -          boundary: _, -          content_type_params: [], -          parts: [ -            %Tesla.Multipart.Part{ -              body: %File.Stream{ -                line_or_bytes: 2048, -                modes: [:raw, :read_ahead, :read, :binary], -                path: "some-path/filename.png", -                raw: true -              }, -              dispositions: [name: "filename.png", filename: "filename.png"], -              headers: [] -            } -          ] -        } -      } = RequestBuilder.add_param(%Request{}, :file, "filename.png", "some-path/filename.png") +      assert match?( +               %Request{ +                 body: %Tesla.Multipart{ +                   boundary: _, +                   content_type_params: [], +                   parts: [ +                     %Tesla.Multipart.Part{ +                       body: %File.Stream{ +                         line_or_bytes: 2048, +                         modes: [:raw, :read_ahead, :binary], +                         path: "some-path/filename.png", +                         raw: true +                       }, +                       dispositions: [name: "filename.png", filename: "filename.png"], +                       headers: [] +                     } +                   ] +                 } +               }, +               RequestBuilder.add_param( +                 %Request{}, +                 :file, +                 "filename.png", +                 "some-path/filename.png" +               ) +             )      end      test "add key to body" do diff --git a/test/pleroma/instances/instance_test.exs b/test/pleroma/instances/instance_test.exs index bacc0b19b..e49922724 100644 --- a/test/pleroma/instances/instance_test.exs +++ b/test/pleroma/instances/instance_test.exs @@ -6,6 +6,8 @@ defmodule Pleroma.Instances.InstanceTest do    alias Pleroma.Instances    alias Pleroma.Instances.Instance    alias Pleroma.Repo +  alias Pleroma.Tests.ObanHelpers +  alias Pleroma.Web.CommonAPI    use Pleroma.DataCase @@ -158,4 +160,33 @@ defmodule Pleroma.Instances.InstanceTest do                 "Instance.scrape_favicon(\"#{url}\") ignored unreachable host"      end    end + +  test "delete_users_and_activities/1 deletes remote instance users and activities" do +    [mario, luigi, _peach, wario] = +      users = [ +        insert(:user, nickname: "mario@mushroom.kingdom", name: "Mario"), +        insert(:user, nickname: "luigi@mushroom.kingdom", name: "Luigi"), +        insert(:user, nickname: "peach@mushroom.kingdom", name: "Peach"), +        insert(:user, nickname: "wario@greedville.biz", name: "Wario") +      ] + +    {:ok, post1} = CommonAPI.post(mario, %{status: "letsa go!"}) +    {:ok, post2} = CommonAPI.post(luigi, %{status: "itsa me... luigi"}) +    {:ok, post3} = CommonAPI.post(wario, %{status: "WHA-HA-HA!"}) + +    {:ok, job} = Instance.delete_users_and_activities("mushroom.kingdom") +    :ok = ObanHelpers.perform(job) + +    [mario, luigi, peach, wario] = Repo.reload(users) + +    refute mario.is_active +    refute luigi.is_active +    refute peach.is_active +    refute peach.name == "Peach" + +    assert wario.is_active +    assert wario.name == "Wario" + +    assert [nil, nil, %{}] = Repo.reload([post1, post2, post3]) +  end  end diff --git a/test/pleroma/moderation_log_test.exs b/test/pleroma/moderation_log_test.exs index c6c170c45..607301815 100644 --- a/test/pleroma/moderation_log_test.exs +++ b/test/pleroma/moderation_log_test.exs @@ -236,9 +236,7 @@ defmodule Pleroma.ModerationLogTest do        log = Repo.get(ModerationLog, log2.id)        assert log.data["message"] == -               "@#{moderator.nickname} added note 'look at this' to report ##{report.id} on user @#{ -                 user.nickname -               }" +               "@#{moderator.nickname} added note 'look at this' to report ##{report.id} on user @#{user.nickname}"      end      test "logging status sensitivity update", %{moderator: moderator} do diff --git a/test/pleroma/notification_test.exs b/test/pleroma/notification_test.exs index abf1b0410..716af496d 100644 --- a/test/pleroma/notification_test.exs +++ b/test/pleroma/notification_test.exs @@ -129,6 +129,19 @@ defmodule Pleroma.NotificationTest do      end    end +  test "create_poll_notifications/1" do +    [user1, user2, user3, _, _] = insert_list(5, :user) +    question = insert(:question, user: user1) +    activity = insert(:question_activity, question: question) + +    {:ok, _, _} = CommonAPI.vote(user2, question, [0]) +    {:ok, _, _} = CommonAPI.vote(user3, question, [1]) + +    {:ok, notifications} = Notification.create_poll_notifications(activity) + +    assert [user2.id, user3.id, user1.id] == Enum.map(notifications, & &1.user_id) +  end +    describe "CommonApi.post/2 notification-related functionality" do      test_with_mock "creates but does NOT send notification to blocker user",                     Push, @@ -624,6 +637,8 @@ defmodule Pleroma.NotificationTest do          "actor" => user.ap_id,          "object" => %{            "type" => "Note", +          "id" => Pleroma.Web.ActivityPub.Utils.generate_object_id(), +          "to" => ["https://www.w3.org/ns/activitystreams#Public"],            "content" => "message with a Mention tag, but no explicit tagging",            "tag" => [              %{ @@ -655,6 +670,9 @@ defmodule Pleroma.NotificationTest do          "actor" => user.ap_id,          "object" => %{            "type" => "Note", +          "id" => Pleroma.Web.ActivityPub.Utils.generate_object_id(), +          "to" => ["https://www.w3.org/ns/activitystreams#Public"], +          "cc" => [other_user.ap_id],            "content" => "hi everyone",            "attributedTo" => user.ap_id          } @@ -951,6 +969,7 @@ defmodule Pleroma.NotificationTest do          "cc" => [],          "object" => %{            "type" => "Note", +          "id" => remote_user.ap_id <> "/objects/test",            "content" => "Hello!",            "tag" => [              %{ diff --git a/test/pleroma/object/fetcher_test.exs b/test/pleroma/object/fetcher_test.exs index a7ac90348..bd0a6e497 100644 --- a/test/pleroma/object/fetcher_test.exs +++ b/test/pleroma/object/fetcher_test.exs @@ -66,6 +66,14 @@ defmodule Pleroma.Object.FetcherTest do            %Tesla.Env{              status: 500            } + +        %{ +          method: :get, +          url: "https://stereophonic.space/objects/02997b83-3ea7-4b63-94af-ef3aa2d4ed17" +        } -> +          %Tesla.Env{ +            status: 500 +          }        end)        :ok @@ -124,8 +132,7 @@ defmodule Pleroma.Object.FetcherTest do        {:ok, object} =          Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") -      assert activity = Activity.get_create_by_object_ap_id(object.data["id"]) -      assert activity.data["id"] +      assert _activity = Activity.get_create_by_object_ap_id(object.data["id"])        {:ok, object_again} =          Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") diff --git a/test/pleroma/repo/migrations/rename_instance_chat_test.exs b/test/pleroma/repo/migrations/rename_instance_chat_test.exs new file mode 100644 index 000000000..acd45600c --- /dev/null +++ b/test/pleroma/repo/migrations/rename_instance_chat_test.exs @@ -0,0 +1,52 @@ +defmodule Pleroma.Repo.Migrations.RenameInstanceChatTest do +  use Pleroma.DataCase +  import Pleroma.Factory +  import Pleroma.Tests.Helpers +  alias Pleroma.ConfigDB + +  setup do: clear_config([:instance]) +  setup do: clear_config([:chat]) +  setup_all do: require_migration("20200806175913_rename_instance_chat") + +  describe "up/0" do +    test "migrates chat settings to shout", %{migration: migration} do +      insert(:config, group: :pleroma, key: :instance, value: [chat_limit: 6000]) +      insert(:config, group: :pleroma, key: :chat, value: [enabled: true]) + +      assert migration.up() == :ok + +      assert ConfigDB.get_by_params(%{group: :pleroma, key: :chat}) == nil +      assert ConfigDB.get_by_params(%{group: :pleroma, key: :instance}) == nil + +      assert ConfigDB.get_by_params(%{group: :pleroma, key: :shout}).value == [ +               limit: 6000, +               enabled: true +             ] +    end + +    test "does nothing when chat settings are not set", %{migration: migration} do +      assert migration.up() == :noop +      assert ConfigDB.get_by_params(%{group: :pleroma, key: :chat}) == nil +      assert ConfigDB.get_by_params(%{group: :pleroma, key: :shout}) == nil +    end +  end + +  describe "down/0" do +    test "migrates shout settings back to instance and chat", %{migration: migration} do +      insert(:config, group: :pleroma, key: :shout, value: [limit: 42, enabled: true]) + +      assert migration.down() == :ok + +      assert ConfigDB.get_by_params(%{group: :pleroma, key: :chat}).value == [enabled: true] +      assert ConfigDB.get_by_params(%{group: :pleroma, key: :instance}).value == [chat_limit: 42] +      assert ConfigDB.get_by_params(%{group: :pleroma, key: :shout}) == nil +    end + +    test "does nothing when shout settings are not set", %{migration: migration} do +      assert migration.down() == :noop +      assert ConfigDB.get_by_params(%{group: :pleroma, key: :chat}) == nil +      assert ConfigDB.get_by_params(%{group: :pleroma, key: :instance}) == nil +      assert ConfigDB.get_by_params(%{group: :pleroma, key: :shout}) == nil +    end +  end +end diff --git a/test/pleroma/upload/filter/analyze_metadata_test.exs b/test/pleroma/upload/filter/analyze_metadata_test.exs new file mode 100644 index 000000000..4b636a684 --- /dev/null +++ b/test/pleroma/upload/filter/analyze_metadata_test.exs @@ -0,0 +1,33 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Upload.Filter.AnalyzeMetadataTest do +  use Pleroma.DataCase, async: true +  alias Pleroma.Upload.Filter.AnalyzeMetadata + +  test "adds the dimensions and blurhash for images" do +    upload = %Pleroma.Upload{ +      name: "an… image.jpg", +      content_type: "image/jpeg", +      path: Path.absname("test/fixtures/image.jpg"), +      tempfile: Path.absname("test/fixtures/image.jpg") +    } + +    {:ok, :filtered, meta} = AnalyzeMetadata.filter(upload) + +    assert %{width: 1024, height: 768} = meta +    assert meta.blurhash +  end + +  test "adds the dimensions for videos" do +    upload = %Pleroma.Upload{ +      name: "coolvideo.mp4", +      content_type: "video/mp4", +      path: Path.absname("test/fixtures/video.mp4"), +      tempfile: Path.absname("test/fixtures/video.mp4") +    } + +    assert {:ok, :filtered, %{width: 480, height: 480}} = AnalyzeMetadata.filter(upload) +  end +end diff --git a/test/pleroma/user/query_test.exs b/test/pleroma/user/query_test.exs index 357016e3e..363da7665 100644 --- a/test/pleroma/user/query_test.exs +++ b/test/pleroma/user/query_test.exs @@ -34,4 +34,14 @@ defmodule Pleroma.User.QueryTest do        assert %{internal: true} |> Query.build() |> Repo.aggregate(:count) == 2      end    end + +  test "is_suggested param" do +    _user1 = insert(:user, is_suggested: false) +    user2 = insert(:user, is_suggested: true) + +    assert [^user2] = +             %{is_suggested: true} +             |> User.Query.build() +             |> Repo.all() +  end  end diff --git a/test/pleroma/user_test.exs b/test/pleroma/user_test.exs index c6b631499..6cd93c34c 100644 --- a/test/pleroma/user_test.exs +++ b/test/pleroma/user_test.exs @@ -151,7 +151,7 @@ defmodule Pleroma.UserTest do    test "ap_id returns the activity pub id for the user" do      user = UserBuilder.build() -    expected_ap_id = "#{Pleroma.Web.base_url()}/users/#{user.nickname}" +    expected_ap_id = "#{Pleroma.Web.Endpoint.url()}/users/#{user.nickname}"      assert expected_ap_id == User.ap_id(user)    end @@ -480,7 +480,7 @@ defmodule Pleroma.UserTest do              )      test "it sends a welcome chat message when Simple policy applied to local instance" do -      clear_config([:mrf_simple, :media_nsfw], ["localhost"]) +      clear_config([:mrf_simple, :media_nsfw], [{"localhost", ""}])        welcome_user = insert(:user)        clear_config([:welcome, :chat_message, :enabled], true) @@ -1639,9 +1639,9 @@ defmodule Pleroma.UserTest do          follower_count: 9,          following_count: 9001,          is_locked: true, -        is_confirmed: false, +        is_confirmed: true,          password_reset_pending: true, -        is_approved: false, +        is_approved: true,          registration_reason: "ahhhhh",          confirmation_token: "qqqq",          domain_blocks: ["lain.com"], @@ -1649,7 +1649,6 @@ defmodule Pleroma.UserTest do          ap_enabled: true,          is_moderator: true,          is_admin: true, -        mastofe_settings: %{"a" => "b"},          mascot: %{"a" => "b"},          emoji: %{"a" => "b"},          pleroma_settings_store: %{"q" => "x"}, @@ -1669,8 +1668,8 @@ defmodule Pleroma.UserTest do               email: nil,               name: nil,               password_hash: nil, -             keys: nil, -             public_key: nil, +             keys: "RSA begin buplic key", +             public_key: "--PRIVATE KEYE--",               avatar: %{},               tags: [],               last_refreshed_at: nil, @@ -1691,7 +1690,6 @@ defmodule Pleroma.UserTest do               ap_enabled: false,               is_moderator: false,               is_admin: false, -             mastofe_settings: nil,               mascot: nil,               emoji: %{},               pleroma_settings_store: %{}, @@ -1702,6 +1700,56 @@ defmodule Pleroma.UserTest do             } = user    end +  test "delete/1 purges a remote user" do +    user = +      insert(:user, %{ +        name: "qqqqqqq", +        avatar: %{"a" => "b"}, +        banner: %{"a" => "b"}, +        local: false +      }) + +    {:ok, job} = User.delete(user) +    {:ok, _} = ObanHelpers.perform(job) +    user = User.get_by_id(user.id) + +    assert user.name == nil +    assert user.avatar == %{} +    assert user.banner == %{} +  end + +  describe "set_suggestion" do +    test "suggests a user" do +      user = insert(:user, is_suggested: false) +      refute user.is_suggested +      {:ok, user} = User.set_suggestion(user, true) +      assert user.is_suggested +    end + +    test "suggests a list of users" do +      unsuggested_users = [ +        insert(:user, is_suggested: false), +        insert(:user, is_suggested: false), +        insert(:user, is_suggested: false) +      ] + +      {:ok, users} = User.set_suggestion(unsuggested_users, true) + +      assert Enum.count(users) == 3 + +      Enum.each(users, fn user -> +        assert user.is_suggested +      end) +    end + +    test "unsuggests a user" do +      user = insert(:user, is_suggested: true) +      assert user.is_suggested +      {:ok, user} = User.set_suggestion(user, false) +      refute user.is_suggested +    end +  end +    test "get_public_key_for_ap_id fetches a user that's not in the db" do      assert {:ok, _key} = User.get_public_key_for_ap_id("http://mastodon.example.org/users/admin")    end @@ -1870,9 +1918,7 @@ defmodule Pleroma.UserTest do        bio = "A.k.a. @nick@domain.com"        expected_text = -        ~s(A.k.a. <span class="h-card"><a class="u-url mention" data-user="#{remote_user.id}" href="#{ -          remote_user.ap_id -        }" rel="ugc">@<span>nick@domain.com</span></a></span>) +        ~s(A.k.a. <span class="h-card"><a class="u-url mention" data-user="#{remote_user.id}" href="#{remote_user.ap_id}" rel="ugc">@<span>nick@domain.com</span></a></span>)        assert expected_text == User.parse_bio(bio, user)      end @@ -2181,11 +2227,40 @@ defmodule Pleroma.UserTest do        [user: insert(:user)]      end -    test "blank email returns error", %{user: user} do +    test "blank email returns error if we require an email on registration", %{user: user} do +      orig_account_activation_required = +        Pleroma.Config.get([:instance, :account_activation_required]) + +      Pleroma.Config.put([:instance, :account_activation_required], true) + +      on_exit(fn -> +        Pleroma.Config.put( +          [:instance, :account_activation_required], +          orig_account_activation_required +        ) +      end) +        assert {:error, %{errors: [email: {"can't be blank", _}]}} = User.change_email(user, "")        assert {:error, %{errors: [email: {"can't be blank", _}]}} = User.change_email(user, nil)      end +    test "blank email should be fine if we do not require an email on registration", %{user: user} do +      orig_account_activation_required = +        Pleroma.Config.get([:instance, :account_activation_required]) + +      Pleroma.Config.put([:instance, :account_activation_required], false) + +      on_exit(fn -> +        Pleroma.Config.put( +          [:instance, :account_activation_required], +          orig_account_activation_required +        ) +      end) + +      assert {:ok, %User{email: nil}} = User.change_email(user, "") +      assert {:ok, %User{email: nil}} = User.change_email(user, nil) +    end +      test "non unique email returns error", %{user: user} do        %{email: email} = insert(:user) @@ -2201,6 +2276,25 @@ defmodule Pleroma.UserTest do      test "changes email", %{user: user} do        assert {:ok, %User{email: "cofe@cofe.party"}} = User.change_email(user, "cofe@cofe.party")      end + +    test "adds email", %{user: user} do +      orig_account_activation_required = +        Pleroma.Config.get([:instance, :account_activation_required]) + +      Pleroma.Config.put([:instance, :account_activation_required], false) + +      on_exit(fn -> +        Pleroma.Config.put( +          [:instance, :account_activation_required], +          orig_account_activation_required +        ) +      end) + +      assert {:ok, _} = User.change_email(user, "") +      Pleroma.Config.put([:instance, :account_activation_required], true) + +      assert {:ok, %User{email: "cofe2@cofe.party"}} = User.change_email(user, "cofe2@cofe.party") +    end    end    describe "get_cached_by_nickname_or_id" do @@ -2348,13 +2442,16 @@ defmodule Pleroma.UserTest do    test "active_user_count/1" do      insert(:user)      insert(:user, %{local: false}) -    insert(:user, %{last_active_at: Timex.shift(NaiveDateTime.utc_now(), weeks: -5)}) -    insert(:user, %{last_active_at: Timex.shift(NaiveDateTime.utc_now(), weeks: -3)})      insert(:user, %{last_active_at: NaiveDateTime.utc_now()}) +    insert(:user, %{last_active_at: Timex.shift(NaiveDateTime.utc_now(), days: -15)}) +    insert(:user, %{last_active_at: Timex.shift(NaiveDateTime.utc_now(), weeks: -6)}) +    insert(:user, %{last_active_at: Timex.shift(NaiveDateTime.utc_now(), months: -7)}) +    insert(:user, %{last_active_at: Timex.shift(NaiveDateTime.utc_now(), years: -2)})      assert User.active_user_count() == 2 -    assert User.active_user_count(6) == 3 -    assert User.active_user_count(1) == 1 +    assert User.active_user_count(180) == 3 +    assert User.active_user_count(365) == 4 +    assert User.active_user_count(1000) == 5    end    describe "pins" do diff --git a/test/pleroma/web/activity_pub/activity_pub_controller_test.exs b/test/pleroma/web/activity_pub/activity_pub_controller_test.exs index cea4b3a97..50315e21f 100644 --- a/test/pleroma/web/activity_pub/activity_pub_controller_test.exs +++ b/test/pleroma/web/activity_pub/activity_pub_controller_test.exs @@ -539,7 +539,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do          File.read!("test/fixtures/mastodon-post-activity.json")          |> Jason.decode!()          |> Map.put("actor", user.ap_id) -        |> put_in(["object", "attridbutedTo"], user.ap_id) +        |> put_in(["object", "attributedTo"], user.ap_id)        conn =          conn @@ -829,7 +829,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      test "it inserts an incoming activity into the database", %{conn: conn, data: data} do        user = insert(:user) -      data = Map.put(data, "bcc", [user.ap_id]) + +      data = +        data +        |> Map.put("bcc", [user.ap_id]) +        |> Kernel.put_in(["object", "bcc"], [user.ap_id])        conn =          conn @@ -846,8 +850,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        user = insert(:user)        data = -        Map.put(data, "to", user.ap_id) -        |> Map.delete("cc") +        data +        |> Map.put("to", user.ap_id) +        |> Map.put("cc", []) +        |> Kernel.put_in(["object", "to"], user.ap_id) +        |> Kernel.put_in(["object", "cc"], [])        conn =          conn @@ -864,8 +871,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        user = insert(:user)        data = -        Map.put(data, "cc", user.ap_id) -        |> Map.delete("to") +        data +        |> Map.put("to", []) +        |> Map.put("cc", user.ap_id) +        |> Kernel.put_in(["object", "to"], []) +        |> Kernel.put_in(["object", "cc"], user.ap_id)        conn =          conn @@ -883,9 +893,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        user = insert(:user)        data = -        Map.put(data, "bcc", user.ap_id) -        |> Map.delete("to") -        |> Map.delete("cc") +        data +        |> Map.put("to", []) +        |> Map.put("cc", []) +        |> Map.put("bcc", user.ap_id) +        |> Kernel.put_in(["object", "to"], []) +        |> Kernel.put_in(["object", "cc"], []) +        |> Kernel.put_in(["object", "bcc"], user.ap_id)        conn =          conn @@ -1000,29 +1014,34 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert Instances.reachable?(sender_host)      end +    @tag capture_log: true      test "it removes all follower collections but actor's", %{conn: conn} do        [actor, recipient] = insert_pair(:user) -      data = -        File.read!("test/fixtures/activitypub-client-post-activity.json") -        |> Jason.decode!() +      to = [ +        recipient.ap_id, +        recipient.follower_address, +        "https://www.w3.org/ns/activitystreams#Public" +      ] -      object = Map.put(data["object"], "attributedTo", actor.ap_id) +      cc = [recipient.follower_address, actor.follower_address] -      data = -        data -        |> Map.put("id", Utils.generate_object_id()) -        |> Map.put("actor", actor.ap_id) -        |> Map.put("object", object) -        |> Map.put("cc", [ -          recipient.follower_address, -          actor.follower_address -        ]) -        |> Map.put("to", [ -          recipient.ap_id, -          recipient.follower_address, -          "https://www.w3.org/ns/activitystreams#Public" -        ]) +      data = %{ +        "@context" => ["https://www.w3.org/ns/activitystreams"], +        "type" => "Create", +        "id" => Utils.generate_activity_id(), +        "to" => to, +        "cc" => cc, +        "actor" => actor.ap_id, +        "object" => %{ +          "type" => "Note", +          "to" => to, +          "cc" => cc, +          "content" => "It's a note", +          "attributedTo" => actor.ap_id, +          "id" => Utils.generate_object_id() +        } +      }        conn        |> assign(:valid_signature, true) @@ -1032,7 +1051,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        ObanHelpers.perform(all_enqueued(worker: ReceiverWorker)) -      activity = Activity.get_by_ap_id(data["id"]) +      assert activity = Activity.get_by_ap_id(data["id"])        assert activity.id        assert actor.follower_address in activity.recipients @@ -1164,7 +1183,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do          "actor" => remote_actor,          "content" => "test report",          "id" => "https://#{remote_domain}/e3b12fd1-948c-446e-b93b-a5e67edbe1d8", -        "nickname" => reported_user.nickname,          "object" => [            reported_user.ap_id,            note.data["object"] @@ -1316,9 +1334,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do          activity: %{            "@context" => "https://www.w3.org/ns/activitystreams",            "type" => "Create", -          "object" => %{"type" => "Note", "content" => "AP C2S test"}, -          "to" => "https://www.w3.org/ns/activitystreams#Public", -          "cc" => [] +          "object" => %{ +            "type" => "Note", +            "content" => "AP C2S test", +            "to" => "https://www.w3.org/ns/activitystreams#Public", +            "cc" => [] +          }          }        ]      end @@ -1424,19 +1445,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        user = User.get_cached_by_ap_id(note_activity.data["actor"])        data = %{ -        type: "Delete", -        object: %{ -          id: note_object.data["id"] +        "type" => "Delete", +        "object" => %{ +          "id" => note_object.data["id"]          }        } -      conn = +      result =          conn          |> assign(:user, user)          |> put_req_header("content-type", "application/activity+json")          |> post("/users/#{user.nickname}/outbox", data) +        |> json_response(201) -      result = json_response(conn, 201)        assert Activity.get_by_ap_id(result["id"])        assert object = Object.get_by_ap_id(note_object.data["id"]) @@ -1461,7 +1482,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do          |> put_req_header("content-type", "application/activity+json")          |> post("/users/#{user.nickname}/outbox", data) -      assert json_response(conn, 400) +      assert json_response(conn, 403)      end      test "it increases like count when receiving a like action", %{conn: conn} do @@ -1539,7 +1560,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do          |> post("/users/#{user.nickname}/outbox", activity)          |> json_response(400) -      assert result == "Note is over the character limit" +      assert result == "Character limit (5 characters) exceeded, contains 11 characters"      end    end @@ -1916,10 +1937,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do          "object" => %{            "type" => "Note",            "content" => "AP C2S test, attachment", -          "attachment" => [object] -        }, -        "to" => "https://www.w3.org/ns/activitystreams#Public", -        "cc" => [] +          "attachment" => [object], +          "to" => "https://www.w3.org/ns/activitystreams#Public", +          "cc" => [] +        }        }        activity_response = @@ -1966,7 +1987,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      %{nickname: nickname, featured_address: featured_address, pinned_objects: pinned_objects} =        refresh_record(user) -    %{"id" => ^featured_address, "orderedItems" => items} = +    %{"id" => ^featured_address, "orderedItems" => items, "totalItems" => 2} =        conn        |> get("/users/#{nickname}/collections/featured")        |> json_response(200) diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs index 64e12066e..574ef0d71 100644 --- a/test/pleroma/web/activity_pub/activity_pub_test.exs +++ b/test/pleroma/web/activity_pub/activity_pub_test.exs @@ -776,6 +776,32 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      assert Enum.member?(activities, activity_one)    end +  test "doesn't return activities from deactivated users" do +    _user = insert(:user) +    deactivated = insert(:user) +    active = insert(:user) +    {:ok, activity_one} = CommonAPI.post(deactivated, %{status: "hey!"}) +    {:ok, activity_two} = CommonAPI.post(active, %{status: "yay!"}) +    {:ok, _updated_user} = User.set_activation(deactivated, false) + +    activities = ActivityPub.fetch_activities([], %{}) + +    refute Enum.member?(activities, activity_one) +    assert Enum.member?(activities, activity_two) +  end + +  test "always see your own posts even when they address people you block" do +    user = insert(:user) +    blockee = insert(:user) + +    {:ok, _} = User.block(user, blockee) +    {:ok, activity} = CommonAPI.post(user, %{status: "hey! @#{blockee.nickname}"}) + +    activities = ActivityPub.fetch_activities([], %{blocking_user: user}) + +    assert Enum.member?(activities, activity) +  end +    test "doesn't return transitive interactions concerning blocked users" do      blocker = insert(:user)      blockee = insert(:user) @@ -875,6 +901,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      refute repeat_activity in activities    end +  test "see your own posts even when they adress actors from blocked domains" do +    user = insert(:user) + +    domain = "dogwhistle.zone" +    domain_user = insert(:user, %{ap_id: "https://#{domain}/@pundit"}) + +    {:ok, user} = User.block_domain(user, domain) + +    {:ok, activity} = CommonAPI.post(user, %{status: "hey! @#{domain_user.nickname}"}) + +    activities = ActivityPub.fetch_activities([], %{blocking_user: user}) + +    assert Enum.member?(activities, activity) +  end +    test "does return activities from followed users on blocked domains" do      domain = "meanies.social"      domain_user = insert(:user, %{ap_id: "https://#{domain}/@pundit"}) diff --git a/test/pleroma/web/activity_pub/builder_test.exs b/test/pleroma/web/activity_pub/builder_test.exs new file mode 100644 index 000000000..3fe32bce5 --- /dev/null +++ b/test/pleroma/web/activity_pub/builder_test.exs @@ -0,0 +1,48 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.BuilderTest do +  alias Pleroma.Web.ActivityPub.Builder +  alias Pleroma.Web.CommonAPI.ActivityDraft +  use Pleroma.DataCase + +  import Pleroma.Factory + +  describe "note/1" do +    test "returns note data" do +      user = insert(:user) +      note = insert(:note) +      user2 = insert(:user) +      user3 = insert(:user) + +      draft = %ActivityDraft{ +        user: user, +        to: [user2.ap_id], +        context: "2hu", +        content_html: "<h1>This is :moominmamma: note</h1>", +        in_reply_to: note.id, +        tags: [name: "jimm"], +        summary: "test summary", +        cc: [user3.ap_id], +        extra: %{"custom_tag" => "test"} +      } + +      expected = %{ +        "actor" => user.ap_id, +        "attachment" => [], +        "cc" => [user3.ap_id], +        "content" => "<h1>This is :moominmamma: note</h1>", +        "context" => "2hu", +        "sensitive" => false, +        "summary" => "test summary", +        "tag" => ["jimm"], +        "to" => [user2.ap_id], +        "type" => "Note", +        "custom_tag" => "test" +      } + +      assert {:ok, ^expected, []} = Builder.note(draft) +    end +  end +end diff --git a/test/pleroma/web/activity_pub/mrf/object_age_policy_test.exs b/test/pleroma/web/activity_pub/mrf/object_age_policy_test.exs index 137aafd39..2f649a0a4 100644 --- a/test/pleroma/web/activity_pub/mrf/object_age_policy_test.exs +++ b/test/pleroma/web/activity_pub/mrf/object_age_policy_test.exs @@ -22,6 +22,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do    defp get_old_message do      File.read!("test/fixtures/mastodon-post-activity.json")      |> Jason.decode!() +    |> Map.drop(["published"])    end    defp get_new_message do diff --git a/test/pleroma/web/activity_pub/mrf/simple_policy_test.exs b/test/pleroma/web/activity_pub/mrf/simple_policy_test.exs index 5c0aff26e..0a0f51bdb 100644 --- a/test/pleroma/web/activity_pub/mrf/simple_policy_test.exs +++ b/test/pleroma/web/activity_pub/mrf/simple_policy_test.exs @@ -33,7 +33,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "has a matching host" do -      clear_config([:mrf_simple, :media_removal], ["remote.instance"]) +      clear_config([:mrf_simple, :media_removal], [{"remote.instance", "Some reason"}])        media_message = build_media_message()        local_message = build_local_message() @@ -46,7 +46,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "match with wildcard domain" do -      clear_config([:mrf_simple, :media_removal], ["*.remote.instance"]) +      clear_config([:mrf_simple, :media_removal], [{"*.remote.instance", "Whatever reason"}])        media_message = build_media_message()        local_message = build_local_message() @@ -70,7 +70,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "has a matching host" do -      clear_config([:mrf_simple, :media_nsfw], ["remote.instance"]) +      clear_config([:mrf_simple, :media_nsfw], [{"remote.instance", "Whetever"}])        media_message = build_media_message()        local_message = build_local_message() @@ -81,7 +81,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "match with wildcard domain" do -      clear_config([:mrf_simple, :media_nsfw], ["*.remote.instance"]) +      clear_config([:mrf_simple, :media_nsfw], [{"*.remote.instance", "yeah yeah"}])        media_message = build_media_message()        local_message = build_local_message() @@ -115,7 +115,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "has a matching host" do -      clear_config([:mrf_simple, :report_removal], ["remote.instance"]) +      clear_config([:mrf_simple, :report_removal], [{"remote.instance", "muh"}])        report_message = build_report_message()        local_message = build_local_message() @@ -124,7 +124,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "match with wildcard domain" do -      clear_config([:mrf_simple, :report_removal], ["*.remote.instance"]) +      clear_config([:mrf_simple, :report_removal], [{"*.remote.instance", "suya"}])        report_message = build_report_message()        local_message = build_local_message() @@ -159,7 +159,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do          |> URI.parse()          |> Map.fetch!(:host) -      clear_config([:mrf_simple, :federated_timeline_removal], [ftl_message_actor_host]) +      clear_config([:mrf_simple, :federated_timeline_removal], [{ftl_message_actor_host, "uwu"}])        local_message = build_local_message()        assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message) @@ -180,7 +180,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do          |> URI.parse()          |> Map.fetch!(:host) -      clear_config([:mrf_simple, :federated_timeline_removal], ["*." <> ftl_message_actor_host]) +      clear_config([:mrf_simple, :federated_timeline_removal], [ +        {"*." <> ftl_message_actor_host, "owo"} +      ]) +        local_message = build_local_message()        assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message) @@ -203,7 +206,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do        ftl_message = Map.put(ftl_message, "cc", []) -      clear_config([:mrf_simple, :federated_timeline_removal], [ftl_message_actor_host]) +      clear_config([:mrf_simple, :federated_timeline_removal], [ +        {ftl_message_actor_host, "spiderwaifu goes 88w88"} +      ])        assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message)        refute "https://www.w3.org/ns/activitystreams#Public" in ftl_message["to"] @@ -232,7 +237,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "activity has a matching host" do -      clear_config([:mrf_simple, :reject], ["remote.instance"]) +      clear_config([:mrf_simple, :reject], [{"remote.instance", ""}])        remote_message = build_remote_message() @@ -240,7 +245,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "activity matches with wildcard domain" do -      clear_config([:mrf_simple, :reject], ["*.remote.instance"]) +      clear_config([:mrf_simple, :reject], [{"*.remote.instance", ""}])        remote_message = build_remote_message() @@ -248,12 +253,36 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "actor has a matching host" do -      clear_config([:mrf_simple, :reject], ["remote.instance"]) +      clear_config([:mrf_simple, :reject], [{"remote.instance", ""}])        remote_user = build_remote_user()        assert {:reject, _} = SimplePolicy.filter(remote_user)      end + +    test "reject Announce when object would be rejected" do +      clear_config([:mrf_simple, :reject], [{"blocked.tld", ""}]) + +      announce = %{ +        "type" => "Announce", +        "actor" => "https://okay.tld/users/alice", +        "object" => %{"type" => "Note", "actor" => "https://blocked.tld/users/bob"} +      } + +      assert {:reject, _} = SimplePolicy.filter(announce) +    end + +    test "reject by URI object" do +      clear_config([:mrf_simple, :reject], [{"blocked.tld", ""}]) + +      announce = %{ +        "type" => "Announce", +        "actor" => "https://okay.tld/users/alice", +        "object" => "https://blocked.tld/activities/1" +      } + +      assert {:reject, _} = SimplePolicy.filter(announce) +    end    end    describe "when :followers_only" do @@ -298,7 +327,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do          |> URI.parse()          |> Map.fetch!(:host) -      clear_config([:mrf_simple, :followers_only], [actor_domain]) +      clear_config([:mrf_simple, :followers_only], [{actor_domain, ""}])        assert {:ok, new_activity} = SimplePolicy.filter(activity)        assert actor.follower_address in new_activity["cc"] @@ -326,7 +355,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "is not empty but activity doesn't have a matching host" do -      clear_config([:mrf_simple, :accept], ["non.matching.remote"]) +      clear_config([:mrf_simple, :accept], [{"non.matching.remote", ""}])        local_message = build_local_message()        remote_message = build_remote_message() @@ -336,7 +365,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "activity has a matching host" do -      clear_config([:mrf_simple, :accept], ["remote.instance"]) +      clear_config([:mrf_simple, :accept], [{"remote.instance", ""}])        local_message = build_local_message()        remote_message = build_remote_message() @@ -346,7 +375,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "activity matches with wildcard domain" do -      clear_config([:mrf_simple, :accept], ["*.remote.instance"]) +      clear_config([:mrf_simple, :accept], [{"*.remote.instance", ""}])        local_message = build_local_message()        remote_message = build_remote_message() @@ -356,7 +385,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "actor has a matching host" do -      clear_config([:mrf_simple, :accept], ["remote.instance"]) +      clear_config([:mrf_simple, :accept], [{"remote.instance", ""}])        remote_user = build_remote_user() @@ -374,7 +403,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "is not empty but it doesn't have a matching host" do -      clear_config([:mrf_simple, :avatar_removal], ["non.matching.remote"]) +      clear_config([:mrf_simple, :avatar_removal], [{"non.matching.remote", ""}])        remote_user = build_remote_user() @@ -382,7 +411,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "has a matching host" do -      clear_config([:mrf_simple, :avatar_removal], ["remote.instance"]) +      clear_config([:mrf_simple, :avatar_removal], [{"remote.instance", ""}])        remote_user = build_remote_user()        {:ok, filtered} = SimplePolicy.filter(remote_user) @@ -391,7 +420,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "match with wildcard domain" do -      clear_config([:mrf_simple, :avatar_removal], ["*.remote.instance"]) +      clear_config([:mrf_simple, :avatar_removal], [{"*.remote.instance", ""}])        remote_user = build_remote_user()        {:ok, filtered} = SimplePolicy.filter(remote_user) @@ -410,7 +439,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "is not empty but it doesn't have a matching host" do -      clear_config([:mrf_simple, :banner_removal], ["non.matching.remote"]) +      clear_config([:mrf_simple, :banner_removal], [{"non.matching.remote", ""}])        remote_user = build_remote_user() @@ -418,7 +447,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "has a matching host" do -      clear_config([:mrf_simple, :banner_removal], ["remote.instance"]) +      clear_config([:mrf_simple, :banner_removal], [{"remote.instance", ""}])        remote_user = build_remote_user()        {:ok, filtered} = SimplePolicy.filter(remote_user) @@ -427,7 +456,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "match with wildcard domain" do -      clear_config([:mrf_simple, :banner_removal], ["*.remote.instance"]) +      clear_config([:mrf_simple, :banner_removal], [{"*.remote.instance", ""}])        remote_user = build_remote_user()        {:ok, filtered} = SimplePolicy.filter(remote_user) @@ -440,7 +469,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      setup do: clear_config([:mrf_simple, :reject_deletes], [])      test "it accepts deletions even from rejected servers" do -      clear_config([:mrf_simple, :reject], ["remote.instance"]) +      clear_config([:mrf_simple, :reject], [{"remote.instance", ""}])        deletion_message = build_remote_deletion_message() @@ -448,7 +477,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "it accepts deletions even from non-whitelisted servers" do -      clear_config([:mrf_simple, :accept], ["non.matching.remote"]) +      clear_config([:mrf_simple, :accept], [{"non.matching.remote", ""}])        deletion_message = build_remote_deletion_message() @@ -457,10 +486,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do    end    describe "when :reject_deletes is not empty but it doesn't have a matching host" do -    setup do: clear_config([:mrf_simple, :reject_deletes], ["non.matching.remote"]) +    setup do: clear_config([:mrf_simple, :reject_deletes], [{"non.matching.remote", ""}])      test "it accepts deletions even from rejected servers" do -      clear_config([:mrf_simple, :reject], ["remote.instance"]) +      clear_config([:mrf_simple, :reject], [{"remote.instance", ""}])        deletion_message = build_remote_deletion_message() @@ -468,7 +497,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do      end      test "it accepts deletions even from non-whitelisted servers" do -      clear_config([:mrf_simple, :accept], ["non.matching.remote"]) +      clear_config([:mrf_simple, :accept], [{"non.matching.remote", ""}])        deletion_message = build_remote_deletion_message() @@ -477,7 +506,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do    end    describe "when :reject_deletes has a matching host" do -    setup do: clear_config([:mrf_simple, :reject_deletes], ["remote.instance"]) +    setup do: clear_config([:mrf_simple, :reject_deletes], [{"remote.instance", ""}])      test "it rejects the deletion" do        deletion_message = build_remote_deletion_message() @@ -487,7 +516,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do    end    describe "when :reject_deletes match with wildcard domain" do -    setup do: clear_config([:mrf_simple, :reject_deletes], ["*.remote.instance"]) +    setup do: clear_config([:mrf_simple, :reject_deletes], [{"*.remote.instance", ""}])      test "it rejects the deletion" do        deletion_message = build_remote_deletion_message() @@ -498,7 +527,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do    defp build_local_message do      %{ -      "actor" => "#{Pleroma.Web.base_url()}/users/alice", +      "actor" => "#{Pleroma.Web.Endpoint.url()}/users/alice",        "to" => [],        "cc" => []      } diff --git a/test/pleroma/web/activity_pub/mrf/steal_emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/steal_emoji_policy_test.exs index bae57f29a..1b37e4c26 100644 --- a/test/pleroma/web/activity_pub/mrf/steal_emoji_policy_test.exs +++ b/test/pleroma/web/activity_pub/mrf/steal_emoji_policy_test.exs @@ -9,11 +9,6 @@ defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicyTest do    alias Pleroma.Emoji    alias Pleroma.Web.ActivityPub.MRF.StealEmojiPolicy -  setup_all do -    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) -    :ok -  end -    setup do      emoji_path = [:instance, :static_dir] |> Config.get() |> Path.join("emoji/stolen") @@ -49,6 +44,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicyTest do      refute "firedfox" in installed()      refute File.exists?(path) +    Tesla.Mock.mock(fn %{method: :get, url: "https://example.org/emoji/firedfox.png"} -> +      %Tesla.Env{status: 200, body: File.read!("test/fixtures/image.jpg")} +    end) +      clear_config(:mrf_steal_emoji, hosts: ["example.org"], size_limit: 284_468)      assert {:ok, _message} = StealEmojiPolicy.filter(message) @@ -78,6 +77,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicyTest do    test "reject if size is above the limit", %{message: message} do      refute "firedfox" in installed() +    Tesla.Mock.mock(fn %{method: :get, url: "https://example.org/emoji/firedfox.png"} -> +      %Tesla.Env{status: 200, body: File.read!("test/fixtures/image.jpg")} +    end) +      clear_config(:mrf_steal_emoji, hosts: ["example.org"], size_limit: 50_000)      assert {:ok, _message} = StealEmojiPolicy.filter(message) diff --git a/test/pleroma/web/activity_pub/mrf_test.exs b/test/pleroma/web/activity_pub/mrf_test.exs index 61d308b97..6ab27bc86 100644 --- a/test/pleroma/web/activity_pub/mrf_test.exs +++ b/test/pleroma/web/activity_pub/mrf_test.exs @@ -63,6 +63,15 @@ defmodule Pleroma.Web.ActivityPub.MRFTest do      end    end +  describe "instance_list_from_tuples/1" do +    test "returns a list of instances from a list of {instance, reason} tuples" do +      list = [{"some.tld", "a reason"}, {"other.tld", "another reason"}] +      expected = ["some.tld", "other.tld"] + +      assert MRF.instance_list_from_tuples(list) == expected +    end +  end +    describe "describe/0" do      test "it works as expected with noop policy" do        clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.NoOpPolicy]) diff --git a/test/pleroma/web/activity_pub/object_validators/announce_validation_test.exs b/test/pleroma/web/activity_pub/object_validators/announce_validation_test.exs index 939922127..20964e855 100644 --- a/test/pleroma/web/activity_pub/object_validators/announce_validation_test.exs +++ b/test/pleroma/web/activity_pub/object_validators/announce_validation_test.exs @@ -33,6 +33,18 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidationTest do        assert {:ok, _object, _meta} = ObjectValidator.validate(valid_announce, [])      end +    test "keeps announced object context", %{valid_announce: valid_announce} do +      assert %Object{data: %{"context" => object_context}} = +               Object.get_cached_by_ap_id(valid_announce["object"]) + +      {:ok, %{"context" => context}, _} = +        valid_announce +        |> Map.put("context", "https://example.org/invalid_context_id") +        |> ObjectValidator.validate([]) + +      assert context == object_context +    end +      test "returns an error if the object can't be found", %{valid_announce: valid_announce} do        without_object =          valid_announce @@ -51,16 +63,6 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidationTest do        assert {:object, {"can't find object", []}} in cng.errors      end -    test "returns an error if we don't have the actor", %{valid_announce: valid_announce} do -      nonexisting_actor = -        valid_announce -        |> Map.put("actor", "https://gensokyo.2hu/users/raymoo") - -      {:error, cng} = ObjectValidator.validate(nonexisting_actor, []) - -      assert {:actor, {"can't find user", []}} in cng.errors -    end -      test "returns an error if the actor already announced the object", %{        valid_announce: valid_announce,        announcer: announcer, diff --git a/test/pleroma/web/activity_pub/object_validators/article_note_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs index e408c85c3..720c17d8d 100644 --- a/test/pleroma/web/activity_pub/object_validators/article_note_validator_test.exs +++ b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs @@ -2,10 +2,10 @@  # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNoteValidatorTest do +defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest do    use Pleroma.DataCase, async: true -  alias Pleroma.Web.ActivityPub.ObjectValidators.ArticleNoteValidator +  alias Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator    alias Pleroma.Web.ActivityPub.Utils    import Pleroma.Factory @@ -29,7 +29,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNoteValidatorTest do      end      test "a basic note validates", %{note: note} do -      %{valid?: true} = ArticleNoteValidator.cast_and_validate(note) +      %{valid?: true} = ArticleNotePageValidator.cast_and_validate(note)      end    end  end diff --git a/test/pleroma/web/activity_pub/object_validators/attachment_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/attachment_validator_test.exs index b775515e0..9150b8d41 100644 --- a/test/pleroma/web/activity_pub/object_validators/attachment_validator_test.exs +++ b/test/pleroma/web/activity_pub/object_validators/attachment_validator_test.exs @@ -72,5 +72,70 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidatorTest do        assert attachment.mediaType == "image/jpeg"      end + +    test "it handles image dimensions" do +      attachment = %{ +        "url" => [ +          %{ +            "type" => "Link", +            "mediaType" => "image/jpeg", +            "href" => "https://example.com/images/1.jpg", +            "width" => 200, +            "height" => 100 +          } +        ], +        "type" => "Document", +        "name" => nil, +        "mediaType" => "image/jpeg" +      } + +      {:ok, attachment} = +        AttachmentValidator.cast_and_validate(attachment) +        |> Ecto.Changeset.apply_action(:insert) + +      assert [ +               %{ +                 href: "https://example.com/images/1.jpg", +                 type: "Link", +                 mediaType: "image/jpeg", +                 width: 200, +                 height: 100 +               } +             ] = attachment.url + +      assert attachment.mediaType == "image/jpeg" +    end + +    test "it transforms image dimentions to our internal format" do +      attachment = %{ +        "type" => "Document", +        "name" => "Hello world", +        "url" => "https://media.example.tld/1.jpg", +        "width" => 880, +        "height" => 960, +        "mediaType" => "image/jpeg", +        "blurhash" => "eTKL26+HDjcEIBVl;ds+K6t301W.t7nit7y1E,R:v}ai4nXSt7V@of" +      } + +      expected = %AttachmentValidator{ +        type: "Document", +        name: "Hello world", +        mediaType: "image/jpeg", +        blurhash: "eTKL26+HDjcEIBVl;ds+K6t301W.t7nit7y1E,R:v}ai4nXSt7V@of", +        url: [ +          %AttachmentValidator.UrlObjectValidator{ +            type: "Link", +            mediaType: "image/jpeg", +            href: "https://media.example.tld/1.jpg", +            width: 880, +            height: 960 +          } +        ] +      } + +      {:ok, ^expected} = +        AttachmentValidator.cast_and_validate(attachment) +        |> Ecto.Changeset.apply_action(:insert) +    end    end  end diff --git a/test/pleroma/web/activity_pub/object_validators/chat_validation_test.exs b/test/pleroma/web/activity_pub/object_validators/chat_validation_test.exs index 320854187..def2a10b4 100644 --- a/test/pleroma/web/activity_pub/object_validators/chat_validation_test.exs +++ b/test/pleroma/web/activity_pub/object_validators/chat_validation_test.exs @@ -68,7 +68,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatValidationTest do      test "validates for a basic object we build", %{valid_chat_message: valid_chat_message} do        assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, []) -      assert Map.put(valid_chat_message, "attachment", nil) == object +      assert valid_chat_message == object        assert match?(%{"firefox" => _}, object["emoji"])      end diff --git a/test/pleroma/web/activity_pub/object_validators/like_validation_test.exs b/test/pleroma/web/activity_pub/object_validators/like_validation_test.exs index 55f67232e..e9ad817f1 100644 --- a/test/pleroma/web/activity_pub/object_validators/like_validation_test.exs +++ b/test/pleroma/web/activity_pub/object_validators/like_validation_test.exs @@ -40,17 +40,30 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.LikeValidationTest do        assert LikeValidator.cast_and_validate(valid_like).valid?      end -    test "sets the 'to' field to the object actor if no recipients are given", %{ +    test "Add object actor from 'to' field if it doesn't owns the like", %{valid_like: valid_like} do +      user = insert(:user) + +      object_actor = valid_like["actor"] + +      valid_like = +        valid_like +        |> Map.put("actor", user.ap_id) +        |> Map.put("to", []) + +      {:ok, object, _meta} = ObjectValidator.validate(valid_like, []) +      assert object_actor in object["to"] +    end + +    test "Removes object actor from 'to' field if it owns the like", %{        valid_like: valid_like,        user: user      } do -      without_recipients = +      valid_like =          valid_like -        |> Map.delete("to") +        |> Map.put("to", [user.ap_id]) -      {:ok, object, _meta} = ObjectValidator.validate(without_recipients, []) - -      assert object["to"] == [user.ap_id] +      {:ok, object, _meta} = ObjectValidator.validate(valid_like, []) +      refute user.ap_id in object["to"]      end      test "sets the context field to the context of the object if no context is given", %{ @@ -66,16 +79,6 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.LikeValidationTest do        assert object["context"] == post_activity.data["context"]      end -    test "it errors when the actor is missing or not known", %{valid_like: valid_like} do -      without_actor = Map.delete(valid_like, "actor") - -      refute LikeValidator.cast_and_validate(without_actor).valid? - -      with_invalid_actor = Map.put(valid_like, "actor", "invalidactor") - -      refute LikeValidator.cast_and_validate(with_invalid_actor).valid? -    end -      test "it errors when the object is missing or not known", %{valid_like: valid_like} do        without_object = Map.delete(valid_like, "object") diff --git a/test/pleroma/web/activity_pub/publisher_test.exs b/test/pleroma/web/activity_pub/publisher_test.exs index f0ce3d7f2..b50e22bbe 100644 --- a/test/pleroma/web/activity_pub/publisher_test.exs +++ b/test/pleroma/web/activity_pub/publisher_test.exs @@ -38,7 +38,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do          },          %{            "rel" => "http://ostatus.org/schema/1.0/subscribe", -          "template" => "#{Pleroma.Web.base_url()}/ostatus_subscribe?acct={uri}" +          "template" => "#{Pleroma.Web.Endpoint.url()}/ostatus_subscribe?acct={uri}"          }        ] @@ -267,6 +267,80 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do    end    describe "publish/2" do +    test_with_mock "doesn't publish a non-public activity to quarantined instances.", +                   Pleroma.Web.Federator.Publisher, +                   [:passthrough], +                   [] do +      Config.put([:instance, :quarantined_instances], [{"domain.com", "some reason"}]) + +      follower = +        insert(:user, %{ +          local: false, +          inbox: "https://domain.com/users/nick1/inbox", +          ap_enabled: true +        }) + +      actor = insert(:user, follower_address: follower.ap_id) + +      {:ok, follower, actor} = Pleroma.User.follow(follower, actor) +      actor = refresh_record(actor) + +      note_activity = +        insert(:followers_only_note_activity, +          user: actor, +          recipients: [follower.ap_id] +        ) + +      res = Publisher.publish(actor, note_activity) + +      assert res == :ok + +      assert not called( +               Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{ +                 inbox: "https://domain.com/users/nick1/inbox", +                 actor_id: actor.id, +                 id: note_activity.data["id"] +               }) +             ) +    end + +    test_with_mock "Publishes a non-public activity to non-quarantined instances.", +                   Pleroma.Web.Federator.Publisher, +                   [:passthrough], +                   [] do +      Config.put([:instance, :quarantined_instances], [{"somedomain.com", "some reason"}]) + +      follower = +        insert(:user, %{ +          local: false, +          inbox: "https://domain.com/users/nick1/inbox", +          ap_enabled: true +        }) + +      actor = insert(:user, follower_address: follower.ap_id) + +      {:ok, follower, actor} = Pleroma.User.follow(follower, actor) +      actor = refresh_record(actor) + +      note_activity = +        insert(:followers_only_note_activity, +          user: actor, +          recipients: [follower.ap_id] +        ) + +      res = Publisher.publish(actor, note_activity) + +      assert res == :ok + +      assert called( +               Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{ +                 inbox: "https://domain.com/users/nick1/inbox", +                 actor_id: actor.id, +                 id: note_activity.data["id"] +               }) +             ) +    end +      test_with_mock "publishes an activity with BCC to all relevant peers.",                     Pleroma.Web.Federator.Publisher,                     [:passthrough], diff --git a/test/pleroma/web/activity_pub/relay_test.exs b/test/pleroma/web/activity_pub/relay_test.exs index 2aa07d1b5..d6de7d61e 100644 --- a/test/pleroma/web/activity_pub/relay_test.exs +++ b/test/pleroma/web/activity_pub/relay_test.exs @@ -148,7 +148,7 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do        assert {:ok, %Activity{} = activity} = Relay.publish(note)        assert activity.data["type"] == "Announce"        assert activity.data["actor"] == service_actor.ap_id -      assert activity.data["to"] == [service_actor.follower_address] +      assert service_actor.follower_address in activity.data["to"]        assert called(Pleroma.Web.Federator.publish(activity))      end diff --git a/test/pleroma/web/activity_pub/side_effects_test.exs b/test/pleroma/web/activity_pub/side_effects_test.exs index 13167f50a..c6155ed18 100644 --- a/test/pleroma/web/activity_pub/side_effects_test.exs +++ b/test/pleroma/web/activity_pub/side_effects_test.exs @@ -88,6 +88,16 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do        assert User.blocks?(user, blocked)      end +    test "it updates following relationship", %{user: user, blocked: blocked, block: block} do +      {:ok, _, _} = SideEffects.handle(block) + +      refute Pleroma.FollowingRelationship.get(user, blocked) +      assert User.get_follow_state(user, blocked) == nil +      assert User.get_follow_state(blocked, user) == nil +      assert User.get_follow_state(user, blocked, nil) == nil +      assert User.get_follow_state(blocked, user, nil) == nil +    end +      test "it blocks but does not unfollow if the relevant setting is set", %{        user: user,        blocked: blocked, @@ -157,6 +167,30 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do      end    end +  describe "Question objects" do +    setup do +      user = insert(:user) +      question = build(:question, user: user) +      question_activity = build(:question_activity, question: question) +      activity_data = Map.put(question_activity.data, "object", question.data["id"]) +      meta = [object_data: question.data, local: false] + +      {:ok, activity, meta} = ActivityPub.persist(activity_data, meta) + +      %{activity: activity, meta: meta} +    end + +    test "enqueues the poll end", %{activity: activity, meta: meta} do +      {:ok, activity, meta} = SideEffects.handle(activity, meta) + +      assert_enqueued( +        worker: Pleroma.Workers.PollWorker, +        args: %{op: "poll_end", activity_id: activity.id}, +        scheduled_at: NaiveDateTime.from_iso8601!(meta[:object_data]["closed"]) +      ) +    end +  end +    describe "delete users with confirmation pending" do      setup do        user = insert(:user, is_confirmed: false) @@ -518,4 +552,74 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do        end      end    end + +  describe "removing a follower" do +    setup do +      user = insert(:user) +      followed = insert(:user) + +      {:ok, _, _, follow_activity} = CommonAPI.follow(user, followed) + +      {:ok, reject_data, []} = Builder.reject(followed, follow_activity) +      {:ok, reject, _meta} = ActivityPub.persist(reject_data, local: true) + +      %{user: user, followed: followed, reject: reject} +    end + +    test "", %{user: user, followed: followed, reject: reject} do +      assert User.following?(user, followed) +      assert Pleroma.FollowingRelationship.get(user, followed) + +      {:ok, _, _} = SideEffects.handle(reject) + +      refute User.following?(user, followed) +      refute Pleroma.FollowingRelationship.get(user, followed) +      assert User.get_follow_state(user, followed) == nil +      assert User.get_follow_state(user, followed, nil) == nil +    end +  end + +  describe "removing a follower from remote" do +    setup do +      user = insert(:user) +      followed = insert(:user, local: false) + +      # Mock a local-to-remote follow +      {:ok, follow_data, []} = Builder.follow(user, followed) + +      follow_data = +        follow_data +        |> Map.put("state", "accept") + +      {:ok, follow, _meta} = ActivityPub.persist(follow_data, local: true) +      {:ok, _, _} = SideEffects.handle(follow) + +      # Mock a remote-to-local accept +      {:ok, accept_data, _} = Builder.accept(followed, follow) +      {:ok, accept, _} = ActivityPub.persist(accept_data, local: false) +      {:ok, _, _} = SideEffects.handle(accept) + +      # Mock a remote-to-local reject +      {:ok, reject_data, []} = Builder.reject(followed, follow) +      {:ok, reject, _meta} = ActivityPub.persist(reject_data, local: false) + +      %{user: user, followed: followed, reject: reject} +    end + +    test "", %{user: user, followed: followed, reject: reject} do +      assert User.following?(user, followed) +      assert Pleroma.FollowingRelationship.get(user, followed) + +      {:ok, _, _} = SideEffects.handle(reject) + +      refute User.following?(user, followed) +      refute Pleroma.FollowingRelationship.get(user, followed) + +      assert Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(user, followed).data["state"] == +               "reject" + +      assert User.get_follow_state(user, followed) == nil +      assert User.get_follow_state(user, followed, nil) == nil +    end +  end  end diff --git a/test/pleroma/web/activity_pub/transmogrifier/add_remove_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/add_remove_handling_test.exs index fc7757125..b17c0e7bf 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/add_remove_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/add_remove_handling_test.exs @@ -67,7 +67,9 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AddRemoveHandlingTest do        "target" => "https://example.com/users/lain/collections/featured",        "type" => "Add",        "to" => [Pleroma.Constants.as_public()], -      "cc" => ["https://example.com/users/lain/followers"] +      "cc" => ["https://example.com/users/lain/followers"], +      "bcc" => [], +      "bto" => []      }      assert {:ok, activity} = Transmogrifier.handle_incoming(message) @@ -82,7 +84,9 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AddRemoveHandlingTest do        "target" => "https://example.com/users/lain/collections/featured",        "type" => "Remove",        "to" => [Pleroma.Constants.as_public()], -      "cc" => ["https://example.com/users/lain/followers"] +      "cc" => ["https://example.com/users/lain/followers"], +      "bcc" => [], +      "bto" => []      }      assert {:ok, activity} = Transmogrifier.handle_incoming(remove) @@ -161,7 +165,9 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AddRemoveHandlingTest do        "target" => "https://#{host}/users/#{user.nickname}/collections/featured",        "type" => "Add",        "to" => [Pleroma.Constants.as_public()], -      "cc" => ["https://#{host}/users/#{user.nickname}/followers"] +      "cc" => ["https://#{host}/users/#{user.nickname}/followers"], +      "bcc" => [], +      "bto" => []      }      assert {:ok, activity} = Transmogrifier.handle_incoming(message) diff --git a/test/pleroma/web/activity_pub/transmogrifier/announce_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/announce_handling_test.exs index 1886fea3f..524acddaf 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/announce_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/announce_handling_test.exs @@ -150,27 +150,4 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AnnounceHandlingTest do      assert {:error, _e} = Transmogrifier.handle_incoming(data)    end - -  test "it does not clobber the addressing on announce activities" do -    user = insert(:user) -    {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) - -    data = -      File.read!("test/fixtures/mastodon-announce.json") -      |> Jason.decode!() -      |> Map.put("object", Object.normalize(activity, fetch: false).data["id"]) -      |> Map.put("to", ["http://mastodon.example.org/users/admin/followers"]) -      |> Map.put("cc", []) - -    _user = -      insert(:user, -        local: false, -        ap_id: data["actor"], -        follower_address: "http://mastodon.example.org/users/admin/followers" -      ) - -    {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - -    assert data["to"] == ["http://mastodon.example.org/users/admin/followers"] -  end  end diff --git a/test/pleroma/web/activity_pub/transmogrifier/audio_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/audio_handling_test.exs index e733f167d..a0942ce8b 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/audio_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/audio_handling_test.exs @@ -24,6 +24,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AudioHandlingTest do        "actor" => "http://mastodon.example.org/users/admin",        "object" => %{          "type" => "Audio", +        "to" => ["https://www.w3.org/ns/activitystreams#Public"], +        "cc" => [],          "id" => "http://mastodon.example.org/users/admin/listens/1234",          "attributedTo" => "http://mastodon.example.org/users/admin",          "title" => "lain radio episode 1", @@ -61,7 +63,9 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AudioHandlingTest do      assert object.data["to"] == ["https://www.w3.org/ns/activitystreams#Public"] -    assert object.data["cc"] == [] +    assert object.data["cc"] == [ +             "https://channels.tests.funkwhale.audio/federation/actors/compositions/followers" +           ]      assert object.data["url"] == "https://channels.tests.funkwhale.audio/library/tracks/74" @@ -69,8 +73,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AudioHandlingTest do               %{                 "mediaType" => "audio/ogg",                 "type" => "Link", -               "name" => nil, -               "blurhash" => nil,                 "url" => [                   %{                     "href" => diff --git a/test/pleroma/web/activity_pub/transmogrifier/event_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/event_handling_test.exs index c4879fda1..14f5f704a 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/event_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/event_handling_test.exs @@ -31,7 +31,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.EventHandlingTest do               )      assert object.data["to"] == ["https://www.w3.org/ns/activitystreams#Public"] -    assert object.data["cc"] == [] +    assert object.data["cc"] == ["https://mobilizon.org/@tcit/followers"]      assert object.data["url"] ==               "https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39" diff --git a/test/pleroma/web/activity_pub/transmogrifier/note_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/note_handling_test.exs index deb956410..1846b2291 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/note_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/note_handling_test.exs @@ -10,11 +10,11 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do    alias Pleroma.Object    alias Pleroma.User    alias Pleroma.Web.ActivityPub.Transmogrifier +  alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.CommonAPI    import Mock    import Pleroma.Factory -  import ExUnit.CaptureLog    setup_all do      Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -43,36 +43,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do        assert Object.hashtags(object) == ["test"]      end -    test "it cleans up incoming notices which are not really DMs" do -      user = insert(:user) -      other_user = insert(:user) - -      to = [user.ap_id, other_user.ap_id] - -      data = -        File.read!("test/fixtures/mastodon-post-activity.json") -        |> Jason.decode!() -        |> Map.put("to", to) -        |> Map.put("cc", []) - -      object = -        data["object"] -        |> Map.put("to", to) -        |> Map.put("cc", []) - -      data = Map.put(data, "object", object) - -      {:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data) - -      assert data["to"] == [] -      assert data["cc"] == to - -      object_data = Object.normalize(activity, fetch: false).data - -      assert object_data["to"] == [] -      assert object_data["cc"] == to -    end -      test "it ignores an incoming notice if we already have it" do        activity = insert(:note_activity) @@ -147,9 +117,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do          data          |> Map.put("object", object) -      assert capture_log(fn -> -               {:ok, _returned_activity} = Transmogrifier.handle_incoming(data) -             end) =~ "[warn] Couldn't fetch \"https://404.site/whatever\", error: nil" +      assert {:ok, _returned_activity} = Transmogrifier.handle_incoming(data)      end      test "it does not work for deactivated users" do @@ -174,8 +142,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do        assert data["to"] == ["https://www.w3.org/ns/activitystreams#Public"]        assert data["cc"] == [ -               "http://mastodon.example.org/users/admin/followers", -               "http://localtesting.pleroma.lol/users/lain" +               "http://localtesting.pleroma.lol/users/lain", +               "http://mastodon.example.org/users/admin/followers"               ]        assert data["actor"] == "http://mastodon.example.org/users/admin" @@ -188,8 +156,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do        assert object_data["to"] == ["https://www.w3.org/ns/activitystreams#Public"]        assert object_data["cc"] == [ -               "http://mastodon.example.org/users/admin/followers", -               "http://localtesting.pleroma.lol/users/lain" +               "http://localtesting.pleroma.lol/users/lain", +               "http://mastodon.example.org/users/admin/followers"               ]        assert object_data["actor"] == "http://mastodon.example.org/users/admin" @@ -221,8 +189,25 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)        object = Object.normalize(data["object"], fetch: false) -      assert Enum.at(Object.tags(object), 2) == "moo" -      assert Object.hashtags(object) == ["moo"] +      assert match?( +               %{ +                 "href" => "http://localtesting.pleroma.lol/users/lain", +                 "name" => "@lain@localtesting.pleroma.lol", +                 "type" => "Mention" +               }, +               Enum.at(object.data["tag"], 0) +             ) + +      assert match?( +               %{ +                 "href" => "http://mastodon.example.org/tags/moo", +                 "name" => "#moo", +                 "type" => "Hashtag" +               }, +               Enum.at(object.data["tag"], 1) +             ) + +      assert "moo" == Enum.at(object.data["tag"], 2)      end      test "it works for incoming notices with contentMap" do @@ -276,13 +261,11 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do          File.read!("test/fixtures/mastodon-post-activity.json")          |> Jason.decode!()          |> Map.put("actor", user.ap_id) -        |> Map.put("to", nil)          |> Map.put("cc", nil)        object =          data["object"]          |> Map.put("attributedTo", user.ap_id) -        |> Map.put("to", nil)          |> Map.put("cc", nil)          |> Map.put("id", user.ap_id <> "/activities/12345678") @@ -290,8 +273,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) -      assert !is_nil(data["to"]) -      assert !is_nil(data["cc"]) +      refute is_nil(data["cc"])      end      test "it strips internal likes" do @@ -310,9 +292,11 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do        object = Map.put(data["object"], "likes", likes)        data = Map.put(data, "object", object) -      {:ok, %Activity{object: object}} = Transmogrifier.handle_incoming(data) +      {:ok, %Activity{} = activity} = Transmogrifier.handle_incoming(data) + +      object = Object.normalize(activity) -      refute Map.has_key?(object.data, "likes") +      assert object.data["likes"] == []      end      test "it strips internal reactions" do @@ -330,70 +314,46 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do      end      test "it correctly processes messages with non-array to field" do -      user = insert(:user) +      data = +        File.read!("test/fixtures/mastodon-post-activity.json") +        |> Poison.decode!() +        |> Map.put("to", "https://www.w3.org/ns/activitystreams#Public") +        |> put_in(["object", "to"], "https://www.w3.org/ns/activitystreams#Public") -      message = %{ -        "@context" => "https://www.w3.org/ns/activitystreams", -        "to" => "https://www.w3.org/ns/activitystreams#Public", -        "type" => "Create", -        "object" => %{ -          "content" => "blah blah blah", -          "type" => "Note", -          "attributedTo" => user.ap_id, -          "inReplyTo" => nil -        }, -        "actor" => user.ap_id -      } +      assert {:ok, activity} = Transmogrifier.handle_incoming(data) -      assert {:ok, activity} = Transmogrifier.handle_incoming(message) +      assert [ +               "http://localtesting.pleroma.lol/users/lain", +               "http://mastodon.example.org/users/admin/followers" +             ] == activity.data["cc"]        assert ["https://www.w3.org/ns/activitystreams#Public"] == activity.data["to"]      end      test "it correctly processes messages with non-array cc field" do -      user = insert(:user) - -      message = %{ -        "@context" => "https://www.w3.org/ns/activitystreams", -        "to" => user.follower_address, -        "cc" => "https://www.w3.org/ns/activitystreams#Public", -        "type" => "Create", -        "object" => %{ -          "content" => "blah blah blah", -          "type" => "Note", -          "attributedTo" => user.ap_id, -          "inReplyTo" => nil -        }, -        "actor" => user.ap_id -      } +      data = +        File.read!("test/fixtures/mastodon-post-activity.json") +        |> Poison.decode!() +        |> Map.put("cc", "http://mastodon.example.org/users/admin/followers") +        |> put_in(["object", "cc"], "http://mastodon.example.org/users/admin/followers") -      assert {:ok, activity} = Transmogrifier.handle_incoming(message) +      assert {:ok, activity} = Transmogrifier.handle_incoming(data) -      assert ["https://www.w3.org/ns/activitystreams#Public"] == activity.data["cc"] -      assert [user.follower_address] == activity.data["to"] +      assert ["http://mastodon.example.org/users/admin/followers"] == activity.data["cc"] +      assert ["https://www.w3.org/ns/activitystreams#Public"] == activity.data["to"]      end      test "it correctly processes messages with weirdness in address fields" do -      user = insert(:user) - -      message = %{ -        "@context" => "https://www.w3.org/ns/activitystreams", -        "to" => [nil, user.follower_address], -        "cc" => ["https://www.w3.org/ns/activitystreams#Public", ["¿"]], -        "type" => "Create", -        "object" => %{ -          "content" => "…", -          "type" => "Note", -          "attributedTo" => user.ap_id, -          "inReplyTo" => nil -        }, -        "actor" => user.ap_id -      } +      data = +        File.read!("test/fixtures/mastodon-post-activity.json") +        |> Poison.decode!() +        |> Map.put("cc", ["http://mastodon.example.org/users/admin/followers", ["¿"]]) +        |> put_in(["object", "cc"], ["http://mastodon.example.org/users/admin/followers", ["¿"]]) -      assert {:ok, activity} = Transmogrifier.handle_incoming(message) +      assert {:ok, activity} = Transmogrifier.handle_incoming(data) -      assert ["https://www.w3.org/ns/activitystreams#Public"] == activity.data["cc"] -      assert [user.follower_address] == activity.data["to"] +      assert ["http://mastodon.example.org/users/admin/followers"] == activity.data["cc"] +      assert ["https://www.w3.org/ns/activitystreams#Public"] == activity.data["to"]      end    end @@ -419,7 +379,11 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do      } do        clear_config([:instance, :federation_incoming_replies_max_depth], 10) -      {:ok, _activity} = Transmogrifier.handle_incoming(data) +      {:ok, activity} = Transmogrifier.handle_incoming(data) + +      object = Object.normalize(activity.data["object"]) + +      assert object.data["replies"] == items        for id <- items do          job_args = %{"op" => "fetch_remote", "id" => id, "depth" => 1} @@ -442,45 +406,38 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do      setup do: clear_config([:instance, :federation_incoming_replies_max_depth])      setup do -      user = insert(:user) - -      {:ok, activity} = CommonAPI.post(user, %{status: "post1"}) - -      {:ok, reply1} = -        CommonAPI.post(user, %{status: "reply1", in_reply_to_status_id: activity.id}) - -      {:ok, reply2} = -        CommonAPI.post(user, %{status: "reply2", in_reply_to_status_id: activity.id}) - -      replies_uris = Enum.map([reply1, reply2], fn a -> a.object.data["id"] end) - -      {:ok, federation_output} = Transmogrifier.prepare_outgoing(activity.data) +      replies = %{ +        "type" => "Collection", +        "items" => [Utils.generate_object_id(), Utils.generate_object_id()] +      } -      Repo.delete(activity.object) -      Repo.delete(activity) +      activity = +        File.read!("test/fixtures/mastodon-post-activity.json") +        |> Poison.decode!() +        |> Kernel.put_in(["object", "replies"], replies) -      %{federation_output: federation_output, replies_uris: replies_uris} +      %{activity: activity}      end      test "schedules background fetching of `replies` items if max thread depth limit allows", %{ -      federation_output: federation_output, -      replies_uris: replies_uris +      activity: activity      } do        clear_config([:instance, :federation_incoming_replies_max_depth], 1) -      {:ok, _activity} = Transmogrifier.handle_incoming(federation_output) +      assert {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(activity) +      object = Object.normalize(data["object"]) -      for id <- replies_uris do +      for id <- object.data["replies"] do          job_args = %{"op" => "fetch_remote", "id" => id, "depth" => 1}          assert_enqueued(worker: Pleroma.Workers.RemoteFetcherWorker, args: job_args)        end      end      test "does NOT schedule background fetching of `replies` beyond max thread depth limit allows", -         %{federation_output: federation_output} do +         %{activity: activity} do        clear_config([:instance, :federation_incoming_replies_max_depth], 0) -      {:ok, _activity} = Transmogrifier.handle_incoming(federation_output) +      {:ok, _activity} = Transmogrifier.handle_incoming(activity)        assert all_enqueued(worker: Pleroma.Workers.RemoteFetcherWorker) == []      end @@ -498,6 +455,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do          "object" => %{            "to" => ["https://www.w3.org/ns/activitystreams#Public"],            "cc" => [], +          "id" => Utils.generate_object_id(),            "type" => "Note",            "content" => "Hi",            "inReplyTo" => nil, @@ -522,6 +480,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do          "object" => %{            "to" => ["https://www.w3.org/ns/activitystreams#Public"],            "cc" => [], +          "id" => Utils.generate_object_id(),            "type" => "Note",            "content" => "Hi",            "inReplyTo" => nil, diff --git a/test/pleroma/web/activity_pub/transmogrifier/page_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/page_handling_test.exs new file mode 100644 index 000000000..4ac71e066 --- /dev/null +++ b/test/pleroma/web/activity_pub/transmogrifier/page_handling_test.exs @@ -0,0 +1,36 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.PageHandlingTest do +  use Oban.Testing, repo: Pleroma.Repo +  use Pleroma.DataCase + +  alias Pleroma.Object.Fetcher + +  test "Lemmy Page" do +    Tesla.Mock.mock(fn +      %{url: "https://enterprise.lemmy.ml/post/3"} -> +        %Tesla.Env{ +          status: 200, +          headers: [{"content-type", "application/activity+json"}], +          body: File.read!("test/fixtures/tesla_mock/lemmy-page.json") +        } + +      %{url: "https://enterprise.lemmy.ml/u/nutomic"} -> +        %Tesla.Env{ +          status: 200, +          headers: [{"content-type", "application/activity+json"}], +          body: File.read!("test/fixtures/tesla_mock/lemmy-user.json") +        } +    end) + +    {:ok, object} = Fetcher.fetch_object_from_id("https://enterprise.lemmy.ml/post/3") + +    assert object.data["summary"] == "Hello Federation!" +    assert object.data["published"] == "2020-09-14T15:03:11.909105Z" + +    # WAT +    assert object.data["url"] == "https://enterprise.lemmy.ml/pictrs/image/US52d9DPvf.jpg" +  end +end diff --git a/test/pleroma/web/activity_pub/transmogrifier/video_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/video_handling_test.exs index 6ddf7c172..87c53ebf4 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/video_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/video_handling_test.exs @@ -53,14 +53,13 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.VideoHandlingTest do               %{                 "type" => "Link",                 "mediaType" => "video/mp4", -               "name" => nil, -               "blurhash" => nil,                 "url" => [                   %{                     "href" =>                       "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4",                     "mediaType" => "video/mp4", -                   "type" => "Link" +                   "type" => "Link", +                   "width" => 480                   }                 ]               } @@ -76,14 +75,13 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.VideoHandlingTest do               %{                 "type" => "Link",                 "mediaType" => "video/mp4", -               "name" => nil, -               "blurhash" => nil,                 "url" => [                   %{                     "href" =>                       "https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4",                     "mediaType" => "video/mp4", -                   "type" => "Link" +                   "type" => "Link", +                   "height" => 1080                   }                 ]               } @@ -106,14 +104,13 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.VideoHandlingTest do               %{                 "type" => "Link",                 "mediaType" => "video/mp4", -               "name" => nil, -               "blurhash" => nil,                 "url" => [                   %{                     "href" =>                       "https://peertube.stream/static/streaming-playlists/hls/abece3c3-b9c6-47f4-8040-f3eed8c602e6/abece3c3-b9c6-47f4-8040-f3eed8c602e6-1080-fragmented.mp4",                     "mediaType" => "video/mp4", -                   "type" => "Link" +                   "type" => "Link", +                   "height" => 1080                   }                 ]               } diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs index 4c3fcb44a..06daf6a9f 100644 --- a/test/pleroma/web/activity_pub/transmogrifier_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs @@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User    alias Pleroma.Web.ActivityPub.Transmogrifier +  alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.AdminAPI.AccountView    alias Pleroma.Web.CommonAPI @@ -159,8 +160,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, activity} = CommonAPI.post(user, %{status: "hey"})        {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) -      assert modified["@context"] == -               Pleroma.Web.ActivityPub.Utils.make_json_ld_header()["@context"] +      assert modified["@context"] == Utils.make_json_ld_header()["@context"]        assert modified["object"]["conversation"] == modified["context"]      end @@ -446,7 +446,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do            end)        } -      fixed_object = Transmogrifier.fix_explicit_addressing(object) +      fixed_object = Transmogrifier.fix_explicit_addressing(object, user.follower_address)        assert Enum.all?(explicitly_mentioned_actors, &(&1 in fixed_object["to"]))        refute "https://social.beepboop.ga/users/dirb" in fixed_object["to"]        assert "https://social.beepboop.ga/users/dirb" in fixed_object["cc"] @@ -459,7 +459,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do          "cc" => []        } -      fixed_object = Transmogrifier.fix_explicit_addressing(object) +      fixed_object = Transmogrifier.fix_explicit_addressing(object, user.follower_address)        assert user.follower_address in fixed_object["to"]        refute user.follower_address in fixed_object["cc"]      end @@ -473,7 +473,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do          "cc" => [user.follower_address, recipient.follower_address]        } -      fixed_object = Transmogrifier.fix_explicit_addressing(object) +      fixed_object = Transmogrifier.fix_explicit_addressing(object, user.follower_address)        assert user.follower_address in fixed_object["cc"]        refute recipient.follower_address in fixed_object["cc"] @@ -524,4 +524,44 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do                 )      end    end + +  describe "fix_attachments/1" do +    test "puts dimensions into attachment url field" do +      object = %{ +        "attachment" => [ +          %{ +            "type" => "Document", +            "name" => "Hello world", +            "url" => "https://media.example.tld/1.jpg", +            "width" => 880, +            "height" => 960, +            "mediaType" => "image/jpeg", +            "blurhash" => "eTKL26+HDjcEIBVl;ds+K6t301W.t7nit7y1E,R:v}ai4nXSt7V@of" +          } +        ] +      } + +      expected = %{ +        "attachment" => [ +          %{ +            "type" => "Document", +            "name" => "Hello world", +            "url" => [ +              %{ +                "type" => "Link", +                "mediaType" => "image/jpeg", +                "href" => "https://media.example.tld/1.jpg", +                "width" => 880, +                "height" => 960 +              } +            ], +            "mediaType" => "image/jpeg", +            "blurhash" => "eTKL26+HDjcEIBVl;ds+K6t301W.t7nit7y1E,R:v}ai4nXSt7V@of" +          } +        ] +      } + +      assert Transmogrifier.fix_attachments(object) == expected +    end +  end  end diff --git a/test/pleroma/web/activity_pub/utils_test.exs b/test/pleroma/web/activity_pub/utils_test.exs index ee3e1014e..62dc02f61 100644 --- a/test/pleroma/web/activity_pub/utils_test.exs +++ b/test/pleroma/web/activity_pub/utils_test.exs @@ -213,6 +213,20 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do        assert refresh_record(follow_activity).data["state"] == "accept"        assert refresh_record(follow_activity_two).data["state"] == "accept"      end + +    test "also updates the state of accepted follows" do +      user = insert(:user) +      follower = insert(:user) + +      {:ok, _, _, follow_activity} = CommonAPI.follow(follower, user) +      {:ok, _, _, follow_activity_two} = CommonAPI.follow(follower, user) + +      {:ok, follow_activity_two} = +        Utils.update_follow_state_for_all(follow_activity_two, "reject") + +      assert refresh_record(follow_activity).data["state"] == "reject" +      assert refresh_record(follow_activity_two).data["state"] == "reject" +    end    end    describe "update_follow_state/2" do diff --git a/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs b/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs index 8cd9f939b..f8cd103c6 100644 --- a/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs @@ -267,9 +267,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        log_entry = Repo.one(ModerationLog)        assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} revoked admin role from @#{user_one.nickname}, @#{ -                 user_two.nickname -               }" +               "@#{admin.nickname} revoked admin role from @#{user_one.nickname}, @#{user_two.nickname}"      end    end @@ -800,40 +798,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "instances" do -    test "GET /instances/:instance/statuses", %{conn: conn} do -      user = insert(:user, local: false, ap_id: "https://archae.me/users/archaeme") -      user2 = insert(:user, local: false, ap_id: "https://test.com/users/test") -      insert_pair(:note_activity, user: user) -      activity = insert(:note_activity, user: user2) - -      %{"total" => 2, "activities" => activities} = -        conn |> get("/api/pleroma/admin/instances/archae.me/statuses") |> json_response(200) - -      assert length(activities) == 2 - -      %{"total" => 1, "activities" => [_]} = -        conn |> get("/api/pleroma/admin/instances/test.com/statuses") |> json_response(200) - -      %{"total" => 0, "activities" => []} = -        conn |> get("/api/pleroma/admin/instances/nonexistent.com/statuses") |> json_response(200) - -      CommonAPI.repeat(activity.id, user) - -      %{"total" => 2, "activities" => activities} = -        conn |> get("/api/pleroma/admin/instances/archae.me/statuses") |> json_response(200) - -      assert length(activities) == 2 - -      %{"total" => 3, "activities" => activities} = -        conn -        |> get("/api/pleroma/admin/instances/archae.me/statuses?with_reblogs=true") -        |> json_response(200) - -      assert length(activities) == 3 -    end -  end -    describe "PATCH /confirm_email" do      test "it confirms emails of two users", %{conn: conn, admin: admin} do        [first_user, second_user] = insert_pair(:user, is_confirmed: false) @@ -860,9 +824,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        log_entry = Repo.one(ModerationLog)        assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} confirmed email for users: @#{first_user.nickname}, @#{ -                 second_user.nickname -               }" +               "@#{admin.nickname} confirmed email for users: @#{first_user.nickname}, @#{second_user.nickname}"      end    end @@ -883,9 +845,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        log_entry = Repo.one(ModerationLog)        assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} re-sent confirmation email for users: @#{first_user.nickname}, @#{ -                 second_user.nickname -               }" +               "@#{admin.nickname} re-sent confirmation email for users: @#{first_user.nickname}, @#{second_user.nickname}"        ObanHelpers.perform_all() diff --git a/test/pleroma/web/admin_api/controllers/config_controller_test.exs b/test/pleroma/web/admin_api/controllers/config_controller_test.exs index c39c1b1e1..7c786c389 100644 --- a/test/pleroma/web/admin_api/controllers/config_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/config_controller_test.exs @@ -409,7 +409,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do      end      test "saving config which need pleroma reboot", %{conn: conn} do -      clear_config([:chat, :enabled], true) +      clear_config([:shout, :enabled], true)        assert conn               |> put_req_header("content-type", "application/json") @@ -417,7 +417,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do                 "/api/pleroma/admin/config",                 %{                   configs: [ -                   %{group: ":pleroma", key: ":chat", value: [%{"tuple" => [":enabled", true]}]} +                   %{group: ":pleroma", key: ":shout", value: [%{"tuple" => [":enabled", true]}]}                   ]                 }               ) @@ -426,7 +426,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do                   %{                     "db" => [":enabled"],                     "group" => ":pleroma", -                   "key" => ":chat", +                   "key" => ":shout",                     "value" => [%{"tuple" => [":enabled", true]}]                   }                 ], @@ -454,7 +454,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do      end      test "update setting which need reboot, don't change reboot flag until reboot", %{conn: conn} do -      clear_config([:chat, :enabled], true) +      clear_config([:shout, :enabled], true)        assert conn               |> put_req_header("content-type", "application/json") @@ -462,7 +462,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do                 "/api/pleroma/admin/config",                 %{                   configs: [ -                   %{group: ":pleroma", key: ":chat", value: [%{"tuple" => [":enabled", true]}]} +                   %{group: ":pleroma", key: ":shout", value: [%{"tuple" => [":enabled", true]}]}                   ]                 }               ) @@ -471,7 +471,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do                   %{                     "db" => [":enabled"],                     "group" => ":pleroma", -                   "key" => ":chat", +                   "key" => ":shout",                     "value" => [%{"tuple" => [":enabled", true]}]                   }                 ], @@ -1427,30 +1427,27 @@ defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do          ]        } -      res = -        assert conn -               |> put_req_header("content-type", "application/json") -               |> post("/api/pleroma/admin/config", %{"configs" => [params]}) -               |> json_response_and_validate_schema(200) - -      assert res == %{ -               "configs" => [ -                 %{ -                   "db" => [":instance_thumbnail"], -                   "group" => ":pleroma", -                   "key" => ":instance", -                   "value" => params["value"] -                 } -               ], -               "need_reboot" => false -             } - -      _res = -        assert conn -               |> get("/api/v1/instance") -               |> json_response_and_validate_schema(200) +      assert conn +             |> put_req_header("content-type", "application/json") +             |> post("/api/pleroma/admin/config", %{"configs" => [params]}) +             |> json_response_and_validate_schema(200) == +               %{ +                 "configs" => [ +                   %{ +                     "db" => [":instance_thumbnail"], +                     "group" => ":pleroma", +                     "key" => ":instance", +                     "value" => params["value"] +                   } +                 ], +                 "need_reboot" => false +               } -      assert res = %{"thumbnail" => "https://example.com/media/new_thumbnail.jpg"} +      assert conn +             |> get("/api/v1/instance") +             |> json_response_and_validate_schema(200) +             |> Map.take(["thumbnail"]) == +               %{"thumbnail" => "https://example.com/media/new_thumbnail.jpg"}      end      test "Concurrent Limiter", %{conn: conn} do diff --git a/test/pleroma/web/admin_api/controllers/frontend_controller_test.exs b/test/pleroma/web/admin_api/controllers/frontend_controller_test.exs index bc827cc12..200682ba9 100644 --- a/test/pleroma/web/admin_api/controllers/frontend_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/frontend_controller_test.exs @@ -42,6 +42,20 @@ defmodule Pleroma.Web.AdminAPI.FrontendControllerTest do        refute Enum.any?(response, fn frontend -> frontend["installed"] == true end)      end + +    test "it lists available frontends when no frontend folder was created yet", %{conn: conn} do +      File.rm_rf(@dir) + +      response = +        conn +        |> get("/api/pleroma/admin/frontends") +        |> json_response_and_validate_schema(:ok) + +      assert Enum.map(response, & &1["name"]) == +               Enum.map(Config.get([:frontends, :available]), fn {_, map} -> map["name"] end) + +      refute Enum.any?(response, fn frontend -> frontend["installed"] == true end) +    end    end    describe "POST /api/pleroma/admin/frontends/install" do diff --git a/test/pleroma/web/admin_api/controllers/instance_controller_test.exs b/test/pleroma/web/admin_api/controllers/instance_controller_test.exs new file mode 100644 index 000000000..c78307fc8 --- /dev/null +++ b/test/pleroma/web/admin_api/controllers/instance_controller_test.exs @@ -0,0 +1,80 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.InstanceControllerTest do +  use Pleroma.Web.ConnCase +  use Oban.Testing, repo: Pleroma.Repo + +  import Pleroma.Factory + +  alias Pleroma.Repo +  alias Pleroma.Tests.ObanHelpers +  alias Pleroma.Web.CommonAPI + +  setup_all do +    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) + +    :ok +  end + +  setup do +    admin = insert(:user, is_admin: true) +    token = insert(:oauth_admin_token, user: admin) + +    conn = +      build_conn() +      |> assign(:user, admin) +      |> assign(:token, token) + +    {:ok, %{admin: admin, token: token, conn: conn}} +  end + +  test "GET /instances/:instance/statuses", %{conn: conn} do +    user = insert(:user, local: false, ap_id: "https://archae.me/users/archaeme") +    user2 = insert(:user, local: false, ap_id: "https://test.com/users/test") +    insert_pair(:note_activity, user: user) +    activity = insert(:note_activity, user: user2) + +    %{"total" => 2, "activities" => activities} = +      conn |> get("/api/pleroma/admin/instances/archae.me/statuses") |> json_response(200) + +    assert length(activities) == 2 + +    %{"total" => 1, "activities" => [_]} = +      conn |> get("/api/pleroma/admin/instances/test.com/statuses") |> json_response(200) + +    %{"total" => 0, "activities" => []} = +      conn |> get("/api/pleroma/admin/instances/nonexistent.com/statuses") |> json_response(200) + +    CommonAPI.repeat(activity.id, user) + +    %{"total" => 2, "activities" => activities} = +      conn |> get("/api/pleroma/admin/instances/archae.me/statuses") |> json_response(200) + +    assert length(activities) == 2 + +    %{"total" => 3, "activities" => activities} = +      conn +      |> get("/api/pleroma/admin/instances/archae.me/statuses?with_reblogs=true") +      |> json_response(200) + +    assert length(activities) == 3 +  end + +  test "DELETE /instances/:instance", %{conn: conn} do +    user = insert(:user, nickname: "lain@lain.com") +    post = insert(:note_activity, user: user) + +    response = +      conn +      |> delete("/api/pleroma/admin/instances/lain.com") +      |> json_response(200) + +    [:ok] = ObanHelpers.perform_all() + +    assert response == "lain.com" +    refute Repo.reload(user).is_active +    refute Repo.reload(post) +  end +end diff --git a/test/pleroma/web/admin_api/controllers/media_proxy_cache_controller_test.exs b/test/pleroma/web/admin_api/controllers/media_proxy_cache_controller_test.exs index 5d872901e..1818c8a8e 100644 --- a/test/pleroma/web/admin_api/controllers/media_proxy_cache_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/media_proxy_cache_controller_test.exs @@ -47,30 +47,34 @@ defmodule Pleroma.Web.AdminAPI.MediaProxyCacheControllerTest do        assert response["page_size"] == 2        assert response["count"] == 5 -      assert response["urls"] == [ -               "http://localhost:4001/media/fb1f4d.jpg", -               "http://localhost:4001/media/a688346.jpg" -             ] +      results = response["urls"]        response =          conn          |> get("/api/pleroma/admin/media_proxy_caches?page_size=2&page=2")          |> json_response_and_validate_schema(200) -      assert response["urls"] == [ -               "http://localhost:4001/media/gb1f44.jpg", -               "http://localhost:4001/media/tb13f47.jpg" -             ] -        assert response["page_size"] == 2        assert response["count"] == 5 +      results = results ++ response["urls"] +        response =          conn          |> get("/api/pleroma/admin/media_proxy_caches?page_size=2&page=3")          |> json_response_and_validate_schema(200) -      assert response["urls"] == ["http://localhost:4001/media/wb1f46.jpg"] +      results = results ++ response["urls"] + +      assert results |> Enum.sort() == +               [ +                 "http://localhost:4001/media/wb1f46.jpg", +                 "http://localhost:4001/media/gb1f44.jpg", +                 "http://localhost:4001/media/tb13f47.jpg", +                 "http://localhost:4001/media/fb1f4d.jpg", +                 "http://localhost:4001/media/a688346.jpg" +               ] +               |> Enum.sort()      end      test "search banned MediaProxy URLs", %{conn: conn} do @@ -88,9 +92,9 @@ defmodule Pleroma.Web.AdminAPI.MediaProxyCacheControllerTest do          |> get("/api/pleroma/admin/media_proxy_caches?page_size=2&query=F44")          |> json_response_and_validate_schema(200) -      assert response["urls"] == [ -               "http://localhost:4001/media/gb1f44.jpg", -               "http://localhost:4001/media/ff44b1f4d.jpg" +      assert response["urls"] |> Enum.sort() == [ +               "http://localhost:4001/media/ff44b1f4d.jpg", +               "http://localhost:4001/media/gb1f44.jpg"               ]        assert response["page_size"] == 2 diff --git a/test/pleroma/web/admin_api/controllers/o_auth_app_controller_test.exs b/test/pleroma/web/admin_api/controllers/o_auth_app_controller_test.exs index 8c7b63f34..d9b25719a 100644 --- a/test/pleroma/web/admin_api/controllers/o_auth_app_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/o_auth_app_controller_test.exs @@ -8,7 +8,7 @@ defmodule Pleroma.Web.AdminAPI.OAuthAppControllerTest do    import Pleroma.Factory -  alias Pleroma.Web +  alias Pleroma.Web.Endpoint    setup do      admin = insert(:user, is_admin: true) @@ -36,7 +36,7 @@ defmodule Pleroma.Web.AdminAPI.OAuthAppControllerTest do      end      test "success", %{conn: conn} do -      base_url = Web.base_url() +      base_url = Endpoint.url()        app_name = "Trusted app"        response = @@ -58,7 +58,7 @@ defmodule Pleroma.Web.AdminAPI.OAuthAppControllerTest do      end      test "with trusted", %{conn: conn} do -      base_url = Web.base_url() +      base_url = Endpoint.url()        app_name = "Trusted app"        response = diff --git a/test/pleroma/web/admin_api/controllers/report_controller_test.exs b/test/pleroma/web/admin_api/controllers/report_controller_test.exs index 6a2986b5f..99cc7bbd0 100644 --- a/test/pleroma/web/admin_api/controllers/report_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/report_controller_test.exs @@ -204,9 +204,7 @@ defmodule Pleroma.Web.AdminAPI.ReportControllerTest do                 "@#{admin.nickname} updated report ##{id} (on user @#{activity.user_actor.nickname}) with 'resolved' state"        assert ModerationLog.get_log_entry_message(second_log_entry) == -               "@#{admin.nickname} updated report ##{second_report_id} (on user @#{ -                 second_activity.user_actor.nickname -               }) with 'closed' state" +               "@#{admin.nickname} updated report ##{second_report_id} (on user @#{second_activity.user_actor.nickname}) with 'closed' state"      end    end @@ -305,7 +303,7 @@ defmodule Pleroma.Web.AdminAPI.ReportControllerTest do          |> get("/api/pleroma/admin/reports")        assert json_response(conn, :forbidden) == -               %{"error" => "User is not an admin."} +               %{"error" => "User is not a staff member."}      end      test "returns 403 when requested by anonymous" do diff --git a/test/pleroma/web/admin_api/controllers/user_controller_test.exs b/test/pleroma/web/admin_api/controllers/user_controller_test.exs index 31319b5e5..b199fa704 100644 --- a/test/pleroma/web/admin_api/controllers/user_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/user_controller_test.exs @@ -14,9 +14,9 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do    alias Pleroma.Repo    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User -  alias Pleroma.Web    alias Pleroma.Web.ActivityPub.Relay    alias Pleroma.Web.CommonAPI +  alias Pleroma.Web.Endpoint    alias Pleroma.Web.MediaProxy    setup_all do @@ -384,24 +384,22 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do        conn = get(conn, "/api/pleroma/admin/users?page=1") -      users = -        [ -          user_response( -            admin, -            %{"roles" => %{"admin" => true, "moderator" => false}} -          ), -          user_response(user, %{"local" => false, "tags" => ["foo", "bar"]}), -          user_response( -            user2, -            %{ -              "local" => true, -              "is_approved" => false, -              "registration_reason" => "I'm a chill dude", -              "actor_type" => "Person" -            } -          ) -        ] -        |> Enum.sort_by(& &1["nickname"]) +      users = [ +        user_response( +          user2, +          %{ +            "local" => true, +            "is_approved" => false, +            "registration_reason" => "I'm a chill dude", +            "actor_type" => "Person" +          } +        ), +        user_response(user, %{"local" => false, "tags" => ["foo", "bar"]}), +        user_response( +          admin, +          %{"roles" => %{"admin" => true, "moderator" => false}} +        ) +      ]        assert json_response_and_validate_schema(conn, 200) == %{                 "count" => 3, @@ -411,7 +409,7 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do      end      test "pagination works correctly with service users", %{conn: conn} do -      service1 = User.get_or_create_service_actor_by_ap_id(Web.base_url() <> "/meido", "meido") +      service1 = User.get_or_create_service_actor_by_ap_id(Endpoint.url() <> "/meido", "meido")        insert_list(25, :user) @@ -525,7 +523,7 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do        assert json_response_and_validate_schema(conn1, 200) == %{                 "count" => 2,                 "page_size" => 1, -               "users" => [user_response(user)] +               "users" => [user_response(user2)]               }        conn2 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=2") @@ -533,7 +531,7 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do        assert json_response_and_validate_schema(conn2, 200) == %{                 "count" => 2,                 "page_size" => 1, -               "users" => [user_response(user2)] +               "users" => [user_response(user)]               }      end @@ -565,18 +563,16 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do        conn = get(conn, "/api/pleroma/admin/users?filters=local") -      users = -        [ -          user_response(user), -          user_response(admin, %{ -            "roles" => %{"admin" => true, "moderator" => false} -          }), -          user_response(old_admin, %{ -            "is_active" => true, -            "roles" => %{"admin" => true, "moderator" => false} -          }) -        ] -        |> Enum.sort_by(& &1["nickname"]) +      users = [ +        user_response(user), +        user_response(admin, %{ +          "roles" => %{"admin" => true, "moderator" => false} +        }), +        user_response(old_admin, %{ +          "is_active" => true, +          "roles" => %{"admin" => true, "moderator" => false} +        }) +      ]        assert json_response_and_validate_schema(conn, 200) == %{                 "count" => 3, @@ -604,7 +600,6 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do              "is_approved" => true            })          end) -        |> Enum.sort_by(& &1["nickname"])        assert result == %{"count" => 2, "page_size" => 50, "users" => users}      end @@ -642,18 +637,16 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do        conn = get(conn, "/api/pleroma/admin/users?filters=is_admin") -      users = -        [ -          user_response(admin, %{ -            "is_active" => true, -            "roles" => %{"admin" => true, "moderator" => false} -          }), -          user_response(second_admin, %{ -            "is_active" => true, -            "roles" => %{"admin" => true, "moderator" => false} -          }) -        ] -        |> Enum.sort_by(& &1["nickname"]) +      users = [ +        user_response(second_admin, %{ +          "is_active" => true, +          "roles" => %{"admin" => true, "moderator" => false} +        }), +        user_response(admin, %{ +          "is_active" => true, +          "roles" => %{"admin" => true, "moderator" => false} +        }) +      ]        assert json_response_and_validate_schema(conn, 200) == %{                 "count" => 2, @@ -693,13 +686,11 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do          |> get(user_path(conn, :index), %{actor_types: ["Person"]})          |> json_response_and_validate_schema(200) -      users = -        [ -          user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}}), -          user_response(user1), -          user_response(user2) -        ] -        |> Enum.sort_by(& &1["nickname"]) +      users = [ +        user_response(user2), +        user_response(user1), +        user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}}) +      ]        assert response == %{"count" => 3, "page_size" => 50, "users" => users}      end @@ -716,14 +707,12 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do          |> get(user_path(conn, :index), %{actor_types: ["Person", "Service"]})          |> json_response_and_validate_schema(200) -      users = -        [ -          user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}}), -          user_response(user1), -          user_response(user2), -          user_response(user_service, %{"actor_type" => "Service"}) -        ] -        |> Enum.sort_by(& &1["nickname"]) +      users = [ +        user_response(user2), +        user_response(user1), +        user_response(user_service, %{"actor_type" => "Service"}), +        user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}}) +      ]        assert response == %{"count" => 4, "page_size" => 50, "users" => users}      end @@ -752,12 +741,10 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do        conn = get(conn, "/api/pleroma/admin/users?tags[]=first&tags[]=second") -      users = -        [ -          user_response(user1, %{"tags" => ["first"]}), -          user_response(user2, %{"tags" => ["second"]}) -        ] -        |> Enum.sort_by(& &1["nickname"]) +      users = [ +        user_response(user2, %{"tags" => ["second"]}), +        user_response(user1, %{"tags" => ["first"]}) +      ]        assert json_response_and_validate_schema(conn, 200) == %{                 "count" => 2, @@ -781,8 +768,8 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do                 "count" => 2,                 "page_size" => 50,                 "users" => [ -                 %{"id" => ^admin_id}, -                 %{"id" => ^user_id} +                 %{"id" => ^user_id}, +                 %{"id" => ^admin_id}                 ]               } = json_response_and_validate_schema(conn, 200)      end @@ -886,6 +873,56 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do               "@#{admin.nickname} approved users: @#{user_one.nickname}, @#{user_two.nickname}"    end +  test "PATCH /api/pleroma/admin/users/suggest", %{admin: admin, conn: conn} do +    user1 = insert(:user, is_suggested: false) +    user2 = insert(:user, is_suggested: false) + +    response = +      conn +      |> put_req_header("content-type", "application/json") +      |> patch( +        "/api/pleroma/admin/users/suggest", +        %{nicknames: [user1.nickname, user2.nickname]} +      ) +      |> json_response_and_validate_schema(200) + +    assert Enum.map(response["users"], & &1["is_suggested"]) == [true, true] +    [user1, user2] = Repo.reload!([user1, user2]) + +    assert user1.is_suggested +    assert user2.is_suggested + +    log_entry = Repo.one(ModerationLog) + +    assert ModerationLog.get_log_entry_message(log_entry) == +             "@#{admin.nickname} added suggested users: @#{user1.nickname}, @#{user2.nickname}" +  end + +  test "PATCH /api/pleroma/admin/users/unsuggest", %{admin: admin, conn: conn} do +    user1 = insert(:user, is_suggested: true) +    user2 = insert(:user, is_suggested: true) + +    response = +      conn +      |> put_req_header("content-type", "application/json") +      |> patch( +        "/api/pleroma/admin/users/unsuggest", +        %{nicknames: [user1.nickname, user2.nickname]} +      ) +      |> json_response_and_validate_schema(200) + +    assert Enum.map(response["users"], & &1["is_suggested"]) == [false, false] +    [user1, user2] = Repo.reload!([user1, user2]) + +    refute user1.is_suggested +    refute user2.is_suggested + +    log_entry = Repo.one(ModerationLog) + +    assert ModerationLog.get_log_entry_message(log_entry) == +             "@#{admin.nickname} removed suggested users: @#{user1.nickname}, @#{user2.nickname}" +  end +    test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admin, conn: conn} do      user = insert(:user) @@ -919,9 +956,11 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do        "display_name" => HTML.strip_tags(user.name || user.nickname),        "is_confirmed" => true,        "is_approved" => true, +      "is_suggested" => false,        "url" => user.ap_id,        "registration_reason" => nil, -      "actor_type" => "Person" +      "actor_type" => "Person", +      "created_at" => CommonAPI.Utils.to_masto_date(user.inserted_at)      }      |> Map.merge(attrs)    end diff --git a/test/pleroma/web/admin_api/search_test.exs b/test/pleroma/web/admin_api/search_test.exs index b8eeec65b..2335c5228 100644 --- a/test/pleroma/web/admin_api/search_test.exs +++ b/test/pleroma/web/admin_api/search_test.exs @@ -151,9 +151,9 @@ defmodule Pleroma.Web.AdminAPI.SearchTest do        {:ok, [^user_service], 1} = Search.user(%{actor_types: ["Service"]})        {:ok, [^user_application], 1} = Search.user(%{actor_types: ["Application"]}) -      {:ok, [^user1, ^user2], 2} = Search.user(%{actor_types: ["Person"]}) +      {:ok, [^user2, ^user1], 2} = Search.user(%{actor_types: ["Person"]}) -      {:ok, [^user_service, ^user1, ^user2], 3} = +      {:ok, [^user2, ^user1, ^user_service], 3} =          Search.user(%{actor_types: ["Person", "Service"]})      end diff --git a/test/pleroma/web/auth/authenticator_test.exs b/test/pleroma/web/auth/authenticator_test.exs index e1f30e835..26779df03 100644 --- a/test/pleroma/web/auth/authenticator_test.exs +++ b/test/pleroma/web/auth/authenticator_test.exs @@ -5,38 +5,38 @@  defmodule Pleroma.Web.Auth.AuthenticatorTest do    use Pleroma.Web.ConnCase, async: true -  alias Pleroma.Web.Auth.Authenticator +  alias Pleroma.Web.Auth.Helpers    import Pleroma.Factory    describe "fetch_user/1" do      test "returns user by name" do        user = insert(:user) -      assert Authenticator.fetch_user(user.nickname) == user +      assert Helpers.fetch_user(user.nickname) == user      end      test "returns user by email" do        user = insert(:user) -      assert Authenticator.fetch_user(user.email) == user +      assert Helpers.fetch_user(user.email) == user      end      test "returns nil" do -      assert Authenticator.fetch_user("email") == nil +      assert Helpers.fetch_user("email") == nil      end    end    describe "fetch_credentials/1" do      test "returns name and password from authorization params" do        params = %{"authorization" => %{"name" => "test", "password" => "test-pass"}} -      assert Authenticator.fetch_credentials(params) == {:ok, {"test", "test-pass"}} +      assert Helpers.fetch_credentials(params) == {:ok, {"test", "test-pass"}}      end      test "returns name and password with grant_type 'password'" do        params = %{"grant_type" => "password", "username" => "test", "password" => "test-pass"} -      assert Authenticator.fetch_credentials(params) == {:ok, {"test", "test-pass"}} +      assert Helpers.fetch_credentials(params) == {:ok, {"test", "test-pass"}}      end      test "returns error" do -      assert Authenticator.fetch_credentials(%{}) == {:error, :invalid_credentials} +      assert Helpers.fetch_credentials(%{}) == {:error, :invalid_credentials}      end    end  end diff --git a/test/pleroma/web/common_api/utils_test.exs b/test/pleroma/web/common_api/utils_test.exs index b0e567ff0..fc01f820a 100644 --- a/test/pleroma/web/common_api/utils_test.exs +++ b/test/pleroma/web/common_api/utils_test.exs @@ -160,11 +160,7 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        {output, _, _} = Utils.format_input(text, "text/markdown")        assert output == -               ~s(<p><strong>hello world</strong></p><p><em>another <span class="h-card"><a class="u-url mention" data-user="#{ -                 user.id -               }" href="http://foo.com/user__test" rel="ugc">@<span>user__test</span></a></span> and <span class="h-card"><a class="u-url mention" data-user="#{ -                 user.id -               }" href="http://foo.com/user__test" rel="ugc">@<span>user__test</span></a></span> <a href="http://google.com" rel="ugc">google.com</a> paragraph</em></p>) +               ~s(<p><strong>hello world</strong></p><p><em>another <span class="h-card"><a class="u-url mention" data-user="#{user.id}" href="http://foo.com/user__test" rel="ugc">@<span>user__test</span></a></span> and <span class="h-card"><a class="u-url mention" data-user="#{user.id}" href="http://foo.com/user__test" rel="ugc">@<span>user__test</span></a></span> <a href="http://google.com" rel="ugc">google.com</a> paragraph</em></p>)      end    end @@ -201,11 +197,7 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        {result, _, []} = Utils.format_input(code, "text/markdown")        assert result == -               ~s[<p><span class="h-card"><a class="u-url mention" data-user="#{mario.id}" href="#{ -                 mario.ap_id -               }" rel="ugc">@<span>mario</span></a></span> <span class="h-card"><a class="u-url mention" data-user="#{ -                 luigi.id -               }" href="#{luigi.ap_id}" rel="ugc">@<span>luigi</span></a></span> yo what’s up?</p>] +               ~s[<p><span class="h-card"><a class="u-url mention" data-user="#{mario.id}" href="#{mario.ap_id}" rel="ugc">@<span>mario</span></a></span> <span class="h-card"><a class="u-url mention" data-user="#{luigi.id}" href="#{luigi.ap_id}" rel="ugc">@<span>luigi</span></a></span> yo what’s up?</p>]      end      test "remote mentions" do @@ -216,11 +208,7 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        {result, _, []} = Utils.format_input(code, "text/markdown")        assert result == -               ~s[<p><span class="h-card"><a class="u-url mention" data-user="#{mario.id}" href="#{ -                 mario.ap_id -               }" rel="ugc">@<span>mario</span></a></span> <span class="h-card"><a class="u-url mention" data-user="#{ -                 luigi.id -               }" href="#{luigi.ap_id}" rel="ugc">@<span>luigi</span></a></span> yo what’s up?</p>] +               ~s[<p><span class="h-card"><a class="u-url mention" data-user="#{mario.id}" href="#{mario.ap_id}" rel="ugc">@<span>mario</span></a></span> <span class="h-card"><a class="u-url mention" data-user="#{luigi.id}" href="#{luigi.ap_id}" rel="ugc">@<span>luigi</span></a></span> yo what’s up?</p>]      end      test "raw HTML" do @@ -681,41 +669,6 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do      end    end -  describe "make_note_data/1" do -    test "returns note data" do -      user = insert(:user) -      note = insert(:note) -      user2 = insert(:user) -      user3 = insert(:user) - -      draft = %ActivityDraft{ -        user: user, -        to: [user2.ap_id], -        context: "2hu", -        content_html: "<h1>This is :moominmamma: note</h1>", -        in_reply_to: note.id, -        tags: [name: "jimm"], -        summary: "test summary", -        cc: [user3.ap_id], -        extra: %{"custom_tag" => "test"} -      } - -      assert Utils.make_note_data(draft) == %{ -               "actor" => user.ap_id, -               "attachment" => [], -               "cc" => [user3.ap_id], -               "content" => "<h1>This is :moominmamma: note</h1>", -               "context" => "2hu", -               "sensitive" => false, -               "summary" => "test summary", -               "tag" => ["jimm"], -               "to" => [user2.ap_id], -               "type" => "Note", -               "custom_tag" => "test" -             } -    end -  end -    describe "maybe_add_attachments/3" do      test "returns parsed results when attachment_links is false" do        assert Utils.maybe_add_attachments( diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs index be94c93c2..ad0b87543 100644 --- a/test/pleroma/web/common_api_test.exs +++ b/test/pleroma/web/common_api_test.exs @@ -18,6 +18,7 @@ defmodule Pleroma.Web.CommonAPITest do    alias Pleroma.Web.ActivityPub.Visibility    alias Pleroma.Web.AdminAPI.AccountView    alias Pleroma.Web.CommonAPI +  alias Pleroma.Workers.PollWorker    import Pleroma.Factory    import Mock @@ -48,6 +49,12 @@ defmodule Pleroma.Web.CommonAPITest do        assert object.data["type"] == "Question"        assert object.data["oneOf"] |> length() == 2 + +      assert_enqueued( +        worker: PollWorker, +        args: %{op: "poll_end", activity_id: activity.id}, +        scheduled_at: NaiveDateTime.from_iso8601!(object.data["closed"]) +      )      end    end @@ -202,9 +209,7 @@ defmodule Pleroma.Web.CommonAPITest do        object = Object.normalize(activity, fetch: false)        assert object.data["content"] == -               "<a href=\"https://example.org\" rel=\"ugc\">https://example.org</a> is the site of <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{ -                 other_user.id -               }\" href=\"#{other_user.ap_id}\" rel=\"ugc\">@<span>#{other_user.nickname}</span></a></span> <a class=\"hashtag\" data-tag=\"2hu\" href=\"http://localhost:4001/tag/2hu\">#2hu</a>" +               "<a href=\"https://example.org\" rel=\"ugc\">https://example.org</a> is the site of <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{other_user.id}\" href=\"#{other_user.ap_id}\" rel=\"ugc\">@<span>#{other_user.nickname}</span></a></span> <a class=\"hashtag\" data-tag=\"2hu\" href=\"http://localhost:4001/tag/2hu\">#2hu</a>"      end      test "it posts a chat message" do @@ -519,7 +524,7 @@ defmodule Pleroma.Web.CommonAPITest do        {:ok, activity} = CommonAPI.post(user, %{status: "hey :blank:"})        assert %{"blank" => url} = Object.normalize(activity).data["emoji"] -      assert url == "#{Pleroma.Web.base_url()}/emoji/blank.png" +      assert url == "#{Pleroma.Web.Endpoint.url()}/emoji/blank.png"      end      test "it copies emoji from the subject of the parent post" do @@ -539,8 +544,8 @@ defmodule Pleroma.Web.CommonAPITest do            spoiler_text: ":joker_smile:"          }) -      assert Object.normalize(reply_activity).data["emoji"][":joker_smile:"] -      refute Object.normalize(reply_activity).data["emoji"][":joker_disapprove:"] +      assert Object.normalize(reply_activity).data["emoji"]["joker_smile"] +      refute Object.normalize(reply_activity).data["emoji"]["joker_disapprove"]      end      test "deactivated users can't post" do diff --git a/test/pleroma/web/federator_test.exs b/test/pleroma/web/federator_test.exs index 532ee6d30..372b6a73a 100644 --- a/test/pleroma/web/federator_test.exs +++ b/test/pleroma/web/federator_test.exs @@ -123,7 +123,8 @@ defmodule Pleroma.Web.FederatorTest do            "type" => "Note",            "content" => "hi world!",            "id" => "http://mastodon.example.org/users/admin/objects/1", -          "attributedTo" => "http://mastodon.example.org/users/admin" +          "attributedTo" => "http://mastodon.example.org/users/admin", +          "to" => ["https://www.w3.org/ns/activitystreams#Public"]          },          "to" => ["https://www.w3.org/ns/activitystreams#Public"]        } @@ -145,7 +146,8 @@ defmodule Pleroma.Web.FederatorTest do            "type" => "Note",            "content" => "hi world!",            "id" => "http://mastodon.example.org/users/admin/objects/1", -          "attributedTo" => "http://mastodon.example.org/users/admin" +          "attributedTo" => "http://mastodon.example.org/users/admin", +          "to" => ["https://www.w3.org/ns/activitystreams#Public"]          },          "to" => ["https://www.w3.org/ns/activitystreams#Public"]        } diff --git a/test/pleroma/web/feed/tag_controller_test.exs b/test/pleroma/web/feed/tag_controller_test.exs index 5c9201de1..140cdb8bf 100644 --- a/test/pleroma/web/feed/tag_controller_test.exs +++ b/test/pleroma/web/feed/tag_controller_test.exs @@ -127,10 +127,10 @@ defmodule Pleroma.Web.Feed.TagControllerTest do               "These are public toots tagged with #pleromaart. You can interact with them if you have an account anywhere in the fediverse."      assert xpath(xml, ~x"//channel/link/text()") == -             '#{Pleroma.Web.base_url()}/tags/pleromaart.rss' +             '#{Pleroma.Web.Endpoint.url()}/tags/pleromaart.rss'      assert xpath(xml, ~x"//channel/webfeeds:logo/text()") == -             '#{Pleroma.Web.base_url()}/static/logo.svg' +             '#{Pleroma.Web.Endpoint.url()}/static/logo.svg'      assert xpath(xml, ~x"//channel/item/title/text()"l) == [               '42 This is :moominmamm...', diff --git a/test/pleroma/web/feed/user_controller_test.exs b/test/pleroma/web/feed/user_controller_test.exs index 408653d92..6e3f790b2 100644 --- a/test/pleroma/web/feed/user_controller_test.exs +++ b/test/pleroma/web/feed/user_controller_test.exs @@ -196,13 +196,26 @@ defmodule Pleroma.Web.Feed.UserControllerTest do                 ).resp_body      end -    test "with html format, it returns error when user is not found", %{conn: conn} do +    test "with html format, it falls back to frontend when user is remote", %{conn: conn} do +      user = insert(:user, local: false) + +      {:ok, _} = CommonAPI.post(user, %{status: "test"}) + +      response = +        conn +        |> get("/users/#{user.nickname}") +        |> response(200) + +      assert response =~ "</html>" +    end + +    test "with html format, it falls back to frontend when user is not found", %{conn: conn} do        response =          conn          |> get("/users/jimm") -        |> json_response(404) +        |> response(200) -      assert response == %{"error" => "Not found"} +      assert response =~ "</html>"      end      test "with non-html / non-json format, it redirects to user feed in atom format", %{ @@ -217,7 +230,9 @@ defmodule Pleroma.Web.Feed.UserControllerTest do          |> get("/users/#{user.nickname}")        assert conn.status == 302 -      assert redirected_to(conn) == "#{Pleroma.Web.base_url()}/users/#{user.nickname}/feed.atom" + +      assert redirected_to(conn) == +               "#{Pleroma.Web.Endpoint.url()}/users/#{user.nickname}/feed.atom"      end      test "with non-html / non-json format, it returns error when user is not found", %{conn: conn} do diff --git a/test/pleroma/web/manifest_controller_test.exs b/test/pleroma/web/manifest_controller_test.exs new file mode 100644 index 000000000..b7a4940db --- /dev/null +++ b/test/pleroma/web/manifest_controller_test.exs @@ -0,0 +1,17 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ManifestControllerTest do +  use Pleroma.Web.ConnCase + +  setup do +    clear_config([:instance, :name], "Manifest Test") +    clear_config([:manifest, :theme_color], "#ff0000") +  end + +  test "manifest.json", %{conn: conn} do +    conn = get(conn, "/manifest.json") +    assert %{"name" => "Manifest Test", "theme_color" => "#ff0000"} = json_response(conn, 200) +  end +end diff --git a/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs index a327c0d1d..966a4072d 100644 --- a/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs @@ -514,11 +514,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        {:ok, post_2} = CommonAPI.post(user, %{status: "second post"})        response_1 = get(conn, "/api/v1/accounts/#{user.id}/statuses?limit=1") -      assert [res] = json_response(response_1, 200) +      assert [res] = json_response_and_validate_schema(response_1, 200)        assert res["id"] == post_2.id        response_2 = get(conn, "/api/v1/accounts/#{user.id}/statuses?limit=1&max_id=#{res["id"]}") -      assert [res] = json_response(response_2, 200) +      assert [res] = json_response_and_validate_schema(response_2, 200)        assert res["id"] == post_1.id        refute response_1 == response_2 @@ -709,9 +709,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert [%{"id" => ^follower2_id}, %{"id" => ^follower1_id}] =                 conn                 |> get( -                 "/api/v1/accounts/#{user.id}/followers?id=#{user.id}&limit=20&max_id=#{ -                   follower3_id -                 }" +                 "/api/v1/accounts/#{user.id}/followers?id=#{user.id}&limit=20&max_id=#{follower3_id}"                 )                 |> json_response_and_validate_schema(200) @@ -881,7 +879,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert [] ==                 conn                 |> get("/api/v1/timelines/home") -               |> json_response(200) +               |> json_response_and_validate_schema(200)        assert %{"showing_reblogs" => true} =                 conn @@ -892,7 +890,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert [%{"id" => ^reblog_id}] =                 conn                 |> get("/api/v1/timelines/home") -               |> json_response(200) +               |> json_response_and_validate_schema(200)      end      test "following with reblogs" do @@ -910,7 +908,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert [%{"id" => ^reblog_id}] =                 conn                 |> get("/api/v1/timelines/home") -               |> json_response(200) +               |> json_response_and_validate_schema(200)        assert %{"showing_reblogs" => false} =                 conn @@ -921,7 +919,28 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert [] ==                 conn                 |> get("/api/v1/timelines/home") -               |> json_response(200) +               |> json_response_and_validate_schema(200) +    end + +    test "following with subscription and unsubscribing" do +      %{conn: conn} = oauth_access(["follow"]) +      followed = insert(:user) + +      ret_conn = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/v1/accounts/#{followed.id}/follow", %{notify: true}) + +      assert %{"id" => _id, "subscribing" => true} = +               json_response_and_validate_schema(ret_conn, 200) + +      ret_conn = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/v1/accounts/#{followed.id}/follow", %{notify: false}) + +      assert %{"id" => _id, "subscribing" => false} = +               json_response_and_validate_schema(ret_conn, 200)      end      test "following / unfollowing errors", %{user: user, conn: conn} do @@ -1778,4 +1797,21 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      assert [%{"id" => ^id2}] = result    end + +  test "create a note on a user" do +    %{conn: conn} = oauth_access(["write:accounts", "read:follows"]) +    other_user = insert(:user) + +    conn +    |> put_req_header("content-type", "application/json") +    |> post("/api/v1/accounts/#{other_user.id}/note", %{ +      "comment" => "Example note" +    }) + +    assert [%{"note" => "Example note"}] = +             conn +             |> put_req_header("content-type", "application/json") +             |> get("/api/v1/accounts/relationships?id=#{other_user.id}") +             |> json_response_and_validate_schema(200) +  end  end diff --git a/test/pleroma/web/mastodon_api/controllers/auth_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/auth_controller_test.exs deleted file mode 100644 index 1872dfd59..000000000 --- a/test/pleroma/web/mastodon_api/controllers/auth_controller_test.exs +++ /dev/null @@ -1,159 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.MastodonAPI.AuthControllerTest do -  use Pleroma.Web.ConnCase, async: true - -  alias Pleroma.Config -  alias Pleroma.Repo -  alias Pleroma.Tests.ObanHelpers - -  import Pleroma.Factory -  import Swoosh.TestAssertions - -  describe "GET /web/login" do -    setup %{conn: conn} do -      session_opts = [ -        store: :cookie, -        key: "_test", -        signing_salt: "cooldude" -      ] - -      conn = -        conn -        |> Plug.Session.call(Plug.Session.init(session_opts)) -        |> fetch_session() - -      test_path = "/web/statuses/test" -      %{conn: conn, path: test_path} -    end - -    test "redirects to the saved path after log in", %{conn: conn, path: path} do -      app = insert(:oauth_app, client_name: "Mastodon-Local", redirect_uris: ".") -      auth = insert(:oauth_authorization, app: app) - -      conn = -        conn -        |> put_session(:return_to, path) -        |> get("/web/login", %{code: auth.token}) - -      assert conn.status == 302 -      assert redirected_to(conn) =~ path -    end - -    test "redirects to the getting-started page when referer is not present", %{conn: conn} do -      app = insert(:oauth_app, client_name: "Mastodon-Local", redirect_uris: ".") -      auth = insert(:oauth_authorization, app: app) - -      conn = get(conn, "/web/login", %{code: auth.token}) - -      assert conn.status == 302 -      assert redirected_to(conn) =~ "/web/getting-started" -    end -  end - -  describe "POST /auth/password, with valid parameters" do -    setup %{conn: conn} do -      user = insert(:user) -      conn = post(conn, "/auth/password?email=#{user.email}") -      %{conn: conn, user: user} -    end - -    test "it returns 204", %{conn: conn} do -      assert empty_json_response(conn) -    end - -    test "it creates a PasswordResetToken record for user", %{user: user} do -      token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id) -      assert token_record -    end - -    test "it sends an email to user", %{user: user} do -      ObanHelpers.perform_all() -      token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id) - -      email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token) -      notify_email = Config.get([:instance, :notify_email]) -      instance_name = Config.get([:instance, :name]) - -      assert_email_sent( -        from: {instance_name, notify_email}, -        to: {user.name, user.email}, -        html_body: email.html_body -      ) -    end -  end - -  describe "POST /auth/password, with nickname" do -    test "it returns 204", %{conn: conn} do -      user = insert(:user) - -      assert conn -             |> post("/auth/password?nickname=#{user.nickname}") -             |> empty_json_response() - -      ObanHelpers.perform_all() -      token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id) - -      email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token) -      notify_email = Config.get([:instance, :notify_email]) -      instance_name = Config.get([:instance, :name]) - -      assert_email_sent( -        from: {instance_name, notify_email}, -        to: {user.name, user.email}, -        html_body: email.html_body -      ) -    end - -    test "it doesn't fail when a user has no email", %{conn: conn} do -      user = insert(:user, %{email: nil}) - -      assert conn -             |> post("/auth/password?nickname=#{user.nickname}") -             |> empty_json_response() -    end -  end - -  describe "POST /auth/password, with invalid parameters" do -    setup do -      user = insert(:user) -      {:ok, user: user} -    end - -    test "it returns 204 when user is not found", %{conn: conn, user: user} do -      conn = post(conn, "/auth/password?email=nonexisting_#{user.email}") - -      assert empty_json_response(conn) -    end - -    test "it returns 204 when user is not local", %{conn: conn, user: user} do -      {:ok, user} = Repo.update(Ecto.Changeset.change(user, local: false)) -      conn = post(conn, "/auth/password?email=#{user.email}") - -      assert empty_json_response(conn) -    end - -    test "it returns 204 when user is deactivated", %{conn: conn, user: user} do -      {:ok, user} = Repo.update(Ecto.Changeset.change(user, is_active: false, local: true)) -      conn = post(conn, "/auth/password?email=#{user.email}") - -      assert empty_json_response(conn) -    end -  end - -  describe "DELETE /auth/sign_out" do -    test "redirect to root page", %{conn: conn} do -      user = insert(:user) - -      conn = -        conn -        |> assign(:user, user) -        |> delete("/auth/sign_out") - -      assert conn.status == 302 -      assert redirected_to(conn) == "/" -    end -  end -end diff --git a/test/pleroma/web/mastodon_api/controllers/conversation_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/conversation_controller_test.exs index 3176f1296..00797a9ea 100644 --- a/test/pleroma/web/mastodon_api/controllers/conversation_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/conversation_controller_test.exs @@ -214,7 +214,8 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do      res_conn = get(conn, "/api/v1/statuses/#{direct.id}/context") -    assert %{"ancestors" => [], "descendants" => []} == json_response(res_conn, 200) +    assert %{"ancestors" => [], "descendants" => []} == +             json_response_and_validate_schema(res_conn, 200)    end    test "Removes a conversation", %{user: user_one, conn: conn} do diff --git a/test/pleroma/web/mastodon_api/controllers/instance_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/instance_controller_test.exs index b99856659..e76cbc75b 100644 --- a/test/pleroma/web/mastodon_api/controllers/instance_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/instance_controller_test.exs @@ -14,8 +14,8 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do      assert result = json_response_and_validate_schema(conn, 200)      email = Pleroma.Config.get([:instance, :email]) -    thumbnail = Pleroma.Web.base_url() <> Pleroma.Config.get([:instance, :instance_thumbnail]) -    background = Pleroma.Web.base_url() <> Pleroma.Config.get([:instance, :background_image]) +    thumbnail = Pleroma.Web.Endpoint.url() <> Pleroma.Config.get([:instance, :instance_thumbnail]) +    background = Pleroma.Web.Endpoint.url() <> Pleroma.Config.get([:instance, :background_image])      # Note: not checking for "max_toot_chars" since it's optional      assert %{ @@ -38,7 +38,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do               "background_upload_limit" => _,               "banner_upload_limit" => _,               "background_image" => from_config_background, -             "chat_limit" => _, +             "shout_limit" => _,               "description_limit" => _             } = result diff --git a/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs index 6c8f984d5..ff988a7fd 100644 --- a/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs @@ -5,6 +5,8 @@  defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do    use Pleroma.Web.ConnCase +  import ExUnit.CaptureLog +    alias Pleroma.Object    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub @@ -67,6 +69,59 @@ defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do        object = Object.get_by_id(media["id"])        assert object.data["actor"] == user.ap_id      end + +    test "/api/v2/media, upload_limit", %{conn: conn, user: user} do +      desc = "Description of the binary" + +      upload_limit = Config.get([:instance, :upload_limit]) * 8 + 8 + +      assert :ok == +               File.write(Path.absname("test/tmp/large_binary.data"), <<0::size(upload_limit)>>) + +      large_binary = %Plug.Upload{ +        content_type: nil, +        path: Path.absname("test/tmp/large_binary.data"), +        filename: "large_binary.data" +      } + +      assert capture_log(fn -> +               assert %{"error" => "file_too_large"} = +                        conn +                        |> put_req_header("content-type", "multipart/form-data") +                        |> post("/api/v2/media", %{ +                          "file" => large_binary, +                          "description" => desc +                        }) +                        |> json_response_and_validate_schema(400) +             end) =~ +               "[error] Elixir.Pleroma.Upload store (using Pleroma.Uploaders.Local) failed: :file_too_large" + +      clear_config([:instance, :upload_limit], upload_limit) + +      assert response = +               conn +               |> put_req_header("content-type", "multipart/form-data") +               |> post("/api/v2/media", %{ +                 "file" => large_binary, +                 "description" => desc +               }) +               |> json_response_and_validate_schema(202) + +      assert media_id = response["id"] + +      %{conn: conn} = oauth_access(["read:media"], user: user) + +      media = +        conn +        |> get("/api/v1/media/#{media_id}") +        |> json_response_and_validate_schema(200) + +      assert media["type"] == "unknown" +      assert media["description"] == desc +      assert media["id"] + +      assert :ok == File.rm(Path.absname("test/tmp/large_binary.data")) +    end    end    describe "Update media description" do @@ -140,7 +195,7 @@ defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do        conn        |> get("/api/v1/media/#{object.id}") -      |> json_response(403) +      |> json_response_and_validate_schema(403)      end    end  end diff --git a/test/pleroma/web/mastodon_api/controllers/notification_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/notification_controller_test.exs index 2615912a8..d991f284f 100644 --- a/test/pleroma/web/mastodon_api/controllers/notification_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/notification_controller_test.exs @@ -44,9 +44,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do        |> get("/api/v1/notifications")      expected_response = -      "hi <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{user.id}\" href=\"#{ -        user.ap_id -      }\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>" +      "hi <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{user.id}\" href=\"#{user.ap_id}\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>"      assert [%{"status" => %{"content" => response}} | _rest] =               json_response_and_validate_schema(conn, 200) @@ -103,6 +101,25 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert [_] = result    end +  test "excludes mentions from blockers when blockers_visible is false" do +    clear_config([:activitypub, :blockers_visible], false) + +    %{user: user, conn: conn} = oauth_access(["read:notifications"]) +    blocker = insert(:user) + +    {:ok, _} = CommonAPI.block(blocker, user) +    {:ok, activity} = CommonAPI.post(blocker, %{status: "hi @#{user.nickname}"}) + +    {:ok, [_notification]} = Notification.create_notifications(activity) + +    conn = +      conn +      |> assign(:user, user) +      |> get("/api/v1/notifications") + +    assert [] == json_response_and_validate_schema(conn, 200) +  end +    test "getting a single notification" do      %{user: user, conn: conn} = oauth_access(["read:notifications"])      other_user = insert(:user) @@ -114,9 +131,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      conn = get(conn, "/api/v1/notifications/#{notification.id}")      expected_response = -      "hi <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{user.id}\" href=\"#{ -        user.ap_id -      }\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>" +      "hi <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{user.id}\" href=\"#{user.ap_id}\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>"      assert %{"status" => %{"content" => response}} = json_response_and_validate_schema(conn, 200)      assert response == expected_response diff --git a/test/pleroma/web/mastodon_api/controllers/search_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/search_controller_test.exs index 1dd0fa3b8..e31cd0291 100644 --- a/test/pleroma/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/search_controller_test.exs @@ -6,8 +6,8 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do    use Pleroma.Web.ConnCase    alias Pleroma.Object -  alias Pleroma.Web    alias Pleroma.Web.CommonAPI +  alias Pleroma.Web.Endpoint    import Pleroma.Factory    import ExUnit.CaptureLog    import Tesla.Mock @@ -61,7 +61,7 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do        assert account["id"] == to_string(user_three.id)        assert results["hashtags"] == [ -               %{"name" => "private", "url" => "#{Web.base_url()}/tag/private"} +               %{"name" => "private", "url" => "#{Endpoint.url()}/tag/private"}               ]        [status] = results["statuses"] @@ -72,7 +72,7 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do          |> json_response_and_validate_schema(200)        assert results["hashtags"] == [ -               %{"name" => "天子", "url" => "#{Web.base_url()}/tag/天子"} +               %{"name" => "天子", "url" => "#{Endpoint.url()}/tag/天子"}               ]        [status] = results["statuses"] @@ -87,8 +87,8 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do          |> json_response_and_validate_schema(200)        assert results["hashtags"] == [ -               %{"name" => "explicit", "url" => "#{Web.base_url()}/tag/explicit"}, -               %{"name" => "hashtags", "url" => "#{Web.base_url()}/tag/hashtags"} +               %{"name" => "explicit", "url" => "#{Endpoint.url()}/tag/explicit"}, +               %{"name" => "hashtags", "url" => "#{Endpoint.url()}/tag/hashtags"}               ]        results = @@ -97,9 +97,9 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do          |> json_response_and_validate_schema(200)        assert results["hashtags"] == [ -               %{"name" => "john", "url" => "#{Web.base_url()}/tag/john"}, -               %{"name" => "doe", "url" => "#{Web.base_url()}/tag/doe"}, -               %{"name" => "JohnDoe", "url" => "#{Web.base_url()}/tag/JohnDoe"} +               %{"name" => "john", "url" => "#{Endpoint.url()}/tag/john"}, +               %{"name" => "doe", "url" => "#{Endpoint.url()}/tag/doe"}, +               %{"name" => "JohnDoe", "url" => "#{Endpoint.url()}/tag/JohnDoe"}               ]        results = @@ -108,9 +108,9 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do          |> json_response_and_validate_schema(200)        assert results["hashtags"] == [ -               %{"name" => "accident", "url" => "#{Web.base_url()}/tag/accident"}, -               %{"name" => "prone", "url" => "#{Web.base_url()}/tag/prone"}, -               %{"name" => "AccidentProne", "url" => "#{Web.base_url()}/tag/AccidentProne"} +               %{"name" => "accident", "url" => "#{Endpoint.url()}/tag/accident"}, +               %{"name" => "prone", "url" => "#{Endpoint.url()}/tag/prone"}, +               %{"name" => "AccidentProne", "url" => "#{Endpoint.url()}/tag/AccidentProne"}               ]        results = @@ -119,35 +119,29 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do          |> json_response_and_validate_schema(200)        assert results["hashtags"] == [ -               %{"name" => "shpuld", "url" => "#{Web.base_url()}/tag/shpuld"} +               %{"name" => "shpuld", "url" => "#{Endpoint.url()}/tag/shpuld"}               ]        results =          conn          |> get( -          "/api/v2/search?#{ -            URI.encode_query(%{ -              q: -                "https://www.washingtonpost.com/sports/2020/06/10/" <> -                  "nascar-ban-display-confederate-flag-all-events-properties/" -            }) -          }" +          "/api/v2/search?#{URI.encode_query(%{q: "https://www.washingtonpost.com/sports/2020/06/10/" <> "nascar-ban-display-confederate-flag-all-events-properties/"})}"          )          |> json_response_and_validate_schema(200)        assert results["hashtags"] == [ -               %{"name" => "nascar", "url" => "#{Web.base_url()}/tag/nascar"}, -               %{"name" => "ban", "url" => "#{Web.base_url()}/tag/ban"}, -               %{"name" => "display", "url" => "#{Web.base_url()}/tag/display"}, -               %{"name" => "confederate", "url" => "#{Web.base_url()}/tag/confederate"}, -               %{"name" => "flag", "url" => "#{Web.base_url()}/tag/flag"}, -               %{"name" => "all", "url" => "#{Web.base_url()}/tag/all"}, -               %{"name" => "events", "url" => "#{Web.base_url()}/tag/events"}, -               %{"name" => "properties", "url" => "#{Web.base_url()}/tag/properties"}, +               %{"name" => "nascar", "url" => "#{Endpoint.url()}/tag/nascar"}, +               %{"name" => "ban", "url" => "#{Endpoint.url()}/tag/ban"}, +               %{"name" => "display", "url" => "#{Endpoint.url()}/tag/display"}, +               %{"name" => "confederate", "url" => "#{Endpoint.url()}/tag/confederate"}, +               %{"name" => "flag", "url" => "#{Endpoint.url()}/tag/flag"}, +               %{"name" => "all", "url" => "#{Endpoint.url()}/tag/all"}, +               %{"name" => "events", "url" => "#{Endpoint.url()}/tag/events"}, +               %{"name" => "properties", "url" => "#{Endpoint.url()}/tag/properties"},                 %{                   "name" => "NascarBanDisplayConfederateFlagAllEventsProperties",                   "url" => -                   "#{Web.base_url()}/tag/NascarBanDisplayConfederateFlagAllEventsProperties" +                   "#{Endpoint.url()}/tag/NascarBanDisplayConfederateFlagAllEventsProperties"                 }               ]      end @@ -156,15 +150,13 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do        results =          conn          |> get( -          "/api/v2/search?#{ -            URI.encode_query(%{q: "#some #text #with #hashtags", limit: 2, offset: 1}) -          }" +          "/api/v2/search?#{URI.encode_query(%{q: "#some #text #with #hashtags", limit: 2, offset: 1})}"          )          |> json_response_and_validate_schema(200)        assert results["hashtags"] == [ -               %{"name" => "text", "url" => "#{Web.base_url()}/tag/text"}, -               %{"name" => "with", "url" => "#{Web.base_url()}/tag/with"} +               %{"name" => "text", "url" => "#{Endpoint.url()}/tag/text"}, +               %{"name" => "with", "url" => "#{Endpoint.url()}/tag/with"}               ]      end diff --git a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs index 99ad87d05..ed66d370a 100644 --- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs @@ -14,7 +14,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub +  alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.CommonAPI +  alias Pleroma.Workers.ScheduledActivityWorker    import Pleroma.Factory @@ -81,6 +83,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do            "sensitive" => 0          }) +      # Idempotency plug response means detection fail        assert %{"id" => second_id} = json_response(conn_two, 200)        assert id == second_id @@ -703,11 +706,11 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do          |> json_response_and_validate_schema(200)        assert {:ok, %{id: activity_id}} = -               perform_job(Pleroma.Workers.ScheduledActivityWorker, %{ +               perform_job(ScheduledActivityWorker, %{                   activity_id: scheduled_id                 }) -      assert Repo.all(Oban.Job) == [] +      refute_enqueued(worker: ScheduledActivityWorker)        object =          Activity @@ -1558,7 +1561,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        |> assign(:token, insert(:oauth_token, user: user3, scopes: ["read:statuses"]))        |> get("api/v1/timelines/home") -    [reblogged_activity] = json_response(conn3, 200) +    [reblogged_activity] = json_response_and_validate_schema(conn3, 200)      assert reblogged_activity["reblog"]["in_reply_to_id"] == replied_to.id @@ -1909,10 +1912,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do          "visibility" => "local"        }) -    local = Pleroma.Constants.as_local_public() +    local = Utils.as_local_public()      assert %{"content" => "cofe", "id" => id, "visibility" => "local"} = -             json_response(conn_one, 200) +             json_response_and_validate_schema(conn_one, 200)      assert %Activity{id: ^id, data: %{"to" => [^local]}} = Activity.get_by_id(id)    end diff --git a/test/pleroma/web/mastodon_api/controllers/suggestion_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/suggestion_controller_test.exs index 168966fc9..89273e67b 100644 --- a/test/pleroma/web/mastodon_api/controllers/suggestion_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/suggestion_controller_test.exs @@ -4,8 +4,11 @@  defmodule Pleroma.Web.MastodonAPI.SuggestionControllerTest do    use Pleroma.Web.ConnCase, async: true +  alias Pleroma.UserRelationship +  alias Pleroma.Web.CommonAPI +  import Pleroma.Factory -  setup do: oauth_access(["read"]) +  setup do: oauth_access(["read", "write"])    test "returns empty result", %{conn: conn} do      res = @@ -15,4 +18,66 @@ defmodule Pleroma.Web.MastodonAPI.SuggestionControllerTest do      assert res == []    end + +  test "returns v2 suggestions", %{conn: conn} do +    %{id: user_id} = insert(:user, is_suggested: true) + +    res = +      conn +      |> get("/api/v2/suggestions") +      |> json_response_and_validate_schema(200) + +    assert [%{"source" => "staff", "account" => %{"id" => ^user_id}}] = res +  end + +  test "returns v2 suggestions excluding dismissed accounts", %{conn: conn} do +    %{id: user_id} = insert(:user, is_suggested: true) + +    conn +    |> delete("/api/v1/suggestions/#{user_id}") +    |> json_response_and_validate_schema(200) + +    res = +      conn +      |> get("/api/v2/suggestions") +      |> json_response_and_validate_schema(200) + +    assert [] = res +  end + +  test "returns v2 suggestions excluding blocked accounts", %{conn: conn, user: blocker} do +    blocked = insert(:user, is_suggested: true) +    {:ok, _} = CommonAPI.block(blocker, blocked) + +    res = +      conn +      |> get("/api/v2/suggestions") +      |> json_response_and_validate_schema(200) + +    assert [] = res +  end + +  test "returns v2 suggestions excluding followed accounts", %{conn: conn, user: follower} do +    followed = insert(:user, is_suggested: true) +    {:ok, _, _, _} = CommonAPI.follow(follower, followed) + +    res = +      conn +      |> get("/api/v2/suggestions") +      |> json_response_and_validate_schema(200) + +    assert [] = res +  end + +  test "dismiss suggestion", %{conn: conn, user: source} do +    target = insert(:user, is_suggested: true) + +    res = +      conn +      |> delete("/api/v1/suggestions/#{target.id}") +      |> json_response_and_validate_schema(200) + +    assert res == %{} +    assert UserRelationship.exists?(:suggestion_dismiss, source, target) +  end  end diff --git a/test/pleroma/web/mastodon_api/controllers/timeline_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/timeline_controller_test.exs index cc409451c..187982d92 100644 --- a/test/pleroma/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/timeline_controller_test.exs @@ -273,6 +273,24 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        [%{"id" => ^reply_from_me}, %{"id" => ^activity_id}] = response      end +    test "doesn't return posts from users who blocked you when :blockers_visible is disabled" do +      clear_config([:activitypub, :blockers_visible], false) + +      %{conn: conn, user: blockee} = oauth_access(["read:statuses"]) +      blocker = insert(:user) +      {:ok, _} = User.block(blocker, blockee) + +      conn = assign(conn, :user, blockee) + +      {:ok, _} = CommonAPI.post(blocker, %{status: "hey!"}) + +      response = +        get(conn, "/api/v1/timelines/public") +        |> json_response_and_validate_schema(200) + +      assert length(response) == 0 +    end +      test "doesn't return replies if follow is posting with users from blocked domain" do        %{conn: conn, user: blocker} = oauth_access(["read:statuses"])        friend = insert(:user) @@ -905,10 +923,10 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        %{conn: auth_conn} = oauth_access(["read:statuses"])        res_conn = get(auth_conn, "#{base_uri}?local=true") -      assert length(json_response(res_conn, 200)) == 1 +      assert length(json_response_and_validate_schema(res_conn, 200)) == 1        res_conn = get(auth_conn, "#{base_uri}?local=false") -      assert length(json_response(res_conn, 200)) == 2 +      assert length(json_response_and_validate_schema(res_conn, 200)) == 2      end      test "with default settings on private instances, returns 403 for unauthenticated users", %{ @@ -922,7 +940,7 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        for local <- [true, false] do          res_conn = get(conn, "#{base_uri}?local=#{local}") -        assert json_response(res_conn, :unauthorized) == error_response +        assert json_response_and_validate_schema(res_conn, :unauthorized) == error_response        end        ensure_authenticated_access(base_uri) @@ -939,7 +957,7 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        for local <- [true, false] do          res_conn = get(conn, "#{base_uri}?local=#{local}") -        assert json_response(res_conn, :unauthorized) == error_response +        assert json_response_and_validate_schema(res_conn, :unauthorized) == error_response        end        ensure_authenticated_access(base_uri) @@ -951,10 +969,10 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        clear_config([:restrict_unauthenticated, :timelines, :federated], true)        res_conn = get(conn, "#{base_uri}?local=true") -      assert length(json_response(res_conn, 200)) == 1 +      assert length(json_response_and_validate_schema(res_conn, 200)) == 1        res_conn = get(conn, "#{base_uri}?local=false") -      assert json_response(res_conn, :unauthorized) == error_response +      assert json_response_and_validate_schema(res_conn, :unauthorized) == error_response        ensure_authenticated_access(base_uri)      end @@ -966,11 +984,11 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        clear_config([:restrict_unauthenticated, :timelines, :federated], false)        res_conn = get(conn, "#{base_uri}?local=true") -      assert json_response(res_conn, :unauthorized) == error_response +      assert json_response_and_validate_schema(res_conn, :unauthorized) == error_response        # Note: local activities get delivered as part of federated timeline        res_conn = get(conn, "#{base_uri}?local=false") -      assert length(json_response(res_conn, 200)) == 2 +      assert length(json_response_and_validate_schema(res_conn, 200)) == 2        ensure_authenticated_access(base_uri)      end diff --git a/test/pleroma/web/mastodon_api/masto_fe_controller_test.exs b/test/pleroma/web/mastodon_api/masto_fe_controller_test.exs deleted file mode 100644 index ea66c708f..000000000 --- a/test/pleroma/web/mastodon_api/masto_fe_controller_test.exs +++ /dev/null @@ -1,85 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.MastodonAPI.MastoFEControllerTest do -  use Pleroma.Web.ConnCase - -  alias Pleroma.User - -  import Pleroma.Factory - -  setup do: clear_config([:instance, :public]) - -  test "put settings", %{conn: conn} do -    user = insert(:user) - -    conn = -      conn -      |> assign(:user, user) -      |> assign(:token, insert(:oauth_token, user: user, scopes: ["write:accounts"])) -      |> put("/api/web/settings", %{"data" => %{"programming" => "socks"}}) - -    assert _result = json_response(conn, 200) - -    user = User.get_cached_by_ap_id(user.ap_id) -    assert user.mastofe_settings == %{"programming" => "socks"} -  end - -  describe "index/2 redirections" do -    setup %{conn: conn} do -      session_opts = [ -        store: :cookie, -        key: "_test", -        signing_salt: "cooldude" -      ] - -      conn = -        conn -        |> Plug.Session.call(Plug.Session.init(session_opts)) -        |> fetch_session() - -      test_path = "/web/statuses/test" -      %{conn: conn, path: test_path} -    end - -    test "redirects not logged-in users to the login page", %{conn: conn, path: path} do -      conn = get(conn, path) - -      assert conn.status == 302 -      assert redirected_to(conn) == "/web/login" -    end - -    test "redirects not logged-in users to the login page on private instances", %{ -      conn: conn, -      path: path -    } do -      clear_config([:instance, :public], false) - -      conn = get(conn, path) - -      assert conn.status == 302 -      assert redirected_to(conn) == "/web/login" -    end - -    test "does not redirect logged in users to the login page", %{conn: conn, path: path} do -      {:ok, app} = Pleroma.Web.MastodonAPI.AuthController.local_mastofe_app() -      token = insert(:oauth_token, app: app, scopes: ["read"]) - -      conn = -        conn -        |> assign(:user, token.user) -        |> assign(:token, token) -        |> get(path) - -      assert conn.status == 200 -    end - -    test "saves referer path to session", %{conn: conn, path: path} do -      conn = get(conn, path) -      return_to = Plug.Conn.get_session(conn, :return_to) - -      assert return_to == path -    end -  end -end diff --git a/test/pleroma/web/mastodon_api/update_credentials_test.exs b/test/pleroma/web/mastodon_api/update_credentials_test.exs index cfbe6cf0e..1d2027899 100644 --- a/test/pleroma/web/mastodon_api/update_credentials_test.exs +++ b/test/pleroma/web/mastodon_api/update_credentials_test.exs @@ -35,8 +35,8 @@ defmodule Pleroma.Web.MastodonAPI.UpdateCredentialsTest do          |> assign(:user, user)          |> patch("/api/v1/accounts/update_credentials", %{            "pleroma_settings_store" => %{ -            masto_fe: %{ -              theme: "bla" +            soapbox_fe: %{ +              themeMode: "bla"              }            }          }) @@ -46,7 +46,7 @@ defmodule Pleroma.Web.MastodonAPI.UpdateCredentialsTest do        assert user_data["pleroma"]["settings_store"] ==                 %{                   "pleroma_fe" => %{"theme" => "bla"}, -                 "masto_fe" => %{"theme" => "bla"} +                 "soapbox_fe" => %{"themeMode" => "bla"}                 }        user = Repo.get(User, user_data["id"]) @@ -60,8 +60,8 @@ defmodule Pleroma.Web.MastodonAPI.UpdateCredentialsTest do            |> assign(:user, user)            |> patch("/api/v1/accounts/update_credentials", %{              "pleroma_settings_store" => %{ -              masto_fe: %{ -                theme: "blub" +              soapbox_fe: %{ +                themeMode: "blub"                }              }            }) @@ -71,7 +71,7 @@ defmodule Pleroma.Web.MastodonAPI.UpdateCredentialsTest do          assert user_data["pleroma"]["settings_store"] ==                   %{                     "pleroma_fe" => %{"theme" => "bla"}, -                   "masto_fe" => %{"theme" => "blub"} +                   "soapbox_fe" => %{"themeMode" => "blub"}                   }          assert_called(Pleroma.Web.Federator.publish(:_)) @@ -88,9 +88,7 @@ defmodule Pleroma.Web.MastodonAPI.UpdateCredentialsTest do        assert user_data = json_response_and_validate_schema(conn, 200)        assert user_data["note"] == -               ~s(I drink <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe">#cofe</a> with <span class="h-card"><a class="u-url mention" data-user="#{ -                 user2.id -               }" href="#{user2.ap_id}" rel="ugc">@<span>#{user2.nickname}</span></a></span><br/><br/>suya..) +               ~s(I drink <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe">#cofe</a> with <span class="h-card"><a class="u-url mention" data-user="#{user2.id}" href="#{user2.ap_id}" rel="ugc">@<span>#{user2.nickname}</span></a></span><br/><br/>suya..)        assert user_data["source"]["note"] == raw_bio diff --git a/test/pleroma/web/mastodon_api/views/account_view_test.exs b/test/pleroma/web/mastodon_api/views/account_view_test.exs index 5373a17c3..39b9b0cef 100644 --- a/test/pleroma/web/mastodon_api/views/account_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/account_view_test.exs @@ -83,6 +83,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do          tags: [],          is_admin: false,          is_moderator: false, +        is_suggested: false,          hide_favorites: true,          hide_followers: false,          hide_follows: false, @@ -183,6 +184,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do          tags: [],          is_admin: false,          is_moderator: false, +        is_suggested: false,          hide_favorites: true,          hide_followers: false,          hide_follows: false, @@ -268,10 +270,12 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        muting: false,        muting_notifications: false,        subscribing: false, +      notifying: false,        requested: false,        domain_blocking: false,        showing_reblogs: true, -      endorsed: false +      endorsed: false, +      note: ""      }      test "represent a relationship for the following and followed user" do @@ -293,6 +297,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do              muting: true,              muting_notifications: true,              subscribing: true, +            notifying: true,              showing_reblogs: false,              id: to_string(other_user.id)            } @@ -468,6 +473,23 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do                 %{user: user, for: user}               )[:pleroma][:unread_notifications_count] == 7      end + +    test "shows email only to the account owner" do +      user = insert(:user) +      other_user = insert(:user) + +      user = User.get_cached_by_ap_id(user.ap_id) + +      assert AccountView.render( +               "show.json", +               %{user: user, for: other_user} +             )[:pleroma][:email] == nil + +      assert AccountView.render( +               "show.json", +               %{user: user, for: user} +             )[:pleroma][:email] == user.email +    end    end    describe "follow requests counter" do @@ -562,12 +584,12 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        AccountView.render("show.json", %{user: user, skip_visibility_check: true})        |> Enum.all?(fn          {key, url} when key in [:avatar, :avatar_static, :header, :header_static] -> -          String.starts_with?(url, Pleroma.Web.base_url()) +          String.starts_with?(url, Pleroma.Web.Endpoint.url())          {:emojis, emojis} ->            Enum.all?(emojis, fn %{url: url, static_url: static_url} -> -            String.starts_with?(url, Pleroma.Web.base_url()) && -              String.starts_with?(static_url, Pleroma.Web.base_url()) +            String.starts_with?(url, Pleroma.Web.Endpoint.url()) && +              String.starts_with?(static_url, Pleroma.Web.Endpoint.url())            end)          _ -> diff --git a/test/pleroma/web/mastodon_api/views/notification_view_test.exs b/test/pleroma/web/mastodon_api/views/notification_view_test.exs index 496a688d1..8070c03c9 100644 --- a/test/pleroma/web/mastodon_api/views/notification_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/notification_view_test.exs @@ -196,6 +196,27 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do      test_notifications_rendering([notification], user, [expected])    end +  test "Poll notification" do +    user = insert(:user) +    activity = insert(:question_activity, user: user) +    {:ok, [notification]} = Notification.create_poll_notifications(activity) + +    expected = %{ +      id: to_string(notification.id), +      pleroma: %{is_seen: false, is_muted: false}, +      type: "poll", +      account: +        AccountView.render("show.json", %{ +          user: user, +          for: user +        }), +      status: StatusView.render("show.json", %{activity: activity, for: user}), +      created_at: Utils.to_masto_date(notification.inserted_at) +    } + +    test_notifications_rendering([notification], user, [expected]) +  end +    test "Report notification" do      reporting_user = insert(:user)      reported_user = insert(:user) diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs index fbea25079..9dfdf8bf0 100644 --- a/test/pleroma/web/mastodon_api/views/status_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs @@ -459,7 +459,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do        "url" => [          %{            "mediaType" => "image/png", -          "href" => "someurl" +          "href" => "someurl", +          "width" => 200, +          "height" => 100          }        ],        "blurhash" => "UJJ8X[xYW,%Jtq%NNFbXB5j]IVM|9GV=WHRn", @@ -475,6 +477,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do        text_url: "someurl",        description: nil,        pleroma: %{mime_type: "image/png"}, +      meta: %{original: %{width: 200, height: 100, aspect: 2}},        blurhash: "UJJ8X[xYW,%Jtq%NNFbXB5j]IVM|9GV=WHRn"      } diff --git a/test/pleroma/web/mastodon_api/views/suggestion_view_test.exs b/test/pleroma/web/mastodon_api/views/suggestion_view_test.exs new file mode 100644 index 000000000..5aae36ce9 --- /dev/null +++ b/test/pleroma/web/mastodon_api/views/suggestion_view_test.exs @@ -0,0 +1,34 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.MastodonAPI.SuggestionViewTest do +  use Pleroma.DataCase, async: true +  import Pleroma.Factory +  alias Pleroma.Web.MastodonAPI.SuggestionView, as: View + +  test "show.json" do +    user = insert(:user, is_suggested: true) +    json = View.render("show.json", %{user: user, source: :staff, skip_visibility_check: true}) + +    assert json.source == :staff +    assert json.account.id == user.id +  end + +  test "index.json" do +    user1 = insert(:user, is_suggested: true) +    user2 = insert(:user, is_suggested: true) +    user3 = insert(:user, is_suggested: true) + +    [suggestion1, suggestion2, suggestion3] = +      View.render("index.json", %{ +        users: [user1, user2, user3], +        source: :staff, +        skip_visibility_check: true +      }) + +    assert suggestion1.source == :staff +    assert suggestion2.account.id == user2.id +    assert suggestion3.account.url == user3.ap_id +  end +end diff --git a/test/pleroma/web/media_proxy/media_proxy_controller_test.exs b/test/pleroma/web/media_proxy/media_proxy_controller_test.exs index 2a449e56d..1f2e54194 100644 --- a/test/pleroma/web/media_proxy/media_proxy_controller_test.exs +++ b/test/pleroma/web/media_proxy/media_proxy_controller_test.exs @@ -81,9 +81,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do        missing_dependencies = Pleroma.Helpers.MediaHelper.missing_dependencies()        assert missing_dependencies == [], -             "Error: missing dependencies (please refer to `docs/installation`): #{ -               inspect(missing_dependencies) -             }" +             "Error: missing dependencies (please refer to `docs/installation`): #{inspect(missing_dependencies)}"      end      setup do diff --git a/test/pleroma/web/media_proxy_test.exs b/test/pleroma/web/media_proxy_test.exs index b5ee6328d..d97874f3a 100644 --- a/test/pleroma/web/media_proxy_test.exs +++ b/test/pleroma/web/media_proxy_test.exs @@ -41,7 +41,7 @@ defmodule Pleroma.Web.MediaProxyTest do        assert String.starts_with?(                 encoded, -               Config.get([:media_proxy, :base_url], Pleroma.Web.base_url()) +               Config.get([:media_proxy, :base_url], Pleroma.Web.Endpoint.url())               )        assert String.ends_with?(encoded, "/logo.png") diff --git a/test/pleroma/web/metadata/providers/open_graph_test.exs b/test/pleroma/web/metadata/providers/open_graph_test.exs index fc44b3cbd..28ca8839c 100644 --- a/test/pleroma/web/metadata/providers/open_graph_test.exs +++ b/test/pleroma/web/metadata/providers/open_graph_test.exs @@ -22,7 +22,12 @@ defmodule Pleroma.Web.Metadata.Providers.OpenGraphTest do            "attachment" => [              %{                "url" => [ -                %{"mediaType" => "image/png", "href" => "https://pleroma.gov/tenshi.png"} +                %{ +                  "mediaType" => "image/png", +                  "href" => "https://pleroma.gov/tenshi.png", +                  "height" => 1024, +                  "width" => 1280 +                }                ]              },              %{ @@ -35,7 +40,12 @@ defmodule Pleroma.Web.Metadata.Providers.OpenGraphTest do              },              %{                "url" => [ -                %{"mediaType" => "video/webm", "href" => "https://pleroma.gov/about/juche.webm"} +                %{ +                  "mediaType" => "video/webm", +                  "href" => "https://pleroma.gov/about/juche.webm", +                  "height" => 600, +                  "width" => 800 +                }                ]              },              %{ @@ -55,11 +65,15 @@ defmodule Pleroma.Web.Metadata.Providers.OpenGraphTest do      assert Enum.all?(               [                 {:meta, [property: "og:image", content: "https://pleroma.gov/tenshi.png"], []}, +               {:meta, [property: "og:image:width", content: "1280"], []}, +               {:meta, [property: "og:image:height", content: "1024"], []},                 {:meta,                  [property: "og:audio", content: "http://www.gnu.org/music/free-software-song.au"],                  []},                 {:meta, [property: "og:video", content: "https://pleroma.gov/about/juche.webm"], -                []} +                []}, +               {:meta, [property: "og:video:width", content: "800"], []}, +               {:meta, [property: "og:video:height", content: "600"], []}               ],               fn element -> element in result end             ) @@ -93,4 +107,84 @@ defmodule Pleroma.Web.Metadata.Providers.OpenGraphTest do      refute {:meta, [property: "og:image", content: "https://misskey.microsoft/corndog.png"], []} in result    end + +  test "video attachments have image thumbnail with WxH metadata with Preview Proxy enabled" do +    clear_config([:media_proxy, :enabled], true) +    clear_config([:media_preview_proxy, :enabled], true) +    user = insert(:user) + +    note = +      insert(:note, %{ +        data: %{ +          "actor" => user.ap_id, +          "id" => "https://pleroma.gov/objects/whatever", +          "content" => "test video post", +          "sensitive" => false, +          "attachment" => [ +            %{ +              "url" => [ +                %{ +                  "mediaType" => "video/webm", +                  "href" => "https://pleroma.gov/about/juche.webm", +                  "height" => 600, +                  "width" => 800 +                } +              ] +            } +          ] +        } +      }) + +    result = OpenGraph.build_tags(%{object: note, url: note.data["id"], user: user}) + +    assert {:meta, [property: "og:image:width", content: "800"], []} in result +    assert {:meta, [property: "og:image:height", content: "600"], []} in result + +    assert {:meta, +            [ +              property: "og:image", +              content: +                "http://localhost:4001/proxy/preview/LzAnlke-l5oZbNzWsrHfprX1rGw/aHR0cHM6Ly9wbGVyb21hLmdvdi9hYm91dC9qdWNoZS53ZWJt/juche.webm" +            ], []} in result +  end + +  test "video attachments have no image thumbnail with Preview Proxy disabled" do +    clear_config([:media_proxy, :enabled], true) +    clear_config([:media_preview_proxy, :enabled], false) +    user = insert(:user) + +    note = +      insert(:note, %{ +        data: %{ +          "actor" => user.ap_id, +          "id" => "https://pleroma.gov/objects/whatever", +          "content" => "test video post", +          "sensitive" => false, +          "attachment" => [ +            %{ +              "url" => [ +                %{ +                  "mediaType" => "video/webm", +                  "href" => "https://pleroma.gov/about/juche.webm", +                  "height" => 600, +                  "width" => 800 +                } +              ] +            } +          ] +        } +      }) + +    result = OpenGraph.build_tags(%{object: note, url: note.data["id"], user: user}) + +    refute {:meta, [property: "og:image:width", content: "800"], []} in result +    refute {:meta, [property: "og:image:height", content: "600"], []} in result + +    refute {:meta, +            [ +              property: "og:image", +              content: +                "http://localhost:4001/proxy/preview/LzAnlke-l5oZbNzWsrHfprX1rGw/aHR0cHM6Ly9wbGVyb21hLmdvdi9hYm91dC9qdWNoZS53ZWJt/juche.webm" +            ], []} in result +  end  end diff --git a/test/pleroma/web/metadata/providers/twitter_card_test.exs b/test/pleroma/web/metadata/providers/twitter_card_test.exs index a35e44356..1b8d27cda 100644 --- a/test/pleroma/web/metadata/providers/twitter_card_test.exs +++ b/test/pleroma/web/metadata/providers/twitter_card_test.exs @@ -9,6 +9,7 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do    alias Pleroma.User    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.Endpoint +  alias Pleroma.Web.MediaProxy    alias Pleroma.Web.Metadata.Providers.TwitterCard    alias Pleroma.Web.Metadata.Utils    alias Pleroma.Web.Router @@ -17,7 +18,7 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do    test "it renders twitter card for user info" do      user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994") -    avatar_url = Utils.attachment_url(User.avatar_url(user)) +    avatar_url = MediaProxy.preview_url(User.avatar_url(user))      res = TwitterCard.build_tags(%{user: user})      assert res == [ @@ -46,7 +47,7 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do      assert [               {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []}, -             {:meta, [property: "twitter:description", content: "“pleroma in a nutshell”"], []}, +             {:meta, [property: "twitter:description", content: "pleroma in a nutshell"], []},               {:meta, [property: "twitter:image", content: "http://localhost:4001/images/avi.png"],                []},               {:meta, [property: "twitter:card", content: "summary"], []} @@ -91,7 +92,7 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do      assert [               {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []}, -             {:meta, [property: "twitter:description", content: "“pleroma in a nutshell”"], []}, +             {:meta, [property: "twitter:description", content: "pleroma in a nutshell"], []},               {:meta, [property: "twitter:image", content: "http://localhost:4001/images/avi.png"],                []},               {:meta, [property: "twitter:card", content: "summary"], []} @@ -111,7 +112,14 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do            "content" => "pleroma in a nutshell",            "attachment" => [              %{ -              "url" => [%{"mediaType" => "image/png", "href" => "https://pleroma.gov/tenshi.png"}] +              "url" => [ +                %{ +                  "mediaType" => "image/png", +                  "href" => "https://pleroma.gov/tenshi.png", +                  "height" => 1024, +                  "width" => 1280 +                } +              ]              },              %{                "url" => [ @@ -123,7 +131,12 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do              },              %{                "url" => [ -                %{"mediaType" => "video/webm", "href" => "https://pleroma.gov/about/juche.webm"} +                %{ +                  "mediaType" => "video/webm", +                  "href" => "https://pleroma.gov/about/juche.webm", +                  "height" => 600, +                  "width" => 800 +                }                ]              }            ] @@ -134,17 +147,25 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do      assert [               {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []}, -             {:meta, [property: "twitter:description", content: "“pleroma in a nutshell”"], []}, +             {:meta, [property: "twitter:description", content: "pleroma in a nutshell"], []},               {:meta, [property: "twitter:card", content: "summary_large_image"], []},               {:meta, [property: "twitter:player", content: "https://pleroma.gov/tenshi.png"], []}, +             {:meta, [property: "twitter:player:width", content: "1280"], []}, +             {:meta, [property: "twitter:player:height", content: "1024"], []},               {:meta, [property: "twitter:card", content: "player"], []},               {:meta,                [                  property: "twitter:player",                  content: Router.Helpers.o_status_url(Endpoint, :notice_player, activity.id)                ], []}, -             {:meta, [property: "twitter:player:width", content: "480"], []}, -             {:meta, [property: "twitter:player:height", content: "480"], []} +             {:meta, [property: "twitter:player:width", content: "800"], []}, +             {:meta, [property: "twitter:player:height", content: "600"], []}, +             {:meta, +              [ +                property: "twitter:player:stream", +                content: "https://pleroma.gov/about/juche.webm" +              ], []}, +             {:meta, [property: "twitter:player:stream:content_type", content: "video/webm"], []}             ] == result    end  end diff --git a/test/pleroma/web/node_info_test.exs b/test/pleroma/web/node_info_test.exs index ee6fdaae8..9deceb1b5 100644 --- a/test/pleroma/web/node_info_test.exs +++ b/test/pleroma/web/node_info_test.exs @@ -150,37 +150,127 @@ defmodule Pleroma.Web.NodeInfoTest do             )    end -  test "it shows MRF transparency data if enabled", %{conn: conn} do -    clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) -    clear_config([:mrf, :transparency], true) +  describe "Quarantined instances" do +    setup do +      clear_config([:mrf, :transparency], true) +      quarantined_instances = [{"example.com", "reason to quarantine"}] +      clear_config([:instance, :quarantined_instances], quarantined_instances) +    end -    simple_config = %{"reject" => ["example.com"]} -    clear_config(:mrf_simple, simple_config) +    test "shows quarantined instances data if enabled", %{conn: conn} do +      expected_config = ["example.com"] -    response = -      conn -      |> get("/nodeinfo/2.1.json") -      |> json_response(:ok) +      response = +        conn +        |> get("/nodeinfo/2.1.json") +        |> json_response(:ok) + +      assert response["metadata"]["federation"]["quarantined_instances"] == expected_config +    end + +    test "shows extra information in the quarantined_info field for relevant entries", %{ +      conn: conn +    } do +      clear_config([:mrf, :transparency], true) -    assert response["metadata"]["federation"]["mrf_simple"] == simple_config +      expected_config = %{ +        "quarantined_instances" => %{ +          "example.com" => %{"reason" => "reason to quarantine"} +        } +      } + +      response = +        conn +        |> get("/nodeinfo/2.1.json") +        |> json_response(:ok) + +      assert response["metadata"]["federation"]["quarantined_instances_info"] == expected_config +    end    end -  test "it performs exclusions from MRF transparency data if configured", %{conn: conn} do -    clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) -    clear_config([:mrf, :transparency], true) -    clear_config([:mrf, :transparency_exclusions], ["other.site"]) +  describe "MRF SimplePolicy" do +    setup do +      clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) +      clear_config([:mrf, :transparency], true) +    end -    simple_config = %{"reject" => ["example.com", "other.site"]} -    clear_config(:mrf_simple, simple_config) +    test "shows MRF transparency data if enabled", %{conn: conn} do +      simple_config = %{"reject" => [{"example.com", ""}]} +      clear_config(:mrf_simple, simple_config) -    expected_config = %{"reject" => ["example.com"]} +      expected_config = %{"reject" => ["example.com"]} -    response = -      conn -      |> get("/nodeinfo/2.1.json") -      |> json_response(:ok) +      response = +        conn +        |> get("/nodeinfo/2.1.json") +        |> json_response(:ok) + +      assert response["metadata"]["federation"]["mrf_simple"] == expected_config +    end -    assert response["metadata"]["federation"]["mrf_simple"] == expected_config -    assert response["metadata"]["federation"]["exclusions"] == true +    test "performs exclusions from MRF transparency data if configured", %{conn: conn} do +      clear_config([:mrf, :transparency_exclusions], [ +        {"other.site", "We don't want them to know"} +      ]) + +      simple_config = %{"reject" => [{"example.com", ""}, {"other.site", ""}]} +      clear_config(:mrf_simple, simple_config) + +      expected_config = %{"reject" => ["example.com"]} + +      response = +        conn +        |> get("/nodeinfo/2.1.json") +        |> json_response(:ok) + +      assert response["metadata"]["federation"]["mrf_simple"] == expected_config +      assert response["metadata"]["federation"]["exclusions"] == true +    end + +    test "shows extra information in the mrf_simple_info field for relevant entries", %{ +      conn: conn +    } do +      simple_config = %{ +        media_removal: [{"no.media", "LEEWWWDD >//<"}], +        media_nsfw: [], +        federated_timeline_removal: [{"no.ftl", ""}], +        report_removal: [], +        reject: [ +          {"example.instance", "Some reason"}, +          {"uwu.owo", "awoo to much"}, +          {"no.reason", ""} +        ], +        followers_only: [], +        accept: [], +        avatar_removal: [], +        banner_removal: [], +        reject_deletes: [ +          {"peak.me", "I want to peak at what they don't want me to see, eheh"} +        ] +      } + +      clear_config(:mrf_simple, simple_config) + +      clear_config([:mrf, :transparency_exclusions], [ +        {"peak.me", "I don't want them to know"} +      ]) + +      expected_config = %{ +        "media_removal" => %{ +          "no.media" => %{"reason" => "LEEWWWDD >//<"} +        }, +        "reject" => %{ +          "example.instance" => %{"reason" => "Some reason"}, +          "uwu.owo" => %{"reason" => "awoo to much"} +        } +      } + +      response = +        conn +        |> get("/nodeinfo/2.1.json") +        |> json_response(:ok) + +      assert response["metadata"]["federation"]["mrf_simple_info"] == expected_config +    end    end  end diff --git a/test/pleroma/web/o_status/o_status_controller_test.exs b/test/pleroma/web/o_status/o_status_controller_test.exs index fab042439..b243e1692 100644 --- a/test/pleroma/web/o_status/o_status_controller_test.exs +++ b/test/pleroma/web/o_status/o_status_controller_test.exs @@ -182,7 +182,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do          |> response(200)        assert resp =~ -               "<meta content=\"#{Pleroma.Web.base_url()}/notice/#{note_activity.id}\" property=\"og:url\">" +               "<meta content=\"#{Pleroma.Web.Endpoint.url()}/notice/#{note_activity.id}\" property=\"og:url\">"        user = insert(:user) diff --git a/test/pleroma/web/pleroma_api/controllers/account_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/account_controller_test.exs index 9f14c5577..ad271c31b 100644 --- a/test/pleroma/web/pleroma_api/controllers/account_controller_test.exs +++ b/test/pleroma/web/pleroma_api/controllers/account_controller_test.exs @@ -174,9 +174,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do        response =          conn          |> get( -          "/api/v1/pleroma/accounts/#{user.id}/favourites?since_id=#{third_activity.id}&max_id=#{ -            seventh_activity.id -          }" +          "/api/v1/pleroma/accounts/#{user.id}/favourites?since_id=#{third_activity.id}&max_id=#{seventh_activity.id}"          )          |> json_response_and_validate_schema(:ok) diff --git a/test/pleroma/web/pleroma_api/controllers/user_import_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/user_import_controller_test.exs index 25a7f8374..d977bc3a2 100644 --- a/test/pleroma/web/pleroma_api/controllers/user_import_controller_test.exs +++ b/test/pleroma/web/pleroma_api/controllers/user_import_controller_test.exs @@ -83,7 +83,7 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do            assert %{"error" => "Insufficient permissions: follow | write:follows."} ==                     json_response(conn, 403)          else -          assert json_response(conn, 200) +          assert json_response_and_validate_schema(conn, 200)          end        end      end diff --git a/test/pleroma/web/plugs/frontend_static_plug_test.exs b/test/pleroma/web/plugs/frontend_static_plug_test.exs index 7596a9a54..4b3925ad2 100644 --- a/test/pleroma/web/plugs/frontend_static_plug_test.exs +++ b/test/pleroma/web/plugs/frontend_static_plug_test.exs @@ -96,15 +96,15 @@ defmodule Pleroma.Web.Plugs.FrontendStaticPlugTest do        "internal",        ".well-known",        "nodeinfo", -      "web", +      "manifest.json",        "auth", -      "embed",        "proxy", +      "phoenix",        "test",        "user_exists",        "check_password"      ] -    assert expected_routes == Pleroma.Web.get_api_routes() +    assert expected_routes == Pleroma.Web.Router.get_api_routes()    end  end diff --git a/test/pleroma/web/plugs/rate_limiter_test.exs b/test/pleroma/web/plugs/rate_limiter_test.exs index d007e3f26..b7cfde1f7 100644 --- a/test/pleroma/web/plugs/rate_limiter_test.exs +++ b/test/pleroma/web/plugs/rate_limiter_test.exs @@ -48,6 +48,7 @@ defmodule Pleroma.Web.Plugs.RateLimiterTest do      refute RateLimiter.disabled?(build_conn())    end +  @tag :erratic    test "it restricts based on config values" do      limiter_name = :test_plug_opts      scale = 80 @@ -137,6 +138,7 @@ defmodule Pleroma.Web.Plugs.RateLimiterTest do    end    describe "unauthenticated users" do +    @tag :erratic      test "are restricted based on remote IP" do        limiter_name = :test_unauthenticated        clear_config([:rate_limit, limiter_name], [{1000, 5}, {1, 10}]) @@ -174,6 +176,7 @@ defmodule Pleroma.Web.Plugs.RateLimiterTest do        :ok      end +    @tag :erratic      test "can have limits separate from unauthenticated connections" do        limiter_name = :test_authenticated1 @@ -199,6 +202,7 @@ defmodule Pleroma.Web.Plugs.RateLimiterTest do        assert conn.halted      end +    @tag :erratic      test "different users are counted independently" do        limiter_name = :test_authenticated2        clear_config([:rate_limit, limiter_name], [{1, 10}, {1000, 5}]) diff --git a/test/pleroma/web/plugs/user_is_staff_plug_test.exs b/test/pleroma/web/plugs/user_is_staff_plug_test.exs new file mode 100644 index 000000000..a0c4061db --- /dev/null +++ b/test/pleroma/web/plugs/user_is_staff_plug_test.exs @@ -0,0 +1,47 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Plugs.UserIsStaffPlugTest do +  use Pleroma.Web.ConnCase, async: true + +  alias Pleroma.Web.Plugs.UserIsStaffPlug +  import Pleroma.Factory + +  test "accepts a user that is an admin" do +    user = insert(:user, is_admin: true) + +    conn = assign(build_conn(), :user, user) + +    ret_conn = UserIsStaffPlug.call(conn, %{}) + +    assert conn == ret_conn +  end + +  test "accepts a user that is a moderator" do +    user = insert(:user, is_moderator: true) + +    conn = assign(build_conn(), :user, user) + +    ret_conn = UserIsStaffPlug.call(conn, %{}) + +    assert conn == ret_conn +  end + +  test "denies a user that isn't a staff member" do +    user = insert(:user) + +    conn = +      build_conn() +      |> assign(:user, user) +      |> UserIsStaffPlug.call(%{}) + +    assert conn.status == 403 +  end + +  test "denies when a user isn't set" do +    conn = UserIsStaffPlug.call(build_conn(), %{}) + +    assert conn.status == 403 +  end +end diff --git a/test/pleroma/web/rich_media/parser/ttl/aws_signed_url_test.exs b/test/pleroma/web/rich_media/parser/ttl/aws_signed_url_test.exs index df3ea3e99..0c8203417 100644 --- a/test/pleroma/web/rich_media/parser/ttl/aws_signed_url_test.exs +++ b/test/pleroma/web/rich_media/parser/ttl/aws_signed_url_test.exs @@ -66,9 +66,7 @@ defmodule Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrlTest do    end    defp construct_s3_url(timestamp, valid_till) do -    "https://pleroma.s3.ap-southeast-1.amazonaws.com/sachin%20%281%29%20_a%20-%25%2Aasdasd%20BNN%20bnnn%20.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIBLWWK6RGDQXDLJQ%2F20190716%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=#{ -      timestamp -    }&X-Amz-Expires=#{valid_till}&X-Amz-Signature=04ffd6b98634f4b1bbabc62e0fac4879093cd54a6eed24fe8eb38e8369526bbf&X-Amz-SignedHeaders=host" +    "https://pleroma.s3.ap-southeast-1.amazonaws.com/sachin%20%281%29%20_a%20-%25%2Aasdasd%20BNN%20bnnn%20.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIBLWWK6RGDQXDLJQ%2F20190716%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=#{timestamp}&X-Amz-Expires=#{valid_till}&X-Amz-Signature=04ffd6b98634f4b1bbabc62e0fac4879093cd54a6eed24fe8eb38e8369526bbf&X-Amz-SignedHeaders=host"    end    defp construct_metadata(timestamp, valid_till, url) do diff --git a/test/pleroma/web/chat_channel_test.exs b/test/pleroma/web/shout_channel_test.exs index 29999701c..5c86efe9f 100644 --- a/test/pleroma/web/chat_channel_test.exs +++ b/test/pleroma/web/shout_channel_test.exs @@ -2,9 +2,9 @@  # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ChatChannelTest do +defmodule Pleroma.Web.ShoutChannelTest do    use Pleroma.Web.ChannelCase -  alias Pleroma.Web.ChatChannel +  alias Pleroma.Web.ShoutChannel    alias Pleroma.Web.UserSocket    import Pleroma.Factory @@ -14,7 +14,7 @@ defmodule Pleroma.Web.ChatChannelTest do      {:ok, _, socket} =        socket(UserSocket, "", %{user_name: user.nickname}) -      |> subscribe_and_join(ChatChannel, "chat:public") +      |> subscribe_and_join(ShoutChannel, "chat:public")      {:ok, socket: socket}    end @@ -25,7 +25,7 @@ defmodule Pleroma.Web.ChatChannelTest do    end    describe "message lengths" do -    setup do: clear_config([:instance, :chat_limit]) +    setup do: clear_config([:shout, :limit])      test "it ignores messages of length zero", %{socket: socket} do        push(socket, "new_msg", %{"text" => ""}) @@ -33,7 +33,7 @@ defmodule Pleroma.Web.ChatChannelTest do      end      test "it ignores messages above a certain length", %{socket: socket} do -      clear_config([:instance, :chat_limit], 2) +      clear_config([:shout, :limit], 2)        push(socket, "new_msg", %{"text" => "123"})        refute_broadcast("new_msg", %{text: "123"})      end diff --git a/test/pleroma/web/static_fe/static_fe_controller_test.exs b/test/pleroma/web/static_fe/static_fe_controller_test.exs index 2af14dfeb..5752cffda 100644 --- a/test/pleroma/web/static_fe/static_fe_controller_test.exs +++ b/test/pleroma/web/static_fe/static_fe_controller_test.exs @@ -7,6 +7,7 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do    alias Pleroma.Activity    alias Pleroma.Web.ActivityPub.Transmogrifier +  alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.CommonAPI    import Pleroma.Factory @@ -185,16 +186,16 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do      test "302 for remote cached status", %{conn: conn, user: user} do        message = %{          "@context" => "https://www.w3.org/ns/activitystreams", -        "to" => user.follower_address, -        "cc" => "https://www.w3.org/ns/activitystreams#Public",          "type" => "Create", +        "actor" => user.ap_id,          "object" => %{ +          "to" => user.follower_address, +          "cc" => "https://www.w3.org/ns/activitystreams#Public", +          "id" => Utils.generate_object_id(),            "content" => "blah blah blah",            "type" => "Note", -          "attributedTo" => user.ap_id, -          "inReplyTo" => nil -        }, -        "actor" => user.ap_id +          "attributedTo" => user.ap_id +        }        }        assert {:ok, activity} = Transmogrifier.handle_incoming(message) diff --git a/test/pleroma/web/twitter_api/controller_test.exs b/test/pleroma/web/twitter_api/controller_test.exs index 583c904b2..bca9e2dad 100644 --- a/test/pleroma/web/twitter_api/controller_test.exs +++ b/test/pleroma/web/twitter_api/controller_test.exs @@ -7,59 +7,10 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do    alias Pleroma.Repo    alias Pleroma.User -  alias Pleroma.Web.CommonAPI    alias Pleroma.Web.OAuth.Token    import Pleroma.Factory -  describe "POST /api/qvitter/statuses/notifications/read" do -    test "without valid credentials", %{conn: conn} do -      conn = post(conn, "/api/qvitter/statuses/notifications/read", %{"latest_id" => 1_234_567}) -      assert json_response(conn, 403) == %{"error" => "Invalid credentials."} -    end - -    test "with credentials, without any params" do -      %{conn: conn} = oauth_access(["write:notifications"]) - -      conn = post(conn, "/api/qvitter/statuses/notifications/read") - -      assert json_response(conn, 400) == %{ -               "error" => "You need to specify latest_id", -               "request" => "/api/qvitter/statuses/notifications/read" -             } -    end - -    test "with credentials, with params" do -      %{user: current_user, conn: conn} = -        oauth_access(["read:notifications", "write:notifications"]) - -      other_user = insert(:user) - -      {:ok, _activity} = -        CommonAPI.post(other_user, %{ -          status: "Hey @#{current_user.nickname}" -        }) - -      response_conn = -        conn -        |> get("/api/v1/notifications") - -      [notification] = json_response(response_conn, 200) - -      assert notification["pleroma"]["is_seen"] == false - -      response_conn = -        conn -        |> post("/api/qvitter/statuses/notifications/read", %{"latest_id" => notification["id"]}) - -      [notification] = response = json_response(response_conn, 200) - -      assert length(response) == 1 - -      assert notification["pleroma"]["is_seen"] == true -    end -  end -    describe "GET /api/account/confirm_email/:id/:token" do      setup do        {:ok, user} = diff --git a/test/pleroma/web/twitter_api/password_controller_test.exs b/test/pleroma/web/twitter_api/password_controller_test.exs index cf99e2434..45ab10a8a 100644 --- a/test/pleroma/web/twitter_api/password_controller_test.exs +++ b/test/pleroma/web/twitter_api/password_controller_test.exs @@ -5,10 +5,14 @@  defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do    use Pleroma.Web.ConnCase +  alias Pleroma.Config    alias Pleroma.PasswordResetToken +  alias Pleroma.Repo +  alias Pleroma.Tests.ObanHelpers    alias Pleroma.User    alias Pleroma.Web.OAuth.Token    import Pleroma.Factory +  import Swoosh.TestAssertions    describe "GET /api/pleroma/password_reset/token" do      test "it returns error when token invalid", %{conn: conn} do @@ -116,4 +120,94 @@ defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do        assert User.get_by_id(user.id).password_reset_pending == false      end    end + +  describe "POST /auth/password, with valid parameters" do +    setup %{conn: conn} do +      user = insert(:user) +      conn = post(conn, "/auth/password?email=#{user.email}") +      %{conn: conn, user: user} +    end + +    test "it returns 204", %{conn: conn} do +      assert empty_json_response(conn) +    end + +    test "it creates a PasswordResetToken record for user", %{user: user} do +      token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id) +      assert token_record +    end + +    test "it sends an email to user", %{user: user} do +      ObanHelpers.perform_all() +      token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id) + +      email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token) +      notify_email = Config.get([:instance, :notify_email]) +      instance_name = Config.get([:instance, :name]) + +      assert_email_sent( +        from: {instance_name, notify_email}, +        to: {user.name, user.email}, +        html_body: email.html_body +      ) +    end +  end + +  describe "POST /auth/password, with nickname" do +    test "it returns 204", %{conn: conn} do +      user = insert(:user) + +      assert conn +             |> post("/auth/password?nickname=#{user.nickname}") +             |> empty_json_response() + +      ObanHelpers.perform_all() +      token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id) + +      email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token) +      notify_email = Config.get([:instance, :notify_email]) +      instance_name = Config.get([:instance, :name]) + +      assert_email_sent( +        from: {instance_name, notify_email}, +        to: {user.name, user.email}, +        html_body: email.html_body +      ) +    end + +    test "it doesn't fail when a user has no email", %{conn: conn} do +      user = insert(:user, %{email: nil}) + +      assert conn +             |> post("/auth/password?nickname=#{user.nickname}") +             |> empty_json_response() +    end +  end + +  describe "POST /auth/password, with invalid parameters" do +    setup do +      user = insert(:user) +      {:ok, user: user} +    end + +    test "it returns 204 when user is not found", %{conn: conn, user: user} do +      conn = post(conn, "/auth/password?email=nonexisting_#{user.email}") + +      assert empty_json_response(conn) +    end + +    test "it returns 204 when user is not local", %{conn: conn, user: user} do +      {:ok, user} = Repo.update(Ecto.Changeset.change(user, local: false)) +      conn = post(conn, "/auth/password?email=#{user.email}") + +      assert empty_json_response(conn) +    end + +    test "it returns 204 when user is deactivated", %{conn: conn, user: user} do +      {:ok, user} = Repo.update(Ecto.Changeset.change(user, is_active: false, local: true)) +      conn = post(conn, "/auth/password?email=#{user.email}") + +      assert empty_json_response(conn) +    end +  end  end diff --git a/test/pleroma/web/twitter_api/twitter_api_test.exs b/test/pleroma/web/twitter_api/twitter_api_test.exs index 85629be04..2b8a4c3f5 100644 --- a/test/pleroma/web/twitter_api/twitter_api_test.exs +++ b/test/pleroma/web/twitter_api/twitter_api_test.exs @@ -139,9 +139,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      {:ok, user2} = TwitterAPI.register_user(data2)      expected_text = -      ~s(<span class="h-card"><a class="u-url mention" data-user="#{user1.id}" href="#{ -        user1.ap_id -      }" rel="ugc">@<span>john</span></a></span> test) +      ~s(<span class="h-card"><a class="u-url mention" data-user="#{user1.id}" href="#{user1.ap_id}" rel="ugc">@<span>john</span></a></span> test)      assert user2.bio == expected_text    end diff --git a/test/pleroma/web/twitter_api/util_controller_test.exs b/test/pleroma/web/twitter_api/util_controller_test.exs index bdbc478c3..ee658ddf6 100644 --- a/test/pleroma/web/twitter_api/util_controller_test.exs +++ b/test/pleroma/web/twitter_api/util_controller_test.exs @@ -25,11 +25,10 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      test "it updates notification settings", %{user: user, conn: conn} do        conn -      |> put("/api/pleroma/notification_settings", %{ -        "block_from_strangers" => true, -        "bar" => 1 -      }) -      |> json_response(:ok) +      |> put( +        "/api/pleroma/notification_settings?#{URI.encode_query(%{block_from_strangers: true})}" +      ) +      |> json_response_and_validate_schema(:ok)        user = refresh_record(user) @@ -41,8 +40,10 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      test "it updates notification settings to enable hiding contents", %{user: user, conn: conn} do        conn -      |> put("/api/pleroma/notification_settings", %{"hide_notification_contents" => "1"}) -      |> json_response(:ok) +      |> put( +        "/api/pleroma/notification_settings?#{URI.encode_query(%{hide_notification_contents: 1})}" +      ) +      |> json_response_and_validate_schema(:ok)        user = refresh_record(user) @@ -70,7 +71,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        response =          conn          |> get("/api/pleroma/frontend_configurations") -        |> json_response(:ok) +        |> json_response_and_validate_schema(:ok)        assert response == Jason.encode!(config |> Enum.into(%{})) |> Jason.decode!()      end @@ -81,7 +82,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        emoji =          conn          |> get("/api/pleroma/emoji") -        |> json_response(200) +        |> json_response_and_validate_schema(200)        assert Enum.all?(emoji, fn                 {_key, @@ -103,7 +104,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        response =          conn          |> get("/api/pleroma/healthcheck") -        |> json_response(503) +        |> json_response_and_validate_schema(503)        assert response == %{}      end @@ -116,7 +117,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do          response =            conn            |> get("/api/pleroma/healthcheck") -          |> json_response(200) +          |> json_response_and_validate_schema(200)          assert %{                   "active" => _, @@ -136,7 +137,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do          response =            conn            |> get("/api/pleroma/healthcheck") -          |> json_response(503) +          |> json_response_and_validate_schema(503)          assert %{                   "active" => _, @@ -155,8 +156,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      test "with valid permissions and password, it disables the account", %{conn: conn, user: user} do        response =          conn -        |> post("/api/pleroma/disable_account", %{"password" => "test"}) -        |> json_response(:ok) +        |> post("/api/pleroma/disable_account?password=test") +        |> json_response_and_validate_schema(:ok)        assert response == %{"status" => "success"}        ObanHelpers.perform_all() @@ -171,8 +172,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        response =          conn -        |> post("/api/pleroma/disable_account", %{"password" => "test1"}) -        |> json_response(:ok) +        |> post("/api/pleroma/disable_account?password=test1") +        |> json_response_and_validate_schema(:ok)        assert response == %{"error" => "Invalid password."}        user = User.get_cached_by_id(user.id) @@ -252,54 +253,93 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        conn =          conn          |> assign(:token, nil) -        |> post("/api/pleroma/change_email") +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_email", %{password: "hi", email: "test@test.com"}) -      assert json_response(conn, 403) == %{"error" => "Insufficient permissions: write:accounts."} +      assert json_response_and_validate_schema(conn, 403) == %{ +               "error" => "Insufficient permissions: write:accounts." +             }      end      test "with proper permissions and invalid password", %{conn: conn} do        conn = -        post(conn, "/api/pleroma/change_email", %{ -          "password" => "hi", -          "email" => "test@test.com" -        }) +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_email", %{password: "hi", email: "test@test.com"}) -      assert json_response(conn, 200) == %{"error" => "Invalid password."} +      assert json_response_and_validate_schema(conn, 200) == %{"error" => "Invalid password."}      end      test "with proper permissions, valid password and invalid email", %{        conn: conn      } do        conn = -        post(conn, "/api/pleroma/change_email", %{ -          "password" => "test", -          "email" => "foobar" -        }) +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_email", %{password: "test", email: "foobar"}) -      assert json_response(conn, 200) == %{"error" => "Email has invalid format."} +      assert json_response_and_validate_schema(conn, 200) == %{ +               "error" => "Email has invalid format." +             }      end      test "with proper permissions, valid password and no email", %{        conn: conn      } do        conn = -        post(conn, "/api/pleroma/change_email", %{ -          "password" => "test" -        }) +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_email", %{password: "test"}) -      assert json_response(conn, 200) == %{"error" => "Email can't be blank."} +      assert %{"error" => "Missing field: email."} = json_response_and_validate_schema(conn, 400)      end -    test "with proper permissions, valid password and blank email", %{ -      conn: conn -    } do +    test "with proper permissions, valid password and blank email, when instance requires user email", +         %{ +           conn: conn +         } do +      orig_account_activation_required = +        Pleroma.Config.get([:instance, :account_activation_required]) + +      Pleroma.Config.put([:instance, :account_activation_required], true) + +      on_exit(fn -> +        Pleroma.Config.put( +          [:instance, :account_activation_required], +          orig_account_activation_required +        ) +      end) +        conn = -        post(conn, "/api/pleroma/change_email", %{ -          "password" => "test", -          "email" => "" -        }) +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_email", %{password: "test", email: ""}) -      assert json_response(conn, 200) == %{"error" => "Email can't be blank."} +      assert json_response_and_validate_schema(conn, 200) == %{"error" => "Email can't be blank."} +    end + +    test "with proper permissions, valid password and blank email, when instance does not require user email", +         %{ +           conn: conn +         } do +      orig_account_activation_required = +        Pleroma.Config.get([:instance, :account_activation_required]) + +      Pleroma.Config.put([:instance, :account_activation_required], false) + +      on_exit(fn -> +        Pleroma.Config.put( +          [:instance, :account_activation_required], +          orig_account_activation_required +        ) +      end) + +      conn = +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_email", %{password: "test", email: ""}) + +      assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}      end      test "with proper permissions, valid password and non unique email", %{ @@ -308,24 +348,24 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        user = insert(:user)        conn = -        post(conn, "/api/pleroma/change_email", %{ -          "password" => "test", -          "email" => user.email -        }) +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_email", %{password: "test", email: user.email}) -      assert json_response(conn, 200) == %{"error" => "Email has already been taken."} +      assert json_response_and_validate_schema(conn, 200) == %{ +               "error" => "Email has already been taken." +             }      end      test "with proper permissions, valid password and valid email", %{        conn: conn      } do        conn = -        post(conn, "/api/pleroma/change_email", %{ -          "password" => "test", -          "email" => "cofe@foobar.com" -        }) +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_email", %{password: "test", email: "cofe@foobar.com"}) -      assert json_response(conn, 200) == %{"status" => "success"} +      assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}      end    end @@ -336,20 +376,29 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        conn =          conn          |> assign(:token, nil) -        |> post("/api/pleroma/change_password") +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_password", %{ +          "password" => "hi", +          "new_password" => "newpass", +          "new_password_confirmation" => "newpass" +        }) -      assert json_response(conn, 403) == %{"error" => "Insufficient permissions: write:accounts."} +      assert json_response_and_validate_schema(conn, 403) == %{ +               "error" => "Insufficient permissions: write:accounts." +             }      end      test "with proper permissions and invalid password", %{conn: conn} do        conn = -        post(conn, "/api/pleroma/change_password", %{ +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_password", %{            "password" => "hi",            "new_password" => "newpass",            "new_password_confirmation" => "newpass"          }) -      assert json_response(conn, 200) == %{"error" => "Invalid password."} +      assert json_response_and_validate_schema(conn, 200) == %{"error" => "Invalid password."}      end      test "with proper permissions, valid password and new password and confirmation not matching", @@ -357,13 +406,15 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do             conn: conn           } do        conn = -        post(conn, "/api/pleroma/change_password", %{ +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_password", %{            "password" => "test",            "new_password" => "newpass",            "new_password_confirmation" => "notnewpass"          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "error" => "New password does not match confirmation."               }      end @@ -372,13 +423,15 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        conn: conn      } do        conn = -        post(conn, "/api/pleroma/change_password", %{ -          "password" => "test", -          "new_password" => "", -          "new_password_confirmation" => "" +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post("/api/pleroma/change_password", %{ +          password: "test", +          new_password: "", +          new_password_confirmation: ""          }) -      assert json_response(conn, 200) == %{ +      assert json_response_and_validate_schema(conn, 200) == %{                 "error" => "New password can't be blank."               }      end @@ -388,13 +441,18 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        user: user      } do        conn = -        post(conn, "/api/pleroma/change_password", %{ -          "password" => "test", -          "new_password" => "newpass", -          "new_password_confirmation" => "newpass" -        }) - -      assert json_response(conn, 200) == %{"status" => "success"} +        conn +        |> put_req_header("content-type", "multipart/form-data") +        |> post( +          "/api/pleroma/change_password", +          %{ +            password: "test", +            new_password: "newpass", +            new_password_confirmation: "newpass" +          } +        ) + +      assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}        fetched_user = User.get_cached_by_id(user.id)        assert Pleroma.Password.Pbkdf2.verify_pass("newpass", fetched_user.password_hash) == true      end @@ -409,22 +467,47 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do          |> assign(:token, nil)          |> post("/api/pleroma/delete_account") -      assert json_response(conn, 403) == +      assert json_response_and_validate_schema(conn, 403) ==                 %{"error" => "Insufficient permissions: write:accounts."}      end      test "with proper permissions and wrong or missing password", %{conn: conn} do        for params <- [%{"password" => "hi"}, %{}] do -        ret_conn = post(conn, "/api/pleroma/delete_account", params) +        ret_conn = +          conn +          |> put_req_header("content-type", "application/json") +          |> post("/api/pleroma/delete_account", params) -        assert json_response(ret_conn, 200) == %{"error" => "Invalid password."} +        assert json_response_and_validate_schema(ret_conn, 200) == %{ +                 "error" => "Invalid password." +               }        end      end -    test "with proper permissions and valid password", %{conn: conn, user: user} do -      conn = post(conn, "/api/pleroma/delete_account", %{"password" => "test"}) +    test "with proper permissions and valid password (URL query)", %{conn: conn, user: user} do +      conn = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/delete_account?password=test") + +      ObanHelpers.perform_all() +      assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"} + +      user = User.get_by_id(user.id) +      refute user.is_active +      assert user.name == nil +      assert user.bio == "" +      assert user.password_hash == nil +    end + +    test "with proper permissions and valid password (JSON body)", %{conn: conn, user: user} do +      conn = +        conn +        |> put_req_header("content-type", "application/json") +        |> post("/api/pleroma/delete_account", %{password: "test"}) +        ObanHelpers.perform_all() -      assert json_response(conn, 200) == %{"status" => "success"} +      assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}        user = User.get_by_id(user.id)        refute user.is_active diff --git a/test/pleroma/web/web_finger/web_finger_controller_test.exs b/test/pleroma/web/web_finger/web_finger_controller_test.exs index 7059850bd..66d79320f 100644 --- a/test/pleroma/web/web_finger/web_finger_controller_test.exs +++ b/test/pleroma/web/web_finger/web_finger_controller_test.exs @@ -24,9 +24,7 @@ defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do      assert response.status == 200      assert response.resp_body == -             ~s(<?xml version="1.0" encoding="UTF-8"?><XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"><Link rel="lrdd" template="#{ -               Pleroma.Web.base_url() -             }/.well-known/webfinger?resource={uri}" type="application/xrd+xml" /></XRD>) +             ~s(<?xml version="1.0" encoding="UTF-8"?><XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"><Link rel="lrdd" template="#{Pleroma.Web.Endpoint.url()}/.well-known/webfinger?resource={uri}" type="application/xrd+xml" /></XRD>)    end    test "Webfinger JRD" do diff --git a/test/pleroma/web/web_finger_test.exs b/test/pleroma/web/web_finger_test.exs index 2d7b4a40b..0a36d57e6 100644 --- a/test/pleroma/web/web_finger_test.exs +++ b/test/pleroma/web/web_finger_test.exs @@ -17,7 +17,7 @@ defmodule Pleroma.Web.WebFingerTest do      test "returns a link to the xml lrdd" do        host_info = WebFinger.host_meta() -      assert String.contains?(host_info, Pleroma.Web.base_url()) +      assert String.contains?(host_info, Pleroma.Web.Endpoint.url())      end    end diff --git a/test/support/api_spec_helpers.ex b/test/support/api_spec_helpers.ex index 36d6a8b81..886e72d73 100644 --- a/test/support/api_spec_helpers.ex +++ b/test/support/api_spec_helpers.ex @@ -29,9 +29,7 @@ defmodule Pleroma.Tests.ApiSpecHelpers do            end)          flunk( -          "Value does not conform to schema #{schema.title}: #{Enum.join(errors, "\n")}\n#{ -            inspect(value) -          }" +          "Value does not conform to schema #{schema.title}: #{Enum.join(errors, "\n")}\n#{inspect(value)}"          )      end    end diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index deee98599..eab469833 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -102,9 +102,7 @@ defmodule Pleroma.Web.ConnCase do                end)              flunk( -              "Response does not conform to schema of #{op_id} operation: #{ -                Enum.join(errors, "\n") -              }\n#{inspect(json)}" +              "Response does not conform to schema of #{op_id} operation: #{Enum.join(errors, "\n")}\n#{inspect(json)}"              )          end        end diff --git a/test/support/factory.ex b/test/support/factory.ex index 5c4e65c81..4a78425ce 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -142,6 +142,11 @@ defmodule Pleroma.Factory do      }    end +  def followers_only_note_factory(attrs \\ %{}) do +    %Pleroma.Object{data: data} = note_factory(attrs) +    %Pleroma.Object{data: Map.merge(data, %{"to" => [data["actor"] <> "/followers"]})} +  end +    def audio_factory(attrs \\ %{}) do      text = sequence(:text, &"lain radio episode #{&1}") @@ -191,8 +196,8 @@ defmodule Pleroma.Factory do    end    def article_factory do -    note_factory() -    |> Map.put("type", "Article") +    %Pleroma.Object{data: data} = note_factory() +    %Pleroma.Object{data: Map.merge(data, %{"type" => "Article"})}    end    def tombstone_factory do @@ -208,6 +213,38 @@ defmodule Pleroma.Factory do      }    end +  def question_factory(attrs \\ %{}) do +    user = attrs[:user] || insert(:user) + +    data = %{ +      "id" => Pleroma.Web.ActivityPub.Utils.generate_object_id(), +      "type" => "Question", +      "actor" => user.ap_id, +      "attributedTo" => user.ap_id, +      "attachment" => [], +      "to" => ["https://www.w3.org/ns/activitystreams#Public"], +      "cc" => [user.follower_address], +      "context" => Pleroma.Web.ActivityPub.Utils.generate_context_id(), +      "closed" => DateTime.utc_now() |> DateTime.add(86_400) |> DateTime.to_iso8601(), +      "oneOf" => [ +        %{ +          "type" => "Note", +          "name" => "chocolate", +          "replies" => %{"totalItems" => 0, "type" => "Collection"} +        }, +        %{ +          "type" => "Note", +          "name" => "vanilla", +          "replies" => %{"totalItems" => 0, "type" => "Collection"} +        } +      ] +    } + +    %Pleroma.Object{ +      data: merge_attributes(data, Map.get(attrs, :data, %{})) +    } +  end +    def direct_note_activity_factory do      dm = insert(:direct_note) @@ -267,6 +304,33 @@ defmodule Pleroma.Factory do      |> Map.merge(attrs)    end +  def followers_only_note_activity_factory(attrs \\ %{}) do +    user = attrs[:user] || insert(:user) +    note = insert(:followers_only_note, user: user) + +    data_attrs = attrs[:data_attrs] || %{} +    attrs = Map.drop(attrs, [:user, :note, :data_attrs]) + +    data = +      %{ +        "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(), +        "type" => "Create", +        "actor" => note.data["actor"], +        "to" => note.data["to"], +        "object" => note.data, +        "published" => DateTime.utc_now() |> DateTime.to_iso8601(), +        "context" => note.data["context"] +      } +      |> Map.merge(data_attrs) + +    %Pleroma.Activity{ +      data: data, +      actor: data["actor"], +      recipients: data["to"] +    } +    |> Map.merge(attrs) +  end +    def note_activity_factory(attrs \\ %{}) do      user = attrs[:user] || insert(:user)      note = attrs[:note] || insert(:note, user: user) @@ -396,6 +460,33 @@ defmodule Pleroma.Factory do      }    end +  def question_activity_factory(attrs \\ %{}) do +    user = attrs[:user] || insert(:user) +    question = attrs[:question] || insert(:question, user: user) + +    data_attrs = attrs[:data_attrs] || %{} +    attrs = Map.drop(attrs, [:user, :question, :data_attrs]) + +    data = +      %{ +        "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(), +        "type" => "Create", +        "actor" => question.data["actor"], +        "to" => question.data["to"], +        "object" => question.data["id"], +        "published" => DateTime.utc_now() |> DateTime.to_iso8601(), +        "context" => question.data["context"] +      } +      |> Map.merge(data_attrs) + +    %Pleroma.Activity{ +      data: data, +      actor: data["actor"], +      recipients: data["to"] +    } +    |> Map.merge(attrs) +  end +    def oauth_app_factory do      %Pleroma.Web.OAuth.App{        client_name: sequence(:client_name, &"Some client #{&1}"), diff --git a/test/support/helpers.ex b/test/support/helpers.ex index 856a6a376..34f1505d0 100644 --- a/test/support/helpers.ex +++ b/test/support/helpers.ex @@ -42,8 +42,7 @@ defmodule Pleroma.Tests.Helpers do      # Displaying a warning to prevent unintentional clearing of all but one keys in section      if Keyword.keyword?(temp_setting) and length(temp_setting) == 1 do        Logger.warn( -        "Please change to `clear_config([section]); clear_config([section, key], value)`: " <> -          "#{inspect(config_path)}, #{inspect(temp_setting)}" +        "Please change `clear_config([section], key: value)` to `clear_config([section, key], value)`"        )      end diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index 8807c2d14..94900dc14 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -1313,9 +1313,7 @@ defmodule HttpRequestMock do    def get(url, query, body, headers) do      {:error, -     "Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{ -       inspect(headers) -     }"} +     "Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{inspect(headers)}"}    end    # POST Requests @@ -1381,9 +1379,7 @@ defmodule HttpRequestMock do    def post(url, query, body, headers) do      {:error, -     "Mock response not implemented for POST #{inspect(url)}, #{query}, #{inspect(body)}, #{ -       inspect(headers) -     }"} +     "Mock response not implemented for POST #{inspect(url)}, #{query}, #{inspect(body)}, #{inspect(headers)}"}    end    # Most of the rich media mocks are missing HEAD requests, so we just return 404. @@ -1398,8 +1394,6 @@ defmodule HttpRequestMock do    def head(url, query, body, headers) do      {:error, -     "Mock response not implemented for HEAD #{inspect(url)}, #{query}, #{inspect(body)}, #{ -       inspect(headers) -     }"} +     "Mock response not implemented for HEAD #{inspect(url)}, #{query}, #{inspect(body)}, #{inspect(headers)}"}    end  end diff --git a/test/support/mrf_module_mock.ex b/test/support/mrf_module_mock.ex index 4dfdeb3b4..4d21d7fe0 100644 --- a/test/support/mrf_module_mock.ex +++ b/test/support/mrf_module_mock.ex @@ -3,7 +3,7 @@  # SPDX-License-Identifier: AGPL-3.0-only  defmodule MRFModuleMock do -  @behaviour Pleroma.Web.ActivityPub.MRF +  @behaviour Pleroma.Web.ActivityPub.MRF.Policy    @impl true    def filter(message), do: {:ok, message} diff --git a/test/test_helper.exs b/test/test_helper.exs index 0c9783076..9fb41e985 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -3,7 +3,7 @@  # SPDX-License-Identifier: AGPL-3.0-only  os_exclude = if :os.type() == {:unix, :darwin}, do: [skip_on_mac: true], else: [] -ExUnit.start(exclude: [:federated | os_exclude]) +ExUnit.start(exclude: [:federated, :erratic] ++ os_exclude)  Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, :manual) | 
