diff options
Diffstat (limited to 'test')
28 files changed, 946 insertions, 238 deletions
diff --git a/test/captcha_test.exs b/test/captcha_test.exs index 9f395d6b4..393c8219e 100644 --- a/test/captcha_test.exs +++ b/test/captcha_test.exs @@ -8,6 +8,7 @@ defmodule Pleroma.CaptchaTest do    import Tesla.Mock    alias Pleroma.Captcha.Kocaptcha +  alias Pleroma.Captcha.Native    @ets_options [:ordered_set, :private, :named_table, {:read_concurrency, true}] @@ -43,4 +44,21 @@ defmodule Pleroma.CaptchaTest do               ) == :ok      end    end + +  describe "Native" do +    test "new and validate" do +      new = Native.new() + +      assert %{ +               answer_data: answer, +               token: token, +               type: :native, +               url: "data:image/png;base64," <> _ +             } = new + +      assert is_binary(answer) +      assert :ok = Native.validate(token, answer, answer) +      assert {:error, "Invalid CAPTCHA"} == Native.validate(token, answer, answer <> "foobar") +    end +  end  end diff --git a/test/conversation/participation_test.exs b/test/conversation/participation_test.exs index 9b2c97963..ba81c0d4b 100644 --- a/test/conversation/participation_test.exs +++ b/test/conversation/participation_test.exs @@ -5,7 +5,9 @@  defmodule Pleroma.Conversation.ParticipationTest do    use Pleroma.DataCase    import Pleroma.Factory +  alias Pleroma.Conversation    alias Pleroma.Conversation.Participation +  alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.CommonAPI @@ -98,7 +100,9 @@ defmodule Pleroma.Conversation.ParticipationTest do      assert participation.user_id == user.id      assert participation.conversation_id == conversation.id +    # Needed because updated_at is accurate down to a second      :timer.sleep(1000) +      # Creating again returns the same participation      {:ok, %Participation{} = participation_two} =        Participation.create_for_user_and_conversation(user, conversation) @@ -150,9 +154,7 @@ defmodule Pleroma.Conversation.ParticipationTest do    test "gets all the participations for a user, ordered by updated at descending" do      user = insert(:user)      {:ok, activity_one} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"}) -    :timer.sleep(1000)      {:ok, activity_two} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"}) -    :timer.sleep(1000)      {:ok, activity_three} =        CommonAPI.post(user, %{ @@ -161,6 +163,17 @@ defmodule Pleroma.Conversation.ParticipationTest do          "in_reply_to_status_id" => activity_one.id        }) +    # Offset participations because the accuracy of updated_at is down to a second + +    for {activity, offset} <- [{activity_two, 1}, {activity_three, 2}] do +      conversation = Conversation.get_for_ap_id(activity.data["context"]) +      participation = Participation.for_user_and_conversation(user, conversation) +      updated_at = NaiveDateTime.add(Map.get(participation, :updated_at), offset) + +      Ecto.Changeset.change(participation, %{updated_at: updated_at}) +      |> Repo.update!() +    end +      assert [participation_one, participation_two] = Participation.for_user(user)      object2 = Pleroma.Object.normalize(activity_two) diff --git a/test/moderation_log_test.exs b/test/moderation_log_test.exs index 4240f6a65..f2168b735 100644 --- a/test/moderation_log_test.exs +++ b/test/moderation_log_test.exs @@ -214,7 +214,7 @@ defmodule Pleroma.ModerationLogTest do        {:ok, _} =          ModerationLog.insert_log(%{            actor: moderator, -          action: "report_response", +          action: "report_note",            subject: report,            text: "look at this"          }) @@ -222,7 +222,7 @@ defmodule Pleroma.ModerationLogTest do        log = Repo.one(ModerationLog)        assert log.data["message"] == -               "@#{moderator.nickname} responded with 'look at this' to report ##{report.id}" +               "@#{moderator.nickname} added note 'look at this' to report ##{report.id}"      end      test "logging status sensitivity update", %{moderator: moderator} do diff --git a/test/notification_test.exs b/test/notification_test.exs index 34096f0b1..ffa3d4b8c 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -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 diff --git a/test/plugs/oauth_scopes_plug_test.exs b/test/plugs/oauth_scopes_plug_test.exs index be6d1340b..89f32f43a 100644 --- a/test/plugs/oauth_scopes_plug_test.exs +++ b/test/plugs/oauth_scopes_plug_test.exs @@ -224,4 +224,42 @@ defmodule Pleroma.Plugs.OAuthScopesPlugTest do        assert f.(["admin:read"], ["write", "admin"]) == ["admin:read"]      end    end + +  describe "transform_scopes/2" do +    clear_config([:auth, :enforce_oauth_admin_scope_usage]) + +    setup do +      {:ok, %{f: &OAuthScopesPlug.transform_scopes/2}} +    end + +    test "with :admin option, prefixes all requested scopes with `admin:` " <> +           "and [optionally] keeps only prefixed scopes, " <> +           "depending on `[:auth, :enforce_oauth_admin_scope_usage]` setting", +         %{f: f} do +      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], false) + +      assert f.(["read"], %{admin: true}) == ["admin:read", "read"] + +      assert f.(["read", "write"], %{admin: true}) == [ +               "admin:read", +               "read", +               "admin:write", +               "write" +             ] + +      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], true) + +      assert f.(["read:accounts"], %{admin: true}) == ["admin:read:accounts"] + +      assert f.(["read", "write:reports"], %{admin: true}) == [ +               "admin:read", +               "admin:write:reports" +             ] +    end + +    test "with no supported options, returns unmodified scopes", %{f: f} do +      assert f.(["read"], %{}) == ["read"] +      assert f.(["read", "write"], %{}) == ["read", "write"] +    end +  end  end diff --git a/test/plugs/rate_limiter_test.exs b/test/plugs/rate_limiter_test.exs index 49f63c424..78f1ea9e4 100644 --- a/test/plugs/rate_limiter_test.exs +++ b/test/plugs/rate_limiter_test.exs @@ -145,9 +145,9 @@ defmodule Pleroma.Plugs.RateLimiterTest do      test "can have limits seperate from unauthenticated connections" do        limiter_name = :test_authenticated -      scale = 1000 +      scale = 50        limit = 5 -      Pleroma.Config.put([:rate_limit, limiter_name], [{1, 10}, {scale, limit}]) +      Pleroma.Config.put([:rate_limit, limiter_name], [{1000, 1}, {scale, limit}])        opts = RateLimiter.init(name: limiter_name) @@ -164,16 +164,6 @@ defmodule Pleroma.Plugs.RateLimiterTest do        assert %{"error" => "Throttled"} = Phoenix.ConnTest.json_response(conn, :too_many_requests)        assert conn.halted - -      Process.sleep(1550) - -      conn = conn(:get, "/") |> assign(:user, user) -      conn = RateLimiter.call(conn, opts) -      assert {1, 4} = RateLimiter.inspect_bucket(conn, limiter_name, opts) - -      refute conn.status == Plug.Conn.Status.code(:too_many_requests) -      refute conn.resp_body -      refute conn.halted      end      test "diffrerent users are counted independently" do diff --git a/test/plugs/user_is_admin_plug_test.exs b/test/plugs/user_is_admin_plug_test.exs index 136dcc54e..bc6fcd73c 100644 --- a/test/plugs/user_is_admin_plug_test.exs +++ b/test/plugs/user_is_admin_plug_test.exs @@ -8,36 +8,116 @@ defmodule Pleroma.Plugs.UserIsAdminPlugTest do    alias Pleroma.Plugs.UserIsAdminPlug    import Pleroma.Factory -  test "accepts a user that is admin" do -    user = insert(:user, is_admin: true) +  describe "unless [:auth, :enforce_oauth_admin_scope_usage]," do +    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do +      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], false) +    end -    conn = -      build_conn() -      |> assign(:user, user) +    test "accepts a user that is an admin" do +      user = insert(:user, is_admin: true) -    ret_conn = -      conn -      |> UserIsAdminPlug.call(%{}) +      conn = assign(build_conn(), :user, user) -    assert conn == ret_conn -  end +      ret_conn = UserIsAdminPlug.call(conn, %{}) + +      assert conn == ret_conn +    end + +    test "denies a user that isn't an admin" do +      user = insert(:user) -  test "denies a user that isn't admin" do -    user = insert(:user) +      conn = +        build_conn() +        |> assign(:user, user) +        |> UserIsAdminPlug.call(%{}) -    conn = -      build_conn() -      |> assign(:user, user) -      |> UserIsAdminPlug.call(%{}) +      assert conn.status == 403 +    end -    assert conn.status == 403 +    test "denies when a user isn't set" do +      conn = UserIsAdminPlug.call(build_conn(), %{}) + +      assert conn.status == 403 +    end    end -  test "denies when a user isn't set" do -    conn = -      build_conn() -      |> UserIsAdminPlug.call(%{}) +  describe "with [:auth, :enforce_oauth_admin_scope_usage]," do +    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do +      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], true) +    end + +    setup do +      admin_user = insert(:user, is_admin: true) +      non_admin_user = insert(:user, is_admin: false) +      blank_user = nil + +      {:ok, %{users: [admin_user, non_admin_user, blank_user]}} +    end + +    test "if token has any of admin scopes, accepts a user that is an admin", %{conn: conn} do +      user = insert(:user, is_admin: true) +      token = insert(:oauth_token, user: user, scopes: ["admin:something"]) + +      conn = +        conn +        |> assign(:user, user) +        |> assign(:token, token) + +      ret_conn = UserIsAdminPlug.call(conn, %{}) + +      assert conn == ret_conn +    end + +    test "if token has any of admin scopes, denies a user that isn't an admin", %{conn: conn} do +      user = insert(:user, is_admin: false) +      token = insert(:oauth_token, user: user, scopes: ["admin:something"]) + +      conn = +        conn +        |> assign(:user, user) +        |> assign(:token, token) +        |> UserIsAdminPlug.call(%{}) + +      assert conn.status == 403 +    end + +    test "if token has any of admin scopes, denies when a user isn't set", %{conn: conn} do +      token = insert(:oauth_token, scopes: ["admin:something"]) + +      conn = +        conn +        |> assign(:user, nil) +        |> assign(:token, token) +        |> UserIsAdminPlug.call(%{}) + +      assert conn.status == 403 +    end + +    test "if token lacks admin scopes, denies users regardless of is_admin flag", +         %{users: users} do +      for user <- users do +        token = insert(:oauth_token, user: user) + +        conn = +          build_conn() +          |> assign(:user, user) +          |> assign(:token, token) +          |> UserIsAdminPlug.call(%{}) + +        assert conn.status == 403 +      end +    end + +    test "if token is missing, denies users regardless of is_admin flag", %{users: users} do +      for user <- users do +        conn = +          build_conn() +          |> assign(:user, user) +          |> assign(:token, nil) +          |> UserIsAdminPlug.call(%{}) -    assert conn.status == 403 +        assert conn.status == 403 +      end +    end    end  end 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 35ba523a1..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{}      }      %{ 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_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 7b0842e24..6be2281ac 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -914,6 +914,16 @@ defmodule Pleroma.UserTest do        refute User.blocks?(user, collateral_user)      end + +    test "follows take precedence over domain blocks" do +      user = insert(:user) +      good_eggo = insert(:user, %{ap_id: "https://meanies.social/user/cuteposter"}) + +      {:ok, user} = User.block_domain(user, "meanies.social") +      {:ok, user} = User.follow(user, good_eggo) + +      refute User.blocks?(user, good_eggo) +    end    end    describe "blocks_import" do 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 907176119..1520c8a9b 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -608,6 +608,39 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      refute repeat_activity in activities    end +  test "does return activities from followed users on blocked domains" do +    domain = "meanies.social" +    domain_user = insert(:user, %{ap_id: "https://#{domain}/@pundit"}) +    blocker = insert(:user) + +    {:ok, blocker} = User.follow(blocker, domain_user) +    {:ok, blocker} = User.block_domain(blocker, domain) + +    assert User.following?(blocker, domain_user) +    assert User.blocks_domain?(blocker, domain_user) +    refute User.blocks?(blocker, domain_user) + +    note = insert(:note, %{data: %{"actor" => domain_user.ap_id}}) +    activity = insert(:note_activity, %{note: note}) + +    activities = +      ActivityPub.fetch_activities([], %{"blocking_user" => blocker, "skip_preload" => true}) + +    assert activity in activities + +    # And check that if the guy we DO follow boosts someone else from their domain, +    # that should be hidden +    another_user = insert(:user, %{ap_id: "https://#{domain}/@meanie2"}) +    bad_note = insert(:note, %{data: %{"actor" => another_user.ap_id}}) +    bad_activity = insert(:note_activity, %{note: bad_note}) +    {:ok, repeat_activity, _} = CommonAPI.repeat(bad_activity.id, domain_user) + +    activities = +      ActivityPub.fetch_activities([], %{"blocking_user" => blocker, "skip_preload" => true}) + +    refute repeat_activity in activities +  end +    test "doesn't return muted activities" do      activity_one = insert(:note_activity)      activity_two = insert(:note_activity) @@ -1259,6 +1292,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 @@ -1577,6 +1625,35 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      end    end +  describe "fetch_favourites/3" do +    test "returns a favourite activities sorted by adds to favorite" do +      user = insert(:user) +      other_user = insert(:user) +      user1 = insert(:user) +      user2 = insert(:user) +      {:ok, a1} = CommonAPI.post(user1, %{"status" => "bla"}) +      {:ok, _a2} = CommonAPI.post(user2, %{"status" => "traps are happy"}) +      {:ok, a3} = CommonAPI.post(user2, %{"status" => "Trees Are "}) +      {:ok, a4} = CommonAPI.post(user2, %{"status" => "Agent Smith "}) +      {:ok, a5} = CommonAPI.post(user1, %{"status" => "Red or Blue "}) + +      {:ok, _, _} = CommonAPI.favorite(a4.id, user) +      {:ok, _, _} = CommonAPI.favorite(a3.id, other_user) +      {:ok, _, _} = CommonAPI.favorite(a3.id, user) +      {:ok, _, _} = CommonAPI.favorite(a5.id, other_user) +      {:ok, _, _} = CommonAPI.favorite(a5.id, user) +      {:ok, _, _} = CommonAPI.favorite(a4.id, other_user) +      {:ok, _, _} = CommonAPI.favorite(a1.id, user) +      {:ok, _, _} = CommonAPI.favorite(a1.id, other_user) +      result = ActivityPub.fetch_favourites(user) + +      assert Enum.map(result, & &1.id) == [a1.id, a5.id, a3.id, a4.id] + +      result = ActivityPub.fetch_favourites(user, %{"limit" => 2}) +      assert Enum.map(result, & &1.id) == [a1.id, a5.id] +    end +  end +    describe "Move activity" do      test "create" do        %{ap_id: old_ap_id} = old_user = insert(:user) @@ -1622,10 +1699,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/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index 4148f04bc..49ff005b6 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -10,6 +10,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    alias Pleroma.HTML    alias Pleroma.ModerationLog    alias Pleroma.Repo +  alias Pleroma.ReportNote    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User    alias Pleroma.UserInviteToken @@ -25,6 +26,60 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      :ok    end +  clear_config([:auth, :enforce_oauth_admin_scope_usage]) do +    Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], false) +  end + +  describe "with [:auth, :enforce_oauth_admin_scope_usage]," do +    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do +      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], true) +    end + +    test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope" do +      user = insert(:user) +      admin = insert(:user, is_admin: true) +      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 "DELETE /api/pleroma/admin/users" do      test "single user" do        admin = insert(:user, is_admin: true) @@ -98,7 +153,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert ["lain", "lain2"] -- Enum.map(log_entry.data["subjects"], & &1["nickname"]) == []      end -    test "Cannot create user with exisiting email" do +    test "Cannot create user with existing email" do        admin = insert(:user, is_admin: true)        user = insert(:user) @@ -129,7 +184,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do               ]      end -    test "Cannot create user with exisiting nickname" do +    test "Cannot create user with existing nickname" do        admin = insert(:user, is_admin: true)        user = insert(:user) @@ -1560,7 +1615,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          |> assign(:user, user)          |> get("/api/pleroma/admin/reports") -      assert json_response(conn, :forbidden) == %{"error" => "User is not admin."} +      assert json_response(conn, :forbidden) == +               %{"error" => "User is not an admin or OAuth admin scope is not granted."}      end      test "returns 403 when requested by anonymous" do @@ -1776,61 +1832,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "POST /api/pleroma/admin/reports/:id/respond" do -    setup %{conn: conn} do -      admin = insert(:user, is_admin: true) - -      %{conn: assign(conn, :user, admin), admin: admin} -    end - -    test "returns created dm", %{conn: conn, admin: admin} do -      [reporter, target_user] = insert_pair(:user) -      activity = insert(:note_activity, user: target_user) - -      {:ok, %{id: report_id}} = -        CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "comment" => "I feel offended", -          "status_ids" => [activity.id] -        }) - -      response = -        conn -        |> post("/api/pleroma/admin/reports/#{report_id}/respond", %{ -          "status" => "I will check it out" -        }) -        |> json_response(:ok) - -      recipients = Enum.map(response["mentions"], & &1["username"]) - -      assert reporter.nickname in recipients -      assert response["content"] == "I will check it out" -      assert response["visibility"] == "direct" - -      log_entry = Repo.one(ModerationLog) - -      assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} responded with 'I will check it out' to report ##{ -                 response["id"] -               }" -    end - -    test "returns 400 when status is missing", %{conn: conn} do -      conn = post(conn, "/api/pleroma/admin/reports/test/respond") - -      assert json_response(conn, :bad_request) == "Invalid parameters" -    end - -    test "returns 404 when report id is invalid", %{conn: conn} do -      conn = -        post(conn, "/api/pleroma/admin/reports/test/respond", %{ -          "status" => "foo" -        }) - -      assert json_response(conn, :not_found) == "Not found" -    end -  end -    describe "PUT /api/pleroma/admin/statuses/:id" do      setup %{conn: conn} do        admin = insert(:user, is_admin: true) @@ -3027,6 +3028,77 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 }"      end    end + +  describe "POST /reports/:id/notes" do +    setup do +      admin = insert(:user, is_admin: true) +      [reporter, target_user] = insert_pair(:user) +      activity = insert(:note_activity, user: target_user) + +      {:ok, %{id: report_id}} = +        CommonAPI.report(reporter, %{ +          "account_id" => target_user.id, +          "comment" => "I feel offended", +          "status_ids" => [activity.id] +        }) + +      build_conn() +      |> assign(:user, admin) +      |> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ +        content: "this is disgusting!" +      }) + +      build_conn() +      |> assign(:user, admin) +      |> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ +        content: "this is disgusting2!" +      }) + +      %{ +        admin_id: admin.id, +        report_id: report_id, +        admin: admin +      } +    end + +    test "it creates report note", %{admin_id: admin_id, report_id: report_id} do +      [note, _] = Repo.all(ReportNote) + +      assert %{ +               activity_id: ^report_id, +               content: "this is disgusting!", +               user_id: ^admin_id +             } = note +    end + +    test "it returns reports with notes", %{admin: admin} do +      conn = +        build_conn() +        |> assign(:user, admin) +        |> get("/api/pleroma/admin/reports") + +      response = json_response(conn, 200) +      notes = hd(response["reports"])["notes"] +      [note, _] = notes + +      assert note["user"]["nickname"] == admin.nickname +      assert note["content"] == "this is disgusting!" +      assert note["created_at"] +      assert response["total"] == 1 +    end + +    test "it deletes the note", %{admin: admin, report_id: report_id} do +      assert ReportNote |> Repo.all() |> length() == 2 + +      [note, _] = Repo.all(ReportNote) + +      build_conn() +      |> assign(:user, admin) +      |> delete("/api/pleroma/admin/reports/#{report_id}/notes/#{note.id}") + +      assert ReportNote |> Repo.all() |> length() == 1 +    end +  end  end  # Needed for testing diff --git a/test/web/admin_api/views/report_view_test.exs b/test/web/admin_api/views/report_view_test.exs index ef4a806e4..a0c6eab3c 100644 --- a/test/web/admin_api/views/report_view_test.exs +++ b/test/web/admin_api/views/report_view_test.exs @@ -30,6 +30,7 @@ defmodule Pleroma.Web.AdminAPI.ReportViewTest do            Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: other_user})          ),        statuses: [], +      notes: [],        state: "open",        id: activity.id      } @@ -65,6 +66,7 @@ defmodule Pleroma.Web.AdminAPI.ReportViewTest do          ),        statuses: [StatusView.render("show.json", %{activity: activity})],        state: "open", +      notes: [],        id: report_activity.id      } 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/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 444693404..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) diff --git a/test/web/mastodon_api/controllers/notification_controller_test.exs b/test/web/mastodon_api/controllers/notification_controller_test.exs index 00a85169e..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 @@ -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/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index ed6f2ecbd..2107bb85c 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -66,6 +66,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do          note: "valid html",          sensitive: false,          pleroma: %{ +          actor_type: "Person",            discoverable: false          },          fields: [] @@ -92,13 +93,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 %{ @@ -112,7 +107,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        insert(:user, %{          follower_count: 3,          note_count: 5, -        source_data: %{"type" => "Service"}, +        source_data: %{}, +        actor_type: "Service",          nickname: "shp@shitposter.club",          inserted_at: ~N[2017-08-15 15:47:06.597036]        }) @@ -140,6 +136,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do          note: user.bio,          sensitive: false,          pleroma: %{ +          actor_type: "Service",            discoverable: false          },          fields: [] @@ -284,7 +281,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        insert(:user, %{          follower_count: 0,          note_count: 5, -        source_data: %{"type" => "Service"}, +        source_data: %{}, +        actor_type: "Service",          nickname: "shp@shitposter.club",          inserted_at: ~N[2017-08-15 15:47:06.597036]        }) @@ -317,6 +315,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do          note: user.bio,          sensitive: false,          pleroma: %{ +          actor_type: "Service",            discoverable: false          },          fields: [] 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/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs index beb995cd8..901f2ae41 100644 --- a/test/web/oauth/oauth_controller_test.exs +++ b/test/web/oauth/oauth_controller_test.exs @@ -567,33 +567,41 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do    end    describe "POST /oauth/authorize" do -    test "redirects with oauth authorization" do -      user = insert(:user) -      app = insert(:oauth_app, scopes: ["read", "write", "follow"]) +    test "redirects with oauth authorization, " <> +           "keeping only non-admin scopes for non-admin user" do +      app = insert(:oauth_app, scopes: ["read", "write", "admin"])        redirect_uri = OAuthController.default_redirect_uri(app) -      conn = -        build_conn() -        |> post("/oauth/authorize", %{ -          "authorization" => %{ -            "name" => user.nickname, -            "password" => "test", -            "client_id" => app.client_id, -            "redirect_uri" => redirect_uri, -            "scope" => "read:subscope write", -            "state" => "statepassed" -          } -        }) +      non_admin = insert(:user, is_admin: false) +      admin = insert(:user, is_admin: true) -      target = redirected_to(conn) -      assert target =~ redirect_uri +      for {user, expected_scopes} <- %{ +            non_admin => ["read:subscope", "write"], +            admin => ["read:subscope", "write", "admin"] +          } do +        conn = +          build_conn() +          |> post("/oauth/authorize", %{ +            "authorization" => %{ +              "name" => user.nickname, +              "password" => "test", +              "client_id" => app.client_id, +              "redirect_uri" => redirect_uri, +              "scope" => "read:subscope write admin", +              "state" => "statepassed" +            } +          }) -      query = URI.parse(target).query |> URI.query_decoder() |> Map.new() +        target = redirected_to(conn) +        assert target =~ redirect_uri -      assert %{"state" => "statepassed", "code" => code} = query -      auth = Repo.get_by(Authorization, token: code) -      assert auth -      assert auth.scopes == ["read:subscope", "write"] +        query = URI.parse(target).query |> URI.query_decoder() |> Map.new() + +        assert %{"state" => "statepassed", "code" => code} = query +        auth = Repo.get_by(Authorization, token: code) +        assert auth +        assert auth.scopes == expected_scopes +      end      end      test "returns 401 for wrong credentials", %{conn: conn} do @@ -623,31 +631,34 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        assert result =~ "Invalid Username/Password"      end -    test "returns 401 for missing scopes", %{conn: conn} do -      user = insert(:user) -      app = insert(:oauth_app) +    test "returns 401 for missing scopes " <> +           "(including all admin-only scopes for non-admin user)" do +      user = insert(:user, is_admin: false) +      app = insert(:oauth_app, scopes: ["read", "write", "admin"])        redirect_uri = OAuthController.default_redirect_uri(app) -      result = -        conn -        |> post("/oauth/authorize", %{ -          "authorization" => %{ -            "name" => user.nickname, -            "password" => "test", -            "client_id" => app.client_id, -            "redirect_uri" => redirect_uri, -            "state" => "statepassed", -            "scope" => "" -          } -        }) -        |> html_response(:unauthorized) +      for scope_param <- ["", "admin:read admin:write"] do +        result = +          build_conn() +          |> post("/oauth/authorize", %{ +            "authorization" => %{ +              "name" => user.nickname, +              "password" => "test", +              "client_id" => app.client_id, +              "redirect_uri" => redirect_uri, +              "state" => "statepassed", +              "scope" => scope_param +            } +          }) +          |> html_response(:unauthorized) -      # Keep the details -      assert result =~ app.client_id -      assert result =~ redirect_uri +        # Keep the details +        assert result =~ app.client_id +        assert result =~ redirect_uri -      # Error message -      assert result =~ "This action is outside the authorized scopes" +        # Error message +        assert result =~ "This action is outside the authorized scopes" +      end      end      test "returns 401 for scopes beyond app scopes hierarchy", %{conn: conn} do 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 8911c46b1..7166d6f0b 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -16,6 +16,10 @@ defmodule Pleroma.Web.StreamerTest do    alias Pleroma.Web.Streamer.Worker    @moduletag needs_streamer: true, capture_log: true + +  @streamer_timeout 150 +  @streamer_start_wait 10 +    clear_config_all([:instance, :skip_thread_containment])    describe "user streams" do @@ -28,7 +32,7 @@ defmodule Pleroma.Web.StreamerTest do      test "it sends notify to in the 'user' stream", %{user: user, notify: notify} do        task =          Task.async(fn -> -          assert_receive {:text, _}, 4_000 +          assert_receive {:text, _}, @streamer_timeout          end)        Streamer.add_socket( @@ -43,7 +47,7 @@ defmodule Pleroma.Web.StreamerTest do      test "it sends notify to in the 'user:notification' stream", %{user: user, notify: notify} do        task =          Task.async(fn -> -          assert_receive {:text, _}, 4_000 +          assert_receive {:text, _}, @streamer_timeout          end)        Streamer.add_socket( @@ -61,7 +65,7 @@ defmodule Pleroma.Web.StreamerTest do        blocked = insert(:user)        {:ok, _user_relationship} = User.block(user, blocked) -      task = Task.async(fn -> refute_receive {:text, _}, 4_000 end) +      task = Task.async(fn -> refute_receive {:text, _}, @streamer_timeout end)        Streamer.add_socket(          "user:notification", @@ -79,7 +83,7 @@ defmodule Pleroma.Web.StreamerTest do        user: user      } do        user2 = insert(:user) -      task = Task.async(fn -> refute_receive {:text, _}, 4_000 end) +      task = Task.async(fn -> refute_receive {:text, _}, @streamer_timeout end)        Streamer.add_socket(          "user:notification", @@ -97,7 +101,7 @@ defmodule Pleroma.Web.StreamerTest do        user: user      } do        user2 = insert(:user, %{ap_id: "https://hecking-lewd-place.com/user/meanie"}) -      task = Task.async(fn -> refute_receive {:text, _}, 4_000 end) +      task = Task.async(fn -> refute_receive {:text, _}, @streamer_timeout end)        Streamer.add_socket(          "user:notification", @@ -116,7 +120,9 @@ defmodule Pleroma.Web.StreamerTest do        user: user      } do        user2 = insert(:user) -      task = Task.async(fn -> assert_receive {:text, _}, 4_000 end) +      task = Task.async(fn -> assert_receive {:text, _}, @streamer_timeout end) + +      Process.sleep(@streamer_start_wait)        Streamer.add_socket(          "user:notification", @@ -137,7 +143,7 @@ defmodule Pleroma.Web.StreamerTest do      task =        Task.async(fn -> -        assert_receive {:text, _}, 4_000 +        assert_receive {:text, _}, @streamer_timeout        end)      fake_socket = %StreamerSocket{ @@ -164,7 +170,7 @@ defmodule Pleroma.Web.StreamerTest do            }            |> Jason.encode!() -        assert_receive {:text, received_event}, 4_000 +        assert_receive {:text, received_event}, @streamer_timeout          assert received_event == expected_event        end) @@ -458,9 +464,7 @@ defmodule Pleroma.Web.StreamerTest do      {:ok, activity} = CommonAPI.add_mute(user2, activity) -    task = Task.async(fn -> refute_receive {:text, _}, 4_000 end) - -    Process.sleep(4000) +    task = Task.async(fn -> refute_receive {:text, _}, @streamer_timeout end)      Streamer.add_socket(        "user", @@ -482,7 +486,7 @@ defmodule Pleroma.Web.StreamerTest do        task =          Task.async(fn -> -          assert_receive {:text, received_event}, 4_000 +          assert_receive {:text, received_event}, @streamer_timeout            assert %{"event" => "conversation", "payload" => received_payload} =                     Jason.decode!(received_event) @@ -518,13 +522,13 @@ defmodule Pleroma.Web.StreamerTest do        task =          Task.async(fn -> -          assert_receive {:text, received_event}, 4_000 +          assert_receive {:text, received_event}, @streamer_timeout            assert %{"event" => "delete", "payload" => _} = Jason.decode!(received_event) -          refute_receive {:text, _}, 4_000 +          refute_receive {:text, _}, @streamer_timeout          end) -      Process.sleep(1000) +      Process.sleep(@streamer_start_wait)        Streamer.add_socket(          "direct", @@ -555,10 +559,10 @@ defmodule Pleroma.Web.StreamerTest do        task =          Task.async(fn -> -          assert_receive {:text, received_event}, 4_000 +          assert_receive {:text, received_event}, @streamer_timeout            assert %{"event" => "delete", "payload" => _} = Jason.decode!(received_event) -          assert_receive {:text, received_event}, 4_000 +          assert_receive {:text, received_event}, @streamer_timeout            assert %{"event" => "conversation", "payload" => received_payload} =                     Jason.decode!(received_event) @@ -567,7 +571,7 @@ defmodule Pleroma.Web.StreamerTest do            assert last_status["id"] == to_string(create_activity.id)          end) -      Process.sleep(1000) +      Process.sleep(@streamer_start_wait)        Streamer.add_socket(          "direct", diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 986ee01f3..43299e147 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 @@ -878,8 +898,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do          |> post("/api/pleroma/delete_account", %{"password" => "test"})        assert json_response(conn, 200) == %{"status" => "success"} -      # Wait a second for the started task to end -      :timer.sleep(1000)      end    end  end  | 
