diff options
| author | lain <lain@soykaf.club> | 2019-05-01 18:40:41 +0200 | 
|---|---|---|
| committer | lain <lain@soykaf.club> | 2019-05-01 18:40:41 +0200 | 
| commit | 45f790becc2cc63ac000c6432fe8c84e0b589822 (patch) | |
| tree | 724d0e8ce5f10807cc25efc2434454bf38c5a52c /test/web/twitter_api | |
| parent | 4908e0eeee2ecb58b204198c20720d52548b6f4a (diff) | |
| parent | d107919b3d8b2275ddb7b17846cab182682098a7 (diff) | |
| download | pleroma-45f790becc2cc63ac000c6432fe8c84e0b589822.tar.gz pleroma-45f790becc2cc63ac000c6432fe8c84e0b589822.zip | |
Merge remote-tracking branch 'origin/develop' into conversations_three
Diffstat (limited to 'test/web/twitter_api')
| -rw-r--r-- | test/web/twitter_api/twitter_api_controller_test.exs | 63 | ||||
| -rw-r--r-- | test/web/twitter_api/twitter_api_test.exs | 401 | ||||
| -rw-r--r-- | test/web/twitter_api/util_controller_test.exs | 63 | ||||
| -rw-r--r-- | test/web/twitter_api/views/activity_view_test.exs | 35 | ||||
| -rw-r--r-- | test/web/twitter_api/views/user_view_test.exs | 51 | 
5 files changed, 466 insertions, 147 deletions
| diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs index 72b7ea85e..43ad71a16 100644 --- a/test/web/twitter_api/twitter_api_controller_test.exs +++ b/test/web/twitter_api/twitter_api_controller_test.exs @@ -22,8 +22,9 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do    alias Pleroma.Web.TwitterAPI.TwitterAPI    alias Pleroma.Web.TwitterAPI.UserView -  import Pleroma.Factory    import Mock +  import Pleroma.Factory +  import Swoosh.TestAssertions    @banner "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7" @@ -269,7 +270,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do      test "returns one status", %{conn: conn} do        user = insert(:user)        {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey!"}) -      actor = Repo.get_by!(User, ap_id: activity.data["actor"]) +      actor = User.get_cached_by_ap_id(activity.data["actor"])        conn =          conn @@ -719,7 +720,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/friendships/create.json", %{user_id: followed.id}) -      current_user = User.get_by_id(current_user.id) +      current_user = User.get_cached_by_id(current_user.id)        assert User.ap_followers(followed) in current_user.following        assert json_response(conn, 200) == @@ -734,8 +735,8 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/friendships/create.json", %{user_id: followed.id}) -      current_user = User.get_by_id(current_user.id) -      followed = User.get_by_id(followed.id) +      current_user = User.get_cached_by_id(current_user.id) +      followed = User.get_cached_by_id(followed.id)        refute User.ap_followers(followed) in current_user.following @@ -764,7 +765,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/friendships/destroy.json", %{user_id: followed.id}) -      current_user = User.get_by_id(current_user.id) +      current_user = User.get_cached_by_id(current_user.id)        assert current_user.following == [current_user.ap_id]        assert json_response(conn, 200) == @@ -788,7 +789,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/blocks/create.json", %{user_id: blocked.id}) -      current_user = User.get_by_id(current_user.id) +      current_user = User.get_cached_by_id(current_user.id)        assert User.blocks?(current_user, blocked)        assert json_response(conn, 200) == @@ -815,7 +816,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/blocks/destroy.json", %{user_id: blocked.id}) -      current_user = User.get_by_id(current_user.id) +      current_user = User.get_cached_by_id(current_user.id)        assert current_user.info.blocks == []        assert json_response(conn, 200) == @@ -846,7 +847,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> with_credentials(current_user.nickname, "test")          |> post("/api/qvitter/update_avatar.json", %{img: avatar_image}) -      current_user = User.get_by_id(current_user.id) +      current_user = User.get_cached_by_id(current_user.id)        assert is_map(current_user.avatar)        assert json_response(conn, 200) == @@ -955,7 +956,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> post(request_path)        activity = Activity.get_by_id(note_activity.id) -      activity_user = User.get_by_ap_id(note_activity.data["actor"]) +      activity_user = User.get_cached_by_ap_id(note_activity.data["actor"])        assert json_response(response, 200) ==                 ActivityView.render("activity.json", %{ @@ -993,7 +994,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          |> post(request_path)        activity = Activity.get_by_id(note_activity.id) -      activity_user = User.get_by_ap_id(note_activity.data["actor"]) +      activity_user = User.get_cached_by_ap_id(note_activity.data["actor"])        assert json_response(response, 200) ==                 ActivityView.render("activity.json", %{ @@ -1021,7 +1022,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        user = json_response(conn, 200) -      fetched_user = User.get_by_nickname("lain") +      fetched_user = User.get_cached_by_nickname("lain")        assert user == UserView.render("show.json", %{user: fetched_user})      end @@ -1063,8 +1064,14 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do      test "it sends an email to user", %{user: user} do        token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id) -      Swoosh.TestAssertions.assert_email_sent( -        Pleroma.UserEmail.password_reset_email(user, token_record.token) +      email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token) +      notify_email = Pleroma.Config.get([:instance, :notify_email]) +      instance_name = Pleroma.Config.get([:instance, :name]) + +      assert_email_sent( +        from: {instance_name, notify_email}, +        to: {user.name, user.email}, +        html_body: email.html_body        )      end    end @@ -1109,7 +1116,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do      test "it confirms the user account", %{conn: conn, user: user} do        get(conn, "/api/account/confirm_email/#{user.id}/#{user.info.confirmation_token}") -      user = User.get_by_id(user.id) +      user = User.get_cached_by_id(user.id)        refute user.info.confirmation_pending        refute user.info.confirmation_token @@ -1163,7 +1170,15 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        |> assign(:user, user)        |> post("/api/account/resend_confirmation_email?email=#{user.email}") -      Swoosh.TestAssertions.assert_email_sent(Pleroma.UserEmail.account_confirmation_email(user)) +      email = Pleroma.Emails.UserEmail.account_confirmation_email(user) +      notify_email = Pleroma.Config.get([:instance, :notify_email]) +      instance_name = Pleroma.Config.get([:instance, :name]) + +      assert_email_sent( +        from: {instance_name, notify_email}, +        to: {user.name, user.email}, +        html_body: email.html_body +      )      end    end @@ -1727,7 +1742,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do          })        assert json_response(conn, 200) == %{"status" => "success"} -      fetched_user = User.get_by_id(current_user.id) +      fetched_user = User.get_cached_by_id(current_user.id)        assert Pbkdf2.checkpw("newpass", fetched_user.password_hash) == true      end    end @@ -1768,8 +1783,8 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        {:ok, _activity} = ActivityPub.follow(other_user, user) -      user = User.get_by_id(user.id) -      other_user = User.get_by_id(other_user.id) +      user = User.get_cached_by_id(user.id) +      other_user = User.get_cached_by_id(other_user.id)        assert User.following?(other_user, user) == false @@ -1808,8 +1823,8 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        {:ok, _activity} = ActivityPub.follow(other_user, user) -      user = User.get_by_id(user.id) -      other_user = User.get_by_id(other_user.id) +      user = User.get_cached_by_id(user.id) +      other_user = User.get_cached_by_id(other_user.id)        assert User.following?(other_user, user) == false @@ -1831,8 +1846,8 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do        {:ok, _activity} = ActivityPub.follow(other_user, user) -      user = User.get_by_id(user.id) -      other_user = User.get_by_id(other_user.id) +      user = User.get_cached_by_id(user.id) +      other_user = User.get_cached_by_id(other_user.id)        assert User.following?(other_user, user) == false @@ -1901,7 +1916,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do    describe "POST /api/media/metadata/create" do      setup do        object = insert(:note) -      user = User.get_by_ap_id(object.data["actor"]) +      user = User.get_cached_by_ap_id(object.data["actor"])        %{object: object, user: user}      end diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index 6c00244de..d601c8f1f 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -16,6 +16,11 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    import Pleroma.Factory +  setup_all do +    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) +    :ok +  end +    test "create a status" do      user = insert(:user)      mentioned_user = insert(:user, %{nickname: "shp", ap_id: "shp"}) @@ -36,18 +41,19 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      input = %{        "status" => -        "Hello again, @shp.<script></script>\nThis is on another :moominmamma: line. #2hu #epic #phantasmagoric", +        "Hello again, @shp.<script></script>\nThis is on another :firefox: line. #2hu #epic #phantasmagoric",        "media_ids" => [object.id]      }      {:ok, activity = %Activity{}} = TwitterAPI.create_status(user, input) +    object = Object.normalize(activity.data["object"])      expected_text = -      "Hello again, <span class='h-card'><a data-user='#{mentioned_user.id}' class='u-url mention' href='shp'>@<span>shp</span></a></span>.<script></script><br>This is on another :moominmamma: line. <a class='hashtag' data-tag='2hu' href='http://localhost:4001/tag/2hu' rel='tag'>#2hu</a> <a class='hashtag' data-tag='epic' href='http://localhost:4001/tag/epic' rel='tag'>#epic</a> <a class='hashtag' data-tag='phantasmagoric' href='http://localhost:4001/tag/phantasmagoric' rel='tag'>#phantasmagoric</a><br><a href=\"http://example.org/image.jpg\" class='attachment'>image.jpg</a>" +      "Hello again, <span class='h-card'><a data-user='#{mentioned_user.id}' class='u-url mention' href='shp'>@<span>shp</span></a></span>.<script></script><br>This is on another :firefox: line. <a class='hashtag' data-tag='2hu' href='http://localhost:4001/tag/2hu' rel='tag'>#2hu</a> <a class='hashtag' data-tag='epic' href='http://localhost:4001/tag/epic' rel='tag'>#epic</a> <a class='hashtag' data-tag='phantasmagoric' href='http://localhost:4001/tag/phantasmagoric' rel='tag'>#phantasmagoric</a><br><a href=\"http://example.org/image.jpg\" class='attachment'>image.jpg</a>" -    assert get_in(activity.data, ["object", "content"]) == expected_text -    assert get_in(activity.data, ["object", "type"]) == "Note" -    assert get_in(activity.data, ["object", "actor"]) == user.ap_id +    assert get_in(object.data, ["content"]) == expected_text +    assert get_in(object.data, ["type"]) == "Note" +    assert get_in(object.data, ["actor"]) == user.ap_id      assert get_in(activity.data, ["actor"]) == user.ap_id      assert Enum.member?(get_in(activity.data, ["cc"]), User.ap_followers(user)) @@ -59,21 +65,20 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      assert Enum.member?(get_in(activity.data, ["to"]), "shp")      assert activity.local == true -    assert %{"moominmamma" => "http://localhost:4001/finmoji/128px/moominmamma-128.png"} = -             activity.data["object"]["emoji"] +    assert %{"firefox" => "http://localhost:4001/emoji/Firefox.gif"} = object.data["emoji"]      # hashtags -    assert activity.data["object"]["tag"] == ["2hu", "epic", "phantasmagoric"] +    assert object.data["tag"] == ["2hu", "epic", "phantasmagoric"]      # Add a context      assert is_binary(get_in(activity.data, ["context"])) -    assert is_binary(get_in(activity.data, ["object", "context"])) +    assert is_binary(get_in(object.data, ["context"])) -    assert is_list(activity.data["object"]["attachment"]) +    assert is_list(object.data["attachment"]) -    assert activity.data["object"] == Object.get_by_ap_id(activity.data["object"]["id"]).data +    assert activity.data["object"] == object.data["id"] -    user = User.get_by_ap_id(user.ap_id) +    user = User.get_cached_by_ap_id(user.ap_id)      assert user.info.note_count == 1    end @@ -86,6 +91,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      }      {:ok, activity = %Activity{}} = TwitterAPI.create_status(user, input) +    object = Object.normalize(activity.data["object"])      input = %{        "status" => "Here's your (you).", @@ -93,14 +99,14 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      }      {:ok, reply = %Activity{}} = TwitterAPI.create_status(user, input) +    reply_object = Object.normalize(reply.data["object"])      assert get_in(reply.data, ["context"]) == get_in(activity.data, ["context"]) -    assert get_in(reply.data, ["object", "context"]) == -             get_in(activity.data, ["object", "context"]) +    assert get_in(reply_object.data, ["context"]) == get_in(object.data, ["context"]) -    assert get_in(reply.data, ["object", "inReplyTo"]) == get_in(activity.data, ["object", "id"]) -    assert get_in(reply.data, ["object", "inReplyToStatusId"]) == activity.id +    assert get_in(reply_object.data, ["inReplyTo"]) == get_in(activity.data, ["object"]) +    assert Activity.get_in_reply_to_activity(reply).id == activity.id    end    test "Follow another user using user_id" do @@ -123,7 +129,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      assert User.ap_followers(followed) in user.following -    followed = User.get_by_ap_id(followed.ap_id) +    followed = User.get_cached_by_ap_id(followed.ap_id)      assert followed.info.follower_count == 1      {:error, msg} = TwitterAPI.follow(user, %{"screen_name" => followed.nickname}) @@ -275,7 +281,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      {:ok, user} = TwitterAPI.register_user(data) -    fetched_user = User.get_by_nickname("lain") +    fetched_user = User.get_cached_by_nickname("lain")      assert UserView.render("show.json", %{user: user}) ==               UserView.render("show.json", %{user: fetched_user}) @@ -293,13 +299,12 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      {:ok, user} = TwitterAPI.register_user(data) -    fetched_user = User.get_by_nickname("lain") +    fetched_user = User.get_cached_by_nickname("lain")      assert UserView.render("show.json", %{user: user}) ==               UserView.render("show.json", %{user: fetched_user})    end -  @moduletag skip: "needs 'account_activation_required: true' in config"    test "it sends confirmation email if :account_activation_required is specified in instance config" do      setting = Pleroma.Config.get([:instance, :account_activation_required]) @@ -321,7 +326,16 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      assert user.info.confirmation_pending -    Swoosh.TestAssertions.assert_email_sent(Pleroma.UserEmail.account_confirmation_email(user)) +    email = Pleroma.Emails.UserEmail.account_confirmation_email(user) + +    notify_email = Pleroma.Config.get([:instance, :notify_email]) +    instance_name = Pleroma.Config.get([:instance, :name]) + +    Swoosh.TestAssertions.assert_email_sent( +      from: {instance_name, notify_email}, +      to: {user.name, user.email}, +      html_body: email.html_body +    )    end    test "it registers a new user and parses mentions in the bio" do @@ -353,68 +367,313 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      assert user2.bio == expected_text    end -  @moduletag skip: "needs 'registrations_open: false' in config" -  test "it registers a new user via invite token and returns the user." do -    {:ok, token} = UserInviteToken.create_token() +  describe "register with one time token" do +    setup do +      setting = Pleroma.Config.get([:instance, :registrations_open]) -    data = %{ -      "nickname" => "vinny", -      "email" => "pasta@pizza.vs", -      "fullname" => "Vinny Vinesauce", -      "bio" => "streamer", -      "password" => "hiptofbees", -      "confirm" => "hiptofbees", -      "token" => token.token -    } +      if setting do +        Pleroma.Config.put([:instance, :registrations_open], false) +        on_exit(fn -> Pleroma.Config.put([:instance, :registrations_open], setting) end) +      end -    {:ok, user} = TwitterAPI.register_user(data) +      :ok +    end -    fetched_user = User.get_by_nickname("vinny") -    token = Repo.get_by(UserInviteToken, token: token.token) +    test "returns user on success" do +      {:ok, invite} = UserInviteToken.create_invite() -    assert token.used == true +      data = %{ +        "nickname" => "vinny", +        "email" => "pasta@pizza.vs", +        "fullname" => "Vinny Vinesauce", +        "bio" => "streamer", +        "password" => "hiptofbees", +        "confirm" => "hiptofbees", +        "token" => invite.token +      } -    assert UserView.render("show.json", %{user: user}) == -             UserView.render("show.json", %{user: fetched_user}) +      {:ok, user} = TwitterAPI.register_user(data) + +      fetched_user = User.get_cached_by_nickname("vinny") +      invite = Repo.get_by(UserInviteToken, token: invite.token) + +      assert invite.used == true + +      assert UserView.render("show.json", %{user: user}) == +               UserView.render("show.json", %{user: fetched_user}) +    end + +    test "returns error on invalid token" do +      data = %{ +        "nickname" => "GrimReaper", +        "email" => "death@reapers.afterlife", +        "fullname" => "Reaper Grim", +        "bio" => "Your time has come", +        "password" => "scythe", +        "confirm" => "scythe", +        "token" => "DudeLetMeInImAFairy" +      } + +      {:error, msg} = TwitterAPI.register_user(data) + +      assert msg == "Invalid token" +      refute User.get_cached_by_nickname("GrimReaper") +    end + +    test "returns error on expired token" do +      {:ok, invite} = UserInviteToken.create_invite() +      UserInviteToken.update_invite!(invite, used: true) + +      data = %{ +        "nickname" => "GrimReaper", +        "email" => "death@reapers.afterlife", +        "fullname" => "Reaper Grim", +        "bio" => "Your time has come", +        "password" => "scythe", +        "confirm" => "scythe", +        "token" => invite.token +      } + +      {:error, msg} = TwitterAPI.register_user(data) + +      assert msg == "Expired token" +      refute User.get_cached_by_nickname("GrimReaper") +    end    end -  @moduletag skip: "needs 'registrations_open: false' in config" -  test "it returns an error if invalid token submitted" do -    data = %{ -      "nickname" => "GrimReaper", -      "email" => "death@reapers.afterlife", -      "fullname" => "Reaper Grim", -      "bio" => "Your time has come", -      "password" => "scythe", -      "confirm" => "scythe", -      "token" => "DudeLetMeInImAFairy" -    } +  describe "registers with date limited token" do +    setup do +      setting = Pleroma.Config.get([:instance, :registrations_open]) + +      if setting do +        Pleroma.Config.put([:instance, :registrations_open], false) +        on_exit(fn -> Pleroma.Config.put([:instance, :registrations_open], setting) end) +      end + +      data = %{ +        "nickname" => "vinny", +        "email" => "pasta@pizza.vs", +        "fullname" => "Vinny Vinesauce", +        "bio" => "streamer", +        "password" => "hiptofbees", +        "confirm" => "hiptofbees" +      } + +      check_fn = fn invite -> +        data = Map.put(data, "token", invite.token) +        {:ok, user} = TwitterAPI.register_user(data) +        fetched_user = User.get_cached_by_nickname("vinny") + +        assert UserView.render("show.json", %{user: user}) == +                 UserView.render("show.json", %{user: fetched_user}) +      end + +      {:ok, data: data, check_fn: check_fn} +    end + +    test "returns user on success", %{check_fn: check_fn} do +      {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today()}) + +      check_fn.(invite) + +      invite = Repo.get_by(UserInviteToken, token: invite.token) + +      refute invite.used +    end + +    test "returns user on token which expired tomorrow", %{check_fn: check_fn} do +      {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), 1)}) + +      check_fn.(invite) + +      invite = Repo.get_by(UserInviteToken, token: invite.token) + +      refute invite.used +    end + +    test "returns an error on overdue date", %{data: data} do +      {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), -1)}) + +      data = Map.put(data, "token", invite.token) + +      {:error, msg} = TwitterAPI.register_user(data) -    {:error, msg} = TwitterAPI.register_user(data) +      assert msg == "Expired token" +      refute User.get_cached_by_nickname("vinny") +      invite = Repo.get_by(UserInviteToken, token: invite.token) -    assert msg == "Invalid token" -    refute User.get_by_nickname("GrimReaper") +      refute invite.used +    end    end -  @moduletag skip: "needs 'registrations_open: false' in config" -  test "it returns an error if expired token submitted" do -    {:ok, token} = UserInviteToken.create_token() -    UserInviteToken.mark_as_used(token.token) +  describe "registers with reusable token" do +    setup do +      setting = Pleroma.Config.get([:instance, :registrations_open]) -    data = %{ -      "nickname" => "GrimReaper", -      "email" => "death@reapers.afterlife", -      "fullname" => "Reaper Grim", -      "bio" => "Your time has come", -      "password" => "scythe", -      "confirm" => "scythe", -      "token" => token.token -    } +      if setting do +        Pleroma.Config.put([:instance, :registrations_open], false) +        on_exit(fn -> Pleroma.Config.put([:instance, :registrations_open], setting) end) +      end + +      :ok +    end + +    test "returns user on success, after him registration fails" do +      {:ok, invite} = UserInviteToken.create_invite(%{max_use: 100}) + +      UserInviteToken.update_invite!(invite, uses: 99) + +      data = %{ +        "nickname" => "vinny", +        "email" => "pasta@pizza.vs", +        "fullname" => "Vinny Vinesauce", +        "bio" => "streamer", +        "password" => "hiptofbees", +        "confirm" => "hiptofbees", +        "token" => invite.token +      } + +      {:ok, user} = TwitterAPI.register_user(data) +      fetched_user = User.get_cached_by_nickname("vinny") +      invite = Repo.get_by(UserInviteToken, token: invite.token) + +      assert invite.used == true -    {:error, msg} = TwitterAPI.register_user(data) +      assert UserView.render("show.json", %{user: user}) == +               UserView.render("show.json", %{user: fetched_user}) + +      data = %{ +        "nickname" => "GrimReaper", +        "email" => "death@reapers.afterlife", +        "fullname" => "Reaper Grim", +        "bio" => "Your time has come", +        "password" => "scythe", +        "confirm" => "scythe", +        "token" => invite.token +      } + +      {:error, msg} = TwitterAPI.register_user(data) + +      assert msg == "Expired token" +      refute User.get_cached_by_nickname("GrimReaper") +    end +  end + +  describe "registers with reusable date limited token" do +    setup do +      setting = Pleroma.Config.get([:instance, :registrations_open]) + +      if setting do +        Pleroma.Config.put([:instance, :registrations_open], false) +        on_exit(fn -> Pleroma.Config.put([:instance, :registrations_open], setting) end) +      end + +      :ok +    end -    assert msg == "Expired token" -    refute User.get_by_nickname("GrimReaper") +    test "returns user on success" do +      {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 100}) + +      data = %{ +        "nickname" => "vinny", +        "email" => "pasta@pizza.vs", +        "fullname" => "Vinny Vinesauce", +        "bio" => "streamer", +        "password" => "hiptofbees", +        "confirm" => "hiptofbees", +        "token" => invite.token +      } + +      {:ok, user} = TwitterAPI.register_user(data) +      fetched_user = User.get_cached_by_nickname("vinny") +      invite = Repo.get_by(UserInviteToken, token: invite.token) + +      refute invite.used + +      assert UserView.render("show.json", %{user: user}) == +               UserView.render("show.json", %{user: fetched_user}) +    end + +    test "error after max uses" do +      {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 100}) + +      UserInviteToken.update_invite!(invite, uses: 99) + +      data = %{ +        "nickname" => "vinny", +        "email" => "pasta@pizza.vs", +        "fullname" => "Vinny Vinesauce", +        "bio" => "streamer", +        "password" => "hiptofbees", +        "confirm" => "hiptofbees", +        "token" => invite.token +      } + +      {:ok, user} = TwitterAPI.register_user(data) +      fetched_user = User.get_cached_by_nickname("vinny") +      invite = Repo.get_by(UserInviteToken, token: invite.token) +      assert invite.used == true + +      assert UserView.render("show.json", %{user: user}) == +               UserView.render("show.json", %{user: fetched_user}) + +      data = %{ +        "nickname" => "GrimReaper", +        "email" => "death@reapers.afterlife", +        "fullname" => "Reaper Grim", +        "bio" => "Your time has come", +        "password" => "scythe", +        "confirm" => "scythe", +        "token" => invite.token +      } + +      {:error, msg} = TwitterAPI.register_user(data) + +      assert msg == "Expired token" +      refute User.get_cached_by_nickname("GrimReaper") +    end + +    test "returns error on overdue date" do +      {:ok, invite} = +        UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), -1), max_use: 100}) + +      data = %{ +        "nickname" => "GrimReaper", +        "email" => "death@reapers.afterlife", +        "fullname" => "Reaper Grim", +        "bio" => "Your time has come", +        "password" => "scythe", +        "confirm" => "scythe", +        "token" => invite.token +      } + +      {:error, msg} = TwitterAPI.register_user(data) + +      assert msg == "Expired token" +      refute User.get_cached_by_nickname("GrimReaper") +    end + +    test "returns error on with overdue date and after max" do +      {:ok, invite} = +        UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), -1), max_use: 100}) + +      UserInviteToken.update_invite!(invite, uses: 100) + +      data = %{ +        "nickname" => "GrimReaper", +        "email" => "death@reapers.afterlife", +        "fullname" => "Reaper Grim", +        "bio" => "Your time has come", +        "password" => "scythe", +        "confirm" => "scythe", +        "token" => invite.token +      } + +      {:error, msg} = TwitterAPI.register_user(data) + +      assert msg == "Expired token" +      refute User.get_cached_by_nickname("GrimReaper") +    end    end    test "it returns the error on registration problems" do @@ -429,7 +688,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      {:error, error_object} = TwitterAPI.register_user(data)      assert is_binary(error_object[:error]) -    refute User.get_by_nickname("lain") +    refute User.get_cached_by_nickname("lain")    end    test "it assigns an integer conversation_id" do @@ -450,7 +709,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        id = "https://mastodon.social/users/lambadalambda"        user = insert(:user)        {:ok, represented} = TwitterAPI.get_external_profile(user, id) -      remote = User.get_by_ap_id(id) +      remote = User.get_cached_by_ap_id(id)        assert represented["id"] == UserView.render("show.json", %{user: remote, for: user})["id"] diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 410f20f87..56474447b 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -3,6 +3,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    alias Pleroma.Notification    alias Pleroma.Repo +  alias Pleroma.User    alias Pleroma.Web.CommonAPI    import Pleroma.Factory @@ -25,6 +26,21 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert response == "job started"      end +    test "it imports new-style mastodon follow lists", %{conn: conn} do +      user1 = insert(:user) +      user2 = insert(:user) + +      response = +        conn +        |> assign(:user, user1) +        |> post("/api/pleroma/follow_import", %{ +          "list" => "Account address,Show boosts\n#{user2.ap_id},true" +        }) +        |> json_response(:ok) + +      assert response == "job started" +    end +      test "requires 'follow' permission", %{conn: conn} do        token1 = insert(:oauth_token, scopes: ["read", "write"])        token2 = insert(:oauth_token, scopes: ["follow"]) @@ -79,6 +95,26 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end    end +  describe "PUT /api/pleroma/notification_settings" do +    test "it updates notification settings", %{conn: conn} do +      user = insert(:user) + +      conn +      |> assign(:user, user) +      |> put("/api/pleroma/notification_settings", %{ +        "remote" => false, +        "followers" => false, +        "bar" => 1 +      }) +      |> json_response(:ok) + +      user = Repo.get(User, user.id) + +      assert %{"remote" => false, "local" => true, "followers" => false, "follows" => true} == +               user.info.notification_settings +    end +  end +    describe "GET /api/statusnet/config.json" do      test "returns the state of safe_dm_mentions flag", %{conn: conn} do        option = Pleroma.Config.get([:instance, :safe_dm_mentions]) @@ -172,22 +208,19 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    describe "/api/pleroma/emoji" do      test "returns json with custom emoji with tags", %{conn: conn} do -      [emoji | _body] = +      emoji =          conn          |> get("/api/pleroma/emoji")          |> json_response(200) -      [key] = Map.keys(emoji) - -      %{ -        ^key => %{ -          "image_url" => url, -          "tags" => tags -        } -      } = emoji - -      assert is_binary(url) -      assert is_list(tags) +      assert Enum.all?(emoji, fn +               {_key, +                %{ +                  "image_url" => url, +                  "tags" => tags +                }} -> +                 is_binary(url) and is_list(tags) +             end)      end    end @@ -212,4 +245,10 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert html_response(response, 200) =~ "Log in to follow"      end    end + +  test "GET /api/pleroma/healthcheck", %{conn: conn} do +    conn = get(conn, "/api/pleroma/healthcheck") + +    assert conn.status in [200, 503] +  end  end diff --git a/test/web/twitter_api/views/activity_view_test.exs b/test/web/twitter_api/views/activity_view_test.exs index ee9a0c834..85815ba7e 100644 --- a/test/web/twitter_api/views/activity_view_test.exs +++ b/test/web/twitter_api/views/activity_view_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do    use Pleroma.DataCase    alias Pleroma.Activity +  alias Pleroma.Object    alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub @@ -90,16 +91,16 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do    test "a create activity with a summary containing emoji" do      {:ok, activity} =        CommonAPI.post(insert(:user), %{ -        "spoiler_text" => ":woollysocks: meow", +        "spoiler_text" => ":firefox: meow",          "status" => "."        })      result = ActivityView.render("activity.json", activity: activity) -    expected = ":woollysocks: meow" +    expected = ":firefox: meow"      expected_html = -      "<img height=\"32px\" width=\"32px\" alt=\"woollysocks\" title=\"woollysocks\" src=\"http://localhost:4001/finmoji/128px/woollysocks-128.png\" /> meow" +      "<img height=\"32px\" width=\"32px\" alt=\"firefox\" title=\"firefox\" src=\"http://localhost:4001/emoji/Firefox.gif\" /> meow"      assert result["summary"] == expected      assert result["summary_html"] == expected_html @@ -125,10 +126,11 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do      other_user = insert(:user, %{nickname: "shp"})      {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"}) +    object = Object.normalize(activity.data["object"])      result = ActivityView.render("activity.json", activity: activity) -    convo_id = Utils.context_to_conversation_id(activity.data["object"]["context"]) +    convo_id = Utils.context_to_conversation_id(object.data["context"])      expected = %{        "activity_type" => "post", @@ -136,8 +138,8 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do        "attentions" => [          UserView.render("show.json", %{user: other_user})        ], -      "created_at" => activity.data["object"]["published"] |> Utils.date_to_asctime(), -      "external_url" => activity.data["object"]["id"], +      "created_at" => object.data["published"] |> Utils.date_to_asctime(), +      "external_url" => object.data["id"],        "fave_num" => 0,        "favorited" => false,        "id" => activity.id, @@ -161,7 +163,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do          }\">@<span>shp</span></a></span>!",        "tags" => [],        "text" => "Hey @shp!", -      "uri" => activity.data["object"]["id"], +      "uri" => object.data["id"],        "user" => UserView.render("show.json", %{user: user}),        "visibility" => "direct",        "card" => nil, @@ -175,8 +177,9 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do      user = insert(:user)      other_user = insert(:user, %{nickname: "shp"})      {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!"}) +    object = Object.normalize(activity.data["object"]) -    convo_id = Utils.context_to_conversation_id(activity.data["object"]["context"]) +    convo_id = Utils.context_to_conversation_id(object.data["context"])      mocks = [        { @@ -277,9 +280,9 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do      other_user = insert(:user, %{nickname: "shp"})      {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!"}) -    {:ok, announce, _object} = CommonAPI.repeat(activity.id, other_user) +    {:ok, announce, object} = CommonAPI.repeat(activity.id, other_user) -    convo_id = Utils.context_to_conversation_id(activity.data["object"]["context"]) +    convo_id = Utils.context_to_conversation_id(object.data["context"])      activity = Activity.get_by_id(activity.id) @@ -357,7 +360,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do    test "a peertube video" do      {:ok, object} = -      ActivityPub.fetch_object_from_id( +      Pleroma.Object.Fetcher.fetch_object_from_id(          "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"        ) @@ -368,4 +371,14 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do      assert length(result["attachments"]) == 1      assert result["summary"] == "Friday Night"    end + +  test "special characters are not escaped in text field for status created" do +    text = "<3 is on the way" + +    {:ok, activity} = CommonAPI.post(insert(:user), %{"status" => text}) + +    result = ActivityView.render("activity.json", activity: activity) + +    assert result["text"] == text +  end  end diff --git a/test/web/twitter_api/views/user_view_test.exs b/test/web/twitter_api/views/user_view_test.exs index 0feaf4b64..c99dbddeb 100644 --- a/test/web/twitter_api/views/user_view_test.exs +++ b/test/web/twitter_api/views/user_view_test.exs @@ -89,29 +89,34 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "following" => false,        "follows_you" => false,        "statusnet_blocking" => false, -      "rights" => %{ -        "delete_others_notice" => false, -        "admin" => false -      },        "statusnet_profile_url" => user.ap_id,        "cover_photo" => banner,        "background_image" => nil,        "is_local" => true,        "locked" => false, -      "default_scope" => "public", -      "no_rich_text" => false,        "hide_follows" => false,        "hide_followers" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false,          "tags" => [] -      } +      }, +      "rights" => %{"admin" => false, "delete_others_notice" => false}, +      "role" => "member"      }      assert represented == UserView.render("show.json", %{user: user})    end +  test "User exposes settings for themselves and only for themselves", %{user: user} do +    as_user = UserView.render("show.json", %{user: user, for: user}) +    assert as_user["default_scope"] == user.info.default_scope +    assert as_user["no_rich_text"] == user.info.no_rich_text +    as_stranger = UserView.render("show.json", %{user: user}) +    refute as_stranger["default_scope"] +    refute as_stranger["no_rich_text"] +  end +    test "A user for a given other follower", %{user: user} do      follower = insert(:user, %{following: [User.ap_followers(user)]})      {:ok, user} = User.update_follower_count(user) @@ -137,24 +142,20 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "following" => true,        "follows_you" => false,        "statusnet_blocking" => false, -      "rights" => %{ -        "delete_others_notice" => false, -        "admin" => false -      },        "statusnet_profile_url" => user.ap_id,        "cover_photo" => banner,        "background_image" => nil,        "is_local" => true,        "locked" => false, -      "default_scope" => "public", -      "no_rich_text" => false,        "hide_follows" => false,        "hide_followers" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false,          "tags" => [] -      } +      }, +      "rights" => %{"admin" => false, "delete_others_notice" => false}, +      "role" => "member"      }      assert represented == UserView.render("show.json", %{user: user, for: follower}) @@ -186,24 +187,20 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "following" => false,        "follows_you" => true,        "statusnet_blocking" => false, -      "rights" => %{ -        "delete_others_notice" => false, -        "admin" => false -      },        "statusnet_profile_url" => follower.ap_id,        "cover_photo" => banner,        "background_image" => nil,        "is_local" => true,        "locked" => false, -      "default_scope" => "public", -      "no_rich_text" => false,        "hide_follows" => false,        "hide_followers" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false,          "tags" => [] -      } +      }, +      "rights" => %{"admin" => false, "delete_others_notice" => false}, +      "role" => "member"      }      assert represented == UserView.render("show.json", %{user: follower, for: user}) @@ -272,27 +269,23 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do        "following" => false,        "follows_you" => false,        "statusnet_blocking" => true, -      "rights" => %{ -        "delete_others_notice" => false, -        "admin" => false -      },        "statusnet_profile_url" => user.ap_id,        "cover_photo" => banner,        "background_image" => nil,        "is_local" => true,        "locked" => false, -      "default_scope" => "public", -      "no_rich_text" => false,        "hide_follows" => false,        "hide_followers" => false,        "fields" => [],        "pleroma" => %{          "confirmation_pending" => false,          "tags" => [] -      } +      }, +      "rights" => %{"admin" => false, "delete_others_notice" => false}, +      "role" => "member"      } -    blocker = User.get_by_id(blocker.id) +    blocker = User.get_cached_by_id(blocker.id)      assert represented == UserView.render("show.json", %{user: user, for: blocker})    end | 
