diff options
Diffstat (limited to 'test')
29 files changed, 850 insertions, 209 deletions
| diff --git a/test/conversation/participation_test.exs b/test/conversation/participation_test.exs index 863270022..9b2c97963 100644 --- a/test/conversation/participation_test.exs +++ b/test/conversation/participation_test.exs @@ -252,7 +252,7 @@ defmodule Pleroma.Conversation.ParticipationTest do        assert User.get_cached_by_id(blocker.id).unread_conversation_count == 4 -      {:ok, blocker} = User.block(blocker, blocked) +      {:ok, _user_relationship} = User.block(blocker, blocked)        # The conversations with the blocked user are marked as read        assert [%{read: true}, %{read: true}, %{read: true}, %{read: false}] = @@ -274,7 +274,7 @@ defmodule Pleroma.Conversation.ParticipationTest do        blocked = insert(:user)        third_user = insert(:user) -      {:ok, blocker} = User.block(blocker, blocked) +      {:ok, _user_relationship} = User.block(blocker, blocked)        # When the blocked user is the author        {:ok, _direct1} = @@ -311,7 +311,7 @@ defmodule Pleroma.Conversation.ParticipationTest do            "visibility" => "direct"          }) -      {:ok, blocker} = User.block(blocker, blocked) +      {: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 diff --git a/test/notification_test.exs b/test/notification_test.exs index dcbffeafe..ffa3d4b8c 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -93,7 +93,7 @@ defmodule Pleroma.NotificationTest do        activity = insert(:note_activity)        author = User.get_cached_by_ap_id(activity.data["actor"])        user = insert(:user) -      {:ok, user} = User.block(user, author) +      {:ok, _user_relationship} = User.block(user, author)        assert Notification.create_notification(activity, user)      end @@ -112,7 +112,7 @@ defmodule Pleroma.NotificationTest do        muter = insert(:user)        muted = insert(:user) -      {:ok, muter} = User.mute(muter, muted, false) +      {:ok, _user_relationships} = User.mute(muter, muted, false)        {:ok, activity} = CommonAPI.post(muted, %{"status" => "Hi @#{muter.nickname}"}) @@ -136,7 +136,10 @@ defmodule Pleroma.NotificationTest do      test "it disables notifications from followers" do        follower = insert(:user) -      followed = insert(:user, notification_settings: %{"followers" => false}) + +      followed = +        insert(:user, notification_settings: %Pleroma.User.NotificationSetting{followers: false}) +        User.follow(follower, followed)        {:ok, activity} = CommonAPI.post(follower, %{"status" => "hey @#{followed.nickname}"})        refute Notification.create_notification(activity, followed) @@ -144,13 +147,20 @@ defmodule Pleroma.NotificationTest do      test "it disables notifications from non-followers" do        follower = insert(:user) -      followed = insert(:user, notification_settings: %{"non_followers" => false}) + +      followed = +        insert(:user, +          notification_settings: %Pleroma.User.NotificationSetting{non_followers: false} +        ) +        {:ok, activity} = CommonAPI.post(follower, %{"status" => "hey @#{followed.nickname}"})        refute Notification.create_notification(activity, followed)      end      test "it disables notifications from people the user follows" do -      follower = insert(:user, notification_settings: %{"follows" => false}) +      follower = +        insert(:user, notification_settings: %Pleroma.User.NotificationSetting{follows: false}) +        followed = insert(:user)        User.follow(follower, followed)        follower = Repo.get(User, follower.id) @@ -159,7 +169,9 @@ defmodule Pleroma.NotificationTest do      end      test "it disables notifications from people the user does not follow" do -      follower = insert(:user, notification_settings: %{"non_follows" => false}) +      follower = +        insert(:user, notification_settings: %Pleroma.User.NotificationSetting{non_follows: false}) +        followed = insert(:user)        {:ok, activity} = CommonAPI.post(followed, %{"status" => "hey @#{follower.nickname}"})        refute Notification.create_notification(activity, follower) @@ -643,13 +655,17 @@ defmodule Pleroma.NotificationTest do        Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)        ObanHelpers.perform_all() +      assert [] = Notification.for_user(follower) +        assert [                 %{                   activity: %{                     data: %{"type" => "Move", "actor" => ^old_ap_id, "target" => ^new_ap_id}                   }                 } -             ] = Notification.for_user(follower) +             ] = Notification.for_user(follower, %{with_move: true}) + +      assert [] = Notification.for_user(other_follower)        assert [                 %{ @@ -657,7 +673,7 @@ defmodule Pleroma.NotificationTest do                     data: %{"type" => "Move", "actor" => ^old_ap_id, "target" => ^new_ap_id}                   }                 } -             ] = Notification.for_user(other_follower) +             ] = Notification.for_user(other_follower, %{with_move: true})      end    end @@ -665,7 +681,7 @@ defmodule Pleroma.NotificationTest do      test "it returns notifications for muted user without notifications" do        user = insert(:user)        muted = insert(:user) -      {:ok, user} = User.mute(user, muted, false) +      {:ok, _user_relationships} = User.mute(user, muted, false)        {:ok, _activity} = CommonAPI.post(muted, %{"status" => "hey @#{user.nickname}"}) @@ -675,7 +691,7 @@ defmodule Pleroma.NotificationTest do      test "it doesn't return notifications for muted user with notifications" do        user = insert(:user)        muted = insert(:user) -      {:ok, user} = User.mute(user, muted) +      {:ok, _user_relationships} = User.mute(user, muted)        {:ok, _activity} = CommonAPI.post(muted, %{"status" => "hey @#{user.nickname}"}) @@ -685,7 +701,7 @@ defmodule Pleroma.NotificationTest do      test "it doesn't return notifications for blocked user" do        user = insert(:user)        blocked = insert(:user) -      {:ok, user} = User.block(user, blocked) +      {:ok, _user_relationship} = User.block(user, blocked)        {:ok, _activity} = CommonAPI.post(blocked, %{"status" => "hey @#{user.nickname}"}) @@ -715,7 +731,7 @@ defmodule Pleroma.NotificationTest do      test "it returns notifications from a muted user when with_muted is set" do        user = insert(:user)        muted = insert(:user) -      {:ok, user} = User.mute(user, muted) +      {:ok, _user_relationships} = User.mute(user, muted)        {:ok, _activity} = CommonAPI.post(muted, %{"status" => "hey @#{user.nickname}"}) @@ -725,7 +741,7 @@ defmodule Pleroma.NotificationTest do      test "it doesn't return notifications from a blocked user when with_muted is set" do        user = insert(:user)        blocked = insert(:user) -      {:ok, user} = User.block(user, blocked) +      {:ok, _user_relationship} = User.block(user, blocked)        {:ok, _activity} = CommonAPI.post(blocked, %{"status" => "hey @#{user.nickname}"}) diff --git a/test/support/builders/user_builder.ex b/test/support/builders/user_builder.ex index 6da16f71a..fcfea666f 100644 --- a/test/support/builders/user_builder.ex +++ b/test/support/builders/user_builder.ex @@ -10,7 +10,8 @@ defmodule Pleroma.Builders.UserBuilder do        password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),        bio: "A tester.",        ap_id: "some id", -      last_digest_emailed_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second) +      last_digest_emailed_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second), +      notification_settings: %Pleroma.User.NotificationSetting{}      }      Map.merge(user, data) diff --git a/test/support/channel_case.ex b/test/support/channel_case.ex index 466d8986f..4a4585844 100644 --- a/test/support/channel_case.ex +++ b/test/support/channel_case.ex @@ -23,6 +23,7 @@ defmodule Pleroma.Web.ChannelCase do      quote do        # Import conveniences for testing with channels        use Phoenix.ChannelTest +      use Pleroma.Tests.Helpers        # The default endpoint for testing        @endpoint Pleroma.Web.Endpoint diff --git a/test/support/factory.ex b/test/support/factory.ex index bb8a64e72..314f26ec9 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -31,7 +31,8 @@ defmodule Pleroma.Factory do        nickname: sequence(:nickname, &"nick#{&1}"),        password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),        bio: sequence(:bio, &"Tester Number #{&1}"), -      last_digest_emailed_at: NaiveDateTime.utc_now() +      last_digest_emailed_at: NaiveDateTime.utc_now(), +      notification_settings: %Pleroma.User.NotificationSetting{}      }      %{ @@ -42,6 +43,18 @@ defmodule Pleroma.Factory do      }    end +  def user_relationship_factory(attrs \\ %{}) do +    source = attrs[:source] || insert(:user) +    target = attrs[:target] || insert(:user) +    relationship_type = attrs[:relationship_type] || :block + +    %Pleroma.UserRelationship{ +      source_id: source.id, +      target_id: target.id, +      relationship_type: relationship_type +    } +  end +    def note_factory(attrs \\ %{}) do      text = sequence(:text, &"This is :moominmamma: note #{&1}") diff --git a/test/support/helpers.ex b/test/support/helpers.ex index ce39dd9d8..af2b2eddf 100644 --- a/test/support/helpers.ex +++ b/test/support/helpers.ex @@ -75,6 +75,23 @@ defmodule Pleroma.Tests.Helpers do          |> Poison.decode!()        end +      def stringify_keys(nil), do: nil + +      def stringify_keys(key) when key in [true, false], do: key +      def stringify_keys(key) when is_atom(key), do: Atom.to_string(key) + +      def stringify_keys(map) when is_map(map) do +        map +        |> Enum.map(fn {k, v} -> {stringify_keys(k), stringify_keys(v)} end) +        |> Enum.into(%{}) +      end + +      def stringify_keys([head | rest] = list) when is_list(list) do +        [stringify_keys(head) | stringify_keys(rest)] +      end + +      def stringify_keys(key), do: key +        defmacro guards_config(config_path) do          quote do            initial_setting = Pleroma.Config.get(config_path) diff --git a/test/tasks/config_test.exs b/test/tasks/config_test.exs index 9cd47380c..fab9d6e9a 100644 --- a/test/tasks/config_test.exs +++ b/test/tasks/config_test.exs @@ -63,4 +63,84 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do      assert file =~ "config :pleroma, :setting_first,"      assert file =~ "config :pleroma, :setting_second,"    end + +  test "load a settings with large values and pass to file", %{temp_file: temp_file} do +    Config.create(%{ +      group: "pleroma", +      key: ":instance", +      value: [ +        name: "Pleroma", +        email: "example@example.com", +        notify_email: "noreply@example.com", +        description: "A Pleroma instance, an alternative fediverse server", +        limit: 5_000, +        chat_limit: 5_000, +        remote_limit: 100_000, +        upload_limit: 16_000_000, +        avatar_upload_limit: 2_000_000, +        background_upload_limit: 4_000_000, +        banner_upload_limit: 4_000_000, +        poll_limits: %{ +          max_options: 20, +          max_option_chars: 200, +          min_expiration: 0, +          max_expiration: 365 * 24 * 60 * 60 +        }, +        registrations_open: true, +        federating: true, +        federation_incoming_replies_max_depth: 100, +        federation_reachability_timeout_days: 7, +        federation_publisher_modules: [Pleroma.Web.ActivityPub.Publisher], +        allow_relay: true, +        rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy, +        public: true, +        quarantined_instances: [], +        managed_config: true, +        static_dir: "instance/static/", +        allowed_post_formats: ["text/plain", "text/html", "text/markdown", "text/bbcode"], +        mrf_transparency: true, +        mrf_transparency_exclusions: [], +        autofollowed_nicknames: [], +        max_pinned_statuses: 1, +        no_attachment_links: true, +        welcome_user_nickname: nil, +        welcome_message: nil, +        max_report_comment_size: 1000, +        safe_dm_mentions: false, +        healthcheck: false, +        remote_post_retention_days: 90, +        skip_thread_containment: true, +        limit_to_local_content: :unauthenticated, +        dynamic_configuration: false, +        user_bio_length: 5000, +        user_name_length: 100, +        max_account_fields: 10, +        max_remote_account_fields: 20, +        account_field_name_length: 512, +        account_field_value_length: 2048, +        external_user_synchronization: true, +        extended_nickname_format: true, +        multi_factor_authentication: [ +          totp: [ +            # digits 6 or 8 +            digits: 6, +            period: 30 +          ], +          backup_codes: [ +            number: 2, +            length: 6 +          ] +        ] +      ] +    }) + +    Mix.Tasks.Pleroma.Config.run(["migrate_from_db", "temp", "true"]) + +    assert Repo.all(Config) == [] +    assert File.exists?(temp_file) +    {:ok, file} = File.read(temp_file) + +    assert file == +             "use Mix.Config\n\nconfig :pleroma, :instance,\n  name: \"Pleroma\",\n  email: \"example@example.com\",\n  notify_email: \"noreply@example.com\",\n  description: \"A Pleroma instance, an alternative fediverse server\",\n  limit: 5000,\n  chat_limit: 5000,\n  remote_limit: 100_000,\n  upload_limit: 16_000_000,\n  avatar_upload_limit: 2_000_000,\n  background_upload_limit: 4_000_000,\n  banner_upload_limit: 4_000_000,\n  poll_limits: %{\n    max_expiration: 31_536_000,\n    max_option_chars: 200,\n    max_options: 20,\n    min_expiration: 0\n  },\n  registrations_open: true,\n  federating: true,\n  federation_incoming_replies_max_depth: 100,\n  federation_reachability_timeout_days: 7,\n  federation_publisher_modules: [Pleroma.Web.ActivityPub.Publisher],\n  allow_relay: true,\n  rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy,\n  public: true,\n  quarantined_instances: [],\n  managed_config: true,\n  static_dir: \"instance/static/\",\n  allowed_post_formats: [\"text/plain\", \"text/html\", \"text/markdown\", \"text/bbcode\"],\n  mrf_transparency: true,\n  mrf_transparency_exclusions: [],\n  autofollowed_nicknames: [],\n  max_pinned_statuses: 1,\n  no_attachment_links: true,\n  welcome_user_nickname: nil,\n  welcome_message: nil,\n  max_report_comment_size: 1000,\n  safe_dm_mentions: false,\n  healthcheck: false,\n  remote_post_retention_days: 90,\n  skip_thread_containment: true,\n  limit_to_local_content: :unauthenticated,\n  dynamic_configuration: false,\n  user_bio_length: 5000,\n  user_name_length: 100,\n  max_account_fields: 10,\n  max_remote_account_fields: 20,\n  account_field_name_length: 512,\n  account_field_value_length: 2048,\n  external_user_synchronization: true,\n  extended_nickname_format: true,\n  multi_factor_authentication: [\n    totp: [digits: 6, period: 30],\n    backup_codes: [number: 2, length: 6]\n  ]\n" +  end  end diff --git a/test/user/notification_setting_test.exs b/test/user/notification_setting_test.exs new file mode 100644 index 000000000..4744d7b4a --- /dev/null +++ b/test/user/notification_setting_test.exs @@ -0,0 +1,21 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.User.NotificationSettingTest do +  use Pleroma.DataCase + +  alias Pleroma.User.NotificationSetting + +  describe "changeset/2" do +    test "sets valid privacy option" do +      changeset = +        NotificationSetting.changeset( +          %NotificationSetting{}, +          %{"privacy_option" => true} +        ) + +      assert %Ecto.Changeset{valid?: true} = changeset +    end +  end +end diff --git a/test/user_relationship_test.exs b/test/user_relationship_test.exs new file mode 100644 index 000000000..437450bc3 --- /dev/null +++ b/test/user_relationship_test.exs @@ -0,0 +1,130 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.UserRelationshipTest do +  alias Pleroma.UserRelationship + +  use Pleroma.DataCase + +  import Pleroma.Factory + +  describe "*_exists?/2" do +    setup do +      {:ok, users: insert_list(2, :user)} +    end + +    test "returns false if record doesn't exist", %{users: [user1, user2]} do +      refute UserRelationship.block_exists?(user1, user2) +      refute UserRelationship.mute_exists?(user1, user2) +      refute UserRelationship.notification_mute_exists?(user1, user2) +      refute UserRelationship.reblog_mute_exists?(user1, user2) +      refute UserRelationship.inverse_subscription_exists?(user1, user2) +    end + +    test "returns true if record exists", %{users: [user1, user2]} do +      for relationship_type <- [ +            :block, +            :mute, +            :notification_mute, +            :reblog_mute, +            :inverse_subscription +          ] do +        insert(:user_relationship, +          source: user1, +          target: user2, +          relationship_type: relationship_type +        ) +      end + +      assert UserRelationship.block_exists?(user1, user2) +      assert UserRelationship.mute_exists?(user1, user2) +      assert UserRelationship.notification_mute_exists?(user1, user2) +      assert UserRelationship.reblog_mute_exists?(user1, user2) +      assert UserRelationship.inverse_subscription_exists?(user1, user2) +    end +  end + +  describe "create_*/2" do +    setup do +      {:ok, users: insert_list(2, :user)} +    end + +    test "creates user relationship record if it doesn't exist", %{users: [user1, user2]} do +      for relationship_type <- [ +            :block, +            :mute, +            :notification_mute, +            :reblog_mute, +            :inverse_subscription +          ] do +        insert(:user_relationship, +          source: user1, +          target: user2, +          relationship_type: relationship_type +        ) +      end + +      UserRelationship.create_block(user1, user2) +      UserRelationship.create_mute(user1, user2) +      UserRelationship.create_notification_mute(user1, user2) +      UserRelationship.create_reblog_mute(user1, user2) +      UserRelationship.create_inverse_subscription(user1, user2) + +      assert UserRelationship.block_exists?(user1, user2) +      assert UserRelationship.mute_exists?(user1, user2) +      assert UserRelationship.notification_mute_exists?(user1, user2) +      assert UserRelationship.reblog_mute_exists?(user1, user2) +      assert UserRelationship.inverse_subscription_exists?(user1, user2) +    end + +    test "if record already exists, returns it", %{users: [user1, user2]} do +      user_block = UserRelationship.create_block(user1, user2) +      assert user_block == UserRelationship.create_block(user1, user2) +    end +  end + +  describe "delete_*/2" do +    setup do +      {:ok, users: insert_list(2, :user)} +    end + +    test "deletes user relationship record if it exists", %{users: [user1, user2]} do +      for relationship_type <- [ +            :block, +            :mute, +            :notification_mute, +            :reblog_mute, +            :inverse_subscription +          ] do +        insert(:user_relationship, +          source: user1, +          target: user2, +          relationship_type: relationship_type +        ) +      end + +      assert {:ok, %UserRelationship{}} = UserRelationship.delete_block(user1, user2) +      assert {:ok, %UserRelationship{}} = UserRelationship.delete_mute(user1, user2) +      assert {:ok, %UserRelationship{}} = UserRelationship.delete_notification_mute(user1, user2) +      assert {:ok, %UserRelationship{}} = UserRelationship.delete_reblog_mute(user1, user2) + +      assert {:ok, %UserRelationship{}} = +               UserRelationship.delete_inverse_subscription(user1, user2) + +      refute UserRelationship.block_exists?(user1, user2) +      refute UserRelationship.mute_exists?(user1, user2) +      refute UserRelationship.notification_mute_exists?(user1, user2) +      refute UserRelationship.reblog_mute_exists?(user1, user2) +      refute UserRelationship.inverse_subscription_exists?(user1, user2) +    end + +    test "if record does not exist, returns {:ok, nil}", %{users: [user1, user2]} do +      assert {:ok, nil} = UserRelationship.delete_block(user1, user2) +      assert {:ok, nil} = UserRelationship.delete_mute(user1, user2) +      assert {:ok, nil} = UserRelationship.delete_notification_mute(user1, user2) +      assert {:ok, nil} = UserRelationship.delete_reblog_mute(user1, user2) +      assert {:ok, nil} = UserRelationship.delete_inverse_subscription(user1, user2) +    end +  end +end diff --git a/test/user_search_test.exs b/test/user_search_test.exs index 98841dbbd..821858476 100644 --- a/test/user_search_test.exs +++ b/test/user_search_test.exs @@ -174,6 +174,7 @@ defmodule Pleroma.UserSearchTest do          |> Map.put(:search_rank, nil)          |> Map.put(:search_type, nil)          |> Map.put(:last_digest_emailed_at, nil) +        |> Map.put(:notification_settings, nil)        assert user == expected      end diff --git a/test/user_test.exs b/test/user_test.exs index c345e43e9..bfa8faafa 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -44,6 +44,56 @@ defmodule Pleroma.UserTest do      end    end +  describe "AP ID user relationships" do +    setup do +      {:ok, user: insert(:user)} +    end + +    test "outgoing_relations_ap_ids/1", %{user: user} do +      rel_types = [:block, :mute, :notification_mute, :reblog_mute, :inverse_subscription] + +      ap_ids_by_rel = +        Enum.into( +          rel_types, +          %{}, +          fn rel_type -> +            rel_records = +              insert_list(2, :user_relationship, %{source: user, relationship_type: rel_type}) + +            ap_ids = Enum.map(rel_records, fn rr -> Repo.preload(rr, :target).target.ap_id end) +            {rel_type, Enum.sort(ap_ids)} +          end +        ) + +      assert ap_ids_by_rel[:block] == Enum.sort(User.blocked_users_ap_ids(user)) +      assert ap_ids_by_rel[:block] == Enum.sort(Enum.map(User.blocked_users(user), & &1.ap_id)) + +      assert ap_ids_by_rel[:mute] == Enum.sort(User.muted_users_ap_ids(user)) +      assert ap_ids_by_rel[:mute] == Enum.sort(Enum.map(User.muted_users(user), & &1.ap_id)) + +      assert ap_ids_by_rel[:notification_mute] == +               Enum.sort(User.notification_muted_users_ap_ids(user)) + +      assert ap_ids_by_rel[:notification_mute] == +               Enum.sort(Enum.map(User.notification_muted_users(user), & &1.ap_id)) + +      assert ap_ids_by_rel[:reblog_mute] == Enum.sort(User.reblog_muted_users_ap_ids(user)) + +      assert ap_ids_by_rel[:reblog_mute] == +               Enum.sort(Enum.map(User.reblog_muted_users(user), & &1.ap_id)) + +      assert ap_ids_by_rel[:inverse_subscription] == Enum.sort(User.subscriber_users_ap_ids(user)) + +      assert ap_ids_by_rel[:inverse_subscription] == +               Enum.sort(Enum.map(User.subscriber_users(user), & &1.ap_id)) + +      outgoing_relations_ap_ids = User.outgoing_relations_ap_ids(user, rel_types) + +      assert ap_ids_by_rel == +               Enum.into(outgoing_relations_ap_ids, %{}, fn {k, v} -> {k, Enum.sort(v)} end) +    end +  end +    describe "when tags are nil" do      test "tagging a user" do        user = insert(:user, %{tags: nil}) @@ -119,7 +169,7 @@ defmodule Pleroma.UserTest do      CommonAPI.follow(follower, followed)      assert [_activity] = User.get_follow_requests(followed) -    {:ok, _follower} = User.block(followed, follower) +    {:ok, _user_relationship} = User.block(followed, follower)      assert [] = User.get_follow_requests(followed)    end @@ -132,8 +182,8 @@ defmodule Pleroma.UserTest do      not_followed = insert(:user)      reverse_blocked = insert(:user) -    {:ok, user} = User.block(user, blocked) -    {:ok, reverse_blocked} = User.block(reverse_blocked, user) +    {:ok, _user_relationship} = User.block(user, blocked) +    {:ok, _user_relationship} = User.block(reverse_blocked, user)      {:ok, user} = User.follow(user, followed_zero) @@ -186,7 +236,7 @@ defmodule Pleroma.UserTest do      blocker = insert(:user)      blockee = insert(:user) -    {:ok, blocker} = User.block(blocker, blockee) +    {:ok, _user_relationship} = User.block(blocker, blockee)      {:error, _} = User.follow(blockee, blocker)    end @@ -195,7 +245,7 @@ defmodule Pleroma.UserTest do      blocker = insert(:user)      blocked = insert(:user) -    {:ok, blocker} = User.block(blocker, blocked) +    {:ok, _user_relationship} = User.block(blocker, blocked)      {:error, _} = User.subscribe(blocked, blocker)    end @@ -678,7 +728,7 @@ defmodule Pleroma.UserTest do        refute User.mutes?(user, muted_user)        refute User.muted_notifications?(user, muted_user) -      {:ok, user} = User.mute(user, muted_user) +      {:ok, _user_relationships} = User.mute(user, muted_user)        assert User.mutes?(user, muted_user)        assert User.muted_notifications?(user, muted_user) @@ -688,8 +738,8 @@ defmodule Pleroma.UserTest do        user = insert(:user)        muted_user = insert(:user) -      {:ok, user} = User.mute(user, muted_user) -      {:ok, user} = User.unmute(user, muted_user) +      {:ok, _user_relationships} = User.mute(user, muted_user) +      {:ok, _user_mute} = User.unmute(user, muted_user)        refute User.mutes?(user, muted_user)        refute User.muted_notifications?(user, muted_user) @@ -702,7 +752,7 @@ defmodule Pleroma.UserTest do        refute User.mutes?(user, muted_user)        refute User.muted_notifications?(user, muted_user) -      {:ok, user} = User.mute(user, muted_user, false) +      {:ok, _user_relationships} = User.mute(user, muted_user, false)        assert User.mutes?(user, muted_user)        refute User.muted_notifications?(user, muted_user) @@ -716,7 +766,7 @@ defmodule Pleroma.UserTest do        refute User.blocks?(user, blocked_user) -      {:ok, user} = User.block(user, blocked_user) +      {:ok, _user_relationship} = User.block(user, blocked_user)        assert User.blocks?(user, blocked_user)      end @@ -725,8 +775,8 @@ defmodule Pleroma.UserTest do        user = insert(:user)        blocked_user = insert(:user) -      {:ok, user} = User.block(user, blocked_user) -      {:ok, user} = User.unblock(user, blocked_user) +      {:ok, _user_relationship} = User.block(user, blocked_user) +      {:ok, _user_block} = User.unblock(user, blocked_user)        refute User.blocks?(user, blocked_user)      end @@ -741,7 +791,7 @@ defmodule Pleroma.UserTest do        assert User.following?(blocker, blocked)        assert User.following?(blocked, blocker) -      {:ok, blocker} = User.block(blocker, blocked) +      {:ok, _user_relationship} = User.block(blocker, blocked)        blocked = User.get_cached_by_id(blocked.id)        assert User.blocks?(blocker, blocked) @@ -759,7 +809,7 @@ defmodule Pleroma.UserTest do        assert User.following?(blocker, blocked)        refute User.following?(blocked, blocker) -      {:ok, blocker} = User.block(blocker, blocked) +      {:ok, _user_relationship} = User.block(blocker, blocked)        blocked = User.get_cached_by_id(blocked.id)        assert User.blocks?(blocker, blocked) @@ -777,7 +827,7 @@ defmodule Pleroma.UserTest do        refute User.following?(blocker, blocked)        assert User.following?(blocked, blocker) -      {:ok, blocker} = User.block(blocker, blocked) +      {:ok, _user_relationship} = User.block(blocker, blocked)        blocked = User.get_cached_by_id(blocked.id)        assert User.blocks?(blocker, blocked) @@ -790,12 +840,12 @@ defmodule Pleroma.UserTest do        blocker = insert(:user)        blocked = insert(:user) -      {:ok, blocker} = User.subscribe(blocked, blocker) +      {:ok, _subscription} = User.subscribe(blocked, blocker)        assert User.subscribed_to?(blocked, blocker)        refute User.subscribed_to?(blocker, blocked) -      {:ok, blocker} = User.block(blocker, blocked) +      {:ok, _user_relationship} = User.block(blocker, blocked)        assert User.blocks?(blocker, blocked)        refute User.subscribed_to?(blocker, blocked) @@ -1324,7 +1374,8 @@ defmodule Pleroma.UserTest do      {:ok, _follower2} = User.follow(follower2, user)      {:ok, _follower3} = User.follow(follower3, user) -    {:ok, user} = User.block(user, follower) +    {:ok, _user_relationship} = User.block(user, follower) +    user = refresh_record(user)      assert user.follower_count == 2    end diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index 1aa73d75c..ba2ce1dd9 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -298,7 +298,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert json_response(conn1, :ok)        assert Enum.any?(conn1.resp_headers, &(&1 == {"x-cache", "MISS from Pleroma"})) -      Activity.delete_by_ap_id(activity.object.data["id"]) +      Activity.delete_all_by_object_ap_id(activity.object.data["id"])        conn2 =          conn diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 2677b9e36..97844a407 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -487,7 +487,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        activity_five = insert(:note_activity)        user = insert(:user) -      {:ok, user} = User.block(user, %{ap_id: activity_five.data["actor"]}) +      {:ok, _user_relationship} = User.block(user, %{ap_id: activity_five.data["actor"]})        activities = ActivityPub.fetch_activities_for_context("2hu", %{"blocking_user" => user})        assert activities == [activity_two, activity] @@ -500,7 +500,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      activity_three = insert(:note_activity)      user = insert(:user)      booster = insert(:user) -    {:ok, user} = User.block(user, %{ap_id: activity_one.data["actor"]}) +    {:ok, _user_relationship} = User.block(user, %{ap_id: activity_one.data["actor"]})      activities =        ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) @@ -509,7 +509,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      assert Enum.member?(activities, activity_three)      refute Enum.member?(activities, activity_one) -    {:ok, user} = User.unblock(user, %{ap_id: activity_one.data["actor"]}) +    {:ok, _user_block} = User.unblock(user, %{ap_id: activity_one.data["actor"]})      activities =        ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) @@ -518,7 +518,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      assert Enum.member?(activities, activity_three)      assert Enum.member?(activities, activity_one) -    {:ok, user} = User.block(user, %{ap_id: activity_three.data["actor"]}) +    {:ok, _user_relationship} = User.block(user, %{ap_id: activity_three.data["actor"]})      {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.repeat(activity_three.id, booster)      %Activity{} = boost_activity = Activity.get_create_by_object_ap_id(id)      activity_three = Activity.get_by_id(activity_three.id) @@ -545,7 +545,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      blockee = insert(:user)      friend = insert(:user) -    {:ok, blocker} = User.block(blocker, blockee) +    {:ok, _user_relationship} = User.block(blocker, blockee)      {:ok, activity_one} = CommonAPI.post(friend, %{"status" => "hey!"}) @@ -568,7 +568,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      blockee = insert(:user)      friend = insert(:user) -    {:ok, blocker} = User.block(blocker, blockee) +    {:ok, _user_relationship} = User.block(blocker, blockee)      {:ok, activity_one} = CommonAPI.post(friend, %{"status" => "hey!"}) @@ -614,7 +614,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      activity_three = insert(:note_activity)      user = insert(:user)      booster = insert(:user) -    {:ok, user} = User.mute(user, %User{ap_id: activity_one.data["actor"]}) + +    activity_one_actor = User.get_by_ap_id(activity_one.data["actor"]) +    {:ok, _user_relationships} = User.mute(user, activity_one_actor)      activities =        ActivityPub.fetch_activities([], %{"muting_user" => user, "skip_preload" => true}) @@ -635,7 +637,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      assert Enum.member?(activities, activity_three)      assert Enum.member?(activities, activity_one) -    {:ok, user} = User.unmute(user, %User{ap_id: activity_one.data["actor"]}) +    {:ok, _user_mute} = User.unmute(user, activity_one_actor)      activities =        ActivityPub.fetch_activities([], %{"muting_user" => user, "skip_preload" => true}) @@ -644,7 +646,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      assert Enum.member?(activities, activity_three)      assert Enum.member?(activities, activity_one) -    {:ok, user} = User.mute(user, %User{ap_id: activity_three.data["actor"]}) +    activity_three_actor = User.get_by_ap_id(activity_three.data["actor"]) +    {:ok, _user_relationships} = User.mute(user, activity_three_actor)      {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.repeat(activity_three.id, booster)      %Activity{} = boost_activity = Activity.get_create_by_object_ap_id(id)      activity_three = Activity.get_by_id(activity_three.id) @@ -791,7 +794,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        activity = insert(:note_activity)        user = insert(:user)        booster = insert(:user) -      {:ok, user} = CommonAPI.hide_reblogs(user, booster) +      {:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, booster)        {:ok, activity, _} = CommonAPI.repeat(activity.id, booster) @@ -804,8 +807,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        activity = insert(:note_activity)        user = insert(:user)        booster = insert(:user) -      {:ok, user} = CommonAPI.hide_reblogs(user, booster) -      {:ok, user} = CommonAPI.show_reblogs(user, booster) +      {:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, booster) +      {:ok, _reblog_mute} = CommonAPI.show_reblogs(user, booster)        {:ok, activity, _} = CommonAPI.repeat(activity.id, booster) @@ -1256,6 +1259,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id)        assert object.data["repliesCount"] == 0      end + +    test "it passes delete activity through MRF before deleting the object" do +      rewrite_policy = Pleroma.Config.get([:instance, :rewrite_policy]) +      Pleroma.Config.put([:instance, :rewrite_policy], Pleroma.Web.ActivityPub.MRF.DropPolicy) + +      on_exit(fn -> Pleroma.Config.put([:instance, :rewrite_policy], rewrite_policy) end) + +      note = insert(:note_activity) +      object = Object.normalize(note) + +      {:error, {:reject, _}} = ActivityPub.delete(object) + +      assert Activity.get_by_id(note.id) +      assert Repo.get(Object, object.id).data["type"] == object.data["type"] +    end    end    describe "timeline post-processing" do @@ -1619,10 +1637,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        activity = %Activity{activity | object: nil}        assert [%Notification{activity: ^activity}] = -               Notification.for_user_since(follower, ~N[2019-04-13 11:22:33]) +               Notification.for_user(follower, %{with_move: true})        assert [%Notification{activity: ^activity}] = -               Notification.for_user_since(follower_move_opted_out, ~N[2019-04-13 11:22:33]) +               Notification.for_user(follower_move_opted_out, %{with_move: true})      end      test "old user must be in the new user's `also_known_as` list" do diff --git a/test/web/activity_pub/transmogrifier/follow_handling_test.exs b/test/web/activity_pub/transmogrifier/follow_handling_test.exs index 75cfbea2e..7d6d0814d 100644 --- a/test/web/activity_pub/transmogrifier/follow_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/follow_handling_test.exs @@ -128,7 +128,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do        user = insert(:user)        {:ok, target} = User.get_or_fetch("http://mastodon.example.org/users/admin") -      {:ok, user} = User.block(user, target) +      {:ok, _user_relationship} = User.block(user, target)        data =          File.read!("test/fixtures/mastodon-follow-activity.json") diff --git a/test/web/activity_pub/utils_test.exs b/test/web/activity_pub/utils_test.exs index 1feb076ba..586eb1d2f 100644 --- a/test/web/activity_pub/utils_test.exs +++ b/test/web/activity_pub/utils_test.exs @@ -636,47 +636,4 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do        assert updated_object.data["announcement_count"] == 1      end    end - -  describe "get_reports_grouped_by_status/1" do -    setup do -      [reporter, target_user] = insert_pair(:user) -      first_status = insert(:note_activity, user: target_user) -      second_status = insert(:note_activity, user: target_user) - -      CommonAPI.report(reporter, %{ -        "account_id" => target_user.id, -        "comment" => "I feel offended", -        "status_ids" => [first_status.id] -      }) - -      CommonAPI.report(reporter, %{ -        "account_id" => target_user.id, -        "comment" => "I feel offended2", -        "status_ids" => [second_status.id] -      }) - -      data = [%{activity: first_status.data["id"]}, %{activity: second_status.data["id"]}] - -      {:ok, -       %{ -         first_status: first_status, -         second_status: second_status, -         data: data -       }} -    end - -    test "works for deprecated reports format", %{ -      first_status: first_status, -      second_status: second_status, -      data: data -    } do -      groups = Utils.get_reports_grouped_by_status(data).groups - -      first_group = Enum.find(groups, &(&1.status.id == first_status.data["id"])) -      second_group = Enum.find(groups, &(&1.status.id == second_status.data["id"])) - -      assert first_group.status.id == first_status.data["id"] -      assert second_group.status.id == second_status.data["id"] -    end -  end  end diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index bcab63cf0..23ca7f110 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -15,6 +15,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    alias Pleroma.UserInviteToken    alias Pleroma.Web.ActivityPub.Relay    alias Pleroma.Web.CommonAPI +  alias Pleroma.Web.MastodonAPI.StatusView    alias Pleroma.Web.MediaProxy    import Pleroma.Factory @@ -1667,6 +1668,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          first_status: Activity.get_by_ap_id_with_object(first_status.data["id"]),          second_status: Activity.get_by_ap_id_with_object(second_status.data["id"]),          third_status: Activity.get_by_ap_id_with_object(third_status.data["id"]), +        first_report: first_report,          first_status_reports: [first_report, second_report, third_report],          second_status_reports: [first_report, second_report],          third_status_reports: [first_report], @@ -1693,14 +1695,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert length(response["reports"]) == 3 -      first_group = -        Enum.find(response["reports"], &(&1["status"]["id"] == first_status.data["id"])) +      first_group = Enum.find(response["reports"], &(&1["status"]["id"] == first_status.id)) -      second_group = -        Enum.find(response["reports"], &(&1["status"]["id"] == second_status.data["id"])) +      second_group = Enum.find(response["reports"], &(&1["status"]["id"] == second_status.id)) -      third_group = -        Enum.find(response["reports"], &(&1["status"]["id"] == third_status.data["id"])) +      third_group = Enum.find(response["reports"], &(&1["status"]["id"] == third_status.id))        assert length(first_group["reports"]) == 3        assert length(second_group["reports"]) == 2 @@ -1711,13 +1710,14 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                   NaiveDateTime.from_iso8601!(act.data["published"])                 end).data["published"] -      assert first_group["status"] == %{ -               "id" => first_status.data["id"], -               "content" => first_status.object.data["content"], -               "published" => first_status.object.data["published"] -             } +      assert first_group["status"] == +               Map.put( +                 stringify_keys(StatusView.render("show.json", %{activity: first_status})), +                 "deleted", +                 false +               ) -      assert first_group["account"]["id"] == target_user.id +      assert(first_group["account"]["id"] == target_user.id)        assert length(first_group["actors"]) == 1        assert hd(first_group["actors"])["id"] == reporter.id @@ -1730,11 +1730,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                   NaiveDateTime.from_iso8601!(act.data["published"])                 end).data["published"] -      assert second_group["status"] == %{ -               "id" => second_status.data["id"], -               "content" => second_status.object.data["content"], -               "published" => second_status.object.data["published"] -             } +      assert second_group["status"] == +               Map.put( +                 stringify_keys(StatusView.render("show.json", %{activity: second_status})), +                 "deleted", +                 false +               )        assert second_group["account"]["id"] == target_user.id @@ -1749,11 +1750,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                   NaiveDateTime.from_iso8601!(act.data["published"])                 end).data["published"] -      assert third_group["status"] == %{ -               "id" => third_status.data["id"], -               "content" => third_status.object.data["content"], -               "published" => third_status.object.data["published"] -             } +      assert third_group["status"] == +               Map.put( +                 stringify_keys(StatusView.render("show.json", %{activity: third_status})), +                 "deleted", +                 false +               )        assert third_group["account"]["id"] == target_user.id @@ -1763,6 +1765,70 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert Enum.map(third_group["reports"], & &1["id"]) --                 Enum.map(third_status_reports, & &1.id) == []      end + +    test "reopened report renders status data", %{ +      conn: conn, +      first_report: first_report, +      first_status: first_status +    } do +      {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") + +      response = +        conn +        |> get("/api/pleroma/admin/grouped_reports") +        |> json_response(:ok) + +      first_group = Enum.find(response["reports"], &(&1["status"]["id"] == first_status.id)) + +      assert first_group["status"] == +               Map.put( +                 stringify_keys(StatusView.render("show.json", %{activity: first_status})), +                 "deleted", +                 false +               ) +    end + +    test "reopened report does not render status data if status has been deleted", %{ +      conn: conn, +      first_report: first_report, +      first_status: first_status, +      target_user: target_user +    } do +      {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") +      {:ok, _} = CommonAPI.delete(first_status.id, target_user) + +      refute Activity.get_by_ap_id(first_status.id) + +      response = +        conn +        |> get("/api/pleroma/admin/grouped_reports") +        |> json_response(:ok) + +      assert Enum.find(response["reports"], &(&1["status"]["deleted"] == true))["status"][ +               "deleted" +             ] == true + +      assert length(Enum.filter(response["reports"], &(&1["status"]["deleted"] == false))) == 2 +    end + +    test "account not empty if status was deleted", %{ +      conn: conn, +      first_report: first_report, +      first_status: first_status, +      target_user: target_user +    } do +      {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") +      {:ok, _} = CommonAPI.delete(first_status.id, target_user) + +      refute Activity.get_by_ap_id(first_status.id) + +      response = +        conn +        |> get("/api/pleroma/admin/grouped_reports") +        |> json_response(:ok) + +      assert Enum.find(response["reports"], &(&1["status"]["deleted"] == true))["account"] +    end    end    describe "POST /api/pleroma/admin/reports/:id/respond" do diff --git a/test/web/chat_channel_test.exs b/test/web/chat_channel_test.exs new file mode 100644 index 000000000..68c24a9f9 --- /dev/null +++ b/test/web/chat_channel_test.exs @@ -0,0 +1,37 @@ +defmodule Pleroma.Web.ChatChannelTest do +  use Pleroma.Web.ChannelCase +  alias Pleroma.Web.ChatChannel +  alias Pleroma.Web.UserSocket + +  import Pleroma.Factory + +  setup do +    user = insert(:user) + +    {:ok, _, socket} = +      socket(UserSocket, "", %{user_name: user.nickname}) +      |> subscribe_and_join(ChatChannel, "chat:public") + +    {:ok, socket: socket} +  end + +  test "it broadcasts a message", %{socket: socket} do +    push(socket, "new_msg", %{"text" => "why is tenshi eating a corndog so cute?"}) +    assert_broadcast("new_msg", %{text: "why is tenshi eating a corndog so cute?"}) +  end + +  describe "message lengths" do +    clear_config([:instance, :chat_limit]) + +    test "it ignores messages of length zero", %{socket: socket} do +      push(socket, "new_msg", %{"text" => ""}) +      refute_broadcast("new_msg", %{text: ""}) +    end + +    test "it ignores messages above a certain length", %{socket: socket} do +      Pleroma.Config.put([:instance, :chat_limit], 2) +      push(socket, "new_msg", %{"text" => "123"}) +      refute_broadcast("new_msg", %{text: "123"}) +    end +  end +end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 138488d44..b5d6d4055 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -509,14 +509,14 @@ defmodule Pleroma.Web.CommonAPITest do      end      test "add a reblog mute", %{muter: muter, muted: muted} do -      {:ok, muter} = CommonAPI.hide_reblogs(muter, muted) +      {:ok, _reblog_mute} = CommonAPI.hide_reblogs(muter, muted)        assert User.showing_reblogs?(muter, muted) == false      end      test "remove a reblog mute", %{muter: muter, muted: muted} do -      {:ok, muter} = CommonAPI.hide_reblogs(muter, muted) -      {:ok, muter} = CommonAPI.show_reblogs(muter, muted) +      {:ok, _reblog_mute} = CommonAPI.hide_reblogs(muter, muted) +      {:ok, _reblog_mute} = CommonAPI.show_reblogs(muter, muted)        assert User.showing_reblogs?(muter, muted) == true      end @@ -526,7 +526,7 @@ defmodule Pleroma.Web.CommonAPITest do      test "also unsubscribes a user" do        [follower, followed] = insert_pair(:user)        {:ok, follower, followed, _} = CommonAPI.follow(follower, followed) -      {:ok, followed} = User.subscribe(follower, followed) +      {:ok, _subscription} = User.subscribe(follower, followed)        assert User.subscribed_to?(follower, followed) diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 585cb8a9e..fa08ae4df 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -144,6 +144,50 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do    end    describe "user timelines" do +    test "respects blocks", %{conn: conn} do +      user_one = insert(:user) +      user_two = insert(:user) +      user_three = insert(:user) + +      User.block(user_one, user_two) + +      {:ok, activity} = CommonAPI.post(user_two, %{"status" => "User one sux0rz"}) +      {:ok, repeat, _} = CommonAPI.repeat(activity.id, user_three) + +      resp = +        conn +        |> get("/api/v1/accounts/#{user_two.id}/statuses") + +      assert [%{"id" => id}] = json_response(resp, 200) +      assert id == activity.id + +      # Even a blocked user will deliver the full user timeline, there would be +      # no point in looking at a blocked users timeline otherwise +      resp = +        conn +        |> assign(:user, user_one) +        |> get("/api/v1/accounts/#{user_two.id}/statuses") + +      assert [%{"id" => id}] = json_response(resp, 200) +      assert id == activity.id + +      resp = +        conn +        |> get("/api/v1/accounts/#{user_three.id}/statuses") + +      assert [%{"id" => id}] = json_response(resp, 200) +      assert id == repeat.id + +      # When viewing a third user's timeline, the blocked users will NOT be +      # shown. +      resp = +        conn +        |> assign(:user, user_one) +        |> get("/api/v1/accounts/#{user_three.id}/statuses") + +      assert [] = json_response(resp, 200) +    end +      test "gets a users statuses", %{conn: conn} do        user_one = insert(:user)        user_two = insert(:user) @@ -891,7 +935,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      user = insert(:user)      other_user = insert(:user) -    {:ok, user} = User.mute(user, other_user) +    {:ok, _user_relationships} = User.mute(user, other_user)      conn =        conn @@ -906,7 +950,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      user = insert(:user)      other_user = insert(:user) -    {:ok, user} = User.block(user, other_user) +    {:ok, _user_relationship} = User.block(user, other_user)      conn =        conn diff --git a/test/web/mastodon_api/controllers/notification_controller_test.exs b/test/web/mastodon_api/controllers/notification_controller_test.exs index fa55a7cf9..6635ea7a2 100644 --- a/test/web/mastodon_api/controllers/notification_controller_test.exs +++ b/test/web/mastodon_api/controllers/notification_controller_test.exs @@ -137,55 +137,151 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result    end -  test "filters notifications using exclude_visibilities", %{conn: conn} do -    user = insert(:user) -    other_user = insert(:user) - -    {:ok, public_activity} = -      CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "public"}) - -    {:ok, direct_activity} = -      CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "direct"}) - -    {:ok, unlisted_activity} = -      CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "unlisted"}) - -    {:ok, private_activity} = -      CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "private"}) - -    conn = assign(conn, :user, user) - -    conn_res = -      get(conn, "/api/v1/notifications", %{ -        exclude_visibilities: ["public", "unlisted", "private"] -      }) - -    assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) -    assert id == direct_activity.id - -    conn_res = -      get(conn, "/api/v1/notifications", %{ -        exclude_visibilities: ["public", "unlisted", "direct"] -      }) - -    assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) -    assert id == private_activity.id - -    conn_res = -      get(conn, "/api/v1/notifications", %{ -        exclude_visibilities: ["public", "private", "direct"] -      }) - -    assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) -    assert id == unlisted_activity.id - -    conn_res = -      get(conn, "/api/v1/notifications", %{ -        exclude_visibilities: ["unlisted", "private", "direct"] -      }) - -    assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) -    assert id == public_activity.id +  describe "exclude_visibilities" do +    test "filters notifications for mentions", %{conn: conn} do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, public_activity} = +        CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "public"}) + +      {:ok, direct_activity} = +        CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "direct"}) + +      {:ok, unlisted_activity} = +        CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "unlisted"}) + +      {:ok, private_activity} = +        CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "private"}) + +      conn = assign(conn, :user, user) + +      conn_res = +        get(conn, "/api/v1/notifications", %{ +          exclude_visibilities: ["public", "unlisted", "private"] +        }) + +      assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) +      assert id == direct_activity.id + +      conn_res = +        get(conn, "/api/v1/notifications", %{ +          exclude_visibilities: ["public", "unlisted", "direct"] +        }) + +      assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) +      assert id == private_activity.id + +      conn_res = +        get(conn, "/api/v1/notifications", %{ +          exclude_visibilities: ["public", "private", "direct"] +        }) + +      assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) +      assert id == unlisted_activity.id + +      conn_res = +        get(conn, "/api/v1/notifications", %{ +          exclude_visibilities: ["unlisted", "private", "direct"] +        }) + +      assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200) +      assert id == public_activity.id +    end + +    test "filters notifications for Like activities", %{conn: conn} do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, public_activity} = +        CommonAPI.post(other_user, %{"status" => ".", "visibility" => "public"}) + +      {:ok, direct_activity} = +        CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "direct"}) + +      {:ok, unlisted_activity} = +        CommonAPI.post(other_user, %{"status" => ".", "visibility" => "unlisted"}) + +      {:ok, private_activity} = +        CommonAPI.post(other_user, %{"status" => ".", "visibility" => "private"}) + +      {:ok, _, _} = CommonAPI.favorite(public_activity.id, user) +      {:ok, _, _} = CommonAPI.favorite(direct_activity.id, user) +      {:ok, _, _} = CommonAPI.favorite(unlisted_activity.id, user) +      {:ok, _, _} = CommonAPI.favorite(private_activity.id, user) + +      activity_ids = +        conn +        |> assign(:user, other_user) +        |> get("/api/v1/notifications", %{exclude_visibilities: ["direct"]}) +        |> json_response(200) +        |> Enum.map(& &1["status"]["id"]) + +      assert public_activity.id in activity_ids +      assert unlisted_activity.id in activity_ids +      assert private_activity.id in activity_ids +      refute direct_activity.id in activity_ids + +      activity_ids = +        conn +        |> assign(:user, other_user) +        |> get("/api/v1/notifications", %{exclude_visibilities: ["unlisted"]}) +        |> json_response(200) +        |> Enum.map(& &1["status"]["id"]) + +      assert public_activity.id in activity_ids +      refute unlisted_activity.id in activity_ids +      assert private_activity.id in activity_ids +      assert direct_activity.id in activity_ids + +      activity_ids = +        conn +        |> assign(:user, other_user) +        |> get("/api/v1/notifications", %{exclude_visibilities: ["private"]}) +        |> json_response(200) +        |> Enum.map(& &1["status"]["id"]) + +      assert public_activity.id in activity_ids +      assert unlisted_activity.id in activity_ids +      refute private_activity.id in activity_ids +      assert direct_activity.id in activity_ids + +      activity_ids = +        conn +        |> assign(:user, other_user) +        |> get("/api/v1/notifications", %{exclude_visibilities: ["public"]}) +        |> json_response(200) +        |> Enum.map(& &1["status"]["id"]) + +      refute public_activity.id in activity_ids +      assert unlisted_activity.id in activity_ids +      assert private_activity.id in activity_ids +      assert direct_activity.id in activity_ids +    end + +    test "filters notifications for Announce activities", %{conn: conn} do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, public_activity} = +        CommonAPI.post(other_user, %{"status" => ".", "visibility" => "public"}) + +      {:ok, unlisted_activity} = +        CommonAPI.post(other_user, %{"status" => ".", "visibility" => "unlisted"}) + +      {:ok, _, _} = CommonAPI.repeat(public_activity.id, user) +      {:ok, _, _} = CommonAPI.repeat(unlisted_activity.id, user) + +      activity_ids = +        conn +        |> assign(:user, other_user) +        |> get("/api/v1/notifications", %{exclude_visibilities: ["unlisted"]}) +        |> json_response(200) +        |> Enum.map(& &1["status"]["id"]) + +      assert public_activity.id in activity_ids +      refute unlisted_activity.id in activity_ids +    end    end    test "filters notifications using exclude_types", %{conn: conn} do @@ -289,7 +385,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert length(json_response(conn, 200)) == 1 -    {:ok, user} = User.mute(user, user2) +    {:ok, _user_relationships} = User.mute(user, user2)      conn = assign(build_conn(), :user, user)      conn = get(conn, "/api/v1/notifications") @@ -310,7 +406,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert length(json_response(conn, 200)) == 1 -    {:ok, user} = User.mute(user, user2, false) +    {:ok, _user_relationships} = User.mute(user, user2, false)      conn = assign(build_conn(), :user, user)      conn = get(conn, "/api/v1/notifications") @@ -333,7 +429,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert length(json_response(conn, 200)) == 1 -    {:ok, user} = User.mute(user, user2) +    {:ok, _user_relationships} = User.mute(user, user2)      conn = assign(build_conn(), :user, user)      conn = get(conn, "/api/v1/notifications", %{"with_muted" => "true"}) @@ -341,6 +437,32 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert length(json_response(conn, 200)) == 1    end +  test "see move notifications with `with_move` parameter", %{ +    conn: conn +  } do +    old_user = insert(:user) +    new_user = insert(:user, also_known_as: [old_user.ap_id]) +    follower = insert(:user) + +    User.follow(follower, old_user) +    Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user) +    Pleroma.Tests.ObanHelpers.perform_all() + +    conn = +      conn +      |> assign(:user, follower) +      |> get("/api/v1/notifications") + +    assert json_response(conn, 200) == [] + +    conn = +      build_conn() +      |> assign(:user, follower) +      |> get("/api/v1/notifications", %{"with_move" => "true"}) + +    assert length(json_response(conn, 200)) == 1 +  end +    defp get_notification_id_by_activity(%{id: id}) do      Notification      |> Repo.get_by(activity_id: id) diff --git a/test/web/mastodon_api/controllers/search_controller_test.exs b/test/web/mastodon_api/controllers/search_controller_test.exs index 7953fad62..34deeba47 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -165,15 +165,20 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do        assert status["id"] == to_string(activity.id)      end -    test "search fetches remote statuses", %{conn: conn} do +    test "search fetches remote statuses and prefers them over other results", %{conn: conn} do        capture_log(fn -> +        {:ok, %{id: activity_id}} = +          CommonAPI.post(insert(:user), %{ +            "status" => "check out https://shitposter.club/notice/2827873" +          }) +          conn =            conn            |> get("/api/v1/search", %{"q" => "https://shitposter.club/notice/2827873"})          assert results = json_response(conn, 200) -        [status] = results["statuses"] +        [status, %{"id" => ^activity_id}] = results["statuses"]          assert status["uri"] ==                   "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index a96fd860b..5fbe947ba 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -1108,7 +1108,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        activity: activity      } do        other_user = insert(:user) -      {:ok, user} = User.block(user, other_user) +      {:ok, _user_relationship} = User.block(user, other_user)        {:ok, _, _} = CommonAPI.favorite(activity.id, other_user) @@ -1205,7 +1205,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        activity: activity      } do        other_user = insert(:user) -      {:ok, user} = User.block(user, other_user) +      {:ok, _user_relationship} = User.block(user, other_user)        {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index 61b6cea75..dc17cc963 100644 --- a/test/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/web/mastodon_api/controllers/timeline_controller_test.exs @@ -194,7 +194,7 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        blocker = insert(:user)        blocked = insert(:user)        user = insert(:user) -      {:ok, blocker} = User.block(blocker, blocked) +      {:ok, _user_relationship} = User.block(blocker, blocked)        {:ok, _blocked_direct} =          CommonAPI.post(blocked, %{ diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index 35aefb7dc..5e297d129 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -92,13 +92,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do    test "Represent the user account for the account owner" do      user = insert(:user) -    notification_settings = %{ -      "followers" => true, -      "follows" => true, -      "non_follows" => true, -      "non_followers" => true -    } - +    notification_settings = %Pleroma.User.NotificationSetting{}      privacy = user.default_scope      assert %{ @@ -190,9 +184,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        {:ok, user} = User.follow(user, other_user)        {:ok, other_user} = User.follow(other_user, user) -      {:ok, other_user} = User.subscribe(user, other_user) -      {:ok, user} = User.mute(user, other_user, true) -      {:ok, user} = CommonAPI.hide_reblogs(user, other_user) +      {:ok, _subscription} = User.subscribe(user, other_user) +      {:ok, _user_relationships} = User.mute(user, other_user, true) +      {:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, other_user)        expected = %{          id: to_string(other_user.id), @@ -218,9 +212,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        other_user = insert(:user)        {:ok, user} = User.follow(user, other_user) -      {:ok, other_user} = User.subscribe(user, other_user) -      {:ok, user} = User.block(user, other_user) -      {:ok, other_user} = User.block(other_user, user) +      {:ok, _subscription} = User.subscribe(user, other_user) +      {:ok, _user_relationship} = User.block(user, other_user) +      {:ok, _user_relationship} = User.block(other_user, user)        expected = %{          id: to_string(other_user.id), @@ -291,7 +285,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      other_user = insert(:user)      {:ok, other_user} = User.follow(other_user, user) -    {:ok, other_user} = User.block(other_user, user) +    {:ok, _user_relationship} = User.block(other_user, user)      {:ok, _} = User.follow(insert(:user), user)      expected = %{ diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index 26e1afc85..ba1721e06 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -109,8 +109,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do    end    test "Move notification" do -    %{ap_id: old_ap_id} = old_user = insert(:user) -    %{ap_id: _new_ap_id} = new_user = insert(:user, also_known_as: [old_ap_id]) +    old_user = insert(:user) +    new_user = insert(:user, also_known_as: [old_user.ap_id])      follower = insert(:user)      User.follow(follower, old_user) @@ -120,7 +120,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do      old_user = refresh_record(old_user)      new_user = refresh_record(new_user) -    [notification] = Notification.for_user(follower) +    [notification] = Notification.for_user(follower, %{with_move: true})      expected = %{        id: to_string(notification.id), diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index d46ecc646..bdd87a79e 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -183,7 +183,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      user = insert(:user)      other_user = insert(:user) -    {:ok, user} = User.mute(user, other_user) +    {:ok, _user_relationships} = User.mute(user, other_user)      {:ok, activity} = CommonAPI.post(other_user, %{"status" => "test"})      status = StatusView.render("show.json", %{activity: activity}) @@ -199,7 +199,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      user = insert(:user)      other_user = insert(:user) -    {:ok, user} = User.mute(user, other_user) +    {:ok, _user_relationships} = User.mute(user, other_user)      {:ok, activity} = CommonAPI.post(other_user, %{"status" => "test"})      status = StatusView.render("show.json", %{activity: activity, for: user}) diff --git a/test/web/push/impl_test.exs b/test/web/push/impl_test.exs index 9b554601d..acae7a734 100644 --- a/test/web/push/impl_test.exs +++ b/test/web/push/impl_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.Push.ImplTest do    use Pleroma.DataCase    alias Pleroma.Object +  alias Pleroma.User    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.Push.Impl    alias Pleroma.Web.Push.Subscription @@ -182,4 +183,50 @@ defmodule Pleroma.Web.Push.ImplTest do      assert Impl.format_title(%{activity: activity}) ==               "New Direct Message"    end + +  describe "build_content/3" do +    test "returns info content for direct message with enabled privacy option" do +      user = insert(:user, nickname: "Bob") +      user2 = insert(:user, nickname: "Rob", notification_settings: %{privacy_option: true}) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "visibility" => "direct", +          "status" => "<Lorem ipsum dolor sit amet." +        }) + +      notif = insert(:notification, user: user2, activity: activity) + +      actor = User.get_cached_by_ap_id(notif.activity.data["actor"]) +      object = Object.normalize(activity) + +      assert Impl.build_content(notif, actor, object) == %{ +               body: "@Bob", +               title: "New Direct Message" +             } +    end + +    test "returns regular content for direct message with disabled privacy option" do +      user = insert(:user, nickname: "Bob") +      user2 = insert(:user, nickname: "Rob", notification_settings: %{privacy_option: false}) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "visibility" => "direct", +          "status" => +            "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis." +        }) + +      notif = insert(:notification, user: user2, activity: activity) + +      actor = User.get_cached_by_ap_id(notif.activity.data["actor"]) +      object = Object.normalize(activity) + +      assert Impl.build_content(notif, actor, object) == %{ +               body: +                 "@Bob: Lorem ipsum dolor sit amet, consectetur  adipiscing elit. Fusce sagittis fini...", +               title: "New Direct Message" +             } +    end +  end  end diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index 8265f18dd..8911c46b1 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -59,7 +59,7 @@ defmodule Pleroma.Web.StreamerTest do        user: user      } do        blocked = insert(:user) -      {:ok, user} = User.block(user, blocked) +      {:ok, _user_relationship} = User.block(user, blocked)        task = Task.async(fn -> refute_receive {:text, _}, 4_000 end) @@ -259,7 +259,7 @@ defmodule Pleroma.Web.StreamerTest do      test "it doesn't send messages involving blocked users" do        user = insert(:user)        blocked_user = insert(:user) -      {:ok, user} = User.block(user, blocked_user) +      {:ok, _user_relationship} = User.block(user, blocked_user)        task =          Task.async(fn -> @@ -301,7 +301,7 @@ defmodule Pleroma.Web.StreamerTest do          "public" => [fake_socket]        } -      {:ok, blocker} = User.block(blocker, blockee) +      {:ok, _user_relationship} = User.block(blocker, blockee)        {:ok, activity_one} = CommonAPI.post(friend, %{"status" => "hey! @#{blockee.nickname}"}) diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index f0211f59c..734cd2211 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -159,11 +159,31 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        user = Repo.get(User, user.id) -      assert %{ -               "followers" => false, -               "follows" => true, -               "non_follows" => true, -               "non_followers" => true +      assert %Pleroma.User.NotificationSetting{ +               followers: false, +               follows: true, +               non_follows: true, +               non_followers: true, +               privacy_option: false +             } == user.notification_settings +    end + +    test "it update notificatin privacy option", %{conn: conn} do +      user = insert(:user) + +      conn +      |> assign(:user, user) +      |> put("/api/pleroma/notification_settings", %{"privacy_option" => "1"}) +      |> json_response(:ok) + +      user = refresh_record(user) + +      assert %Pleroma.User.NotificationSetting{ +               followers: true, +               follows: true, +               non_follows: true, +               non_followers: true, +               privacy_option: true               } == user.notification_settings      end    end @@ -387,7 +407,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        user = insert(:user)        user2 = insert(:user) -      {:ok, _user} = Pleroma.User.block(user2, user) +      {:ok, _user_block} = Pleroma.User.block(user2, user)        response =          conn @@ -485,7 +505,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        Pleroma.Config.put([:user, :deny_follow_blocked], true)        user = insert(:user)        user2 = insert(:user) -      {:ok, _user} = Pleroma.User.block(user2, user) +      {:ok, _user_block} = Pleroma.User.block(user2, user)        response =          conn | 
