diff options
Diffstat (limited to 'test')
32 files changed, 289 insertions, 1959 deletions
| diff --git a/test/conversation/participation_test.exs b/test/conversation/participation_test.exs index f430bdf75..a5af0d1b2 100644 --- a/test/conversation/participation_test.exs +++ b/test/conversation/participation_test.exs @@ -23,6 +23,39 @@ defmodule Pleroma.Conversation.ParticipationTest do      assert %Pleroma.Conversation{} = participation.conversation    end +  test "for a new conversation or a reply, it doesn't mark the author's participation as unread" do +    user = insert(:user) +    other_user = insert(:user) + +    {:ok, _} = +      CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"}) + +    user = User.get_cached_by_id(user.id) +    other_user = User.get_cached_by_id(other_user.id) + +    [%{read: true}] = Participation.for_user(user) +    [%{read: false} = participation] = Participation.for_user(other_user) + +    assert User.get_cached_by_id(user.id).info.unread_conversation_count == 0 +    assert User.get_cached_by_id(other_user.id).info.unread_conversation_count == 1 + +    {:ok, _} = +      CommonAPI.post(other_user, %{ +        "status" => "Hey @#{user.nickname}.", +        "visibility" => "direct", +        "in_reply_to_conversation_id" => participation.id +      }) + +    user = User.get_cached_by_id(user.id) +    other_user = User.get_cached_by_id(other_user.id) + +    [%{read: false}] = Participation.for_user(user) +    [%{read: true}] = Participation.for_user(other_user) + +    assert User.get_cached_by_id(user.id).info.unread_conversation_count == 1 +    assert User.get_cached_by_id(other_user.id).info.unread_conversation_count == 0 +  end +    test "for a new conversation, it sets the recipents of the participation" do      user = insert(:user)      other_user = insert(:user) @@ -32,7 +65,7 @@ defmodule Pleroma.Conversation.ParticipationTest do        CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"})      user = User.get_cached_by_id(user.id) -    other_user = User.get_cached_by_id(user.id) +    other_user = User.get_cached_by_id(other_user.id)      [participation] = Participation.for_user(user)      participation = Pleroma.Repo.preload(participation, :recipients) diff --git a/test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.json b/test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.json new file mode 100644 index 000000000..4b7b4df44 --- /dev/null +++ b/test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.json @@ -0,0 +1 @@ +{"@context":["https://www.w3.org/ns/activitystreams","https://shitposter.club/schemas/litepub-0.1.jsonld",{"@language":"und"}],"actor":"https://shitposter.club/users/moonman","attachment":[],"attributedTo":"https://shitposter.club/users/moonman","cc":["https://shitposter.club/users/moonman/followers"],"content":"@<a href=\"https://shitposter.club/users/9655\" class=\"h-card mention\" title=\"Solidarity for Pigs\">neimzr4luzerz</a> @<a href=\"https://gs.smuglo.li/user/2326\" class=\"h-card mention\" title=\"Dolus_McHonest\">dolus</a> childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English","context":"tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26","conversation":"tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26","id":"tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment","inReplyTo":"tag:shitposter.club,2017-05-05:noticeId=2827849:objectType=comment","inReplyToStatusId":2827849,"published":"2017-05-05T08:51:48Z","sensitive":false,"summary":null,"tag":[],"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Note"}
\ No newline at end of file diff --git a/test/fixtures/tesla_mock/moonman@shitposter.club.json b/test/fixtures/tesla_mock/moonman@shitposter.club.json new file mode 100644 index 000000000..8f9ced1dd --- /dev/null +++ b/test/fixtures/tesla_mock/moonman@shitposter.club.json @@ -0,0 +1 @@ +{"@context":["https://www.w3.org/ns/activitystreams","https://shitposter.club/schemas/litepub-0.1.jsonld",{"@language":"und"}],"attachment":[],"endpoints":{"oauthAuthorizationEndpoint":"https://shitposter.club/oauth/authorize","oauthRegistrationEndpoint":"https://shitposter.club/api/v1/apps","oauthTokenEndpoint":"https://shitposter.club/oauth/token","sharedInbox":"https://shitposter.club/inbox"},"followers":"https://shitposter.club/users/moonman/followers","following":"https://shitposter.club/users/moonman/following","icon":{"type":"Image","url":"https://shitposter.club/media/bda6e00074f6a02cbf32ddb0abec08151eb4c795e580927ff7ad638d00cde4c8.jpg?name=blob.jpg"},"id":"https://shitposter.club/users/moonman","image":{"type":"Image","url":"https://shitposter.club/media/4eefb90d-cdb2-2b4f-5f29-7612856a99d2/4eefb90d-cdb2-2b4f-5f29-7612856a99d2.jpeg"},"inbox":"https://shitposter.club/users/moonman/inbox","manuallyApprovesFollowers":false,"name":"Captain Howdy","outbox":"https://shitposter.club/users/moonman/outbox","preferredUsername":"moonman","publicKey":{"id":"https://shitposter.club/users/moonman#main-key","owner":"https://shitposter.club/users/moonman","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnOTitJ19ZqcOZHwSXQUM\nJq9ip4GNblp83LgwG1t5c2h2iaI3fXMsB4EaEBs8XHsoSFyDeDNRSPE3mtVgOnWv\n1eaXWMDerBT06th6DrElD9k5IoEPtZRY4HtZa1xGnte7+6RjuPOzZ1fR9C8WxGgi\nwb9iOUMhazpo85fC3iKCAL5XhiuA3Nas57MDJgueeI9BF+2oFelFZdMSWwG96uch\niDfp8nfpkmzYI6SWbylObjm8RsfZbGTosLHwWyJPEITeYI/5M0XwJe9dgVI1rVNU\n52kplWOGTo1rm6V0AMHaYAd9RpiXxe8xt5OeranrsE/5LvEQUl0fz7SE36YmsOaH\nTwIDAQAB\n-----END PUBLIC KEY-----\n\n"},"summary":"EMAIL:shitposterclub@gmail.com<br>XMPP: moon@talk.shitposter.club<br>PRONOUNS: none of your business<br><br>Purported leftist kike piece of shit","tag":[],"type":"Person","url":"https://shitposter.club/users/moonman"}
\ No newline at end of file diff --git a/test/moderation_log_test.exs b/test/moderation_log_test.exs index a39a00e02..81c0fef12 100644 --- a/test/moderation_log_test.exs +++ b/test/moderation_log_test.exs @@ -24,13 +24,13 @@ defmodule Pleroma.ModerationLogTest do        {:ok, _} =          ModerationLog.insert_log(%{            actor: moderator, -          subject: subject1, +          subject: [subject1],            action: "delete"          })        log = Repo.one(ModerationLog) -      assert log.data["message"] == "@#{moderator.nickname} deleted user @#{subject1.nickname}" +      assert log.data["message"] == "@#{moderator.nickname} deleted users: @#{subject1.nickname}"      end      test "logging user creation by moderator", %{ @@ -128,7 +128,7 @@ defmodule Pleroma.ModerationLogTest do        {:ok, _} =          ModerationLog.insert_log(%{            actor: moderator, -          subject: subject1, +          subject: [subject1],            action: "grant",            permission: "moderator"          }) @@ -142,7 +142,7 @@ defmodule Pleroma.ModerationLogTest do        {:ok, _} =          ModerationLog.insert_log(%{            actor: moderator, -          subject: subject1, +          subject: [subject1],            action: "revoke",            permission: "moderator"          }) diff --git a/test/object/containment_test.exs b/test/object/containment_test.exs index 61cd1b412..0dc2728b9 100644 --- a/test/object/containment_test.exs +++ b/test/object/containment_test.exs @@ -65,7 +65,7 @@ defmodule Pleroma.Object.ContainmentTest do        assert capture_log(fn ->                 {:error, _} = User.get_or_fetch_by_ap_id("https://n1u.moe/users/rye")               end) =~ -               "[error] Could not decode user at fetch https://n1u.moe/users/rye, {:error, :error}" +               "[error] Could not decode user at fetch https://n1u.moe/users/rye"      end    end diff --git a/test/object/fetcher_test.exs b/test/object/fetcher_test.exs index 895a73d2c..9ae6b015d 100644 --- a/test/object/fetcher_test.exs +++ b/test/object/fetcher_test.exs @@ -27,31 +27,16 @@ defmodule Pleroma.Object.FetcherTest do    end    describe "actor origin containment" do -    test_with_mock "it rejects objects with a bogus origin", -                   Pleroma.Web.OStatus, -                   [:passthrough], -                   [] do +    test "it rejects objects with a bogus origin" do        {:error, _} = Fetcher.fetch_object_from_id("https://info.pleroma.site/activity.json") - -      refute called(Pleroma.Web.OStatus.fetch_activity_from_url(:_))      end -    test_with_mock "it rejects objects when attributedTo is wrong (variant 1)", -                   Pleroma.Web.OStatus, -                   [:passthrough], -                   [] do +    test "it rejects objects when attributedTo is wrong (variant 1)" do        {:error, _} = Fetcher.fetch_object_from_id("https://info.pleroma.site/activity2.json") - -      refute called(Pleroma.Web.OStatus.fetch_activity_from_url(:_))      end -    test_with_mock "it rejects objects when attributedTo is wrong (variant 2)", -                   Pleroma.Web.OStatus, -                   [:passthrough], -                   [] do +    test "it rejects objects when attributedTo is wrong (variant 2)" do        {:error, _} = Fetcher.fetch_object_from_id("https://info.pleroma.site/activity3.json") - -      refute called(Pleroma.Web.OStatus.fetch_activity_from_url(:_))      end    end @@ -71,24 +56,6 @@ defmodule Pleroma.Object.FetcherTest do        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 diff --git a/test/safe_jsonb_set_test.exs b/test/safe_jsonb_set_test.exs new file mode 100644 index 000000000..748540570 --- /dev/null +++ b/test/safe_jsonb_set_test.exs @@ -0,0 +1,12 @@ +defmodule Pleroma.SafeJsonbSetTest do +  use Pleroma.DataCase + +  test "it doesn't wipe the object when asked to set the value to NULL" do +    assert %{rows: [[%{"key" => "value", "test" => nil}]]} = +             Ecto.Adapters.SQL.query!( +               Pleroma.Repo, +               "select safe_jsonb_set('{\"key\": \"value\"}'::jsonb, '{test}', NULL);", +               [] +             ) +  end +end diff --git a/test/signature_test.exs b/test/signature_test.exs index 96c8ba07a..6b168f2d9 100644 --- a/test/signature_test.exs +++ b/test/signature_test.exs @@ -69,8 +69,7 @@ defmodule Pleroma.SignatureTest do      test "it returns error when not found user" do        assert capture_log(fn -> -               assert Signature.refetch_public_key(make_fake_conn("test-ap_id")) == -                        {:error, {:error, :ok}} +               {:error, _} = Signature.refetch_public_key(make_fake_conn("test-ap_id"))               end) =~ "[error] Could not decode user"      end    end diff --git a/test/support/factory.ex b/test/support/factory.ex index b180844cd..0fdb1e952 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -281,26 +281,6 @@ defmodule Pleroma.Factory do      }    end -  def websub_subscription_factory do -    %Pleroma.Web.Websub.WebsubServerSubscription{ -      topic: "http://example.org", -      callback: "http://example.org/callback", -      secret: "here's a secret", -      valid_until: NaiveDateTime.add(NaiveDateTime.utc_now(), 100), -      state: "requested" -    } -  end - -  def websub_client_subscription_factory do -    %Pleroma.Web.Websub.WebsubClientSubscription{ -      topic: "http://example.org", -      secret: "here's a secret", -      valid_until: nil, -      state: "requested", -      subscribers: [] -    } -  end -    def oauth_app_factory do      %Pleroma.Web.OAuth.App{        client_name: "Some client", diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index 4feb57f3a..7d65209fb 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -38,6 +38,14 @@ defmodule HttpRequestMock do       }}    end +  def get("https://shitposter.club/users/moonman", _, _, _) do +    {:ok, +     %Tesla.Env{ +       status: 200, +       body: File.read!("test/fixtures/tesla_mock/moonman@shitposter.club.json") +     }} +  end +    def get("https://mastodon.social/users/emelie/statuses/101849165031453009", _, _, _) do      {:ok,       %Tesla.Env{ @@ -620,7 +628,7 @@ defmodule HttpRequestMock do      {:ok,       %Tesla.Env{         status: 200, -       body: File.read!("test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.html") +       body: File.read!("test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.json")       }}    end diff --git a/test/user_search_test.exs b/test/user_search_test.exs index f7ab31287..78a02d536 100644 --- a/test/user_search_test.exs +++ b/test/user_search_test.exs @@ -65,21 +65,6 @@ defmodule Pleroma.UserSearchTest do        assert [u2.id, u1.id] == Enum.map(User.search("bar word"), & &1.id)      end -    test "finds users, ranking by similarity" do -      u1 = insert(:user, %{name: "lain"}) -      _u2 = insert(:user, %{name: "ean"}) -      u3 = insert(:user, %{name: "ebn", nickname: "lain@mastodon.social"}) -      u4 = insert(:user, %{nickname: "lain@pleroma.soykaf.com"}) - -      assert [u4.id, u3.id, u1.id] == Enum.map(User.search("lain@ple", for_user: u1), & &1.id) -    end - -    test "finds users, handling misspelled requests" do -      u1 = insert(:user, %{name: "lain"}) - -      assert [u1.id] == Enum.map(User.search("laiin"), & &1.id) -    end -      test "finds users, boosting ranks of friends and followers" do        u1 = insert(:user)        u2 = insert(:user, %{name: "Doe"}) @@ -163,17 +148,6 @@ defmodule Pleroma.UserSearchTest do        Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)      end -    test "finds a user whose name is nil" do -      _user = insert(:user, %{name: "notamatch", nickname: "testuser@pleroma.amplifie.red"}) -      user_two = insert(:user, %{name: nil, nickname: "lain@pleroma.soykaf.com"}) - -      assert user_two == -               User.search("lain@pleroma.soykaf.com") -               |> List.first() -               |> Map.put(:search_rank, nil) -               |> Map.put(:search_type, nil) -    end -      test "does not yield false-positive matches" do        insert(:user, %{name: "John Doe"}) diff --git a/test/user_test.exs b/test/user_test.exs index 019e7b400..ad050b7da 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -190,23 +190,6 @@ defmodule Pleroma.UserTest do      refute User.following?(follower, followed)    end -  # This is a somewhat useless test. -  # test "following a remote user will ensure a websub subscription is present" do -  #   user = insert(:user) -  #   {:ok, followed} = OStatus.make_user("shp@social.heldscal.la") - -  #   assert followed.local == false - -  #   {:ok, user} = User.follow(user, followed) -  #   assert User.ap_followers(followed) in user.following - -  #   query = from w in WebsubClientSubscription, -  #   where: w.topic == ^followed.info["topic"] -  #   websub = Repo.one(query) - -  #   assert websub -  # end -    describe "unfollow/2" do      setup do        setting = Pleroma.Config.get([:instance, :external_user_synchronization]) @@ -474,11 +457,6 @@ defmodule Pleroma.UserTest do        assert user == fetched_user      end -    test "fetches an external user via ostatus if no user exists" do -      {: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        {:error, fetched_user} = User.get_or_fetch_by_nickname("nonexistant@social.heldscal.la")        assert fetched_user == "not found nonexistant@social.heldscal.la" diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 3a5a2f984..28a9b773c 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -41,6 +41,27 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do          assert called(Pleroma.Web.Streamer.stream("participation", participations))        end      end + +    test "streams them out on activity creation" do +      user_one = insert(:user) +      user_two = insert(:user) + +      with_mock Pleroma.Web.Streamer, +        stream: fn _, _ -> nil end do +        {:ok, activity} = +          CommonAPI.post(user_one, %{ +            "status" => "@#{user_two.nickname}", +            "visibility" => "direct" +          }) + +        conversation = +          activity.data["context"] +          |> Pleroma.Conversation.get_for_ap_id() +          |> Repo.preload(participations: :user) + +        assert called(Pleroma.Web.Streamer.stream("participation", conversation.participations)) +      end +    end    end    describe "fetching restricted by visibility" do diff --git a/test/web/activity_pub/relay_test.exs b/test/web/activity_pub/relay_test.exs index 0f7556538..4a0a03944 100644 --- a/test/web/activity_pub/relay_test.exs +++ b/test/web/activity_pub/relay_test.exs @@ -22,8 +22,8 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do    describe "follow/1" do      test "returns errors when user not found" do        assert capture_log(fn -> -               assert Relay.follow("test-ap-id") == {:error, "Could not fetch by AP id"} -             end) =~ "Could not fetch by AP id" +               {:error, _} = Relay.follow("test-ap-id") +             end) =~ "Could not decode user at fetch"      end      test "returns activity" do @@ -41,8 +41,8 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do    describe "unfollow/1" do      test "returns errors when user not found" do        assert capture_log(fn -> -               assert Relay.unfollow("test-ap-id") == {:error, "Could not fetch by AP id"} -             end) =~ "Could not fetch by AP id" +               {:error, _} = Relay.unfollow("test-ap-id") +             end) =~ "Could not decode user at fetch"      end      test "returns activity" do diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 6c35a6f4d..dbb6e59b0 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -7,14 +7,11 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    alias Pleroma.Activity    alias Pleroma.Object    alias Pleroma.Object.Fetcher -  alias Pleroma.Repo    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub    alias Pleroma.Web.ActivityPub.Transmogrifier    alias Pleroma.Web.CommonAPI -  alias Pleroma.Web.OStatus -  alias Pleroma.Web.Websub.WebsubClientSubscription    import Mock    import Pleroma.Factory @@ -1181,32 +1178,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert modified["object"]["actor"] == modified["object"]["attributedTo"]      end -    test "it translates ostatus IDs to external URLs" do -      incoming = File.read!("test/fixtures/incoming_note_activity.xml") -      {:ok, [referent_activity]} = OStatus.handle_incoming(incoming) - -      user = insert(:user) - -      {:ok, activity, _} = CommonAPI.favorite(referent_activity.id, user) -      {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) - -      assert modified["object"] == "http://gs.example.org:4040/index.php/notice/29" -    end - -    test "it translates ostatus reply_to IDs to external URLs" do -      incoming = File.read!("test/fixtures/incoming_note_activity.xml") -      {:ok, [referred_activity]} = OStatus.handle_incoming(incoming) - -      user = insert(:user) - -      {:ok, activity} = -        CommonAPI.post(user, %{"status" => "HI!", "in_reply_to_status_id" => referred_activity.id}) - -      {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) - -      assert modified["object"]["inReplyTo"] == "http://gs.example.org:4040/index.php/notice/29" -    end -      test "it strips internal hashtag data" do        user = insert(:user) @@ -1371,21 +1342,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do      end    end -  describe "maybe_retire_websub" do -    test "it deletes all websub client subscripitions with the user as topic" do -      subscription = %WebsubClientSubscription{topic: "https://niu.moe/users/rye.atom"} -      {:ok, ws} = Repo.insert(subscription) - -      subscription = %WebsubClientSubscription{topic: "https://niu.moe/users/pasty.atom"} -      {:ok, ws2} = Repo.insert(subscription) - -      Transmogrifier.maybe_retire_websub("https://niu.moe/users/rye") - -      refute Repo.get(WebsubClientSubscription, ws.id) -      assert Repo.get(WebsubClientSubscription, ws2.id) -    end -  end -    describe "actor rewriting" do      test "it fixes the actor URL property to be a proper URI" do        data = %{ diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index b5c355e66..9da4940be 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -17,8 +17,14 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    alias Pleroma.Web.MediaProxy    import Pleroma.Factory -  describe "/api/pleroma/admin/users" do -    test "Delete" do +  setup_all do +    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) + +    :ok +  end + +  describe "DELETE /api/pleroma/admin/users" do +    test "single user" do        admin = insert(:user, info: %{is_admin: true})        user = insert(:user) @@ -30,15 +36,36 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        log_entry = Repo.one(ModerationLog) -      assert log_entry.data["subject"]["nickname"] == user.nickname -      assert log_entry.data["action"] == "delete" -        assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} deleted user @#{user.nickname}" +               "@#{admin.nickname} deleted users: @#{user.nickname}"        assert json_response(conn, 200) == user.nickname      end +    test "multiple users" do +      admin = insert(:user, info: %{is_admin: true}) +      user_one = insert(:user) +      user_two = insert(:user) + +      conn = +        build_conn() +        |> assign(:user, admin) +        |> put_req_header("accept", "application/json") +        |> delete("/api/pleroma/admin/users", %{ +          nicknames: [user_one.nickname, user_two.nickname] +        }) + +      log_entry = Repo.one(ModerationLog) + +      assert ModerationLog.get_log_entry_message(log_entry) == +               "@#{admin.nickname} deleted users: @#{user_one.nickname}, @#{user_two.nickname}" + +      response = json_response(conn, 200) +      assert response -- [user_one.nickname, user_two.nickname] == [] +    end +  end + +  describe "/api/pleroma/admin/users" do      test "Create" do        admin = insert(:user, info: %{is_admin: true}) @@ -404,82 +431,72 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                 "@#{admin.nickname} made @#{user.nickname} admin"      end -    test "/:right DELETE, can remove from a permission group" do +    test "/:right POST, can add to a permission group (multiple)" do        admin = insert(:user, info: %{is_admin: true}) -      user = insert(:user, info: %{is_admin: true}) +      user_one = insert(:user) +      user_two = insert(:user)        conn =          build_conn()          |> assign(:user, admin)          |> put_req_header("accept", "application/json") -        |> delete("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin") +        |> post("/api/pleroma/admin/users/permission_group/admin", %{ +          nicknames: [user_one.nickname, user_two.nickname] +        })        assert json_response(conn, 200) == %{ -               "is_admin" => false +               "is_admin" => true               }        log_entry = Repo.one(ModerationLog)        assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} revoked admin role from @#{user.nickname}" +               "@#{admin.nickname} made @#{user_one.nickname}, @#{user_two.nickname} admin"      end -  end -  describe "PUT /api/pleroma/admin/users/:nickname/activation_status" do -    setup %{conn: conn} do +    test "/:right DELETE, can remove from a permission group" do        admin = insert(:user, info: %{is_admin: true}) +      user = insert(:user, info: %{is_admin: true})        conn = -        conn +        build_conn()          |> assign(:user, admin)          |> put_req_header("accept", "application/json") +        |> delete("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin") -      %{conn: conn, admin: admin} -    end - -    test "deactivates the user", %{conn: conn, admin: admin} do -      user = insert(:user) - -      conn = -        conn -        |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: false}) - -      user = User.get_cached_by_id(user.id) -      assert user.info.deactivated == true -      assert json_response(conn, :no_content) +      assert json_response(conn, 200) == %{ +               "is_admin" => false +             }        log_entry = Repo.one(ModerationLog)        assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} deactivated user @#{user.nickname}" +               "@#{admin.nickname} revoked admin role from @#{user.nickname}"      end -    test "activates the user", %{conn: conn, admin: admin} do -      user = insert(:user, info: %{deactivated: true}) +    test "/:right DELETE, can remove from a permission group (multiple)" do +      admin = insert(:user, info: %{is_admin: true}) +      user_one = insert(:user, info: %{is_admin: true}) +      user_two = insert(:user, info: %{is_admin: true})        conn = -        conn -        |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: true}) +        build_conn() +        |> assign(:user, admin) +        |> put_req_header("accept", "application/json") +        |> delete("/api/pleroma/admin/users/permission_group/admin", %{ +          nicknames: [user_one.nickname, user_two.nickname] +        }) -      user = User.get_cached_by_id(user.id) -      assert user.info.deactivated == false -      assert json_response(conn, :no_content) +      assert json_response(conn, 200) == %{ +               "is_admin" => false +             }        log_entry = Repo.one(ModerationLog)        assert ModerationLog.get_log_entry_message(log_entry) == -               "@#{admin.nickname} activated user @#{user.nickname}" -    end - -    test "returns 403 when requested by a non-admin", %{conn: conn} do -      user = insert(:user) - -      conn = -        conn -        |> assign(:user, user) -        |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: false}) - -      assert json_response(conn, :forbidden) +               "@#{admin.nickname} revoked admin role from @#{user_one.nickname}, @#{ +                 user_two.nickname +               }"      end    end @@ -1029,6 +1046,50 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end +  test "PATCH /api/pleroma/admin/users/activate" do +    admin = insert(:user, info: %{is_admin: true}) +    user_one = insert(:user, info: %{deactivated: true}) +    user_two = insert(:user, info: %{deactivated: true}) + +    conn = +      build_conn() +      |> assign(:user, admin) +      |> patch( +        "/api/pleroma/admin/users/activate", +        %{nicknames: [user_one.nickname, user_two.nickname]} +      ) + +    response = json_response(conn, 200) +    assert Enum.map(response["users"], & &1["deactivated"]) == [false, false] + +    log_entry = Repo.one(ModerationLog) + +    assert ModerationLog.get_log_entry_message(log_entry) == +             "@#{admin.nickname} activated users: @#{user_one.nickname}, @#{user_two.nickname}" +  end + +  test "PATCH /api/pleroma/admin/users/deactivate" do +    admin = insert(:user, info: %{is_admin: true}) +    user_one = insert(:user, info: %{deactivated: false}) +    user_two = insert(:user, info: %{deactivated: false}) + +    conn = +      build_conn() +      |> assign(:user, admin) +      |> patch( +        "/api/pleroma/admin/users/deactivate", +        %{nicknames: [user_one.nickname, user_two.nickname]} +      ) + +    response = json_response(conn, 200) +    assert Enum.map(response["users"], & &1["deactivated"]) == [true, true] + +    log_entry = Repo.one(ModerationLog) + +    assert ModerationLog.get_log_entry_message(log_entry) == +             "@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}" +  end +    test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation" do      admin = insert(:user, info: %{is_admin: true})      user = insert(:user) @@ -1053,7 +1114,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      log_entry = Repo.one(ModerationLog)      assert ModerationLog.get_log_entry_message(log_entry) == -             "@#{admin.nickname} deactivated user @#{user.nickname}" +             "@#{admin.nickname} deactivated users: @#{user.nickname}"    end    describe "POST /api/pleroma/admin/users/invite_token" do @@ -2486,6 +2547,74 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        assert User.get_by_id(user.id).info.password_reset_pending == true      end    end + +  describe "relays" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) + +      %{conn: assign(conn, :user, admin), admin: admin} +    end + +    test "POST /relay", %{admin: admin} do +      conn = +        build_conn() +        |> assign(:user, admin) +        |> post("/api/pleroma/admin/relay", %{ +          relay_url: "http://mastodon.example.org/users/admin" +        }) + +      assert json_response(conn, 200) == "http://mastodon.example.org/users/admin" + +      log_entry = Repo.one(ModerationLog) + +      assert ModerationLog.get_log_entry_message(log_entry) == +               "@#{admin.nickname} followed relay: http://mastodon.example.org/users/admin" +    end + +    test "GET /relay", %{admin: admin} do +      Pleroma.Web.ActivityPub.Relay.get_actor() +      |> Ecto.Changeset.change( +        following: [ +          "http://test-app.com/user/test1", +          "http://test-app.com/user/test1", +          "http://test-app-42.com/user/test1" +        ] +      ) +      |> Pleroma.User.update_and_set_cache() + +      conn = +        build_conn() +        |> assign(:user, admin) +        |> get("/api/pleroma/admin/relay") + +      assert json_response(conn, 200)["relays"] -- ["test-app.com", "test-app-42.com"] == [] +    end + +    test "DELETE /relay", %{admin: admin} do +      build_conn() +      |> assign(:user, admin) +      |> post("/api/pleroma/admin/relay", %{ +        relay_url: "http://mastodon.example.org/users/admin" +      }) + +      conn = +        build_conn() +        |> assign(:user, admin) +        |> delete("/api/pleroma/admin/relay", %{ +          relay_url: "http://mastodon.example.org/users/admin" +        }) + +      assert json_response(conn, 200) == "http://mastodon.example.org/users/admin" + +      [log_entry_one, log_entry_two] = Repo.all(ModerationLog) + +      assert ModerationLog.get_log_entry_message(log_entry_one) == +               "@#{admin.nickname} followed relay: http://mastodon.example.org/users/admin" + +      assert ModerationLog.get_log_entry_message(log_entry_two) == +               "@#{admin.nickname} unfollowed relay: http://mastodon.example.org/users/admin" +    end +  end  end  # Needed for testing diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs index 43a715706..bdaefdce1 100644 --- a/test/web/federator_test.exs +++ b/test/web/federator_test.exs @@ -111,93 +111,6 @@ defmodule Pleroma.Web.FederatorTest do                 all_enqueued(worker: PublisherWorker)               )      end - -    test "it federates only to reachable instances via Websub" do -      user = insert(:user) -      websub_topic = Pleroma.Web.OStatus.feed_path(user) - -      sub1 = -        insert(:websub_subscription, %{ -          topic: websub_topic, -          state: "active", -          callback: "http://pleroma.soykaf.com/cb" -        }) - -      sub2 = -        insert(:websub_subscription, %{ -          topic: websub_topic, -          state: "active", -          callback: "https://pleroma2.soykaf.com/cb" -        }) - -      dt = NaiveDateTime.utc_now() -      Instances.set_unreachable(sub2.callback, dt) - -      Instances.set_consistently_unreachable(sub1.callback) - -      {:ok, _activity} = CommonAPI.post(user, %{"status" => "HI"}) - -      expected_callback = sub2.callback -      expected_dt = NaiveDateTime.to_iso8601(dt) - -      ObanHelpers.perform(all_enqueued(worker: PublisherWorker)) - -      assert ObanHelpers.member?( -               %{ -                 "op" => "publish_one", -                 "params" => %{ -                   "callback" => expected_callback, -                   "unreachable_since" => expected_dt -                 } -               }, -               all_enqueued(worker: PublisherWorker) -             ) -    end - -    test "it federates only to reachable instances via Salmon" do -      user = insert(:user) - -      _remote_user1 = -        insert(:user, %{ -          local: false, -          nickname: "nick1@domain.com", -          ap_id: "https://domain.com/users/nick1", -          info: %{salmon: "https://domain.com/salmon"} -        }) - -      remote_user2 = -        insert(:user, %{ -          local: false, -          nickname: "nick2@domain2.com", -          ap_id: "https://domain2.com/users/nick2", -          info: %{salmon: "https://domain2.com/salmon"} -        }) - -      remote_user2_id = remote_user2.id - -      dt = NaiveDateTime.utc_now() -      Instances.set_unreachable(remote_user2.ap_id, dt) - -      Instances.set_consistently_unreachable("domain.com") - -      {:ok, _activity} = -        CommonAPI.post(user, %{"status" => "HI @nick1@domain.com, @nick2@domain2.com!"}) - -      expected_dt = NaiveDateTime.to_iso8601(dt) - -      ObanHelpers.perform(all_enqueued(worker: PublisherWorker)) - -      assert ObanHelpers.member?( -               %{ -                 "op" => "publish_one", -                 "params" => %{ -                   "recipient_id" => remote_user2_id, -                   "unreachable_since" => expected_dt -                 } -               }, -               all_enqueued(worker: PublisherWorker) -             ) -    end    end    describe "Receive an activity" do diff --git a/test/web/mastodon_api/controllers/conversation_controller_test.exs b/test/web/mastodon_api/controllers/conversation_controller_test.exs index a308a7620..d89a87179 100644 --- a/test/web/mastodon_api/controllers/conversation_controller_test.exs +++ b/test/web/mastodon_api/controllers/conversation_controller_test.exs @@ -54,9 +54,9 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do      assert user_two.id in account_ids      assert user_three.id in account_ids      assert is_binary(res_id) -    assert unread == true +    assert unread == false      assert res_last_status["id"] == direct.id -    assert User.get_cached_by_id(user_one.id).info.unread_conversation_count == 1 +    assert User.get_cached_by_id(user_one.id).info.unread_conversation_count == 0    end    test "updates the last_status on reply", %{conn: conn} do @@ -95,19 +95,23 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do          "visibility" => "direct"        }) +    assert User.get_cached_by_id(user_one.id).info.unread_conversation_count == 0 +    assert User.get_cached_by_id(user_two.id).info.unread_conversation_count == 1 +      [%{"id" => direct_conversation_id, "unread" => true}] =        conn -      |> assign(:user, user_one) +      |> assign(:user, user_two)        |> get("/api/v1/conversations")        |> json_response(200)      %{"unread" => false} =        conn -      |> assign(:user, user_one) +      |> assign(:user, user_two)        |> post("/api/v1/conversations/#{direct_conversation_id}/read")        |> json_response(200)      assert User.get_cached_by_id(user_one.id).info.unread_conversation_count == 0 +    assert User.get_cached_by_id(user_two.id).info.unread_conversation_count == 0      # The conversation is marked as unread on reply      {:ok, _} = @@ -124,6 +128,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do        |> json_response(200)      assert User.get_cached_by_id(user_one.id).info.unread_conversation_count == 1 +    assert User.get_cached_by_id(user_two.id).info.unread_conversation_count == 0      # A reply doesn't increment the user's unread_conversation_count if the conversation is unread      {:ok, _} = @@ -134,6 +139,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do        })      assert User.get_cached_by_id(user_one.id).info.unread_conversation_count == 1 +    assert User.get_cached_by_id(user_two.id).info.unread_conversation_count == 0    end    test "(vanilla) Mastodon frontend behaviour", %{conn: conn} do diff --git a/test/web/mastodon_api/controllers/search_controller_test.exs b/test/web/mastodon_api/controllers/search_controller_test.exs index ee413eef7..7953fad62 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -204,17 +204,17 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do        conn =          conn          |> assign(:user, user) -        |> get("/api/v1/search", %{"q" => "shp@social.heldscal.la", "resolve" => "true"}) +        |> get("/api/v1/search", %{"q" => "mike@osada.macgirvin.com", "resolve" => "true"})        assert results = json_response(conn, 200)        [account] = results["accounts"] -      assert account["acct"] == "shp@social.heldscal.la" +      assert account["acct"] == "mike@osada.macgirvin.com"      end      test "search doesn't fetch remote accounts if resolve is false", %{conn: conn} do        conn =          conn -        |> get("/api/v1/search", %{"q" => "shp@social.heldscal.la", "resolve" => "false"}) +        |> get("/api/v1/search", %{"q" => "mike@osada.macgirvin.com", "resolve" => "false"})        assert results = json_response(conn, 200)        assert [] == results["accounts"] diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index fc45c25de..61b6cea75 100644 --- a/test/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/web/mastodon_api/controllers/timeline_controller_test.exs @@ -11,7 +11,6 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do    alias Pleroma.Config    alias Pleroma.User    alias Pleroma.Web.CommonAPI -  alias Pleroma.Web.OStatus    clear_config([:instance, :public]) @@ -75,8 +74,7 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        {:ok, _activity} = CommonAPI.post(following, %{"status" => "test"}) -      {:ok, [_activity]} = -        OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873") +      _activity = insert(:note_activity, local: false)        conn = get(conn, "/api/v1/timelines/public", %{"local" => "False"}) @@ -271,9 +269,6 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        {:ok, activity} = CommonAPI.post(following, %{"status" => "test #2hu"}) -      {:ok, [_activity]} = -        OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873") -        nconn = get(conn, "/api/v1/timelines/tag/2hu")        assert [%{"id" => id}] = json_response(nconn, :ok) diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index b7a4938a6..ad209b4a3 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -424,8 +424,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        other_user = insert(:user)        {:ok, _activity} = -        CommonAPI.post(user, %{ -          "status" => "Hey @#{other_user.nickname}.", +        CommonAPI.post(other_user, %{ +          "status" => "Hey @#{user.nickname}.",            "visibility" => "direct"          }) diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index 1d5a6e956..c200ad8fe 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -14,7 +14,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do    alias Pleroma.Web.CommonAPI.Utils    alias Pleroma.Web.MastodonAPI.AccountView    alias Pleroma.Web.MastodonAPI.StatusView -  alias Pleroma.Web.OStatus    import Pleroma.Factory    import Tesla.Mock @@ -230,17 +229,15 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do    end    test "contains mentions" do -    incoming = File.read!("test/fixtures/incoming_reply_mastodon.xml") -    # a user with this ap id might be in the cache. -    recipient = "https://pleroma.soykaf.com/users/lain" -    user = insert(:user, %{ap_id: recipient}) +    user = insert(:user) +    mentioned = insert(:user) -    {:ok, [activity]} = OStatus.handle_incoming(incoming) +    {:ok, activity} = CommonAPI.post(user, %{"status" => "hi @#{mentioned.nickname}"})      status = StatusView.render("show.json", %{activity: activity})      assert status.mentions == -             Enum.map([user], fn u -> AccountView.render("mention.json", %{user: u}) end) +             Enum.map([mentioned], fn u -> AccountView.render("mention.json", %{user: u}) end)    end    test "create mentions from the 'to' field" do diff --git a/test/web/ostatus/activity_representer_test.exs b/test/web/ostatus/activity_representer_test.exs deleted file mode 100644 index a8d500890..000000000 --- a/test/web/ostatus/activity_representer_test.exs +++ /dev/null @@ -1,300 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OStatus.ActivityRepresenterTest do -  use Pleroma.DataCase - -  alias Pleroma.Activity -  alias Pleroma.Object -  alias Pleroma.User -  alias Pleroma.Web.ActivityPub.ActivityPub -  alias Pleroma.Web.OStatus -  alias Pleroma.Web.OStatus.ActivityRepresenter - -  import Pleroma.Factory -  import Tesla.Mock - -  setup do -    mock(fn env -> apply(HttpRequestMock, :request, [env]) end) -    :ok -  end - -  test "an external note activity" do -    incoming = File.read!("test/fixtures/mastodon-note-cw.xml") -    {:ok, [activity]} = OStatus.handle_incoming(incoming) - -    user = User.get_cached_by_ap_id(activity.data["actor"]) - -    tuple = ActivityRepresenter.to_simple_form(activity, user) - -    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary() - -    assert String.contains?( -             res, -             ~s{<link type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2314748" rel="alternate"/>} -           ) -  end - -  test "a note activity" do -    note_activity = insert(:note_activity) -    object_data = Object.normalize(note_activity).data - -    user = User.get_cached_by_ap_id(note_activity.data["actor"]) - -    expected = """ -    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type> -    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb> -    <id>#{object_data["id"]}</id> -    <title>New note by #{user.nickname}</title> -    <content type="html">#{object_data["content"]}</content> -    <published>#{object_data["published"]}</published> -    <updated>#{object_data["published"]}</updated> -    <ostatus:conversation ref="#{note_activity.data["context"]}">#{note_activity.data["context"]}</ostatus:conversation> -    <link ref="#{note_activity.data["context"]}" rel="ostatus:conversation" /> -    <summary>#{object_data["summary"]}</summary> -    <link type="application/atom+xml" href="#{object_data["id"]}" rel="self" /> -    <link type="text/html" href="#{object_data["id"]}" rel="alternate" /> -    <category term="2hu"/> -    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/> -    <link name="2hu" rel="emoji" href="corndog.png" /> -    """ - -    tuple = ActivityRepresenter.to_simple_form(note_activity, user) - -    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary() - -    assert clean(res) == clean(expected) -  end - -  test "a reply note" do -    user = insert(:user) -    note_object = insert(:note) -    _note = insert(:note_activity, %{note: note_object}) -    object = insert(:note, %{data: %{"inReplyTo" => note_object.data["id"]}}) -    answer = insert(:note_activity, %{note: object}) - -    Repo.update!( -      Object.change(note_object, %{data: Map.put(note_object.data, "external_url", "someurl")}) -    ) - -    expected = """ -    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type> -    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb> -    <id>#{object.data["id"]}</id> -    <title>New note by #{user.nickname}</title> -    <content type="html">#{object.data["content"]}</content> -    <published>#{object.data["published"]}</published> -    <updated>#{object.data["published"]}</updated> -    <ostatus:conversation ref="#{answer.data["context"]}">#{answer.data["context"]}</ostatus:conversation> -    <link ref="#{answer.data["context"]}" rel="ostatus:conversation" /> -    <summary>2hu</summary> -    <link type="application/atom+xml" href="#{object.data["id"]}" rel="self" /> -    <link type="text/html" href="#{object.data["id"]}" rel="alternate" /> -    <category term="2hu"/> -    <thr:in-reply-to ref="#{note_object.data["id"]}" href="someurl" /> -    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/> -    <link name="2hu" rel="emoji" href="corndog.png" /> -    """ - -    tuple = ActivityRepresenter.to_simple_form(answer, user) - -    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary() - -    assert clean(res) == clean(expected) -  end - -  test "an announce activity" do -    note = insert(:note_activity) -    user = insert(:user) -    object = Object.normalize(note) - -    {:ok, announce, _object} = ActivityPub.announce(user, object) - -    announce = Activity.get_by_id(announce.id) - -    note_user = User.get_cached_by_ap_id(note.data["actor"]) -    note = Activity.get_by_id(note.id) - -    note_xml = -      ActivityRepresenter.to_simple_form(note, note_user, true) -      |> :xmerl.export_simple_content(:xmerl_xml) -      |> to_string - -    expected = """ -    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type> -    <activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb> -    <id>#{announce.data["id"]}</id> -    <title>#{user.nickname} repeated a notice</title> -    <content type="html">RT #{object.data["content"]}</content> -    <published>#{announce.data["published"]}</published> -    <updated>#{announce.data["published"]}</updated> -    <ostatus:conversation ref="#{announce.data["context"]}">#{announce.data["context"]}</ostatus:conversation> -    <link ref="#{announce.data["context"]}" rel="ostatus:conversation" /> -    <link rel="self" type="application/atom+xml" href="#{announce.data["id"]}"/> -    <activity:object> -      #{note_xml} -    </activity:object> -    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="#{ -      note.data["actor"] -    }"/> -    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/> -    """ - -    announce_xml = -      ActivityRepresenter.to_simple_form(announce, user) -      |> :xmerl.export_simple_content(:xmerl_xml) -      |> to_string - -    assert clean(expected) == clean(announce_xml) -  end - -  test "a like activity" do -    note = insert(:note) -    user = insert(:user) -    {:ok, like, _note} = ActivityPub.like(user, note) - -    tuple = ActivityRepresenter.to_simple_form(like, user) -    refute is_nil(tuple) - -    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary() - -    expected = """ -    <activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb> -    <id>#{like.data["id"]}</id> -    <title>New favorite by #{user.nickname}</title> -    <content type="html">#{user.nickname} favorited something</content> -    <published>#{like.data["published"]}</published> -    <updated>#{like.data["published"]}</updated> -    <activity:object> -      <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type> -      <id>#{note.data["id"]}</id> -    </activity:object> -    <ostatus:conversation ref="#{like.data["context"]}">#{like.data["context"]}</ostatus:conversation> -    <link ref="#{like.data["context"]}" rel="ostatus:conversation" /> -    <link rel="self" type="application/atom+xml" href="#{like.data["id"]}"/> -    <thr:in-reply-to ref="#{note.data["id"]}" /> -    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="#{ -      note.data["actor"] -    }"/> -    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/> -    """ - -    assert clean(res) == clean(expected) -  end - -  test "a follow activity" do -    follower = insert(:user) -    followed = insert(:user) - -    {:ok, activity} = -      ActivityPub.insert(%{ -        "type" => "Follow", -        "actor" => follower.ap_id, -        "object" => followed.ap_id, -        "to" => [followed.ap_id] -      }) - -    tuple = ActivityRepresenter.to_simple_form(activity, follower) - -    refute is_nil(tuple) - -    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary() - -    expected = """ -    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type> -    <activity:verb>http://activitystrea.ms/schema/1.0/follow</activity:verb> -    <id>#{activity.data["id"]}</id> -    <title>#{follower.nickname} started following #{activity.data["object"]}</title> -    <content type="html"> #{follower.nickname} started following #{activity.data["object"]}</content> -    <published>#{activity.data["published"]}</published> -    <updated>#{activity.data["published"]}</updated> -    <activity:object> -      <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type> -      <id>#{activity.data["object"]}</id> -      <uri>#{activity.data["object"]}</uri> -    </activity:object> -    <link rel="self" type="application/atom+xml" href="#{activity.data["id"]}"/> -    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="#{ -      activity.data["object"] -    }"/> -    """ - -    assert clean(res) == clean(expected) -  end - -  test "an unfollow activity" do -    follower = insert(:user) -    followed = insert(:user) -    {:ok, _activity} = ActivityPub.follow(follower, followed) -    {:ok, activity} = ActivityPub.unfollow(follower, followed) - -    tuple = ActivityRepresenter.to_simple_form(activity, follower) - -    refute is_nil(tuple) - -    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary() - -    expected = """ -    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type> -    <activity:verb>http://activitystrea.ms/schema/1.0/unfollow</activity:verb> -    <id>#{activity.data["id"]}</id> -    <title>#{follower.nickname} stopped following #{followed.ap_id}</title> -    <content type="html"> #{follower.nickname} stopped following #{followed.ap_id}</content> -    <published>#{activity.data["published"]}</published> -    <updated>#{activity.data["published"]}</updated> -    <activity:object> -      <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type> -      <id>#{followed.ap_id}</id> -      <uri>#{followed.ap_id}</uri> -    </activity:object> -    <link rel="self" type="application/atom+xml" href="#{activity.data["id"]}"/> -    <link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="#{ -      followed.ap_id -    }"/> -    """ - -    assert clean(res) == clean(expected) -  end - -  test "a delete" do -    user = insert(:user) - -    activity = %Activity{ -      data: %{ -        "id" => "ap_id", -        "type" => "Delete", -        "actor" => user.ap_id, -        "object" => "some_id", -        "published" => "2017-06-18T12:00:18+00:00" -      } -    } - -    tuple = ActivityRepresenter.to_simple_form(activity, nil) - -    refute is_nil(tuple) - -    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary() - -    expected = """ -    <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type> -    <activity:verb>http://activitystrea.ms/schema/1.0/delete</activity:verb> -    <id>#{activity.data["object"]}</id> -    <title>An object was deleted</title> -    <content type="html">An object was deleted</content> -    <published>#{activity.data["published"]}</published> -    <updated>#{activity.data["published"]}</updated> -    """ - -    assert clean(res) == clean(expected) -  end - -  test "an unknown activity" do -    tuple = ActivityRepresenter.to_simple_form(%Activity{}, nil) -    assert is_nil(tuple) -  end - -  defp clean(string) do -    String.replace(string, ~r/\s/, "") -  end -end diff --git a/test/web/ostatus/feed_representer_test.exs b/test/web/ostatus/feed_representer_test.exs deleted file mode 100644 index d1cadf1e4..000000000 --- a/test/web/ostatus/feed_representer_test.exs +++ /dev/null @@ -1,59 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OStatus.FeedRepresenterTest do -  use Pleroma.DataCase -  import Pleroma.Factory -  alias Pleroma.User -  alias Pleroma.Web.OStatus -  alias Pleroma.Web.OStatus.ActivityRepresenter -  alias Pleroma.Web.OStatus.FeedRepresenter -  alias Pleroma.Web.OStatus.UserRepresenter - -  test "returns a feed of the last 20 items of the user" do -    note_activity = insert(:note_activity) -    user = User.get_cached_by_ap_id(note_activity.data["actor"]) - -    tuple = FeedRepresenter.to_simple_form(user, [note_activity], [user]) - -    most_recent_update = -      note_activity.updated_at -      |> NaiveDateTime.to_iso8601() - -    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> to_string - -    user_xml = -      UserRepresenter.to_simple_form(user) -      |> :xmerl.export_simple_content(:xmerl_xml) - -    entry_xml = -      ActivityRepresenter.to_simple_form(note_activity, user) -      |> :xmerl.export_simple_content(:xmerl_xml) - -    expected = """ -    <feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0"> -      <id>#{OStatus.feed_path(user)}</id> -      <title>#{user.nickname}'s timeline</title> -      <updated>#{most_recent_update}</updated> -      <logo>#{User.avatar_url(user)}</logo> -      <link rel="hub" href="#{OStatus.pubsub_path(user)}" /> -      <link rel="salmon" href="#{OStatus.salmon_path(user)}" /> -      <link rel="self" href="#{OStatus.feed_path(user)}" type="application/atom+xml" /> -      <author> -        #{user_xml} -      </author> -      <link rel="next" href="#{OStatus.feed_path(user)}?max_id=#{note_activity.id}" type="application/atom+xml" /> -      <entry> -        #{entry_xml} -      </entry> -    </feed> -    """ - -    assert clean(res) == clean(expected) -  end - -  defp clean(string) do -    String.replace(string, ~r/\s/, "") -  end -end diff --git a/test/web/ostatus/incoming_documents/delete_handling_test.exs b/test/web/ostatus/incoming_documents/delete_handling_test.exs deleted file mode 100644 index cd0447af7..000000000 --- a/test/web/ostatus/incoming_documents/delete_handling_test.exs +++ /dev/null @@ -1,48 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OStatus.DeleteHandlingTest do -  use Pleroma.DataCase - -  import Pleroma.Factory -  import Tesla.Mock - -  alias Pleroma.Activity -  alias Pleroma.Object -  alias Pleroma.Web.OStatus - -  setup do -    mock(fn env -> apply(HttpRequestMock, :request, [env]) end) -    :ok -  end - -  describe "deletions" do -    test "it removes the mentioned activity" do -      note = insert(:note_activity) -      second_note = insert(:note_activity) -      object = Object.normalize(note) -      second_object = Object.normalize(second_note) -      user = insert(:user) - -      {:ok, like, _object} = Pleroma.Web.ActivityPub.ActivityPub.like(user, object) - -      incoming = -        File.read!("test/fixtures/delete.xml") -        |> String.replace( -          "tag:mastodon.sdf.org,2017-06-10:objectId=310513:objectType=Status", -          object.data["id"] -        ) - -      {:ok, [delete]} = OStatus.handle_incoming(incoming) - -      refute Activity.get_by_id(note.id) -      refute Activity.get_by_id(like.id) -      assert Object.get_by_ap_id(object.data["id"]).data["type"] == "Tombstone" -      assert Activity.get_by_id(second_note.id) -      assert Object.get_by_ap_id(second_object.data["id"]) - -      assert delete.data["type"] == "Delete" -    end -  end -end diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index b1af918d8..58534396e 100644 --- a/test/web/ostatus/ostatus_controller_test.exs +++ b/test/web/ostatus/ostatus_controller_test.exs @@ -11,7 +11,6 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do    alias Pleroma.Object    alias Pleroma.User    alias Pleroma.Web.CommonAPI -  alias Pleroma.Web.OStatus.ActivityRepresenter    setup_all do      Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -22,78 +21,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do      Pleroma.Config.put([:instance, :federating], true)    end -  describe "salmon_incoming" do -    test "decodes a salmon", %{conn: conn} do -      user = insert(:user) -      salmon = File.read!("test/fixtures/salmon.xml") - -      assert capture_log(fn -> -               conn = -                 conn -                 |> put_req_header("content-type", "application/atom+xml") -                 |> post("/users/#{user.nickname}/salmon", salmon) - -               assert response(conn, 200) -             end) =~ "[error]" -    end - -    test "decodes a salmon with a changed magic key", %{conn: conn} do -      user = insert(:user) -      salmon = File.read!("test/fixtures/salmon.xml") - -      assert capture_log(fn -> -               conn = -                 conn -                 |> put_req_header("content-type", "application/atom+xml") -                 |> post("/users/#{user.nickname}/salmon", salmon) - -               assert response(conn, 200) -             end) =~ "[error]" - -      # Wrong key -      info = %{ -        magic_key: -          "RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwrong1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB" -      } - -      # Set a wrong magic-key for a user so it has to refetch -      "http://gs.example.org:4040/index.php/user/1" -      |> User.get_cached_by_ap_id() -      |> User.update_info(&User.Info.remote_user_creation(&1, info)) - -      assert capture_log(fn -> -               conn = -                 build_conn() -                 |> put_req_header("content-type", "application/atom+xml") -                 |> post("/users/#{user.nickname}/salmon", salmon) - -               assert response(conn, 200) -             end) =~ "[error]" -    end -  end -    describe "GET object/2" do -    test "gets an object", %{conn: conn} do -      note_activity = insert(:note_activity) -      object = Object.normalize(note_activity) -      user = User.get_cached_by_ap_id(note_activity.data["actor"]) -      [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, object.data["id"])) -      url = "/objects/#{uuid}" - -      conn = -        conn -        |> put_req_header("accept", "application/xml") -        |> get(url) - -      expected = -        ActivityRepresenter.to_simple_form(note_activity, user, true) -        |> ActivityRepresenter.wrap_with_entry() -        |> :xmerl.export_simple(:xmerl_xml) -        |> to_string - -      assert response(conn, 200) == expected -    end -      test "redirects to /notice/id for html format", %{conn: conn} do        note_activity = insert(:note_activity)        object = Object.normalize(note_activity) @@ -143,16 +71,6 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do    end    describe "GET activity/2" do -    test "gets an activity in xml format", %{conn: conn} do -      note_activity = insert(:note_activity) -      [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"])) - -      conn -      |> put_req_header("accept", "application/xml") -      |> get("/activities/#{uuid}") -      |> response(200) -    end -      test "redirects to /notice/id for html format", %{conn: conn} do        note_activity = insert(:note_activity)        [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"])) @@ -180,24 +98,6 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do        assert response(conn, 500) == ~S({"error":"Something went wrong"})      end -    test "404s on deleted objects", %{conn: conn} do -      note_activity = insert(:note_activity) -      object = Object.normalize(note_activity) -      [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, object.data["id"])) - -      conn -      |> put_req_header("accept", "application/xml") -      |> get("/objects/#{uuid}") -      |> response(200) - -      Object.delete(object) - -      conn -      |> put_req_header("accept", "application/xml") -      |> get("/objects/#{uuid}") -      |> response(404) -    end -      test "404s on private activities", %{conn: conn} do        note_activity = insert(:direct_note_activity)        [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"])) diff --git a/test/web/ostatus/ostatus_test.exs b/test/web/ostatus/ostatus_test.exs deleted file mode 100644 index 70a0e4473..000000000 --- a/test/web/ostatus/ostatus_test.exs +++ /dev/null @@ -1,645 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OStatusTest do -  use Pleroma.DataCase -  alias Pleroma.Activity -  alias Pleroma.Instances -  alias Pleroma.Object -  alias Pleroma.Repo -  alias Pleroma.User -  alias Pleroma.Web.OStatus -  alias Pleroma.Web.XML - -  import ExUnit.CaptureLog -  import Mock -  import Pleroma.Factory - -  setup_all do -    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) -    :ok -  end - -  test "don't insert create notes twice" do -    incoming = File.read!("test/fixtures/incoming_note_activity.xml") -    {:ok, [activity]} = OStatus.handle_incoming(incoming) -    assert {:ok, [activity]} == OStatus.handle_incoming(incoming) -  end - -  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) - -    user = User.get_cached_by_ap_id(activity.data["actor"]) -    assert user.info.note_count == 1 -    assert activity.data["type"] == "Create" -    assert object.data["type"] == "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 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 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) - -    assert activity.data["type"] == "Create" -    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"] -  end - -  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) - -    assert activity.data["type"] == "Create" -    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) - -    assert object.data["tag"] == ["nsfw"] -    assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"] -  end - -  test "handle incoming notes - Mastodon, salmon, reply" do -    # It uses the context of the replied to object -    Repo.insert!(%Object{ -      data: %{ -        "id" => "https://pleroma.soykaf.com/objects/c237d966-ac75-4fe3-a87a-d89d71a3a7a4", -        "context" => "2hu" -      } -    }) - -    incoming = File.read!("test/fixtures/incoming_reply_mastodon.xml") -    {:ok, [activity]} = OStatus.handle_incoming(incoming) -    object = Object.normalize(activity) - -    assert activity.data["type"] == "Create" -    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 - -  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) - -    assert activity.data["type"] == "Create" -    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) - -    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 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) - -    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) - -    assert activity.data["type"] == "Create" -    assert object.data["type"] == "Note" -    assert object.data["actor"] == "https://social.heldscal.la/user/23211" - -    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 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"] -  end - -  test "handle incoming retweets - GS, subscription" do -    incoming = File.read!("test/fixtures/share-gs.xml") -    {:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming) - -    assert activity.data["type"] == "Announce" -    assert activity.data["actor"] == "https://social.heldscal.la/user/23211" -    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) -    assert retweeted_activity.data["type"] == "Create" -    assert retweeted_activity.data["actor"] == "https://pleroma.soykaf.com/users/lain" -    refute retweeted_activity.local -    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 -    incoming = File.read!("test/fixtures/share-gs-local.xml") -    note_activity = insert(:note_activity) -    object = Object.normalize(note_activity) -    user = User.get_cached_by_ap_id(note_activity.data["actor"]) - -    incoming = -      incoming -      |> String.replace("LOCAL_ID", object.data["id"]) -      |> String.replace("LOCAL_USER", user.ap_id) - -    {:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming) - -    assert activity.data["type"] == "Announce" -    assert activity.data["actor"] == "https://social.heldscal.la/user/23211" -    assert activity.data["object"] == object.data["id"] -    assert user.ap_id in activity.data["to"] -    refute activity.local - -    retweeted_activity = Activity.get_by_id(retweeted_activity.id) -    assert note_activity.id == retweeted_activity.id -    assert retweeted_activity.data["type"] == "Create" -    assert retweeted_activity.data["actor"] == user.ap_id -    assert retweeted_activity.local -    assert Object.normalize(retweeted_activity).data["announcement_count"] == 1 -  end - -  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) - -    assert activity.data["type"] == "Announce" -    assert activity.data["actor"] == "https://mastodon.social/users/lambadalambda" -    assert activity.data["object"] == retweeted_activity.data["object"] - -    assert activity.data["id"] == -             "tag:mastodon.social,2017-05-03:objectId=4934452:objectType=Status" - -    refute activity.local -    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_object.data["content"], "Test account") -  end - -  test "handle incoming favorites - GS, websub" do -    capture_log(fn -> -      incoming = File.read!("test/fixtures/favorite.xml") -      {:ok, [[activity, favorited_activity]]} = OStatus.handle_incoming(incoming) - -      assert activity.data["type"] == "Like" -      assert activity.data["actor"] == "https://social.heldscal.la/user/23211" -      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" - -      refute activity.local -      assert favorited_activity.data["type"] == "Create" -      assert favorited_activity.data["actor"] == "https://shitposter.club/user/1" - -      assert favorited_activity.data["object"] == -               "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" - -      refute favorited_activity.local -    end) -  end - -  test "handle conversation references" do -    incoming = File.read!("test/fixtures/mastodon_conversation.xml") -    {:ok, [activity]} = OStatus.handle_incoming(incoming) - -    assert activity.data["context"] == -             "tag:mastodon.social,2017-08-28:objectId=7876885:objectType=Conversation" -  end - -  test "handle incoming favorites with locally available object - GS, websub" do -    note_activity = insert(:note_activity) -    object = Object.normalize(note_activity) - -    incoming = -      File.read!("test/fixtures/favorite_with_local_note.xml") -      |> String.replace("localid", object.data["id"]) - -    {:ok, [[activity, favorited_activity]]} = OStatus.handle_incoming(incoming) - -    assert activity.data["type"] == "Like" -    assert activity.data["actor"] == "https://social.heldscal.la/user/23211" -    assert activity.data["object"] == object.data["id"] -    refute activity.local -    assert note_activity.id == favorited_activity.id -    assert favorited_activity.local -  end - -  test_with_mock "handle incoming replies, fetching replied-to activities if we don't have them", -                 OStatus, -                 [:passthrough], -                 [] do -    incoming = File.read!("test/fixtures/incoming_note_activity_answer.xml") -    {:ok, [activity]} = OStatus.handle_incoming(incoming) -    object = Object.normalize(activity, false) - -    assert activity.data["type"] == "Create" -    assert object.data["type"] == "Note" - -    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 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"] - -    assert called(OStatus.fetch_activity_from_url(object.data["inReplyTo"], :_)) -  end - -  test_with_mock "handle incoming replies, not fetching replied-to activities beyond max_replies_depth", -                 OStatus, -                 [:passthrough], -                 [] do -    incoming = File.read!("test/fixtures/incoming_note_activity_answer.xml") - -    with_mock Pleroma.Web.Federator, -      allowed_incoming_reply_depth?: fn _ -> false end do -      {:ok, [activity]} = OStatus.handle_incoming(incoming) -      object = Object.normalize(activity, false) - -      refute called(OStatus.fetch_activity_from_url(object.data["inReplyTo"], :_)) -    end -  end - -  test "handle incoming follows" do -    incoming = File.read!("test/fixtures/follow.xml") -    {:ok, [activity]} = OStatus.handle_incoming(incoming) -    assert activity.data["type"] == "Follow" - -    assert activity.data["id"] == -             "tag:social.heldscal.la,2017-05-07:subscription:23211:person:44803:2017-05-07T09:54:48+00:00" - -    assert activity.data["actor"] == "https://social.heldscal.la/user/23211" -    assert activity.data["object"] == "https://pawoo.net/users/pekorino" -    refute activity.local - -    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 - -  test "refuse following over OStatus if the followed's account is locked" do -    incoming = File.read!("test/fixtures/follow.xml") -    _user = insert(:user, info: %{locked: true}, ap_id: "https://pawoo.net/users/pekorino") - -    {:ok, [{:error, "It's not possible to follow locked accounts over OStatus"}]} = -      OStatus.handle_incoming(incoming) -  end - -  test "handle incoming unfollows with existing follow" do -    incoming_follow = File.read!("test/fixtures/follow.xml") -    {:ok, [_activity]} = OStatus.handle_incoming(incoming_follow) - -    incoming = File.read!("test/fixtures/unfollow.xml") -    {:ok, [activity]} = OStatus.handle_incoming(incoming) - -    assert activity.data["type"] == "Undo" - -    assert activity.data["id"] == -             "undo:tag:social.heldscal.la,2017-05-07:subscription:23211:person:44803:2017-05-07T09:54:48+00:00" - -    assert activity.data["actor"] == "https://social.heldscal.la/user/23211" -    embedded_object = activity.data["object"] -    assert is_map(embedded_object) -    assert embedded_object["type"] == "Follow" -    assert embedded_object["object"] == "https://pawoo.net/users/pekorino" -    refute activity.local - -    follower = User.get_cached_by_ap_id(activity.data["actor"]) -    followed = User.get_cached_by_ap_id(embedded_object["object"]) - -    refute User.following?(follower, followed) -  end - -  test "it clears `unreachable` federation status of the sender" do -    incoming_reaction_xml = File.read!("test/fixtures/share-gs.xml") -    doc = XML.parse_document(incoming_reaction_xml) -    actor_uri = XML.string_from_xpath("//author/uri[1]", doc) -    reacted_to_author_uri = XML.string_from_xpath("//author/uri[2]", doc) - -    Instances.set_consistently_unreachable(actor_uri) -    Instances.set_consistently_unreachable(reacted_to_author_uri) -    refute Instances.reachable?(actor_uri) -    refute Instances.reachable?(reacted_to_author_uri) - -    {:ok, _} = OStatus.handle_incoming(incoming_reaction_xml) -    assert Instances.reachable?(actor_uri) -    refute Instances.reachable?(reacted_to_author_uri) -  end - -  describe "new remote user creation" do -    test "returns local users" do -      local_user = insert(:user) -      {:ok, user} = OStatus.find_or_make_user(local_user.ap_id) - -      assert user == local_user -    end - -    test "tries to use the information in poco fields" do -      uri = "https://social.heldscal.la/user/23211" - -      {:ok, user} = OStatus.find_or_make_user(uri) - -      user = User.get_cached_by_id(user.id) -      assert user.name == "Constance Variable" -      assert user.nickname == "lambadalambda@social.heldscal.la" -      assert user.local == false -      assert user.info.uri == uri -      assert user.ap_id == uri -      assert user.bio == "Call me Deacon Blues." -      assert user.avatar["type"] == "Image" - -      {:ok, user_again} = OStatus.find_or_make_user(uri) - -      assert user == user_again -    end - -    test "find_or_make_user sets all the nessary input fields" do -      uri = "https://social.heldscal.la/user/23211" -      {:ok, user} = OStatus.find_or_make_user(uri) - -      assert user.info == -               %User.Info{ -                 id: user.info.id, -                 ap_enabled: false, -                 background: %{}, -                 banner: %{}, -                 blocks: [], -                 deactivated: false, -                 default_scope: "public", -                 domain_blocks: [], -                 follower_count: 0, -                 is_admin: false, -                 is_moderator: false, -                 keys: nil, -                 locked: false, -                 no_rich_text: false, -                 note_count: 0, -                 settings: nil, -                 source_data: %{}, -                 hub: "https://social.heldscal.la/main/push/hub", -                 magic_key: -                   "RSA.uzg6r1peZU0vXGADWxGJ0PE34WvmhjUmydbX5YYdOiXfODVLwCMi1umGoqUDm-mRu4vNEdFBVJU1CpFA7dKzWgIsqsa501i2XqElmEveXRLvNRWFB6nG03Q5OUY2as8eE54BJm0p20GkMfIJGwP6TSFb-ICp3QjzbatuSPJ6xCE=.AQAB", -                 salmon: "https://social.heldscal.la/main/salmon/user/23211", -                 topic: "https://social.heldscal.la/api/statuses/user_timeline/23211.atom", -                 uri: "https://social.heldscal.la/user/23211" -               } -    end - -    test "find_make_or_update_actor takes an author element and returns an updated user" do -      uri = "https://social.heldscal.la/user/23211" - -      {:ok, user} = OStatus.find_or_make_user(uri) -      old_name = user.name -      old_bio = user.bio -      change = Ecto.Changeset.change(user, %{avatar: nil, bio: nil, name: nil}) - -      {:ok, user} = Repo.update(change) -      refute user.avatar - -      doc = XML.parse_document(File.read!("test/fixtures/23211.atom")) -      [author] = :xmerl_xpath.string('//author[1]', doc) -      {:ok, user} = OStatus.find_make_or_update_actor(author) -      assert user.avatar["type"] == "Image" -      assert user.name == old_name -      assert user.bio == old_bio - -      {:ok, user_again} = OStatus.find_make_or_update_actor(author) -      assert user_again == user -    end - -    test "find_or_make_user disallows protocol downgrade" do -      user = insert(:user, %{local: true}) -      {:ok, user} = OStatus.find_or_make_user(user.ap_id) - -      assert User.ap_enabled?(user) - -      user = -        insert(:user, %{ -          ap_id: "https://social.heldscal.la/user/23211", -          info: %{ap_enabled: true}, -          local: false -        }) - -      assert User.ap_enabled?(user) - -      {:ok, user} = OStatus.find_or_make_user(user.ap_id) -      assert User.ap_enabled?(user) -    end - -    test "find_make_or_update_actor disallows protocol downgrade" do -      user = insert(:user, %{local: true}) -      {:ok, user} = OStatus.find_or_make_user(user.ap_id) - -      assert User.ap_enabled?(user) - -      user = -        insert(:user, %{ -          ap_id: "https://social.heldscal.la/user/23211", -          info: %{ap_enabled: true}, -          local: false -        }) - -      assert User.ap_enabled?(user) - -      {:ok, user} = OStatus.find_or_make_user(user.ap_id) -      assert User.ap_enabled?(user) - -      doc = XML.parse_document(File.read!("test/fixtures/23211.atom")) -      [author] = :xmerl_xpath.string('//author[1]', doc) -      {:error, :invalid_protocol} = OStatus.find_make_or_update_actor(author) -    end -  end - -  describe "gathering user info from a user id" do -    test "it returns user info in a hash" do -      user = "shp@social.heldscal.la" - -      # TODO: make test local -      {:ok, data} = OStatus.gather_user_info(user) - -      expected = %{ -        "hub" => "https://social.heldscal.la/main/push/hub", -        "magic_key" => -          "RSA.wQ3i9UA0qmAxZ0WTIp4a-waZn_17Ez1pEEmqmqoooRsG1_BvpmOvLN0G2tEcWWxl2KOtdQMCiPptmQObeZeuj48mdsDZ4ArQinexY2hCCTcbV8Xpswpkb8K05RcKipdg07pnI7tAgQ0VWSZDImncL6YUGlG5YN8b5TjGOwk2VG8=.AQAB", -        "name" => "shp", -        "nickname" => "shp", -        "salmon" => "https://social.heldscal.la/main/salmon/user/29191", -        "subject" => "acct:shp@social.heldscal.la", -        "topic" => "https://social.heldscal.la/api/statuses/user_timeline/29191.atom", -        "uri" => "https://social.heldscal.la/user/29191", -        "host" => "social.heldscal.la", -        "fqn" => user, -        "bio" => "cofe", -        "avatar" => %{ -          "type" => "Image", -          "url" => [ -            %{ -              "href" => "https://social.heldscal.la/avatar/29191-original-20170421154949.jpeg", -              "mediaType" => "image/jpeg", -              "type" => "Link" -            } -          ] -        }, -        "subscribe_address" => "https://social.heldscal.la/main/ostatussub?profile={uri}", -        "ap_id" => nil -      } - -      assert data == expected -    end - -    test "it works with the uri" do -      user = "https://social.heldscal.la/user/29191" - -      # TODO: make test local -      {:ok, data} = OStatus.gather_user_info(user) - -      expected = %{ -        "hub" => "https://social.heldscal.la/main/push/hub", -        "magic_key" => -          "RSA.wQ3i9UA0qmAxZ0WTIp4a-waZn_17Ez1pEEmqmqoooRsG1_BvpmOvLN0G2tEcWWxl2KOtdQMCiPptmQObeZeuj48mdsDZ4ArQinexY2hCCTcbV8Xpswpkb8K05RcKipdg07pnI7tAgQ0VWSZDImncL6YUGlG5YN8b5TjGOwk2VG8=.AQAB", -        "name" => "shp", -        "nickname" => "shp", -        "salmon" => "https://social.heldscal.la/main/salmon/user/29191", -        "subject" => "https://social.heldscal.la/user/29191", -        "topic" => "https://social.heldscal.la/api/statuses/user_timeline/29191.atom", -        "uri" => "https://social.heldscal.la/user/29191", -        "host" => "social.heldscal.la", -        "fqn" => user, -        "bio" => "cofe", -        "avatar" => %{ -          "type" => "Image", -          "url" => [ -            %{ -              "href" => "https://social.heldscal.la/avatar/29191-original-20170421154949.jpeg", -              "mediaType" => "image/jpeg", -              "type" => "Link" -            } -          ] -        }, -        "subscribe_address" => "https://social.heldscal.la/main/ostatussub?profile={uri}", -        "ap_id" => nil -      } - -      assert data == expected -    end -  end - -  describe "fetching a status by it's HTML url" do -    test "it builds a missing status from an html url" do -      capture_log(fn -> -        url = "https://shitposter.club/notice/2827873" -        {:ok, [activity]} = OStatus.fetch_activity_from_url(url) - -        assert activity.data["actor"] == "https://shitposter.club/user/1" - -        assert activity.data["object"] == -                 "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" -      end) -    end - -    test "it works for atom notes, too" 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"] == url -    end -  end - -  test "it doesn't add nil in the to field" do -    incoming = File.read!("test/fixtures/nil_mention_entry.xml") -    {:ok, [activity]} = OStatus.handle_incoming(incoming) - -    assert activity.data["to"] == [ -             "http://localhost:4001/users/atarifrosch@social.stopwatchingus-heidelberg.de/followers", -             "https://www.w3.org/ns/activitystreams#Public" -           ] -  end - -  describe "is_representable?" do -    test "Note objects are representable" do -      note_activity = insert(:note_activity) - -      assert OStatus.is_representable?(note_activity) -    end - -    test "Article objects are not representable" do -      note_activity = insert(:note_activity) -      note_object = Object.normalize(note_activity) - -      note_data = -        note_object.data -        |> Map.put("type", "Article") - -      Cachex.clear(:object_cache) - -      cs = Object.change(note_object, %{data: note_data}) -      {:ok, _article_object} = Repo.update(cs) - -      # the underlying object is now an Article instead of a note, so this should fail -      refute OStatus.is_representable?(note_activity) -    end -  end - -  describe "make_user/2" do -    test "creates new user" do -      {:ok, user} = OStatus.make_user("https://social.heldscal.la/user/23211") - -      created_user = -        User -        |> Repo.get_by(ap_id: "https://social.heldscal.la/user/23211") -        |> Map.put(:last_digest_emailed_at, nil) - -      assert user.info -      assert user == created_user -    end -  end -end diff --git a/test/web/ostatus/user_representer_test.exs b/test/web/ostatus/user_representer_test.exs deleted file mode 100644 index e3863d2e9..000000000 --- a/test/web/ostatus/user_representer_test.exs +++ /dev/null @@ -1,38 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OStatus.UserRepresenterTest do -  use Pleroma.DataCase -  alias Pleroma.Web.OStatus.UserRepresenter - -  import Pleroma.Factory -  alias Pleroma.User - -  test "returns a user with id, uri, name and link" do -    user = insert(:user, %{nickname: "レイン"}) -    tuple = UserRepresenter.to_simple_form(user) - -    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> to_string - -    expected = """ -    <id>#{user.ap_id}</id> -    <activity:object>http://activitystrea.ms/schema/1.0/person</activity:object> -    <uri>#{user.ap_id}</uri> -    <poco:preferredUsername>#{user.nickname}</poco:preferredUsername> -    <poco:displayName>#{user.name}</poco:displayName> -    <poco:note>#{user.bio}</poco:note> -    <summary>#{user.bio}</summary> -    <name>#{user.nickname}</name> -    <link rel="avatar" href="#{User.avatar_url(user)}" /> -    <link rel="header" href="#{User.banner_url(user)}" /> -    <ap_enabled>true</ap_enabled> -    """ - -    assert clean(res) == clean(expected) -  end - -  defp clean(string) do -    String.replace(string, ~r/\s/, "") -  end -end diff --git a/test/web/salmon/salmon_test.exs b/test/web/salmon/salmon_test.exs deleted file mode 100644 index 153ec41ac..000000000 --- a/test/web/salmon/salmon_test.exs +++ /dev/null @@ -1,101 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.Salmon.SalmonTest do -  use Pleroma.DataCase -  alias Pleroma.Activity -  alias Pleroma.Keys -  alias Pleroma.Repo -  alias Pleroma.User -  alias Pleroma.Web.Federator.Publisher -  alias Pleroma.Web.Salmon -  import Mock -  import Pleroma.Factory - -  @magickey "RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwQhh-1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB" - -  @wrong_magickey "RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwQhh-1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAA" - -  @magickey_friendica "RSA.AMwa8FUs2fWEjX0xN7yRQgegQffhBpuKNC6fa5VNSVorFjGZhRrlPMn7TQOeihlc9lBz2OsHlIedbYn2uJ7yCs0.AQAB" - -  setup_all do -    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) -    :ok -  end - -  test "decodes a salmon" do -    {:ok, salmon} = File.read("test/fixtures/salmon.xml") -    {:ok, doc} = Salmon.decode_and_validate(@magickey, salmon) -    assert Regex.match?(~r/xml/, doc) -  end - -  test "errors on wrong magic key" do -    {:ok, salmon} = File.read("test/fixtures/salmon.xml") -    assert Salmon.decode_and_validate(@wrong_magickey, salmon) == :error -  end - -  test "it encodes a magic key from a public key" do -    key = Salmon.decode_key(@magickey) -    magic_key = Salmon.encode_key(key) - -    assert @magickey == magic_key -  end - -  test "it decodes a friendica public key" do -    _key = Salmon.decode_key(@magickey_friendica) -  end - -  test "encodes an xml payload with a private key" do -    doc = File.read!("test/fixtures/incoming_note_activity.xml") -    pem = File.read!("test/fixtures/private_key.pem") -    {:ok, private, public} = Keys.keys_from_pem(pem) - -    # Let's try a roundtrip. -    {:ok, salmon} = Salmon.encode(private, doc) -    {:ok, decoded_doc} = Salmon.decode_and_validate(Salmon.encode_key(public), salmon) - -    assert doc == decoded_doc -  end - -  test "it gets a magic key" do -    salmon = File.read!("test/fixtures/salmon2.xml") -    {:ok, key} = Salmon.fetch_magic_key(salmon) - -    assert key == -             "RSA.uzg6r1peZU0vXGADWxGJ0PE34WvmhjUmydbX5YYdOiXfODVLwCMi1umGoqUDm-mRu4vNEdFBVJU1CpFA7dKzWgIsqsa501i2XqElmEveXRLvNRWFB6nG03Q5OUY2as8eE54BJm0p20GkMfIJGwP6TSFb-ICp3QjzbatuSPJ6xCE=.AQAB" -  end - -  test_with_mock "it pushes an activity to remote accounts it's addressed to", -                 Publisher, -                 [:passthrough], -                 [] do -    user_data = %{ -      info: %{ -        salmon: "http://test-example.org/salmon" -      }, -      local: false -    } - -    mentioned_user = insert(:user, user_data) -    note = insert(:note) - -    activity_data = %{ -      "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(), -      "type" => "Create", -      "actor" => note.data["actor"], -      "to" => note.data["to"] ++ [mentioned_user.ap_id], -      "object" => note.data, -      "published_at" => DateTime.utc_now() |> DateTime.to_iso8601(), -      "context" => note.data["context"] -    } - -    {:ok, activity} = Repo.insert(%Activity{data: activity_data, recipients: activity_data["to"]}) -    user = User.get_cached_by_ap_id(activity.data["actor"]) -    {:ok, user} = User.ensure_keys_present(user) - -    Salmon.publish(user, activity) - -    assert called(Publisher.enqueue_one(Salmon, %{recipient_id: mentioned_user.id})) -  end -end diff --git a/test/web/web_finger/web_finger_test.exs b/test/web/web_finger/web_finger_test.exs index 696c1bd70..5aa8c73cf 100644 --- a/test/web/web_finger/web_finger_test.exs +++ b/test/web/web_finger/web_finger_test.exs @@ -45,19 +45,6 @@ defmodule Pleroma.Web.WebFingerTest do        assert {:error, %Jason.DecodeError{}} = WebFinger.finger(user)      end -    test "returns the info for an OStatus user" do -      user = "shp@social.heldscal.la" - -      {:ok, data} = WebFinger.finger(user) - -      assert data["magic_key"] == -               "RSA.wQ3i9UA0qmAxZ0WTIp4a-waZn_17Ez1pEEmqmqoooRsG1_BvpmOvLN0G2tEcWWxl2KOtdQMCiPptmQObeZeuj48mdsDZ4ArQinexY2hCCTcbV8Xpswpkb8K05RcKipdg07pnI7tAgQ0VWSZDImncL6YUGlG5YN8b5TjGOwk2VG8=.AQAB" - -      assert data["topic"] == "https://social.heldscal.la/api/statuses/user_timeline/29191.atom" -      assert data["subject"] == "acct:shp@social.heldscal.la" -      assert data["salmon"] == "https://social.heldscal.la/main/salmon/user/29191" -    end -      test "returns the ActivityPub actor URI for an ActivityPub user" do        user = "framasoft@framatube.org" @@ -72,20 +59,6 @@ defmodule Pleroma.Web.WebFingerTest do        assert data["ap_id"] == "https://gerzilla.de/channel/kaniini"      end -    test "returns the correctly for json ostatus users" do -      user = "winterdienst@gnusocial.de" - -      {:ok, data} = WebFinger.finger(user) - -      assert data["magic_key"] == -               "RSA.qfYaxztz7ZELrE4v5WpJrPM99SKI3iv9Y3Tw6nfLGk-4CRljNYqV8IYX2FXjeucC_DKhPNnlF6fXyASpcSmA_qupX9WC66eVhFhZ5OuyBOeLvJ1C4x7Hi7Di8MNBxY3VdQuQR0tTaS_YAZCwASKp7H6XEid3EJpGt0EQZoNzRd8=.AQAB" - -      assert data["topic"] == "https://gnusocial.de/api/statuses/user_timeline/249296.atom" -      assert data["subject"] == "acct:winterdienst@gnusocial.de" -      assert data["salmon"] == "https://gnusocial.de/main/salmon/user/249296" -      assert data["subscribe_address"] == "https://gnusocial.de/main/ostatussub?profile={uri}" -    end -      test "it work for AP-only user" do        user = "kpherox@mstdn.jp" diff --git a/test/web/websub/websub_controller_test.exs b/test/web/websub/websub_controller_test.exs deleted file mode 100644 index f6d002b3b..000000000 --- a/test/web/websub/websub_controller_test.exs +++ /dev/null @@ -1,86 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.Websub.WebsubControllerTest do -  use Pleroma.Web.ConnCase -  import Pleroma.Factory -  alias Pleroma.Repo -  alias Pleroma.Web.Websub -  alias Pleroma.Web.Websub.WebsubClientSubscription - -  clear_config_all([:instance, :federating]) do -    Pleroma.Config.put([:instance, :federating], true) -  end - -  test "websub subscription request", %{conn: conn} do -    user = insert(:user) - -    path = Pleroma.Web.OStatus.pubsub_path(user) - -    data = %{ -      "hub.callback": "http://example.org/sub", -      "hub.mode": "subscribe", -      "hub.topic": Pleroma.Web.OStatus.feed_path(user), -      "hub.secret": "a random secret", -      "hub.lease_seconds": "100" -    } - -    conn = -      conn -      |> post(path, data) - -    assert response(conn, 202) == "Accepted" -  end - -  test "websub subscription confirmation", %{conn: conn} do -    websub = insert(:websub_client_subscription) - -    params = %{ -      "hub.mode" => "subscribe", -      "hub.topic" => websub.topic, -      "hub.challenge" => "some challenge", -      "hub.lease_seconds" => "100" -    } - -    conn = -      conn -      |> get("/push/subscriptions/#{websub.id}", params) - -    websub = Repo.get(WebsubClientSubscription, websub.id) - -    assert response(conn, 200) == "some challenge" -    assert websub.state == "accepted" -    assert_in_delta NaiveDateTime.diff(websub.valid_until, NaiveDateTime.utc_now()), 100, 5 -  end - -  describe "websub_incoming" do -    test "accepts incoming feed updates", %{conn: conn} do -      websub = insert(:websub_client_subscription) -      doc = "some stuff" -      signature = Websub.sign(websub.secret, doc) - -      conn = -        conn -        |> put_req_header("x-hub-signature", "sha1=" <> signature) -        |> put_req_header("content-type", "application/atom+xml") -        |> post("/push/subscriptions/#{websub.id}", doc) - -      assert response(conn, 200) == "OK" -    end - -    test "rejects incoming feed updates with the wrong signature", %{conn: conn} do -      websub = insert(:websub_client_subscription) -      doc = "some stuff" -      signature = Websub.sign("wrong secret", doc) - -      conn = -        conn -        |> put_req_header("x-hub-signature", "sha1=" <> signature) -        |> put_req_header("content-type", "application/atom+xml") -        |> post("/push/subscriptions/#{websub.id}", doc) - -      assert response(conn, 500) == "Error" -    end -  end -end diff --git a/test/web/websub/websub_test.exs b/test/web/websub/websub_test.exs deleted file mode 100644 index 46ca545de..000000000 --- a/test/web/websub/websub_test.exs +++ /dev/null @@ -1,236 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.WebsubTest do -  use Pleroma.DataCase -  use Oban.Testing, repo: Pleroma.Repo - -  alias Pleroma.Tests.ObanHelpers -  alias Pleroma.Web.Router.Helpers -  alias Pleroma.Web.Websub -  alias Pleroma.Web.Websub.WebsubClientSubscription -  alias Pleroma.Web.Websub.WebsubServerSubscription -  alias Pleroma.Workers.SubscriberWorker - -  import Pleroma.Factory -  import Tesla.Mock - -  setup do -    mock(fn env -> apply(HttpRequestMock, :request, [env]) end) -    :ok -  end - -  test "a verification of a request that is accepted" do -    sub = insert(:websub_subscription) -    topic = sub.topic - -    getter = fn _path, _headers, options -> -      %{ -        "hub.challenge": challenge, -        "hub.lease_seconds": seconds, -        "hub.topic": ^topic, -        "hub.mode": "subscribe" -      } = Keyword.get(options, :params) - -      assert String.to_integer(seconds) > 0 - -      {:ok, -       %Tesla.Env{ -         status: 200, -         body: challenge -       }} -    end - -    {:ok, sub} = Websub.verify(sub, getter) -    assert sub.state == "active" -  end - -  test "a verification of a request that doesn't return 200" do -    sub = insert(:websub_subscription) - -    getter = fn _path, _headers, _options -> -      {:ok, -       %Tesla.Env{ -         status: 500, -         body: "" -       }} -    end - -    {:error, sub} = Websub.verify(sub, getter) -    # Keep the current state. -    assert sub.state == "requested" -  end - -  test "an incoming subscription request" do -    user = insert(:user) - -    data = %{ -      "hub.callback" => "http://example.org/sub", -      "hub.mode" => "subscribe", -      "hub.topic" => Pleroma.Web.OStatus.feed_path(user), -      "hub.secret" => "a random secret", -      "hub.lease_seconds" => "100" -    } - -    {:ok, subscription} = Websub.incoming_subscription_request(user, data) -    assert subscription.topic == Pleroma.Web.OStatus.feed_path(user) -    assert subscription.state == "requested" -    assert subscription.secret == "a random secret" -    assert subscription.callback == "http://example.org/sub" -  end - -  test "an incoming subscription request for an existing subscription" do -    user = insert(:user) - -    sub = -      insert(:websub_subscription, state: "accepted", topic: Pleroma.Web.OStatus.feed_path(user)) - -    data = %{ -      "hub.callback" => sub.callback, -      "hub.mode" => "subscribe", -      "hub.topic" => Pleroma.Web.OStatus.feed_path(user), -      "hub.secret" => "a random secret", -      "hub.lease_seconds" => "100" -    } - -    {:ok, subscription} = Websub.incoming_subscription_request(user, data) -    assert subscription.topic == Pleroma.Web.OStatus.feed_path(user) -    assert subscription.state == sub.state -    assert subscription.secret == "a random secret" -    assert subscription.callback == sub.callback -    assert length(Repo.all(WebsubServerSubscription)) == 1 -    assert subscription.id == sub.id -  end - -  def accepting_verifier(subscription) do -    {:ok, %{subscription | state: "accepted"}} -  end - -  test "initiate a subscription for a given user and topic" do -    subscriber = insert(:user) -    user = insert(:user, %{info: %Pleroma.User.Info{topic: "some_topic", hub: "some_hub"}}) - -    {:ok, websub} = Websub.subscribe(subscriber, user, &accepting_verifier/1) -    assert websub.subscribers == [subscriber.ap_id] -    assert websub.topic == "some_topic" -    assert websub.hub == "some_hub" -    assert is_binary(websub.secret) -    assert websub.user == user -    assert websub.state == "accepted" -  end - -  test "discovers the hub and canonical url" do -    topic = "https://mastodon.social/users/lambadalambda.atom" - -    {:ok, discovered} = Websub.gather_feed_data(topic) - -    expected = %{ -      "hub" => "https://mastodon.social/api/push", -      "uri" => "https://mastodon.social/users/lambadalambda", -      "nickname" => "lambadalambda", -      "name" => "Critical Value", -      "host" => "mastodon.social", -      "bio" => "a cool dude.", -      "avatar" => %{ -        "type" => "Image", -        "url" => [ -          %{ -            "href" => -              "https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif?1492379244", -            "mediaType" => "image/gif", -            "type" => "Link" -          } -        ] -      } -    } - -    assert expected == discovered -  end - -  test "calls the hub, requests topic" do -    hub = "https://social.heldscal.la/main/push/hub" -    topic = "https://social.heldscal.la/api/statuses/user_timeline/23211.atom" -    websub = insert(:websub_client_subscription, %{hub: hub, topic: topic}) - -    poster = fn ^hub, {:form, data}, _headers -> -      assert Keyword.get(data, :"hub.mode") == "subscribe" - -      assert Keyword.get(data, :"hub.callback") == -               Helpers.websub_url( -                 Pleroma.Web.Endpoint, -                 :websub_subscription_confirmation, -                 websub.id -               ) - -      {:ok, %{status: 202}} -    end - -    task = Task.async(fn -> Websub.request_subscription(websub, poster) end) - -    change = Ecto.Changeset.change(websub, %{state: "accepted"}) -    {:ok, _} = Repo.update(change) - -    {:ok, websub} = Task.await(task) - -    assert websub.state == "accepted" -  end - -  test "rejects the subscription if it can't be accepted" do -    hub = "https://social.heldscal.la/main/push/hub" -    topic = "https://social.heldscal.la/api/statuses/user_timeline/23211.atom" -    websub = insert(:websub_client_subscription, %{hub: hub, topic: topic}) - -    poster = fn ^hub, {:form, _data}, _headers -> -      {:ok, %{status: 202}} -    end - -    {:error, websub} = Websub.request_subscription(websub, poster, 1000) -    assert websub.state == "rejected" - -    websub = insert(:websub_client_subscription, %{hub: hub, topic: topic}) - -    poster = fn ^hub, {:form, _data}, _headers -> -      {:ok, %{status: 400}} -    end - -    {:error, websub} = Websub.request_subscription(websub, poster, 1000) -    assert websub.state == "rejected" -  end - -  test "sign a text" do -    signed = Websub.sign("secret", "text") -    assert signed == "B8392C23690CCF871F37EC270BE1582DEC57A503" |> String.downcase() - -    _signed = Websub.sign("secret", [["て"], ['す']]) -  end - -  describe "renewing subscriptions" do -    test "it renews subscriptions that have less than a day of time left" do -      day = 60 * 60 * 24 -      now = NaiveDateTime.utc_now() - -      still_good = -        insert(:websub_client_subscription, %{ -          valid_until: NaiveDateTime.add(now, 2 * day), -          topic: "http://example.org/still_good", -          hub: "http://example.org/still_good", -          state: "accepted" -        }) - -      needs_refresh = -        insert(:websub_client_subscription, %{ -          valid_until: NaiveDateTime.add(now, day - 100), -          topic: "http://example.org/needs_refresh", -          hub: "http://example.org/needs_refresh", -          state: "accepted" -        }) - -      _refresh = Websub.refresh_subscriptions() -      ObanHelpers.perform(all_enqueued(worker: SubscriberWorker)) - -      assert still_good == Repo.get(WebsubClientSubscription, still_good.id) -      refute needs_refresh == Repo.get(WebsubClientSubscription, needs_refresh.id) -    end -  end -end | 
