diff options
Diffstat (limited to 'test')
29 files changed, 657 insertions, 109 deletions
diff --git a/test/activity_expiration_test.exs b/test/activity_expiration_test.exs index 4948fae16..2fc593b8c 100644 --- a/test/activity_expiration_test.exs +++ b/test/activity_expiration_test.exs @@ -7,6 +7,8 @@ defmodule Pleroma.ActivityExpirationTest do    alias Pleroma.ActivityExpiration    import Pleroma.Factory +  clear_config([ActivityExpiration, :enabled]) +    test "finds activities due to be deleted only" do      activity = insert(:note_activity)      expiration_due = insert(:expiration_in_the_past, %{activity_id: activity.id}) @@ -24,4 +26,27 @@ defmodule Pleroma.ActivityExpirationTest do      now = NaiveDateTime.utc_now()      assert {:error, _} = ActivityExpiration.create(activity, now)    end + +  test "deletes an expiration activity" do +    Pleroma.Config.put([ActivityExpiration, :enabled], true) +    activity = insert(:note_activity) + +    naive_datetime = +      NaiveDateTime.add( +        NaiveDateTime.utc_now(), +        -:timer.minutes(2), +        :millisecond +      ) + +    expiration = +      insert( +        :expiration_in_the_past, +        %{activity_id: activity.id, scheduled_at: naive_datetime} +      ) + +    Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker.perform(:ops, :pid) + +    refute Pleroma.Repo.get(Pleroma.Activity, activity.id) +    refute Pleroma.Repo.get(Pleroma.ActivityExpiration, expiration.id) +  end  end diff --git a/test/config/transfer_task_test.exs b/test/config/transfer_task_test.exs index 53e8703fd..ebdc951cf 100644 --- a/test/config/transfer_task_test.exs +++ b/test/config/transfer_task_test.exs @@ -5,6 +5,8 @@  defmodule Pleroma.Config.TransferTaskTest do    use Pleroma.DataCase +  import ExUnit.CaptureLog +    alias Pleroma.Config.TransferTask    alias Pleroma.ConfigDB @@ -105,4 +107,75 @@ defmodule Pleroma.Config.TransferTaskTest do        Application.put_env(:pleroma, :assets, assets)      end)    end + +  describe "pleroma restart" do +    test "don't restart if no reboot time settings were changed" do +      emoji = Application.get_env(:pleroma, :emoji) +      on_exit(fn -> Application.put_env(:pleroma, :emoji, emoji) end) + +      ConfigDB.create(%{ +        group: ":pleroma", +        key: ":emoji", +        value: [groups: [a: 1, b: 2]] +      }) + +      refute String.contains?( +               capture_log(fn -> TransferTask.start_link([]) end), +               "pleroma restarted" +             ) +    end + +    test "restart pleroma on reboot time key" do +      chat = Application.get_env(:pleroma, :chat) +      on_exit(fn -> Application.put_env(:pleroma, :chat, chat) end) + +      ConfigDB.create(%{ +        group: ":pleroma", +        key: ":chat", +        value: [enabled: false] +      }) + +      assert capture_log(fn -> TransferTask.start_link([]) end) =~ "pleroma restarted" +    end + +    test "restart pleroma on reboot time subkey" do +      captcha = Application.get_env(:pleroma, Pleroma.Captcha) +      on_exit(fn -> Application.put_env(:pleroma, Pleroma.Captcha, captcha) end) + +      ConfigDB.create(%{ +        group: ":pleroma", +        key: "Pleroma.Captcha", +        value: [seconds_valid: 60] +      }) + +      assert capture_log(fn -> TransferTask.start_link([]) end) =~ "pleroma restarted" +    end + +    test "don't restart pleroma on reboot time key and subkey if there is false flag" do +      chat = Application.get_env(:pleroma, :chat) +      captcha = Application.get_env(:pleroma, Pleroma.Captcha) + +      on_exit(fn -> +        Application.put_env(:pleroma, :chat, chat) +        Application.put_env(:pleroma, Pleroma.Captcha, captcha) +      end) + +      ConfigDB.create(%{ +        group: ":pleroma", +        key: ":chat", +        value: [enabled: false] +      }) + +      ConfigDB.create(%{ +        group: ":pleroma", +        key: "Pleroma.Captcha", +        value: [seconds_valid: 60] +      }) + +      refute String.contains?( +               capture_log(fn -> TransferTask.load_and_update_env([], false) end), +               "pleroma restarted" +             ) +    end +  end  end diff --git a/test/daemons/activity_expiration_daemon_test.exs b/test/daemons/activity_expiration_daemon_test.exs deleted file mode 100644 index b51132fb0..000000000 --- a/test/daemons/activity_expiration_daemon_test.exs +++ /dev/null @@ -1,17 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.ActivityExpirationWorkerTest do -  use Pleroma.DataCase -  alias Pleroma.Activity -  import Pleroma.Factory - -  test "deletes an activity" do -    activity = insert(:note_activity) -    expiration = insert(:expiration_in_the_past, %{activity_id: activity.id}) -    Pleroma.Daemons.ActivityExpirationDaemon.perform(:execute, expiration.id) - -    refute Repo.get(Activity, activity.id) -  end -end diff --git a/test/daemons/scheduled_activity_daemon_test.exs b/test/daemons/scheduled_activity_daemon_test.exs deleted file mode 100644 index c8e464491..000000000 --- a/test/daemons/scheduled_activity_daemon_test.exs +++ /dev/null @@ -1,19 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.ScheduledActivityDaemonTest do -  use Pleroma.DataCase -  alias Pleroma.ScheduledActivity -  import Pleroma.Factory - -  test "creates a status from the scheduled activity" do -    user = insert(:user) -    scheduled_activity = insert(:scheduled_activity, user: user, params: %{status: "hi"}) -    Pleroma.Daemons.ScheduledActivityDaemon.perform(:execute, scheduled_activity.id) - -    refute Repo.get(ScheduledActivity, scheduled_activity.id) -    activity = Repo.all(Pleroma.Activity) |> Enum.find(&(&1.actor == user.ap_id)) -    assert Pleroma.Object.normalize(activity).data["content"] == "hi" -  end -end diff --git a/test/fixtures/emoji-reaction-no-emoji.json b/test/fixtures/emoji-reaction-no-emoji.json new file mode 100644 index 000000000..ef3bbe55c --- /dev/null +++ b/test/fixtures/emoji-reaction-no-emoji.json @@ -0,0 +1,30 @@ +{ +  "type": "EmojiReact", +  "signature": { +    "type": "RsaSignature2017", +    "signatureValue": "fdxMfQSMwbC6wP6sh6neS/vM5879K67yQkHTbiT5Npr5wAac0y6+o3Ij+41tN3rL6wfuGTosSBTHOtta6R4GCOOhCaCSLMZKypnp1VltCzLDoyrZELnYQIC8gpUXVmIycZbREk22qWUe/w7DAFaKK4UscBlHDzeDVcA0K3Se5Sluqi9/Zh+ldAnEzj/rSEPDjrtvf5wGNf3fHxbKSRKFt90JvKK6hS+vxKUhlRFDf6/SMETw+EhwJSNW4d10yMUakqUWsFv4Acq5LW7l+HpYMvlYY1FZhNde1+uonnCyuQDyvzkff8zwtEJmAXC4RivO/VVLa17SmqheJZfI8oluVg==", +    "creator": "http://mastodon.example.org/users/admin#main-key", +    "created": "2018-02-17T18:57:49Z" +  }, +  "object": "http://localtesting.pleroma.lol/objects/eb92579d-3417-42a8-8652-2492c2d4f454", +  "content": "~", +  "nickname": "lain", +  "id": "http://mastodon.example.org/users/admin#reactions/2", +  "actor": "http://mastodon.example.org/users/admin", +  "@context": [ +    "https://www.w3.org/ns/activitystreams", +    "https://w3id.org/security/v1", +    { +      "toot": "http://joinmastodon.org/ns#", +      "sensitive": "as:sensitive", +      "ostatus": "http://ostatus.org#", +      "movedTo": "as:movedTo", +      "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", +      "inReplyToAtomUri": "ostatus:inReplyToAtomUri", +      "conversation": "ostatus:conversation", +      "atomUri": "ostatus:atomUri", +      "Hashtag": "as:Hashtag", +      "Emoji": "toot:Emoji" +    } +  ] +} diff --git a/test/fixtures/emoji-reaction-too-long.json b/test/fixtures/emoji-reaction-too-long.json new file mode 100644 index 000000000..e917c9a68 --- /dev/null +++ b/test/fixtures/emoji-reaction-too-long.json @@ -0,0 +1,30 @@ +{ +  "type": "EmojiReact", +  "signature": { +    "type": "RsaSignature2017", +    "signatureValue": "fdxMfQSMwbC6wP6sh6neS/vM5879K67yQkHTbiT5Npr5wAac0y6+o3Ij+41tN3rL6wfuGTosSBTHOtta6R4GCOOhCaCSLMZKypnp1VltCzLDoyrZELnYQIC8gpUXVmIycZbREk22qWUe/w7DAFaKK4UscBlHDzeDVcA0K3Se5Sluqi9/Zh+ldAnEzj/rSEPDjrtvf5wGNf3fHxbKSRKFt90JvKK6hS+vxKUhlRFDf6/SMETw+EhwJSNW4d10yMUakqUWsFv4Acq5LW7l+HpYMvlYY1FZhNde1+uonnCyuQDyvzkff8zwtEJmAXC4RivO/VVLa17SmqheJZfI8oluVg==", +    "creator": "http://mastodon.example.org/users/admin#main-key", +    "created": "2018-02-17T18:57:49Z" +  }, +  "object": "http://localtesting.pleroma.lol/objects/eb92579d-3417-42a8-8652-2492c2d4f454", +  "content": "👌👌", +  "nickname": "lain", +  "id": "http://mastodon.example.org/users/admin#reactions/2", +  "actor": "http://mastodon.example.org/users/admin", +  "@context": [ +    "https://www.w3.org/ns/activitystreams", +    "https://w3id.org/security/v1", +    { +      "toot": "http://joinmastodon.org/ns#", +      "sensitive": "as:sensitive", +      "ostatus": "http://ostatus.org#", +      "movedTo": "as:movedTo", +      "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", +      "inReplyToAtomUri": "ostatus:inReplyToAtomUri", +      "conversation": "ostatus:conversation", +      "atomUri": "ostatus:atomUri", +      "Hashtag": "as:Hashtag", +      "Emoji": "toot:Emoji" +    } +  ] +} diff --git a/test/fixtures/emoji-reaction.json b/test/fixtures/emoji-reaction.json index 3812e43ad..fe1fecddb 100644 --- a/test/fixtures/emoji-reaction.json +++ b/test/fixtures/emoji-reaction.json @@ -1,5 +1,5 @@  { -  "type": "EmojiReaction", +  "type": "EmojiReact",    "signature": {      "type": "RsaSignature2017",      "signatureValue": "fdxMfQSMwbC6wP6sh6neS/vM5879K67yQkHTbiT5Npr5wAac0y6+o3Ij+41tN3rL6wfuGTosSBTHOtta6R4GCOOhCaCSLMZKypnp1VltCzLDoyrZELnYQIC8gpUXVmIycZbREk22qWUe/w7DAFaKK4UscBlHDzeDVcA0K3Se5Sluqi9/Zh+ldAnEzj/rSEPDjrtvf5wGNf3fHxbKSRKFt90JvKK6hS+vxKUhlRFDf6/SMETw+EhwJSNW4d10yMUakqUWsFv4Acq5LW7l+HpYMvlYY1FZhNde1+uonnCyuQDyvzkff8zwtEJmAXC4RivO/VVLa17SmqheJZfI8oluVg==", diff --git a/test/object_test.exs b/test/object_test.exs index c6b2bc399..5690bedec 100644 --- a/test/object_test.exs +++ b/test/object_test.exs @@ -76,8 +76,43 @@ defmodule Pleroma.ObjectTest do    describe "delete attachments" do      clear_config([Pleroma.Upload]) +    test "Disabled via config" do +      Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) +      Pleroma.Config.put([:instance, :cleanup_attachments], false) + +      file = %Plug.Upload{ +        content_type: "image/jpg", +        path: Path.absname("test/fixtures/image.jpg"), +        filename: "an_image.jpg" +      } + +      user = insert(:user) + +      {:ok, %Object{} = attachment} = +        Pleroma.Web.ActivityPub.ActivityPub.upload(file, actor: user.ap_id) + +      %{data: %{"attachment" => [%{"url" => [%{"href" => href}]}]}} = +        note = insert(:note, %{user: user, data: %{"attachment" => [attachment.data]}}) + +      uploads_dir = Pleroma.Config.get!([Pleroma.Uploaders.Local, :uploads]) + +      path = href |> Path.dirname() |> Path.basename() + +      assert {:ok, ["an_image.jpg"]} == File.ls("#{uploads_dir}/#{path}") + +      Object.delete(note) + +      ObanHelpers.perform(all_enqueued(worker: Pleroma.Workers.AttachmentsCleanupWorker)) + +      assert Object.get_by_id(note.id).data["deleted"] +      refute Object.get_by_id(attachment.id) == nil + +      assert {:ok, ["an_image.jpg"]} == File.ls("#{uploads_dir}/#{path}") +    end +      test "in subdirectories" do        Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) +      Pleroma.Config.put([:instance, :cleanup_attachments], true)        file = %Plug.Upload{          content_type: "image/jpg", @@ -103,6 +138,7 @@ defmodule Pleroma.ObjectTest do        ObanHelpers.perform(all_enqueued(worker: Pleroma.Workers.AttachmentsCleanupWorker)) +      assert Object.get_by_id(note.id).data["deleted"]        assert Object.get_by_id(attachment.id) == nil        assert {:ok, []} == File.ls("#{uploads_dir}/#{path}") @@ -111,6 +147,7 @@ defmodule Pleroma.ObjectTest do      test "with dedupe enabled" do        Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)        Pleroma.Config.put([Pleroma.Upload, :filters], [Pleroma.Upload.Filter.Dedupe]) +      Pleroma.Config.put([:instance, :cleanup_attachments], true)        uploads_dir = Pleroma.Config.get!([Pleroma.Uploaders.Local, :uploads]) @@ -139,6 +176,7 @@ defmodule Pleroma.ObjectTest do        ObanHelpers.perform(all_enqueued(worker: Pleroma.Workers.AttachmentsCleanupWorker)) +      assert Object.get_by_id(note.id).data["deleted"]        assert Object.get_by_id(attachment.id) == nil        assert {:ok, files} = File.ls(uploads_dir)        refute filename in files @@ -146,6 +184,7 @@ defmodule Pleroma.ObjectTest do      test "with objects that have legacy data.url attribute" do        Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) +      Pleroma.Config.put([:instance, :cleanup_attachments], true)        file = %Plug.Upload{          content_type: "image/jpg", @@ -173,6 +212,7 @@ defmodule Pleroma.ObjectTest do        ObanHelpers.perform(all_enqueued(worker: Pleroma.Workers.AttachmentsCleanupWorker)) +      assert Object.get_by_id(note.id).data["deleted"]        assert Object.get_by_id(attachment.id) == nil        assert {:ok, []} == File.ls("#{uploads_dir}/#{path}") @@ -181,6 +221,7 @@ defmodule Pleroma.ObjectTest do      test "With custom base_url" do        Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)        Pleroma.Config.put([Pleroma.Upload, :base_url], "https://sub.domain.tld/dir/") +      Pleroma.Config.put([:instance, :cleanup_attachments], true)        file = %Plug.Upload{          content_type: "image/jpg", @@ -206,6 +247,7 @@ defmodule Pleroma.ObjectTest do        ObanHelpers.perform(all_enqueued(worker: Pleroma.Workers.AttachmentsCleanupWorker)) +      assert Object.get_by_id(note.id).data["deleted"]        assert Object.get_by_id(attachment.id) == nil        assert {:ok, []} == File.ls("#{uploads_dir}/#{path}") diff --git a/test/plugs/rate_limiter_test.exs b/test/plugs/rate_limiter_test.exs index 78f1ea9e4..06ffa7b70 100644 --- a/test/plugs/rate_limiter_test.exs +++ b/test/plugs/rate_limiter_test.exs @@ -16,6 +16,7 @@ defmodule Pleroma.Plugs.RateLimiterTest do      test "config is required for plug to work" do        limiter_name = :test_init        Pleroma.Config.put([:rate_limit, limiter_name], {1, 1}) +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})        assert %{limits: {1, 1}, name: :test_init, opts: [name: :test_init]} ==                 RateLimiter.init(name: limiter_name) @@ -23,11 +24,39 @@ defmodule Pleroma.Plugs.RateLimiterTest do        assert nil == RateLimiter.init(name: :foo)      end +    test "it is disabled for localhost" do +      limiter_name = :test_init +      Pleroma.Config.put([:rate_limit, limiter_name], {1, 1}) +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {127, 0, 0, 1}) +      Pleroma.Config.put([Pleroma.Plugs.RemoteIp, :enabled], false) + +      assert RateLimiter.disabled?() == true +    end + +    test "it is disabled for socket" do +      limiter_name = :test_init +      Pleroma.Config.put([:rate_limit, limiter_name], {1, 1}) +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {:local, "/path/to/pleroma.sock"}) +      Pleroma.Config.put([Pleroma.Plugs.RemoteIp, :enabled], false) + +      assert RateLimiter.disabled?() == true +    end + +    test "it is enabled for socket when remote ip is enabled" do +      limiter_name = :test_init +      Pleroma.Config.put([:rate_limit, limiter_name], {1, 1}) +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {:local, "/path/to/pleroma.sock"}) +      Pleroma.Config.put([Pleroma.Plugs.RemoteIp, :enabled], true) + +      assert RateLimiter.disabled?() == false +    end +      test "it restricts based on config values" do        limiter_name = :test_opts        scale = 80        limit = 5 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})        Pleroma.Config.put([:rate_limit, limiter_name], {scale, limit})        opts = RateLimiter.init(name: limiter_name) @@ -61,6 +90,7 @@ defmodule Pleroma.Plugs.RateLimiterTest do        limiter_name = :test_bucket_name        Pleroma.Config.put([:rate_limit, limiter_name], {1000, 5}) +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})        base_bucket_name = "#{limiter_name}:group1"        opts = RateLimiter.init(name: limiter_name, bucket_name: base_bucket_name) @@ -75,6 +105,7 @@ defmodule Pleroma.Plugs.RateLimiterTest do      test "`params` option allows different queries to be tracked independently" do        limiter_name = :test_params        Pleroma.Config.put([:rate_limit, limiter_name], {1000, 5}) +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})        opts = RateLimiter.init(name: limiter_name, params: ["id"]) @@ -90,6 +121,7 @@ defmodule Pleroma.Plugs.RateLimiterTest do      test "it supports combination of options modifying bucket name" do        limiter_name = :test_options_combo        Pleroma.Config.put([:rate_limit, limiter_name], {1000, 5}) +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})        base_bucket_name = "#{limiter_name}:group1"        opts = RateLimiter.init(name: limiter_name, bucket_name: base_bucket_name, params: ["id"]) @@ -109,6 +141,7 @@ defmodule Pleroma.Plugs.RateLimiterTest do      test "are restricted based on remote IP" do        limiter_name = :test_unauthenticated        Pleroma.Config.put([:rate_limit, limiter_name], [{1000, 5}, {1, 10}]) +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})        opts = RateLimiter.init(name: limiter_name) @@ -147,6 +180,7 @@ defmodule Pleroma.Plugs.RateLimiterTest do        scale = 50        limit = 5 +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})        Pleroma.Config.put([:rate_limit, limiter_name], [{1000, 1}, {scale, limit}])        opts = RateLimiter.init(name: limiter_name) @@ -169,6 +203,7 @@ defmodule Pleroma.Plugs.RateLimiterTest do      test "diffrerent users are counted independently" do        limiter_name = :test_authenticated        Pleroma.Config.put([:rate_limit, limiter_name], [{1, 10}, {1000, 5}]) +      Pleroma.Config.put([Pleroma.Web.Endpoint, :http, :ip], {8, 8, 8, 8})        opts = RateLimiter.init(name: limiter_name) diff --git a/test/scheduled_activity_test.exs b/test/scheduled_activity_test.exs index dcf12fb49..6c13d300a 100644 --- a/test/scheduled_activity_test.exs +++ b/test/scheduled_activity_test.exs @@ -8,11 +8,51 @@ defmodule Pleroma.ScheduledActivityTest do    alias Pleroma.ScheduledActivity    import Pleroma.Factory +  clear_config([ScheduledActivity, :enabled]) +    setup context do      DataCase.ensure_local_uploader(context)    end    describe "creation" do +    test "scheduled activities with jobs when ScheduledActivity enabled" do +      Pleroma.Config.put([ScheduledActivity, :enabled], true) +      user = insert(:user) + +      today = +        NaiveDateTime.utc_now() +        |> NaiveDateTime.add(:timer.minutes(6), :millisecond) +        |> NaiveDateTime.to_iso8601() + +      attrs = %{params: %{}, scheduled_at: today} +      {:ok, sa1} = ScheduledActivity.create(user, attrs) +      {:ok, sa2} = ScheduledActivity.create(user, attrs) + +      jobs = +        Repo.all(from(j in Oban.Job, where: j.queue == "scheduled_activities", select: j.args)) + +      assert jobs == [%{"activity_id" => sa1.id}, %{"activity_id" => sa2.id}] +    end + +    test "scheduled activities without jobs when ScheduledActivity disabled" do +      Pleroma.Config.put([ScheduledActivity, :enabled], false) +      user = insert(:user) + +      today = +        NaiveDateTime.utc_now() +        |> NaiveDateTime.add(:timer.minutes(6), :millisecond) +        |> NaiveDateTime.to_iso8601() + +      attrs = %{params: %{}, scheduled_at: today} +      {:ok, _sa1} = ScheduledActivity.create(user, attrs) +      {:ok, _sa2} = ScheduledActivity.create(user, attrs) + +      jobs = +        Repo.all(from(j in Oban.Job, where: j.queue == "scheduled_activities", select: j.args)) + +      assert jobs == [] +    end +      test "when daily user limit is exceeded" do        user = insert(:user) @@ -24,6 +64,7 @@ defmodule Pleroma.ScheduledActivityTest do        attrs = %{params: %{}, scheduled_at: today}        {:ok, _} = ScheduledActivity.create(user, attrs)        {:ok, _} = ScheduledActivity.create(user, attrs) +        {:error, changeset} = ScheduledActivity.create(user, attrs)        assert changeset.errors == [scheduled_at: {"daily limit exceeded", []}]      end diff --git a/test/support/helpers.ex b/test/support/helpers.ex index 9f817622d..d36c29cef 100644 --- a/test/support/helpers.ex +++ b/test/support/helpers.ex @@ -54,6 +54,12 @@ defmodule Pleroma.Tests.Helpers do            clear_config_all: 2          ] +      def to_datetime(naive_datetime) do +        naive_datetime +        |> DateTime.from_naive!("Etc/UTC") +        |> DateTime.truncate(:second) +      end +        def collect_ids(collection) do          collection          |> Enum.map(& &1.id) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index ff4604a52..ce68e7d0e 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -877,7 +877,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert reaction_activity        assert reaction_activity.data["actor"] == reactor.ap_id -      assert reaction_activity.data["type"] == "EmojiReaction" +      assert reaction_activity.data["type"] == "EmojiReact"        assert reaction_activity.data["content"] == "🔥"        assert reaction_activity.data["object"] == object.data["id"]        assert reaction_activity.data["to"] == [User.ap_followers(reactor), activity.data["actor"]] @@ -1174,6 +1174,23 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert embedded_object["object"] == followed.ap_id        assert embedded_object["id"] == follow_activity.data["id"]      end + +    test "creates an undo activity for a pending follow request" do +      follower = insert(:user) +      followed = insert(:user, %{locked: true}) + +      {:ok, follow_activity} = ActivityPub.follow(follower, followed) +      {:ok, activity} = ActivityPub.unfollow(follower, followed) + +      assert activity.data["type"] == "Undo" +      assert activity.data["actor"] == follower.ap_id + +      embedded_object = activity.data["object"] +      assert is_map(embedded_object) +      assert embedded_object["type"] == "Follow" +      assert embedded_object["object"] == followed.ap_id +      assert embedded_object["id"] == follow_activity.data["id"] +    end    end    describe "blocking / unblocking" do diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 5da358c43..1b12ee3a9 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -340,7 +340,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["object"] == activity.data["object"]      end -    test "it works for incoming misskey likes, turning them into EmojiReactions" do +    test "it works for incoming misskey likes, turning them into EmojiReacts" do        user = insert(:user)        {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) @@ -352,13 +352,13 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)        assert data["actor"] == data["actor"] -      assert data["type"] == "EmojiReaction" +      assert data["type"] == "EmojiReact"        assert data["id"] == data["id"]        assert data["object"] == activity.data["object"]        assert data["content"] == "🍮"      end -    test "it works for incoming misskey likes that contain unicode emojis, turning them into EmojiReactions" do +    test "it works for incoming misskey likes that contain unicode emojis, turning them into EmojiReacts" do        user = insert(:user)        {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) @@ -371,7 +371,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)        assert data["actor"] == data["actor"] -      assert data["type"] == "EmojiReaction" +      assert data["type"] == "EmojiReact"        assert data["id"] == data["id"]        assert data["object"] == activity.data["object"]        assert data["content"] == "⭐" @@ -389,12 +389,31 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)        assert data["actor"] == "http://mastodon.example.org/users/admin" -      assert data["type"] == "EmojiReaction" +      assert data["type"] == "EmojiReact"        assert data["id"] == "http://mastodon.example.org/users/admin#reactions/2"        assert data["object"] == activity.data["object"]        assert data["content"] == "👌"      end +    test "it reject invalid emoji reactions" do +      user = insert(:user) +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) + +      data = +        File.read!("test/fixtures/emoji-reaction-too-long.json") +        |> Poison.decode!() +        |> Map.put("object", activity.data["object"]) + +      assert :error = Transmogrifier.handle_incoming(data) + +      data = +        File.read!("test/fixtures/emoji-reaction-no-emoji.json") +        |> Poison.decode!() +        |> Map.put("object", activity.data["object"]) + +      assert :error = Transmogrifier.handle_incoming(data) +    end +      test "it works for incoming emoji reaction undos" do        user = insert(:user) diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index 5c767219a..5fbdf96f6 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -1899,13 +1899,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 "To use this endpoint you need to enable configuration from database."      end -    test "without any settings in db", %{conn: conn} do -      conn = get(conn, "/api/pleroma/admin/config") - -      assert json_response(conn, 400) == -               "To use configuration from database migrate your settings to database." -    end -      test "with settings only in db", %{conn: conn} do        config1 = insert(:config)        config2 = insert(:config) @@ -2043,7 +2036,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          Application.delete_env(:pleroma, Pleroma.Captcha.NotReal)          Application.put_env(:pleroma, :http, http)          Application.put_env(:tesla, :adapter, Tesla.Mock) -        :ok = File.rm("config/test.exported_from_db.secret.exs")        end)      end @@ -2170,7 +2162,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert Application.get_env(:idna, :key5) == {"string", Pleroma.Captcha.NotReal, []}      end -    test "save config setting without key", %{conn: conn} do +    test "save configs setting without explicit key", %{conn: conn} do        level = Application.get_env(:quack, :level)        meta = Application.get_env(:quack, :meta)        webhook_url = Application.get_env(:quack, :webhook_url) @@ -2256,6 +2248,34 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do               }      end +    test "saving config which need pleroma reboot", %{conn: conn} do +      chat = Pleroma.Config.get(:chat) +      on_exit(fn -> Pleroma.Config.put(:chat, chat) end) + +      conn = +        post( +          conn, +          "/api/pleroma/admin/config", +          %{ +            configs: [ +              %{group: ":pleroma", key: ":chat", value: [%{"tuple" => [":enabled", true]}]} +            ] +          } +        ) + +      assert json_response(conn, 200) == %{ +               "configs" => [ +                 %{ +                   "db" => [":enabled"], +                   "group" => ":pleroma", +                   "key" => ":chat", +                   "value" => [%{"tuple" => [":enabled", true]}] +                 } +               ], +               "need_reboot" => true +             } +    end +      test "saving config with nested merge", %{conn: conn} do        config =          insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: [k1: 1, k2: 2])) @@ -2957,47 +2977,15 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "config mix tasks run" do -    setup do -      Mix.shell(Mix.Shell.Quiet) - -      on_exit(fn -> -        Mix.shell(Mix.Shell.IO) -      end) - -      :ok -    end - +  describe "GET /api/pleroma/admin/restart" do      clear_config(:configurable_from_database) do        Pleroma.Config.put(:configurable_from_database, true)      end -    clear_config([:feed, :post_title]) do -      Pleroma.Config.put([:feed, :post_title], %{max_length: 100, omission: "…"}) -    end - -    test "transfer settings to DB and to file", %{conn: conn} do -      assert Repo.all(Pleroma.ConfigDB) == [] -      Mix.Tasks.Pleroma.Config.migrate_to_db("test/fixtures/config/temp.secret.exs") -      assert Repo.aggregate(Pleroma.ConfigDB, :count, :id) > 0 - -      conn = get(conn, "/api/pleroma/admin/config/migrate_from_db") - -      assert json_response(conn, 200) == %{} -      assert Repo.all(Pleroma.ConfigDB) == [] -    end - -    test "returns error if configuration from database is off", %{conn: conn} do -      initial = Pleroma.Config.get(:configurable_from_database) -      on_exit(fn -> Pleroma.Config.put(:configurable_from_database, initial) end) -      Pleroma.Config.put(:configurable_from_database, false) - -      conn = get(conn, "/api/pleroma/admin/config/migrate_from_db") - -      assert json_response(conn, 400) == -               "To use this endpoint you need to enable configuration from database." - -      assert Repo.all(Pleroma.ConfigDB) == [] +    test "pleroma restarts", %{conn: conn} do +      ExUnit.CaptureLog.capture_log(fn -> +        assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} +      end) =~ "pleroma restarted"      end    end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index f8963e42e..11f7c068f 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -238,7 +238,9 @@ defmodule Pleroma.Web.CommonAPITest do        assert reaction.data["actor"] == user.ap_id        assert reaction.data["content"] == "👍" -      # TODO: test error case. +      {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"}) + +      {:error, _} = CommonAPI.react_with_emoji(activity.id, user, ".")      end      test "unreacting to a status with an emoji" do @@ -322,6 +324,21 @@ defmodule Pleroma.Web.CommonAPITest do        assert %User{pinned_activities: [^id]} = user      end +    test "pin poll", %{user: user} do +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "How is fediverse today?", +          "poll" => %{"options" => ["Absolutely outstanding", "Not good"], "expires_in" => 20} +        }) + +      assert {:ok, ^activity} = CommonAPI.pin(activity.id, user) + +      id = activity.id +      user = refresh_record(user) + +      assert %User{pinned_activities: [^id]} = user +    end +      test "unlisted statuses can be pinned", %{user: user} do        {:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!", "visibility" => "unlisted"})        assert {:ok, ^activity} = CommonAPI.pin(activity.id, user) @@ -534,6 +551,50 @@ defmodule Pleroma.Web.CommonAPITest do        refute User.subscribed_to?(follower, followed)      end + +    test "cancels a pending follow for a local user" do +      follower = insert(:user) +      followed = insert(:user, locked: true) + +      assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} = +               CommonAPI.follow(follower, followed) + +      assert User.get_follow_state(follower, followed) == "pending" +      assert {:ok, follower} = CommonAPI.unfollow(follower, followed) +      assert User.get_follow_state(follower, followed) == nil + +      assert %{id: ^activity_id, data: %{"state" => "cancelled"}} = +               Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(follower, followed) + +      assert %{ +               data: %{ +                 "type" => "Undo", +                 "object" => %{"type" => "Follow", "state" => "cancelled"} +               } +             } = Pleroma.Web.ActivityPub.Utils.fetch_latest_undo(follower) +    end + +    test "cancels a pending follow for a remote user" do +      follower = insert(:user) +      followed = insert(:user, locked: true, local: false, ap_enabled: true) + +      assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} = +               CommonAPI.follow(follower, followed) + +      assert User.get_follow_state(follower, followed) == "pending" +      assert {:ok, follower} = CommonAPI.unfollow(follower, followed) +      assert User.get_follow_state(follower, followed) == nil + +      assert %{id: ^activity_id, data: %{"state" => "cancelled"}} = +               Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(follower, followed) + +      assert %{ +               data: %{ +                 "type" => "Undo", +                 "object" => %{"type" => "Follow", "state" => "cancelled"} +               } +             } = Pleroma.Web.ActivityPub.Utils.fetch_latest_undo(follower) +    end    end    describe "accept_follow_request/2" do diff --git a/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs b/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs index 09bdc46e0..82d9e7d2f 100644 --- a/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs +++ b/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs @@ -269,7 +269,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do          |> json_response(200)        assert account_data["fields"] == [ -               %{"name" => "foo", "value" => "bar"}, +               %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "bar"},                 %{"name" => "link", "value" => ~S(<a href="http://cofe.io" rel="ugc">cofe.io</a>)}               ] @@ -297,7 +297,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do          |> json_response(200)        assert account["fields"] == [ -               %{"name" => "foo", "value" => "bar"}, +               %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "bar"},                 %{"name" => "link", "value" => ~S(<a href="http://cofe.io" rel="ugc">cofe.io</a>)}               ] diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 0d4860a42..e2abcd7c5 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -457,6 +457,16 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        assert id == to_string(other_user.id)      end +    test "cancelling follow request", %{conn: conn} do +      %{id: other_user_id} = insert(:user, %{locked: true}) + +      assert %{"id" => ^other_user_id, "following" => false, "requested" => true} = +               conn |> post("/api/v1/accounts/#{other_user_id}/follow") |> json_response(:ok) + +      assert %{"id" => ^other_user_id, "following" => false, "requested" => false} = +               conn |> post("/api/v1/accounts/#{other_user_id}/unfollow") |> json_response(:ok) +    end +      test "following without reblogs" do        %{conn: conn} = oauth_access(["follow", "read:statuses"])        followed = insert(:user) @@ -668,6 +678,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end      test "rate limit", %{conn: conn} do +      Pleroma.Config.put([Pleroma.Plugs.RemoteIp, :enabled], true)        app_token = insert(:oauth_token, user: nil)        conn = diff --git a/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs b/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs index 9666a7f2e..6317d1b47 100644 --- a/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs +++ b/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs @@ -9,6 +9,9 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do    alias Pleroma.ScheduledActivity    import Pleroma.Factory +  import Ecto.Query + +  clear_config([ScheduledActivity, :enabled])    test "shows scheduled activities" do      %{user: user, conn: conn} = oauth_access(["read:statuses"]) @@ -52,11 +55,26 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do    end    test "updates a scheduled activity" do +    Pleroma.Config.put([ScheduledActivity, :enabled], true)      %{user: user, conn: conn} = oauth_access(["write:statuses"]) -    scheduled_activity = insert(:scheduled_activity, user: user) -    new_scheduled_at = -      NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(120), :millisecond) +    scheduled_at = Timex.shift(NaiveDateTime.utc_now(), minutes: 60) + +    {:ok, scheduled_activity} = +      ScheduledActivity.create( +        user, +        %{ +          scheduled_at: scheduled_at, +          params: build(:note).data +        } +      ) + +    job = Repo.one(from(j in Oban.Job, where: j.queue == "scheduled_activities")) + +    assert job.args == %{"activity_id" => scheduled_activity.id} +    assert DateTime.truncate(job.scheduled_at, :second) == to_datetime(scheduled_at) + +    new_scheduled_at = Timex.shift(NaiveDateTime.utc_now(), minutes: 120)      res_conn =        put(conn, "/api/v1/scheduled_statuses/#{scheduled_activity.id}", %{ @@ -65,6 +83,9 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do      assert %{"scheduled_at" => expected_scheduled_at} = json_response(res_conn, 200)      assert expected_scheduled_at == Pleroma.Web.CommonAPI.Utils.to_masto_date(new_scheduled_at) +    job = refresh_record(job) + +    assert DateTime.truncate(job.scheduled_at, :second) == to_datetime(new_scheduled_at)      res_conn = put(conn, "/api/v1/scheduled_statuses/404", %{scheduled_at: new_scheduled_at}) @@ -72,8 +93,22 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do    end    test "deletes a scheduled activity" do +    Pleroma.Config.put([ScheduledActivity, :enabled], true)      %{user: user, conn: conn} = oauth_access(["write:statuses"]) -    scheduled_activity = insert(:scheduled_activity, user: user) +    scheduled_at = Timex.shift(NaiveDateTime.utc_now(), minutes: 60) + +    {:ok, scheduled_activity} = +      ScheduledActivity.create( +        user, +        %{ +          scheduled_at: scheduled_at, +          params: build(:note).data +        } +      ) + +    job = Repo.one(from(j in Oban.Job, where: j.queue == "scheduled_activities")) + +    assert job.args == %{"activity_id" => scheduled_activity.id}      res_conn =        conn @@ -81,7 +116,8 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do        |> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}")      assert %{} = json_response(res_conn, 200) -    assert nil == Repo.get(ScheduledActivity, scheduled_activity.id) +    refute Repo.get(ScheduledActivity, scheduled_activity.id) +    refute Repo.get(Oban.Job, job.id)      res_conn =        conn diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index b03b4b344..83138d7ef 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -370,6 +370,11 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        assert NaiveDateTime.diff(NaiveDateTime.from_iso8601!(response["poll"]["expires_at"]), time) in 420..430        refute response["poll"]["expred"] + +      question = Object.get_by_id(response["poll"]["id"]) + +      # closed contains utc timezone +      assert question.data["closed"] =~ "Z"      end      test "option limit is enforced", %{conn: conn} do diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index 2107bb85c..00c294845 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -368,10 +368,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      assert result.pleroma[:settings_store] == nil    end -  test "sanitizes display names" do +  test "doesn't sanitize display names" do      user = insert(:user, name: "<marquee> username </marquee>")      result = AccountView.render("show.json", %{user: user}) -    refute result.display_name == "<marquee> username </marquee>" +    assert result.display_name == "<marquee> username </marquee>"    end    test "never display nil user follow counts" do diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index 1fe83cb2c..2ac75c2ff 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -135,7 +135,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do               NotificationView.render("index.json", %{notifications: [notification], for: follower})    end -  test "EmojiReaction notification" do +  test "EmojiReact notification" do      user = insert(:user)      other_user = insert(:user) diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index 25777b011..fc110417c 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -37,8 +37,15 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      status = StatusView.render("show.json", activity: activity)      assert status[:pleroma][:emoji_reactions] == [ -             %{emoji: "☕", count: 2}, -             %{emoji: "🍵", count: 1} +             %{emoji: "☕", count: 2, reacted: false}, +             %{emoji: "🍵", count: 1, reacted: false} +           ] + +    status = StatusView.render("show.json", activity: activity, for: user) + +    assert status[:pleroma][:emoji_reactions] == [ +             %{emoji: "☕", count: 2, reacted: true}, +             %{emoji: "🍵", count: 1, reacted: false}             ]    end diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs index 9a574a38d..39dd72cec 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.NodeInfoTest do    use Pleroma.Web.ConnCase    import Pleroma.Factory +  clear_config([:mrf_simple])    test "GET /.well-known/nodeinfo", %{conn: conn} do      links = diff --git a/test/web/pleroma_api/controllers/emoji_api_controller_test.exs b/test/web/pleroma_api/controllers/emoji_api_controller_test.exs index 8e76f2f3d..6f1ea78ec 100644 --- a/test/web/pleroma_api/controllers/emoji_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_api_controller_test.exs @@ -6,7 +6,6 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do    use Pleroma.Web.ConnCase    import Tesla.Mock -    import Pleroma.Factory    @emoji_dir_path Path.join( diff --git a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs index 3978c2ec5..be5007de5 100644 --- a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs @@ -25,9 +25,14 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do        |> assign(:user, other_user)        |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"]))        |> post("/api/v1/pleroma/statuses/#{activity.id}/react_with_emoji", %{"emoji" => "☕"}) +      |> json_response(200) -    assert %{"id" => id} = json_response(result, 200) +    assert %{"id" => id} = result      assert to_string(activity.id) == id + +    assert result["pleroma"]["emoji_reactions"] == [ +             %{"emoji" => "☕", "count" => 1, "reacted" => true} +           ]    end    test "POST /api/v1/pleroma/statuses/:id/unreact_with_emoji", %{conn: conn} do @@ -54,6 +59,7 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do    test "GET /api/v1/pleroma/statuses/:id/emoji_reactions_by", %{conn: conn} do      user = insert(:user)      other_user = insert(:user) +    doomed_user = insert(:user)      {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"}) @@ -65,14 +71,29 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do      assert result == []      {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") +    {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅") + +    User.perform(:delete, doomed_user)      result =        conn        |> get("/api/v1/pleroma/statuses/#{activity.id}/emoji_reactions_by")        |> json_response(200) -    [%{"emoji" => "🎅", "count" => 1, "accounts" => [represented_user]}] = result +    [%{"emoji" => "🎅", "count" => 1, "accounts" => [represented_user], "reacted" => false}] = +      result +      assert represented_user["id"] == other_user.id + +    result = +      conn +      |> assign(:user, other_user) +      |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:statuses"])) +      |> get("/api/v1/pleroma/statuses/#{activity.id}/emoji_reactions_by") +      |> json_response(200) + +    assert [%{"emoji" => "🎅", "count" => 1, "accounts" => [_represented_user], "reacted" => true}] = +             result    end    test "/api/v1/pleroma/conversations/:id" do diff --git a/test/workers/cron/clear_oauth_token_worker_test.exs b/test/workers/cron/clear_oauth_token_worker_test.exs new file mode 100644 index 000000000..adea47326 --- /dev/null +++ b/test/workers/cron/clear_oauth_token_worker_test.exs @@ -0,0 +1,22 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Workers.Cron.ClearOauthTokenWorkerTest do +  use Pleroma.DataCase + +  import Pleroma.Factory +  alias Pleroma.Workers.Cron.ClearOauthTokenWorker + +  clear_config([:oauth2, :clean_expired_tokens]) + +  test "deletes expired tokens" do +    insert(:oauth_token, +      valid_until: NaiveDateTime.add(NaiveDateTime.utc_now(), -60 * 10) +    ) + +    Pleroma.Config.put([:oauth2, :clean_expired_tokens], true) +    ClearOauthTokenWorker.perform(:opts, :job) +    assert Pleroma.Repo.all(Pleroma.Web.OAuth.Token) == [] +  end +end diff --git a/test/daemons/digest_email_daemon_test.exs b/test/workers/cron/digest_emails_worker_test.exs index faf592d5f..073615d9e 100644 --- a/test/daemons/digest_email_daemon_test.exs +++ b/test/workers/cron/digest_emails_worker_test.exs @@ -2,16 +2,24 @@  # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.DigestEmailDaemonTest do +defmodule Pleroma.Workers.Cron.DigestEmailsWorkerTest do    use Pleroma.DataCase +    import Pleroma.Factory -  alias Pleroma.Daemons.DigestEmailDaemon    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User    alias Pleroma.Web.CommonAPI +  clear_config([:email_notifications, :digest]) +    test "it sends digest emails" do +    Pleroma.Config.put([:email_notifications, :digest], %{ +      active: true, +      inactivity_threshold: 7, +      interval: 7 +    }) +      user = insert(:user)      date = @@ -23,8 +31,7 @@ defmodule Pleroma.DigestEmailDaemonTest do      {:ok, _} = User.switch_email_notifications(user2, "digest", true)      CommonAPI.post(user, %{"status" => "hey @#{user2.nickname}!"}) -    DigestEmailDaemon.perform() -    ObanHelpers.perform_all() +    Pleroma.Workers.Cron.DigestEmailsWorker.perform(:opts, :pid)      # Performing job(s) enqueued at previous step      ObanHelpers.perform_all() diff --git a/test/workers/cron/purge_expired_activities_worker_test.exs b/test/workers/cron/purge_expired_activities_worker_test.exs new file mode 100644 index 000000000..c2561683e --- /dev/null +++ b/test/workers/cron/purge_expired_activities_worker_test.exs @@ -0,0 +1,56 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorkerTest do +  use Pleroma.DataCase + +  alias Pleroma.ActivityExpiration +  alias Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker + +  import Pleroma.Factory +  import ExUnit.CaptureLog + +  clear_config([ActivityExpiration, :enabled]) + +  test "deletes an expiration activity" do +    Pleroma.Config.put([ActivityExpiration, :enabled], true) +    activity = insert(:note_activity) + +    naive_datetime = +      NaiveDateTime.add( +        NaiveDateTime.utc_now(), +        -:timer.minutes(2), +        :millisecond +      ) + +    expiration = +      insert( +        :expiration_in_the_past, +        %{activity_id: activity.id, scheduled_at: naive_datetime} +      ) + +    Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker.perform(:ops, :pid) + +    refute Pleroma.Repo.get(Pleroma.Activity, activity.id) +    refute Pleroma.Repo.get(Pleroma.ActivityExpiration, expiration.id) +  end + +  describe "delete_activity/1" do +    test "adds log message if activity isn't find" do +      assert capture_log([level: :error], fn -> +               PurgeExpiredActivitiesWorker.delete_activity(%ActivityExpiration{ +                 activity_id: "test-activity" +               }) +             end) =~ "Couldn't delete expired activity: not found activity" +    end + +    test "adds log message if actor isn't find" do +      assert capture_log([level: :error], fn -> +               PurgeExpiredActivitiesWorker.delete_activity(%ActivityExpiration{ +                 activity_id: "test-activity" +               }) +             end) =~ "Couldn't delete expired activity: not found activity" +    end +  end +end diff --git a/test/workers/scheduled_activity_worker_test.exs b/test/workers/scheduled_activity_worker_test.exs new file mode 100644 index 000000000..1405d7142 --- /dev/null +++ b/test/workers/scheduled_activity_worker_test.exs @@ -0,0 +1,52 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Workers.ScheduledActivityWorkerTest do +  use Pleroma.DataCase + +  alias Pleroma.ScheduledActivity +  alias Pleroma.Workers.ScheduledActivityWorker + +  import Pleroma.Factory +  import ExUnit.CaptureLog + +  clear_config([ScheduledActivity, :enabled]) + +  test "creates a status from the scheduled activity" do +    Pleroma.Config.put([ScheduledActivity, :enabled], true) +    user = insert(:user) + +    naive_datetime = +      NaiveDateTime.add( +        NaiveDateTime.utc_now(), +        -:timer.minutes(2), +        :millisecond +      ) + +    scheduled_activity = +      insert( +        :scheduled_activity, +        scheduled_at: naive_datetime, +        user: user, +        params: %{status: "hi"} +      ) + +    ScheduledActivityWorker.perform( +      %{"activity_id" => scheduled_activity.id}, +      :pid +    ) + +    refute Repo.get(ScheduledActivity, scheduled_activity.id) +    activity = Repo.all(Pleroma.Activity) |> Enum.find(&(&1.actor == user.ap_id)) +    assert Pleroma.Object.normalize(activity).data["content"] == "hi" +  end + +  test "adds log message if ScheduledActivity isn't find" do +    Pleroma.Config.put([ScheduledActivity, :enabled], true) + +    assert capture_log([level: :error], fn -> +             ScheduledActivityWorker.perform(%{"activity_id" => 42}, :pid) +           end) =~ "Couldn't find scheduled activity" +  end +end  | 
