diff options
Diffstat (limited to 'test/web')
20 files changed, 693 insertions, 114 deletions
| diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index eafb96f3a..b826f5a1b 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -64,6 +64,34 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert user.info.ap_enabled        assert user.follower_address == "http://mastodon.example.org/users/admin/followers"      end + +    test "it fetches the appropriate tag-restricted posts" do +      user = insert(:user) + +      {:ok, status_one} = CommonAPI.post(user, %{"status" => ". #test"}) +      {:ok, status_two} = CommonAPI.post(user, %{"status" => ". #essais"}) +      {:ok, status_three} = CommonAPI.post(user, %{"status" => ". #test #reject"}) + +      fetch_one = ActivityPub.fetch_activities([], %{"tag" => "test"}) +      fetch_two = ActivityPub.fetch_activities([], %{"tag" => ["test", "essais"]}) + +      fetch_three = +        ActivityPub.fetch_activities([], %{ +          "tag" => ["test", "essais"], +          "tag_reject" => ["reject"] +        }) + +      fetch_four = +        ActivityPub.fetch_activities([], %{ +          "tag" => ["test"], +          "tag_all" => ["test", "reject"] +        }) + +      assert fetch_one == [status_one, status_three] +      assert fetch_two == [status_one, status_two, status_three] +      assert fetch_three == [status_one, status_two] +      assert fetch_four == [status_three] +    end    end    describe "insertion" do @@ -85,6 +113,17 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert {:error, {:remote_limit_error, _}} = ActivityPub.insert(data)      end +    test "doesn't drop activities with content being null" do +      data = %{ +        "ok" => true, +        "object" => %{ +          "content" => nil +        } +      } + +      assert {:ok, _} = ActivityPub.insert(data) +    end +      test "returns the activity if one with the same id is already in" do        activity = insert(:note_activity)        {:ok, new_activity} = ActivityPub.insert(activity.data) @@ -160,7 +199,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert activity.data["to"] == ["user1", "user2"]        assert activity.actor == user.ap_id -      assert activity.recipients == ["user1", "user2"] +      assert activity.recipients == ["user1", "user2", user.ap_id]      end    end @@ -216,7 +255,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      {:ok, user} = User.block(user, %{ap_id: activity_three.data["actor"]})      {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.repeat(activity_three.id, booster) -    %Activity{} = boost_activity = Activity.get_create_activity_by_object_ap_id(id) +    %Activity{} = boost_activity = Activity.get_create_by_object_ap_id(id)      activity_three = Repo.get(Activity, activity_three.id)      activities = ActivityPub.fetch_activities([], %{"blocking_user" => user}) @@ -330,7 +369,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert like_activity == same_like_activity        assert object.data["likes"] == [user.ap_id] -      [note_activity] = Activity.all_by_object_ap_id(object.data["id"]) +      [note_activity] = Activity.get_all_create_by_object_ap_id(object.data["id"])        assert note_activity.data["object"]["like_count"] == 1        {:ok, _like_activity, object} = ActivityPub.like(user_two, object) @@ -445,7 +484,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        {:ok, object} =          ActivityPub.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") -      assert activity = Activity.get_create_activity_by_object_ap_id(object.data["id"]) +      assert activity = Activity.get_create_by_object_ap_id(object.data["id"])        assert activity.data["id"]        {:ok, object_again} = @@ -459,7 +498,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      test "it works with objects only available via Ostatus" do        {:ok, object} = ActivityPub.fetch_object_from_id("https://shitposter.club/notice/2827873") -      assert activity = Activity.get_create_activity_by_object_ap_id(object.data["id"]) +      assert activity = Activity.get_create_by_object_ap_id(object.data["id"])        assert activity.data["id"]        {:ok, object_again} = @@ -584,8 +623,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do            "in_reply_to_status_id" => private_activity_2.id          }) -      assert user1.following == [user3.ap_id <> "/followers", user1.ap_id] -        activities = ActivityPub.fetch_activities([user1.ap_id | user1.following])        assert [public_activity, private_activity_1, private_activity_3] == activities diff --git a/test/web/activity_pub/mrf/anti_followbot_policy_test.exs b/test/web/activity_pub/mrf/anti_followbot_policy_test.exs new file mode 100644 index 000000000..2ea4f9d3f --- /dev/null +++ b/test/web/activity_pub/mrf/anti_followbot_policy_test.exs @@ -0,0 +1,57 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicyTest do +  use Pleroma.DataCase +  import Pleroma.Factory + +  alias Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy + +  describe "blocking based on attributes" do +    test "matches followbots by nickname" do +      actor = insert(:user, %{nickname: "followbot@example.com"}) +      target = insert(:user) + +      message = %{ +        "@context" => "https://www.w3.org/ns/activitystreams", +        "type" => "Follow", +        "actor" => actor.ap_id, +        "object" => target.ap_id, +        "id" => "https://example.com/activities/1234" +      } + +      {:reject, nil} = AntiFollowbotPolicy.filter(message) +    end + +    test "matches followbots by display name" do +      actor = insert(:user, %{name: "Federation Bot"}) +      target = insert(:user) + +      message = %{ +        "@context" => "https://www.w3.org/ns/activitystreams", +        "type" => "Follow", +        "actor" => actor.ap_id, +        "object" => target.ap_id, +        "id" => "https://example.com/activities/1234" +      } + +      {:reject, nil} = AntiFollowbotPolicy.filter(message) +    end +  end + +  test "it allows non-followbots" do +    actor = insert(:user) +    target = insert(:user) + +    message = %{ +      "@context" => "https://www.w3.org/ns/activitystreams", +      "type" => "Follow", +      "actor" => actor.ap_id, +      "object" => target.ap_id, +      "id" => "https://example.com/activities/1234" +    } + +    {:ok, _} = AntiFollowbotPolicy.filter(message) +  end +end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 87d0ab559..e5e3c8d33 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -51,7 +51,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        {:ok, returned_activity} = Transmogrifier.handle_incoming(data)        assert activity = -               Activity.get_create_activity_by_object_ap_id( +               Activity.get_create_by_object_ap_id(                   "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"                 ) @@ -162,6 +162,36 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["object"]["url"] == "https://prismo.news/posts/83"      end +    test "it cleans up incoming notices which are not really DMs" do +      user = insert(:user) +      other_user = insert(:user) + +      to = [user.ap_id, other_user.ap_id] + +      data = +        File.read!("test/fixtures/mastodon-post-activity.json") +        |> Poison.decode!() +        |> Map.put("to", to) +        |> Map.put("cc", []) + +      object = +        data["object"] +        |> Map.put("to", to) +        |> Map.put("cc", []) + +      data = Map.put(data, "object", object) + +      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +      assert data["to"] == [] +      assert data["cc"] == to + +      object = data["object"] + +      assert object["to"] == [] +      assert object["cc"] == to +    end +      test "it works for incoming follow requests" do        user = insert(:user) @@ -263,7 +293,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["object"] ==                 "http://mastodon.example.org/users/admin/statuses/99541947525187367" -      assert Activity.get_create_activity_by_object_ap_id(data["object"]) +      assert Activity.get_create_by_object_ap_id(data["object"])      end      test "it works for incoming announces with an existing activity" do @@ -285,7 +315,23 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["object"] == activity.data["object"]["id"] -      assert Activity.get_create_activity_by_object_ap_id(data["object"]).id == activity.id +      assert Activity.get_create_by_object_ap_id(data["object"]).id == activity.id +    end + +    test "it does not clobber the addressing on announce activities" do +      user = insert(:user) +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"}) + +      data = +        File.read!("test/fixtures/mastodon-announce.json") +        |> Poison.decode!() +        |> Map.put("object", activity.data["object"]["id"]) +        |> Map.put("to", ["http://mastodon.example.org/users/admin/followers"]) +        |> Map.put("cc", []) + +      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +      assert data["to"] == ["http://mastodon.example.org/users/admin/followers"]      end      test "it works for incoming update activities" do @@ -856,6 +902,34 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert modified["object"]["likes"]["type"] == "OrderedCollection"        assert modified["object"]["likes"]["totalItems"] == 0      end + +    test "the directMessage flag is present" do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "2hu :moominmamma:"}) + +      {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) + +      assert modified["directMessage"] == false + +      {:ok, activity} = +        CommonAPI.post(user, %{"status" => "@#{other_user.nickname} :moominmamma:"}) + +      {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) + +      assert modified["directMessage"] == false + +      {:ok, activity} = +        CommonAPI.post(user, %{ +          "status" => "@#{other_user.nickname} :moominmamma:", +          "visibility" => "direct" +        }) + +      {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) + +      assert modified["directMessage"] == true +    end    end    describe "user upgrade" do diff --git a/test/web/activity_pub/utils_test.exs b/test/web/activity_pub/utils_test.exs new file mode 100644 index 000000000..aeed0564c --- /dev/null +++ b/test/web/activity_pub/utils_test.exs @@ -0,0 +1,57 @@ +defmodule Pleroma.Web.ActivityPub.UtilsTest do +  use Pleroma.DataCase +  alias Pleroma.Web.ActivityPub.Utils + +  describe "determine_explicit_mentions()" do +    test "works with an object that has mentions" do +      object = %{ +        "tag" => [ +          %{ +            "type" => "Mention", +            "href" => "https://example.com/~alyssa", +            "name" => "Alyssa P. Hacker" +          } +        ] +      } + +      assert Utils.determine_explicit_mentions(object) == ["https://example.com/~alyssa"] +    end + +    test "works with an object that does not have mentions" do +      object = %{ +        "tag" => [ +          %{"type" => "Hashtag", "href" => "https://example.com/tag/2hu", "name" => "2hu"} +        ] +      } + +      assert Utils.determine_explicit_mentions(object) == [] +    end + +    test "works with an object that has mentions and other tags" do +      object = %{ +        "tag" => [ +          %{ +            "type" => "Mention", +            "href" => "https://example.com/~alyssa", +            "name" => "Alyssa P. Hacker" +          }, +          %{"type" => "Hashtag", "href" => "https://example.com/tag/2hu", "name" => "2hu"} +        ] +      } + +      assert Utils.determine_explicit_mentions(object) == ["https://example.com/~alyssa"] +    end + +    test "works with an object that has no tags" do +      object = %{} + +      assert Utils.determine_explicit_mentions(object) == [] +    end + +    test "works with an object that has only IR tags" do +      object = %{"tag" => ["2hu"]} + +      assert Utils.determine_explicit_mentions(object) == [] +    end +  end +end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 9ac805f24..a7d9e6161 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -17,6 +17,13 @@ defmodule Pleroma.Web.CommonAPI.Test do      assert activity.data["object"]["tag"] == ["2hu"]    end +  test "it adds emoji in the object" do +    user = insert(:user) +    {:ok, activity} = CommonAPI.post(user, %{"status" => ":moominmamma:"}) + +    assert activity.data["object"]["emoji"]["moominmamma"] +  end +    test "it adds emoji when updating profiles" do      user = insert(:user, %{name: ":karjalanpiirakka:"}) diff --git a/test/web/mastodon_api/account_view_test.exs b/test/web/mastodon_api/account_view_test.exs index d53e11963..f8cd68173 100644 --- a/test/web/mastodon_api/account_view_test.exs +++ b/test/web/mastodon_api/account_view_test.exs @@ -61,7 +61,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        },        pleroma: %{          confirmation_pending: false, -        tags: [] +        tags: [], +        is_admin: false, +        is_moderator: false        }      } @@ -102,7 +104,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        },        pleroma: %{          confirmation_pending: false, -        tags: [] +        tags: [], +        is_admin: false, +        is_moderator: false        }      } diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs index c83bb5bc8..141d300c7 100644 --- a/test/web/mastodon_api/mastodon_api_controller_test.exs +++ b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -10,6 +10,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do    alias Pleroma.Web.{OStatus, CommonAPI}    alias Pleroma.Web.ActivityPub.ActivityPub    alias Pleroma.Web.MastodonAPI.FilterView +  alias Ecto.Changeset    import Pleroma.Factory    import ExUnit.CaptureLog    import Tesla.Mock @@ -135,6 +136,20 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert Repo.get(Activity, id)    end +  test "posting a status with OGP link preview", %{conn: conn} do +    user = insert(:user) + +    conn = +      conn +      |> assign(:user, user) +      |> post("/api/v1/statuses", %{ +        "status" => "http://example.com/ogp" +      }) + +    assert %{"id" => id, "card" => %{"title" => "The Rock"}} = json_response(conn, 200) +    assert Repo.get(Activity, id) +  end +    test "posting a direct status", %{conn: conn} do      user1 = insert(:user)      user2 = insert(:user) @@ -147,7 +162,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert %{"id" => id, "visibility" => "direct"} = json_response(conn, 200)      assert activity = Repo.get(Activity, id) -    assert activity.recipients == [user2.ap_id] +    assert activity.recipients == [user2.ap_id, user1.ap_id]      assert activity.data["to"] == [user2.ap_id]      assert activity.data["cc"] == []    end @@ -181,6 +196,16 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert %{"visibility" => "direct"} = status      assert status["url"] != direct.data["id"] +    # User should be able to see his own direct message +    res_conn = +      build_conn() +      |> assign(:user, user_one) +      |> get("api/v1/timelines/direct") + +    [status] = json_response(res_conn, 200) + +    assert %{"visibility" => "direct"} = status +      # Both should be visible here      res_conn =        conn @@ -1033,6 +1058,34 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      end)    end +  test "multi-hashtag timeline", %{conn: conn} do +    user = insert(:user) + +    {:ok, activity_test} = CommonAPI.post(user, %{"status" => "#test"}) +    {:ok, activity_test1} = CommonAPI.post(user, %{"status" => "#test #test1"}) +    {:ok, activity_none} = CommonAPI.post(user, %{"status" => "#test #none"}) + +    any_test = +      conn +      |> get("/api/v1/timelines/tag/test", %{"any" => ["test1"]}) + +    [status_none, status_test1, status_test] = json_response(any_test, 200) + +    assert to_string(activity_test.id) == status_test["id"] +    assert to_string(activity_test1.id) == status_test1["id"] +    assert to_string(activity_none.id) == status_none["id"] + +    restricted_test = +      conn +      |> get("/api/v1/timelines/tag/test", %{"all" => ["test1"], "none" => ["none"]}) + +    assert [status_test1] == json_response(restricted_test, 200) + +    all_test = conn |> get("/api/v1/timelines/tag/test", %{"all" => ["none"]}) + +    assert [status_none] == json_response(all_test, 200) +  end +    test "getting followers", %{conn: conn} do      user = insert(:user)      other_user = insert(:user) @@ -1473,13 +1526,26 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do    end    test "get instance information", %{conn: conn} do -    insert(:user, %{local: true})      user = insert(:user, %{local: true}) + +    user2 = insert(:user, %{local: true}) +    {:ok, _user2} = User.deactivate(user2, !user2.info.deactivated) +      insert(:user, %{local: false, nickname: "u@peer1.com"})      insert(:user, %{local: false, nickname: "u@peer2.com"})      {:ok, _} = TwitterAPI.create_status(user, %{"status" => "cofe"}) +    # Stats should count users with missing or nil `info.deactivated` value +    user = Repo.get(User, user.id) +    info_change = Changeset.change(user.info, %{deactivated: nil}) + +    {:ok, _user} = +      user +      |> Changeset.change() +      |> Changeset.put_embed(:info, info_change) +      |> User.update_and_set_cache() +      Pleroma.Stats.update_stats()      conn = get(conn, "/api/v1/instance") @@ -1489,7 +1555,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      stats = result["stats"]      assert stats -    assert stats["user_count"] == 2 +    assert stats["user_count"] == 1      assert stats["status_count"] == 1      assert stats["domain_count"] == 2    end @@ -1599,5 +1665,83 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do                 |> post("/api/v1/statuses/#{activity_two.id}/pin")                 |> json_response(400)      end + +    test "Status rich-media Card", %{conn: conn, user: user} do +      {:ok, activity} = CommonAPI.post(user, %{"status" => "http://example.com/ogp"}) + +      response = +        conn +        |> get("/api/v1/statuses/#{activity.id}/card") +        |> json_response(200) + +      assert response == %{ +               "image" => "http://ia.media-imdb.com/images/rock.jpg", +               "provider_name" => "www.imdb.com", +               "provider_url" => "http://www.imdb.com", +               "title" => "The Rock", +               "type" => "link", +               "url" => "http://www.imdb.com/title/tt0117500/", +               "description" => nil, +               "pleroma" => %{ +                 "opengraph" => %{ +                   "image" => "http://ia.media-imdb.com/images/rock.jpg", +                   "title" => "The Rock", +                   "type" => "video.movie", +                   "url" => "http://www.imdb.com/title/tt0117500/" +                 } +               } +             } +    end +  end + +  test "bookmarks" do +    user = insert(:user) +    for_user = insert(:user) + +    {:ok, activity1} = +      CommonAPI.post(user, %{ +        "status" => "heweoo?" +      }) + +    {:ok, activity2} = +      CommonAPI.post(user, %{ +        "status" => "heweoo!" +      }) + +    response1 = +      build_conn() +      |> assign(:user, for_user) +      |> post("/api/v1/statuses/#{activity1.id}/bookmark") + +    assert json_response(response1, 200)["bookmarked"] == true + +    response2 = +      build_conn() +      |> assign(:user, for_user) +      |> post("/api/v1/statuses/#{activity2.id}/bookmark") + +    assert json_response(response2, 200)["bookmarked"] == true + +    bookmarks = +      build_conn() +      |> assign(:user, for_user) +      |> get("/api/v1/bookmarks") + +    assert [json_response(response2, 200), json_response(response1, 200)] == +             json_response(bookmarks, 200) + +    response1 = +      build_conn() +      |> assign(:user, for_user) +      |> post("/api/v1/statuses/#{activity1.id}/unbookmark") + +    assert json_response(response1, 200)["bookmarked"] == false + +    bookmarks = +      build_conn() +      |> assign(:user, for_user) +      |> get("/api/v1/bookmarks") + +    assert [json_response(response2, 200)] == json_response(bookmarks, 200)    end  end diff --git a/test/web/mastodon_api/status_view_test.exs b/test/web/mastodon_api/status_view_test.exs index 1076b5002..c6a5783c6 100644 --- a/test/web/mastodon_api/status_view_test.exs +++ b/test/web/mastodon_api/status_view_test.exs @@ -19,6 +19,36 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      :ok    end +  test "returns a temporary ap_id based user for activities missing db users" do +    user = insert(:user) + +    {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"}) + +    Repo.delete(user) +    Cachex.clear(:user_cache) + +    %{account: ms_user} = StatusView.render("status.json", activity: activity) + +    assert ms_user.acct == "erroruser@example.com" +  end + +  test "tries to get a user by nickname if fetching by ap_id doesn't work" do +    user = insert(:user) + +    {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"}) + +    {:ok, user} = +      user +      |> Ecto.Changeset.change(%{ap_id: "#{user.ap_id}/extension/#{user.nickname}"}) +      |> Repo.update() + +    Cachex.clear(:user_cache) + +    result = StatusView.render("status.json", activity: activity) + +    assert result[:account][:id] == to_string(user.id) +  end +    test "a note with null content" do      note = insert(:note_activity) @@ -54,6 +84,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do        account: AccountView.render("account.json", %{user: user}),        in_reply_to_id: nil,        in_reply_to_account_id: nil, +      card: nil,        reblog: nil,        content: HtmlSanitizeEx.basic_html(note.data["object"]["content"]),        created_at: created_at, @@ -61,6 +92,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do        replies_count: 0,        favourites_count: 0,        reblogged: false, +      bookmarked: false,        favourited: false,        muted: false,        pinned: false, @@ -119,7 +151,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      status = StatusView.render("status.json", %{activity: activity}) -    assert status.mentions == [AccountView.render("mention.json", %{user: user})] +    actor = Repo.get_by(User, ap_id: activity.actor) + +    assert status.mentions == +             Enum.map([user, actor], fn u -> AccountView.render("mention.json", %{user: u}) end)    end    test "attachments" do @@ -172,7 +207,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do          "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"        ) -    %Activity{} = activity = Activity.get_create_activity_by_object_ap_id(object.data["id"]) +    %Activity{} = activity = Activity.get_create_by_object_ap_id(object.data["id"])      represented = StatusView.render("status.json", %{for: user, activity: activity}) diff --git a/test/web/metadata/opengraph_test.exs b/test/web/metadata/opengraph_test.exs new file mode 100644 index 000000000..4283f72cd --- /dev/null +++ b/test/web/metadata/opengraph_test.exs @@ -0,0 +1,94 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Metadata.Providers.OpenGraphTest do +  use Pleroma.DataCase +  import Pleroma.Factory +  alias Pleroma.Web.Metadata.Providers.OpenGraph + +  test "it renders all supported types of attachments and skips unknown types" do +    user = insert(:user) + +    note = +      insert(:note, %{ +        data: %{ +          "actor" => user.ap_id, +          "tag" => [], +          "id" => "https://pleroma.gov/objects/whatever", +          "content" => "pleroma in a nutshell", +          "attachment" => [ +            %{ +              "url" => [ +                %{"mediaType" => "image/png", "href" => "https://pleroma.gov/tenshi.png"} +              ] +            }, +            %{ +              "url" => [ +                %{ +                  "mediaType" => "application/octet-stream", +                  "href" => "https://pleroma.gov/fqa/badapple.sfc" +                } +              ] +            }, +            %{ +              "url" => [ +                %{"mediaType" => "video/webm", "href" => "https://pleroma.gov/about/juche.webm"} +              ] +            }, +            %{ +              "url" => [ +                %{ +                  "mediaType" => "audio/basic", +                  "href" => "http://www.gnu.org/music/free-software-song.au" +                } +              ] +            } +          ] +        } +      }) + +    result = OpenGraph.build_tags(%{object: note, url: note.data["id"], user: user}) + +    assert Enum.all?( +             [ +               {:meta, [property: "og:image", content: "https://pleroma.gov/tenshi.png"], []}, +               {:meta, +                [property: "og:audio", content: "http://www.gnu.org/music/free-software-song.au"], +                []}, +               {:meta, [property: "og:video", content: "https://pleroma.gov/about/juche.webm"], +                []} +             ], +             fn element -> element in result end +           ) +  end + +  test "it does not render attachments if post is nsfw" do +    Pleroma.Config.put([Pleroma.Web.Metadata, :unfurl_nsfw], false) +    user = insert(:user, avatar: %{"url" => [%{"href" => "https://pleroma.gov/tenshi.png"}]}) + +    note = +      insert(:note, %{ +        data: %{ +          "actor" => user.ap_id, +          "id" => "https://pleroma.gov/objects/whatever", +          "content" => "#cuteposting #nsfw #hambaga", +          "tag" => ["cuteposting", "nsfw", "hambaga"], +          "sensitive" => true, +          "attachment" => [ +            %{ +              "url" => [ +                %{"mediaType" => "image/png", "href" => "https://misskey.microsoft/corndog.png"} +              ] +            } +          ] +        } +      }) + +    result = OpenGraph.build_tags(%{object: note, url: note.data["id"], user: user}) + +    assert {:meta, [property: "og:image", content: "https://pleroma.gov/tenshi.png"], []} in result + +    refute {:meta, [property: "og:image", content: "https://misskey.microsoft/corndog.png"], []} in result +  end +end diff --git a/test/web/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs index ccd552258..e0d3cb55f 100644 --- a/test/web/oauth/oauth_controller_test.exs +++ b/test/web/oauth/oauth_controller_test.exs @@ -34,6 +34,31 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do      assert Repo.get_by(Authorization, token: code)    end +  test "correctly handles wrong credentials", %{conn: conn} do +    user = insert(:user) +    app = insert(:oauth_app) + +    result = +      conn +      |> post("/oauth/authorize", %{ +        "authorization" => %{ +          "name" => user.nickname, +          "password" => "wrong", +          "client_id" => app.client_id, +          "redirect_uri" => app.redirect_uris, +          "state" => "statepassed" +        } +      }) +      |> html_response(:unauthorized) + +    # Keep the details +    assert result =~ app.client_id +    assert result =~ app.redirect_uris + +    # Error message +    assert result =~ "Invalid" +  end +    test "issues a token for an all-body request" do      user = insert(:user)      app = insert(:oauth_app) diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index 995cc00d6..954abf5fe 100644 --- a/test/web/ostatus/ostatus_controller_test.exs +++ b/test/web/ostatus/ostatus_controller_test.exs @@ -88,6 +88,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do      conn =        conn +      |> put_req_header("accept", "application/xml")        |> get(url)      expected = @@ -114,31 +115,34 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do      |> response(404)    end +  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 "404s on deleted objects", %{conn: conn} do      note_activity = insert(:note_activity)      [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["object"]["id"]))      object = Object.get_by_ap_id(note_activity.data["object"]["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 "gets an activity", %{conn: conn} do -    note_activity = insert(:note_activity) -    [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"])) - -    conn -    |> get("/activities/#{uuid}") -    |> response(200) -  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"])) @@ -154,7 +158,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do      |> response(404)    end -  test "gets a notice", %{conn: conn} do +  test "gets a notice in xml format", %{conn: conn} do      note_activity = insert(:note_activity)      conn diff --git a/test/web/rich_media/controllers/rich_media_controller_test.exs b/test/web/rich_media/controllers/rich_media_controller_test.exs deleted file mode 100644 index 37c82631f..000000000 --- a/test/web/rich_media/controllers/rich_media_controller_test.exs +++ /dev/null @@ -1,54 +0,0 @@ -defmodule Pleroma.Web.RichMedia.RichMediaControllerTest do -  use Pleroma.Web.ConnCase -  import Pleroma.Factory - -  setup do -    Tesla.Mock.mock(fn -      %{ -        method: :get, -        url: "http://example.com/ogp" -      } -> -        %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/ogp.html")} - -      %{method: :get, url: "http://example.com/empty"} -> -        %Tesla.Env{status: 200, body: "hello"} -    end) - -    :ok -  end - -  describe "GET /api/rich_media/parse" do -    setup do -      user = insert(:user) - -      [user: user] -    end - -    test "returns 404 if not metadata found", %{user: user} do -      build_conn() -      |> with_credentials(user.nickname, "test") -      |> get("/api/rich_media/parse", %{"url" => "http://example.com/empty"}) -      |> json_response(404) -    end - -    test "returns OGP metadata", %{user: user} do -      response = -        build_conn() -        |> with_credentials(user.nickname, "test") -        |> get("/api/rich_media/parse", %{"url" => "http://example.com/ogp"}) -        |> json_response(200) - -      assert response == %{ -               "image" => "http://ia.media-imdb.com/images/rock.jpg", -               "title" => "The Rock", -               "type" => "video.movie", -               "url" => "http://www.imdb.com/title/tt0117500/" -             } -    end -  end - -  defp with_credentials(conn, username, password) do -    header_content = "Basic " <> Base.encode64("#{username}:#{password}") -    put_req_header(conn, "authorization", header_content) -  end -end diff --git a/test/web/rich_media/parser_test.exs b/test/web/rich_media/parser_test.exs index e14b5061a..93a58c528 100644 --- a/test/web/rich_media/parser_test.exs +++ b/test/web/rich_media/parser_test.exs @@ -65,28 +65,27 @@ defmodule Pleroma.Web.RichMedia.ParserTest do      assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/oembed") ==               {:ok,                %{ -                "author_name" => "bees", -                "author_url" => "https://www.flickr.com/photos/bees/", -                "cache_age" => 3600, -                "flickr_type" => "photo", -                "height" => "768", -                "html" => +                author_name: "bees", +                author_url: "https://www.flickr.com/photos/bees/", +                cache_age: 3600, +                flickr_type: "photo", +                height: "768", +                html:                    "<a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/bees/2362225867/\" title=\"Bacon Lollys by bees, on Flickr\"><img src=\"https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_b.jpg\" width=\"1024\" height=\"768\" alt=\"Bacon Lollys\"></a><script async src=\"https://embedr.flickr.com/assets/client-code.js\" charset=\"utf-8\"></script>", -                "license" => "All Rights Reserved", -                "license_id" => 0, -                "provider_name" => "Flickr", -                "provider_url" => "https://www.flickr.com/", -                "thumbnail_height" => 150, -                "thumbnail_url" => -                  "https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_q.jpg", -                "thumbnail_width" => 150, -                "title" => "Bacon Lollys", -                "type" => "photo", -                "url" => "https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_b.jpg", -                "version" => "1.0", -                "web_page" => "https://www.flickr.com/photos/bees/2362225867/", -                "web_page_short_url" => "https://flic.kr/p/4AK2sc", -                "width" => "1024" +                license: "All Rights Reserved", +                license_id: 0, +                provider_name: "Flickr", +                provider_url: "https://www.flickr.com/", +                thumbnail_height: 150, +                thumbnail_url: "https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_q.jpg", +                thumbnail_width: 150, +                title: "Bacon Lollys", +                type: "photo", +                url: "https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_b.jpg", +                version: "1.0", +                web_page: "https://www.flickr.com/photos/bees/2362225867/", +                web_page_short_url: "https://flic.kr/p/4AK2sc", +                width: "1024"                }}    end  end diff --git a/test/web/streamer_test.exs b/test/web/streamer_test.exs index 905e29d06..16d7b9c24 100644 --- a/test/web/streamer_test.exs +++ b/test/web/streamer_test.exs @@ -6,7 +6,8 @@ defmodule Pleroma.Web.StreamerTest do    use Pleroma.DataCase    alias Pleroma.Web.Streamer -  alias Pleroma.{List, User} +  alias Pleroma.List +  alias Pleroma.User    alias Pleroma.Web.CommonAPI    import Pleroma.Factory @@ -35,6 +36,28 @@ defmodule Pleroma.Web.StreamerTest do      Streamer.push_to_socket(topics, "public", activity)      Task.await(task) + +    task = +      Task.async(fn -> +        assert_receive {:text, _}, 4_000 +      end) + +    fake_socket = %{ +      transport_pid: task.pid, +      assigns: %{ +        user: user +      } +    } + +    {:ok, activity} = CommonAPI.delete(activity.id, other_user) + +    topics = %{ +      "public" => [fake_socket] +    } + +    Streamer.push_to_socket(topics, "public", activity) + +    Task.await(task)    end    test "it doesn't send to blocked users" do diff --git a/test/web/twitter_api/representers/activity_representer_test.exs b/test/web/twitter_api/representers/activity_representer_test.exs index ef0294140..ea5813733 100644 --- a/test/web/twitter_api/representers/activity_representer_test.exs +++ b/test/web/twitter_api/representers/activity_representer_test.exs @@ -164,6 +164,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do        "possibly_sensitive" => true,        "uri" => activity.data["object"]["id"],        "visibility" => "direct", +      "card" => nil,        "summary" => "2hu :2hu:",        "summary_html" =>          "2hu <img height=\"32px\" width=\"32px\" alt=\"2hu\" title=\"2hu\" src=\"corndog.png\" />" diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs index e08edc525..863abd10f 100644 --- a/test/web/twitter_api/twitter_api_controller_test.exs +++ b/test/web/twitter_api/twitter_api_controller_test.exs @@ -797,7 +797,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/favorites/create/1.json") -      assert json_response(conn, 500) +      assert json_response(conn, 400)      end    end @@ -1621,7 +1621,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        conn =          build_conn()          |> assign(:user, user) -        |> post("/api/pleroma/friendships/approve", %{"user_id" => to_string(other_user.id)}) +        |> post("/api/pleroma/friendships/approve", %{"user_id" => other_user.id})        assert relationship = json_response(conn, 200)        assert other_user.id == relationship["id"] @@ -1644,7 +1644,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        conn =          build_conn()          |> assign(:user, user) -        |> post("/api/pleroma/friendships/deny", %{"user_id" => to_string(other_user.id)}) +        |> post("/api/pleroma/friendships/deny", %{"user_id" => other_user.id})        assert relationship = json_response(conn, 200)        assert other_user.id == relationship["id"] @@ -1655,16 +1655,16 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do    describe "GET /api/pleroma/search_user" do      test "it returns users, ordered by similarity", %{conn: conn} do        user = insert(:user, %{name: "eal"}) -      user_two = insert(:user, %{name: "ean"}) -      user_three = insert(:user, %{name: "ebn"}) +      user_two = insert(:user, %{name: "eal me"}) +      _user_three = insert(:user, %{name: "zzz"})        resp =          conn -        |> get(twitter_api_search__path(conn, :search_user), query: "eal") +        |> get(twitter_api_search__path(conn, :search_user), query: "eal me")          |> json_response(200) -      assert length(resp) == 3 -      assert [user.id, user_two.id, user_three.id] == Enum.map(resp, fn %{"id" => id} -> id end) +      assert length(resp) == 2 +      assert [user_two.id, user.id] == Enum.map(resp, fn %{"id" => id} -> id end)      end    end diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index 547592ff2..f94e2b873 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -451,7 +451,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        assert represented["id"] == UserView.render("show.json", %{user: remote, for: user})["id"]        # Also fetches the feed. -      # assert Activity.get_create_activity_by_object_ap_id("tag:mastodon.social,2017-04-05:objectId=1641750:objectType=Status") +      # assert Activity.get_create_by_object_ap_id("tag:mastodon.social,2017-04-05:objectId=1641750:objectType=Status")      end    end  end diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 73aa70bd5..dc9bad369 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -32,4 +32,71 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert response == "job started"      end    end + +  describe "GET /api/statusnet/config.json" do +    test "it returns the managed config", %{conn: conn} do +      Pleroma.Config.put([:instance, :managed_config], false) + +      response = +        conn +        |> get("/api/statusnet/config.json") +        |> json_response(:ok) + +      refute response["site"]["pleromafe"] + +      Pleroma.Config.put([:instance, :managed_config], true) + +      response = +        conn +        |> get("/api/statusnet/config.json") +        |> json_response(:ok) + +      assert response["site"]["pleromafe"] +    end + +    test "if :pleroma, :fe is false, it returns the new style config settings", %{conn: conn} do +      Pleroma.Config.put([:instance, :managed_config], true) +      Pleroma.Config.put([:fe, :theme], "rei-ayanami-towel") +      Pleroma.Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"}) + +      response = +        conn +        |> get("/api/statusnet/config.json") +        |> json_response(:ok) + +      assert response["site"]["pleromafe"]["theme"] == "rei-ayanami-towel" + +      Pleroma.Config.put([:fe], false) + +      response = +        conn +        |> get("/api/statusnet/config.json") +        |> json_response(:ok) + +      assert response["site"]["pleromafe"]["theme"] == "asuka-hospital" +    end +  end + +  describe "GET /api/pleroma/frontend_configurations" do +    test "returns everything in :pleroma, :frontend_configurations", %{conn: conn} do +      config = [ +        frontend_a: %{ +          x: 1, +          y: 2 +        }, +        frontend_b: %{ +          z: 3 +        } +      ] + +      Pleroma.Config.put(:frontend_configurations, config) + +      response = +        conn +        |> get("/api/pleroma/frontend_configurations") +        |> json_response(:ok) + +      assert response == Jason.encode!(config |> Enum.into(%{})) |> Jason.decode!() +    end +  end  end diff --git a/test/web/twitter_api/views/activity_view_test.exs b/test/web/twitter_api/views/activity_view_test.exs index 3d6b264b1..4f854ecaa 100644 --- a/test/web/twitter_api/views/activity_view_test.exs +++ b/test/web/twitter_api/views/activity_view_test.exs @@ -148,7 +148,8 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do        "text" => "Hey @shp!",        "uri" => activity.data["object"]["id"],        "user" => UserView.render("show.json", %{user: user}), -      "visibility" => "direct" +      "visibility" => "direct", +      "card" => nil      }      assert result == expected @@ -344,7 +345,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do          "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"        ) -    %Activity{} = activity = Activity.get_create_activity_by_object_ap_id(object.data["id"]) +    %Activity{} = activity = Activity.get_create_by_object_ap_id(object.data["id"])      result = ActivityView.render("activity.json", activity: activity) diff --git a/test/web/twitter_api/views/user_view_test.exs b/test/web/twitter_api/views/user_view_test.exs index 5f7481eb6..daf18c1c5 100644 --- a/test/web/twitter_api/views/user_view_test.exs +++ b/test/web/twitter_api/views/user_view_test.exs @@ -100,6 +100,7 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "locked" => false,        "default_scope" => "public",        "no_rich_text" => false, +      "hide_network" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false, @@ -146,6 +147,7 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "locked" => false,        "default_scope" => "public",        "no_rich_text" => false, +      "hide_network" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false, @@ -193,6 +195,7 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "locked" => false,        "default_scope" => "public",        "no_rich_text" => false, +      "hide_network" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false, @@ -254,6 +257,7 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "locked" => false,        "default_scope" => "public",        "no_rich_text" => false, +      "hide_network" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false, | 
