diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/mix/tasks/pleroma.digest_test.exs | 51 | ||||
| -rw-r--r-- | test/notification_test.exs | 49 | ||||
| -rw-r--r-- | test/support/builders/user_builder.ex | 3 | ||||
| -rw-r--r-- | test/support/factory.ex | 3 | ||||
| -rw-r--r-- | test/user_info_test.exs | 24 | ||||
| -rw-r--r-- | test/user_search_test.exs | 9 | ||||
| -rw-r--r-- | test/user_test.exs | 103 | 
7 files changed, 238 insertions, 4 deletions
diff --git a/test/mix/tasks/pleroma.digest_test.exs b/test/mix/tasks/pleroma.digest_test.exs new file mode 100644 index 000000000..595f64ed7 --- /dev/null +++ b/test/mix/tasks/pleroma.digest_test.exs @@ -0,0 +1,51 @@ +defmodule Mix.Tasks.Pleroma.DigestTest do +  use Pleroma.DataCase + +  import Pleroma.Factory +  import Swoosh.TestAssertions + +  alias Pleroma.Web.CommonAPI + +  setup_all do +    Mix.shell(Mix.Shell.Process) + +    on_exit(fn -> +      Mix.shell(Mix.Shell.IO) +    end) + +    :ok +  end + +  describe "pleroma.digest test" do +    test "Sends digest to the given user" do +      user1 = insert(:user) +      user2 = insert(:user) + +      Enum.each(0..10, fn i -> +        {:ok, _activity} = +          CommonAPI.post(user1, %{ +            "status" => "hey ##{i} @#{user2.nickname}!" +          }) +      end) + +      yesterday = +        NaiveDateTime.add( +          NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second), +          -60 * 60 * 24, +          :second +        ) + +      {:ok, yesterday_date} = Timex.format(yesterday, "%F", :strftime) + +      :ok = Mix.Tasks.Pleroma.Digest.run(["test", user2.nickname, yesterday_date]) + +      assert_receive {:mix_shell, :info, [message]} +      assert message =~ "Digest email have been sent" + +      assert_email_sent( +        to: {user2.name, user2.email}, +        html_body: ~r/new mentions:/i +      ) +    end +  end +end diff --git a/test/notification_test.exs b/test/notification_test.exs index c88ac54bd..80ea2a085 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -4,13 +4,15 @@  defmodule Pleroma.NotificationTest do    use Pleroma.DataCase + +  import Pleroma.Factory +    alias Pleroma.Notification    alias Pleroma.User    alias Pleroma.Web.ActivityPub.Transmogrifier    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.Streamer    alias Pleroma.Web.TwitterAPI.TwitterAPI -  import Pleroma.Factory    describe "create_notifications" do      test "notifies someone when they are directly addressed" do @@ -352,6 +354,51 @@ defmodule Pleroma.NotificationTest do      end    end +  describe "for_user_since/2" do +    defp days_ago(days) do +      NaiveDateTime.add( +        NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second), +        -days * 60 * 60 * 24, +        :second +      ) +    end + +    test "Returns recent notifications" do +      user1 = insert(:user) +      user2 = insert(:user) + +      Enum.each(0..10, fn i -> +        {:ok, _activity} = +          CommonAPI.post(user1, %{ +            "status" => "hey ##{i} @#{user2.nickname}!" +          }) +      end) + +      {old, new} = Enum.split(Notification.for_user(user2), 5) + +      Enum.each(old, fn notification -> +        notification +        |> cast(%{updated_at: days_ago(10)}, [:updated_at]) +        |> Pleroma.Repo.update!() +      end) + +      recent_notifications_ids = +        user2 +        |> Notification.for_user_since( +          NaiveDateTime.add(NaiveDateTime.utc_now(), -5 * 86_400, :second) +        ) +        |> Enum.map(& &1.id) + +      Enum.each(old, fn %{id: id} -> +        refute id in recent_notifications_ids +      end) + +      Enum.each(new, fn %{id: id} -> +        assert id in recent_notifications_ids +      end) +    end +  end +    describe "notification target determination" do      test "it sends notifications to addressed users in new messages" do        user = insert(:user) diff --git a/test/support/builders/user_builder.ex b/test/support/builders/user_builder.ex index f58e1b0ad..6da16f71a 100644 --- a/test/support/builders/user_builder.ex +++ b/test/support/builders/user_builder.ex @@ -9,7 +9,8 @@ defmodule Pleroma.Builders.UserBuilder do        nickname: "testname",        password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),        bio: "A tester.", -      ap_id: "some id" +      ap_id: "some id", +      last_digest_emailed_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)      }      Map.merge(user, data) diff --git a/test/support/factory.ex b/test/support/factory.ex index c751546ce..9ef1b789c 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}"), -      info: %{} +      info: %{}, +      last_digest_emailed_at: NaiveDateTime.utc_now()      }      %{ diff --git a/test/user_info_test.exs b/test/user_info_test.exs new file mode 100644 index 000000000..2d795594e --- /dev/null +++ b/test/user_info_test.exs @@ -0,0 +1,24 @@ +defmodule Pleroma.UserInfoTest do +  alias Pleroma.Repo +  alias Pleroma.User.Info + +  use Pleroma.DataCase + +  import Pleroma.Factory + +  describe "update_email_notifications/2" do +    setup do +      user = insert(:user, %{info: %{email_notifications: %{"digest" => true}}}) + +      {:ok, user: user} +    end + +    test "Notifications are updated", %{user: user} do +      true = user.info.email_notifications["digest"] +      changeset = Info.update_email_notifications(user.info, %{"digest" => false}) +      assert changeset.valid? +      {:ok, result} = Ecto.Changeset.apply_action(changeset, :insert) +      assert result.email_notifications["digest"] == false +    end +  end +end diff --git a/test/user_search_test.exs b/test/user_search_test.exs index 4de6c82a5..48ce973ad 100644 --- a/test/user_search_test.exs +++ b/test/user_search_test.exs @@ -193,7 +193,14 @@ defmodule Pleroma.UserSearchTest do        user = User.get_cached_by_ap_id("http://mastodon.example.org/users/admin")        assert length(results) == 1 -      assert user == result |> Map.put(:search_rank, nil) |> Map.put(:search_type, nil) + +      expected = +        result +        |> Map.put(:search_rank, nil) +        |> Map.put(:search_type, nil) +        |> Map.put(:last_digest_emailed_at, nil) + +      assert user == expected      end      test "excludes a blocked users from search result" do diff --git a/test/user_test.exs b/test/user_test.exs index 7ec241c25..8440d456d 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -1237,6 +1237,109 @@ defmodule Pleroma.UserTest do      assert Map.get(user_show, "followers_count") == 2    end +  describe "list_inactive_users_query/1" do +    defp days_ago(days) do +      NaiveDateTime.add( +        NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second), +        -days * 60 * 60 * 24, +        :second +      ) +    end + +    test "Users are inactive by default" do +      total = 10 + +      users = +        Enum.map(1..total, fn _ -> +          insert(:user, last_digest_emailed_at: days_ago(20), info: %{deactivated: false}) +        end) + +      inactive_users_ids = +        Pleroma.User.list_inactive_users_query() +        |> Pleroma.Repo.all() +        |> Enum.map(& &1.id) + +      Enum.each(users, fn user -> +        assert user.id in inactive_users_ids +      end) +    end + +    test "Only includes users who has no recent activity" do +      total = 10 + +      users = +        Enum.map(1..total, fn _ -> +          insert(:user, last_digest_emailed_at: days_ago(20), info: %{deactivated: false}) +        end) + +      {inactive, active} = Enum.split(users, trunc(total / 2)) + +      Enum.map(active, fn user -> +        to = Enum.random(users -- [user]) + +        {:ok, _} = +          Pleroma.Web.TwitterAPI.TwitterAPI.create_status(user, %{ +            "status" => "hey @#{to.nickname}" +          }) +      end) + +      inactive_users_ids = +        Pleroma.User.list_inactive_users_query() +        |> Pleroma.Repo.all() +        |> Enum.map(& &1.id) + +      Enum.each(active, fn user -> +        refute user.id in inactive_users_ids +      end) + +      Enum.each(inactive, fn user -> +        assert user.id in inactive_users_ids +      end) +    end + +    test "Only includes users with no read notifications" do +      total = 10 + +      users = +        Enum.map(1..total, fn _ -> +          insert(:user, last_digest_emailed_at: days_ago(20), info: %{deactivated: false}) +        end) + +      [sender | recipients] = users +      {inactive, active} = Enum.split(recipients, trunc(total / 2)) + +      Enum.each(recipients, fn to -> +        {:ok, _} = +          Pleroma.Web.TwitterAPI.TwitterAPI.create_status(sender, %{ +            "status" => "hey @#{to.nickname}" +          }) + +        {:ok, _} = +          Pleroma.Web.TwitterAPI.TwitterAPI.create_status(sender, %{ +            "status" => "hey again @#{to.nickname}" +          }) +      end) + +      Enum.each(active, fn user -> +        [n1, _n2] = Pleroma.Notification.for_user(user) +        {:ok, _} = Pleroma.Notification.read_one(user, n1.id) +      end) + +      inactive_users_ids = +        Pleroma.User.list_inactive_users_query() +        |> Pleroma.Repo.all() +        |> Enum.map(& &1.id) + +      Enum.each(active, fn user -> +        refute user.id in inactive_users_ids +      end) + +      Enum.each(inactive, fn user -> +        assert user.id in inactive_users_ids +      end) +    end +  end +    describe "toggle_confirmation/1" do      test "if user is confirmed" do        user = insert(:user, info: %{confirmation_pending: false})  | 
