diff options
Diffstat (limited to 'test')
37 files changed, 1627 insertions, 563 deletions
| diff --git a/test/bookmark_test.exs b/test/bookmark_test.exs new file mode 100644 index 000000000..b81c102ef --- /dev/null +++ b/test/bookmark_test.exs @@ -0,0 +1,52 @@ +defmodule Pleroma.BookmarkTest do +  use Pleroma.DataCase +  import Pleroma.Factory +  alias Pleroma.Bookmark +  alias Pleroma.Web.CommonAPI + +  describe "create/2" do +    test "with valid params" do +      user = insert(:user) +      {:ok, activity} = CommonAPI.post(user, %{"status" => "Some cool information"}) +      {:ok, bookmark} = Bookmark.create(user.id, activity.id) +      assert bookmark.user_id == user.id +      assert bookmark.activity_id == activity.id +    end + +    test "with invalid params" do +      {:error, changeset} = Bookmark.create(nil, "") +      refute changeset.valid? + +      assert changeset.errors == [ +               user_id: {"can't be blank", [validation: :required]}, +               activity_id: {"can't be blank", [validation: :required]} +             ] +    end +  end + +  describe "destroy/2" do +    test "with valid params" do +      user = insert(:user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "Some cool information"}) +      {:ok, _bookmark} = Bookmark.create(user.id, activity.id) + +      {:ok, _deleted_bookmark} = Bookmark.destroy(user.id, activity.id) +    end +  end + +  describe "get/2" do +    test "gets a bookmark" do +      user = insert(:user) + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => +            "Scientists Discover The Secret Behind Tenshi Eating A Corndog Being So Cute – Science Daily" +        }) + +      {:ok, bookmark} = Bookmark.create(user.id, activity.id) +      assert bookmark == Bookmark.get(user.id, activity.id) +    end +  end +end diff --git a/test/emoji_test.exs b/test/emoji_test.exs index cb1d62d00..2eaa26be6 100644 --- a/test/emoji_test.exs +++ b/test/emoji_test.exs @@ -15,7 +15,7 @@ defmodule Pleroma.EmojiTest do        assert tuple_size(emoji) == 3        assert is_binary(code)        assert is_binary(path) -      assert is_binary(tags) +      assert is_list(tags)      end      test "random emoji", %{emoji_list: emoji_list} do @@ -25,7 +25,7 @@ defmodule Pleroma.EmojiTest do        assert tuple_size(emoji) == 3        assert is_binary(code)        assert is_binary(path) -      assert is_binary(tags) +      assert is_list(tags)      end    end diff --git a/test/formatter_test.exs b/test/formatter_test.exs index e74985c4e..fdaf29742 100644 --- a/test/formatter_test.exs +++ b/test/formatter_test.exs @@ -147,7 +147,7 @@ defmodule Pleroma.FormatterTest do      end      test "gives a replacement for user links when the user is using Osada" do -      mike = User.get_or_fetch("mike@osada.macgirvin.com") +      {:ok, mike} = User.get_or_fetch("mike@osada.macgirvin.com")        text = "@mike@osada.macgirvin.com test" @@ -245,10 +245,10 @@ defmodule Pleroma.FormatterTest do    end    test "it adds cool emoji" do -    text = "I love :moominmamma:" +    text = "I love :firefox:"      expected_result = -      "I love <img height=\"32px\" width=\"32px\" alt=\"moominmamma\" title=\"moominmamma\" src=\"/finmoji/128px/moominmamma-128.png\" />" +      "I love <img height=\"32px\" width=\"32px\" alt=\"firefox\" title=\"firefox\" src=\"/emoji/Firefox.gif\" />"      assert Formatter.emojify(text) == expected_result    end @@ -269,10 +269,10 @@ defmodule Pleroma.FormatterTest do    end    test "it returns the emoji used in the text" do -    text = "I love :moominmamma:" +    text = "I love :firefox:"      assert Formatter.get_emoji(text) == [ -             {"moominmamma", "/finmoji/128px/moominmamma-128.png", "Finmoji"} +             {"firefox", "/emoji/Firefox.gif", ["Gif", "Fun"]}             ]    end diff --git a/test/healthcheck_test.exs b/test/healthcheck_test.exs new file mode 100644 index 000000000..e05061220 --- /dev/null +++ b/test/healthcheck_test.exs @@ -0,0 +1,22 @@ +defmodule Pleroma.HealthcheckTest do +  use Pleroma.DataCase +  alias Pleroma.Healthcheck + +  test "system_info/0" do +    result = Healthcheck.system_info() |> Map.from_struct() + +    assert Map.keys(result) == [:active, :healthy, :idle, :memory_used, :pool_size] +  end + +  describe "check_health/1" do +    test "pool size equals active connections" do +      result = Healthcheck.check_health(%Healthcheck{pool_size: 10, active: 10}) +      refute result.healthy +    end + +    test "chech_health/1" do +      result = Healthcheck.check_health(%Healthcheck{pool_size: 10, active: 9}) +      assert result.healthy +    end +  end +end diff --git a/test/html_test.exs b/test/html_test.exs index 0b5d3d892..08738276e 100644 --- a/test/html_test.exs +++ b/test/html_test.exs @@ -20,6 +20,18 @@ defmodule Pleroma.HTMLTest do      <img src="http://example.com/image.jpg" onerror="alert('hacked')">    """ +  @html_span_class_sample """ +    <span class="animate-spin">hi</span> +  """ + +  @html_span_microformats_sample """ +    <span class="h-card"><a class="u-url mention">@<span>foo</span></a></span> +  """ + +  @html_span_invalid_microformats_sample """ +    <span class="h-card"><a class="u-url mention animate-spin">@<span>foo</span></a></span> +  """ +    describe "StripTags scrubber" do      test "works as expected" do        expected = """ @@ -64,6 +76,36 @@ defmodule Pleroma.HTMLTest do        assert expected == HTML.filter_tags(@html_onerror_sample, Pleroma.HTML.Scrubber.TwitterText)      end + +    test "does not allow spans with invalid classes" do +      expected = """ +      <span>hi</span> +      """ + +      assert expected == +               HTML.filter_tags(@html_span_class_sample, Pleroma.HTML.Scrubber.TwitterText) +    end + +    test "does allow microformats" do +      expected = """ +      <span class="h-card"><a class="u-url mention">@<span>foo</span></a></span> +      """ + +      assert expected == +               HTML.filter_tags(@html_span_microformats_sample, Pleroma.HTML.Scrubber.TwitterText) +    end + +    test "filters invalid microformats markup" do +      expected = """ +      <span class="h-card"><a>@<span>foo</span></a></span> +      """ + +      assert expected == +               HTML.filter_tags( +                 @html_span_invalid_microformats_sample, +                 Pleroma.HTML.Scrubber.TwitterText +               ) +    end    end    describe "default scrubber" do @@ -88,5 +130,34 @@ defmodule Pleroma.HTMLTest do        assert expected == HTML.filter_tags(@html_onerror_sample, Pleroma.HTML.Scrubber.Default)      end + +    test "does not allow spans with invalid classes" do +      expected = """ +      <span>hi</span> +      """ + +      assert expected == HTML.filter_tags(@html_span_class_sample, Pleroma.HTML.Scrubber.Default) +    end + +    test "does allow microformats" do +      expected = """ +      <span class="h-card"><a class="u-url mention">@<span>foo</span></a></span> +      """ + +      assert expected == +               HTML.filter_tags(@html_span_microformats_sample, Pleroma.HTML.Scrubber.Default) +    end + +    test "filters invalid microformats markup" do +      expected = """ +      <span class="h-card"><a>@<span>foo</span></a></span> +      """ + +      assert expected == +               HTML.filter_tags( +                 @html_span_invalid_microformats_sample, +                 Pleroma.HTML.Scrubber.Default +               ) +    end    end  end diff --git a/test/media_proxy_test.exs b/test/media_proxy_test.exs index ddbadfbf5..a4331478e 100644 --- a/test/media_proxy_test.exs +++ b/test/media_proxy_test.exs @@ -177,4 +177,13 @@ defmodule Pleroma.MediaProxyTest do      {:ok, decoded} = decode_url(sig, base64)      decoded    end + +  test "mediaproxy whitelist" do +    Pleroma.Config.put([:media_proxy, :enabled], true) +    Pleroma.Config.put([:media_proxy, :whitelist], ["google.com", "feld.me"]) +    url = "https://feld.me/foo.png" + +    unencoded = url(url) +    assert unencoded == url +  end  end diff --git a/test/notification_test.exs b/test/notification_test.exs index c3db77b6c..581db58a8 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -46,7 +46,7 @@ defmodule Pleroma.NotificationTest do    describe "create_notification" do      test "it doesn't create a notification for user if the user blocks the activity author" do        activity = insert(:note_activity) -      author = User.get_by_ap_id(activity.data["actor"]) +      author = User.get_cached_by_ap_id(activity.data["actor"])        user = insert(:user)        {:ok, user} = User.block(user, author) @@ -124,7 +124,7 @@ defmodule Pleroma.NotificationTest do      test "it doesn't create a notification for user if he is the activity author" do        activity = insert(:note_activity) -      author = User.get_by_ap_id(activity.data["actor"]) +      author = User.get_cached_by_ap_id(activity.data["actor"])        assert nil == Notification.create_notification(activity, author)      end diff --git a/test/object/containment_test.exs b/test/object/containment_test.exs new file mode 100644 index 000000000..452064093 --- /dev/null +++ b/test/object/containment_test.exs @@ -0,0 +1,58 @@ +defmodule Pleroma.Object.ContainmentTest do +  use Pleroma.DataCase + +  alias Pleroma.Object.Containment +  alias Pleroma.User + +  import Pleroma.Factory + +  describe "general origin containment" do +    test "contain_origin_from_id() catches obvious spoofing attempts" do +      data = %{ +        "id" => "http://example.com/~alyssa/activities/1234.json" +      } + +      :error = +        Containment.contain_origin_from_id( +          "http://example.org/~alyssa/activities/1234.json", +          data +        ) +    end + +    test "contain_origin_from_id() allows alternate IDs within the same origin domain" do +      data = %{ +        "id" => "http://example.com/~alyssa/activities/1234.json" +      } + +      :ok = +        Containment.contain_origin_from_id( +          "http://example.com/~alyssa/activities/1234", +          data +        ) +    end + +    test "contain_origin_from_id() allows matching IDs" do +      data = %{ +        "id" => "http://example.com/~alyssa/activities/1234.json" +      } + +      :ok = +        Containment.contain_origin_from_id( +          "http://example.com/~alyssa/activities/1234.json", +          data +        ) +    end + +    test "users cannot be collided through fake direction spoofing attempts" do +      _user = +        insert(:user, %{ +          nickname: "rye@niu.moe", +          local: false, +          ap_id: "https://niu.moe/users/rye", +          follower_address: User.ap_followers(%User{nickname: "rye@niu.moe"}) +        }) + +      {:error, _} = User.get_or_fetch_by_ap_id("https://n1u.moe/users/rye") +    end +  end +end diff --git a/test/object/fetcher_test.exs b/test/object/fetcher_test.exs new file mode 100644 index 000000000..72f616782 --- /dev/null +++ b/test/object/fetcher_test.exs @@ -0,0 +1,90 @@ +defmodule Pleroma.Object.FetcherTest do +  use Pleroma.DataCase + +  alias Pleroma.Activity +  alias Pleroma.Object +  alias Pleroma.Object.Fetcher +  import Tesla.Mock + +  setup do +    mock(fn env -> apply(HttpRequestMock, :request, [env]) end) +    :ok +  end + +  describe "actor origin containment" do +    test "it rejects objects with a bogus origin" do +      {:error, _} = Fetcher.fetch_object_from_id("https://info.pleroma.site/activity.json") +    end + +    test "it rejects objects when attributedTo is wrong (variant 1)" do +      {:error, _} = Fetcher.fetch_object_from_id("https://info.pleroma.site/activity2.json") +    end + +    test "it rejects objects when attributedTo is wrong (variant 2)" do +      {:error, _} = Fetcher.fetch_object_from_id("https://info.pleroma.site/activity3.json") +    end +  end + +  describe "fetching an object" do +    test "it fetches an object" do +      {:ok, object} = +        Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") + +      assert activity = Activity.get_create_by_object_ap_id(object.data["id"]) +      assert activity.data["id"] + +      {:ok, object_again} = +        Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") + +      assert [attachment] = object.data["attachment"] +      assert is_list(attachment["url"]) + +      assert object == object_again +    end + +    test "it works with objects only available via Ostatus" do +      {:ok, object} = Fetcher.fetch_object_from_id("https://shitposter.club/notice/2827873") +      assert activity = Activity.get_create_by_object_ap_id(object.data["id"]) +      assert activity.data["id"] + +      {:ok, object_again} = Fetcher.fetch_object_from_id("https://shitposter.club/notice/2827873") + +      assert object == object_again +    end + +    test "it correctly stitches up conversations between ostatus and ap" do +      last = "https://mstdn.io/users/mayuutann/statuses/99568293732299394" +      {:ok, object} = Fetcher.fetch_object_from_id(last) + +      object = Object.get_by_ap_id(object.data["inReplyTo"]) +      assert object +    end +  end + +  describe "implementation quirks" do +    test "it can fetch plume articles" do +      {:ok, object} = +        Fetcher.fetch_object_from_id( +          "https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/" +        ) + +      assert object +    end + +    test "it can fetch peertube videos" do +      {:ok, object} = +        Fetcher.fetch_object_from_id( +          "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3" +        ) + +      assert object +    end + +    test "all objects with fake directions are rejected by the object fetcher" do +      {:error, _} = +        Fetcher.fetch_and_contain_remote_object_from_id( +          "https://info.pleroma.site/activity4.json" +        ) +    end +  end +end diff --git a/test/object_test.exs b/test/object_test.exs index 911757d57..d138ee091 100644 --- a/test/object_test.exs +++ b/test/object_test.exs @@ -5,9 +5,15 @@  defmodule Pleroma.ObjectTest do    use Pleroma.DataCase    import Pleroma.Factory +  import Tesla.Mock    alias Pleroma.Object    alias Pleroma.Repo +  setup do +    mock(fn env -> apply(HttpRequestMock, :request, [env]) end) +    :ok +  end +    test "returns an object by it's AP id" do      object = insert(:note)      found_object = Object.get_by_ap_id(object.data["id"]) @@ -58,4 +64,26 @@ defmodule Pleroma.ObjectTest do        assert cached_object.data["type"] == "Tombstone"      end    end + +  describe "normalizer" do +    test "fetches unknown objects by default" do +      %Object{} = +        object = Object.normalize("http://mastodon.example.org/@admin/99541947525187367") + +      assert object.data["url"] == "http://mastodon.example.org/@admin/99541947525187367" +    end + +    test "fetches unknown objects when fetch_remote is explicitly true" do +      %Object{} = +        object = Object.normalize("http://mastodon.example.org/@admin/99541947525187367", true) + +      assert object.data["url"] == "http://mastodon.example.org/@admin/99541947525187367" +    end + +    test "does not fetch unknown objects when fetch_remote is false" do +      assert is_nil( +               Object.normalize("http://mastodon.example.org/@admin/99541947525187367", false) +             ) +    end +  end  end diff --git a/test/scheduled_activity_worker_test.exs b/test/scheduled_activity_worker_test.exs index b9c91dda6..e3ad1244e 100644 --- a/test/scheduled_activity_worker_test.exs +++ b/test/scheduled_activity_worker_test.exs @@ -14,6 +14,6 @@ defmodule Pleroma.ScheduledActivityWorkerTest do      refute Repo.get(ScheduledActivity, scheduled_activity.id)      activity = Repo.all(Pleroma.Activity) |> Enum.find(&(&1.actor == user.ap_id)) -    assert activity.data["object"]["content"] == "hi" +    assert Pleroma.Object.normalize(activity).data["content"] == "hi"    end  end diff --git a/test/tasks/instance.exs b/test/tasks/instance.exs new file mode 100644 index 000000000..6917a2376 --- /dev/null +++ b/test/tasks/instance.exs @@ -0,0 +1,62 @@ +defmodule Pleroma.InstanceTest do +  use ExUnit.Case, async: true + +  setup do +    File.mkdir_p!(tmp_path()) +    on_exit(fn -> File.rm_rf(tmp_path()) end) +    :ok +  end + +  defp tmp_path do +    "/tmp/generated_files/" +  end + +  test "running gen" do +    mix_task = fn -> +      Mix.Tasks.Pleroma.Instance.run([ +        "gen", +        "--output", +        tmp_path() <> "generated_config.exs", +        "--output-psql", +        tmp_path() <> "setup.psql", +        "--domain", +        "test.pleroma.social", +        "--instance-name", +        "Pleroma", +        "--admin-email", +        "admin@example.com", +        "--notify-email", +        "notify@example.com", +        "--dbhost", +        "dbhost", +        "--dbname", +        "dbname", +        "--dbuser", +        "dbuser", +        "--dbpass", +        "dbpass", +        "--indexable", +        "y" +      ]) +    end + +    ExUnit.CaptureIO.capture_io(fn -> +      mix_task.() +    end) + +    generated_config = File.read!(tmp_path() <> "generated_config.exs") +    assert generated_config =~ "host: \"test.pleroma.social\"" +    assert generated_config =~ "name: \"Pleroma\"" +    assert generated_config =~ "email: \"admin@example.com\"" +    assert generated_config =~ "notify_email: \"notify@example.com\"" +    assert generated_config =~ "hostname: \"dbhost\"" +    assert generated_config =~ "database: \"dbname\"" +    assert generated_config =~ "username: \"dbuser\"" +    assert generated_config =~ "password: \"dbpass\"" +    assert File.read!(tmp_path() <> "setup.psql") == generated_setup_psql() +  end + +  defp generated_setup_psql do +    ~s(CREATE USER dbuser WITH ENCRYPTED PASSWORD 'dbpass';\nCREATE DATABASE dbname OWNER dbuser;\n\\c dbname;\n--Extensions made by ecto.migrate that need superuser access\nCREATE EXTENSION IF NOT EXISTS citext;\nCREATE EXTENSION IF NOT EXISTS pg_trgm;\nCREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";\n) +  end +end diff --git a/test/tasks/relay_test.exs b/test/tasks/relay_test.exs index 535dc3756..9d260da3e 100644 --- a/test/tasks/relay_test.exs +++ b/test/tasks/relay_test.exs @@ -31,7 +31,7 @@ defmodule Mix.Tasks.Pleroma.RelayTest do        local_user = Relay.get_actor()        assert local_user.ap_id =~ "/relay" -      target_user = User.get_by_ap_id(target_instance) +      target_user = User.get_cached_by_ap_id(target_instance)        refute target_user.local        activity = Utils.fetch_latest_follow(local_user, target_user) @@ -48,7 +48,7 @@ defmodule Mix.Tasks.Pleroma.RelayTest do        Mix.Tasks.Pleroma.Relay.run(["follow", target_instance])        %User{ap_id: follower_id} = local_user = Relay.get_actor() -      target_user = User.get_by_ap_id(target_instance) +      target_user = User.get_cached_by_ap_id(target_instance)        follow_activity = Utils.fetch_latest_follow(local_user, target_user)        Mix.Tasks.Pleroma.Relay.run(["unfollow", target_instance]) diff --git a/test/tasks/user_test.exs b/test/tasks/user_test.exs index 242265da5..eaf4ecf84 100644 --- a/test/tasks/user_test.exs +++ b/test/tasks/user_test.exs @@ -50,7 +50,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert_received {:mix_shell, :info, [message]}        assert message =~ "created" -      user = User.get_by_nickname(unsaved.nickname) +      user = User.get_cached_by_nickname(unsaved.nickname)        assert user.name == unsaved.name        assert user.email == unsaved.email        assert user.bio == unsaved.bio @@ -75,7 +75,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert_received {:mix_shell, :info, [message]}        assert message =~ "will not be created" -      refute User.get_by_nickname(unsaved.nickname) +      refute User.get_cached_by_nickname(unsaved.nickname)      end    end @@ -88,7 +88,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert_received {:mix_shell, :info, [message]}        assert message =~ " deleted" -      user = User.get_by_nickname(user.nickname) +      user = User.get_cached_by_nickname(user.nickname)        assert user.info.deactivated      end @@ -109,7 +109,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert_received {:mix_shell, :info, [message]}        assert message =~ " deactivated" -      user = User.get_by_nickname(user.nickname) +      user = User.get_cached_by_nickname(user.nickname)        assert user.info.deactivated      end @@ -121,7 +121,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert_received {:mix_shell, :info, [message]}        assert message =~ " activated" -      user = User.get_by_nickname(user.nickname) +      user = User.get_cached_by_nickname(user.nickname)        refute user.info.deactivated      end @@ -150,7 +150,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert_received {:mix_shell, :info, [message]}        assert message =~ "Successfully unsubscribed" -      user = User.get_by_nickname(user.nickname) +      user = User.get_cached_by_nickname(user.nickname)        assert Enum.empty?(user.following)        assert user.info.deactivated      end @@ -178,7 +178,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert_received {:mix_shell, :info, [message]}        assert message =~ ~r/Admin status .* true/ -      user = User.get_by_nickname(user.nickname) +      user = User.get_cached_by_nickname(user.nickname)        assert user.info.is_moderator        assert user.info.locked        assert user.info.is_admin @@ -204,7 +204,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do        assert_received {:mix_shell, :info, [message]}        assert message =~ ~r/Admin status .* false/ -      user = User.get_by_nickname(user.nickname) +      user = User.get_cached_by_nickname(user.nickname)        refute user.info.is_moderator        refute user.info.locked        refute user.info.is_admin diff --git a/test/user_test.exs b/test/user_test.exs index d2167a970..67266cb7a 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -5,6 +5,7 @@  defmodule Pleroma.UserTest do    alias Pleroma.Activity    alias Pleroma.Builders.UserBuilder +  alias Pleroma.Object    alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.CommonAPI @@ -122,9 +123,9 @@ defmodule Pleroma.UserTest do      {:ok, user} = User.follow(user, followed) -    user = User.get_by_id(user.id) +    user = User.get_cached_by_id(user.id) -    followed = User.get_by_ap_id(followed.ap_id) +    followed = User.get_cached_by_ap_id(followed.ap_id)      assert followed.info.follower_count == 1      assert User.ap_followers(followed) in user.following @@ -187,7 +188,7 @@ defmodule Pleroma.UserTest do      {:ok, user, _activity} = User.unfollow(user, followed) -    user = User.get_by_id(user.id) +    user = User.get_cached_by_id(user.id)      assert user.following == []    end @@ -197,7 +198,7 @@ defmodule Pleroma.UserTest do      {:error, _} = User.unfollow(user, user) -    user = User.get_by_id(user.id) +    user = User.get_cached_by_id(user.id)      assert user.following == [user.ap_id]    end @@ -256,7 +257,7 @@ defmodule Pleroma.UserTest do        activity = Repo.one(Pleroma.Activity)        assert registered_user.ap_id in activity.recipients -      assert activity.data["object"]["content"] =~ "cool site" +      assert Object.normalize(activity).data["content"] =~ "cool site"        assert activity.actor == welcome_user.ap_id        Pleroma.Config.put([:instance, :welcome_user_nickname], nil) @@ -361,7 +362,7 @@ defmodule Pleroma.UserTest do    describe "get_or_fetch/1" do      test "gets an existing user by nickname" do        user = insert(:user) -      fetched_user = User.get_or_fetch(user.nickname) +      {:ok, fetched_user} = User.get_or_fetch(user.nickname)        assert user == fetched_user      end @@ -378,7 +379,7 @@ defmodule Pleroma.UserTest do            info: %{}          ) -      fetched_user = User.get_or_fetch(ap_id) +      {:ok, fetched_user} = User.get_or_fetch(ap_id)        freshed_user = refresh_record(user)        assert freshed_user == fetched_user      end @@ -387,14 +388,14 @@ defmodule Pleroma.UserTest do    describe "fetching a user from nickname or trying to build one" do      test "gets an existing user" do        user = insert(:user) -      fetched_user = User.get_or_fetch_by_nickname(user.nickname) +      {:ok, fetched_user} = User.get_or_fetch_by_nickname(user.nickname)        assert user == fetched_user      end      test "gets an existing user, case insensitive" do        user = insert(:user, nickname: "nick") -      fetched_user = User.get_or_fetch_by_nickname("NICK") +      {:ok, fetched_user} = User.get_or_fetch_by_nickname("NICK")        assert user == fetched_user      end @@ -402,7 +403,7 @@ defmodule Pleroma.UserTest do      test "gets an existing user by fully qualified nickname" do        user = insert(:user) -      fetched_user = +      {:ok, fetched_user} =          User.get_or_fetch_by_nickname(user.nickname <> "@" <> Pleroma.Web.Endpoint.host())        assert user == fetched_user @@ -412,24 +413,24 @@ defmodule Pleroma.UserTest do        user = insert(:user, nickname: "nick")        casing_altered_fqn = String.upcase(user.nickname <> "@" <> Pleroma.Web.Endpoint.host()) -      fetched_user = User.get_or_fetch_by_nickname(casing_altered_fqn) +      {:ok, fetched_user} = User.get_or_fetch_by_nickname(casing_altered_fqn)        assert user == fetched_user      end      test "fetches an external user via ostatus if no user exists" do -      fetched_user = User.get_or_fetch_by_nickname("shp@social.heldscal.la") +      {:ok, fetched_user} = User.get_or_fetch_by_nickname("shp@social.heldscal.la")        assert fetched_user.nickname == "shp@social.heldscal.la"      end      test "returns nil if no user could be fetched" do -      fetched_user = User.get_or_fetch_by_nickname("nonexistant@social.heldscal.la") -      assert fetched_user == nil +      {:error, fetched_user} = User.get_or_fetch_by_nickname("nonexistant@social.heldscal.la") +      assert fetched_user == "not found nonexistant@social.heldscal.la"      end      test "returns nil for nonexistant local user" do -      fetched_user = User.get_or_fetch_by_nickname("nonexistant") -      assert fetched_user == nil +      {:error, fetched_user} = User.get_or_fetch_by_nickname("nonexistant") +      assert fetched_user == "not found nonexistant"      end      test "updates an existing user, if stale" do @@ -447,7 +448,7 @@ defmodule Pleroma.UserTest do        assert orig_user.last_refreshed_at == a_week_ago -      user = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin") +      {:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin")        assert user.info.source_data["endpoints"]        refute user.last_refreshed_at == orig_user.last_refreshed_at @@ -555,8 +556,8 @@ defmodule Pleroma.UserTest do        {:ok, res} = User.get_friends(user) -      followed_one = User.get_by_ap_id(followed_one.ap_id) -      followed_two = User.get_by_ap_id(followed_two.ap_id) +      followed_one = User.get_cached_by_ap_id(followed_one.ap_id) +      followed_two = User.get_cached_by_ap_id(followed_two.ap_id)        assert Enum.member?(res, followed_one)        assert Enum.member?(res, followed_two)        refute Enum.member?(res, not_followed) @@ -567,7 +568,7 @@ defmodule Pleroma.UserTest do      test "it sets the info->note_count property" do        note = insert(:note) -      user = User.get_by_ap_id(note.data["actor"]) +      user = User.get_cached_by_ap_id(note.data["actor"])        assert user.info.note_count == 0 @@ -578,7 +579,7 @@ defmodule Pleroma.UserTest do      test "it increases the info->note_count property" do        note = insert(:note) -      user = User.get_by_ap_id(note.data["actor"]) +      user = User.get_cached_by_ap_id(note.data["actor"])        assert user.info.note_count == 0 @@ -593,7 +594,7 @@ defmodule Pleroma.UserTest do      test "it decreases the info->note_count property" do        note = insert(:note) -      user = User.get_by_ap_id(note.data["actor"]) +      user = User.get_cached_by_ap_id(note.data["actor"])        assert user.info.note_count == 0 @@ -695,7 +696,7 @@ defmodule Pleroma.UserTest do        assert User.following?(blocked, blocker)        {:ok, blocker} = User.block(blocker, blocked) -      blocked = User.get_by_id(blocked.id) +      blocked = User.get_cached_by_id(blocked.id)        assert User.blocks?(blocker, blocked) @@ -713,7 +714,7 @@ defmodule Pleroma.UserTest do        refute User.following?(blocked, blocker)        {:ok, blocker} = User.block(blocker, blocked) -      blocked = User.get_by_id(blocked.id) +      blocked = User.get_cached_by_id(blocked.id)        assert User.blocks?(blocker, blocked) @@ -731,7 +732,7 @@ defmodule Pleroma.UserTest do        assert User.following?(blocked, blocker)        {:ok, blocker} = User.block(blocker, blocked) -      blocked = User.get_by_id(blocked.id) +      blocked = User.get_cached_by_id(blocked.id)        assert User.blocks?(blocker, blocked) @@ -851,9 +852,9 @@ defmodule Pleroma.UserTest do      {:ok, _} = User.delete(user) -    followed = User.get_by_id(followed.id) -    follower = User.get_by_id(follower.id) -    user = User.get_by_id(user.id) +    followed = User.get_cached_by_id(followed.id) +    follower = User.get_cached_by_id(follower.id) +    user = User.get_cached_by_id(user.id)      assert user.info.deactivated @@ -1007,7 +1008,7 @@ defmodule Pleroma.UserTest do        results = User.search("http://mastodon.example.org/users/admin", resolve: true)        result = results |> List.first() -      user = User.get_by_ap_id("http://mastodon.example.org/users/admin") +      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) @@ -1124,33 +1125,6 @@ defmodule Pleroma.UserTest do      end    end -  test "bookmarks" do -    user = insert(:user) - -    {:ok, activity1} = -      CommonAPI.post(user, %{ -        "status" => "heweoo!" -      }) - -    id1 = activity1.data["object"]["id"] - -    {:ok, activity2} = -      CommonAPI.post(user, %{ -        "status" => "heweoo!" -      }) - -    id2 = activity2.data["object"]["id"] - -    assert {:ok, user_state1} = User.bookmark(user, id1) -    assert user_state1.bookmarks == [id1] - -    assert {:ok, user_state2} = User.unbookmark(user, id1) -    assert user_state2.bookmarks == [] - -    assert {:ok, user_state3} = User.bookmark(user, id2) -    assert user_state3.bookmarks == [id2] -  end -    test "follower count is updated when a follower is blocked" do      user = insert(:user)      follower = insert(:user) diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index 8dd8e7e0a..30adfda36 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -50,7 +50,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do          |> put_req_header("accept", "application/json")          |> get("/users/#{user.nickname}") -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        assert json_response(conn, 200) == UserView.render("user.json", %{user: user})      end @@ -65,7 +65,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do          |> put_req_header("accept", "application/activity+json")          |> get("/users/#{user.nickname}") -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        assert json_response(conn, 200) == UserView.render("user.json", %{user: user})      end @@ -83,7 +83,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do          )          |> get("/users/#{user.nickname}") -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        assert json_response(conn, 200) == UserView.render("user.json", %{user: user})      end @@ -253,6 +253,36 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert Activity.get_by_ap_id(data["id"])      end +    test "it accepts messages from actors that are followed by the user", %{conn: conn} do +      recipient = insert(:user) +      actor = insert(:user, %{ap_id: "http://mastodon.example.org/users/actor"}) + +      {:ok, recipient} = User.follow(recipient, actor) + +      data = +        File.read!("test/fixtures/mastodon-post-activity.json") +        |> Poison.decode!() + +      object = +        data["object"] +        |> Map.put("attributedTo", actor.ap_id) + +      data = +        data +        |> Map.put("actor", actor.ap_id) +        |> Map.put("object", object) + +      conn = +        conn +        |> assign(:valid_signature, true) +        |> put_req_header("content-type", "application/activity+json") +        |> post("/users/#{recipient.nickname}/inbox", data) + +      assert "ok" == json_response(conn, 200) +      :timer.sleep(500) +      assert Activity.get_by_ap_id(data["id"]) +    end +      test "it rejects reads from other users", %{conn: conn} do        user = insert(:user)        otheruser = insert(:user) @@ -542,7 +572,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        user = insert(:user)        Enum.each(1..15, fn _ -> -        user = User.get_by_id(user.id) +        user = User.get_cached_by_id(user.id)          other_user = insert(:user)          User.follow(user, other_user)        end) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 17fec05b1..f8e987e58 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -84,17 +84,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        {:ok, status_two} = CommonAPI.post(user, %{"status" => ". #essais"})        {:ok, status_three} = CommonAPI.post(user, %{"status" => ". #test #reject"}) -      fetch_one = ActivityPub.fetch_activities([], %{"tag" => "test"}) -      fetch_two = ActivityPub.fetch_activities([], %{"tag" => ["test", "essais"]}) +      fetch_one = ActivityPub.fetch_activities([], %{"type" => "Create", "tag" => "test"}) + +      fetch_two = +        ActivityPub.fetch_activities([], %{"type" => "Create", "tag" => ["test", "essais"]})        fetch_three =          ActivityPub.fetch_activities([], %{ +          "type" => "Create",            "tag" => ["test", "essais"],            "tag_reject" => ["reject"]          })        fetch_four =          ActivityPub.fetch_activities([], %{ +          "type" => "Create",            "tag" => ["test"],            "tag_all" => ["test", "reject"]          }) @@ -192,8 +196,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        }        {:ok, %Activity{} = activity} = ActivityPub.insert(data) -      assert is_binary(activity.data["object"]["id"]) -      assert %Object{} = Object.get_by_ap_id(activity.data["object"]["id"]) +      object = Object.normalize(activity.data["object"]) + +      assert is_binary(object.data["id"]) +      assert %Object{} = Object.get_by_ap_id(activity.data["object"])      end    end @@ -206,7 +212,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do            to: ["user1", "user1", "user2"],            actor: user,            context: "", -          object: %{} +          object: %{ +            "to" => ["user1", "user1", "user2"], +            "type" => "Note", +            "content" => "testing" +          }          })        assert activity.data["to"] == ["user1", "user2"] @@ -218,18 +228,30 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        user = insert(:user)        {:ok, _} = -        CommonAPI.post(User.get_by_id(user.id), %{"status" => "1", "visibility" => "public"}) +        CommonAPI.post(User.get_cached_by_id(user.id), %{ +          "status" => "1", +          "visibility" => "public" +        })        {:ok, _} = -        CommonAPI.post(User.get_by_id(user.id), %{"status" => "2", "visibility" => "unlisted"}) +        CommonAPI.post(User.get_cached_by_id(user.id), %{ +          "status" => "2", +          "visibility" => "unlisted" +        })        {:ok, _} = -        CommonAPI.post(User.get_by_id(user.id), %{"status" => "2", "visibility" => "private"}) +        CommonAPI.post(User.get_cached_by_id(user.id), %{ +          "status" => "2", +          "visibility" => "private" +        })        {:ok, _} = -        CommonAPI.post(User.get_by_id(user.id), %{"status" => "3", "visibility" => "direct"}) +        CommonAPI.post(User.get_cached_by_id(user.id), %{ +          "status" => "3", +          "visibility" => "direct" +        }) -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        assert user.info.note_count == 2      end @@ -244,25 +266,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        # public        {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "public"))        assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) -      assert data["object"]["repliesCount"] == 1        assert object.data["repliesCount"] == 1        # unlisted        {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "unlisted"))        assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) -      assert data["object"]["repliesCount"] == 2        assert object.data["repliesCount"] == 2        # private        {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "private"))        assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) -      assert data["object"]["repliesCount"] == 2        assert object.data["repliesCount"] == 2        # direct        {:ok, _} = CommonAPI.post(user2, Map.put(reply_data, "visibility", "direct"))        assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) -      assert data["object"]["repliesCount"] == 2        assert object.data["repliesCount"] == 2      end    end @@ -341,6 +359,51 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      assert Enum.member?(activities, activity_one)    end +  test "doesn't return transitive interactions concerning blocked users" do +    blocker = insert(:user) +    blockee = insert(:user) +    friend = insert(:user) + +    {:ok, blocker} = User.block(blocker, blockee) + +    {:ok, activity_one} = CommonAPI.post(friend, %{"status" => "hey!"}) + +    {:ok, activity_two} = CommonAPI.post(friend, %{"status" => "hey! @#{blockee.nickname}"}) + +    {:ok, activity_three} = CommonAPI.post(blockee, %{"status" => "hey! @#{friend.nickname}"}) + +    {:ok, activity_four} = CommonAPI.post(blockee, %{"status" => "hey! @#{blocker.nickname}"}) + +    activities = ActivityPub.fetch_activities([], %{"blocking_user" => blocker}) + +    assert Enum.member?(activities, activity_one) +    refute Enum.member?(activities, activity_two) +    refute Enum.member?(activities, activity_three) +    refute Enum.member?(activities, activity_four) +  end + +  test "doesn't return announce activities concerning blocked users" do +    blocker = insert(:user) +    blockee = insert(:user) +    friend = insert(:user) + +    {:ok, blocker} = User.block(blocker, blockee) + +    {:ok, activity_one} = CommonAPI.post(friend, %{"status" => "hey!"}) + +    {:ok, activity_two} = CommonAPI.post(blockee, %{"status" => "hey! @#{friend.nickname}"}) + +    {:ok, activity_three, _} = CommonAPI.repeat(activity_two.id, friend) + +    activities = +      ActivityPub.fetch_activities([], %{"blocking_user" => blocker}) +      |> Enum.map(fn act -> act.id end) + +    assert Enum.member?(activities, activity_one.id) +    refute Enum.member?(activities, activity_two.id) +    refute Enum.member?(activities, activity_three.id) +  end +    test "doesn't return muted activities" do      activity_one = insert(:note_activity)      activity_two = insert(:note_activity) @@ -635,40 +698,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      end    end -  describe "fetching an object" do -    test "it fetches an object" do -      {:ok, object} = -        ActivityPub.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") - -      assert activity = Activity.get_create_by_object_ap_id(object.data["id"]) -      assert activity.data["id"] - -      {:ok, object_again} = -        ActivityPub.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") - -      assert [attachment] = object.data["attachment"] -      assert is_list(attachment["url"]) - -      assert object == object_again -    end - -    test "it works with objects only available via Ostatus" do -      {:ok, object} = ActivityPub.fetch_object_from_id("https://shitposter.club/notice/2827873") -      assert activity = Activity.get_create_by_object_ap_id(object.data["id"]) -      assert activity.data["id"] - -      {:ok, object_again} = -        ActivityPub.fetch_object_from_id("https://shitposter.club/notice/2827873") - -      assert object == object_again -    end - -    test "it correctly stitches up conversations between ostatus and ap" do -      last = "https://mstdn.io/users/mayuutann/statuses/99568293732299394" -      {:ok, object} = ActivityPub.fetch_object_from_id(last) +  describe "fetch the latest Follow" do +    test "fetches the latest Follow activity" do +      %Activity{data: %{"type" => "Follow"}} = activity = insert(:follow_activity) +      follower = Repo.get_by(User, ap_id: activity.data["actor"]) +      followed = Repo.get_by(User, ap_id: activity.data["object"]) -      object = Object.get_by_ap_id(object.data["inReplyTo"]) -      assert object +      assert activity == Utils.fetch_latest_follow(follower, followed)      end    end @@ -748,23 +784,35 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        user = insert(:user, info: %{note_count: 10})        {:ok, a1} = -        CommonAPI.post(User.get_by_id(user.id), %{"status" => "yeah", "visibility" => "public"}) +        CommonAPI.post(User.get_cached_by_id(user.id), %{ +          "status" => "yeah", +          "visibility" => "public" +        })        {:ok, a2} = -        CommonAPI.post(User.get_by_id(user.id), %{"status" => "yeah", "visibility" => "unlisted"}) +        CommonAPI.post(User.get_cached_by_id(user.id), %{ +          "status" => "yeah", +          "visibility" => "unlisted" +        })        {:ok, a3} = -        CommonAPI.post(User.get_by_id(user.id), %{"status" => "yeah", "visibility" => "private"}) +        CommonAPI.post(User.get_cached_by_id(user.id), %{ +          "status" => "yeah", +          "visibility" => "private" +        })        {:ok, a4} = -        CommonAPI.post(User.get_by_id(user.id), %{"status" => "yeah", "visibility" => "direct"}) +        CommonAPI.post(User.get_cached_by_id(user.id), %{ +          "status" => "yeah", +          "visibility" => "direct" +        }) -      {:ok, _} = a1.data["object"]["id"] |> Object.get_by_ap_id() |> ActivityPub.delete() -      {:ok, _} = a2.data["object"]["id"] |> Object.get_by_ap_id() |> ActivityPub.delete() -      {:ok, _} = a3.data["object"]["id"] |> Object.get_by_ap_id() |> ActivityPub.delete() -      {:ok, _} = a4.data["object"]["id"] |> Object.get_by_ap_id() |> ActivityPub.delete() +      {:ok, _} = Object.normalize(a1) |> ActivityPub.delete() +      {:ok, _} = Object.normalize(a2) |> ActivityPub.delete() +      {:ok, _} = Object.normalize(a3) |> ActivityPub.delete() +      {:ok, _} = Object.normalize(a4) |> ActivityPub.delete() -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        assert user.info.note_count == 10      end @@ -804,22 +852,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        _ = CommonAPI.delete(direct_reply.id, user2)        assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) -      assert data["object"]["repliesCount"] == 2        assert object.data["repliesCount"] == 2        _ = CommonAPI.delete(private_reply.id, user2)        assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) -      assert data["object"]["repliesCount"] == 2        assert object.data["repliesCount"] == 2        _ = CommonAPI.delete(public_reply.id, user2)        assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) -      assert data["object"]["repliesCount"] == 1        assert object.data["repliesCount"] == 1        _ = CommonAPI.delete(unlisted_reply.id, user2)        assert %{data: data, object: object} = Activity.get_by_ap_id_with_object(ap_id) -      assert data["object"]["repliesCount"] == 0        assert object.data["repliesCount"] == 0      end    end @@ -861,7 +905,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        activities = ActivityPub.fetch_activities([user1.ap_id | user1.following])        private_activity_1 = Activity.get_by_ap_id_with_object(private_activity_1.data["id"]) -      assert [public_activity, private_activity_1, private_activity_3] == activities + +      assert [public_activity, private_activity_1, private_activity_3] == +               activities +        assert length(activities) == 3        activities = ActivityPub.contain_timeline(activities, user1) @@ -871,15 +918,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      end    end -  test "it can fetch plume articles" do -    {:ok, object} = -      ActivityPub.fetch_object_from_id( -        "https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/" -      ) - -    assert object -  end -    describe "update" do      test "it creates an update activity with the new user data" do        user = insert(:user) @@ -901,15 +939,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      end    end -  test "it can fetch peertube videos" do -    {:ok, object} = -      ActivityPub.fetch_object_from_id( -        "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3" -      ) - -    assert object -  end -    test "returned pinned statuses" do      Pleroma.Config.put([:instance, :max_pinned_statuses], 3)      user = insert(:user) diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 47cffe257..c24b50f8c 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    use Pleroma.DataCase    alias Pleroma.Activity    alias Pleroma.Object +  alias Pleroma.Object.Fetcher    alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub @@ -50,16 +51,14 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do          |> Map.put("object", object)        {:ok, returned_activity} = Transmogrifier.handle_incoming(data) +      returned_object = Object.normalize(returned_activity.data["object"])        assert activity =                 Activity.get_create_by_object_ap_id(                   "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"                 ) -      assert returned_activity.data["object"]["inReplyToAtomUri"] == -               "https://shitposter.club/notice/2827873" - -      assert returned_activity.data["object"]["inReplyToStatusId"] == activity.id +      assert returned_object.data["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873"      end      test "it works for incoming notices" do @@ -82,7 +81,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["actor"] == "http://mastodon.example.org/users/admin" -      object = data["object"] +      object = Object.normalize(data["object"]).data        assert object["id"] == "http://mastodon.example.org/users/admin/statuses/99512778738411822"        assert object["to"] == ["https://www.w3.org/ns/activitystreams#Public"] @@ -100,7 +99,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert object["sensitive"] == true -      user = User.get_by_ap_id(object["actor"]) +      user = User.get_cached_by_ap_id(object["actor"])        assert user.info.note_count == 1      end @@ -109,7 +108,9 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        data = File.read!("test/fixtures/mastodon-post-activity-hashtag.json") |> Poison.decode!()        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) -      assert Enum.at(data["object"]["tag"], 2) == "moo" +      object = Object.normalize(data["object"]) + +      assert Enum.at(object.data["tag"], 2) == "moo"      end      test "it works for incoming notices with contentMap" do @@ -117,8 +118,9 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do          File.read!("test/fixtures/mastodon-post-activity-contentmap.json") |> Poison.decode!()        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) +      object = Object.normalize(data["object"]) -      assert data["object"]["content"] == +      assert object.data["content"] ==                 "<p><span class=\"h-card\"><a href=\"http://localtesting.pleroma.lol/users/lain\" class=\"u-url mention\">@<span>lain</span></a></span></p>"      end @@ -126,8 +128,9 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        data = File.read!("test/fixtures/kroeg-post-activity.json") |> Poison.decode!()        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) +      object = Object.normalize(data["object"]) -      assert data["object"]["content"] == +      assert object.data["content"] ==                 "<p>henlo from my Psion netBook</p><p>message sent from my Psion netBook</p>"      end @@ -143,24 +146,27 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        data = File.read!("test/fixtures/kroeg-array-less-emoji.json") |> Poison.decode!()        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) +      object = Object.normalize(data["object"]) -      assert data["object"]["emoji"] == %{ +      assert object.data["emoji"] == %{                 "icon_e_smile" => "https://puckipedia.com/forum/images/smilies/icon_e_smile.png"               }        data = File.read!("test/fixtures/kroeg-array-less-hashtag.json") |> Poison.decode!()        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) +      object = Object.normalize(data["object"]) -      assert "test" in data["object"]["tag"] +      assert "test" in object.data["tag"]      end      test "it works for incoming notices with url not being a string (prismo)" do        data = File.read!("test/fixtures/prismo-url-map.json") |> Poison.decode!()        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) +      object = Object.normalize(data["object"]) -      assert data["object"]["url"] == "https://prismo.news/posts/83" +      assert object.data["url"] == "https://prismo.news/posts/83"      end      test "it cleans up incoming notices which are not really DMs" do @@ -182,15 +188,15 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        data = Map.put(data, "object", object) -      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) +      {:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data)        assert data["to"] == []        assert data["cc"] == to -      object = data["object"] +      object_data = Object.normalize(activity).data -      assert object["to"] == [] -      assert object["cc"] == to +      assert object_data["to"] == [] +      assert object_data["cc"] == to      end      test "it works for incoming follow requests" do @@ -206,7 +212,27 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["actor"] == "http://mastodon.example.org/users/admin"        assert data["type"] == "Follow"        assert data["id"] == "http://mastodon.example.org/users/admin#follows/2" -      assert User.following?(User.get_by_ap_id(data["actor"]), user) +      assert User.following?(User.get_cached_by_ap_id(data["actor"]), user) +    end + +    test "it rejects incoming follow requests from blocked users when deny_follow_blocked is enabled" do +      Pleroma.Config.put([:user, :deny_follow_blocked], true) + +      user = insert(:user) +      {:ok, target} = User.get_or_fetch("http://mastodon.example.org/users/admin") + +      {:ok, user} = User.block(user, target) + +      data = +        File.read!("test/fixtures/mastodon-follow-activity.json") +        |> Poison.decode!() +        |> Map.put("object", user.ap_id) + +      {:ok, %Activity{data: %{"id" => id}}} = Transmogrifier.handle_incoming(data) + +      %Activity{} = activity = Activity.get_by_ap_id(id) + +      assert activity.data["state"] == "reject"      end      test "it works for incoming follow requests from hubzilla" do @@ -223,7 +249,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["actor"] == "https://hubzilla.example.org/channel/kaniini"        assert data["type"] == "Follow"        assert data["id"] == "https://hubzilla.example.org/channel/kaniini#follows/2" -      assert User.following?(User.get_by_ap_id(data["actor"]), user) +      assert User.following?(User.get_cached_by_ap_id(data["actor"]), user)      end      test "it works for incoming likes" do @@ -233,14 +259,14 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        data =          File.read!("test/fixtures/mastodon-like.json")          |> Poison.decode!() -        |> Map.put("object", activity.data["object"]["id"]) +        |> Map.put("object", activity.data["object"])        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)        assert data["actor"] == "http://mastodon.example.org/users/admin"        assert data["type"] == "Like"        assert data["id"] == "http://mastodon.example.org/users/admin#likes/2" -      assert data["object"] == activity.data["object"]["id"] +      assert data["object"] == activity.data["object"]      end      test "it returns an error for incoming unlikes wihout a like activity" do @@ -250,7 +276,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        data =          File.read!("test/fixtures/mastodon-undo-like.json")          |> Poison.decode!() -        |> Map.put("object", activity.data["object"]["id"]) +        |> Map.put("object", activity.data["object"])        assert Transmogrifier.handle_incoming(data) == :error      end @@ -262,7 +288,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        like_data =          File.read!("test/fixtures/mastodon-like.json")          |> Poison.decode!() -        |> Map.put("object", activity.data["object"]["id"]) +        |> Map.put("object", activity.data["object"])        {:ok, %Activity{data: like_data, local: false}} = Transmogrifier.handle_incoming(like_data) @@ -304,7 +330,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        data =          File.read!("test/fixtures/mastodon-announce.json")          |> Poison.decode!() -        |> Map.put("object", activity.data["object"]["id"]) +        |> Map.put("object", activity.data["object"])        {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) @@ -314,7 +340,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["id"] ==                 "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" -      assert data["object"] == activity.data["object"]["id"] +      assert data["object"] == activity.data["object"]        assert Activity.get_create_by_object_ap_id(data["object"]).id == activity.id      end @@ -326,7 +352,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        data =          File.read!("test/fixtures/mastodon-announce.json")          |> Poison.decode!() -        |> Map.put("object", activity.data["object"]["id"]) +        |> Map.put("object", Object.normalize(activity).data["id"])          |> Map.put("to", ["http://mastodon.example.org/users/admin/followers"])          |> Map.put("cc", []) @@ -452,7 +478,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        object =          data["object"] -        |> Map.put("id", activity.data["object"]["id"]) +        |> Map.put("id", activity.data["object"])        data =          data @@ -473,7 +499,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        object =          data["object"] -        |> Map.put("id", activity.data["object"]["id"]) +        |> Map.put("id", activity.data["object"])        data =          data @@ -491,7 +517,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        announce_data =          File.read!("test/fixtures/mastodon-announce.json")          |> Poison.decode!() -        |> Map.put("object", activity.data["object"]["id"]) +        |> Map.put("object", activity.data["object"])        {:ok, %Activity{data: announce_data, local: false}} =          Transmogrifier.handle_incoming(announce_data) @@ -506,7 +532,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["type"] == "Undo"        assert data["object"]["type"] == "Announce" -      assert data["object"]["object"] == activity.data["object"]["id"] +      assert data["object"]["object"] == activity.data["object"]        assert data["object"]["id"] ==                 "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" @@ -534,7 +560,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["object"]["object"] == user.ap_id        assert data["actor"] == "http://mastodon.example.org/users/admin" -      refute User.following?(User.get_by_ap_id(data["actor"]), user) +      refute User.following?(User.get_cached_by_ap_id(data["actor"]), user)      end      test "it works for incoming blocks" do @@ -551,7 +577,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["object"] == user.ap_id        assert data["actor"] == "http://mastodon.example.org/users/admin" -      blocker = User.get_by_ap_id(data["actor"]) +      blocker = User.get_cached_by_ap_id(data["actor"])        assert User.blocks?(blocker, user)      end @@ -578,8 +604,8 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["object"] == blocked.ap_id        assert data["actor"] == blocker.ap_id -      blocker = User.get_by_ap_id(data["actor"]) -      blocked = User.get_by_ap_id(data["object"]) +      blocker = User.get_cached_by_ap_id(data["actor"]) +      blocked = User.get_cached_by_ap_id(data["object"])        assert User.blocks?(blocker, blocked) @@ -608,7 +634,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["object"]["object"] == user.ap_id        assert data["actor"] == "http://mastodon.example.org/users/admin" -      blocker = User.get_by_ap_id(data["actor"]) +      blocker = User.get_cached_by_ap_id(data["actor"])        refute User.blocks?(blocker, user)      end @@ -639,7 +665,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert activity.data["object"] == follow_activity.data["id"] -      follower = User.get_by_id(follower.id) +      follower = User.get_cached_by_id(follower.id)        assert User.following?(follower, followed) == true      end @@ -661,7 +687,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, activity} = Transmogrifier.handle_incoming(accept_data)        assert activity.data["object"] == follow_activity.data["id"] -      follower = User.get_by_id(follower.id) +      follower = User.get_cached_by_id(follower.id)        assert User.following?(follower, followed) == true      end @@ -681,7 +707,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, activity} = Transmogrifier.handle_incoming(accept_data)        assert activity.data["object"] == follow_activity.data["id"] -      follower = User.get_by_id(follower.id) +      follower = User.get_cached_by_id(follower.id)        assert User.following?(follower, followed) == true      end @@ -700,7 +726,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        :error = Transmogrifier.handle_incoming(accept_data) -      follower = User.get_by_id(follower.id) +      follower = User.get_cached_by_id(follower.id)        refute User.following?(follower, followed) == true      end @@ -719,7 +745,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        :error = Transmogrifier.handle_incoming(accept_data) -      follower = User.get_by_id(follower.id) +      follower = User.get_cached_by_id(follower.id)        refute User.following?(follower, followed) == true      end @@ -744,7 +770,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, activity} = Transmogrifier.handle_incoming(reject_data)        refute activity.local -      follower = User.get_by_id(follower.id) +      follower = User.get_cached_by_id(follower.id)        assert User.following?(follower, followed) == false      end @@ -766,7 +792,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, %Activity{data: _}} = Transmogrifier.handle_incoming(reject_data) -      follower = User.get_by_id(follower.id) +      follower = User.get_cached_by_id(follower.id)        assert User.following?(follower, followed) == false      end @@ -785,7 +811,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do      test "it remaps video URLs as attachments if necessary" do        {:ok, object} = -        ActivityPub.fetch_object_from_id( +        Fetcher.fetch_object_from_id(            "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"          ) @@ -940,7 +966,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do      test "it strips internal fields" do        user = insert(:user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "#2hu :moominmamma:"}) +      {:ok, activity} = CommonAPI.post(user, %{"status" => "#2hu :firefox:"})        {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) @@ -1020,7 +1046,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, unrelated_activity} = CommonAPI.post(user_two, %{"status" => "test"})        assert "http://localhost:4001/users/rye@niu.moe/followers" in activity.recipients -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        assert user.info.note_count == 1        {:ok, user} = Transmogrifier.upgrade_user_from_ap_id("https://niu.moe/users/rye") @@ -1028,7 +1054,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert user.info.note_count == 1        assert user.follower_address == "https://niu.moe/users/rye/followers" -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        assert user.info.note_count == 1        activity = Activity.get_by_id(activity.id) @@ -1057,7 +1083,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        unrelated_activity = Activity.get_by_id(unrelated_activity.id)        refute user.follower_address in unrelated_activity.recipients -      user_two = User.get_by_id(user_two.id) +      user_two = User.get_cached_by_id(user_two.id)        assert user.follower_address in user_two.following        refute "..." in user_two.following      end @@ -1090,10 +1116,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    end    describe "actor origin containment" do -    test "it rejects objects with a bogus origin" do -      {:error, _} = ActivityPub.fetch_object_from_id("https://info.pleroma.site/activity.json") -    end -      test "it rejects activities which reference objects with bogus origins" do        data = %{          "@context" => "https://www.w3.org/ns/activitystreams", @@ -1107,10 +1129,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        :error = Transmogrifier.handle_incoming(data)      end -    test "it rejects objects when attributedTo is wrong (variant 1)" do -      {:error, _} = ActivityPub.fetch_object_from_id("https://info.pleroma.site/activity2.json") -    end -      test "it rejects activities which reference objects that have an incorrect attribution (variant 1)" do        data = %{          "@context" => "https://www.w3.org/ns/activitystreams", @@ -1124,10 +1142,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        :error = Transmogrifier.handle_incoming(data)      end -    test "it rejects objects when attributedTo is wrong (variant 2)" do -      {:error, _} = ActivityPub.fetch_object_from_id("https://info.pleroma.site/activity3.json") -    end -      test "it rejects activities which reference objects that have an incorrect attribution (variant 2)" do        data = %{          "@context" => "https://www.w3.org/ns/activitystreams", @@ -1142,62 +1156,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do      end    end -  describe "general origin containment" do -    test "contain_origin_from_id() catches obvious spoofing attempts" do -      data = %{ -        "id" => "http://example.com/~alyssa/activities/1234.json" -      } - -      :error = -        Transmogrifier.contain_origin_from_id( -          "http://example.org/~alyssa/activities/1234.json", -          data -        ) -    end - -    test "contain_origin_from_id() allows alternate IDs within the same origin domain" do -      data = %{ -        "id" => "http://example.com/~alyssa/activities/1234.json" -      } - -      :ok = -        Transmogrifier.contain_origin_from_id( -          "http://example.com/~alyssa/activities/1234", -          data -        ) -    end - -    test "contain_origin_from_id() allows matching IDs" do -      data = %{ -        "id" => "http://example.com/~alyssa/activities/1234.json" -      } - -      :ok = -        Transmogrifier.contain_origin_from_id( -          "http://example.com/~alyssa/activities/1234.json", -          data -        ) -    end - -    test "users cannot be collided through fake direction spoofing attempts" do -      insert(:user, %{ -        nickname: "rye@niu.moe", -        local: false, -        ap_id: "https://niu.moe/users/rye", -        follower_address: User.ap_followers(%User{nickname: "rye@niu.moe"}) -      }) - -      {:error, _} = User.get_or_fetch_by_ap_id("https://n1u.moe/users/rye") -    end - -    test "all objects with fake directions are rejected by the object fetcher" do -      {:error, _} = -        ActivityPub.fetch_and_contain_remote_object_from_id( -          "https://info.pleroma.site/activity4.json" -        ) -    end -  end -    describe "reserialization" do      test "successfully reserializes a message with inReplyTo == nil" do        user = insert(:user) diff --git a/test/web/activity_pub/utils_test.exs b/test/web/activity_pub/utils_test.exs index 758214e68..c57fae437 100644 --- a/test/web/activity_pub/utils_test.exs +++ b/test/web/activity_pub/utils_test.exs @@ -1,7 +1,6 @@  defmodule Pleroma.Web.ActivityPub.UtilsTest do    use Pleroma.DataCase    alias Pleroma.Activity -  alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub    alias Pleroma.Web.ActivityPub.Utils @@ -12,8 +11,8 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do    describe "fetch the latest Follow" do      test "fetches the latest Follow activity" do        %Activity{data: %{"type" => "Follow"}} = activity = insert(:follow_activity) -      follower = Repo.get_by(User, ap_id: activity.data["actor"]) -      followed = Repo.get_by(User, ap_id: activity.data["object"]) +      follower = User.get_cached_by_ap_id(activity.data["actor"]) +      followed = User.get_cached_by_ap_id(activity.data["object"])        assert activity == Utils.fetch_latest_follow(follower, followed)      end diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index d44392c9d..b89c42327 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -89,8 +89,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          "followed" => user.nickname        }) -      user = User.get_by_id(user.id) -      follower = User.get_by_id(follower.id) +      user = User.get_cached_by_id(user.id) +      follower = User.get_cached_by_id(follower.id)        assert User.following?(follower, user)      end @@ -112,8 +112,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          "followed" => user.nickname        }) -      user = User.get_by_id(user.id) -      follower = User.get_by_id(follower.id) +      user = User.get_cached_by_id(user.id) +      follower = User.get_cached_by_id(follower.id)        refute User.following?(follower, user)      end @@ -145,13 +145,13 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        user2: user2      } do        assert json_response(conn, :no_content) -      assert User.get_by_id(user1.id).tags == ["x", "foo", "bar"] -      assert User.get_by_id(user2.id).tags == ["y", "foo", "bar"] +      assert User.get_cached_by_id(user1.id).tags == ["x", "foo", "bar"] +      assert User.get_cached_by_id(user2.id).tags == ["y", "foo", "bar"]      end      test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do        assert json_response(conn, :no_content) -      assert User.get_by_id(user3.id).tags == ["unchanged"] +      assert User.get_cached_by_id(user3.id).tags == ["unchanged"]      end    end @@ -181,13 +181,13 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        user2: user2      } do        assert json_response(conn, :no_content) -      assert User.get_by_id(user1.id).tags == [] -      assert User.get_by_id(user2.id).tags == ["y"] +      assert User.get_cached_by_id(user1.id).tags == [] +      assert User.get_cached_by_id(user2.id).tags == ["y"]      end      test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do        assert json_response(conn, :no_content) -      assert User.get_by_id(user3.id).tags == ["unchanged"] +      assert User.get_cached_by_id(user3.id).tags == ["unchanged"]      end    end @@ -257,7 +257,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          conn          |> put("/api/pleroma/admin/activation_status/#{user.nickname}", %{status: false}) -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        assert user.info.deactivated == true        assert json_response(conn, :no_content)      end @@ -269,7 +269,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do          conn          |> put("/api/pleroma/admin/activation_status/#{user.nickname}", %{status: true}) -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        assert user.info.deactivated == false        assert json_response(conn, :no_content)      end @@ -317,13 +317,21 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert token_record        refute token_record.used -      Swoosh.TestAssertions.assert_email_sent( -        Pleroma.UserEmail.user_invitation_email( +      notify_email = Pleroma.Config.get([:instance, :notify_email]) +      instance_name = Pleroma.Config.get([:instance, :name]) + +      email = +        Pleroma.Emails.UserEmail.user_invitation_email(            user,            token_record,            recipient_email,            recipient_name          ) + +      Swoosh.TestAssertions.assert_email_sent( +        from: {instance_name, notify_email}, +        to: {recipient_name, recipient_email}, +        html_body: email.html_body        )      end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 34aa5bf18..a5b07c446 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -5,6 +5,7 @@  defmodule Pleroma.Web.CommonAPITest do    use Pleroma.DataCase    alias Pleroma.Activity +  alias Pleroma.Object    alias Pleroma.User    alias Pleroma.Web.CommonAPI @@ -32,24 +33,26 @@ defmodule Pleroma.Web.CommonAPITest do      user = insert(:user)      {:ok, activity} = CommonAPI.post(user, %{"status" => "#2hu #2HU"}) -    assert activity.data["object"]["tag"] == ["2hu"] +    object = Object.normalize(activity.data["object"]) + +    assert object.data["tag"] == ["2hu"]    end    test "it adds emoji in the object" do      user = insert(:user) -    {:ok, activity} = CommonAPI.post(user, %{"status" => ":moominmamma:"}) +    {:ok, activity} = CommonAPI.post(user, %{"status" => ":firefox:"}) -    assert activity.data["object"]["emoji"]["moominmamma"] +    assert Object.normalize(activity).data["emoji"]["firefox"]    end    test "it adds emoji when updating profiles" do -    user = insert(:user, %{name: ":karjalanpiirakka:"}) +    user = insert(:user, %{name: ":firefox:"})      CommonAPI.update(user)      user = User.get_cached_by_ap_id(user.ap_id) -    [karjalanpiirakka] = user.info.source_data["tag"] +    [firefox] = user.info.source_data["tag"] -    assert karjalanpiirakka["name"] == ":karjalanpiirakka:" +    assert firefox["name"] == ":firefox:"    end    describe "posting" do @@ -64,8 +67,9 @@ defmodule Pleroma.Web.CommonAPITest do            "content_type" => "text/html"          }) -      content = activity.data["object"]["content"] -      assert content == "<p><b>2hu</b></p>alert('xss')" +      object = Object.normalize(activity.data["object"]) + +      assert object.data["content"] == "<p><b>2hu</b></p>alert('xss')"      end      test "it filters out obviously bad tags when accepting a post as Markdown" do @@ -79,8 +83,9 @@ defmodule Pleroma.Web.CommonAPITest do            "content_type" => "text/markdown"          }) -      content = activity.data["object"]["content"] -      assert content == "<p><b>2hu</b></p>alert('xss')" +      object = Object.normalize(activity.data["object"]) + +      assert object.data["content"] == "<p><b>2hu</b></p>alert('xss')"      end    end diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs index f0c59d5c3..ab4c62b35 100644 --- a/test/web/common_api/common_api_utils_test.exs +++ b/test/web/common_api/common_api_utils_test.exs @@ -37,21 +37,21 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do    end    test "parses emoji from name and bio" do -    {:ok, user} = UserBuilder.insert(%{name: ":karjalanpiirakka:", bio: ":perkele:"}) +    {:ok, user} = UserBuilder.insert(%{name: ":blank:", bio: ":firefox:"})      expected = [        %{          "type" => "Emoji", -        "icon" => %{"type" => "Image", "url" => "#{Endpoint.url()}/finmoji/128px/perkele-128.png"}, -        "name" => ":perkele:" +        "icon" => %{"type" => "Image", "url" => "#{Endpoint.url()}/emoji/Firefox.gif"}, +        "name" => ":firefox:"        },        %{          "type" => "Emoji",          "icon" => %{            "type" => "Image", -          "url" => "#{Endpoint.url()}/finmoji/128px/karjalanpiirakka-128.png" +          "url" => "#{Endpoint.url()}/emoji/blank.png"          }, -        "name" => ":karjalanpiirakka:" +        "name" => ":blank:"        }      ] @@ -119,6 +119,31 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        assert output == expected      end +    test "works for bare text/bbcode" do +      text = "[b]hello world[/b]" +      expected = "<strong>hello world</strong>" + +      {output, [], []} = Utils.format_input(text, "text/bbcode") + +      assert output == expected + +      text = "[b]hello world![/b]\n\nsecond paragraph!" +      expected = "<strong>hello world!</strong><br>\n<br>\nsecond paragraph!" + +      {output, [], []} = Utils.format_input(text, "text/bbcode") + +      assert output == expected + +      text = "[b]hello world![/b]\n\n<strong>second paragraph!</strong>" + +      expected = +        "<strong>hello world!</strong><br>\n<br>\n<strong>second paragraph!</strong>" + +      {output, [], []} = Utils.format_input(text, "text/bbcode") + +      assert output == expected +    end +      test "works for text/markdown with mentions" do        {:ok, user} =          UserBuilder.insert(%{nickname: "user__test", ap_id: "http://foo.com/user__test"}) diff --git a/test/web/mastodon_api/account_view_test.exs b/test/web/mastodon_api/account_view_test.exs index d7487bed9..a24f2a050 100644 --- a/test/web/mastodon_api/account_view_test.exs +++ b/test/web/mastodon_api/account_view_test.exs @@ -56,14 +56,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        bot: false,        source: %{          note: "", -        privacy: "public", -        sensitive: false +        sensitive: false, +        pleroma: %{}        },        pleroma: %{          confirmation_pending: false,          tags: [],          is_admin: false,          is_moderator: false, +        hide_favorites: true, +        hide_followers: false, +        hide_follows: false,          relationship: %{}        }      } @@ -81,8 +84,12 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        "follows" => true      } -    assert %{pleroma: %{notification_settings: ^notification_settings}} = -             AccountView.render("account.json", %{user: user, for: user}) +    privacy = user.info.default_scope + +    assert %{ +             pleroma: %{notification_settings: ^notification_settings}, +             source: %{privacy: ^privacy} +           } = AccountView.render("account.json", %{user: user, for: user})    end    test "Represent a Service(bot) account" do @@ -114,14 +121,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        bot: true,        source: %{          note: "", -        privacy: "public", -        sensitive: false +        sensitive: false, +        pleroma: %{}        },        pleroma: %{          confirmation_pending: false,          tags: [],          is_admin: false,          is_moderator: false, +        hide_favorites: true, +        hide_followers: false, +        hide_follows: false,          relationship: %{}        }      } @@ -169,15 +179,15 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do    test "represent an embedded relationship" do      user =        insert(:user, %{ -        info: %{note_count: 5, follower_count: 3, source_data: %{"type" => "Service"}}, +        info: %{note_count: 5, follower_count: 0, source_data: %{"type" => "Service"}},          nickname: "shp@shitposter.club",          inserted_at: ~N[2017-08-15 15:47:06.597036]        })      other_user = insert(:user) -      {:ok, other_user} = User.follow(other_user, user)      {:ok, other_user} = User.block(other_user, user) +    {:ok, _} = User.follow(insert(:user), user)      expected = %{        id: to_string(user.id), @@ -186,7 +196,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        display_name: user.name,        locked: false,        created_at: "2017-08-15T15:47:06.000Z", -      followers_count: 3, +      followers_count: 1,        following_count: 0,        statuses_count: 5,        note: user.bio, @@ -200,14 +210,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        bot: true,        source: %{          note: "", -        privacy: "public", -        sensitive: false +        sensitive: false, +        pleroma: %{}        },        pleroma: %{          confirmation_pending: false,          tags: [],          is_admin: false,          is_moderator: false, +        hide_favorites: true, +        hide_followers: false, +        hide_follows: false,          relationship: %{            id: to_string(user.id),            following: false, diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs index 3ac5c37a6..c2a12d3c7 100644 --- a/test/web/mastodon_api/mastodon_api_controller_test.exs +++ b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -342,7 +342,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      activity = Activity.get_by_id(id)      assert activity.data["context"] == replied_to.data["context"] -    assert activity.data["object"]["inReplyToStatusId"] == replied_to.id +    assert Activity.get_in_reply_to_activity(activity).id == replied_to.id    end    test "posting a status with an invalid in_reply_to_id", %{conn: conn} do @@ -445,7 +445,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do    describe "deleting a status" do      test "when you created it", %{conn: conn} do        activity = insert(:note_activity) -      author = User.get_by_ap_id(activity.data["actor"]) +      author = User.get_cached_by_ap_id(activity.data["actor"])        conn =          conn @@ -944,6 +944,58 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        assert [%{"id" => ^reblog_notification_id}] = json_response(conn_res, 200)      end + +    test "destroy multiple", %{conn: conn} do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, activity1} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) +      {:ok, activity2} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"}) +      {:ok, activity3} = CommonAPI.post(user, %{"status" => "hi @#{other_user.nickname}"}) +      {:ok, activity4} = CommonAPI.post(user, %{"status" => "hi @#{other_user.nickname}"}) + +      notification1_id = Repo.get_by(Notification, activity_id: activity1.id).id |> to_string() +      notification2_id = Repo.get_by(Notification, activity_id: activity2.id).id |> to_string() +      notification3_id = Repo.get_by(Notification, activity_id: activity3.id).id |> to_string() +      notification4_id = Repo.get_by(Notification, activity_id: activity4.id).id |> to_string() + +      conn = +        conn +        |> assign(:user, user) + +      conn_res = +        conn +        |> get("/api/v1/notifications") + +      result = json_response(conn_res, 200) +      assert [%{"id" => ^notification2_id}, %{"id" => ^notification1_id}] = result + +      conn2 = +        conn +        |> assign(:user, other_user) + +      conn_res = +        conn2 +        |> get("/api/v1/notifications") + +      result = json_response(conn_res, 200) +      assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result + +      conn_destroy = +        conn +        |> delete("/api/v1/notifications/destroy_multiple", %{ +          "ids" => [notification1_id, notification2_id] +        }) + +      assert json_response(conn_destroy, 200) == %{} + +      conn_res = +        conn2 +        |> get("/api/v1/notifications") + +      result = json_response(conn_res, 200) +      assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result +    end    end    describe "reblogging" do @@ -956,8 +1008,47 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do          |> assign(:user, user)          |> post("/api/v1/statuses/#{activity.id}/reblog") -      assert %{"reblog" => %{"id" => id, "reblogged" => true, "reblogs_count" => 1}} = -               json_response(conn, 200) +      assert %{ +               "reblog" => %{"id" => id, "reblogged" => true, "reblogs_count" => 1}, +               "reblogged" => true +             } = json_response(conn, 200) + +      assert to_string(activity.id) == id +    end + +    test "reblogged status for another user", %{conn: conn} do +      activity = insert(:note_activity) +      user1 = insert(:user) +      user2 = insert(:user) +      user3 = insert(:user) +      CommonAPI.favorite(activity.id, user2) +      {:ok, _bookmark} = Pleroma.Bookmark.create(user2.id, activity.id) +      {:ok, reblog_activity1, _object} = CommonAPI.repeat(activity.id, user1) +      {:ok, _, _object} = CommonAPI.repeat(activity.id, user2) + +      conn_res = +        conn +        |> assign(:user, user3) +        |> get("/api/v1/statuses/#{reblog_activity1.id}") + +      assert %{ +               "reblog" => %{"id" => id, "reblogged" => false, "reblogs_count" => 2}, +               "reblogged" => false, +               "favourited" => false, +               "bookmarked" => false +             } = json_response(conn_res, 200) + +      conn_res = +        conn +        |> assign(:user, user2) +        |> get("/api/v1/statuses/#{reblog_activity1.id}") + +      assert %{ +               "reblog" => %{"id" => id, "reblogged" => true, "reblogs_count" => 2}, +               "reblogged" => true, +               "favourited" => true, +               "bookmarked" => true +             } = json_response(conn_res, 200)        assert to_string(activity.id) == id      end @@ -1076,7 +1167,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      test "unimplemented pinned statuses feature", %{conn: conn} do        note = insert(:note_activity) -      user = User.get_by_ap_id(note.data["actor"]) +      user = User.get_cached_by_ap_id(note.data["actor"])        conn =          conn @@ -1087,7 +1178,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      test "gets an users media", %{conn: conn} do        note = insert(:note_activity) -      user = User.get_by_ap_id(note.data["actor"]) +      user = User.get_cached_by_ap_id(note.data["actor"])        file = %Plug.Upload{          content_type: "image/jpg", @@ -1162,8 +1253,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        {:ok, _activity} = ActivityPub.follow(other_user, user) -      user = User.get_by_id(user.id) -      other_user = User.get_by_id(other_user.id) +      user = User.get_cached_by_id(user.id) +      other_user = User.get_cached_by_id(other_user.id)        assert User.following?(other_user, user) == false @@ -1182,8 +1273,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        {:ok, _activity} = ActivityPub.follow(other_user, user) -      user = User.get_by_id(user.id) -      other_user = User.get_by_id(other_user.id) +      user = User.get_cached_by_id(user.id) +      other_user = User.get_cached_by_id(other_user.id)        assert User.following?(other_user, user) == false @@ -1195,8 +1286,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        assert relationship = json_response(conn, 200)        assert to_string(other_user.id) == relationship["id"] -      user = User.get_by_id(user.id) -      other_user = User.get_by_id(other_user.id) +      user = User.get_cached_by_id(user.id) +      other_user = User.get_cached_by_id(other_user.id)        assert User.following?(other_user, user) == true      end @@ -1219,7 +1310,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        {:ok, _activity} = ActivityPub.follow(other_user, user) -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        conn =          build_conn() @@ -1229,8 +1320,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        assert relationship = json_response(conn, 200)        assert to_string(other_user.id) == relationship["id"] -      user = User.get_by_id(user.id) -      other_user = User.get_by_id(other_user.id) +      user = User.get_cached_by_id(user.id) +      other_user = User.get_cached_by_id(other_user.id)        assert User.following?(other_user, user) == false      end @@ -1421,7 +1512,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert id2 == follower2.id      assert [link_header] = get_resp_header(res_conn, "link") -    assert link_header =~ ~r/since_id=#{follower2.id}/ +    assert link_header =~ ~r/min_id=#{follower2.id}/      assert link_header =~ ~r/max_id=#{follower2.id}/    end @@ -1500,7 +1591,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert id2 == following2.id      assert [link_header] = get_resp_header(res_conn, "link") -    assert link_header =~ ~r/since_id=#{following2.id}/ +    assert link_header =~ ~r/min_id=#{following2.id}/      assert link_header =~ ~r/max_id=#{following2.id}/    end @@ -1515,7 +1606,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert %{"id" => _id, "following" => true} = json_response(conn, 200) -    user = User.get_by_id(user.id) +    user = User.get_cached_by_id(user.id)      conn =        build_conn() @@ -1524,7 +1615,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert %{"id" => _id, "following" => false} = json_response(conn, 200) -    user = User.get_by_id(user.id) +    user = User.get_cached_by_id(user.id)      conn =        build_conn() @@ -1535,6 +1626,78 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert id == to_string(other_user.id)    end +  test "following without reblogs" do +    follower = insert(:user) +    followed = insert(:user) +    other_user = insert(:user) + +    conn = +      build_conn() +      |> assign(:user, follower) +      |> post("/api/v1/accounts/#{followed.id}/follow?reblogs=false") + +    assert %{"showing_reblogs" => false} = json_response(conn, 200) + +    {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hey"}) +    {:ok, reblog, _} = CommonAPI.repeat(activity.id, followed) + +    conn = +      build_conn() +      |> assign(:user, User.get_cached_by_id(follower.id)) +      |> get("/api/v1/timelines/home") + +    assert [] == json_response(conn, 200) + +    conn = +      build_conn() +      |> assign(:user, follower) +      |> post("/api/v1/accounts/#{followed.id}/follow?reblogs=true") + +    assert %{"showing_reblogs" => true} = json_response(conn, 200) + +    conn = +      build_conn() +      |> assign(:user, User.get_cached_by_id(follower.id)) +      |> get("/api/v1/timelines/home") + +    expected_activity_id = reblog.id +    assert [%{"id" => ^expected_activity_id}] = json_response(conn, 200) +  end + +  test "following / unfollowing errors" do +    user = insert(:user) + +    conn = +      build_conn() +      |> assign(:user, user) + +    # self follow +    conn_res = post(conn, "/api/v1/accounts/#{user.id}/follow") +    assert %{"error" => "Record not found"} = json_response(conn_res, 404) + +    # self unfollow +    user = User.get_cached_by_id(user.id) +    conn_res = post(conn, "/api/v1/accounts/#{user.id}/unfollow") +    assert %{"error" => "Record not found"} = json_response(conn_res, 404) + +    # self follow via uri +    user = User.get_cached_by_id(user.id) +    conn_res = post(conn, "/api/v1/follows", %{"uri" => user.nickname}) +    assert %{"error" => "Record not found"} = json_response(conn_res, 404) + +    # follow non existing user +    conn_res = post(conn, "/api/v1/accounts/doesntexist/follow") +    assert %{"error" => "Record not found"} = json_response(conn_res, 404) + +    # follow non existing user via uri +    conn_res = post(conn, "/api/v1/follows", %{"uri" => "doesntexist"}) +    assert %{"error" => "Record not found"} = json_response(conn_res, 404) + +    # unfollow non existing user +    conn_res = post(conn, "/api/v1/accounts/doesntexist/unfollow") +    assert %{"error" => "Record not found"} = json_response(conn_res, 404) +  end +    test "muting / unmuting a user", %{conn: conn} do      user = insert(:user)      other_user = insert(:user) @@ -1546,7 +1709,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert %{"id" => _id, "muting" => true} = json_response(conn, 200) -    user = User.get_by_id(user.id) +    user = User.get_cached_by_id(user.id)      conn =        build_conn() @@ -1601,7 +1764,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert %{"id" => _id, "blocking" => true} = json_response(conn, 200) -    user = User.get_by_id(user.id) +    user = User.get_cached_by_id(user.id)      conn =        build_conn() @@ -1760,7 +1923,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      capture_log(fn ->        conn =          conn -        |> get("/api/v1/search", %{"q" => activity.data["object"]["id"]}) +        |> get("/api/v1/search", %{"q" => Object.normalize(activity).data["id"]})        assert results = json_response(conn, 200) @@ -1825,6 +1988,199 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert [] = json_response(third_conn, 200)    end +  describe "getting favorites timeline of specified user" do +    setup do +      [current_user, user] = insert_pair(:user, %{info: %{hide_favorites: false}}) +      [current_user: current_user, user: user] +    end + +    test "returns list of statuses favorited by specified user", %{ +      conn: conn, +      current_user: current_user, +      user: user +    } do +      [activity | _] = insert_pair(:note_activity) +      CommonAPI.favorite(activity.id, user) + +      response = +        conn +        |> assign(:user, current_user) +        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") +        |> json_response(:ok) + +      [like] = response + +      assert length(response) == 1 +      assert like["id"] == activity.id +    end + +    test "returns favorites for specified user_id when user is not logged in", %{ +      conn: conn, +      user: user +    } do +      activity = insert(:note_activity) +      CommonAPI.favorite(activity.id, user) + +      response = +        conn +        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") +        |> json_response(:ok) + +      assert length(response) == 1 +    end + +    test "returns favorited DM only when user is logged in and he is one of recipients", %{ +      conn: conn, +      current_user: current_user, +      user: user +    } do +      {:ok, direct} = +        CommonAPI.post(current_user, %{ +          "status" => "Hi @#{user.nickname}!", +          "visibility" => "direct" +        }) + +      CommonAPI.favorite(direct.id, user) + +      response = +        conn +        |> assign(:user, current_user) +        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") +        |> json_response(:ok) + +      assert length(response) == 1 + +      anonymous_response = +        conn +        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") +        |> json_response(:ok) + +      assert length(anonymous_response) == 0 +    end + +    test "does not return others' favorited DM when user is not one of recipients", %{ +      conn: conn, +      current_user: current_user, +      user: user +    } do +      user_two = insert(:user) + +      {:ok, direct} = +        CommonAPI.post(user_two, %{ +          "status" => "Hi @#{user.nickname}!", +          "visibility" => "direct" +        }) + +      CommonAPI.favorite(direct.id, user) + +      response = +        conn +        |> assign(:user, current_user) +        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") +        |> json_response(:ok) + +      assert length(response) == 0 +    end + +    test "paginates favorites using since_id and max_id", %{ +      conn: conn, +      current_user: current_user, +      user: user +    } do +      activities = insert_list(10, :note_activity) + +      Enum.each(activities, fn activity -> +        CommonAPI.favorite(activity.id, user) +      end) + +      third_activity = Enum.at(activities, 2) +      seventh_activity = Enum.at(activities, 6) + +      response = +        conn +        |> assign(:user, current_user) +        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites", %{ +          since_id: third_activity.id, +          max_id: seventh_activity.id +        }) +        |> json_response(:ok) + +      assert length(response) == 3 +      refute third_activity in response +      refute seventh_activity in response +    end + +    test "limits favorites using limit parameter", %{ +      conn: conn, +      current_user: current_user, +      user: user +    } do +      7 +      |> insert_list(:note_activity) +      |> Enum.each(fn activity -> +        CommonAPI.favorite(activity.id, user) +      end) + +      response = +        conn +        |> assign(:user, current_user) +        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites", %{limit: "3"}) +        |> json_response(:ok) + +      assert length(response) == 3 +    end + +    test "returns empty response when user does not have any favorited statuses", %{ +      conn: conn, +      current_user: current_user, +      user: user +    } do +      response = +        conn +        |> assign(:user, current_user) +        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") +        |> json_response(:ok) + +      assert Enum.empty?(response) +    end + +    test "returns 404 error when specified user is not exist", %{conn: conn} do +      conn = get(conn, "/api/v1/pleroma/accounts/test/favourites") + +      assert json_response(conn, 404) == %{"error" => "Record not found"} +    end + +    test "returns 403 error when user has hidden own favorites", %{ +      conn: conn, +      current_user: current_user +    } do +      user = insert(:user, %{info: %{hide_favorites: true}}) +      activity = insert(:note_activity) +      CommonAPI.favorite(activity.id, user) + +      conn = +        conn +        |> assign(:user, current_user) +        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") + +      assert json_response(conn, 403) == %{"error" => "Can't get favorites"} +    end + +    test "hides favorites for new users by default", %{conn: conn, current_user: current_user} do +      user = insert(:user) +      activity = insert(:note_activity) +      CommonAPI.favorite(activity.id, user) + +      conn = +        conn +        |> assign(:user, current_user) +        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") + +      assert user.info.hide_favorites +      assert json_response(conn, 403) == %{"error" => "Can't get favorites"} +    end +  end +    describe "updating credentials" do      test "updates the user's bio", %{conn: conn} do        user = insert(:user) @@ -1858,6 +2214,78 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        assert user["locked"] == true      end +    test "updates the user's default scope", %{conn: conn} do +      user = insert(:user) + +      conn = +        conn +        |> assign(:user, user) +        |> patch("/api/v1/accounts/update_credentials", %{default_scope: "cofe"}) + +      assert user = json_response(conn, 200) +      assert user["source"]["privacy"] == "cofe" +    end + +    test "updates the user's hide_followers status", %{conn: conn} do +      user = insert(:user) + +      conn = +        conn +        |> assign(:user, user) +        |> patch("/api/v1/accounts/update_credentials", %{hide_followers: "true"}) + +      assert user = json_response(conn, 200) +      assert user["pleroma"]["hide_followers"] == true +    end + +    test "updates the user's hide_follows status", %{conn: conn} do +      user = insert(:user) + +      conn = +        conn +        |> assign(:user, user) +        |> patch("/api/v1/accounts/update_credentials", %{hide_follows: "true"}) + +      assert user = json_response(conn, 200) +      assert user["pleroma"]["hide_follows"] == true +    end + +    test "updates the user's hide_favorites status", %{conn: conn} do +      user = insert(:user) + +      conn = +        conn +        |> assign(:user, user) +        |> patch("/api/v1/accounts/update_credentials", %{hide_favorites: "true"}) + +      assert user = json_response(conn, 200) +      assert user["pleroma"]["hide_favorites"] == true +    end + +    test "updates the user's show_role status", %{conn: conn} do +      user = insert(:user) + +      conn = +        conn +        |> assign(:user, user) +        |> patch("/api/v1/accounts/update_credentials", %{show_role: "false"}) + +      assert user = json_response(conn, 200) +      assert user["source"]["pleroma"]["show_role"] == false +    end + +    test "updates the user's no_rich_text status", %{conn: conn} do +      user = insert(:user) + +      conn = +        conn +        |> assign(:user, user) +        |> patch("/api/v1/accounts/update_credentials", %{no_rich_text: "true"}) + +      assert user = json_response(conn, 200) +      assert user["source"]["pleroma"]["no_rich_text"] == true +    end +      test "updates the user's name", %{conn: conn} do        user = insert(:user) @@ -1929,13 +2357,14 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      conn = get(conn, "/api/v1/instance")      assert result = json_response(conn, 200) +    email = Pleroma.Config.get([:instance, :email])      # Note: not checking for "max_toot_chars" since it's optional      assert %{               "uri" => _,               "title" => _,               "description" => _,               "version" => _, -             "email" => _, +             "email" => from_config_email,               "urls" => %{                 "streaming_api" => _               }, @@ -1944,6 +2373,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do               "languages" => _,               "registrations" => _             } = result + +    assert email == from_config_email    end    test "get instance stats", %{conn: conn} do @@ -1958,7 +2389,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      {:ok, _} = TwitterAPI.create_status(user, %{"status" => "cofe"})      # Stats should count users with missing or nil `info.deactivated` value -    user = User.get_by_id(user.id) +    user = User.get_cached_by_id(user.id)      info_change = Changeset.change(user.info, %{deactivated: nil})      {:ok, _user} = @@ -2330,7 +2761,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        assert [link_header] = get_resp_header(conn, "link")        assert link_header =~ ~r/media_only=true/ -      assert link_header =~ ~r/since_id=#{notification2.id}/ +      assert link_header =~ ~r/min_id=#{notification2.id}/        assert link_header =~ ~r/max_id=#{notification1.id}/      end    end @@ -2653,4 +3084,49 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do        assert %{"error" => "Record not found"} = json_response(res_conn, 404)      end    end + +  test "Repeated posts that are replies incorrectly have in_reply_to_id null", %{conn: conn} do +    user1 = insert(:user) +    user2 = insert(:user) +    user3 = insert(:user) + +    {:ok, replied_to} = TwitterAPI.create_status(user1, %{"status" => "cofe"}) + +    # Reply to status from another user +    conn1 = +      conn +      |> assign(:user, user2) +      |> post("/api/v1/statuses", %{"status" => "xD", "in_reply_to_id" => replied_to.id}) + +    assert %{"content" => "xD", "id" => id} = json_response(conn1, 200) + +    activity = Activity.get_by_id_with_object(id) + +    assert Object.normalize(activity).data["inReplyTo"] == Object.normalize(replied_to).data["id"] +    assert Activity.get_in_reply_to_activity(activity).id == replied_to.id + +    # Reblog from the third user +    conn2 = +      conn +      |> assign(:user, user3) +      |> post("/api/v1/statuses/#{activity.id}/reblog") + +    assert %{"reblog" => %{"id" => id, "reblogged" => true, "reblogs_count" => 1}} = +             json_response(conn2, 200) + +    assert to_string(activity.id) == id + +    # Getting third user status +    conn3 = +      conn +      |> assign(:user, user3) +      |> get("api/v1/timelines/home") + +    [reblogged_activity] = json_response(conn3, 200) + +    assert reblogged_activity["reblog"]["in_reply_to_id"] == replied_to.id + +    replied_to_user = User.get_by_ap_id(replied_to.data["actor"]) +    assert reblogged_activity["reblog"]["in_reply_to_account_id"] == replied_to_user.id +  end  end diff --git a/test/web/mastodon_api/notification_view_test.exs b/test/web/mastodon_api/notification_view_test.exs index f2c1eb76c..977ea1e87 100644 --- a/test/web/mastodon_api/notification_view_test.exs +++ b/test/web/mastodon_api/notification_view_test.exs @@ -21,7 +21,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do      mentioned_user = insert(:user)      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{mentioned_user.nickname}"})      {:ok, [notification]} = Notification.create_notifications(activity) -    user = User.get_by_id(user.id) +    user = User.get_cached_by_id(user.id)      expected = %{        id: to_string(notification.id), diff --git a/test/web/mastodon_api/status_view_test.exs b/test/web/mastodon_api/status_view_test.exs index db2fdc2f6..5fddc6c58 100644 --- a/test/web/mastodon_api/status_view_test.exs +++ b/test/web/mastodon_api/status_view_test.exs @@ -6,8 +6,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do    use Pleroma.DataCase    alias Pleroma.Activity +  alias Pleroma.Bookmark +  alias Pleroma.Object +  alias Pleroma.Repo    alias Pleroma.User -  alias Pleroma.Web.ActivityPub.ActivityPub    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.CommonAPI.Utils    alias Pleroma.Web.MastodonAPI.AccountView @@ -53,14 +55,14 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do    test "a note with null content" do      note = insert(:note_activity) +    note_object = Object.normalize(note.data["object"])      data = -      note.data -      |> put_in(["object", "content"], nil) +      note_object.data +      |> Map.put("content", nil) -    note = -      note -      |> Map.put(:data, data) +    Object.change(note_object, %{data: data}) +    |> Object.update_and_set_cache()      User.get_cached_by_ap_id(note.data["actor"]) @@ -127,6 +129,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do        pleroma: %{          local: true,          conversation_id: convo_id, +        in_reply_to_account_acct: nil,          content: %{"text/plain" => HtmlSanitizeEx.strip_tags(note.data["object"]["content"])},          spoiler_text: %{"text/plain" => HtmlSanitizeEx.strip_tags(note.data["object"]["summary"])}        } @@ -151,6 +154,25 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      assert status.muted == true    end +  test "tells if the status is bookmarked" do +    user = insert(:user) + +    {:ok, activity} = CommonAPI.post(user, %{"status" => "Cute girls doing cute things"}) +    status = StatusView.render("status.json", %{activity: activity}) + +    assert status.bookmarked == false + +    status = StatusView.render("status.json", %{activity: activity, for: user}) + +    assert status.bookmarked == false + +    {:ok, _bookmark} = Bookmark.create(user.id, activity.id) + +    status = StatusView.render("status.json", %{activity: activity, for: user}) + +    assert status.bookmarked == true +  end +    test "a reply" do      note = insert(:note_activity)      user = insert(:user) @@ -177,7 +199,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      status = StatusView.render("status.json", %{activity: activity}) -    actor = User.get_by_ap_id(activity.actor) +    actor = User.get_cached_by_ap_id(activity.actor)      assert status.mentions ==               Enum.map([user, actor], fn u -> AccountView.render("mention.json", %{user: u}) end) @@ -230,7 +252,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      user = insert(:user)      {:ok, object} = -      ActivityPub.fetch_object_from_id( +      Pleroma.Object.Fetcher.fetch_object_from_id(          "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"        ) diff --git a/test/web/metadata/rel_me_test.exs b/test/web/metadata/rel_me_test.exs new file mode 100644 index 000000000..f66bf7834 --- /dev/null +++ b/test/web/metadata/rel_me_test.exs @@ -0,0 +1,18 @@ +defmodule Pleroma.Web.Metadata.Providers.RelMeTest do +  use Pleroma.DataCase +  import Pleroma.Factory +  alias Pleroma.Web.Metadata.Providers.RelMe + +  test "it renders all links with rel='me' from user bio" do +    bio = +      ~s(<a href="https://some-link.com">https://some-link.com</a> <a rel="me" href="https://another-link.com">https://another-link.com</a> +    <link href="http://some.com"> <link rel="me" href="http://some3.com>") + +    user = insert(:user, %{bio: bio}) + +    assert RelMe.build_tags(%{user: user}) == [ +             {:link, [rel: "me", href: "http://some3.com>"], []}, +             {:link, [rel: "me", href: "https://another-link.com"], []} +           ] +  end +end diff --git a/test/web/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs index ac7843f9b..6e96537ec 100644 --- a/test/web/oauth/oauth_controller_test.exs +++ b/test/web/oauth/oauth_controller_test.exs @@ -68,10 +68,12 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do            "/oauth/prepare_request",            %{              "provider" => "twitter", -            "scope" => "read follow", -            "client_id" => app.client_id, -            "redirect_uri" => app.redirect_uris, -            "state" => "a_state" +            "authorization" => %{ +              "scope" => "read follow", +              "client_id" => app.client_id, +              "redirect_uri" => app.redirect_uris, +              "state" => "a_state" +            }            }          ) @@ -104,7 +106,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        }        with_mock Pleroma.Web.Auth.Authenticator, -        get_registration: fn _, _ -> {:ok, registration} end do +        get_registration: fn _ -> {:ok, registration} end do          conn =            get(              conn, @@ -134,7 +136,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        }        with_mock Pleroma.Web.Auth.Authenticator, -        get_registration: fn _, _ -> {:ok, registration} end do +        get_registration: fn _ -> {:ok, registration} end do          conn =            get(              conn, @@ -193,12 +195,14 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do            conn,            "/oauth/registration_details",            %{ -            "scopes" => app.scopes, -            "client_id" => app.client_id, -            "redirect_uri" => app.redirect_uris, -            "state" => "a_state", -            "nickname" => nil, -            "email" => "john@doe.com" +            "authorization" => %{ +              "scopes" => app.scopes, +              "client_id" => app.client_id, +              "redirect_uri" => app.redirect_uris, +              "state" => "a_state", +              "nickname" => nil, +              "email" => "john@doe.com" +            }            }          ) @@ -221,12 +225,14 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do            "/oauth/register",            %{              "op" => "register", -            "scopes" => app.scopes, -            "client_id" => app.client_id, -            "redirect_uri" => app.redirect_uris, -            "state" => "a_state", -            "nickname" => "availablenick", -            "email" => "available@email.com" +            "authorization" => %{ +              "scopes" => app.scopes, +              "client_id" => app.client_id, +              "redirect_uri" => app.redirect_uris, +              "state" => "a_state", +              "nickname" => "availablenick", +              "email" => "available@email.com" +            }            }          ) @@ -244,17 +250,23 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        params = %{          "op" => "register", -        "scopes" => app.scopes, -        "client_id" => app.client_id, -        "redirect_uri" => app.redirect_uris, -        "state" => "a_state", -        "nickname" => "availablenickname", -        "email" => "available@email.com" +        "authorization" => %{ +          "scopes" => app.scopes, +          "client_id" => app.client_id, +          "redirect_uri" => app.redirect_uris, +          "state" => "a_state", +          "nickname" => "availablenickname", +          "email" => "available@email.com" +        }        }        for {bad_param, bad_param_value} <-              [{"nickname", another_user.nickname}, {"email", another_user.email}] do -        bad_params = Map.put(params, bad_param, bad_param_value) +        bad_registration_attrs = %{ +          "authorization" => Map.put(params["authorization"], bad_param, bad_param_value) +        } + +        bad_params = Map.merge(params, bad_registration_attrs)          conn =            conn @@ -281,12 +293,14 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do            "/oauth/register",            %{              "op" => "connect", -            "scopes" => app.scopes, -            "client_id" => app.client_id, -            "redirect_uri" => app.redirect_uris, -            "state" => "a_state", -            "auth_name" => user.nickname, -            "password" => "testpassword" +            "authorization" => %{ +              "scopes" => app.scopes, +              "client_id" => app.client_id, +              "redirect_uri" => app.redirect_uris, +              "state" => "a_state", +              "name" => user.nickname, +              "password" => "testpassword" +            }            }          ) @@ -304,12 +318,14 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        params = %{          "op" => "connect", -        "scopes" => app.scopes, -        "client_id" => app.client_id, -        "redirect_uri" => app.redirect_uris, -        "state" => "a_state", -        "auth_name" => user.nickname, -        "password" => "wrong password" +        "authorization" => %{ +          "scopes" => app.scopes, +          "client_id" => app.client_id, +          "redirect_uri" => app.redirect_uris, +          "state" => "a_state", +          "name" => user.nickname, +          "password" => "wrong password" +        }        }        conn = @@ -349,6 +365,27 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        assert html_response(conn, 200) =~ ~s(type="submit")      end +    test "properly handles internal calls with `authorization`-wrapped params", %{ +      app: app, +      conn: conn +    } do +      conn = +        get( +          conn, +          "/oauth/authorize", +          %{ +            "authorization" => %{ +              "response_type" => "code", +              "client_id" => app.client_id, +              "redirect_uri" => app.redirect_uris, +              "scope" => "read" +            } +          } +        ) + +      assert html_response(conn, 200) =~ ~s(type="submit") +    end +      test "renders authentication page if user is already authenticated but `force_login` is tru-ish",           %{app: app, conn: conn} do        token = insert(:oauth_token, app_id: app.id) diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index 2950f11c0..7441e5fce 100644 --- a/test/web/ostatus/ostatus_controller_test.exs +++ b/test/web/ostatus/ostatus_controller_test.exs @@ -6,7 +6,6 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do    use Pleroma.Web.ConnCase    import Pleroma.Factory    alias Pleroma.Object -  alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.OStatus.ActivityRepresenter @@ -41,7 +40,8 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        assert response(conn, 200)        # Set a wrong magic-key for a user so it has to refetch -      salmon_user = User.get_by_ap_id("http://gs.example.org:4040/index.php/user/1") +      salmon_user = User.get_cached_by_ap_id("http://gs.example.org:4040/index.php/user/1") +        # Wrong key        info_cng =          User.Info.remote_user_creation(salmon_user.info, %{ @@ -52,7 +52,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        salmon_user        |> Ecto.Changeset.change()        |> Ecto.Changeset.put_embed(:info, info_cng) -      |> Repo.update() +      |> User.update_and_set_cache()        conn =          build_conn() @@ -86,7 +86,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do    test "gets an object", %{conn: conn} do      note_activity = insert(:note_activity) -    user = User.get_by_ap_id(note_activity.data["actor"]) +    user = User.get_cached_by_ap_id(note_activity.data["actor"])      [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["object"]["id"]))      url = "/objects/#{uuid}" diff --git a/test/web/ostatus/ostatus_test.exs b/test/web/ostatus/ostatus_test.exs index 9fd100f63..2916caf8d 100644 --- a/test/web/ostatus/ostatus_test.exs +++ b/test/web/ostatus/ostatus_test.exs @@ -28,34 +28,35 @@ defmodule Pleroma.Web.OStatusTest do    test "handle incoming note - GS, Salmon" do      incoming = File.read!("test/fixtures/incoming_note_activity.xml")      {:ok, [activity]} = OStatus.handle_incoming(incoming) +    object = Object.normalize(activity.data["object"]) -    user = User.get_by_ap_id(activity.data["actor"]) +    user = User.get_cached_by_ap_id(activity.data["actor"])      assert user.info.note_count == 1      assert activity.data["type"] == "Create" -    assert activity.data["object"]["type"] == "Note" +    assert object.data["type"] == "Note" -    assert activity.data["object"]["id"] == -             "tag:gs.example.org:4040,2017-04-23:noticeId=29:objectType=note" +    assert object.data["id"] == "tag:gs.example.org:4040,2017-04-23:noticeId=29:objectType=note"      assert activity.data["published"] == "2017-04-23T14:51:03+00:00" -    assert activity.data["object"]["published"] == "2017-04-23T14:51:03+00:00" +    assert object.data["published"] == "2017-04-23T14:51:03+00:00"      assert activity.data["context"] ==               "tag:gs.example.org:4040,2017-04-23:objectType=thread:nonce=f09e22f58abd5c7b"      assert "http://pleroma.example.org:4000/users/lain3" in activity.data["to"] -    assert activity.data["object"]["emoji"] == %{"marko" => "marko.png", "reimu" => "reimu.png"} +    assert object.data["emoji"] == %{"marko" => "marko.png", "reimu" => "reimu.png"}      assert activity.local == false    end    test "handle incoming notes - GS, subscription" do      incoming = File.read!("test/fixtures/ostatus_incoming_post.xml")      {:ok, [activity]} = OStatus.handle_incoming(incoming) +    object = Object.normalize(activity.data["object"])      assert activity.data["type"] == "Create" -    assert activity.data["object"]["type"] == "Note" -    assert activity.data["object"]["actor"] == "https://social.heldscal.la/user/23211" -    assert activity.data["object"]["content"] == "Will it blend?" +    assert object.data["type"] == "Note" +    assert object.data["actor"] == "https://social.heldscal.la/user/23211" +    assert object.data["content"] == "Will it blend?"      user = User.get_cached_by_ap_id(activity.data["actor"])      assert User.ap_followers(user) in activity.data["to"]      assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"] @@ -64,20 +65,22 @@ defmodule Pleroma.Web.OStatusTest do    test "handle incoming notes with attachments - GS, subscription" do      incoming = File.read!("test/fixtures/incoming_websub_gnusocial_attachments.xml")      {:ok, [activity]} = OStatus.handle_incoming(incoming) +    object = Object.normalize(activity.data["object"])      assert activity.data["type"] == "Create" -    assert activity.data["object"]["type"] == "Note" -    assert activity.data["object"]["actor"] == "https://social.heldscal.la/user/23211" -    assert activity.data["object"]["attachment"] |> length == 2 -    assert activity.data["object"]["external_url"] == "https://social.heldscal.la/notice/2020923" +    assert object.data["type"] == "Note" +    assert object.data["actor"] == "https://social.heldscal.la/user/23211" +    assert object.data["attachment"] |> length == 2 +    assert object.data["external_url"] == "https://social.heldscal.la/notice/2020923"      assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]    end    test "handle incoming notes with tags" do      incoming = File.read!("test/fixtures/ostatus_incoming_post_tag.xml")      {:ok, [activity]} = OStatus.handle_incoming(incoming) +    object = Object.normalize(activity.data["object"]) -    assert activity.data["object"]["tag"] == ["nsfw"] +    assert object.data["tag"] == ["nsfw"]      assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]    end @@ -92,10 +95,11 @@ defmodule Pleroma.Web.OStatusTest do      incoming = File.read!("test/fixtures/incoming_reply_mastodon.xml")      {:ok, [activity]} = OStatus.handle_incoming(incoming) +    object = Object.normalize(activity.data["object"])      assert activity.data["type"] == "Create" -    assert activity.data["object"]["type"] == "Note" -    assert activity.data["object"]["actor"] == "https://mastodon.social/users/lambadalambda" +    assert object.data["type"] == "Note" +    assert object.data["actor"] == "https://mastodon.social/users/lambadalambda"      assert activity.data["context"] == "2hu"      assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]    end @@ -103,42 +107,47 @@ defmodule Pleroma.Web.OStatusTest do    test "handle incoming notes - Mastodon, with CW" do      incoming = File.read!("test/fixtures/mastodon-note-cw.xml")      {:ok, [activity]} = OStatus.handle_incoming(incoming) +    object = Object.normalize(activity.data["object"])      assert activity.data["type"] == "Create" -    assert activity.data["object"]["type"] == "Note" -    assert activity.data["object"]["actor"] == "https://mastodon.social/users/lambadalambda" -    assert activity.data["object"]["summary"] == "technologic" +    assert object.data["type"] == "Note" +    assert object.data["actor"] == "https://mastodon.social/users/lambadalambda" +    assert object.data["summary"] == "technologic"      assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]    end    test "handle incoming unlisted messages, put public into cc" do      incoming = File.read!("test/fixtures/mastodon-note-unlisted.xml")      {:ok, [activity]} = OStatus.handle_incoming(incoming) +    object = Object.normalize(activity.data["object"]) +      refute "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]      assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["cc"] -    refute "https://www.w3.org/ns/activitystreams#Public" in activity.data["object"]["to"] -    assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["object"]["cc"] +    refute "https://www.w3.org/ns/activitystreams#Public" in object.data["to"] +    assert "https://www.w3.org/ns/activitystreams#Public" in object.data["cc"]    end    test "handle incoming retweets - Mastodon, with CW" do      incoming = File.read!("test/fixtures/cw_retweet.xml")      {:ok, [[_activity, retweeted_activity]]} = OStatus.handle_incoming(incoming) +    retweeted_object = Object.normalize(retweeted_activity.data["object"]) -    assert retweeted_activity.data["object"]["summary"] == "Hey." +    assert retweeted_object.data["summary"] == "Hey."    end    test "handle incoming notes - GS, subscription, reply" do      incoming = File.read!("test/fixtures/ostatus_incoming_reply.xml")      {:ok, [activity]} = OStatus.handle_incoming(incoming) +    object = Object.normalize(activity.data["object"])      assert activity.data["type"] == "Create" -    assert activity.data["object"]["type"] == "Note" -    assert activity.data["object"]["actor"] == "https://social.heldscal.la/user/23211" +    assert object.data["type"] == "Note" +    assert object.data["actor"] == "https://social.heldscal.la/user/23211" -    assert activity.data["object"]["content"] == +    assert object.data["content"] ==               "@<a href=\"https://gs.archae.me/user/4687\" class=\"h-card u-url p-nickname mention\" title=\"shpbot\">shpbot</a> why not indeed." -    assert activity.data["object"]["inReplyTo"] == +    assert object.data["inReplyTo"] ==               "tag:gs.archae.me,2017-04-30:noticeId=778260:objectType=note"      assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"] @@ -150,17 +159,18 @@ defmodule Pleroma.Web.OStatusTest do      assert activity.data["type"] == "Announce"      assert activity.data["actor"] == "https://social.heldscal.la/user/23211" -    assert activity.data["object"] == retweeted_activity.data["object"]["id"] +    assert activity.data["object"] == retweeted_activity.data["object"]      assert "https://pleroma.soykaf.com/users/lain" in activity.data["to"]      refute activity.local      retweeted_activity = Activity.get_by_id(retweeted_activity.id) +    retweeted_object = Object.normalize(retweeted_activity.data["object"])      assert retweeted_activity.data["type"] == "Create"      assert retweeted_activity.data["actor"] == "https://pleroma.soykaf.com/users/lain"      refute retweeted_activity.local -    assert retweeted_activity.data["object"]["announcement_count"] == 1 -    assert String.contains?(retweeted_activity.data["object"]["content"], "mastodon") -    refute String.contains?(retweeted_activity.data["object"]["content"], "Test account") +    assert retweeted_object.data["announcement_count"] == 1 +    assert String.contains?(retweeted_object.data["content"], "mastodon") +    refute String.contains?(retweeted_object.data["content"], "Test account")    end    test "handle incoming retweets - GS, subscription - local message" do @@ -192,10 +202,11 @@ defmodule Pleroma.Web.OStatusTest do    test "handle incoming retweets - Mastodon, salmon" do      incoming = File.read!("test/fixtures/share.xml")      {:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming) +    retweeted_object = Object.normalize(retweeted_activity.data["object"])      assert activity.data["type"] == "Announce"      assert activity.data["actor"] == "https://mastodon.social/users/lambadalambda" -    assert activity.data["object"] == retweeted_activity.data["object"]["id"] +    assert activity.data["object"] == retweeted_activity.data["object"]      assert activity.data["id"] ==               "tag:mastodon.social,2017-05-03:objectId=4934452:objectType=Status" @@ -204,7 +215,7 @@ defmodule Pleroma.Web.OStatusTest do      assert retweeted_activity.data["type"] == "Create"      assert retweeted_activity.data["actor"] == "https://pleroma.soykaf.com/users/lain"      refute retweeted_activity.local -    refute String.contains?(retweeted_activity.data["object"]["content"], "Test account") +    refute String.contains?(retweeted_object.data["content"], "Test account")    end    test "handle incoming favorites - GS, websub" do @@ -214,7 +225,7 @@ defmodule Pleroma.Web.OStatusTest do        assert activity.data["type"] == "Like"        assert activity.data["actor"] == "https://social.heldscal.la/user/23211" -      assert activity.data["object"] == favorited_activity.data["object"]["id"] +      assert activity.data["object"] == favorited_activity.data["object"]        assert activity.data["id"] ==                 "tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061643:2017-05-05T09:12:50+00:00" @@ -223,7 +234,7 @@ defmodule Pleroma.Web.OStatusTest do        assert favorited_activity.data["type"] == "Create"        assert favorited_activity.data["actor"] == "https://shitposter.club/user/1" -      assert favorited_activity.data["object"]["id"] == +      assert favorited_activity.data["object"] ==                 "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"        refute favorited_activity.local @@ -258,17 +269,17 @@ defmodule Pleroma.Web.OStatusTest do    test "handle incoming replies" do      incoming = File.read!("test/fixtures/incoming_note_activity_answer.xml")      {:ok, [activity]} = OStatus.handle_incoming(incoming) +    object = Object.normalize(activity.data["object"])      assert activity.data["type"] == "Create" -    assert activity.data["object"]["type"] == "Note" +    assert object.data["type"] == "Note" -    assert activity.data["object"]["inReplyTo"] == +    assert object.data["inReplyTo"] ==               "http://pleroma.example.org:4000/objects/55bce8fc-b423-46b1-af71-3759ab4670bc"      assert "http://pleroma.example.org:4000/users/lain5" in activity.data["to"] -    assert activity.data["object"]["id"] == -             "tag:gs.example.org:4040,2017-04-25:noticeId=55:objectType=note" +    assert object.data["id"] == "tag:gs.example.org:4040,2017-04-25:noticeId=55:objectType=note"      assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]    end @@ -285,8 +296,8 @@ defmodule Pleroma.Web.OStatusTest do      assert activity.data["object"] == "https://pawoo.net/users/pekorino"      refute activity.local -    follower = User.get_by_ap_id(activity.data["actor"]) -    followed = User.get_by_ap_id(activity.data["object"]) +    follower = User.get_cached_by_ap_id(activity.data["actor"]) +    followed = User.get_cached_by_ap_id(activity.data["object"])      assert User.following?(follower, followed)    end @@ -309,8 +320,8 @@ defmodule Pleroma.Web.OStatusTest do      assert activity.data["object"]["object"] == "https://pawoo.net/users/pekorino"      refute activity.local -    follower = User.get_by_ap_id(activity.data["actor"]) -    followed = User.get_by_ap_id(activity.data["object"]["object"]) +    follower = User.get_cached_by_ap_id(activity.data["actor"]) +    followed = User.get_cached_by_ap_id(activity.data["object"]["object"])      refute User.following?(follower, followed)    end @@ -344,7 +355,7 @@ defmodule Pleroma.Web.OStatusTest do        {:ok, user} = OStatus.find_or_make_user(uri) -      user = Pleroma.User.get_by_id(user.id) +      user = Pleroma.User.get_cached_by_id(user.id)        assert user.name == "Constance Variable"        assert user.nickname == "lambadalambda@social.heldscal.la"        assert user.local == false @@ -495,7 +506,7 @@ defmodule Pleroma.Web.OStatusTest do          assert activity.data["actor"] == "https://shitposter.club/user/1" -        assert activity.data["object"]["id"] == +        assert activity.data["object"] ==                   "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"        end)      end @@ -504,7 +515,7 @@ defmodule Pleroma.Web.OStatusTest do        url = "https://social.sakamoto.gq/objects/0ccc1a2c-66b0-4305-b23a-7f7f2b040056"        {:ok, [activity]} = OStatus.fetch_activity_from_url(url)        assert activity.data["actor"] == "https://social.sakamoto.gq/users/eal" -      assert activity.data["object"]["id"] == url +      assert activity.data["object"] == url      end    end diff --git a/test/web/push/impl_test.exs b/test/web/push/impl_test.exs index 6bac2c9f6..1e948086a 100644 --- a/test/web/push/impl_test.exs +++ b/test/web/push/impl_test.exs @@ -5,6 +5,8 @@  defmodule Pleroma.Web.Push.ImplTest do    use Pleroma.DataCase +  alias Pleroma.Object +  alias Pleroma.Web.CommonAPI    alias Pleroma.Web.Push.Impl    alias Pleroma.Web.Push.Subscription @@ -52,16 +54,12 @@ defmodule Pleroma.Web.Push.ImplTest do        data: %{alerts: %{"follow" => true, "mention" => false}}      ) +    {:ok, activity} = CommonAPI.post(user, %{"status" => "<Lorem ipsum dolor sit amet."}) +      notif =        insert(:notification,          user: user, -        activity: %Pleroma.Activity{ -          data: %{ -            "type" => "Create", -            "actor" => user.ap_id, -            "object" => %{"content" => "<Lorem ipsum dolor sit amet."} -          } -        } +        activity: activity        )      assert Impl.perform(notif) == [:ok, :ok] @@ -100,48 +98,65 @@ defmodule Pleroma.Web.Push.ImplTest do    end    test "renders body for create activity" do +    user = insert(:user, nickname: "Bob") + +    {:ok, activity} = +      CommonAPI.post(user, %{ +        "status" => +          "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis." +      }) + +    object = Object.normalize(activity) +      assert Impl.format_body(               %{ -               activity: %{ -                 data: %{ -                   "type" => "Create", -                   "object" => %{ -                     "content" => -                       "<span>Lorem ipsum dolor sit amet</span>, consectetur :bear: adipiscing elit. Fusce sagittis finibus turpis." -                   } -                 } -               } +               activity: activity               }, -             %{nickname: "Bob"} +             user, +             object             ) ==               "@Bob: Lorem ipsum dolor sit amet, consectetur  adipiscing elit. Fusce sagittis fini..."    end    test "renders body for follow activity" do -    assert Impl.format_body(%{activity: %{data: %{"type" => "Follow"}}}, %{nickname: "Bob"}) == +    user = insert(:user, nickname: "Bob") +    other_user = insert(:user) +    {:ok, _, _, activity} = CommonAPI.follow(user, other_user) +    object = Object.normalize(activity) + +    assert Impl.format_body(%{activity: activity}, user, object) ==               "@Bob has followed you"    end    test "renders body for announce activity" do      user = insert(:user) -    note = -      insert(:note, %{ -        data: %{ -          "content" => -            "<span>Lorem ipsum dolor sit amet</span>, consectetur :bear: adipiscing elit. Fusce sagittis finibus turpis." -        } +    {:ok, activity} = +      CommonAPI.post(user, %{ +        "status" => +          "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."        }) -    note_activity = insert(:note_activity, %{note: note}) -    announce_activity = insert(:announce_activity, %{user: user, note_activity: note_activity}) +    {:ok, announce_activity, _} = CommonAPI.repeat(activity.id, user) +    object = Object.normalize(activity) -    assert Impl.format_body(%{activity: announce_activity}, user) == +    assert Impl.format_body(%{activity: announce_activity}, user, object) ==               "@#{user.nickname} repeated: Lorem ipsum dolor sit amet, consectetur  adipiscing elit. Fusce sagittis fini..."    end    test "renders body for like activity" do -    assert Impl.format_body(%{activity: %{data: %{"type" => "Like"}}}, %{nickname: "Bob"}) == +    user = insert(:user, nickname: "Bob") + +    {:ok, activity} = +      CommonAPI.post(user, %{ +        "status" => +          "<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis." +      }) + +    {:ok, activity, _} = CommonAPI.favorite(activity.id, user) +    object = Object.normalize(activity) + +    assert Impl.format_body(%{activity: activity}, user, object) ==               "@Bob has favorited your post"    end  end diff --git a/test/web/salmon/salmon_test.exs b/test/web/salmon/salmon_test.exs index 35503259b..7532578ca 100644 --- a/test/web/salmon/salmon_test.exs +++ b/test/web/salmon/salmon_test.exs @@ -99,7 +99,7 @@ defmodule Pleroma.Web.Salmon.SalmonTest do      }      {:ok, activity} = Repo.insert(%Activity{data: activity_data, recipients: activity_data["to"]}) -    user = User.get_by_ap_id(activity.data["actor"]) +    user = User.get_cached_by_ap_id(activity.data["actor"])      {:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user)      poster = fn url, _data, _headers -> diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs index 72b7ea85e..43ad71a16 100644 --- a/test/web/twitter_api/twitter_api_controller_test.exs +++ b/test/web/twitter_api/twitter_api_controller_test.exs @@ -22,8 +22,9 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do    alias Pleroma.Web.TwitterAPI.TwitterAPI    alias Pleroma.Web.TwitterAPI.UserView -  import Pleroma.Factory    import Mock +  import Pleroma.Factory +  import Swoosh.TestAssertions    @banner "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7" @@ -269,7 +270,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do      test "returns one status", %{conn: conn} do        user = insert(:user)        {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey!"}) -      actor = Repo.get_by!(User, ap_id: activity.data["actor"]) +      actor = User.get_cached_by_ap_id(activity.data["actor"])        conn =          conn @@ -719,7 +720,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/friendships/create.json", %{user_id: followed.id}) -      current_user = User.get_by_id(current_user.id) +      current_user = User.get_cached_by_id(current_user.id)        assert User.ap_followers(followed) in current_user.following        assert json_response(conn, 200) == @@ -734,8 +735,8 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/friendships/create.json", %{user_id: followed.id}) -      current_user = User.get_by_id(current_user.id) -      followed = User.get_by_id(followed.id) +      current_user = User.get_cached_by_id(current_user.id) +      followed = User.get_cached_by_id(followed.id)        refute User.ap_followers(followed) in current_user.following @@ -764,7 +765,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/friendships/destroy.json", %{user_id: followed.id}) -      current_user = User.get_by_id(current_user.id) +      current_user = User.get_cached_by_id(current_user.id)        assert current_user.following == [current_user.ap_id]        assert json_response(conn, 200) == @@ -788,7 +789,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/blocks/create.json", %{user_id: blocked.id}) -      current_user = User.get_by_id(current_user.id) +      current_user = User.get_cached_by_id(current_user.id)        assert User.blocks?(current_user, blocked)        assert json_response(conn, 200) == @@ -815,7 +816,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/blocks/destroy.json", %{user_id: blocked.id}) -      current_user = User.get_by_id(current_user.id) +      current_user = User.get_cached_by_id(current_user.id)        assert current_user.info.blocks == []        assert json_response(conn, 200) == @@ -846,7 +847,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/qvitter/update_avatar.json", %{img: avatar_image}) -      current_user = User.get_by_id(current_user.id) +      current_user = User.get_cached_by_id(current_user.id)        assert is_map(current_user.avatar)        assert json_response(conn, 200) == @@ -955,7 +956,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> post(request_path)        activity = Activity.get_by_id(note_activity.id) -      activity_user = User.get_by_ap_id(note_activity.data["actor"]) +      activity_user = User.get_cached_by_ap_id(note_activity.data["actor"])        assert json_response(response, 200) ==                 ActivityView.render("activity.json", %{ @@ -993,7 +994,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> post(request_path)        activity = Activity.get_by_id(note_activity.id) -      activity_user = User.get_by_ap_id(note_activity.data["actor"]) +      activity_user = User.get_cached_by_ap_id(note_activity.data["actor"])        assert json_response(response, 200) ==                 ActivityView.render("activity.json", %{ @@ -1021,7 +1022,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        user = json_response(conn, 200) -      fetched_user = User.get_by_nickname("lain") +      fetched_user = User.get_cached_by_nickname("lain")        assert user == UserView.render("show.json", %{user: fetched_user})      end @@ -1063,8 +1064,14 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do      test "it sends an email to user", %{user: user} do        token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id) -      Swoosh.TestAssertions.assert_email_sent( -        Pleroma.UserEmail.password_reset_email(user, token_record.token) +      email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token) +      notify_email = Pleroma.Config.get([:instance, :notify_email]) +      instance_name = Pleroma.Config.get([:instance, :name]) + +      assert_email_sent( +        from: {instance_name, notify_email}, +        to: {user.name, user.email}, +        html_body: email.html_body        )      end    end @@ -1109,7 +1116,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do      test "it confirms the user account", %{conn: conn, user: user} do        get(conn, "/api/account/confirm_email/#{user.id}/#{user.info.confirmation_token}") -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        refute user.info.confirmation_pending        refute user.info.confirmation_token @@ -1163,7 +1170,15 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        |> assign(:user, user)        |> post("/api/account/resend_confirmation_email?email=#{user.email}") -      Swoosh.TestAssertions.assert_email_sent(Pleroma.UserEmail.account_confirmation_email(user)) +      email = Pleroma.Emails.UserEmail.account_confirmation_email(user) +      notify_email = Pleroma.Config.get([:instance, :notify_email]) +      instance_name = Pleroma.Config.get([:instance, :name]) + +      assert_email_sent( +        from: {instance_name, notify_email}, +        to: {user.name, user.email}, +        html_body: email.html_body +      )      end    end @@ -1727,7 +1742,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          })        assert json_response(conn, 200) == %{"status" => "success"} -      fetched_user = User.get_by_id(current_user.id) +      fetched_user = User.get_cached_by_id(current_user.id)        assert Pbkdf2.checkpw("newpass", fetched_user.password_hash) == true      end    end @@ -1768,8 +1783,8 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        {:ok, _activity} = ActivityPub.follow(other_user, user) -      user = User.get_by_id(user.id) -      other_user = User.get_by_id(other_user.id) +      user = User.get_cached_by_id(user.id) +      other_user = User.get_cached_by_id(other_user.id)        assert User.following?(other_user, user) == false @@ -1808,8 +1823,8 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        {:ok, _activity} = ActivityPub.follow(other_user, user) -      user = User.get_by_id(user.id) -      other_user = User.get_by_id(other_user.id) +      user = User.get_cached_by_id(user.id) +      other_user = User.get_cached_by_id(other_user.id)        assert User.following?(other_user, user) == false @@ -1831,8 +1846,8 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        {:ok, _activity} = ActivityPub.follow(other_user, user) -      user = User.get_by_id(user.id) -      other_user = User.get_by_id(other_user.id) +      user = User.get_cached_by_id(user.id) +      other_user = User.get_cached_by_id(other_user.id)        assert User.following?(other_user, user) == false @@ -1901,7 +1916,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do    describe "POST /api/media/metadata/create" do      setup do        object = insert(:note) -      user = User.get_by_ap_id(object.data["actor"]) +      user = User.get_cached_by_ap_id(object.data["actor"])        %{object: object, user: user}      end diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index a4540e651..d601c8f1f 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -41,18 +41,19 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      input = %{        "status" => -        "Hello again, @shp.<script></script>\nThis is on another :moominmamma: line. #2hu #epic #phantasmagoric", +        "Hello again, @shp.<script></script>\nThis is on another :firefox: line. #2hu #epic #phantasmagoric",        "media_ids" => [object.id]      }      {:ok, activity = %Activity{}} = TwitterAPI.create_status(user, input) +    object = Object.normalize(activity.data["object"])      expected_text = -      "Hello again, <span class='h-card'><a data-user='#{mentioned_user.id}' class='u-url mention' href='shp'>@<span>shp</span></a></span>.<script></script><br>This is on another :moominmamma: line. <a class='hashtag' data-tag='2hu' href='http://localhost:4001/tag/2hu' rel='tag'>#2hu</a> <a class='hashtag' data-tag='epic' href='http://localhost:4001/tag/epic' rel='tag'>#epic</a> <a class='hashtag' data-tag='phantasmagoric' href='http://localhost:4001/tag/phantasmagoric' rel='tag'>#phantasmagoric</a><br><a href=\"http://example.org/image.jpg\" class='attachment'>image.jpg</a>" +      "Hello again, <span class='h-card'><a data-user='#{mentioned_user.id}' class='u-url mention' href='shp'>@<span>shp</span></a></span>.<script></script><br>This is on another :firefox: line. <a class='hashtag' data-tag='2hu' href='http://localhost:4001/tag/2hu' rel='tag'>#2hu</a> <a class='hashtag' data-tag='epic' href='http://localhost:4001/tag/epic' rel='tag'>#epic</a> <a class='hashtag' data-tag='phantasmagoric' href='http://localhost:4001/tag/phantasmagoric' rel='tag'>#phantasmagoric</a><br><a href=\"http://example.org/image.jpg\" class='attachment'>image.jpg</a>" -    assert get_in(activity.data, ["object", "content"]) == expected_text -    assert get_in(activity.data, ["object", "type"]) == "Note" -    assert get_in(activity.data, ["object", "actor"]) == user.ap_id +    assert get_in(object.data, ["content"]) == expected_text +    assert get_in(object.data, ["type"]) == "Note" +    assert get_in(object.data, ["actor"]) == user.ap_id      assert get_in(activity.data, ["actor"]) == user.ap_id      assert Enum.member?(get_in(activity.data, ["cc"]), User.ap_followers(user)) @@ -64,21 +65,20 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      assert Enum.member?(get_in(activity.data, ["to"]), "shp")      assert activity.local == true -    assert %{"moominmamma" => "http://localhost:4001/finmoji/128px/moominmamma-128.png"} = -             activity.data["object"]["emoji"] +    assert %{"firefox" => "http://localhost:4001/emoji/Firefox.gif"} = object.data["emoji"]      # hashtags -    assert activity.data["object"]["tag"] == ["2hu", "epic", "phantasmagoric"] +    assert object.data["tag"] == ["2hu", "epic", "phantasmagoric"]      # Add a context      assert is_binary(get_in(activity.data, ["context"])) -    assert is_binary(get_in(activity.data, ["object", "context"])) +    assert is_binary(get_in(object.data, ["context"])) -    assert is_list(activity.data["object"]["attachment"]) +    assert is_list(object.data["attachment"]) -    assert activity.data["object"] == Object.get_by_ap_id(activity.data["object"]["id"]).data +    assert activity.data["object"] == object.data["id"] -    user = User.get_by_ap_id(user.ap_id) +    user = User.get_cached_by_ap_id(user.ap_id)      assert user.info.note_count == 1    end @@ -91,6 +91,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      }      {:ok, activity = %Activity{}} = TwitterAPI.create_status(user, input) +    object = Object.normalize(activity.data["object"])      input = %{        "status" => "Here's your (you).", @@ -98,14 +99,14 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      }      {:ok, reply = %Activity{}} = TwitterAPI.create_status(user, input) +    reply_object = Object.normalize(reply.data["object"])      assert get_in(reply.data, ["context"]) == get_in(activity.data, ["context"]) -    assert get_in(reply.data, ["object", "context"]) == -             get_in(activity.data, ["object", "context"]) +    assert get_in(reply_object.data, ["context"]) == get_in(object.data, ["context"]) -    assert get_in(reply.data, ["object", "inReplyTo"]) == get_in(activity.data, ["object", "id"]) -    assert get_in(reply.data, ["object", "inReplyToStatusId"]) == activity.id +    assert get_in(reply_object.data, ["inReplyTo"]) == get_in(activity.data, ["object"]) +    assert Activity.get_in_reply_to_activity(reply).id == activity.id    end    test "Follow another user using user_id" do @@ -128,7 +129,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      assert User.ap_followers(followed) in user.following -    followed = User.get_by_ap_id(followed.ap_id) +    followed = User.get_cached_by_ap_id(followed.ap_id)      assert followed.info.follower_count == 1      {:error, msg} = TwitterAPI.follow(user, %{"screen_name" => followed.nickname}) @@ -280,7 +281,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      {:ok, user} = TwitterAPI.register_user(data) -    fetched_user = User.get_by_nickname("lain") +    fetched_user = User.get_cached_by_nickname("lain")      assert UserView.render("show.json", %{user: user}) ==               UserView.render("show.json", %{user: fetched_user}) @@ -298,7 +299,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      {:ok, user} = TwitterAPI.register_user(data) -    fetched_user = User.get_by_nickname("lain") +    fetched_user = User.get_cached_by_nickname("lain")      assert UserView.render("show.json", %{user: user}) ==               UserView.render("show.json", %{user: fetched_user}) @@ -325,7 +326,16 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      assert user.info.confirmation_pending -    Swoosh.TestAssertions.assert_email_sent(Pleroma.UserEmail.account_confirmation_email(user)) +    email = Pleroma.Emails.UserEmail.account_confirmation_email(user) + +    notify_email = Pleroma.Config.get([:instance, :notify_email]) +    instance_name = Pleroma.Config.get([:instance, :name]) + +    Swoosh.TestAssertions.assert_email_sent( +      from: {instance_name, notify_email}, +      to: {user.name, user.email}, +      html_body: email.html_body +    )    end    test "it registers a new user and parses mentions in the bio" do @@ -384,7 +394,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        {:ok, user} = TwitterAPI.register_user(data) -      fetched_user = User.get_by_nickname("vinny") +      fetched_user = User.get_cached_by_nickname("vinny")        invite = Repo.get_by(UserInviteToken, token: invite.token)        assert invite.used == true @@ -407,7 +417,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        {:error, msg} = TwitterAPI.register_user(data)        assert msg == "Invalid token" -      refute User.get_by_nickname("GrimReaper") +      refute User.get_cached_by_nickname("GrimReaper")      end      test "returns error on expired token" do @@ -427,7 +437,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        {:error, msg} = TwitterAPI.register_user(data)        assert msg == "Expired token" -      refute User.get_by_nickname("GrimReaper") +      refute User.get_cached_by_nickname("GrimReaper")      end    end @@ -452,7 +462,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        check_fn = fn invite ->          data = Map.put(data, "token", invite.token)          {:ok, user} = TwitterAPI.register_user(data) -        fetched_user = User.get_by_nickname("vinny") +        fetched_user = User.get_cached_by_nickname("vinny")          assert UserView.render("show.json", %{user: user}) ==                   UserView.render("show.json", %{user: fetched_user}) @@ -489,7 +499,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        {:error, msg} = TwitterAPI.register_user(data)        assert msg == "Expired token" -      refute User.get_by_nickname("vinny") +      refute User.get_cached_by_nickname("vinny")        invite = Repo.get_by(UserInviteToken, token: invite.token)        refute invite.used @@ -524,7 +534,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        }        {:ok, user} = TwitterAPI.register_user(data) -      fetched_user = User.get_by_nickname("vinny") +      fetched_user = User.get_cached_by_nickname("vinny")        invite = Repo.get_by(UserInviteToken, token: invite.token)        assert invite.used == true @@ -545,7 +555,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        {:error, msg} = TwitterAPI.register_user(data)        assert msg == "Expired token" -      refute User.get_by_nickname("GrimReaper") +      refute User.get_cached_by_nickname("GrimReaper")      end    end @@ -575,7 +585,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        }        {:ok, user} = TwitterAPI.register_user(data) -      fetched_user = User.get_by_nickname("vinny") +      fetched_user = User.get_cached_by_nickname("vinny")        invite = Repo.get_by(UserInviteToken, token: invite.token)        refute invite.used @@ -600,7 +610,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        }        {:ok, user} = TwitterAPI.register_user(data) -      fetched_user = User.get_by_nickname("vinny") +      fetched_user = User.get_cached_by_nickname("vinny")        invite = Repo.get_by(UserInviteToken, token: invite.token)        assert invite.used == true @@ -620,7 +630,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        {:error, msg} = TwitterAPI.register_user(data)        assert msg == "Expired token" -      refute User.get_by_nickname("GrimReaper") +      refute User.get_cached_by_nickname("GrimReaper")      end      test "returns error on overdue date" do @@ -640,7 +650,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        {:error, msg} = TwitterAPI.register_user(data)        assert msg == "Expired token" -      refute User.get_by_nickname("GrimReaper") +      refute User.get_cached_by_nickname("GrimReaper")      end      test "returns error on with overdue date and after max" do @@ -662,7 +672,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        {:error, msg} = TwitterAPI.register_user(data)        assert msg == "Expired token" -      refute User.get_by_nickname("GrimReaper") +      refute User.get_cached_by_nickname("GrimReaper")      end    end @@ -678,7 +688,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      {:error, error_object} = TwitterAPI.register_user(data)      assert is_binary(error_object[:error]) -    refute User.get_by_nickname("lain") +    refute User.get_cached_by_nickname("lain")    end    test "it assigns an integer conversation_id" do @@ -699,7 +709,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        id = "https://mastodon.social/users/lambadalambda"        user = insert(:user)        {:ok, represented} = TwitterAPI.get_external_profile(user, id) -      remote = User.get_by_ap_id(id) +      remote = User.get_cached_by_ap_id(id)        assert represented["id"] == UserView.render("show.json", %{user: remote, for: user})["id"] diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index a4b3d651a..56474447b 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -26,6 +26,21 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert response == "job started"      end +    test "it imports new-style mastodon follow lists", %{conn: conn} do +      user1 = insert(:user) +      user2 = insert(:user) + +      response = +        conn +        |> assign(:user, user1) +        |> post("/api/pleroma/follow_import", %{ +          "list" => "Account address,Show boosts\n#{user2.ap_id},true" +        }) +        |> json_response(:ok) + +      assert response == "job started" +    end +      test "requires 'follow' permission", %{conn: conn} do        token1 = insert(:oauth_token, scopes: ["read", "write"])        token2 = insert(:oauth_token, scopes: ["follow"]) @@ -230,4 +245,10 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert html_response(response, 200) =~ "Log in to follow"      end    end + +  test "GET /api/pleroma/healthcheck", %{conn: conn} do +    conn = get(conn, "/api/pleroma/healthcheck") + +    assert conn.status in [200, 503] +  end  end diff --git a/test/web/twitter_api/views/activity_view_test.exs b/test/web/twitter_api/views/activity_view_test.exs index ee9a0c834..85815ba7e 100644 --- a/test/web/twitter_api/views/activity_view_test.exs +++ b/test/web/twitter_api/views/activity_view_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do    use Pleroma.DataCase    alias Pleroma.Activity +  alias Pleroma.Object    alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub @@ -90,16 +91,16 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do    test "a create activity with a summary containing emoji" do      {:ok, activity} =        CommonAPI.post(insert(:user), %{ -        "spoiler_text" => ":woollysocks: meow", +        "spoiler_text" => ":firefox: meow",          "status" => "."        })      result = ActivityView.render("activity.json", activity: activity) -    expected = ":woollysocks: meow" +    expected = ":firefox: meow"      expected_html = -      "<img height=\"32px\" width=\"32px\" alt=\"woollysocks\" title=\"woollysocks\" src=\"http://localhost:4001/finmoji/128px/woollysocks-128.png\" /> meow" +      "<img height=\"32px\" width=\"32px\" alt=\"firefox\" title=\"firefox\" src=\"http://localhost:4001/emoji/Firefox.gif\" /> meow"      assert result["summary"] == expected      assert result["summary_html"] == expected_html @@ -125,10 +126,11 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do      other_user = insert(:user, %{nickname: "shp"})      {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"}) +    object = Object.normalize(activity.data["object"])      result = ActivityView.render("activity.json", activity: activity) -    convo_id = Utils.context_to_conversation_id(activity.data["object"]["context"]) +    convo_id = Utils.context_to_conversation_id(object.data["context"])      expected = %{        "activity_type" => "post", @@ -136,8 +138,8 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do        "attentions" => [          UserView.render("show.json", %{user: other_user})        ], -      "created_at" => activity.data["object"]["published"] |> Utils.date_to_asctime(), -      "external_url" => activity.data["object"]["id"], +      "created_at" => object.data["published"] |> Utils.date_to_asctime(), +      "external_url" => object.data["id"],        "fave_num" => 0,        "favorited" => false,        "id" => activity.id, @@ -161,7 +163,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do          }\">@<span>shp</span></a></span>!",        "tags" => [],        "text" => "Hey @shp!", -      "uri" => activity.data["object"]["id"], +      "uri" => object.data["id"],        "user" => UserView.render("show.json", %{user: user}),        "visibility" => "direct",        "card" => nil, @@ -175,8 +177,9 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do      user = insert(:user)      other_user = insert(:user, %{nickname: "shp"})      {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!"}) +    object = Object.normalize(activity.data["object"]) -    convo_id = Utils.context_to_conversation_id(activity.data["object"]["context"]) +    convo_id = Utils.context_to_conversation_id(object.data["context"])      mocks = [        { @@ -277,9 +280,9 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do      other_user = insert(:user, %{nickname: "shp"})      {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!"}) -    {:ok, announce, _object} = CommonAPI.repeat(activity.id, other_user) +    {:ok, announce, object} = CommonAPI.repeat(activity.id, other_user) -    convo_id = Utils.context_to_conversation_id(activity.data["object"]["context"]) +    convo_id = Utils.context_to_conversation_id(object.data["context"])      activity = Activity.get_by_id(activity.id) @@ -357,7 +360,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do    test "a peertube video" do      {:ok, object} = -      ActivityPub.fetch_object_from_id( +      Pleroma.Object.Fetcher.fetch_object_from_id(          "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"        ) @@ -368,4 +371,14 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do      assert length(result["attachments"]) == 1      assert result["summary"] == "Friday Night"    end + +  test "special characters are not escaped in text field for status created" do +    text = "<3 is on the way" + +    {:ok, activity} = CommonAPI.post(insert(:user), %{"status" => text}) + +    result = ActivityView.render("activity.json", activity: activity) + +    assert result["text"] == text +  end  end diff --git a/test/web/twitter_api/views/user_view_test.exs b/test/web/twitter_api/views/user_view_test.exs index 0feaf4b64..c99dbddeb 100644 --- a/test/web/twitter_api/views/user_view_test.exs +++ b/test/web/twitter_api/views/user_view_test.exs @@ -89,29 +89,34 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "following" => false,        "follows_you" => false,        "statusnet_blocking" => false, -      "rights" => %{ -        "delete_others_notice" => false, -        "admin" => false -      },        "statusnet_profile_url" => user.ap_id,        "cover_photo" => banner,        "background_image" => nil,        "is_local" => true,        "locked" => false, -      "default_scope" => "public", -      "no_rich_text" => false,        "hide_follows" => false,        "hide_followers" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false,          "tags" => [] -      } +      }, +      "rights" => %{"admin" => false, "delete_others_notice" => false}, +      "role" => "member"      }      assert represented == UserView.render("show.json", %{user: user})    end +  test "User exposes settings for themselves and only for themselves", %{user: user} do +    as_user = UserView.render("show.json", %{user: user, for: user}) +    assert as_user["default_scope"] == user.info.default_scope +    assert as_user["no_rich_text"] == user.info.no_rich_text +    as_stranger = UserView.render("show.json", %{user: user}) +    refute as_stranger["default_scope"] +    refute as_stranger["no_rich_text"] +  end +    test "A user for a given other follower", %{user: user} do      follower = insert(:user, %{following: [User.ap_followers(user)]})      {:ok, user} = User.update_follower_count(user) @@ -137,24 +142,20 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "following" => true,        "follows_you" => false,        "statusnet_blocking" => false, -      "rights" => %{ -        "delete_others_notice" => false, -        "admin" => false -      },        "statusnet_profile_url" => user.ap_id,        "cover_photo" => banner,        "background_image" => nil,        "is_local" => true,        "locked" => false, -      "default_scope" => "public", -      "no_rich_text" => false,        "hide_follows" => false,        "hide_followers" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false,          "tags" => [] -      } +      }, +      "rights" => %{"admin" => false, "delete_others_notice" => false}, +      "role" => "member"      }      assert represented == UserView.render("show.json", %{user: user, for: follower}) @@ -186,24 +187,20 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "following" => false,        "follows_you" => true,        "statusnet_blocking" => false, -      "rights" => %{ -        "delete_others_notice" => false, -        "admin" => false -      },        "statusnet_profile_url" => follower.ap_id,        "cover_photo" => banner,        "background_image" => nil,        "is_local" => true,        "locked" => false, -      "default_scope" => "public", -      "no_rich_text" => false,        "hide_follows" => false,        "hide_followers" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false,          "tags" => [] -      } +      }, +      "rights" => %{"admin" => false, "delete_others_notice" => false}, +      "role" => "member"      }      assert represented == UserView.render("show.json", %{user: follower, for: user}) @@ -272,27 +269,23 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "following" => false,        "follows_you" => false,        "statusnet_blocking" => true, -      "rights" => %{ -        "delete_others_notice" => false, -        "admin" => false -      },        "statusnet_profile_url" => user.ap_id,        "cover_photo" => banner,        "background_image" => nil,        "is_local" => true,        "locked" => false, -      "default_scope" => "public", -      "no_rich_text" => false,        "hide_follows" => false,        "hide_followers" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false,          "tags" => [] -      } +      }, +      "rights" => %{"admin" => false, "delete_others_notice" => false}, +      "role" => "member"      } -    blocker = User.get_by_id(blocker.id) +    blocker = User.get_cached_by_id(blocker.id)      assert represented == UserView.render("show.json", %{user: user, for: blocker})    end | 
