diff options
| author | lain <lain@soykaf.club> | 2020-11-04 15:05:01 +0100 | 
|---|---|---|
| committer | lain <lain@soykaf.club> | 2020-11-04 15:05:01 +0100 | 
| commit | 329aa19c9f1175f915441c84689860155949bb08 (patch) | |
| tree | 17a92069fdb2f49d2f82efdabf3bec1e20822508 /test | |
| parent | 755f58168bb2b6b979c6f5d36f7eff56d2305911 (diff) | |
| parent | bc4d9c4ffc9ccd826220893a97ce695e4bb66f9d (diff) | |
| download | pleroma-329aa19c9f1175f915441c84689860155949bb08.tar.gz pleroma-329aa19c9f1175f915441c84689860155949bb08.zip | |
Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into alexgleason/pleroma-restrict-domain
Diffstat (limited to 'test')
80 files changed, 2108 insertions, 1364 deletions
| diff --git a/test/fixtures/mastodon-post-activity-nsfw.json b/test/fixtures/mastodon-post-activity-nsfw.json new file mode 100644 index 000000000..70729a1bd --- /dev/null +++ b/test/fixtures/mastodon-post-activity-nsfw.json @@ -0,0 +1,68 @@ +{ +    "@context": [ +        "https://www.w3.org/ns/activitystreams", +        "https://w3id.org/security/v1", +        { +            "Emoji": "toot:Emoji", +            "Hashtag": "as:Hashtag", +            "atomUri": "ostatus:atomUri", +            "conversation": "ostatus:conversation", +            "inReplyToAtomUri": "ostatus:inReplyToAtomUri", +            "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", +            "movedTo": "as:movedTo", +            "ostatus": "http://ostatus.org#", +            "toot": "http://joinmastodon.org/ns#" +        } +    ], +    "actor": "http://mastodon.example.org/users/admin", +    "cc": [ +        "http://mastodon.example.org/users/admin/followers", +        "http://localtesting.pleroma.lol/users/lain" +    ], +    "id": "http://mastodon.example.org/users/admin/statuses/99512778738411822/activity", +    "nickname": "lain", +    "object": { +        "atomUri": "http://mastodon.example.org/users/admin/statuses/99512778738411822", +        "attachment": [], +        "attributedTo": "http://mastodon.example.org/users/admin", +        "cc": [ +            "http://mastodon.example.org/users/admin/followers", +            "http://localtesting.pleroma.lol/users/lain" +        ], +        "content": "<p><span class=\"h-card\"><a href=\"http://localtesting.pleroma.lol/users/lain\" class=\"u-url mention\">@<span>lain</span></a></span> #moo</p>", +        "conversation": "tag:mastodon.example.org,2018-02-12:objectId=20:objectType=Conversation", +        "id": "http://mastodon.example.org/users/admin/statuses/99512778738411822", +        "inReplyTo": null, +        "inReplyToAtomUri": null, +        "published": "2018-02-12T14:08:20Z", +        "summary": "cw", +        "tag": [ +            { +                "href": "http://localtesting.pleroma.lol/users/lain", +                "name": "@lain@localtesting.pleroma.lol", +                "type": "Mention" +            }, +            { +                "href": "http://mastodon.example.org/tags/nsfw", +                "name": "#NSFW", +                "type": "Hashtag" +            } +        ], +        "to": [ +            "https://www.w3.org/ns/activitystreams#Public" +        ], +        "type": "Note", +        "url": "http://mastodon.example.org/@admin/99512778738411822" +    }, +    "published": "2018-02-12T14:08:20Z", +    "signature": { +        "created": "2018-02-12T14:08:20Z", +        "creator": "http://mastodon.example.org/users/admin#main-key", +        "signatureValue": "rnNfcopkc6+Ju73P806popcfwrK9wGYHaJVG1/ZvrlEbWVDzaHjkXqj9Q3/xju5l8CSn9tvSgCCtPFqZsFQwn/pFIFUcw7ZWB2xi4bDm3NZ3S4XQ8JRaaX7og5hFxAhWkGhJhAkfxVnOg2hG+w2d/7d7vRVSC1vo5ip4erUaA/PkWusZvPIpxnRWoXaxJsFmVx0gJgjpJkYDyjaXUlp+jmaoseeZ4EPQUWqHLKJ59PRG0mg8j2xAjYH9nQaN14qMRmTGPxY8gfv/CUFcatA+8VJU9KEsJkDAwLVvglydNTLGrxpAJU78a2eaht0foV43XUIZGe3DKiJPgE+UOKGCJw==", +        "type": "RsaSignature2017" +    }, +    "to": [ +        "https://www.w3.org/ns/activitystreams#Public" +    ], +    "type": "Create" +} diff --git a/test/fixtures/mewmew_no_name.json b/test/fixtures/mewmew_no_name.json new file mode 100644 index 000000000..532d4cf70 --- /dev/null +++ b/test/fixtures/mewmew_no_name.json @@ -0,0 +1,46 @@ +{ +   "@context" : [ +      "https://www.w3.org/ns/activitystreams", +      "https://princess.cat/schemas/litepub-0.1.jsonld", +      { +         "@language" : "und" +      } +   ], +   "attachment" : [], +   "capabilities" : { +      "acceptsChatMessages" : true +   }, +   "discoverable" : false, +   "endpoints" : { +      "oauthAuthorizationEndpoint" : "https://princess.cat/oauth/authorize", +      "oauthRegistrationEndpoint" : "https://princess.cat/api/v1/apps", +      "oauthTokenEndpoint" : "https://princess.cat/oauth/token", +      "sharedInbox" : "https://princess.cat/inbox", +      "uploadMedia" : "https://princess.cat/api/ap/upload_media" +   }, +   "followers" : "https://princess.cat/users/mewmew/followers", +   "following" : "https://princess.cat/users/mewmew/following", +   "icon" : { +      "type" : "Image", +      "url" : "https://princess.cat/media/12794fb50e86911e65be97f69196814049dcb398a2f8b58b99bb6591576e648c.png?name=blobcatpresentpink.png" +   }, +   "id" : "https://princess.cat/users/mewmew", +   "image" : { +      "type" : "Image", +      "url" : "https://princess.cat/media/05d8bf3953ab6028fc920494ffc643fbee9dcef40d7bdd06f107e19acbfbd7f9.png" +   }, +   "inbox" : "https://princess.cat/users/mewmew/inbox", +   "manuallyApprovesFollowers" : true, +   "name" : " ", +   "outbox" : "https://princess.cat/users/mewmew/outbox", +   "preferredUsername" : "mewmew", +   "publicKey" : { +      "id" : "https://princess.cat/users/mewmew#main-key", +      "owner" : "https://princess.cat/users/mewmew", +      "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAru7VpygVef4zrFwnj0Mh\nrbO/2z2EdKN3rERtNrT8zWsLXNLQ50lfpRPnGDrd+xq7Rva4EIu0d5KJJ9n4vtY0\nuxK3On9vA2oyjLlR9O0lI3XTrHJborG3P7IPXrmNUMFpHiFHNqHp5tugUrs1gUFq\n7tmOmM92IP4Wjk8qNHFcsfnUbaPTX7sNIhteQKdi5HrTb/6lrEIe4G/FlMKRqxo3\nRNHuv6SNFQuiUKvFzjzazvjkjvBSm+aFROgdHa2tKl88StpLr7xmuY8qNFCRT6W0\nLacRp6c8ah5f03Kd+xCBVhCKvKaF1K0ERnQTBiitUh85md+Mtx/CoDoLnmpnngR3\nvQIDAQAB\n-----END PUBLIC KEY-----\n\n" +   }, +   "summary" : "please reply to my posts as direct messages if you have many followers", +   "tag" : [], +   "type" : "Person", +   "url" : "https://princess.cat/users/mewmew" +} diff --git a/test/mix/tasks/pleroma/instance_test.exs b/test/mix/tasks/pleroma/instance_test.exs index 8a02710ee..fe69a2def 100644 --- a/test/mix/tasks/pleroma/instance_test.exs +++ b/test/mix/tasks/pleroma/instance_test.exs @@ -5,6 +5,8 @@  defmodule Mix.Tasks.Pleroma.InstanceTest do    use ExUnit.Case +  @release_env_file "./test/pleroma.test.env" +    setup do      File.mkdir_p!(tmp_path()) @@ -16,6 +18,8 @@ defmodule Mix.Tasks.Pleroma.InstanceTest do          File.rm_rf(Path.join(static_dir, "robots.txt"))        end +      if File.exists?(@release_env_file), do: File.rm_rf(@release_env_file) +        Pleroma.Config.put([:instance, :static_dir], static_dir)      end) @@ -69,7 +73,9 @@ defmodule Mix.Tasks.Pleroma.InstanceTest do          "--dedupe-uploads",          "n",          "--anonymize-uploads", -        "n" +        "n", +        "--release-env-file", +        @release_env_file        ])      end @@ -91,6 +97,9 @@ defmodule Mix.Tasks.Pleroma.InstanceTest do      assert generated_config =~ "filters: [Pleroma.Upload.Filter.ExifTool]"      assert File.read!(tmp_path() <> "setup.psql") == generated_setup_psql()      assert File.exists?(Path.expand("./test/instance/static/robots.txt")) +    assert File.exists?(@release_env_file) + +    assert File.read!(@release_env_file) =~ ~r/^RELEASE_COOKIE=.*/    end    defp generated_setup_psql do diff --git a/test/mix/tasks/pleroma/release_env_test.exs b/test/mix/tasks/pleroma/release_env_test.exs new file mode 100644 index 000000000..519f1eba9 --- /dev/null +++ b/test/mix/tasks/pleroma/release_env_test.exs @@ -0,0 +1,30 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Mix.Tasks.Pleroma.ReleaseEnvTest do +  use ExUnit.Case +  import ExUnit.CaptureIO, only: [capture_io: 1] + +  @path "config/pleroma.test.env" + +  def do_clean do +    if File.exists?(@path) do +      File.rm_rf(@path) +    end +  end + +  setup do +    do_clean() +    on_exit(fn -> do_clean() end) +    :ok +  end + +  test "generate pleroma.env" do +    assert capture_io(fn -> +             Mix.Tasks.Pleroma.ReleaseEnv.run(["gen", "--path", @path, "--force"]) +           end) =~ "The file generated" + +    assert File.read!(@path) =~ "RELEASE_COOKIE=" +  end +end diff --git a/test/mix/tasks/pleroma/user_test.exs b/test/mix/tasks/pleroma/user_test.exs index b8c423c48..ce819f815 100644 --- a/test/mix/tasks/pleroma/user_test.exs +++ b/test/mix/tasks/pleroma/user_test.exs @@ -248,14 +248,19 @@ defmodule Mix.Tasks.Pleroma.UserTest do        user = User.get_cached_by_nickname(user.nickname)        assert user.is_moderator -      assert user.locked +      assert user.is_locked        assert user.is_admin        refute user.confirmation_pending      end      test "All statuses unset" do        user = -        insert(:user, locked: true, is_moderator: true, is_admin: true, confirmation_pending: true) +        insert(:user, +          is_locked: true, +          is_moderator: true, +          is_admin: true, +          confirmation_pending: true +        )        Mix.Tasks.Pleroma.User.run([          "set", @@ -280,7 +285,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do        user = User.get_cached_by_nickname(user.nickname)        refute user.is_moderator -      refute user.locked +      refute user.is_locked        refute user.is_admin        assert user.confirmation_pending      end diff --git a/test/pleroma/conversation/participation_test.exs b/test/pleroma/conversation/participation_test.exs index 59a1b6492..5a603dcc1 100644 --- a/test/pleroma/conversation/participation_test.exs +++ b/test/pleroma/conversation/participation_test.exs @@ -37,9 +37,8 @@ defmodule Pleroma.Conversation.ParticipationTest do      [%{read: true}] = Participation.for_user(user)      [%{read: false} = participation] = Participation.for_user(other_user) - -    assert User.get_cached_by_id(user.id).unread_conversation_count == 0 -    assert User.get_cached_by_id(other_user.id).unread_conversation_count == 1 +    assert Participation.unread_count(user) == 0 +    assert Participation.unread_count(other_user) == 1      {:ok, _} =        CommonAPI.post(other_user, %{ @@ -54,8 +53,8 @@ defmodule Pleroma.Conversation.ParticipationTest do      [%{read: false}] = Participation.for_user(user)      [%{read: true}] = Participation.for_user(other_user) -    assert User.get_cached_by_id(user.id).unread_conversation_count == 1 -    assert User.get_cached_by_id(other_user.id).unread_conversation_count == 0 +    assert Participation.unread_count(user) == 1 +    assert Participation.unread_count(other_user) == 0    end    test "for a new conversation, it sets the recipents of the participation" do @@ -264,7 +263,7 @@ defmodule Pleroma.Conversation.ParticipationTest do        assert [%{read: false}, %{read: false}, %{read: false}, %{read: false}] =                 Participation.for_user(blocker) -      assert User.get_cached_by_id(blocker.id).unread_conversation_count == 4 +      assert Participation.unread_count(blocker) == 4        {:ok, _user_relationship} = User.block(blocker, blocked) @@ -272,15 +271,15 @@ defmodule Pleroma.Conversation.ParticipationTest do        assert [%{read: true}, %{read: true}, %{read: true}, %{read: false}] =                 Participation.for_user(blocker) -      assert User.get_cached_by_id(blocker.id).unread_conversation_count == 1 +      assert Participation.unread_count(blocker) == 1        # The conversation is not marked as read for the blocked user        assert [_, _, %{read: false}] = Participation.for_user(blocked) -      assert User.get_cached_by_id(blocked.id).unread_conversation_count == 1 +      assert Participation.unread_count(blocker) == 1        # The conversation is not marked as read for the third user        assert [%{read: false}, _, _] = Participation.for_user(third_user) -      assert User.get_cached_by_id(third_user.id).unread_conversation_count == 1 +      assert Participation.unread_count(third_user) == 1      end      test "the new conversation with the blocked user is not marked as unread " do @@ -298,7 +297,7 @@ defmodule Pleroma.Conversation.ParticipationTest do          })        assert [%{read: true}] = Participation.for_user(blocker) -      assert User.get_cached_by_id(blocker.id).unread_conversation_count == 0 +      assert Participation.unread_count(blocker) == 0        # When the blocked user is a recipient        {:ok, _direct2} = @@ -308,10 +307,10 @@ defmodule Pleroma.Conversation.ParticipationTest do          })        assert [%{read: true}, %{read: true}] = Participation.for_user(blocker) -      assert User.get_cached_by_id(blocker.id).unread_conversation_count == 0 +      assert Participation.unread_count(blocker) == 0        assert [%{read: false}, _] = Participation.for_user(blocked) -      assert User.get_cached_by_id(blocked.id).unread_conversation_count == 1 +      assert Participation.unread_count(blocked) == 1      end      test "the conversation with the blocked user is not marked as unread on a reply" do @@ -327,8 +326,8 @@ defmodule Pleroma.Conversation.ParticipationTest do        {:ok, _user_relationship} = User.block(blocker, blocked)        assert [%{read: true}] = Participation.for_user(blocker) -      assert User.get_cached_by_id(blocker.id).unread_conversation_count == 0 +      assert Participation.unread_count(blocker) == 0        assert [blocked_participation] = Participation.for_user(blocked)        # When it's a reply from the blocked user @@ -340,8 +339,8 @@ defmodule Pleroma.Conversation.ParticipationTest do          })        assert [%{read: true}] = Participation.for_user(blocker) -      assert User.get_cached_by_id(blocker.id).unread_conversation_count == 0 +      assert Participation.unread_count(blocker) == 0        assert [third_user_participation] = Participation.for_user(third_user)        # When it's a reply from the third user @@ -353,11 +352,12 @@ defmodule Pleroma.Conversation.ParticipationTest do          })        assert [%{read: true}] = Participation.for_user(blocker) -      assert User.get_cached_by_id(blocker.id).unread_conversation_count == 0 +      assert Participation.unread_count(blocker) == 0        # Marked as unread for the blocked user        assert [%{read: false}] = Participation.for_user(blocked) -      assert User.get_cached_by_id(blocked.id).unread_conversation_count == 1 + +      assert Participation.unread_count(blocked) == 1      end    end  end diff --git a/test/pleroma/notification_test.exs b/test/pleroma/notification_test.exs index f2e0f0b0d..a74fb7bc2 100644 --- a/test/pleroma/notification_test.exs +++ b/test/pleroma/notification_test.exs @@ -346,7 +346,7 @@ defmodule Pleroma.NotificationTest do    describe "follow / follow_request notifications" do      test "it creates `follow` notification for approved Follow activity" do        user = insert(:user) -      followed_user = insert(:user, locked: false) +      followed_user = insert(:user, is_locked: false)        {:ok, _, _, _activity} = CommonAPI.follow(user, followed_user)        assert FollowingRelationship.following?(user, followed_user) @@ -361,7 +361,7 @@ defmodule Pleroma.NotificationTest do      test "it creates `follow_request` notification for pending Follow activity" do        user = insert(:user) -      followed_user = insert(:user, locked: true) +      followed_user = insert(:user, is_locked: true)        {:ok, _, _, _activity} = CommonAPI.follow(user, followed_user)        refute FollowingRelationship.following?(user, followed_user) @@ -383,7 +383,7 @@ defmodule Pleroma.NotificationTest do      test "it doesn't create a notification for follow-unfollow-follow chains" do        user = insert(:user) -      followed_user = insert(:user, locked: false) +      followed_user = insert(:user, is_locked: false)        {:ok, _, _, _activity} = CommonAPI.follow(user, followed_user)        assert FollowingRelationship.following?(user, followed_user) @@ -397,10 +397,10 @@ defmodule Pleroma.NotificationTest do      end      test "dismisses the notification on follow request rejection" do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        follower = insert(:user)        {:ok, _, _, _follow_activity} = CommonAPI.follow(follower, user) -      assert [notification] = Notification.for_user(user) +      assert [_notification] = Notification.for_user(user)        {:ok, _follower} = CommonAPI.reject_follow_request(follower, user)        assert [] = Notification.for_user(user)      end diff --git a/test/pleroma/object_test.exs b/test/pleroma/object_test.exs index 198d3b1cf..99caba336 100644 --- a/test/pleroma/object_test.exs +++ b/test/pleroma/object_test.exs @@ -82,7 +82,7 @@ defmodule Pleroma.ObjectTest do        Pleroma.Config.put([:instance, :cleanup_attachments], false)        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -116,7 +116,7 @@ defmodule Pleroma.ObjectTest do        Pleroma.Config.put([:instance, :cleanup_attachments], true)        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -155,7 +155,7 @@ defmodule Pleroma.ObjectTest do        File.mkdir_p!(uploads_dir)        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -188,7 +188,7 @@ defmodule Pleroma.ObjectTest do        Pleroma.Config.put([:instance, :cleanup_attachments], true)        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -225,7 +225,7 @@ defmodule Pleroma.ObjectTest do        Pleroma.Config.put([:instance, :cleanup_attachments], true)        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } diff --git a/test/pleroma/upload/filter/anonymize_filename_test.exs b/test/pleroma/upload/filter/anonymize_filename_test.exs index 19b915cc8..7ef01ce91 100644 --- a/test/pleroma/upload/filter/anonymize_filename_test.exs +++ b/test/pleroma/upload/filter/anonymize_filename_test.exs @@ -13,7 +13,7 @@ defmodule Pleroma.Upload.Filter.AnonymizeFilenameTest do      upload_file = %Upload{        name: "an… image.jpg", -      content_type: "image/jpg", +      content_type: "image/jpeg",        path: Path.absname("test/fixtures/image_tmp.jpg")      } diff --git a/test/pleroma/upload/filter/dedupe_test.exs b/test/pleroma/upload/filter/dedupe_test.exs index 75c7198e1..92a3d7df3 100644 --- a/test/pleroma/upload/filter/dedupe_test.exs +++ b/test/pleroma/upload/filter/dedupe_test.exs @@ -18,7 +18,7 @@ defmodule Pleroma.Upload.Filter.DedupeTest do      upload = %Upload{        name: "an… image.jpg", -      content_type: "image/jpg", +      content_type: "image/jpeg",        path: Path.absname("test/fixtures/image_tmp.jpg"),        tempfile: Path.absname("test/fixtures/image_tmp.jpg")      } diff --git a/test/pleroma/upload/filter/exiftool_test.exs b/test/pleroma/upload/filter/exiftool_test.exs index d4cd4ba11..6b978b64c 100644 --- a/test/pleroma/upload/filter/exiftool_test.exs +++ b/test/pleroma/upload/filter/exiftool_test.exs @@ -16,7 +16,7 @@ defmodule Pleroma.Upload.Filter.ExiftoolTest do      upload = %Pleroma.Upload{        name: "image_with_GPS_data.jpg", -      content_type: "image/jpg", +      content_type: "image/jpeg",        path: Path.absname("test/fixtures/DSCN0010.jpg"),        tempfile: Path.absname("test/fixtures/DSCN0010_tmp.jpg")      } diff --git a/test/pleroma/upload/filter/mogrifun_test.exs b/test/pleroma/upload/filter/mogrifun_test.exs index dc1e9e78f..fc2f68276 100644 --- a/test/pleroma/upload/filter/mogrifun_test.exs +++ b/test/pleroma/upload/filter/mogrifun_test.exs @@ -17,7 +17,7 @@ defmodule Pleroma.Upload.Filter.MogrifunTest do      upload = %Upload{        name: "an… image.jpg", -      content_type: "image/jpg", +      content_type: "image/jpeg",        path: Path.absname("test/fixtures/image_tmp.jpg"),        tempfile: Path.absname("test/fixtures/image_tmp.jpg")      } diff --git a/test/pleroma/upload/filter/mogrify_test.exs b/test/pleroma/upload/filter/mogrify_test.exs index bf64b96b3..6dee02e8b 100644 --- a/test/pleroma/upload/filter/mogrify_test.exs +++ b/test/pleroma/upload/filter/mogrify_test.exs @@ -18,7 +18,7 @@ defmodule Pleroma.Upload.Filter.MogrifyTest do      upload = %Pleroma.Upload{        name: "an… image.jpg", -      content_type: "image/jpg", +      content_type: "image/jpeg",        path: Path.absname("test/fixtures/image_tmp.jpg"),        tempfile: Path.absname("test/fixtures/image_tmp.jpg")      } diff --git a/test/pleroma/upload/filter_test.exs b/test/pleroma/upload/filter_test.exs index 352b66402..09394929c 100644 --- a/test/pleroma/upload/filter_test.exs +++ b/test/pleroma/upload/filter_test.exs @@ -20,7 +20,7 @@ defmodule Pleroma.Upload.FilterTest do      upload = %Pleroma.Upload{        name: "an… image.jpg", -      content_type: "image/jpg", +      content_type: "image/jpeg",        path: Path.absname("test/fixtures/image_tmp.jpg"),        tempfile: Path.absname("test/fixtures/image_tmp.jpg")      } diff --git a/test/pleroma/upload_test.exs b/test/pleroma/upload_test.exs index b06b54487..f52d4dff6 100644 --- a/test/pleroma/upload_test.exs +++ b/test/pleroma/upload_test.exs @@ -11,7 +11,7 @@ defmodule Pleroma.UploadTest do    alias Pleroma.Uploaders.Uploader    @upload_file %Plug.Upload{ -    content_type: "image/jpg", +    content_type: "image/jpeg",      path: Path.absname("test/fixtures/image_tmp.jpg"),      filename: "image.jpg"    } @@ -112,7 +112,7 @@ defmodule Pleroma.UploadTest do        File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image_tmp.jpg"),          filename: "image.jpg"        } @@ -124,7 +124,7 @@ defmodule Pleroma.UploadTest do        File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image_tmp.jpg"),          filename: "image.jpg"        } @@ -140,7 +140,7 @@ defmodule Pleroma.UploadTest do        File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image_tmp.jpg"),          filename: "an [image.jpg"        } @@ -156,7 +156,7 @@ defmodule Pleroma.UploadTest do        File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image_tmp.jpg"),          filename: "an [image.jpg"        } @@ -165,63 +165,31 @@ defmodule Pleroma.UploadTest do        assert data["name"] == "an [image.jpg"      end -    test "fixes incorrect content type" do -      File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg") - -      file = %Plug.Upload{ -        content_type: "application/octet-stream", -        path: Path.absname("test/fixtures/image_tmp.jpg"), -        filename: "an [image.jpg" +    test "fixes incorrect content type when base64 is given" do +      params = %{ +        img: "data:image/png;base64,#{Base.encode64(File.read!("test/fixtures/image.jpg"))}"        } -      {:ok, data} = Upload.store(file, filters: [Pleroma.Upload.Filter.Dedupe]) +      {:ok, data} = Upload.store(params)        assert hd(data["url"])["mediaType"] == "image/jpeg"      end -    test "adds missing extension" do +    test "adds extension when base64 is given" do        File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg") -      file = %Plug.Upload{ -        content_type: "image/jpg", -        path: Path.absname("test/fixtures/image_tmp.jpg"), -        filename: "an [image" +      params = %{ +        img: "data:image/png;base64,#{Base.encode64(File.read!("test/fixtures/image.jpg"))}"        } -      {:ok, data} = Upload.store(file) -      assert data["name"] == "an [image.jpg" -    end - -    test "fixes incorrect file extension" do -      File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg") - -      file = %Plug.Upload{ -        content_type: "image/jpg", -        path: Path.absname("test/fixtures/image_tmp.jpg"), -        filename: "an [image.blah" -      } - -      {:ok, data} = Upload.store(file) -      assert data["name"] == "an [image.jpg" -    end - -    test "don't modify filename of an unknown type" do -      File.cp("test/fixtures/test.txt", "test/fixtures/test_tmp.txt") - -      file = %Plug.Upload{ -        content_type: "text/plain", -        path: Path.absname("test/fixtures/test_tmp.txt"), -        filename: "test.txt" -      } - -      {:ok, data} = Upload.store(file) -      assert data["name"] == "test.txt" +      {:ok, data} = Upload.store(params) +      assert String.ends_with?(data["name"], ".jpg")      end      test "copies the file to the configured folder with anonymizing filename" do        File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image_tmp.jpg"),          filename: "an [image.jpg"        } @@ -235,7 +203,7 @@ defmodule Pleroma.UploadTest do        File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image_tmp.jpg"),          filename: "an… image.jpg"        } @@ -250,7 +218,7 @@ defmodule Pleroma.UploadTest do        File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image_tmp.jpg"),          filename: ":?#[]@!$&\\'()*+,;=.jpg"        } @@ -272,7 +240,7 @@ defmodule Pleroma.UploadTest do        File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image_tmp.jpg"),          filename: "image.jpg"        } diff --git a/test/pleroma/uploaders/local_test.exs b/test/pleroma/uploaders/local_test.exs index 18122ff6c..1ce7be485 100644 --- a/test/pleroma/uploaders/local_test.exs +++ b/test/pleroma/uploaders/local_test.exs @@ -19,7 +19,7 @@ defmodule Pleroma.Uploaders.LocalTest do        file = %Pleroma.Upload{          name: "image.jpg", -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: file_path,          tempfile: Path.absname("test/fixtures/image_tmp.jpg")        } @@ -38,7 +38,7 @@ defmodule Pleroma.Uploaders.LocalTest do        file = %Pleroma.Upload{          name: "image.jpg", -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: file_path,          tempfile: Path.absname("test/fixtures/image_tmp.jpg")        } diff --git a/test/pleroma/uploaders/s3_test.exs b/test/pleroma/uploaders/s3_test.exs index d949c90a5..e7a013dd8 100644 --- a/test/pleroma/uploaders/s3_test.exs +++ b/test/pleroma/uploaders/s3_test.exs @@ -56,7 +56,7 @@ defmodule Pleroma.Uploaders.S3Test do      setup do        file_upload = %Pleroma.Upload{          name: "image-tet.jpg", -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: "test_folder/image-tet.jpg",          tempfile: Path.absname("test/instance_static/add/shortcode.png")        } diff --git a/test/pleroma/user/backup_test.exs b/test/pleroma/user/backup_test.exs new file mode 100644 index 000000000..f68e4a029 --- /dev/null +++ b/test/pleroma/user/backup_test.exs @@ -0,0 +1,244 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.User.BackupTest do +  use Oban.Testing, repo: Pleroma.Repo +  use Pleroma.DataCase + +  import Mock +  import Pleroma.Factory +  import Swoosh.TestAssertions + +  alias Pleroma.Bookmark +  alias Pleroma.Tests.ObanHelpers +  alias Pleroma.User.Backup +  alias Pleroma.Web.CommonAPI +  alias Pleroma.Workers.BackupWorker + +  setup do +    clear_config([Pleroma.Upload, :uploader]) +    clear_config([Backup, :limit_days]) +    clear_config([Pleroma.Emails.Mailer, :enabled], true) +  end + +  test "it requries enabled email" do +    Pleroma.Config.put([Pleroma.Emails.Mailer, :enabled], false) +    user = insert(:user) +    assert {:error, "Backups require enabled email"} == Backup.create(user) +  end + +  test "it requries user's email" do +    user = insert(:user, %{email: nil}) +    assert {:error, "Email is required"} == Backup.create(user) +  end + +  test "it creates a backup record and an Oban job" do +    %{id: user_id} = user = insert(:user) +    assert {:ok, %Oban.Job{args: args}} = Backup.create(user) +    assert_enqueued(worker: BackupWorker, args: args) + +    backup = Backup.get(args["backup_id"]) +    assert %Backup{user_id: ^user_id, processed: false, file_size: 0} = backup +  end + +  test "it return an error if the export limit is over" do +    %{id: user_id} = user = insert(:user) +    limit_days = Pleroma.Config.get([Backup, :limit_days]) +    assert {:ok, %Oban.Job{args: args}} = Backup.create(user) +    backup = Backup.get(args["backup_id"]) +    assert %Backup{user_id: ^user_id, processed: false, file_size: 0} = backup + +    assert Backup.create(user) == {:error, "Last export was less than #{limit_days} days ago"} +  end + +  test "it process a backup record" do +    Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) +    %{id: user_id} = user = insert(:user) + +    assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id} = args}} = Backup.create(user) +    assert {:ok, backup} = perform_job(BackupWorker, args) +    assert backup.file_size > 0 +    assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id} = backup + +    delete_job_args = %{"op" => "delete", "backup_id" => backup_id} + +    assert_enqueued(worker: BackupWorker, args: delete_job_args) +    assert {:ok, backup} = perform_job(BackupWorker, delete_job_args) +    refute Backup.get(backup_id) + +    email = Pleroma.Emails.UserEmail.backup_is_ready_email(backup) + +    assert_email_sent( +      to: {user.name, user.email}, +      html_body: email.html_body +    ) +  end + +  test "it removes outdated backups after creating a fresh one" do +    Pleroma.Config.put([Backup, :limit_days], -1) +    Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) +    user = insert(:user) + +    assert {:ok, job1} = Backup.create(user) + +    assert {:ok, %Backup{}} = ObanHelpers.perform(job1) +    assert {:ok, job2} = Backup.create(user) +    assert Pleroma.Repo.aggregate(Backup, :count) == 2 +    assert {:ok, backup2} = ObanHelpers.perform(job2) + +    ObanHelpers.perform_all() + +    assert [^backup2] = Pleroma.Repo.all(Backup) +  end + +  test "it creates a zip archive with user data" do +    user = insert(:user, %{nickname: "cofe", name: "Cofe", ap_id: "http://cofe.io/users/cofe"}) + +    {:ok, %{object: %{data: %{"id" => id1}}} = status1} = +      CommonAPI.post(user, %{status: "status1"}) + +    {:ok, %{object: %{data: %{"id" => id2}}} = status2} = +      CommonAPI.post(user, %{status: "status2"}) + +    {:ok, %{object: %{data: %{"id" => id3}}} = status3} = +      CommonAPI.post(user, %{status: "status3"}) + +    CommonAPI.favorite(user, status1.id) +    CommonAPI.favorite(user, status2.id) + +    Bookmark.create(user.id, status2.id) +    Bookmark.create(user.id, status3.id) + +    assert {:ok, backup} = user |> Backup.new() |> Repo.insert() +    assert {:ok, path} = Backup.export(backup) +    assert {:ok, zipfile} = :zip.zip_open(String.to_charlist(path), [:memory]) +    assert {:ok, {'actor.json', json}} = :zip.zip_get('actor.json', zipfile) + +    assert %{ +             "@context" => [ +               "https://www.w3.org/ns/activitystreams", +               "http://localhost:4001/schemas/litepub-0.1.jsonld", +               %{"@language" => "und"} +             ], +             "bookmarks" => "bookmarks.json", +             "followers" => "http://cofe.io/users/cofe/followers", +             "following" => "http://cofe.io/users/cofe/following", +             "id" => "http://cofe.io/users/cofe", +             "inbox" => "http://cofe.io/users/cofe/inbox", +             "likes" => "likes.json", +             "name" => "Cofe", +             "outbox" => "http://cofe.io/users/cofe/outbox", +             "preferredUsername" => "cofe", +             "publicKey" => %{ +               "id" => "http://cofe.io/users/cofe#main-key", +               "owner" => "http://cofe.io/users/cofe" +             }, +             "type" => "Person", +             "url" => "http://cofe.io/users/cofe" +           } = Jason.decode!(json) + +    assert {:ok, {'outbox.json', json}} = :zip.zip_get('outbox.json', zipfile) + +    assert %{ +             "@context" => "https://www.w3.org/ns/activitystreams", +             "id" => "outbox.json", +             "orderedItems" => [ +               %{ +                 "object" => %{ +                   "actor" => "http://cofe.io/users/cofe", +                   "content" => "status1", +                   "type" => "Note" +                 }, +                 "type" => "Create" +               }, +               %{ +                 "object" => %{ +                   "actor" => "http://cofe.io/users/cofe", +                   "content" => "status2" +                 } +               }, +               %{ +                 "actor" => "http://cofe.io/users/cofe", +                 "object" => %{ +                   "content" => "status3" +                 } +               } +             ], +             "totalItems" => 3, +             "type" => "OrderedCollection" +           } = Jason.decode!(json) + +    assert {:ok, {'likes.json', json}} = :zip.zip_get('likes.json', zipfile) + +    assert %{ +             "@context" => "https://www.w3.org/ns/activitystreams", +             "id" => "likes.json", +             "orderedItems" => [^id1, ^id2], +             "totalItems" => 2, +             "type" => "OrderedCollection" +           } = Jason.decode!(json) + +    assert {:ok, {'bookmarks.json', json}} = :zip.zip_get('bookmarks.json', zipfile) + +    assert %{ +             "@context" => "https://www.w3.org/ns/activitystreams", +             "id" => "bookmarks.json", +             "orderedItems" => [^id2, ^id3], +             "totalItems" => 2, +             "type" => "OrderedCollection" +           } = Jason.decode!(json) + +    :zip.zip_close(zipfile) +    File.rm!(path) +  end + +  describe "it uploads and deletes a backup archive" do +    setup do +      clear_config(Pleroma.Uploaders.S3, +        bucket: "test_bucket", +        public_endpoint: "https://s3.amazonaws.com" +      ) + +      clear_config([Pleroma.Upload, :uploader]) + +      user = insert(:user, %{nickname: "cofe", name: "Cofe", ap_id: "http://cofe.io/users/cofe"}) + +      {:ok, status1} = CommonAPI.post(user, %{status: "status1"}) +      {:ok, status2} = CommonAPI.post(user, %{status: "status2"}) +      {:ok, status3} = CommonAPI.post(user, %{status: "status3"}) +      CommonAPI.favorite(user, status1.id) +      CommonAPI.favorite(user, status2.id) +      Bookmark.create(user.id, status2.id) +      Bookmark.create(user.id, status3.id) + +      assert {:ok, backup} = user |> Backup.new() |> Repo.insert() +      assert {:ok, path} = Backup.export(backup) + +      [path: path, backup: backup] +    end + +    test "S3", %{path: path, backup: backup} do +      Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.S3) + +      with_mock ExAws, +        request: fn +          %{http_method: :put} -> {:ok, :ok} +          %{http_method: :delete} -> {:ok, %{status_code: 204}} +        end do +        assert {:ok, %Pleroma.Upload{}} = Backup.upload(backup, path) +        assert {:ok, _backup} = Backup.delete(backup) +      end + +      with_mock ExAws, request: fn %{http_method: :delete} -> {:ok, %{status_code: 204}} end do +      end +    end + +    test "Local", %{path: path, backup: backup} do +      Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) + +      assert {:ok, %Pleroma.Upload{}} = Backup.upload(backup, path) +      assert {:ok, _backup} = Backup.delete(backup) +    end +  end +end diff --git a/test/pleroma/user_search_test.exs b/test/pleroma/user_search_test.exs index c4b805005..31d787ffa 100644 --- a/test/pleroma/user_search_test.exs +++ b/test/pleroma/user_search_test.exs @@ -66,7 +66,7 @@ defmodule Pleroma.UserSearchTest do      end      test "excludes users when discoverable is false" do -      insert(:user, %{nickname: "john 3000", discoverable: false}) +      insert(:user, %{nickname: "john 3000", is_discoverable: false})        insert(:user, %{nickname: "john 3001"})        users = User.search("john") diff --git a/test/pleroma/user_test.exs b/test/pleroma/user_test.exs index d506f7047..9ae52d594 100644 --- a/test/pleroma/user_test.exs +++ b/test/pleroma/user_test.exs @@ -174,7 +174,7 @@ defmodule Pleroma.UserTest do    test "returns all pending follow requests" do      unlocked = insert(:user) -    locked = insert(:user, locked: true) +    locked = insert(:user, is_locked: true)      follower = insert(:user)      CommonAPI.follow(follower, unlocked) @@ -187,7 +187,7 @@ defmodule Pleroma.UserTest do    end    test "doesn't return already accepted or duplicate follow requests" do -    locked = insert(:user, locked: true) +    locked = insert(:user, is_locked: true)      pending_follower = insert(:user)      accepted_follower = insert(:user) @@ -201,7 +201,7 @@ defmodule Pleroma.UserTest do    end    test "doesn't return follow requests for deactivated accounts" do -    locked = insert(:user, locked: true) +    locked = insert(:user, is_locked: true)      pending_follower = insert(:user, %{deactivated: true})      CommonAPI.follow(pending_follower, locked) @@ -211,7 +211,7 @@ defmodule Pleroma.UserTest do    end    test "clears follow requests when requester is blocked" do -    followed = insert(:user, locked: true) +    followed = insert(:user, is_locked: true)      follower = insert(:user)      CommonAPI.follow(follower, followed) @@ -299,8 +299,8 @@ defmodule Pleroma.UserTest do    end    test "local users do not automatically follow local locked accounts" do -    follower = insert(:user, locked: true) -    followed = insert(:user, locked: true) +    follower = insert(:user, is_locked: true) +    followed = insert(:user, is_locked: true)      {:ok, follower} = User.maybe_direct_follow(follower, followed) @@ -388,6 +388,7 @@ defmodule Pleroma.UserTest do      }      setup do: clear_config([:instance, :autofollowed_nicknames]) +    setup do: clear_config([:instance, :autofollowing_nicknames])      setup do: clear_config([:welcome])      setup do: clear_config([:instance, :account_activation_required]) @@ -408,6 +409,23 @@ defmodule Pleroma.UserTest do        refute User.following?(registered_user, remote_user)      end +    test "it adds automatic followers for new registered accounts" do +      user1 = insert(:user) +      user2 = insert(:user) + +      Pleroma.Config.put([:instance, :autofollowing_nicknames], [ +        user1.nickname, +        user2.nickname +      ]) + +      cng = User.register_changeset(%User{}, @full_user_data) + +      {:ok, registered_user} = User.register(cng) + +      assert User.following?(user1, registered_user) +      assert User.following?(user2, registered_user) +    end +      test "it sends a welcome message if it is set" do        welcome_user = insert(:user)        Pleroma.Config.put([:welcome, :direct_message, :enabled], true) @@ -1360,7 +1378,7 @@ defmodule Pleroma.UserTest do        follower = insert(:user)        {:ok, follower} = User.follow(follower, user) -      locked_user = insert(:user, name: "locked", locked: true) +      locked_user = insert(:user, name: "locked", is_locked: true)        {:ok, _} = User.follow(user, locked_user, :follow_pending)        object = insert(:note, user: user) @@ -1450,7 +1468,7 @@ defmodule Pleroma.UserTest do          note_count: 9,          follower_count: 9,          following_count: 9001, -        locked: true, +        is_locked: true,          confirmation_pending: true,          password_reset_pending: true,          approval_pending: true, @@ -1467,7 +1485,7 @@ defmodule Pleroma.UserTest do          pleroma_settings_store: %{"q" => "x"},          fields: [%{"gg" => "qq"}],          raw_fields: [%{"gg" => "qq"}], -        discoverable: true, +        is_discoverable: true,          also_known_as: ["https://lol.olo/users/loll"]        }) @@ -1492,7 +1510,7 @@ defmodule Pleroma.UserTest do               note_count: 0,               follower_count: 0,               following_count: 0, -             locked: false, +             is_locked: false,               confirmation_pending: false,               password_reset_pending: false,               approval_pending: false, @@ -1509,7 +1527,7 @@ defmodule Pleroma.UserTest do               pleroma_settings_store: %{},               fields: [],               raw_fields: [], -             discoverable: false, +             is_discoverable: false,               also_known_as: []             } = user    end 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 0517571f2..b696a24f4 100644 --- a/test/pleroma/web/activity_pub/activity_pub_controller_test.exs +++ b/test/pleroma/web/activity_pub/activity_pub_controller_test.exs @@ -156,21 +156,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert response == "Not found"      end - -    test "it requires authentication if instance is NOT federating", %{ -      conn: conn -    } do -      user = insert(:user) - -      conn = -        put_req_header( -          conn, -          "accept", -          "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"" -        ) - -      ensure_federating_or_authenticated(conn, "/users/#{user.nickname}.json", user) -    end    end    describe "mastodon compatibility routes" do @@ -338,18 +323,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert "Not found" == json_response(conn2, :not_found)      end - -    test "it requires authentication if instance is NOT federating", %{ -      conn: conn -    } do -      user = insert(:user) -      note = insert(:note) -      uuid = String.split(note.data["id"], "/") |> List.last() - -      conn = put_req_header(conn, "accept", "application/activity+json") - -      ensure_federating_or_authenticated(conn, "/objects/#{uuid}", user) -    end    end    describe "/activities/:uuid" do @@ -421,18 +394,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert "Not found" == json_response(conn2, :not_found)      end - -    test "it requires authentication if instance is NOT federating", %{ -      conn: conn -    } do -      user = insert(:user) -      activity = insert(:note_activity) -      uuid = String.split(activity.data["id"], "/") |> List.last() - -      conn = put_req_header(conn, "accept", "application/activity+json") - -      ensure_federating_or_authenticated(conn, "/activities/#{uuid}", user) -    end    end    describe "/inbox" do @@ -893,15 +854,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert response(conn, 200) =~ announce_activity.data["object"]      end - -    test "it requires authentication if instance is NOT federating", %{ -      conn: conn -    } do -      user = insert(:user) -      conn = put_req_header(conn, "accept", "application/activity+json") - -      ensure_federating_or_authenticated(conn, "/users/#{user.nickname}/outbox", user) -    end    end    describe "POST /users/:nickname/outbox (C2S)" do @@ -1487,9 +1439,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        desc = "Description of the image"        image = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "bad/content-type",          path: Path.absname("test/fixtures/image.jpg"), -        filename: "an_image.jpg" +        filename: "an_image.png"        }        object = @@ -1504,6 +1456,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert [%{"href" => object_href, "mediaType" => object_mediatype}] = object["url"]        assert is_binary(object_href)        assert object_mediatype == "image/jpeg" +      assert String.ends_with?(object_href, ".jpg")        activity_request = %{          "@context" => "https://www.w3.org/ns/activitystreams", diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs index 804305a13..43bd14ee6 100644 --- a/test/pleroma/web/activity_pub/activity_pub_test.exs +++ b/test/pleroma/web/activity_pub/activity_pub_test.exs @@ -505,22 +505,22 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        # public        {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, :visibility, "public")) -      assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) +      assert %{data: _data, object: object} = Activity.get_by_ap_id_with_object(ap_id)        assert object.data["repliesCount"] == 1        # unlisted        {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, :visibility, "unlisted")) -      assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) +      assert %{data: _data, object: object} = Activity.get_by_ap_id_with_object(ap_id)        assert object.data["repliesCount"] == 2        # private        {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, :visibility, "private")) -      assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) +      assert %{data: _data, object: object} = Activity.get_by_ap_id_with_object(ap_id)        assert object.data["repliesCount"] == 2        # direct        {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, :visibility, "direct")) -      assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) +      assert %{data: _data, object: object} = Activity.get_by_ap_id_with_object(ap_id)        assert object.data["repliesCount"] == 2      end    end @@ -752,6 +752,22 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      refute repeat_activity in activities    end +  test "returns your own posts regardless of mute" do +    user = insert(:user) +    muted = insert(:user) + +    {:ok, muted_post} = CommonAPI.post(muted, %{status: "Im stupid"}) + +    {:ok, reply} = +      CommonAPI.post(user, %{status: "I'm muting you", in_reply_to_status_id: muted_post.id}) + +    {:ok, _} = User.mute(user, muted) + +    [activity] = ActivityPub.fetch_activities([], %{muting_user: user, skip_preload: true}) + +    assert activity.id == reply.id +  end +    test "doesn't return muted activities" do      activity_one = insert(:note_activity)      activity_two = insert(:note_activity) @@ -1029,7 +1045,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    describe "uploading files" do      setup do        test_file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -1120,7 +1136,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      test "creates an undo activity for a pending follow request" do        follower = insert(:user) -      followed = insert(:user, %{locked: true}) +      followed = insert(:user, %{is_locked: true})        {:ok, _, _, follow_activity} = CommonAPI.follow(follower, followed)        {:ok, activity} = ActivityPub.unfollow(follower, followed) @@ -2257,4 +2273,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert length(activities) == 2      end    end + +  test "allow fetching of accounts with an empty string name field" do +    Tesla.Mock.mock(fn +      %{method: :get, url: "https://princess.cat/users/mewmew"} -> +        file = File.read!("test/fixtures/mewmew_no_name.json") +        %Tesla.Env{status: 200, body: file} +    end) + +    {:ok, user} = ActivityPub.make_user_from_ap_id("https://princess.cat/users/mewmew") +    assert user.name == " " +  end  end diff --git a/test/pleroma/web/activity_pub/mrf/reject_non_public_test.exs b/test/pleroma/web/activity_pub/mrf/reject_non_public_test.exs index 58b46b9a2..e08eb3ba6 100644 --- a/test/pleroma/web/activity_pub/mrf/reject_non_public_test.exs +++ b/test/pleroma/web/activity_pub/mrf/reject_non_public_test.exs @@ -21,7 +21,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublicTest do          "type" => "Create"        } -      assert {:ok, message} = RejectNonPublic.filter(message) +      assert {:ok, _message} = RejectNonPublic.filter(message)      end      test "it's allowed when cc address contain public address" do @@ -34,7 +34,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublicTest do          "type" => "Create"        } -      assert {:ok, message} = RejectNonPublic.filter(message) +      assert {:ok, _message} = RejectNonPublic.filter(message)      end    end @@ -50,7 +50,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublicTest do        }        Pleroma.Config.put([:mrf_rejectnonpublic, :allow_followersonly], true) -      assert {:ok, message} = RejectNonPublic.filter(message) +      assert {:ok, _message} = RejectNonPublic.filter(message)      end      test "it's rejected when addrer of message in the follower addresses of user and it disabled in config" do @@ -80,7 +80,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublicTest do        }        Pleroma.Config.put([:mrf_rejectnonpublic, :allow_direct], true) -      assert {:ok, message} = RejectNonPublic.filter(message) +      assert {:ok, _message} = RejectNonPublic.filter(message)      end      test "it's reject when direct messages aren't allow" do diff --git a/test/pleroma/web/activity_pub/mrf/tag_policy_test.exs b/test/pleroma/web/activity_pub/mrf/tag_policy_test.exs index 6ff71d640..ffc30ba62 100644 --- a/test/pleroma/web/activity_pub/mrf/tag_policy_test.exs +++ b/test/pleroma/web/activity_pub/mrf/tag_policy_test.exs @@ -29,7 +29,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicyTest do        actor = insert(:user, tags: ["mrf_tag:disable-remote-subscription"])        follower = insert(:user, tags: ["mrf_tag:disable-remote-subscription"], local: true)        message = %{"object" => actor.ap_id, "type" => "Follow", "actor" => follower.ap_id} -      assert {:ok, message} = TagPolicy.filter(message) +      assert {:ok, _message} = TagPolicy.filter(message)      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 558bb3131..760388e80 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 @@ -56,7 +56,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidatorTest do        user = insert(:user)        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } 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 16e4808e5..d7e299224 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 @@ -77,7 +77,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatValidationTest do        user: user      } do        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -98,7 +98,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatValidationTest do        user: user      } do        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -119,7 +119,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatValidationTest do        user: user      } do        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } diff --git a/test/pleroma/web/activity_pub/transmogrifier/accept_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/accept_handling_test.exs index 77d468f5c..c6ff96f08 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/accept_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/accept_handling_test.exs @@ -46,7 +46,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AcceptHandlingTest do    test "it works for incoming accepts which are referenced by IRI only" do      follower = insert(:user) -    followed = insert(:user, locked: true) +    followed = insert(:user, is_locked: true)      {:ok, _, _, follow_activity} = CommonAPI.follow(follower, followed) @@ -72,7 +72,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AcceptHandlingTest do    test "it fails for incoming accepts which cannot be correlated" do      follower = insert(:user) -    followed = insert(:user, locked: true) +    followed = insert(:user, is_locked: true)      accept_data =        File.read!("test/fixtures/mastodon-accept-activity.json") 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 e895636b5..54335acdb 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/announce_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/announce_handling_test.exs @@ -144,7 +144,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AnnounceHandlingTest do      _user = insert(:user, local: false, ap_id: data["actor"]) -    assert {:error, e} = Transmogrifier.handle_incoming(data) +    assert {:error, _e} = Transmogrifier.handle_incoming(data)    end    test "it does not clobber the addressing on announce activities" do diff --git a/test/pleroma/web/activity_pub/transmogrifier/answer_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/answer_handling_test.exs index 0f6605c3f..e7d85a2c5 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/answer_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/answer_handling_test.exs @@ -27,6 +27,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AnswerHandlingTest do        })      object = Object.normalize(activity) +    assert object.data["repliesCount"] == nil      data =        File.read!("test/fixtures/mastodon-vote.json") @@ -41,7 +42,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AnswerHandlingTest do      assert answer_object.data["inReplyTo"] == object.data["id"]      new_object = Object.get_by_ap_id(object.data["id"]) -    assert new_object.data["replies_count"] == object.data["replies_count"] +    assert new_object.data["repliesCount"] == nil      assert Enum.any?(               new_object.data["oneOf"], diff --git a/test/pleroma/web/activity_pub/transmogrifier/follow_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/follow_handling_test.exs index 757d90941..4ef8210ad 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/follow_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/follow_handling_test.exs @@ -65,7 +65,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do      end      test "with locked accounts, it does create a Follow, but not an Accept" do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        data =          File.read!("test/fixtures/mastodon-follow-activity.json") @@ -188,7 +188,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do      test "it works for incoming follows to locked account" do        pending_follower = insert(:user, ap_id: "http://mastodon.example.org/users/admin") -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        data =          File.read!("test/fixtures/mastodon-follow-activity.json") diff --git a/test/pleroma/web/activity_pub/transmogrifier/reject_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/reject_handling_test.exs index 7592fbe1c..5c1451def 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/reject_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/reject_handling_test.exs @@ -14,7 +14,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.RejectHandlingTest do    test "it fails for incoming rejects which cannot be correlated" do      follower = insert(:user) -    followed = insert(:user, locked: true) +    followed = insert(:user, is_locked: true)      accept_data =        File.read!("test/fixtures/mastodon-reject-activity.json") @@ -33,7 +33,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.RejectHandlingTest do    test "it works for incoming rejects which are referenced by IRI only" do      follower = insert(:user) -    followed = insert(:user, locked: true) +    followed = insert(:user, is_locked: true)      {:ok, follower} = User.follow(follower, followed)      {:ok, _, _, follow_activity} = CommonAPI.follow(follower, followed) diff --git a/test/pleroma/web/activity_pub/transmogrifier/user_update_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/user_update_handling_test.exs index 64636656c..7c4d16db7 100644 --- a/test/pleroma/web/activity_pub/transmogrifier/user_update_handling_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier/user_update_handling_test.exs @@ -154,6 +154,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.UserUpdateHandlingTest do      {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(update_data)      user = User.get_cached_by_ap_id(user.ap_id) -    assert user.locked == true +    assert user.is_locked == true    end  end diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs index 561674f01..e39af1dfc 100644 --- a/test/pleroma/web/activity_pub/transmogrifier_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs @@ -101,7 +101,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, returned_activity} = Transmogrifier.handle_incoming(data)        returned_object = Object.normalize(returned_activity, false) -      assert activity = +      assert %Activity{} =                 Activity.get_create_by_object_ap_id(                   "https://mstdn.io/users/mayuutann/statuses/99568293732299394"                 ) @@ -206,6 +206,16 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert user.note_count == 1      end +    test "it works for incoming notices without the sensitive property but an nsfw hashtag" do +      data = File.read!("test/fixtures/mastodon-post-activity-nsfw.json") |> Poison.decode!() + +      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +      object_data = Object.normalize(data["object"], false).data + +      assert object_data["sensitive"] == true +    end +      test "it works for incoming notices with hashtags" do        data = File.read!("test/fixtures/mastodon-post-activity-hashtag.json") |> Poison.decode!() diff --git a/test/pleroma/web/activity_pub/utils_test.exs b/test/pleroma/web/activity_pub/utils_test.exs index d50213545..be9cd7d13 100644 --- a/test/pleroma/web/activity_pub/utils_test.exs +++ b/test/pleroma/web/activity_pub/utils_test.exs @@ -193,7 +193,7 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do    describe "update_follow_state_for_all/2" do      test "updates the state of all Follow activities with the same actor and object" do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        follower = insert(:user)        {:ok, _, _, follow_activity} = CommonAPI.follow(follower, user) @@ -217,7 +217,7 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do    describe "update_follow_state/2" do      test "updates the state of the given follow activity" do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        follower = insert(:user)        {:ok, _, _, follow_activity} = CommonAPI.follow(follower, user) 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 a0808c347..c06ae55ca 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 @@ -7,22 +7,16 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    use Oban.Testing, repo: Pleroma.Repo    import ExUnit.CaptureLog -  import Mock    import Pleroma.Factory    import Swoosh.TestAssertions    alias Pleroma.Activity -  alias Pleroma.Config -  alias Pleroma.HTML    alias Pleroma.MFA    alias Pleroma.ModerationLog    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.MediaProxy    setup_all do      Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -153,300 +147,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "DELETE /api/pleroma/admin/users" do -    test "single user", %{admin: admin, conn: conn} do -      clear_config([:instance, :federating], true) - -      user = -        insert(:user, -          avatar: %{"url" => [%{"href" => "https://someurl"}]}, -          banner: %{"url" => [%{"href" => "https://somebanner"}]}, -          bio: "Hello world!", -          name: "A guy" -        ) - -      # Create some activities to check they got deleted later -      follower = insert(:user) -      {:ok, _} = CommonAPI.post(user, %{status: "test"}) -      {:ok, _, _, _} = CommonAPI.follow(user, follower) -      {:ok, _, _, _} = CommonAPI.follow(follower, user) -      user = Repo.get(User, user.id) -      assert user.note_count == 1 -      assert user.follower_count == 1 -      assert user.following_count == 1 -      refute user.deactivated - -      with_mock Pleroma.Web.Federator, -        publish: fn _ -> nil end, -        perform: fn _, _ -> nil end do -        conn = -          conn -          |> put_req_header("accept", "application/json") -          |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}") - -        ObanHelpers.perform_all() - -        assert User.get_by_nickname(user.nickname).deactivated - -        log_entry = Repo.one(ModerationLog) - -        assert ModerationLog.get_log_entry_message(log_entry) == -                 "@#{admin.nickname} deleted users: @#{user.nickname}" - -        assert json_response(conn, 200) == [user.nickname] - -        user = Repo.get(User, user.id) -        assert user.deactivated - -        assert user.avatar == %{} -        assert user.banner == %{} -        assert user.note_count == 0 -        assert user.follower_count == 0 -        assert user.following_count == 0 -        assert user.bio == "" -        assert user.name == nil - -        assert called(Pleroma.Web.Federator.publish(:_)) -      end -    end - -    test "multiple users", %{admin: admin, conn: conn} do -      user_one = insert(:user) -      user_two = insert(:user) - -      conn = -        conn -        |> put_req_header("accept", "application/json") -        |> delete("/api/pleroma/admin/users", %{ -          nicknames: [user_one.nickname, user_two.nickname] -        }) - -      log_entry = Repo.one(ModerationLog) - -      assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} deleted users: @#{user_one.nickname}, @#{user_two.nickname}" - -      response = json_response(conn, 200) -      assert response -- [user_one.nickname, user_two.nickname] == [] -    end -  end - -  describe "/api/pleroma/admin/users" do -    test "Create", %{conn: conn} do -      conn = -        conn -        |> put_req_header("accept", "application/json") -        |> post("/api/pleroma/admin/users", %{ -          "users" => [ -            %{ -              "nickname" => "lain", -              "email" => "lain@example.org", -              "password" => "test" -            }, -            %{ -              "nickname" => "lain2", -              "email" => "lain2@example.org", -              "password" => "test" -            } -          ] -        }) - -      response = json_response(conn, 200) |> Enum.map(&Map.get(&1, "type")) -      assert response == ["success", "success"] - -      log_entry = Repo.one(ModerationLog) - -      assert ["lain", "lain2"] -- Enum.map(log_entry.data["subjects"], & &1["nickname"]) == [] -    end - -    test "Cannot create user with existing email", %{conn: conn} do -      user = insert(:user) - -      conn = -        conn -        |> put_req_header("accept", "application/json") -        |> post("/api/pleroma/admin/users", %{ -          "users" => [ -            %{ -              "nickname" => "lain", -              "email" => user.email, -              "password" => "test" -            } -          ] -        }) - -      assert json_response(conn, 409) == [ -               %{ -                 "code" => 409, -                 "data" => %{ -                   "email" => user.email, -                   "nickname" => "lain" -                 }, -                 "error" => "email has already been taken", -                 "type" => "error" -               } -             ] -    end - -    test "Cannot create user with existing nickname", %{conn: conn} do -      user = insert(:user) - -      conn = -        conn -        |> put_req_header("accept", "application/json") -        |> post("/api/pleroma/admin/users", %{ -          "users" => [ -            %{ -              "nickname" => user.nickname, -              "email" => "someuser@plerama.social", -              "password" => "test" -            } -          ] -        }) - -      assert json_response(conn, 409) == [ -               %{ -                 "code" => 409, -                 "data" => %{ -                   "email" => "someuser@plerama.social", -                   "nickname" => user.nickname -                 }, -                 "error" => "nickname has already been taken", -                 "type" => "error" -               } -             ] -    end - -    test "Multiple user creation works in transaction", %{conn: conn} do -      user = insert(:user) - -      conn = -        conn -        |> put_req_header("accept", "application/json") -        |> post("/api/pleroma/admin/users", %{ -          "users" => [ -            %{ -              "nickname" => "newuser", -              "email" => "newuser@pleroma.social", -              "password" => "test" -            }, -            %{ -              "nickname" => "lain", -              "email" => user.email, -              "password" => "test" -            } -          ] -        }) - -      assert json_response(conn, 409) == [ -               %{ -                 "code" => 409, -                 "data" => %{ -                   "email" => user.email, -                   "nickname" => "lain" -                 }, -                 "error" => "email has already been taken", -                 "type" => "error" -               }, -               %{ -                 "code" => 409, -                 "data" => %{ -                   "email" => "newuser@pleroma.social", -                   "nickname" => "newuser" -                 }, -                 "error" => "", -                 "type" => "error" -               } -             ] - -      assert User.get_by_nickname("newuser") === nil -    end -  end - -  describe "/api/pleroma/admin/users/:nickname" do -    test "Show", %{conn: conn} do -      user = insert(:user) - -      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") - -      expected = %{ -        "deactivated" => false, -        "id" => to_string(user.id), -        "local" => true, -        "nickname" => user.nickname, -        "roles" => %{"admin" => false, "moderator" => false}, -        "tags" => [], -        "avatar" => User.avatar_url(user) |> MediaProxy.url(), -        "display_name" => HTML.strip_tags(user.name || user.nickname), -        "confirmation_pending" => false, -        "approval_pending" => false, -        "url" => user.ap_id, -        "registration_reason" => nil, -        "actor_type" => "Person" -      } - -      assert expected == json_response(conn, 200) -    end - -    test "when the user doesn't exist", %{conn: conn} do -      user = build(:user) - -      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") - -      assert %{"error" => "Not found"} == json_response(conn, 404) -    end -  end - -  describe "/api/pleroma/admin/users/follow" do -    test "allows to force-follow another user", %{admin: admin, conn: conn} do -      user = insert(:user) -      follower = insert(:user) - -      conn -      |> put_req_header("accept", "application/json") -      |> post("/api/pleroma/admin/users/follow", %{ -        "follower" => follower.nickname, -        "followed" => user.nickname -      }) - -      user = User.get_cached_by_id(user.id) -      follower = User.get_cached_by_id(follower.id) - -      assert User.following?(follower, user) - -      log_entry = Repo.one(ModerationLog) - -      assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} made @#{follower.nickname} follow @#{user.nickname}" -    end -  end - -  describe "/api/pleroma/admin/users/unfollow" do -    test "allows to force-unfollow another user", %{admin: admin, conn: conn} do -      user = insert(:user) -      follower = insert(:user) - -      User.follow(follower, user) - -      conn -      |> put_req_header("accept", "application/json") -      |> post("/api/pleroma/admin/users/unfollow", %{ -        "follower" => follower.nickname, -        "followed" => user.nickname -      }) - -      user = User.get_cached_by_id(user.id) -      follower = User.get_cached_by_id(follower.id) - -      refute User.following?(follower, user) - -      log_entry = Repo.one(ModerationLog) - -      assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} made @#{follower.nickname} unfollow @#{user.nickname}" -    end -  end -    describe "PUT /api/pleroma/admin/users/tag" do      setup %{conn: conn} do        user1 = insert(:user, %{tags: ["x"]}) @@ -643,753 +343,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      assert Regex.match?(~r/(http:\/\/|https:\/\/)/, resp["link"])    end -  describe "GET /api/pleroma/admin/users" do -    test "renders users array for the first page", %{conn: conn, admin: admin} do -      user = insert(:user, local: false, tags: ["foo", "bar"]) -      user2 = insert(:user, approval_pending: true, registration_reason: "I'm a chill dude") - -      conn = get(conn, "/api/pleroma/admin/users?page=1") - -      users = -        [ -          %{ -            "deactivated" => admin.deactivated, -            "id" => admin.id, -            "nickname" => admin.nickname, -            "roles" => %{"admin" => true, "moderator" => false}, -            "local" => true, -            "tags" => [], -            "avatar" => User.avatar_url(admin) |> MediaProxy.url(), -            "display_name" => HTML.strip_tags(admin.name || admin.nickname), -            "confirmation_pending" => false, -            "approval_pending" => false, -            "url" => admin.ap_id, -            "registration_reason" => nil, -            "actor_type" => "Person" -          }, -          %{ -            "deactivated" => user.deactivated, -            "id" => user.id, -            "nickname" => user.nickname, -            "roles" => %{"admin" => false, "moderator" => false}, -            "local" => false, -            "tags" => ["foo", "bar"], -            "avatar" => User.avatar_url(user) |> MediaProxy.url(), -            "display_name" => HTML.strip_tags(user.name || user.nickname), -            "confirmation_pending" => false, -            "approval_pending" => false, -            "url" => user.ap_id, -            "registration_reason" => nil, -            "actor_type" => "Person" -          }, -          %{ -            "deactivated" => user2.deactivated, -            "id" => user2.id, -            "nickname" => user2.nickname, -            "roles" => %{"admin" => false, "moderator" => false}, -            "local" => true, -            "tags" => [], -            "avatar" => User.avatar_url(user2) |> MediaProxy.url(), -            "display_name" => HTML.strip_tags(user2.name || user2.nickname), -            "confirmation_pending" => false, -            "approval_pending" => true, -            "url" => user2.ap_id, -            "registration_reason" => "I'm a chill dude", -            "actor_type" => "Person" -          } -        ] -        |> Enum.sort_by(& &1["nickname"]) - -      assert json_response(conn, 200) == %{ -               "count" => 3, -               "page_size" => 50, -               "users" => users -             } -    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") - -      insert_list(25, :user) - -      assert %{"count" => 26, "page_size" => 10, "users" => users1} = -               conn -               |> get("/api/pleroma/admin/users?page=1&filters=", %{page_size: "10"}) -               |> json_response(200) - -      assert Enum.count(users1) == 10 -      assert service1 not in users1 - -      assert %{"count" => 26, "page_size" => 10, "users" => users2} = -               conn -               |> get("/api/pleroma/admin/users?page=2&filters=", %{page_size: "10"}) -               |> json_response(200) - -      assert Enum.count(users2) == 10 -      assert service1 not in users2 - -      assert %{"count" => 26, "page_size" => 10, "users" => users3} = -               conn -               |> get("/api/pleroma/admin/users?page=3&filters=", %{page_size: "10"}) -               |> json_response(200) - -      assert Enum.count(users3) == 6 -      assert service1 not in users3 -    end - -    test "renders empty array for the second page", %{conn: conn} do -      insert(:user) - -      conn = get(conn, "/api/pleroma/admin/users?page=2") - -      assert json_response(conn, 200) == %{ -               "count" => 2, -               "page_size" => 50, -               "users" => [] -             } -    end - -    test "regular search", %{conn: conn} do -      user = insert(:user, nickname: "bob") - -      conn = get(conn, "/api/pleroma/admin/users?query=bo") - -      assert json_response(conn, 200) == %{ -               "count" => 1, -               "page_size" => 50, -               "users" => [ -                 %{ -                   "deactivated" => user.deactivated, -                   "id" => user.id, -                   "nickname" => user.nickname, -                   "roles" => %{"admin" => false, "moderator" => false}, -                   "local" => true, -                   "tags" => [], -                   "avatar" => User.avatar_url(user) |> MediaProxy.url(), -                   "display_name" => HTML.strip_tags(user.name || user.nickname), -                   "confirmation_pending" => false, -                   "approval_pending" => false, -                   "url" => user.ap_id, -                   "registration_reason" => nil, -                   "actor_type" => "Person" -                 } -               ] -             } -    end - -    test "search by domain", %{conn: conn} do -      user = insert(:user, nickname: "nickname@domain.com") -      insert(:user) - -      conn = get(conn, "/api/pleroma/admin/users?query=domain.com") - -      assert json_response(conn, 200) == %{ -               "count" => 1, -               "page_size" => 50, -               "users" => [ -                 %{ -                   "deactivated" => user.deactivated, -                   "id" => user.id, -                   "nickname" => user.nickname, -                   "roles" => %{"admin" => false, "moderator" => false}, -                   "local" => true, -                   "tags" => [], -                   "avatar" => User.avatar_url(user) |> MediaProxy.url(), -                   "display_name" => HTML.strip_tags(user.name || user.nickname), -                   "confirmation_pending" => false, -                   "approval_pending" => false, -                   "url" => user.ap_id, -                   "registration_reason" => nil, -                   "actor_type" => "Person" -                 } -               ] -             } -    end - -    test "search by full nickname", %{conn: conn} do -      user = insert(:user, nickname: "nickname@domain.com") -      insert(:user) - -      conn = get(conn, "/api/pleroma/admin/users?query=nickname@domain.com") - -      assert json_response(conn, 200) == %{ -               "count" => 1, -               "page_size" => 50, -               "users" => [ -                 %{ -                   "deactivated" => user.deactivated, -                   "id" => user.id, -                   "nickname" => user.nickname, -                   "roles" => %{"admin" => false, "moderator" => false}, -                   "local" => true, -                   "tags" => [], -                   "avatar" => User.avatar_url(user) |> MediaProxy.url(), -                   "display_name" => HTML.strip_tags(user.name || user.nickname), -                   "confirmation_pending" => false, -                   "approval_pending" => false, -                   "url" => user.ap_id, -                   "registration_reason" => nil, -                   "actor_type" => "Person" -                 } -               ] -             } -    end - -    test "search by display name", %{conn: conn} do -      user = insert(:user, name: "Display name") -      insert(:user) - -      conn = get(conn, "/api/pleroma/admin/users?name=display") - -      assert json_response(conn, 200) == %{ -               "count" => 1, -               "page_size" => 50, -               "users" => [ -                 %{ -                   "deactivated" => user.deactivated, -                   "id" => user.id, -                   "nickname" => user.nickname, -                   "roles" => %{"admin" => false, "moderator" => false}, -                   "local" => true, -                   "tags" => [], -                   "avatar" => User.avatar_url(user) |> MediaProxy.url(), -                   "display_name" => HTML.strip_tags(user.name || user.nickname), -                   "confirmation_pending" => false, -                   "approval_pending" => false, -                   "url" => user.ap_id, -                   "registration_reason" => nil, -                   "actor_type" => "Person" -                 } -               ] -             } -    end - -    test "search by email", %{conn: conn} do -      user = insert(:user, email: "email@example.com") -      insert(:user) - -      conn = get(conn, "/api/pleroma/admin/users?email=email@example.com") - -      assert json_response(conn, 200) == %{ -               "count" => 1, -               "page_size" => 50, -               "users" => [ -                 %{ -                   "deactivated" => user.deactivated, -                   "id" => user.id, -                   "nickname" => user.nickname, -                   "roles" => %{"admin" => false, "moderator" => false}, -                   "local" => true, -                   "tags" => [], -                   "avatar" => User.avatar_url(user) |> MediaProxy.url(), -                   "display_name" => HTML.strip_tags(user.name || user.nickname), -                   "confirmation_pending" => false, -                   "approval_pending" => false, -                   "url" => user.ap_id, -                   "registration_reason" => nil, -                   "actor_type" => "Person" -                 } -               ] -             } -    end - -    test "regular search with page size", %{conn: conn} do -      user = insert(:user, nickname: "aalice") -      user2 = insert(:user, nickname: "alice") - -      conn1 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=1") - -      assert json_response(conn1, 200) == %{ -               "count" => 2, -               "page_size" => 1, -               "users" => [ -                 %{ -                   "deactivated" => user.deactivated, -                   "id" => user.id, -                   "nickname" => user.nickname, -                   "roles" => %{"admin" => false, "moderator" => false}, -                   "local" => true, -                   "tags" => [], -                   "avatar" => User.avatar_url(user) |> MediaProxy.url(), -                   "display_name" => HTML.strip_tags(user.name || user.nickname), -                   "confirmation_pending" => false, -                   "approval_pending" => false, -                   "url" => user.ap_id, -                   "registration_reason" => nil, -                   "actor_type" => "Person" -                 } -               ] -             } - -      conn2 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=2") - -      assert json_response(conn2, 200) == %{ -               "count" => 2, -               "page_size" => 1, -               "users" => [ -                 %{ -                   "deactivated" => user2.deactivated, -                   "id" => user2.id, -                   "nickname" => user2.nickname, -                   "roles" => %{"admin" => false, "moderator" => false}, -                   "local" => true, -                   "tags" => [], -                   "avatar" => User.avatar_url(user2) |> MediaProxy.url(), -                   "display_name" => HTML.strip_tags(user2.name || user2.nickname), -                   "confirmation_pending" => false, -                   "approval_pending" => false, -                   "url" => user2.ap_id, -                   "registration_reason" => nil, -                   "actor_type" => "Person" -                 } -               ] -             } -    end - -    test "only local users" do -      admin = insert(:user, is_admin: true, nickname: "john") -      token = insert(:oauth_admin_token, user: admin) -      user = insert(:user, nickname: "bob") - -      insert(:user, nickname: "bobb", local: false) - -      conn = -        build_conn() -        |> assign(:user, admin) -        |> assign(:token, token) -        |> get("/api/pleroma/admin/users?query=bo&filters=local") - -      assert json_response(conn, 200) == %{ -               "count" => 1, -               "page_size" => 50, -               "users" => [ -                 %{ -                   "deactivated" => user.deactivated, -                   "id" => user.id, -                   "nickname" => user.nickname, -                   "roles" => %{"admin" => false, "moderator" => false}, -                   "local" => true, -                   "tags" => [], -                   "avatar" => User.avatar_url(user) |> MediaProxy.url(), -                   "display_name" => HTML.strip_tags(user.name || user.nickname), -                   "confirmation_pending" => false, -                   "approval_pending" => false, -                   "url" => user.ap_id, -                   "registration_reason" => nil, -                   "actor_type" => "Person" -                 } -               ] -             } -    end - -    test "only local users with no query", %{conn: conn, admin: old_admin} do -      admin = insert(:user, is_admin: true, nickname: "john") -      user = insert(:user, nickname: "bob") - -      insert(:user, nickname: "bobb", local: false) - -      conn = get(conn, "/api/pleroma/admin/users?filters=local") - -      users = -        [ -          %{ -            "deactivated" => user.deactivated, -            "id" => user.id, -            "nickname" => user.nickname, -            "roles" => %{"admin" => false, "moderator" => false}, -            "local" => true, -            "tags" => [], -            "avatar" => User.avatar_url(user) |> MediaProxy.url(), -            "display_name" => HTML.strip_tags(user.name || user.nickname), -            "confirmation_pending" => false, -            "approval_pending" => false, -            "url" => user.ap_id, -            "registration_reason" => nil, -            "actor_type" => "Person" -          }, -          %{ -            "deactivated" => admin.deactivated, -            "id" => admin.id, -            "nickname" => admin.nickname, -            "roles" => %{"admin" => true, "moderator" => false}, -            "local" => true, -            "tags" => [], -            "avatar" => User.avatar_url(admin) |> MediaProxy.url(), -            "display_name" => HTML.strip_tags(admin.name || admin.nickname), -            "confirmation_pending" => false, -            "approval_pending" => false, -            "url" => admin.ap_id, -            "registration_reason" => nil, -            "actor_type" => "Person" -          }, -          %{ -            "deactivated" => false, -            "id" => old_admin.id, -            "local" => true, -            "nickname" => old_admin.nickname, -            "roles" => %{"admin" => true, "moderator" => false}, -            "tags" => [], -            "avatar" => User.avatar_url(old_admin) |> MediaProxy.url(), -            "display_name" => HTML.strip_tags(old_admin.name || old_admin.nickname), -            "confirmation_pending" => false, -            "approval_pending" => false, -            "url" => old_admin.ap_id, -            "registration_reason" => nil, -            "actor_type" => "Person" -          } -        ] -        |> Enum.sort_by(& &1["nickname"]) - -      assert json_response(conn, 200) == %{ -               "count" => 3, -               "page_size" => 50, -               "users" => users -             } -    end - -    test "only unapproved users", %{conn: conn} do -      user = -        insert(:user, -          nickname: "sadboy", -          approval_pending: true, -          registration_reason: "Plz let me in!" -        ) - -      insert(:user, nickname: "happyboy", approval_pending: false) - -      conn = get(conn, "/api/pleroma/admin/users?filters=need_approval") - -      users = -        [ -          %{ -            "deactivated" => user.deactivated, -            "id" => user.id, -            "nickname" => user.nickname, -            "roles" => %{"admin" => false, "moderator" => false}, -            "local" => true, -            "tags" => [], -            "avatar" => User.avatar_url(user) |> MediaProxy.url(), -            "display_name" => HTML.strip_tags(user.name || user.nickname), -            "confirmation_pending" => false, -            "approval_pending" => true, -            "url" => user.ap_id, -            "registration_reason" => "Plz let me in!", -            "actor_type" => "Person" -          } -        ] -        |> Enum.sort_by(& &1["nickname"]) - -      assert json_response(conn, 200) == %{ -               "count" => 1, -               "page_size" => 50, -               "users" => users -             } -    end - -    test "load only admins", %{conn: conn, admin: admin} do -      second_admin = insert(:user, is_admin: true) -      insert(:user) -      insert(:user) - -      conn = get(conn, "/api/pleroma/admin/users?filters=is_admin") - -      users = -        [ -          %{ -            "deactivated" => false, -            "id" => admin.id, -            "nickname" => admin.nickname, -            "roles" => %{"admin" => true, "moderator" => false}, -            "local" => admin.local, -            "tags" => [], -            "avatar" => User.avatar_url(admin) |> MediaProxy.url(), -            "display_name" => HTML.strip_tags(admin.name || admin.nickname), -            "confirmation_pending" => false, -            "approval_pending" => false, -            "url" => admin.ap_id, -            "registration_reason" => nil, -            "actor_type" => "Person" -          }, -          %{ -            "deactivated" => false, -            "id" => second_admin.id, -            "nickname" => second_admin.nickname, -            "roles" => %{"admin" => true, "moderator" => false}, -            "local" => second_admin.local, -            "tags" => [], -            "avatar" => User.avatar_url(second_admin) |> MediaProxy.url(), -            "display_name" => HTML.strip_tags(second_admin.name || second_admin.nickname), -            "confirmation_pending" => false, -            "approval_pending" => false, -            "url" => second_admin.ap_id, -            "registration_reason" => nil, -            "actor_type" => "Person" -          } -        ] -        |> Enum.sort_by(& &1["nickname"]) - -      assert json_response(conn, 200) == %{ -               "count" => 2, -               "page_size" => 50, -               "users" => users -             } -    end - -    test "load only moderators", %{conn: conn} do -      moderator = insert(:user, is_moderator: true) -      insert(:user) -      insert(:user) - -      conn = get(conn, "/api/pleroma/admin/users?filters=is_moderator") - -      assert json_response(conn, 200) == %{ -               "count" => 1, -               "page_size" => 50, -               "users" => [ -                 %{ -                   "deactivated" => false, -                   "id" => moderator.id, -                   "nickname" => moderator.nickname, -                   "roles" => %{"admin" => false, "moderator" => true}, -                   "local" => moderator.local, -                   "tags" => [], -                   "avatar" => User.avatar_url(moderator) |> MediaProxy.url(), -                   "display_name" => HTML.strip_tags(moderator.name || moderator.nickname), -                   "confirmation_pending" => false, -                   "approval_pending" => false, -                   "url" => moderator.ap_id, -                   "registration_reason" => nil, -                   "actor_type" => "Person" -                 } -               ] -             } -    end - -    test "load users with tags list", %{conn: conn} do -      user1 = insert(:user, tags: ["first"]) -      user2 = insert(:user, tags: ["second"]) -      insert(:user) -      insert(:user) - -      conn = get(conn, "/api/pleroma/admin/users?tags[]=first&tags[]=second") - -      users = -        [ -          %{ -            "deactivated" => false, -            "id" => user1.id, -            "nickname" => user1.nickname, -            "roles" => %{"admin" => false, "moderator" => false}, -            "local" => user1.local, -            "tags" => ["first"], -            "avatar" => User.avatar_url(user1) |> MediaProxy.url(), -            "display_name" => HTML.strip_tags(user1.name || user1.nickname), -            "confirmation_pending" => false, -            "approval_pending" => false, -            "url" => user1.ap_id, -            "registration_reason" => nil, -            "actor_type" => "Person" -          }, -          %{ -            "deactivated" => false, -            "id" => user2.id, -            "nickname" => user2.nickname, -            "roles" => %{"admin" => false, "moderator" => false}, -            "local" => user2.local, -            "tags" => ["second"], -            "avatar" => User.avatar_url(user2) |> MediaProxy.url(), -            "display_name" => HTML.strip_tags(user2.name || user2.nickname), -            "confirmation_pending" => false, -            "approval_pending" => false, -            "url" => user2.ap_id, -            "registration_reason" => nil, -            "actor_type" => "Person" -          } -        ] -        |> Enum.sort_by(& &1["nickname"]) - -      assert json_response(conn, 200) == %{ -               "count" => 2, -               "page_size" => 50, -               "users" => users -             } -    end - -    test "`active` filters out users pending approval", %{token: token} do -      insert(:user, approval_pending: true) -      %{id: user_id} = insert(:user, approval_pending: false) -      %{id: admin_id} = token.user - -      conn = -        build_conn() -        |> assign(:user, token.user) -        |> assign(:token, token) -        |> get("/api/pleroma/admin/users?filters=active") - -      assert %{ -               "count" => 2, -               "page_size" => 50, -               "users" => [ -                 %{"id" => ^admin_id}, -                 %{"id" => ^user_id} -               ] -             } = json_response(conn, 200) -    end - -    test "it works with multiple filters" do -      admin = insert(:user, nickname: "john", is_admin: true) -      token = insert(:oauth_admin_token, user: admin) -      user = insert(:user, nickname: "bob", local: false, deactivated: true) - -      insert(:user, nickname: "ken", local: true, deactivated: true) -      insert(:user, nickname: "bobb", local: false, deactivated: false) - -      conn = -        build_conn() -        |> assign(:user, admin) -        |> assign(:token, token) -        |> get("/api/pleroma/admin/users?filters=deactivated,external") - -      assert json_response(conn, 200) == %{ -               "count" => 1, -               "page_size" => 50, -               "users" => [ -                 %{ -                   "deactivated" => user.deactivated, -                   "id" => user.id, -                   "nickname" => user.nickname, -                   "roles" => %{"admin" => false, "moderator" => false}, -                   "local" => user.local, -                   "tags" => [], -                   "avatar" => User.avatar_url(user) |> MediaProxy.url(), -                   "display_name" => HTML.strip_tags(user.name || user.nickname), -                   "confirmation_pending" => false, -                   "approval_pending" => false, -                   "url" => user.ap_id, -                   "registration_reason" => nil, -                   "actor_type" => "Person" -                 } -               ] -             } -    end - -    test "it omits relay user", %{admin: admin, conn: conn} do -      assert %User{} = Relay.get_actor() - -      conn = get(conn, "/api/pleroma/admin/users") - -      assert json_response(conn, 200) == %{ -               "count" => 1, -               "page_size" => 50, -               "users" => [ -                 %{ -                   "deactivated" => admin.deactivated, -                   "id" => admin.id, -                   "nickname" => admin.nickname, -                   "roles" => %{"admin" => true, "moderator" => false}, -                   "local" => true, -                   "tags" => [], -                   "avatar" => User.avatar_url(admin) |> MediaProxy.url(), -                   "display_name" => HTML.strip_tags(admin.name || admin.nickname), -                   "confirmation_pending" => false, -                   "approval_pending" => false, -                   "url" => admin.ap_id, -                   "registration_reason" => nil, -                   "actor_type" => "Person" -                 } -               ] -             } -    end -  end - -  test "PATCH /api/pleroma/admin/users/activate", %{admin: admin, conn: conn} do -    user_one = insert(:user, deactivated: true) -    user_two = insert(:user, deactivated: true) - -    conn = -      patch( -        conn, -        "/api/pleroma/admin/users/activate", -        %{nicknames: [user_one.nickname, user_two.nickname]} -      ) - -    response = json_response(conn, 200) -    assert Enum.map(response["users"], & &1["deactivated"]) == [false, false] - -    log_entry = Repo.one(ModerationLog) - -    assert ModerationLog.get_log_entry_message(log_entry) == -             "@#{admin.nickname} activated users: @#{user_one.nickname}, @#{user_two.nickname}" -  end - -  test "PATCH /api/pleroma/admin/users/deactivate", %{admin: admin, conn: conn} do -    user_one = insert(:user, deactivated: false) -    user_two = insert(:user, deactivated: false) - -    conn = -      patch( -        conn, -        "/api/pleroma/admin/users/deactivate", -        %{nicknames: [user_one.nickname, user_two.nickname]} -      ) - -    response = json_response(conn, 200) -    assert Enum.map(response["users"], & &1["deactivated"]) == [true, true] - -    log_entry = Repo.one(ModerationLog) - -    assert ModerationLog.get_log_entry_message(log_entry) == -             "@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}" -  end - -  test "PATCH /api/pleroma/admin/users/approve", %{admin: admin, conn: conn} do -    user_one = insert(:user, approval_pending: true) -    user_two = insert(:user, approval_pending: true) - -    conn = -      patch( -        conn, -        "/api/pleroma/admin/users/approve", -        %{nicknames: [user_one.nickname, user_two.nickname]} -      ) - -    response = json_response(conn, 200) -    assert Enum.map(response["users"], & &1["approval_pending"]) == [false, false] - -    log_entry = Repo.one(ModerationLog) - -    assert ModerationLog.get_log_entry_message(log_entry) == -             "@#{admin.nickname} approved users: @#{user_one.nickname}, @#{user_two.nickname}" -  end - -  test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admin, conn: conn} do -    user = insert(:user) - -    conn = patch(conn, "/api/pleroma/admin/users/#{user.nickname}/toggle_activation") - -    assert json_response(conn, 200) == -             %{ -               "deactivated" => !user.deactivated, -               "id" => user.id, -               "nickname" => user.nickname, -               "roles" => %{"admin" => false, "moderator" => false}, -               "local" => true, -               "tags" => [], -               "avatar" => User.avatar_url(user) |> MediaProxy.url(), -               "display_name" => HTML.strip_tags(user.name || user.nickname), -               "confirmation_pending" => false, -               "approval_pending" => false, -               "url" => user.ap_id, -               "registration_reason" => nil, -               "actor_type" => "Person" -             } - -    log_entry = Repo.one(ModerationLog) - -    assert ModerationLog.get_log_entry_message(log_entry) == -             "@#{admin.nickname} deactivated users: @#{user.nickname}" -  end -    describe "PUT disable_mfa" do      test "returns 200 and disable 2fa", %{conn: conn} do        user = @@ -2024,6 +977,73 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 response["status_visibility"]      end    end + +  describe "/api/pleroma/backups" do +    test "it creates a backup", %{conn: conn} do +      admin = %{id: admin_id, nickname: admin_nickname} = insert(:user, is_admin: true) +      token = insert(:oauth_admin_token, user: admin) +      user = %{id: user_id, nickname: user_nickname} = insert(:user) + +      assert "" == +               conn +               |> assign(:user, admin) +               |> assign(:token, token) +               |> post("/api/pleroma/admin/backups", %{nickname: user.nickname}) +               |> json_response(200) + +      assert [backup] = Repo.all(Pleroma.User.Backup) + +      ObanHelpers.perform_all() + +      email = Pleroma.Emails.UserEmail.backup_is_ready_email(backup, admin.id) + +      assert String.contains?(email.html_body, "Admin @#{admin.nickname} requested a full backup") +      assert_email_sent(to: {user.name, user.email}, html_body: email.html_body) + +      log_message = "@#{admin_nickname} requested account backup for @#{user_nickname}" + +      assert [ +               %{ +                 data: %{ +                   "action" => "create_backup", +                   "actor" => %{ +                     "id" => ^admin_id, +                     "nickname" => ^admin_nickname +                   }, +                   "message" => ^log_message, +                   "subject" => %{ +                     "id" => ^user_id, +                     "nickname" => ^user_nickname +                   } +                 } +               } +             ] = Pleroma.ModerationLog |> Repo.all() +    end + +    test "it doesn't limit admins", %{conn: conn} do +      admin = insert(:user, is_admin: true) +      token = insert(:oauth_admin_token, user: admin) +      user = insert(:user) + +      assert "" == +               conn +               |> assign(:user, admin) +               |> assign(:token, token) +               |> post("/api/pleroma/admin/backups", %{nickname: user.nickname}) +               |> json_response(200) + +      assert [_backup] = Repo.all(Pleroma.User.Backup) + +      assert "" == +               conn +               |> assign(:user, admin) +               |> assign(:token, token) +               |> post("/api/pleroma/admin/backups", %{nickname: user.nickname}) +               |> json_response(200) + +      assert Repo.aggregate(Pleroma.User.Backup, :count) == 2 +    end +  end  end  # Needed for testing diff --git a/test/pleroma/web/admin_api/controllers/chat_controller_test.exs b/test/pleroma/web/admin_api/controllers/chat_controller_test.exs index bd4c9c9d1..5aefa1e60 100644 --- a/test/pleroma/web/admin_api/controllers/chat_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/chat_controller_test.exs @@ -9,7 +9,6 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do    alias Pleroma.Chat    alias Pleroma.Chat.MessageReference -  alias Pleroma.Config    alias Pleroma.ModerationLog    alias Pleroma.Object    alias Pleroma.Repo diff --git a/test/pleroma/web/admin_api/controllers/instance_document_controller_test.exs b/test/pleroma/web/admin_api/controllers/instance_document_controller_test.exs index 5f7b042f6..ce867dd0e 100644 --- a/test/pleroma/web/admin_api/controllers/instance_document_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/instance_document_controller_test.exs @@ -5,7 +5,6 @@  defmodule Pleroma.Web.AdminAPI.InstanceDocumentControllerTest do    use Pleroma.Web.ConnCase, async: true    import Pleroma.Factory -  alias Pleroma.Config    @dir "test/tmp/instance_static"    @default_instance_panel ~s(<p>Welcome to <a href="https://pleroma.social" target="_blank">Pleroma!</a></p>) 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 ed7c4172c..f388375d1 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,6 @@ defmodule Pleroma.Web.AdminAPI.OAuthAppControllerTest do    import Pleroma.Factory -  alias Pleroma.Config    alias Pleroma.Web    setup do diff --git a/test/pleroma/web/admin_api/controllers/relay_controller_test.exs b/test/pleroma/web/admin_api/controllers/relay_controller_test.exs index adadf2b5c..b4c5e7567 100644 --- a/test/pleroma/web/admin_api/controllers/relay_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/relay_controller_test.exs @@ -7,7 +7,6 @@ defmodule Pleroma.Web.AdminAPI.RelayControllerTest do    import Pleroma.Factory -  alias Pleroma.Config    alias Pleroma.ModerationLog    alias Pleroma.Repo    alias Pleroma.User 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 57946e6bb..958e1d3ab 100644 --- a/test/pleroma/web/admin_api/controllers/report_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/report_controller_test.exs @@ -8,7 +8,6 @@ defmodule Pleroma.Web.AdminAPI.ReportControllerTest do    import Pleroma.Factory    alias Pleroma.Activity -  alias Pleroma.Config    alias Pleroma.ModerationLog    alias Pleroma.Repo    alias Pleroma.ReportNote @@ -38,12 +37,21 @@ defmodule Pleroma.Web.AdminAPI.ReportControllerTest do            status_ids: [activity.id]          }) +      conn +      |> put_req_header("content-type", "application/json") +      |> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ +        content: "this is an admin note" +      }) +        response =          conn          |> get("/api/pleroma/admin/reports/#{report_id}")          |> json_response_and_validate_schema(:ok)        assert response["id"] == report_id + +      [notes] = response["notes"] +      assert notes["content"] == "this is an admin note"      end      test "returns 404 when report id is invalid", %{conn: conn} do diff --git a/test/pleroma/web/admin_api/controllers/status_controller_test.exs b/test/pleroma/web/admin_api/controllers/status_controller_test.exs index eff78fb0a..a18ef9e4b 100644 --- a/test/pleroma/web/admin_api/controllers/status_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/status_controller_test.exs @@ -8,7 +8,6 @@ defmodule Pleroma.Web.AdminAPI.StatusControllerTest do    import Pleroma.Factory    alias Pleroma.Activity -  alias Pleroma.Config    alias Pleroma.ModerationLog    alias Pleroma.Repo    alias Pleroma.User diff --git a/test/pleroma/web/admin_api/controllers/user_controller_test.exs b/test/pleroma/web/admin_api/controllers/user_controller_test.exs new file mode 100644 index 000000000..5705306c7 --- /dev/null +++ b/test/pleroma/web/admin_api/controllers/user_controller_test.exs @@ -0,0 +1,970 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.UserControllerTest do +  use Pleroma.Web.ConnCase +  use Oban.Testing, repo: Pleroma.Repo + +  import Mock +  import Pleroma.Factory + +  alias Pleroma.HTML +  alias Pleroma.ModerationLog +  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.MediaProxy + +  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 "with valid `admin_token` query parameter, skips OAuth scopes check" do +    clear_config([:admin_token], "password123") + +    user = insert(:user) + +    conn = get(build_conn(), "/api/pleroma/admin/users/#{user.nickname}?admin_token=password123") + +    assert json_response(conn, 200) +  end + +  describe "with [:auth, :enforce_oauth_admin_scope_usage]," do +    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], true) + +    test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope", +         %{admin: admin} do +      user = insert(:user) +      url = "/api/pleroma/admin/users/#{user.nickname}" + +      good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"]) +      good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"]) +      good_token3 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts"]) + +      bad_token1 = insert(:oauth_token, user: admin, scopes: ["read:accounts"]) +      bad_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts:partial"]) +      bad_token3 = nil + +      for good_token <- [good_token1, good_token2, good_token3] do +        conn = +          build_conn() +          |> assign(:user, admin) +          |> assign(:token, good_token) +          |> get(url) + +        assert json_response(conn, 200) +      end + +      for good_token <- [good_token1, good_token2, good_token3] do +        conn = +          build_conn() +          |> assign(:user, nil) +          |> assign(:token, good_token) +          |> get(url) + +        assert json_response(conn, :forbidden) +      end + +      for bad_token <- [bad_token1, bad_token2, bad_token3] do +        conn = +          build_conn() +          |> assign(:user, admin) +          |> assign(:token, bad_token) +          |> get(url) + +        assert json_response(conn, :forbidden) +      end +    end +  end + +  describe "unless [:auth, :enforce_oauth_admin_scope_usage]," do +    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false) + +    test "GET /api/pleroma/admin/users/:nickname requires " <> +           "read:accounts or admin:read:accounts or broader scope", +         %{admin: admin} do +      user = insert(:user) +      url = "/api/pleroma/admin/users/#{user.nickname}" + +      good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"]) +      good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"]) +      good_token3 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts"]) +      good_token4 = insert(:oauth_token, user: admin, scopes: ["read:accounts"]) +      good_token5 = insert(:oauth_token, user: admin, scopes: ["read"]) + +      good_tokens = [good_token1, good_token2, good_token3, good_token4, good_token5] + +      bad_token1 = insert(:oauth_token, user: admin, scopes: ["read:accounts:partial"]) +      bad_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts:partial"]) +      bad_token3 = nil + +      for good_token <- good_tokens do +        conn = +          build_conn() +          |> assign(:user, admin) +          |> assign(:token, good_token) +          |> get(url) + +        assert json_response(conn, 200) +      end + +      for good_token <- good_tokens do +        conn = +          build_conn() +          |> assign(:user, nil) +          |> assign(:token, good_token) +          |> get(url) + +        assert json_response(conn, :forbidden) +      end + +      for bad_token <- [bad_token1, bad_token2, bad_token3] do +        conn = +          build_conn() +          |> assign(:user, admin) +          |> assign(:token, bad_token) +          |> get(url) + +        assert json_response(conn, :forbidden) +      end +    end +  end + +  describe "DELETE /api/pleroma/admin/users" do +    test "single user", %{admin: admin, conn: conn} do +      clear_config([:instance, :federating], true) + +      user = +        insert(:user, +          avatar: %{"url" => [%{"href" => "https://someurl"}]}, +          banner: %{"url" => [%{"href" => "https://somebanner"}]}, +          bio: "Hello world!", +          name: "A guy" +        ) + +      # Create some activities to check they got deleted later +      follower = insert(:user) +      {:ok, _} = CommonAPI.post(user, %{status: "test"}) +      {:ok, _, _, _} = CommonAPI.follow(user, follower) +      {:ok, _, _, _} = CommonAPI.follow(follower, user) +      user = Repo.get(User, user.id) +      assert user.note_count == 1 +      assert user.follower_count == 1 +      assert user.following_count == 1 +      refute user.deactivated + +      with_mock Pleroma.Web.Federator, +        publish: fn _ -> nil end, +        perform: fn _, _ -> nil end do +        conn = +          conn +          |> put_req_header("accept", "application/json") +          |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}") + +        ObanHelpers.perform_all() + +        assert User.get_by_nickname(user.nickname).deactivated + +        log_entry = Repo.one(ModerationLog) + +        assert ModerationLog.get_log_entry_message(log_entry) == +                 "@#{admin.nickname} deleted users: @#{user.nickname}" + +        assert json_response(conn, 200) == [user.nickname] + +        user = Repo.get(User, user.id) +        assert user.deactivated + +        assert user.avatar == %{} +        assert user.banner == %{} +        assert user.note_count == 0 +        assert user.follower_count == 0 +        assert user.following_count == 0 +        assert user.bio == "" +        assert user.name == nil + +        assert called(Pleroma.Web.Federator.publish(:_)) +      end +    end + +    test "multiple users", %{admin: admin, conn: conn} do +      user_one = insert(:user) +      user_two = insert(:user) + +      conn = +        conn +        |> put_req_header("accept", "application/json") +        |> delete("/api/pleroma/admin/users", %{ +          nicknames: [user_one.nickname, user_two.nickname] +        }) + +      log_entry = Repo.one(ModerationLog) + +      assert ModerationLog.get_log_entry_message(log_entry) == +               "@#{admin.nickname} deleted users: @#{user_one.nickname}, @#{user_two.nickname}" + +      response = json_response(conn, 200) +      assert response -- [user_one.nickname, user_two.nickname] == [] +    end +  end + +  describe "/api/pleroma/admin/users" do +    test "Create", %{conn: conn} do +      conn = +        conn +        |> put_req_header("accept", "application/json") +        |> post("/api/pleroma/admin/users", %{ +          "users" => [ +            %{ +              "nickname" => "lain", +              "email" => "lain@example.org", +              "password" => "test" +            }, +            %{ +              "nickname" => "lain2", +              "email" => "lain2@example.org", +              "password" => "test" +            } +          ] +        }) + +      response = json_response(conn, 200) |> Enum.map(&Map.get(&1, "type")) +      assert response == ["success", "success"] + +      log_entry = Repo.one(ModerationLog) + +      assert ["lain", "lain2"] -- Enum.map(log_entry.data["subjects"], & &1["nickname"]) == [] +    end + +    test "Cannot create user with existing email", %{conn: conn} do +      user = insert(:user) + +      conn = +        conn +        |> put_req_header("accept", "application/json") +        |> post("/api/pleroma/admin/users", %{ +          "users" => [ +            %{ +              "nickname" => "lain", +              "email" => user.email, +              "password" => "test" +            } +          ] +        }) + +      assert json_response(conn, 409) == [ +               %{ +                 "code" => 409, +                 "data" => %{ +                   "email" => user.email, +                   "nickname" => "lain" +                 }, +                 "error" => "email has already been taken", +                 "type" => "error" +               } +             ] +    end + +    test "Cannot create user with existing nickname", %{conn: conn} do +      user = insert(:user) + +      conn = +        conn +        |> put_req_header("accept", "application/json") +        |> post("/api/pleroma/admin/users", %{ +          "users" => [ +            %{ +              "nickname" => user.nickname, +              "email" => "someuser@plerama.social", +              "password" => "test" +            } +          ] +        }) + +      assert json_response(conn, 409) == [ +               %{ +                 "code" => 409, +                 "data" => %{ +                   "email" => "someuser@plerama.social", +                   "nickname" => user.nickname +                 }, +                 "error" => "nickname has already been taken", +                 "type" => "error" +               } +             ] +    end + +    test "Multiple user creation works in transaction", %{conn: conn} do +      user = insert(:user) + +      conn = +        conn +        |> put_req_header("accept", "application/json") +        |> post("/api/pleroma/admin/users", %{ +          "users" => [ +            %{ +              "nickname" => "newuser", +              "email" => "newuser@pleroma.social", +              "password" => "test" +            }, +            %{ +              "nickname" => "lain", +              "email" => user.email, +              "password" => "test" +            } +          ] +        }) + +      assert json_response(conn, 409) == [ +               %{ +                 "code" => 409, +                 "data" => %{ +                   "email" => user.email, +                   "nickname" => "lain" +                 }, +                 "error" => "email has already been taken", +                 "type" => "error" +               }, +               %{ +                 "code" => 409, +                 "data" => %{ +                   "email" => "newuser@pleroma.social", +                   "nickname" => "newuser" +                 }, +                 "error" => "", +                 "type" => "error" +               } +             ] + +      assert User.get_by_nickname("newuser") === nil +    end +  end + +  describe "/api/pleroma/admin/users/:nickname" do +    test "Show", %{conn: conn} do +      user = insert(:user) + +      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") + +      assert user_response(user) == json_response(conn, 200) +    end + +    test "when the user doesn't exist", %{conn: conn} do +      user = build(:user) + +      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") + +      assert %{"error" => "Not found"} == json_response(conn, 404) +    end +  end + +  describe "/api/pleroma/admin/users/follow" do +    test "allows to force-follow another user", %{admin: admin, conn: conn} do +      user = insert(:user) +      follower = insert(:user) + +      conn +      |> put_req_header("accept", "application/json") +      |> post("/api/pleroma/admin/users/follow", %{ +        "follower" => follower.nickname, +        "followed" => user.nickname +      }) + +      user = User.get_cached_by_id(user.id) +      follower = User.get_cached_by_id(follower.id) + +      assert User.following?(follower, user) + +      log_entry = Repo.one(ModerationLog) + +      assert ModerationLog.get_log_entry_message(log_entry) == +               "@#{admin.nickname} made @#{follower.nickname} follow @#{user.nickname}" +    end +  end + +  describe "/api/pleroma/admin/users/unfollow" do +    test "allows to force-unfollow another user", %{admin: admin, conn: conn} do +      user = insert(:user) +      follower = insert(:user) + +      User.follow(follower, user) + +      conn +      |> put_req_header("accept", "application/json") +      |> post("/api/pleroma/admin/users/unfollow", %{ +        "follower" => follower.nickname, +        "followed" => user.nickname +      }) + +      user = User.get_cached_by_id(user.id) +      follower = User.get_cached_by_id(follower.id) + +      refute User.following?(follower, user) + +      log_entry = Repo.one(ModerationLog) + +      assert ModerationLog.get_log_entry_message(log_entry) == +               "@#{admin.nickname} made @#{follower.nickname} unfollow @#{user.nickname}" +    end +  end + +  describe "GET /api/pleroma/admin/users" do +    test "renders users array for the first page", %{conn: conn, admin: admin} do +      user = insert(:user, local: false, tags: ["foo", "bar"]) +      user2 = insert(:user, approval_pending: true, registration_reason: "I'm a chill dude") + +      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, +              "approval_pending" => true, +              "registration_reason" => "I'm a chill dude", +              "actor_type" => "Person" +            } +          ) +        ] +        |> Enum.sort_by(& &1["nickname"]) + +      assert json_response(conn, 200) == %{ +               "count" => 3, +               "page_size" => 50, +               "users" => users +             } +    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") + +      insert_list(25, :user) + +      assert %{"count" => 26, "page_size" => 10, "users" => users1} = +               conn +               |> get("/api/pleroma/admin/users?page=1&filters=", %{page_size: "10"}) +               |> json_response(200) + +      assert Enum.count(users1) == 10 +      assert service1 not in users1 + +      assert %{"count" => 26, "page_size" => 10, "users" => users2} = +               conn +               |> get("/api/pleroma/admin/users?page=2&filters=", %{page_size: "10"}) +               |> json_response(200) + +      assert Enum.count(users2) == 10 +      assert service1 not in users2 + +      assert %{"count" => 26, "page_size" => 10, "users" => users3} = +               conn +               |> get("/api/pleroma/admin/users?page=3&filters=", %{page_size: "10"}) +               |> json_response(200) + +      assert Enum.count(users3) == 6 +      assert service1 not in users3 +    end + +    test "renders empty array for the second page", %{conn: conn} do +      insert(:user) + +      conn = get(conn, "/api/pleroma/admin/users?page=2") + +      assert json_response(conn, 200) == %{ +               "count" => 2, +               "page_size" => 50, +               "users" => [] +             } +    end + +    test "regular search", %{conn: conn} do +      user = insert(:user, nickname: "bob") + +      conn = get(conn, "/api/pleroma/admin/users?query=bo") + +      assert json_response(conn, 200) == %{ +               "count" => 1, +               "page_size" => 50, +               "users" => [user_response(user, %{"local" => true})] +             } +    end + +    test "search by domain", %{conn: conn} do +      user = insert(:user, nickname: "nickname@domain.com") +      insert(:user) + +      conn = get(conn, "/api/pleroma/admin/users?query=domain.com") + +      assert json_response(conn, 200) == %{ +               "count" => 1, +               "page_size" => 50, +               "users" => [user_response(user)] +             } +    end + +    test "search by full nickname", %{conn: conn} do +      user = insert(:user, nickname: "nickname@domain.com") +      insert(:user) + +      conn = get(conn, "/api/pleroma/admin/users?query=nickname@domain.com") + +      assert json_response(conn, 200) == %{ +               "count" => 1, +               "page_size" => 50, +               "users" => [user_response(user)] +             } +    end + +    test "search by display name", %{conn: conn} do +      user = insert(:user, name: "Display name") +      insert(:user) + +      conn = get(conn, "/api/pleroma/admin/users?name=display") + +      assert json_response(conn, 200) == %{ +               "count" => 1, +               "page_size" => 50, +               "users" => [user_response(user)] +             } +    end + +    test "search by email", %{conn: conn} do +      user = insert(:user, email: "email@example.com") +      insert(:user) + +      conn = get(conn, "/api/pleroma/admin/users?email=email@example.com") + +      assert json_response(conn, 200) == %{ +               "count" => 1, +               "page_size" => 50, +               "users" => [user_response(user)] +             } +    end + +    test "regular search with page size", %{conn: conn} do +      user = insert(:user, nickname: "aalice") +      user2 = insert(:user, nickname: "alice") + +      conn1 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=1") + +      assert json_response(conn1, 200) == %{ +               "count" => 2, +               "page_size" => 1, +               "users" => [user_response(user)] +             } + +      conn2 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=2") + +      assert json_response(conn2, 200) == %{ +               "count" => 2, +               "page_size" => 1, +               "users" => [user_response(user2)] +             } +    end + +    test "only local users" do +      admin = insert(:user, is_admin: true, nickname: "john") +      token = insert(:oauth_admin_token, user: admin) +      user = insert(:user, nickname: "bob") + +      insert(:user, nickname: "bobb", local: false) + +      conn = +        build_conn() +        |> assign(:user, admin) +        |> assign(:token, token) +        |> get("/api/pleroma/admin/users?query=bo&filters=local") + +      assert json_response(conn, 200) == %{ +               "count" => 1, +               "page_size" => 50, +               "users" => [user_response(user)] +             } +    end + +    test "only local users with no query", %{conn: conn, admin: old_admin} do +      admin = insert(:user, is_admin: true, nickname: "john") +      user = insert(:user, nickname: "bob") + +      insert(:user, nickname: "bobb", local: false) + +      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, %{ +            "deactivated" => false, +            "roles" => %{"admin" => true, "moderator" => false} +          }) +        ] +        |> Enum.sort_by(& &1["nickname"]) + +      assert json_response(conn, 200) == %{ +               "count" => 3, +               "page_size" => 50, +               "users" => users +             } +    end + +    test "only unconfirmed users", %{conn: conn} do +      sad_user = insert(:user, nickname: "sadboy", confirmation_pending: true) +      old_user = insert(:user, nickname: "oldboy", confirmation_pending: true) + +      insert(:user, nickname: "happyboy", approval_pending: false) +      insert(:user, confirmation_pending: false) + +      result = +        conn +        |> get("/api/pleroma/admin/users?filters=unconfirmed") +        |> json_response(200) + +      users = +        Enum.map([old_user, sad_user], fn user -> +          user_response(user, %{ +            "confirmation_pending" => true, +            "approval_pending" => false +          }) +        end) +        |> Enum.sort_by(& &1["nickname"]) + +      assert result == %{"count" => 2, "page_size" => 50, "users" => users} +    end + +    test "only unapproved users", %{conn: conn} do +      user = +        insert(:user, +          nickname: "sadboy", +          approval_pending: true, +          registration_reason: "Plz let me in!" +        ) + +      insert(:user, nickname: "happyboy", approval_pending: false) + +      conn = get(conn, "/api/pleroma/admin/users?filters=need_approval") + +      users = [ +        user_response( +          user, +          %{"approval_pending" => true, "registration_reason" => "Plz let me in!"} +        ) +      ] + +      assert json_response(conn, 200) == %{ +               "count" => 1, +               "page_size" => 50, +               "users" => users +             } +    end + +    test "load only admins", %{conn: conn, admin: admin} do +      second_admin = insert(:user, is_admin: true) +      insert(:user) +      insert(:user) + +      conn = get(conn, "/api/pleroma/admin/users?filters=is_admin") + +      users = +        [ +          user_response(admin, %{ +            "deactivated" => false, +            "roles" => %{"admin" => true, "moderator" => false} +          }), +          user_response(second_admin, %{ +            "deactivated" => false, +            "roles" => %{"admin" => true, "moderator" => false} +          }) +        ] +        |> Enum.sort_by(& &1["nickname"]) + +      assert json_response(conn, 200) == %{ +               "count" => 2, +               "page_size" => 50, +               "users" => users +             } +    end + +    test "load only moderators", %{conn: conn} do +      moderator = insert(:user, is_moderator: true) +      insert(:user) +      insert(:user) + +      conn = get(conn, "/api/pleroma/admin/users?filters=is_moderator") + +      assert json_response(conn, 200) == %{ +               "count" => 1, +               "page_size" => 50, +               "users" => [ +                 user_response(moderator, %{ +                   "deactivated" => false, +                   "roles" => %{"admin" => false, "moderator" => true} +                 }) +               ] +             } +    end + +    test "load users with actor_type is Person", %{admin: admin, conn: conn} do +      insert(:user, actor_type: "Service") +      insert(:user, actor_type: "Application") + +      user1 = insert(:user) +      user2 = insert(:user) + +      response = +        conn +        |> get(user_path(conn, :list), %{actor_types: ["Person"]}) +        |> json_response(200) + +      users = +        [ +          user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}}), +          user_response(user1), +          user_response(user2) +        ] +        |> Enum.sort_by(& &1["nickname"]) + +      assert response == %{"count" => 3, "page_size" => 50, "users" => users} +    end + +    test "load users with actor_type is Person and Service", %{admin: admin, conn: conn} do +      user_service = insert(:user, actor_type: "Service") +      insert(:user, actor_type: "Application") + +      user1 = insert(:user) +      user2 = insert(:user) + +      response = +        conn +        |> get(user_path(conn, :list), %{actor_types: ["Person", "Service"]}) +        |> json_response(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"]) + +      assert response == %{"count" => 4, "page_size" => 50, "users" => users} +    end + +    test "load users with actor_type is Service", %{conn: conn} do +      user_service = insert(:user, actor_type: "Service") +      insert(:user, actor_type: "Application") +      insert(:user) +      insert(:user) + +      response = +        conn +        |> get(user_path(conn, :list), %{actor_types: ["Service"]}) +        |> json_response(200) + +      users = [user_response(user_service, %{"actor_type" => "Service"})] + +      assert response == %{"count" => 1, "page_size" => 50, "users" => users} +    end + +    test "load users with tags list", %{conn: conn} do +      user1 = insert(:user, tags: ["first"]) +      user2 = insert(:user, tags: ["second"]) +      insert(:user) +      insert(:user) + +      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"]) + +      assert json_response(conn, 200) == %{ +               "count" => 2, +               "page_size" => 50, +               "users" => users +             } +    end + +    test "`active` filters out users pending approval", %{token: token} do +      insert(:user, approval_pending: true) +      %{id: user_id} = insert(:user, approval_pending: false) +      %{id: admin_id} = token.user + +      conn = +        build_conn() +        |> assign(:user, token.user) +        |> assign(:token, token) +        |> get("/api/pleroma/admin/users?filters=active") + +      assert %{ +               "count" => 2, +               "page_size" => 50, +               "users" => [ +                 %{"id" => ^admin_id}, +                 %{"id" => ^user_id} +               ] +             } = json_response(conn, 200) +    end + +    test "it works with multiple filters" do +      admin = insert(:user, nickname: "john", is_admin: true) +      token = insert(:oauth_admin_token, user: admin) +      user = insert(:user, nickname: "bob", local: false, deactivated: true) + +      insert(:user, nickname: "ken", local: true, deactivated: true) +      insert(:user, nickname: "bobb", local: false, deactivated: false) + +      conn = +        build_conn() +        |> assign(:user, admin) +        |> assign(:token, token) +        |> get("/api/pleroma/admin/users?filters=deactivated,external") + +      assert json_response(conn, 200) == %{ +               "count" => 1, +               "page_size" => 50, +               "users" => [user_response(user)] +             } +    end + +    test "it omits relay user", %{admin: admin, conn: conn} do +      assert %User{} = Relay.get_actor() + +      conn = get(conn, "/api/pleroma/admin/users") + +      assert json_response(conn, 200) == %{ +               "count" => 1, +               "page_size" => 50, +               "users" => [ +                 user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}}) +               ] +             } +    end +  end + +  test "PATCH /api/pleroma/admin/users/activate", %{admin: admin, conn: conn} do +    user_one = insert(:user, deactivated: true) +    user_two = insert(:user, deactivated: true) + +    conn = +      patch( +        conn, +        "/api/pleroma/admin/users/activate", +        %{nicknames: [user_one.nickname, user_two.nickname]} +      ) + +    response = json_response(conn, 200) +    assert Enum.map(response["users"], & &1["deactivated"]) == [false, false] + +    log_entry = Repo.one(ModerationLog) + +    assert ModerationLog.get_log_entry_message(log_entry) == +             "@#{admin.nickname} activated users: @#{user_one.nickname}, @#{user_two.nickname}" +  end + +  test "PATCH /api/pleroma/admin/users/deactivate", %{admin: admin, conn: conn} do +    user_one = insert(:user, deactivated: false) +    user_two = insert(:user, deactivated: false) + +    conn = +      patch( +        conn, +        "/api/pleroma/admin/users/deactivate", +        %{nicknames: [user_one.nickname, user_two.nickname]} +      ) + +    response = json_response(conn, 200) +    assert Enum.map(response["users"], & &1["deactivated"]) == [true, true] + +    log_entry = Repo.one(ModerationLog) + +    assert ModerationLog.get_log_entry_message(log_entry) == +             "@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}" +  end + +  test "PATCH /api/pleroma/admin/users/approve", %{admin: admin, conn: conn} do +    user_one = insert(:user, approval_pending: true) +    user_two = insert(:user, approval_pending: true) + +    conn = +      patch( +        conn, +        "/api/pleroma/admin/users/approve", +        %{nicknames: [user_one.nickname, user_two.nickname]} +      ) + +    response = json_response(conn, 200) +    assert Enum.map(response["users"], & &1["approval_pending"]) == [false, false] + +    log_entry = Repo.one(ModerationLog) + +    assert ModerationLog.get_log_entry_message(log_entry) == +             "@#{admin.nickname} approved users: @#{user_one.nickname}, @#{user_two.nickname}" +  end + +  test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admin, conn: conn} do +    user = insert(:user) + +    conn = patch(conn, "/api/pleroma/admin/users/#{user.nickname}/toggle_activation") + +    assert json_response(conn, 200) == +             user_response( +               user, +               %{"deactivated" => !user.deactivated} +             ) + +    log_entry = Repo.one(ModerationLog) + +    assert ModerationLog.get_log_entry_message(log_entry) == +             "@#{admin.nickname} deactivated users: @#{user.nickname}" +  end + +  defp user_response(user, attrs \\ %{}) do +    %{ +      "deactivated" => user.deactivated, +      "id" => user.id, +      "nickname" => user.nickname, +      "roles" => %{"admin" => false, "moderator" => false}, +      "local" => user.local, +      "tags" => [], +      "avatar" => User.avatar_url(user) |> MediaProxy.url(), +      "display_name" => HTML.strip_tags(user.name || user.nickname), +      "confirmation_pending" => false, +      "approval_pending" => false, +      "url" => user.ap_id, +      "registration_reason" => nil, +      "actor_type" => "Person" +    } +    |> Map.merge(attrs) +  end +end diff --git a/test/pleroma/web/admin_api/search_test.exs b/test/pleroma/web/admin_api/search_test.exs index d88867c52..92a116c65 100644 --- a/test/pleroma/web/admin_api/search_test.exs +++ b/test/pleroma/web/admin_api/search_test.exs @@ -143,6 +143,20 @@ defmodule Pleroma.Web.AdminAPI.SearchTest do        assert user2 in users      end +    test "it returns users by actor_types" do +      user_service = insert(:user, actor_type: "Service") +      user_application = insert(:user, actor_type: "Application") +      user1 = insert(:user) +      user2 = insert(:user) + +      {: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, [^user_service, ^user1, ^user2], 3} = +        Search.user(%{actor_types: ["Person", "Service"]}) +    end +      test "it returns user by display name" do        user = insert(:user, name: "Display name")        insert(:user) @@ -178,9 +192,20 @@ defmodule Pleroma.Web.AdminAPI.SearchTest do        assert count == 1      end +    test "it returns unconfirmed user" do +      unconfirmed = insert(:user, confirmation_pending: true) +      insert(:user) +      insert(:user) + +      {:ok, _results, total} = Search.user() +      {:ok, [^unconfirmed], count} = Search.user(%{unconfirmed: true}) +      assert total == 3 +      assert count == 1 +    end +      test "it returns non-discoverable users" do        insert(:user) -      insert(:user, discoverable: false) +      insert(:user, is_discoverable: false)        {:ok, _results, total} = Search.user() diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs index e34f5a49b..c5b90ad84 100644 --- a/test/pleroma/web/common_api_test.exs +++ b/test/pleroma/web/common_api_test.exs @@ -95,12 +95,26 @@ defmodule Pleroma.Web.CommonAPITest do    describe "posting chat messages" do      setup do: clear_config([:instance, :chat_limit]) +    test "it posts a self-chat" do +      author = insert(:user) +      recipient = author + +      {:ok, activity} = +        CommonAPI.post_chat_message( +          author, +          recipient, +          "remember to buy milk when milk truk arive" +        ) + +      assert activity.data["type"] == "Create" +    end +      test "it posts a chat message without content but with an attachment" do        author = insert(:user)        recipient = insert(:user)        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -622,7 +636,7 @@ defmodule Pleroma.Web.CommonAPITest do        assert {:error, "The status is over the character limit"} =                 CommonAPI.post(user, %{status: "foobar"}) -      assert {:ok, activity} = CommonAPI.post(user, %{status: "12345"}) +      assert {:ok, _activity} = CommonAPI.post(user, %{status: "12345"})      end      test "it can handle activities that expire" do @@ -1071,7 +1085,7 @@ defmodule Pleroma.Web.CommonAPITest do      test "cancels a pending follow for a local user" do        follower = insert(:user) -      followed = insert(:user, locked: true) +      followed = insert(:user, is_locked: true)        assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} =                 CommonAPI.follow(follower, followed) @@ -1093,7 +1107,7 @@ defmodule Pleroma.Web.CommonAPITest do      test "cancels a pending follow for a remote user" do        follower = insert(:user) -      followed = insert(:user, locked: true, local: false, ap_enabled: true) +      followed = insert(:user, is_locked: true, local: false, ap_enabled: true)        assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} =                 CommonAPI.follow(follower, followed) @@ -1116,7 +1130,7 @@ defmodule Pleroma.Web.CommonAPITest do    describe "accept_follow_request/2" do      test "after acceptance, it sets all existing pending follow request states to 'accept'" do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        follower = insert(:user)        follower_two = insert(:user) @@ -1136,7 +1150,7 @@ defmodule Pleroma.Web.CommonAPITest do      end      test "after rejection, it sets all existing pending follow request states to 'reject'" do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        follower = insert(:user)        follower_two = insert(:user) @@ -1156,7 +1170,7 @@ defmodule Pleroma.Web.CommonAPITest do      end      test "doesn't create a following relationship if the corresponding follow request doesn't exist" do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        not_follower = insert(:user)        CommonAPI.accept_follow_request(not_follower, user) diff --git a/test/pleroma/web/endpoint/metrics_exporter_test.exs b/test/pleroma/web/endpoint/metrics_exporter_test.exs new file mode 100644 index 000000000..875addc96 --- /dev/null +++ b/test/pleroma/web/endpoint/metrics_exporter_test.exs @@ -0,0 +1,68 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Endpoint.MetricsExporterTest do +  use Pleroma.Web.ConnCase + +  alias Pleroma.Web.Endpoint.MetricsExporter + +  defp config do +    Application.get_env(:prometheus, MetricsExporter) +  end + +  describe "with default config" do +    test "does NOT expose app metrics", %{conn: conn} do +      conn +      |> get(config()[:path]) +      |> json_response(404) +    end +  end + +  describe "when enabled" do +    setup do +      initial_config = config() +      on_exit(fn -> Application.put_env(:prometheus, MetricsExporter, initial_config) end) + +      Application.put_env( +        :prometheus, +        MetricsExporter, +        Keyword.put(initial_config, :enabled, true) +      ) +    end + +    test "serves app metrics", %{conn: conn} do +      conn = get(conn, config()[:path]) +      assert response = response(conn, 200) + +      for metric <- [ +            "http_requests_total", +            "http_request_duration_microseconds", +            "phoenix_controller_call_duration", +            "telemetry_scrape_duration", +            "erlang_vm_memory_atom_bytes_total" +          ] do +        assert response =~ ~r/#{metric}/ +      end +    end + +    test "when IP whitelist configured, " <> +           "serves app metrics only if client IP is whitelisted", +         %{conn: conn} do +      Application.put_env( +        :prometheus, +        MetricsExporter, +        Keyword.put(config(), :ip_whitelist, ["127.127.127.127", {1, 1, 1, 1}, '255.255.255.255']) +      ) + +      conn +      |> get(config()[:path]) +      |> json_response(404) + +      conn +      |> Map.put(:remote_ip, {127, 127, 127, 127}) +      |> get(config()[:path]) +      |> response(200) +    end +  end +end diff --git a/test/pleroma/web/fed_sockets/fed_registry_test.exs b/test/pleroma/web/fed_sockets/fed_registry_test.exs index 19ac874d6..73aaced46 100644 --- a/test/pleroma/web/fed_sockets/fed_registry_test.exs +++ b/test/pleroma/web/fed_sockets/fed_registry_test.exs @@ -52,7 +52,7 @@ defmodule Pleroma.Web.FedSockets.FedRegistryTest do      end      test "will be ignored" do -      assert {:ok, %SocketInfo{origin: origin, pid: pid_one}} = +      assert {:ok, %SocketInfo{origin: origin, pid: _pid_one}} =                 FedRegistry.get_fed_socket(@good_domain_origin)        assert origin == "good.domain:80" @@ -63,7 +63,7 @@ defmodule Pleroma.Web.FedSockets.FedRegistryTest do      test "the newer process will be closed" do        pid_two = build_test_socket(@good_domain) -      assert {:ok, %SocketInfo{origin: origin, pid: pid_one}} = +      assert {:ok, %SocketInfo{origin: origin, pid: _pid_one}} =                 FedRegistry.get_fed_socket(@good_domain_origin)        assert origin == "good.domain:80" diff --git a/test/pleroma/web/feed/tag_controller_test.exs b/test/pleroma/web/feed/tag_controller_test.exs index 868e40965..e4084b0e5 100644 --- a/test/pleroma/web/feed/tag_controller_test.exs +++ b/test/pleroma/web/feed/tag_controller_test.exs @@ -8,6 +8,7 @@ defmodule Pleroma.Web.Feed.TagControllerTest do    import Pleroma.Factory    import SweetXml +  alias Pleroma.Config    alias Pleroma.Object    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.Feed.FeedView @@ -15,7 +16,7 @@ defmodule Pleroma.Web.Feed.TagControllerTest do    setup do: clear_config([:feed])    test "gets a feed (ATOM)", %{conn: conn} do -    Pleroma.Config.put( +    Config.put(        [:feed, :post_title],        %{max_length: 25, omission: "..."}      ) @@ -82,7 +83,7 @@ defmodule Pleroma.Web.Feed.TagControllerTest do    end    test "gets a feed (RSS)", %{conn: conn} do -    Pleroma.Config.put( +    Config.put(        [:feed, :post_title],        %{max_length: 25, omission: "..."}      ) @@ -157,7 +158,7 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      response =        conn        |> put_req_header("accept", "application/rss+xml") -      |> get(tag_feed_path(conn, :feed, "pleromaart")) +      |> get(tag_feed_path(conn, :feed, "pleromaart.rss"))        |> response(200)      xml = parse(response) @@ -183,14 +184,12 @@ defmodule Pleroma.Web.Feed.TagControllerTest do    end    describe "private instance" do -    setup do: clear_config([:instance, :public]) +    setup do: clear_config([:instance, :public], false)      test "returns 404 for tags feed", %{conn: conn} do -      Config.put([:instance, :public], false) -        conn        |> put_req_header("accept", "application/rss+xml") -      |> get(tag_feed_path(conn, :feed, "pleromaart")) +      |> get(tag_feed_path(conn, :feed, "pleromaart.rss"))        |> response(404)      end    end diff --git a/test/pleroma/web/feed/user_controller_test.exs b/test/pleroma/web/feed/user_controller_test.exs index a5dc0894b..eabfe3a63 100644 --- a/test/pleroma/web/feed/user_controller_test.exs +++ b/test/pleroma/web/feed/user_controller_test.exs @@ -13,7 +13,7 @@ defmodule Pleroma.Web.Feed.UserControllerTest do    alias Pleroma.User    alias Pleroma.Web.CommonAPI -  setup do: clear_config([:instance, :federating], true) +  setup do: clear_config([:static_fe, :enabled], false)    describe "feed" do      setup do: clear_config([:feed]) @@ -192,6 +192,16 @@ defmodule Pleroma.Web.Feed.UserControllerTest do               |> get(user_feed_path(conn, :feed, user.nickname))               |> response(404)      end + +    test "does not require authentication on non-federating instances", %{conn: conn} do +      clear_config([:instance, :federating], false) +      user = insert(:user) + +      conn +      |> put_req_header("accept", "application/rss+xml") +      |> get("/users/#{user.nickname}/feed.rss") +      |> response(200) +    end    end    # Note: see ActivityPubControllerTest for JSON format tests 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 f7f1369e4..58ce76ab8 100644 --- a/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs @@ -32,7 +32,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      test "works by nickname" do        user = insert(:user) -      assert %{"id" => user_id} = +      assert %{"id" => _user_id} =                 build_conn()                 |> get("/api/v1/accounts/#{user.nickname}")                 |> json_response_and_validate_schema(200) @@ -43,7 +43,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        user = insert(:user, nickname: "user@example.com", local: false) -      assert %{"id" => user_id} = +      assert %{"id" => _user_id} =                 build_conn()                 |> get("/api/v1/accounts/#{user.nickname}")                 |> json_response_and_validate_schema(200) @@ -380,7 +380,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        other_user = insert(:user)        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -706,7 +706,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end      test "cancelling follow request", %{conn: conn} do -      %{id: other_user_id} = insert(:user, %{locked: true}) +      %{id: other_user_id} = insert(:user, %{is_locked: true})        assert %{"id" => ^other_user_id, "following" => false, "requested" => true} =                 conn @@ -1429,10 +1429,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      test "returns lists to which the account belongs" do        %{user: user, conn: conn} = oauth_access(["read:lists"])        other_user = insert(:user) -      assert {:ok, %Pleroma.List{id: list_id} = list} = Pleroma.List.create("Test List", user) +      assert {:ok, %Pleroma.List{id: _list_id} = list} = Pleroma.List.create("Test List", user)        {:ok, %{following: _following}} = Pleroma.List.follow(list, other_user) -      assert [%{"id" => list_id, "title" => "Test List"}] = +      assert [%{"id" => _list_id, "title" => "Test List"}] =                 conn                 |> get("/api/v1/accounts/#{other_user.id}/lists")                 |> json_response_and_validate_schema(200) @@ -1509,28 +1509,103 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do    test "getting a list of mutes" do      %{user: user, conn: conn} = oauth_access(["read:mutes"]) -    other_user = insert(:user) +    %{id: id1} = other_user1 = insert(:user) +    %{id: id2} = other_user2 = insert(:user) +    %{id: id3} = other_user3 = insert(:user) + +    {:ok, _user_relationships} = User.mute(user, other_user1) +    {:ok, _user_relationships} = User.mute(user, other_user2) +    {:ok, _user_relationships} = User.mute(user, other_user3) + +    result = +      conn +      |> assign(:user, user) +      |> get("/api/v1/mutes") +      |> json_response_and_validate_schema(200) + +    assert [id1, id2, id3] == Enum.map(result, & &1["id"]) + +    result = +      conn +      |> assign(:user, user) +      |> get("/api/v1/mutes?limit=1") +      |> json_response_and_validate_schema(200) -    {:ok, _user_relationships} = User.mute(user, other_user) +    assert [%{"id" => ^id1}] = result -    conn = get(conn, "/api/v1/mutes") +    result = +      conn +      |> assign(:user, user) +      |> get("/api/v1/mutes?since_id=#{id1}") +      |> json_response_and_validate_schema(200) + +    assert [%{"id" => ^id2}, %{"id" => ^id3}] = result + +    result = +      conn +      |> assign(:user, user) +      |> get("/api/v1/mutes?since_id=#{id1}&max_id=#{id3}") +      |> json_response_and_validate_schema(200) + +    assert [%{"id" => ^id2}] = result + +    result = +      conn +      |> assign(:user, user) +      |> get("/api/v1/mutes?since_id=#{id1}&limit=1") +      |> json_response_and_validate_schema(200) -    other_user_id = to_string(other_user.id) -    assert [%{"id" => ^other_user_id}] = json_response_and_validate_schema(conn, 200) +    assert [%{"id" => ^id2}] = result    end    test "getting a list of blocks" do      %{user: user, conn: conn} = oauth_access(["read:blocks"]) -    other_user = insert(:user) +    %{id: id1} = other_user1 = insert(:user) +    %{id: id2} = other_user2 = insert(:user) +    %{id: id3} = other_user3 = insert(:user) -    {:ok, _user_relationship} = User.block(user, other_user) +    {:ok, _user_relationship} = User.block(user, other_user1) +    {:ok, _user_relationship} = User.block(user, other_user3) +    {:ok, _user_relationship} = User.block(user, other_user2) -    conn = +    result =        conn        |> assign(:user, user)        |> get("/api/v1/blocks") +      |> json_response_and_validate_schema(200) + +    assert [id1, id2, id3] == Enum.map(result, & &1["id"]) + +    result = +      conn +      |> assign(:user, user) +      |> get("/api/v1/blocks?limit=1") +      |> json_response_and_validate_schema(200) + +    assert [%{"id" => ^id1}] = result + +    result = +      conn +      |> assign(:user, user) +      |> get("/api/v1/blocks?since_id=#{id1}") +      |> json_response_and_validate_schema(200) + +    assert [%{"id" => ^id2}, %{"id" => ^id3}] = result + +    result = +      conn +      |> assign(:user, user) +      |> get("/api/v1/blocks?since_id=#{id1}&max_id=#{id3}") +      |> json_response_and_validate_schema(200) + +    assert [%{"id" => ^id2}] = result + +    result = +      conn +      |> assign(:user, user) +      |> get("/api/v1/blocks?since_id=#{id1}&limit=1") +      |> json_response_and_validate_schema(200) -    other_user_id = to_string(other_user.id) -    assert [%{"id" => ^other_user_id}] = json_response_and_validate_schema(conn, 200) +    assert [%{"id" => ^id2}] = result    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 3e21e6bf1..c67e584dd 100644 --- a/test/pleroma/web/mastodon_api/controllers/conversation_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/conversation_controller_test.exs @@ -5,6 +5,7 @@  defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do    use Pleroma.Web.ConnCase +  alias Pleroma.Conversation.Participation    alias Pleroma.User    alias Pleroma.Web.CommonAPI @@ -28,10 +29,10 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do        user_three: user_three,        conn: conn      } do -      assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 +      assert Participation.unread_count(user_two) == 0        {:ok, direct} = create_direct_message(user_one, [user_two, user_three]) -      assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 +      assert Participation.unread_count(user_two) == 1        {:ok, _follower_only} =          CommonAPI.post(user_one, %{ @@ -54,12 +55,33 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do        account_ids = Enum.map(res_accounts, & &1["id"])        assert length(res_accounts) == 2 +      assert user_one.id not in account_ids        assert user_two.id in account_ids        assert user_three.id in account_ids        assert is_binary(res_id)        assert unread == false        assert res_last_status["id"] == direct.id -      assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 +      assert res_last_status["account"]["id"] == user_one.id +      assert Participation.unread_count(user_one) == 0 +    end + +    test "includes the user if the user is the only participant", %{ +      user: user_one, +      conn: conn +    } do +      {:ok, _direct} = create_direct_message(user_one, []) + +      res_conn = get(conn, "/api/v1/conversations") + +      assert response = json_response_and_validate_schema(res_conn, 200) + +      assert [ +               %{ +                 "accounts" => [account] +               } +             ] = response + +      assert user_one.id == account["id"]      end      test "observes limit params", %{ @@ -134,8 +156,8 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do      user_two = insert(:user)      {:ok, direct} = create_direct_message(user_one, [user_two]) -    assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 -    assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 +    assert Participation.unread_count(user_one) == 0 +    assert Participation.unread_count(user_two) == 1      user_two_conn =        build_conn() @@ -155,8 +177,8 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do        |> post("/api/v1/conversations/#{direct_conversation_id}/read")        |> json_response_and_validate_schema(200) -    assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 -    assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 +    assert Participation.unread_count(user_one) == 0 +    assert Participation.unread_count(user_two) == 0      # The conversation is marked as unread on reply      {:ok, _} = @@ -171,8 +193,8 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do        |> get("/api/v1/conversations")        |> json_response_and_validate_schema(200) -    assert User.get_cached_by_id(user_one.id).unread_conversation_count == 1 -    assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 +    assert Participation.unread_count(user_one) == 1 +    assert Participation.unread_count(user_two) == 0      # A reply doesn't increment the user's unread_conversation_count if the conversation is unread      {:ok, _} = @@ -182,8 +204,8 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do          in_reply_to_status_id: direct.id        }) -    assert User.get_cached_by_id(user_one.id).unread_conversation_count == 1 -    assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 +    assert Participation.unread_count(user_one) == 1 +    assert Participation.unread_count(user_two) == 0    end    test "(vanilla) Mastodon frontend behaviour", %{user: user_one, conn: conn} do diff --git a/test/pleroma/web/mastodon_api/controllers/follow_request_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/follow_request_controller_test.exs index 6749e0e83..a9dd7cd30 100644 --- a/test/pleroma/web/mastodon_api/controllers/follow_request_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/follow_request_controller_test.exs @@ -12,7 +12,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do    describe "locked accounts" do      setup do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        %{conn: conn} = oauth_access(["follow"], user: user)        %{user: user, conn: conn}      end 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 906fd940f..d2bd57515 100644 --- a/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs @@ -14,7 +14,7 @@ defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do      setup do        image = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -74,7 +74,7 @@ defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do      setup %{user: actor} do        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -106,7 +106,7 @@ defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do      setup %{user: actor} do        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } 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 633a25e50..436608e51 100644 --- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs @@ -167,7 +167,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      test "posting an undefined status with an attachment", %{user: user, conn: conn} do        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -408,7 +408,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do          |> Kernel.<>("Z")        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -937,7 +937,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do          |> get("/api/v1/statuses/#{reblog_activity1.id}")        assert %{ -               "reblog" => %{"id" => id, "reblogged" => false, "reblogs_count" => 2}, +               "reblog" => %{"id" => _id, "reblogged" => false, "reblogs_count" => 2},                 "reblogged" => false,                 "favourited" => false,                 "bookmarked" => false 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 8a70cfd64..4c08ad60a 100644 --- a/test/pleroma/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/timeline_controller_test.exs @@ -8,7 +8,6 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do    import Pleroma.Factory    import Tesla.Mock -  alias Pleroma.Config    alias Pleroma.User    alias Pleroma.Web.CommonAPI diff --git a/test/pleroma/web/mastodon_api/update_credentials_test.exs b/test/pleroma/web/mastodon_api/update_credentials_test.exs index fe462caa3..ed1921c91 100644 --- a/test/pleroma/web/mastodon_api/update_credentials_test.exs +++ b/test/pleroma/web/mastodon_api/update_credentials_test.exs @@ -222,7 +222,7 @@ defmodule Pleroma.Web.MastodonAPI.UpdateCredentialsTest do      test "updates the user's avatar", %{user: user, conn: conn} do        new_avatar = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -246,7 +246,7 @@ defmodule Pleroma.Web.MastodonAPI.UpdateCredentialsTest do      test "updates the user's banner", %{user: user, conn: conn} do        new_header = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -265,7 +265,7 @@ defmodule Pleroma.Web.MastodonAPI.UpdateCredentialsTest do      test "updates the user's background", %{conn: conn, user: user} do        new_header = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } 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 a5f39b215..203e61c71 100644 --- a/test/pleroma/web/mastodon_api/views/account_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/account_view_test.exs @@ -332,7 +332,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      test "represent a relationship for the user with a pending follow request" do        user = insert(:user) -      other_user = insert(:user, locked: true) +      other_user = insert(:user, is_locked: true)        {:ok, user, other_user, _} = CommonAPI.follow(user, other_user)        user = User.get_cached_by_id(user.id) @@ -481,7 +481,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      end      test "shows non-zero when follow requests are pending" do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user}) @@ -493,7 +493,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      end      test "decreases when accepting a follow request" do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user}) @@ -510,7 +510,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      end      test "decreases when rejecting a follow request" do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user}) @@ -527,14 +527,14 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      end      test "shows non-zero when historical unapproved requests are present" do -      user = insert(:user, locked: true) +      user = insert(:user, is_locked: true)        assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user})        other_user = insert(:user)        {:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) -      {:ok, user} = User.update_and_set_cache(user, %{locked: false}) +      {:ok, user} = User.update_and_set_cache(user, %{is_locked: false})        assert %{locked: false, follow_requests_count: 1} =                 AccountView.render("show.json", %{user: user, for: user}) diff --git a/test/pleroma/web/mastodon_api/views/conversation_view_test.exs b/test/pleroma/web/mastodon_api/views/conversation_view_test.exs index 2e8203c9b..20c10ba3d 100644 --- a/test/pleroma/web/mastodon_api/views/conversation_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/conversation_view_test.exs @@ -36,9 +36,11 @@ defmodule Pleroma.Web.MastodonAPI.ConversationViewTest do      assert conversation.id == participation.id |> to_string()      assert conversation.last_status.id == activity.id +    assert conversation.last_status.account.id == user.id      assert [account] = conversation.accounts      assert account.id == other_user.id +      assert conversation.last_status.pleroma.direct_conversation_id == participation.id    end  end diff --git a/test/pleroma/web/mastodon_api/views/scheduled_activity_view_test.exs b/test/pleroma/web/mastodon_api/views/scheduled_activity_view_test.exs index fbfd873ef..04f73f5a0 100644 --- a/test/pleroma/web/mastodon_api/views/scheduled_activity_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/scheduled_activity_view_test.exs @@ -22,7 +22,7 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityViewTest do        |> NaiveDateTime.to_iso8601()      file = %Plug.Upload{ -      content_type: "image/jpg", +      content_type: "image/jpeg",        path: Path.absname("test/fixtures/image.jpg"),        filename: "an_image.jpg"      } diff --git a/test/pleroma/web/metadata/providers/restrict_indexing_test.exs b/test/pleroma/web/metadata/providers/restrict_indexing_test.exs index 6b3a65372..282d132c8 100644 --- a/test/pleroma/web/metadata/providers/restrict_indexing_test.exs +++ b/test/pleroma/web/metadata/providers/restrict_indexing_test.exs @@ -14,13 +14,13 @@ defmodule Pleroma.Web.Metadata.Providers.RestrictIndexingTest do      test "for local user" do        assert Pleroma.Web.Metadata.Providers.RestrictIndexing.build_tags(%{ -               user: %Pleroma.User{local: true, discoverable: true} +               user: %Pleroma.User{local: true, is_discoverable: true}               }) == []      end      test "for local user when discoverable is false" do        assert Pleroma.Web.Metadata.Providers.RestrictIndexing.build_tags(%{ -               user: %Pleroma.User{local: true, discoverable: false} +               user: %Pleroma.User{local: true, is_discoverable: false}               }) == [{:meta, [name: "robots", content: "noindex, noarchive"], []}]      end    end diff --git a/test/pleroma/web/metadata_test.exs b/test/pleroma/web/metadata_test.exs index ca6cbe67f..8fb946540 100644 --- a/test/pleroma/web/metadata_test.exs +++ b/test/pleroma/web/metadata_test.exs @@ -16,14 +16,14 @@ defmodule Pleroma.Web.MetadataTest do      end      test "for local user" do -      user = insert(:user, discoverable: false) +      user = insert(:user, is_discoverable: false)        assert Pleroma.Web.Metadata.build_tags(%{user: user}) =~                 "<meta content=\"noindex, noarchive\" name=\"robots\">"      end      test "for local user set to discoverable" do -      user = insert(:user, discoverable: true) +      user = insert(:user, is_discoverable: true)        refute Pleroma.Web.Metadata.build_tags(%{user: user}) =~                 "<meta content=\"noindex, noarchive\" name=\"robots\">" @@ -33,14 +33,14 @@ defmodule Pleroma.Web.MetadataTest do    describe "no metadata for private instances" do      test "for local user set to discoverable" do        clear_config([:instance, :public], false) -      user = insert(:user, bio: "This is my secret fedi account bio", discoverable: true) +      user = insert(:user, bio: "This is my secret fedi account bio", is_discoverable: true)        assert "" = Pleroma.Web.Metadata.build_tags(%{user: user})      end      test "search exclusion metadata is included" do        clear_config([:instance, :public], false) -      user = insert(:user, bio: "This is my secret fedi account bio", discoverable: false) +      user = insert(:user, bio: "This is my secret fedi account bio", is_discoverable: false)        assert ~s(<meta content="noindex, noarchive" name="robots">) ==                 Pleroma.Web.Metadata.build_tags(%{user: user}) diff --git a/test/pleroma/web/o_auth/o_auth_controller_test.exs b/test/pleroma/web/o_auth/o_auth_controller_test.exs index 1200126b8..a00df8cc7 100644 --- a/test/pleroma/web/o_auth/o_auth_controller_test.exs +++ b/test/pleroma/web/o_auth/o_auth_controller_test.exs @@ -77,7 +77,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do            }          ) -      assert response = html_response(conn, 302) +      assert html_response(conn, 302)        redirect_query = URI.parse(redirected_to(conn)).query        assert %{"state" => state_param} = URI.decode_query(redirect_query) @@ -119,7 +119,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do            }          ) -      assert response = html_response(conn, 302) +      assert html_response(conn, 302)        assert redirected_to(conn) =~ ~r/#{redirect_uri}\?code=.+/      end @@ -182,7 +182,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do            }          ) -      assert response = html_response(conn, 302) +      assert html_response(conn, 302)        assert redirected_to(conn) == app.redirect_uris        assert get_flash(conn, :error) == "Failed to authenticate: (error description)."      end @@ -238,7 +238,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do            }          ) -      assert response = html_response(conn, 302) +      assert html_response(conn, 302)        assert redirected_to(conn) =~ ~r/#{redirect_uri}\?code=.+/      end @@ -268,7 +268,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do            }          ) -      assert response = html_response(conn, 401) +      assert html_response(conn, 401)      end      test "with invalid params, POST /oauth/register?op=register renders registration_details page", @@ -336,7 +336,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do            }          ) -      assert response = html_response(conn, 302) +      assert html_response(conn, 302)        assert redirected_to(conn) =~ ~r/#{redirect_uri}\?code=.+/      end @@ -367,7 +367,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do            }          ) -      assert response = html_response(conn, 401) +      assert html_response(conn, 401)      end      test "with invalid params, POST /oauth/register?op=connect renders registration_details page", 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 ee498f4b5..65b2c22db 100644 --- a/test/pleroma/web/o_status/o_status_controller_test.exs +++ b/test/pleroma/web/o_status/o_status_controller_test.exs @@ -7,7 +7,6 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do    import Pleroma.Factory -  alias Pleroma.Config    alias Pleroma.Object    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub @@ -21,7 +20,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do      :ok    end -  setup do: clear_config([:instance, :federating], true) +  setup do: clear_config([:static_fe, :enabled], false)    describe "Mastodon compatibility routes" do      setup %{conn: conn} do @@ -215,15 +214,16 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        assert response(conn, 404)      end -    test "it requires authentication if instance is NOT federating", %{ +    test "does not require authentication on non-federating instances", %{        conn: conn      } do -      user = insert(:user) +      clear_config([:instance, :federating], false)        note_activity = insert(:note_activity) -      conn = put_req_header(conn, "accept", "text/html") - -      ensure_federating_or_authenticated(conn, "/notice/#{note_activity.id}", user) +      conn +      |> put_req_header("accept", "text/html") +      |> get("/notice/#{note_activity.id}") +      |> response(200)      end    end @@ -325,14 +325,16 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        |> response(404)      end -    test "it requires authentication if instance is NOT federating", %{ +    test "does not require authentication on non-federating instances", %{        conn: conn,        note_activity: note_activity      } do -      user = insert(:user) -      conn = put_req_header(conn, "accept", "text/html") +      clear_config([:instance, :federating], false) -      ensure_federating_or_authenticated(conn, "/notice/#{note_activity.id}/embed_player", user) +      conn +      |> put_req_header("accept", "text/html") +      |> get("/notice/#{note_activity.id}/embed_player") +      |> response(200)      end    end  end diff --git a/test/pleroma/web/pleroma_api/controllers/backup_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/backup_controller_test.exs new file mode 100644 index 000000000..f1941f6dd --- /dev/null +++ b/test/pleroma/web/pleroma_api/controllers/backup_controller_test.exs @@ -0,0 +1,85 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.BackupControllerTest do +  use Pleroma.Web.ConnCase + +  alias Pleroma.User.Backup +  alias Pleroma.Web.PleromaAPI.BackupView + +  setup do +    clear_config([Pleroma.Upload, :uploader]) +    clear_config([Backup, :limit_days]) +    oauth_access(["read:accounts"]) +  end + +  test "GET /api/v1/pleroma/backups", %{user: user, conn: conn} do +    assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id}}} = Backup.create(user) + +    backup = Backup.get(backup_id) + +    response = +      conn +      |> get("/api/v1/pleroma/backups") +      |> json_response_and_validate_schema(:ok) + +    assert [ +             %{ +               "content_type" => "application/zip", +               "url" => url, +               "file_size" => 0, +               "processed" => false, +               "inserted_at" => _ +             } +           ] = response + +    assert url == BackupView.download_url(backup) + +    Pleroma.Tests.ObanHelpers.perform_all() + +    assert [ +             %{ +               "url" => ^url, +               "processed" => true +             } +           ] = +             conn +             |> get("/api/v1/pleroma/backups") +             |> json_response_and_validate_schema(:ok) +  end + +  test "POST /api/v1/pleroma/backups", %{user: _user, conn: conn} do +    assert [ +             %{ +               "content_type" => "application/zip", +               "url" => url, +               "file_size" => 0, +               "processed" => false, +               "inserted_at" => _ +             } +           ] = +             conn +             |> post("/api/v1/pleroma/backups") +             |> json_response_and_validate_schema(:ok) + +    Pleroma.Tests.ObanHelpers.perform_all() + +    assert [ +             %{ +               "url" => ^url, +               "processed" => true +             } +           ] = +             conn +             |> get("/api/v1/pleroma/backups") +             |> json_response_and_validate_schema(:ok) + +    days = Pleroma.Config.get([Backup, :limit_days]) + +    assert %{"error" => "Last export was less than #{days} days ago"} == +             conn +             |> post("/api/v1/pleroma/backups") +             |> json_response_and_validate_schema(400) +  end +end diff --git a/test/pleroma/web/pleroma_api/controllers/chat_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/chat_controller_test.exs index 11d5ba373..c1e6a8cc5 100644 --- a/test/pleroma/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/pleroma/web/pleroma_api/controllers/chat_controller_test.exs @@ -82,11 +82,13 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do        result =          conn          |> put_req_header("content-type", "application/json") +        |> put_req_header("idempotency-key", "123")          |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{"content" => "Hallo!!"})          |> json_response_and_validate_schema(200)        assert result["content"] == "Hallo!!"        assert result["chat_id"] == chat.id |> to_string() +      assert result["idempotency_key"] == "123"      end      test "it fails if there is no content", %{conn: conn, user: user} do @@ -105,7 +107,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do      test "it works with an attachment", %{conn: conn, user: user} do        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } @@ -341,6 +343,35 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do        assert length(result) == 0      end +    test "it does not return chats with users you muted", %{conn: conn, user: user} do +      recipient = insert(:user) + +      {:ok, _} = Chat.get_or_create(user.id, recipient.ap_id) + +      result = +        conn +        |> get("/api/v1/pleroma/chats") +        |> json_response_and_validate_schema(200) + +      assert length(result) == 1 + +      User.mute(user, recipient) + +      result = +        conn +        |> get("/api/v1/pleroma/chats") +        |> json_response_and_validate_schema(200) + +      assert length(result) == 0 + +      result = +        conn +        |> get("/api/v1/pleroma/chats?with_muted=true") +        |> json_response_and_validate_schema(200) + +      assert length(result) == 1 +    end +      test "it returns all chats", %{conn: conn, user: user} do        Enum.each(1..30, fn _ ->          recipient = insert(:user) diff --git a/test/pleroma/web/pleroma_api/controllers/conversation_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/conversation_controller_test.exs index e6d0b3e37..f2feeaaef 100644 --- a/test/pleroma/web/pleroma_api/controllers/conversation_controller_test.exs +++ b/test/pleroma/web/pleroma_api/controllers/conversation_controller_test.exs @@ -121,7 +121,7 @@ defmodule Pleroma.Web.PleromaAPI.ConversationControllerTest do      [participation2, participation1] = Participation.for_user(other_user)      assert Participation.get(participation2.id).read == false      assert Participation.get(participation1.id).read == false -    assert User.get_cached_by_id(other_user.id).unread_conversation_count == 2 +    assert Participation.unread_count(other_user) == 2      [%{"unread" => false}, %{"unread" => false}] =        conn @@ -131,6 +131,6 @@ defmodule Pleroma.Web.PleromaAPI.ConversationControllerTest do      [participation2, participation1] = Participation.for_user(other_user)      assert Participation.get(participation2.id).read == true      assert Participation.get(participation1.id).read == true -    assert User.get_cached_by_id(other_user.id).unread_conversation_count == 0 +    assert Participation.unread_count(other_user) == 0    end  end diff --git a/test/pleroma/web/pleroma_api/controllers/emoji_pack_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/emoji_pack_controller_test.exs index 386ad8634..3445f0ca0 100644 --- a/test/pleroma/web/pleroma_api/controllers/emoji_pack_controller_test.exs +++ b/test/pleroma/web/pleroma_api/controllers/emoji_pack_controller_test.exs @@ -569,7 +569,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do      test "for pack name with special chars", %{conn: conn} do        assert %{ -               "files" => files, +               "files" => _files,                 "files_count" => 1,                 "pack" => %{                   "can-download" => true, diff --git a/test/pleroma/web/pleroma_api/controllers/mascot_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/mascot_controller_test.exs index e2ead6e15..289119d45 100644 --- a/test/pleroma/web/pleroma_api/controllers/mascot_controller_test.exs +++ b/test/pleroma/web/pleroma_api/controllers/mascot_controller_test.exs @@ -24,7 +24,7 @@ defmodule Pleroma.Web.PleromaAPI.MascotControllerTest do      assert json_response_and_validate_schema(ret_conn, 415)      file = %Plug.Upload{ -      content_type: "image/jpg", +      content_type: "image/jpeg",        path: Path.absname("test/fixtures/image.jpg"),        filename: "an_image.jpg"      } @@ -34,7 +34,7 @@ defmodule Pleroma.Web.PleromaAPI.MascotControllerTest do        |> put_req_header("content-type", "multipart/form-data")        |> put("/api/v1/pleroma/mascot", %{"file" => file}) -    assert %{"id" => _, "type" => image} = json_response_and_validate_schema(conn, 200) +    assert %{"id" => _, "type" => _image} = json_response_and_validate_schema(conn, 200)    end    test "mascot retrieving" do @@ -48,7 +48,7 @@ defmodule Pleroma.Web.PleromaAPI.MascotControllerTest do      # When a user sets their mascot, we should get that back      file = %Plug.Upload{ -      content_type: "image/jpg", +      content_type: "image/jpeg",        path: Path.absname("test/fixtures/image.jpg"),        filename: "an_image.jpg"      } 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 433c97e81..68723de71 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 @@ -6,7 +6,6 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do    use Pleroma.Web.ConnCase    use Oban.Testing, repo: Pleroma.Repo -  alias Pleroma.Config    alias Pleroma.Tests.ObanHelpers    import Pleroma.Factory diff --git a/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs b/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs index 26272c125..ae8257870 100644 --- a/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs +++ b/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs @@ -19,13 +19,15 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageReferenceViewTest do      recipient = insert(:user)      file = %Plug.Upload{ -      content_type: "image/jpg", +      content_type: "image/jpeg",        path: Path.absname("test/fixtures/image.jpg"),        filename: "an_image.jpg"      }      {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id) -    {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "kippis :firefox:") + +    {:ok, activity} = +      CommonAPI.post_chat_message(user, recipient, "kippis :firefox:", idempotency_key: "123")      chat = Chat.get(user.id, recipient.ap_id) @@ -42,6 +44,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageReferenceViewTest do      assert chat_message[:created_at]      assert chat_message[:unread] == false      assert match?([%{shortcode: "firefox"}], chat_message[:emojis]) +    assert chat_message[:idempotency_key] == "123"      clear_config([:rich_media, :enabled], true) diff --git a/test/pleroma/web/plugs/frontend_static_plug_test.exs b/test/pleroma/web/plugs/frontend_static_plug_test.exs index f6f7d7bdb..8b7b022fc 100644 --- a/test/pleroma/web/plugs/frontend_static_plug_test.exs +++ b/test/pleroma/web/plugs/frontend_static_plug_test.exs @@ -4,6 +4,7 @@  defmodule Pleroma.Web.Plugs.FrontendStaticPlugTest do    use Pleroma.Web.ConnCase +  import Mock    @dir "test/tmp/instance_static" @@ -53,4 +54,24 @@ defmodule Pleroma.Web.Plugs.FrontendStaticPlugTest do      index = get(conn, "/pleroma/admin/")      assert html_response(index, 200) == "from frontend plug"    end + +  test "exclude invalid path", %{conn: conn} do +    name = "pleroma-fe" +    ref = "dist" +    clear_config([:media_proxy, :enabled], true) +    clear_config([Pleroma.Web.Endpoint, :secret_key_base], "00000000000") +    clear_config([:frontends, :primary], %{"name" => name, "ref" => ref}) +    path = "#{@dir}/frontends/#{name}/#{ref}" + +    File.mkdir_p!("#{path}/proxy/rr/ss") +    File.write!("#{path}/proxy/rr/ss/Ek7w8WPVcAApOvN.jpg:large", "FB image") + +    url = +      Pleroma.Web.MediaProxy.encode_url("https://pbs.twimg.com/media/Ek7w8WPVcAApOvN.jpg:large") + +    with_mock Pleroma.ReverseProxy, +      call: fn _conn, _url, _opts -> %Plug.Conn{status: :success} end do +      assert %Plug.Conn{status: :success} = get(conn, url) +    end +  end  end diff --git a/test/pleroma/web/plugs/http_security_plug_test.exs b/test/pleroma/web/plugs/http_security_plug_test.exs index 2297e3dac..df2b5ebb3 100644 --- a/test/pleroma/web/plugs/http_security_plug_test.exs +++ b/test/pleroma/web/plugs/http_security_plug_test.exs @@ -5,7 +5,6 @@  defmodule Pleroma.Web.Plugs.HTTPSecurityPlugTest do    use Pleroma.Web.ConnCase -  alias Pleroma.Config    alias Plug.Conn    describe "http security enabled" do diff --git a/test/pleroma/web/plugs/uploaded_media_plug_test.exs b/test/pleroma/web/plugs/uploaded_media_plug_test.exs index 07f52c8cd..7c8313121 100644 --- a/test/pleroma/web/plugs/uploaded_media_plug_test.exs +++ b/test/pleroma/web/plugs/uploaded_media_plug_test.exs @@ -11,7 +11,7 @@ defmodule Pleroma.Web.Plugs.UploadedMediaPlugTest do      File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")      file = %Plug.Upload{ -      content_type: "image/jpg", +      content_type: "image/jpeg",        path: Path.absname("test/fixtures/image_tmp.jpg"),        filename: "nice_tf.jpg"      } diff --git a/test/pleroma/web/push/impl_test.exs b/test/pleroma/web/push/impl_test.exs index 6cab46696..7d8cc999a 100644 --- a/test/pleroma/web/push/impl_test.exs +++ b/test/pleroma/web/push/impl_test.exs @@ -219,7 +219,7 @@ defmodule Pleroma.Web.Push.ImplTest do        recipient = insert(:user)        file = %Plug.Upload{ -        content_type: "image/jpg", +        content_type: "image/jpeg",          path: Path.absname("test/fixtures/image.jpg"),          filename: "an_image.jpg"        } 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 f819a1e52..19506f1d8 100644 --- a/test/pleroma/web/static_fe/static_fe_controller_test.exs +++ b/test/pleroma/web/static_fe/static_fe_controller_test.exs @@ -6,14 +6,12 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do    use Pleroma.Web.ConnCase    alias Pleroma.Activity -  alias Pleroma.Config    alias Pleroma.Web.ActivityPub.Transmogrifier    alias Pleroma.Web.CommonAPI    import Pleroma.Factory    setup_all do: clear_config([:static_fe, :enabled], true) -  setup do: clear_config([:instance, :federating], true)    setup %{conn: conn} do      conn = put_req_header(conn, "accept", "text/html") @@ -74,8 +72,27 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do        refute html =~ ">test29<"      end -    test "it requires authentication if instance is NOT federating", %{conn: conn, user: user} do -      ensure_federating_or_authenticated(conn, "/users/#{user.nickname}", user) +    test "does not require authentication on non-federating instances", %{ +      conn: conn, +      user: user +    } do +      clear_config([:instance, :federating], false) + +      conn = get(conn, "/users/#{user.nickname}") + +      assert html_response(conn, 200) =~ user.nickname +    end + +    test "returns 404 for local user with `restrict_unauthenticated/profiles/local` setting", %{ +      conn: conn +    } do +      clear_config([:restrict_unauthenticated, :profiles, :local], true) + +      local_user = insert(:user, local: true) + +      conn +      |> get("/users/#{local_user.nickname}") +      |> html_response(404)      end    end @@ -187,10 +204,28 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do        assert html_response(conn, 302) =~ "redirected"      end -    test "it requires authentication if instance is NOT federating", %{conn: conn, user: user} do +    test "does not require authentication on non-federating instances", %{ +      conn: conn, +      user: user +    } do +      clear_config([:instance, :federating], false) + +      {:ok, activity} = CommonAPI.post(user, %{status: "testing a thing!"}) + +      conn = get(conn, "/notice/#{activity.id}") + +      assert html_response(conn, 200) =~ "testing a thing!" +    end + +    test "returns 404 for local public activity with `restrict_unauthenticated/activities/local` setting", +         %{conn: conn, user: user} do +      clear_config([:restrict_unauthenticated, :activities, :local], true) +        {:ok, activity} = CommonAPI.post(user, %{status: "testing a thing!"}) -      ensure_federating_or_authenticated(conn, "/notice/#{activity.id}", user) +      conn +      |> get("/notice/#{activity.id}") +      |> html_response(404)      end    end  end diff --git a/test/pleroma/web/streamer_test.exs b/test/pleroma/web/streamer_test.exs index 1495ed124..0d89e01d0 100644 --- a/test/pleroma/web/streamer_test.exs +++ b/test/pleroma/web/streamer_test.exs @@ -263,7 +263,9 @@ defmodule Pleroma.Web.StreamerTest do      } do        other_user = insert(:user) -      {:ok, create_activity} = CommonAPI.post_chat_message(other_user, user, "hey cirno") +      {:ok, create_activity} = +        CommonAPI.post_chat_message(other_user, user, "hey cirno", idempotency_key: "123") +        object = Object.normalize(create_activity, false)        chat = Chat.get(user.id, other_user.ap_id)        cm_ref = MessageReference.for_chat_and_object(chat, object) diff --git a/test/pleroma/web/twitter_api/remote_follow_controller_test.exs b/test/pleroma/web/twitter_api/remote_follow_controller_test.exs index 3852c7ce9..a3e784d13 100644 --- a/test/pleroma/web/twitter_api/remote_follow_controller_test.exs +++ b/test/pleroma/web/twitter_api/remote_follow_controller_test.exs @@ -5,7 +5,6 @@  defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do    use Pleroma.Web.ConnCase -  alias Pleroma.Config    alias Pleroma.MFA    alias Pleroma.MFA.TOTP    alias Pleroma.User diff --git a/test/support/channel_case.ex b/test/support/channel_case.ex index d63a0f06b..114184a9f 100644 --- a/test/support/channel_case.ex +++ b/test/support/channel_case.ex @@ -22,7 +22,7 @@ defmodule Pleroma.Web.ChannelCase do    using do      quote do        # Import conveniences for testing with channels -      use Phoenix.ChannelTest +      import Phoenix.ChannelTest        use Pleroma.Tests.Helpers        # The default endpoint for testing diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index 7ef681258..47cb65a80 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -22,7 +22,8 @@ defmodule Pleroma.Web.ConnCase do    using do      quote do        # Import conveniences for testing with connections -      use Phoenix.ConnTest +      import Plug.Conn +      import Phoenix.ConnTest        use Pleroma.Tests.Helpers        import Pleroma.Web.Router.Helpers @@ -111,28 +112,6 @@ defmodule Pleroma.Web.ConnCase do        defp json_response_and_validate_schema(conn, _status) do          flunk("Response schema not found for #{conn.method} #{conn.request_path} #{conn.status}")        end - -      defp ensure_federating_or_authenticated(conn, url, user) do -        initial_setting = Config.get([:instance, :federating]) -        on_exit(fn -> Config.put([:instance, :federating], initial_setting) end) - -        Config.put([:instance, :federating], false) - -        conn -        |> get(url) -        |> response(403) - -        conn -        |> assign(:user, user) -        |> get(url) -        |> response(200) - -        Config.put([:instance, :federating], true) - -        conn -        |> get(url) -        |> response(200) -      end      end    end diff --git a/test/support/factory.ex b/test/support/factory.ex index fb82be0c4..80b882ee4 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -31,7 +31,7 @@ defmodule Pleroma.Factory do        nickname: sequence(:nickname, &"nick#{&1}"),        password_hash: Pbkdf2.hash_pwd_salt("test"),        bio: sequence(:bio, &"Tester Number #{&1}"), -      discoverable: true, +      is_discoverable: true,        last_digest_emailed_at: NaiveDateTime.utc_now(),        last_refreshed_at: NaiveDateTime.utc_now(),        notification_settings: %Pleroma.User.NotificationSetting{}, diff --git a/test/support/oban_helpers.ex b/test/support/oban_helpers.ex index 9f90a821c..2468f66dc 100644 --- a/test/support/oban_helpers.ex +++ b/test/support/oban_helpers.ex @@ -7,6 +7,8 @@ defmodule Pleroma.Tests.ObanHelpers do    Oban test helpers.    """ +  require Ecto.Query +    alias Pleroma.Repo    def wipe_all do @@ -15,6 +17,7 @@ defmodule Pleroma.Tests.ObanHelpers do    def perform_all do      Oban.Job +    |> Ecto.Query.where(state: "available")      |> Repo.all()      |> perform()    end | 
