diff options
Diffstat (limited to 'test/web/twitter_api')
| -rw-r--r-- | test/web/twitter_api/password_controller_test.exs | 10 | ||||
| -rw-r--r-- | test/web/twitter_api/remote_follow_controller_test.exs | 350 | ||||
| -rw-r--r-- | test/web/twitter_api/twitter_api_controller_test.exs | 138 | ||||
| -rw-r--r-- | test/web/twitter_api/twitter_api_test.exs | 273 | ||||
| -rw-r--r-- | test/web/twitter_api/util_controller_test.exs | 517 | 
5 files changed, 790 insertions, 498 deletions
| diff --git a/test/web/twitter_api/password_controller_test.exs b/test/web/twitter_api/password_controller_test.exs index dc6d4e3e3..231a46c67 100644 --- a/test/web/twitter_api/password_controller_test.exs +++ b/test/web/twitter_api/password_controller_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do @@ -54,12 +54,12 @@ defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do        assert response =~ "<h2>Password changed!</h2>"        user = refresh_record(user) -      assert Comeonin.Pbkdf2.checkpw("test", user.password_hash) -      assert length(Token.get_user_tokens(user)) == 0 +      assert Pbkdf2.verify_pass("test", user.password_hash) +      assert Enum.empty?(Token.get_user_tokens(user))      end      test "it sets password_reset_pending to false", %{conn: conn} do -      user = insert(:user, info: %{password_reset_pending: true}) +      user = insert(:user, password_reset_pending: true)        {:ok, token} = PasswordResetToken.create_token(user)        {:ok, _access_token} = Token.create_token(insert(:oauth_app), user, %{}) @@ -75,7 +75,7 @@ defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do        |> post("/api/pleroma/password_reset", %{data: params})        |> html_response(:ok) -      assert User.get_by_id(user.id).info.password_reset_pending == false +      assert User.get_by_id(user.id).password_reset_pending == false      end    end  end diff --git a/test/web/twitter_api/remote_follow_controller_test.exs b/test/web/twitter_api/remote_follow_controller_test.exs new file mode 100644 index 000000000..f7e54c26a --- /dev/null +++ b/test/web/twitter_api/remote_follow_controller_test.exs @@ -0,0 +1,350 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do +  use Pleroma.Web.ConnCase + +  alias Pleroma.Config +  alias Pleroma.MFA +  alias Pleroma.MFA.TOTP +  alias Pleroma.User +  alias Pleroma.Web.CommonAPI + +  import ExUnit.CaptureLog +  import Pleroma.Factory +  import Ecto.Query + +  setup do +    Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end) +    :ok +  end + +  setup_all do: clear_config([:instance, :federating], true) +  setup do: clear_config([:instance]) +  setup do: clear_config([:frontend_configurations, :pleroma_fe]) +  setup do: clear_config([:user, :deny_follow_blocked]) + +  describe "GET /ostatus_subscribe - remote_follow/2" do +    test "adds status to pleroma instance if the `acct` is a status", %{conn: conn} do +      assert conn +             |> get( +               remote_follow_path(conn, :follow, %{ +                 acct: "https://mastodon.social/users/emelie/statuses/101849165031453009" +               }) +             ) +             |> redirected_to() =~ "/notice/" +    end + +    test "show follow account page if the `acct` is a account link", %{conn: conn} do +      response = +        conn +        |> get(remote_follow_path(conn, :follow, %{acct: "https://mastodon.social/users/emelie"})) +        |> html_response(200) + +      assert response =~ "Log in to follow" +    end + +    test "show follow page if the `acct` is a account link", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> assign(:user, user) +        |> get(remote_follow_path(conn, :follow, %{acct: "https://mastodon.social/users/emelie"})) +        |> html_response(200) + +      assert response =~ "Remote follow" +    end + +    test "show follow page with error when user cannot fecth by `acct` link", %{conn: conn} do +      user = insert(:user) + +      assert capture_log(fn -> +               response = +                 conn +                 |> assign(:user, user) +                 |> get( +                   remote_follow_path(conn, :follow, %{ +                     acct: "https://mastodon.social/users/not_found" +                   }) +                 ) +                 |> html_response(200) + +               assert response =~ "Error fetching user" +             end) =~ "Object has been deleted" +    end +  end + +  describe "POST /ostatus_subscribe - do_follow/2 with assigned user " do +    test "required `follow | write:follows` scope", %{conn: conn} do +      user = insert(:user) +      user2 = insert(:user) +      read_token = insert(:oauth_token, user: user, scopes: ["read"]) + +      assert capture_log(fn -> +               response = +                 conn +                 |> assign(:user, user) +                 |> assign(:token, read_token) +                 |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => user2.id}}) +                 |> response(200) + +               assert response =~ "Error following account" +             end) =~ "Insufficient permissions: follow | write:follows." +    end + +    test "follows user", %{conn: conn} do +      user = insert(:user) +      user2 = insert(:user) + +      conn = +        conn +        |> assign(:user, user) +        |> assign(:token, insert(:oauth_token, user: user, scopes: ["write:follows"])) +        |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => user2.id}}) + +      assert redirected_to(conn) == "/users/#{user2.id}" +    end + +    test "returns error when user is deactivated", %{conn: conn} do +      user = insert(:user, deactivated: true) +      user2 = insert(:user) + +      response = +        conn +        |> assign(:user, user) +        |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => user2.id}}) +        |> response(200) + +      assert response =~ "Error following account" +    end + +    test "returns error when user is blocked", %{conn: conn} do +      Pleroma.Config.put([:user, :deny_follow_blocked], true) +      user = insert(:user) +      user2 = insert(:user) + +      {:ok, _user_block} = Pleroma.User.block(user2, user) + +      response = +        conn +        |> assign(:user, user) +        |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => user2.id}}) +        |> response(200) + +      assert response =~ "Error following account" +    end + +    test "returns error when followee not found", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> assign(:user, user) +        |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => "jimm"}}) +        |> response(200) + +      assert response =~ "Error following account" +    end + +    test "returns success result when user already in followers", %{conn: conn} do +      user = insert(:user) +      user2 = insert(:user) +      {:ok, _, _, _} = CommonAPI.follow(user, user2) + +      conn = +        conn +        |> assign(:user, refresh_record(user)) +        |> assign(:token, insert(:oauth_token, user: user, scopes: ["write:follows"])) +        |> post(remote_follow_path(conn, :do_follow), %{"user" => %{"id" => user2.id}}) + +      assert redirected_to(conn) == "/users/#{user2.id}" +    end +  end + +  describe "POST /ostatus_subscribe - follow/2 with enabled Two-Factor Auth " do +    test "render the MFA login form", %{conn: conn} do +      otp_secret = TOTP.generate_secret() + +      user = +        insert(:user, +          multi_factor_authentication_settings: %MFA.Settings{ +            enabled: true, +            totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} +          } +        ) + +      user2 = insert(:user) + +      response = +        conn +        |> post(remote_follow_path(conn, :do_follow), %{ +          "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id} +        }) +        |> response(200) + +      mfa_token = Pleroma.Repo.one(from(q in Pleroma.MFA.Token, where: q.user_id == ^user.id)) + +      assert response =~ "Two-factor authentication" +      assert response =~ "Authentication code" +      assert response =~ mfa_token.token +      refute user2.follower_address in User.following(user) +    end + +    test "returns error when password is incorrect", %{conn: conn} do +      otp_secret = TOTP.generate_secret() + +      user = +        insert(:user, +          multi_factor_authentication_settings: %MFA.Settings{ +            enabled: true, +            totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} +          } +        ) + +      user2 = insert(:user) + +      response = +        conn +        |> post(remote_follow_path(conn, :do_follow), %{ +          "authorization" => %{"name" => user.nickname, "password" => "test1", "id" => user2.id} +        }) +        |> response(200) + +      assert response =~ "Wrong username or password" +      refute user2.follower_address in User.following(user) +    end + +    test "follows", %{conn: conn} do +      otp_secret = TOTP.generate_secret() + +      user = +        insert(:user, +          multi_factor_authentication_settings: %MFA.Settings{ +            enabled: true, +            totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} +          } +        ) + +      {:ok, %{token: token}} = MFA.Token.create_token(user) + +      user2 = insert(:user) +      otp_token = TOTP.generate_token(otp_secret) + +      conn = +        conn +        |> post( +          remote_follow_path(conn, :do_follow), +          %{ +            "mfa" => %{"code" => otp_token, "token" => token, "id" => user2.id} +          } +        ) + +      assert redirected_to(conn) == "/users/#{user2.id}" +      assert user2.follower_address in User.following(user) +    end + +    test "returns error when auth code is incorrect", %{conn: conn} do +      otp_secret = TOTP.generate_secret() + +      user = +        insert(:user, +          multi_factor_authentication_settings: %MFA.Settings{ +            enabled: true, +            totp: %MFA.Settings.TOTP{secret: otp_secret, confirmed: true} +          } +        ) + +      {:ok, %{token: token}} = MFA.Token.create_token(user) + +      user2 = insert(:user) +      otp_token = TOTP.generate_token(TOTP.generate_secret()) + +      response = +        conn +        |> post( +          remote_follow_path(conn, :do_follow), +          %{ +            "mfa" => %{"code" => otp_token, "token" => token, "id" => user2.id} +          } +        ) +        |> response(200) + +      assert response =~ "Wrong authentication code" +      refute user2.follower_address in User.following(user) +    end +  end + +  describe "POST /ostatus_subscribe - follow/2 without assigned user " do +    test "follows", %{conn: conn} do +      user = insert(:user) +      user2 = insert(:user) + +      conn = +        conn +        |> post(remote_follow_path(conn, :do_follow), %{ +          "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id} +        }) + +      assert redirected_to(conn) == "/users/#{user2.id}" +      assert user2.follower_address in User.following(user) +    end + +    test "returns error when followee not found", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> post(remote_follow_path(conn, :do_follow), %{ +          "authorization" => %{"name" => user.nickname, "password" => "test", "id" => "jimm"} +        }) +        |> response(200) + +      assert response =~ "Error following account" +    end + +    test "returns error when login invalid", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> post(remote_follow_path(conn, :do_follow), %{ +          "authorization" => %{"name" => "jimm", "password" => "test", "id" => user.id} +        }) +        |> response(200) + +      assert response =~ "Wrong username or password" +    end + +    test "returns error when password invalid", %{conn: conn} do +      user = insert(:user) +      user2 = insert(:user) + +      response = +        conn +        |> post(remote_follow_path(conn, :do_follow), %{ +          "authorization" => %{"name" => user.nickname, "password" => "42", "id" => user2.id} +        }) +        |> response(200) + +      assert response =~ "Wrong username or password" +    end + +    test "returns error when user is blocked", %{conn: conn} do +      Pleroma.Config.put([:user, :deny_follow_blocked], true) +      user = insert(:user) +      user2 = insert(:user) +      {:ok, _user_block} = Pleroma.User.block(user2, user) + +      response = +        conn +        |> post(remote_follow_path(conn, :do_follow), %{ +          "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id} +        }) +        |> response(200) + +      assert response =~ "Error following account" +    end +  end +end diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs new file mode 100644 index 000000000..464d0ea2e --- /dev/null +++ b/test/web/twitter_api/twitter_api_controller_test.exs @@ -0,0 +1,138 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.TwitterAPI.ControllerTest do +  use Pleroma.Web.ConnCase + +  alias Pleroma.Builders.ActivityBuilder +  alias Pleroma.Repo +  alias Pleroma.User +  alias Pleroma.Web.OAuth.Token + +  import Pleroma.Factory + +  describe "POST /api/qvitter/statuses/notifications/read" do +    test "without valid credentials", %{conn: conn} do +      conn = post(conn, "/api/qvitter/statuses/notifications/read", %{"latest_id" => 1_234_567}) +      assert json_response(conn, 403) == %{"error" => "Invalid credentials."} +    end + +    test "with credentials, without any params" do +      %{conn: conn} = oauth_access(["write:notifications"]) + +      conn = post(conn, "/api/qvitter/statuses/notifications/read") + +      assert json_response(conn, 400) == %{ +               "error" => "You need to specify latest_id", +               "request" => "/api/qvitter/statuses/notifications/read" +             } +    end + +    test "with credentials, with params" do +      %{user: current_user, conn: conn} = +        oauth_access(["read:notifications", "write:notifications"]) + +      other_user = insert(:user) + +      {:ok, _activity} = +        ActivityBuilder.insert(%{"to" => [current_user.ap_id]}, %{user: other_user}) + +      response_conn = +        conn +        |> assign(:user, current_user) +        |> get("/api/v1/notifications") + +      [notification] = response = json_response(response_conn, 200) + +      assert length(response) == 1 + +      assert notification["pleroma"]["is_seen"] == false + +      response_conn = +        conn +        |> assign(:user, current_user) +        |> post("/api/qvitter/statuses/notifications/read", %{"latest_id" => notification["id"]}) + +      [notification] = response = json_response(response_conn, 200) + +      assert length(response) == 1 + +      assert notification["pleroma"]["is_seen"] == true +    end +  end + +  describe "GET /api/account/confirm_email/:id/:token" do +    setup do +      {:ok, user} = +        insert(:user) +        |> User.confirmation_changeset(need_confirmation: true) +        |> Repo.update() + +      assert user.confirmation_pending + +      [user: user] +    end + +    test "it redirects to root url", %{conn: conn, user: user} do +      conn = get(conn, "/api/account/confirm_email/#{user.id}/#{user.confirmation_token}") + +      assert 302 == conn.status +    end + +    test "it confirms the user account", %{conn: conn, user: user} do +      get(conn, "/api/account/confirm_email/#{user.id}/#{user.confirmation_token}") + +      user = User.get_cached_by_id(user.id) + +      refute user.confirmation_pending +      refute user.confirmation_token +    end + +    test "it returns 500 if user cannot be found by id", %{conn: conn, user: user} do +      conn = get(conn, "/api/account/confirm_email/0/#{user.confirmation_token}") + +      assert 500 == conn.status +    end + +    test "it returns 500 if token is invalid", %{conn: conn, user: user} do +      conn = get(conn, "/api/account/confirm_email/#{user.id}/wrong_token") + +      assert 500 == conn.status +    end +  end + +  describe "GET /api/oauth_tokens" do +    setup do +      token = insert(:oauth_token) |> Repo.preload(:user) + +      %{token: token} +    end + +    test "renders list", %{token: token} do +      response = +        build_conn() +        |> assign(:user, token.user) +        |> get("/api/oauth_tokens") + +      keys = +        json_response(response, 200) +        |> hd() +        |> Map.keys() + +      assert keys -- ["id", "app_name", "valid_until"] == [] +    end + +    test "revoke token", %{token: token} do +      response = +        build_conn() +        |> assign(:user, token.user) +        |> delete("/api/oauth_tokens/#{token.id}") + +      tokens = Token.get_user_tokens(token.user) + +      assert tokens == [] +      assert response.status == 201 +    end +  end +end diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index d1d61d11a..368533292 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do @@ -18,11 +18,11 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    test "it registers a new user and returns the user." do      data = %{ -      "nickname" => "lain", -      "email" => "lain@wired.jp", -      "fullname" => "lain iwakura", -      "password" => "bear", -      "confirm" => "bear" +      :username => "lain", +      :email => "lain@wired.jp", +      :fullname => "lain iwakura", +      :password => "bear", +      :confirm => "bear"      }      {:ok, user} = TwitterAPI.register_user(data) @@ -35,12 +35,12 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    test "it registers a new user with empty string in bio and returns the user." do      data = %{ -      "nickname" => "lain", -      "email" => "lain@wired.jp", -      "fullname" => "lain iwakura", -      "bio" => "", -      "password" => "bear", -      "confirm" => "bear" +      :username => "lain", +      :email => "lain@wired.jp", +      :fullname => "lain iwakura", +      :bio => "", +      :password => "bear", +      :confirm => "bear"      }      {:ok, user} = TwitterAPI.register_user(data) @@ -60,18 +60,18 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      end      data = %{ -      "nickname" => "lain", -      "email" => "lain@wired.jp", -      "fullname" => "lain iwakura", -      "bio" => "", -      "password" => "bear", -      "confirm" => "bear" +      :username => "lain", +      :email => "lain@wired.jp", +      :fullname => "lain iwakura", +      :bio => "", +      :password => "bear", +      :confirm => "bear"      }      {:ok, user} = TwitterAPI.register_user(data)      ObanHelpers.perform_all() -    assert user.info.confirmation_pending +    assert user.confirmation_pending      email = Pleroma.Emails.UserEmail.account_confirmation_email(user) @@ -87,29 +87,29 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    test "it registers a new user and parses mentions in the bio" do      data1 = %{ -      "nickname" => "john", -      "email" => "john@gmail.com", -      "fullname" => "John Doe", -      "bio" => "test", -      "password" => "bear", -      "confirm" => "bear" +      :username => "john", +      :email => "john@gmail.com", +      :fullname => "John Doe", +      :bio => "test", +      :password => "bear", +      :confirm => "bear"      }      {:ok, user1} = TwitterAPI.register_user(data1)      data2 = %{ -      "nickname" => "lain", -      "email" => "lain@wired.jp", -      "fullname" => "lain iwakura", -      "bio" => "@john test", -      "password" => "bear", -      "confirm" => "bear" +      :username => "lain", +      :email => "lain@wired.jp", +      :fullname => "lain iwakura", +      :bio => "@john test", +      :password => "bear", +      :confirm => "bear"      }      {:ok, user2} = TwitterAPI.register_user(data2)      expected_text = -      ~s(<span class="h-card"><a data-user="#{user1.id}" class="u-url mention" href="#{ +      ~s(<span class="h-card"><a class="u-url mention" data-user="#{user1.id}" href="#{          user1.ap_id        }" rel="ugc">@<span>john</span></a></span> test) @@ -117,28 +117,19 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "register with one time 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 +    setup do: clear_config([:instance, :registrations_open], false)      test "returns user on success" do        {:ok, invite} = UserInviteToken.create_invite()        data = %{ -        "nickname" => "vinny", -        "email" => "pasta@pizza.vs", -        "fullname" => "Vinny Vinesauce", -        "bio" => "streamer", -        "password" => "hiptofbees", -        "confirm" => "hiptofbees", -        "token" => invite.token +        :username => "vinny", +        :email => "pasta@pizza.vs", +        :fullname => "Vinny Vinesauce", +        :bio => "streamer", +        :password => "hiptofbees", +        :confirm => "hiptofbees", +        :token => invite.token        }        {:ok, user} = TwitterAPI.register_user(data) @@ -154,13 +145,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do      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" +        :username => "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) @@ -174,13 +165,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        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 +        :username => "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) @@ -191,25 +182,20 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    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 +    setup do: clear_config([:instance, :registrations_open], false) +    setup do        data = %{ -        "nickname" => "vinny", -        "email" => "pasta@pizza.vs", -        "fullname" => "Vinny Vinesauce", -        "bio" => "streamer", -        "password" => "hiptofbees", -        "confirm" => "hiptofbees" +        :username => "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) +        data = Map.put(data, :token, invite.token)          {:ok, user} = TwitterAPI.register_user(data)          fetched_user = User.get_cached_by_nickname("vinny") @@ -256,16 +242,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "registers with reusable 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 +    setup do: clear_config([:instance, :registrations_open], false)      test "returns user on success, after him registration fails" do        {:ok, invite} = UserInviteToken.create_invite(%{max_use: 100}) @@ -273,13 +250,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        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 +        :username => "vinny", +        :email => "pasta@pizza.vs", +        :fullname => "Vinny Vinesauce", +        :bio => "streamer", +        :password => "hiptofbees", +        :confirm => "hiptofbees", +        :token => invite.token        }        {:ok, user} = TwitterAPI.register_user(data) @@ -292,13 +269,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do                 AccountView.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 +        :username => "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) @@ -309,28 +286,19 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    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 +    setup do: clear_config([:instance, :registrations_open], false)      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 +        :username => "vinny", +        :email => "pasta@pizza.vs", +        :fullname => "Vinny Vinesauce", +        :bio => "streamer", +        :password => "hiptofbees", +        :confirm => "hiptofbees", +        :token => invite.token        }        {:ok, user} = TwitterAPI.register_user(data) @@ -349,13 +317,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        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 +        :username => "vinny", +        :email => "pasta@pizza.vs", +        :fullname => "Vinny Vinesauce", +        :bio => "streamer", +        :password => "hiptofbees", +        :confirm => "hiptofbees", +        :token => invite.token        }        {:ok, user} = TwitterAPI.register_user(data) @@ -367,13 +335,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do                 AccountView.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 +        :username => "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) @@ -387,13 +355,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do          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 +        :username => "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) @@ -409,13 +377,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do        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 +        :username => "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) @@ -427,16 +395,15 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    test "it returns the error on registration problems" do      data = %{ -      "nickname" => "lain", -      "email" => "lain@wired.jp", -      "fullname" => "lain iwakura", -      "bio" => "close the world.", -      "password" => "bear" +      :username => "lain", +      :email => "lain@wired.jp", +      :fullname => "lain iwakura", +      :bio => "close the world."      } -    {:error, error_object} = TwitterAPI.register_user(data) +    {:error, error} = TwitterAPI.register_user(data) -    assert is_binary(error_object[:error]) +    assert is_binary(error)      refute User.get_cached_by_nickname("lain")    end diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 9d4cb70f0..ad919d341 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -1,16 +1,15 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    use Pleroma.Web.ConnCase    use Oban.Testing, repo: Pleroma.Repo -  alias Pleroma.Repo +  alias Pleroma.Config    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User -  alias Pleroma.Web.CommonAPI -  import ExUnit.CaptureLog +    import Pleroma.Factory    import Mock @@ -19,26 +18,24 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      :ok    end -  clear_config([:instance]) -  clear_config([:frontend_configurations, :pleroma_fe]) -  clear_config([:user, :deny_follow_blocked]) +  setup do: clear_config([:instance]) +  setup do: clear_config([:frontend_configurations, :pleroma_fe])    describe "POST /api/pleroma/follow_import" do +    setup do: oauth_access(["follow"]) +      test "it returns HTTP 200", %{conn: conn} do -      user1 = insert(:user)        user2 = insert(:user)        response =          conn -        |> assign(:user, user1)          |> post("/api/pleroma/follow_import", %{"list" => "#{user2.ap_id}"})          |> json_response(:ok)        assert response == "job started"      end -    test "it imports follow lists from file", %{conn: conn} do -      user1 = insert(:user) +    test "it imports follow lists from file", %{user: user1, conn: conn} do        user2 = insert(:user)        with_mocks([ @@ -49,7 +46,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        ]) do          response =            conn -          |> assign(:user, user1)            |> post("/api/pleroma/follow_import", %{"list" => %Plug.Upload{path: "follow_list.txt"}})            |> json_response(:ok) @@ -67,12 +63,10 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      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"          }) @@ -81,7 +75,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert response == "job started"      end -    test "requires 'follow' or 'write:follows' permissions", %{conn: conn} do +    test "requires 'follow' or 'write:follows' permissions" do        token1 = insert(:oauth_token, scopes: ["read", "write"])        token2 = insert(:oauth_token, scopes: ["follow"])        token3 = insert(:oauth_token, scopes: ["something"]) @@ -89,7 +83,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        for token <- [token1, token2, token3] do          conn = -          conn +          build_conn()            |> put_req_header("authorization", "Bearer #{token.token}")            |> post("/api/pleroma/follow_import", %{"list" => "#{another_user.ap_id}"}) @@ -101,24 +95,48 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do          end        end      end + +    test "it imports follows with different nickname variations", %{conn: conn} do +      [user2, user3, user4, user5, user6] = insert_list(5, :user) + +      identifiers = +        [ +          user2.ap_id, +          user3.nickname, +          "  ", +          "@" <> user4.nickname, +          user5.nickname <> "@localhost", +          "@" <> user6.nickname <> "@localhost" +        ] +        |> Enum.join("\n") + +      response = +        conn +        |> post("/api/pleroma/follow_import", %{"list" => identifiers}) +        |> json_response(:ok) + +      assert response == "job started" +      assert [{:ok, job_result}] = ObanHelpers.perform_all() +      assert job_result == [user2, user3, user4, user5, user6] +    end    end    describe "POST /api/pleroma/blocks_import" do +    # Note: "follow" or "write:blocks" permission is required +    setup do: oauth_access(["write:blocks"]) +      test "it returns HTTP 200", %{conn: conn} do -      user1 = insert(:user)        user2 = insert(:user)        response =          conn -        |> assign(:user, user1)          |> post("/api/pleroma/blocks_import", %{"list" => "#{user2.ap_id}"})          |> json_response(:ok)        assert response == "job started"      end -    test "it imports blocks users from file", %{conn: conn} do -      user1 = insert(:user) +    test "it imports blocks users from file", %{user: user1, conn: conn} do        user2 = insert(:user)        user3 = insert(:user) @@ -127,7 +145,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        ]) do          response =            conn -          |> assign(:user, user1)            |> post("/api/pleroma/blocks_import", %{"list" => %Plug.Upload{path: "blocks_list.txt"}})            |> json_response(:ok) @@ -143,34 +160,73 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do                 )        end      end + +    test "it imports blocks with different nickname variations", %{conn: conn} do +      [user2, user3, user4, user5, user6] = insert_list(5, :user) + +      identifiers = +        [ +          user2.ap_id, +          user3.nickname, +          "@" <> user4.nickname, +          user5.nickname <> "@localhost", +          "@" <> user6.nickname <> "@localhost" +        ] +        |> Enum.join(" ") + +      response = +        conn +        |> post("/api/pleroma/blocks_import", %{"list" => identifiers}) +        |> json_response(:ok) + +      assert response == "job started" +      assert [{:ok, job_result}] = ObanHelpers.perform_all() +      assert job_result == [user2, user3, user4, user5, user6] +    end    end    describe "PUT /api/pleroma/notification_settings" do -    test "it updates notification settings", %{conn: conn} do -      user = insert(:user) +    setup do: oauth_access(["write:accounts"]) +    test "it updates notification settings", %{user: user, conn: conn} do        conn -      |> assign(:user, user)        |> put("/api/pleroma/notification_settings", %{          "followers" => false,          "bar" => 1        })        |> json_response(:ok) -      user = Repo.get(User, user.id) +      user = refresh_record(user) -      assert %{ -               "followers" => false, -               "follows" => true, -               "non_follows" => true, -               "non_followers" => true -             } == user.info.notification_settings +      assert %Pleroma.User.NotificationSetting{ +               followers: false, +               follows: true, +               non_follows: true, +               non_followers: true, +               privacy_option: false +             } == user.notification_settings +    end + +    test "it updates notification privacy option", %{user: user, conn: conn} do +      conn +      |> put("/api/pleroma/notification_settings", %{"privacy_option" => "1"}) +      |> json_response(:ok) + +      user = refresh_record(user) + +      assert %Pleroma.User.NotificationSetting{ +               followers: true, +               follows: true, +               non_follows: true, +               non_followers: true, +               privacy_option: true +             } == user.notification_settings      end    end    describe "GET /api/statusnet/config" do      test "it returns config in xml format", %{conn: conn} do -      instance = Pleroma.Config.get(:instance) +      instance = Config.get(:instance)        response =          conn @@ -187,12 +243,12 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "it returns config in json format", %{conn: conn} do -      instance = Pleroma.Config.get(:instance) -      Pleroma.Config.put([:instance, :managed_config], true) -      Pleroma.Config.put([:instance, :registrations_open], false) -      Pleroma.Config.put([:instance, :invites_enabled], true) -      Pleroma.Config.put([:instance, :public], false) -      Pleroma.Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"}) +      instance = Config.get(:instance) +      Config.put([:instance, :managed_config], true) +      Config.put([:instance, :registrations_open], false) +      Config.put([:instance, :invites_enabled], true) +      Config.put([:instance, :public], false) +      Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"})        response =          conn @@ -226,7 +282,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "returns the state of safe_dm_mentions flag", %{conn: conn} do -      Pleroma.Config.put([:instance, :safe_dm_mentions], true) +      Config.put([:instance, :safe_dm_mentions], true)        response =          conn @@ -235,7 +291,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert response["site"]["safeDMMentionsEnabled"] == "1" -      Pleroma.Config.put([:instance, :safe_dm_mentions], false) +      Config.put([:instance, :safe_dm_mentions], false)        response =          conn @@ -246,8 +302,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "it returns the managed config", %{conn: conn} do -      Pleroma.Config.put([:instance, :managed_config], false) -      Pleroma.Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"}) +      Config.put([:instance, :managed_config], false) +      Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"})        response =          conn @@ -256,7 +312,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        refute response["site"]["pleromafe"] -      Pleroma.Config.put([:instance, :managed_config], true) +      Config.put([:instance, :managed_config], true)        response =          conn @@ -279,7 +335,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do          }        ] -      Pleroma.Config.put(:frontend_configurations, config) +      Config.put(:frontend_configurations, config)        response =          conn @@ -308,201 +364,11 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end    end -  describe "GET /ostatus_subscribe - remote_follow/2" do -    test "adds status to pleroma instance if the `acct` is a status", %{conn: conn} do -      conn = -        get( -          conn, -          "/ostatus_subscribe?acct=https://mastodon.social/users/emelie/statuses/101849165031453009" -        ) - -      assert redirected_to(conn) =~ "/notice/" -    end - -    test "show follow account page if the `acct` is a account link", %{conn: conn} do -      response = -        get( -          conn, -          "/ostatus_subscribe?acct=https://mastodon.social/users/emelie" -        ) - -      assert html_response(response, 200) =~ "Log in to follow" -    end - -    test "show follow page if the `acct` is a account link", %{conn: conn} do -      user = insert(:user) - -      response = -        conn -        |> assign(:user, user) -        |> get("/ostatus_subscribe?acct=https://mastodon.social/users/emelie") - -      assert html_response(response, 200) =~ "Remote follow" -    end - -    test "show follow page with error when user cannot fecth by `acct` link", %{conn: conn} do -      user = insert(:user) - -      assert capture_log(fn -> -               response = -                 conn -                 |> assign(:user, user) -                 |> get("/ostatus_subscribe?acct=https://mastodon.social/users/not_found") - -               assert html_response(response, 200) =~ "Error fetching user" -             end) =~ "Object has been deleted" -    end -  end - -  describe "POST /ostatus_subscribe - do_remote_follow/2 with assigned user " do -    test "follows user", %{conn: conn} do -      user = insert(:user) -      user2 = insert(:user) - -      response = -        conn -        |> assign(:user, user) -        |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}}) -        |> response(200) - -      assert response =~ "Account followed!" -      assert user2.follower_address in refresh_record(user).following -    end - -    test "returns error when user is deactivated", %{conn: conn} do -      user = insert(:user, info: %{deactivated: true}) -      user2 = insert(:user) - -      response = -        conn -        |> assign(:user, user) -        |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}}) -        |> response(200) - -      assert response =~ "Error following account" -    end - -    test "returns error when user is blocked", %{conn: conn} do -      Pleroma.Config.put([:user, :deny_follow_blocked], true) -      user = insert(:user) -      user2 = insert(:user) - -      {:ok, _user} = Pleroma.User.block(user2, user) - -      response = -        conn -        |> assign(:user, user) -        |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}}) -        |> response(200) - -      assert response =~ "Error following account" -    end - -    test "returns error when followee not found", %{conn: conn} do -      user = insert(:user) - -      response = -        conn -        |> assign(:user, user) -        |> post("/ostatus_subscribe", %{"user" => %{"id" => "jimm"}}) -        |> response(200) - -      assert response =~ "Error following account" -    end - -    test "returns success result when user already in followers", %{conn: conn} do -      user = insert(:user) -      user2 = insert(:user) -      {:ok, _, _, _} = CommonAPI.follow(user, user2) - -      response = -        conn -        |> assign(:user, refresh_record(user)) -        |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}}) -        |> response(200) - -      assert response =~ "Account followed!" -    end -  end - -  describe "POST /ostatus_subscribe - do_remote_follow/2 without assigned user " do -    test "follows", %{conn: conn} do -      user = insert(:user) -      user2 = insert(:user) - -      response = -        conn -        |> post("/ostatus_subscribe", %{ -          "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id} -        }) -        |> response(200) - -      assert response =~ "Account followed!" -      assert user2.follower_address in refresh_record(user).following -    end - -    test "returns error when followee not found", %{conn: conn} do -      user = insert(:user) - -      response = -        conn -        |> post("/ostatus_subscribe", %{ -          "authorization" => %{"name" => user.nickname, "password" => "test", "id" => "jimm"} -        }) -        |> response(200) - -      assert response =~ "Error following account" -    end - -    test "returns error when login invalid", %{conn: conn} do -      user = insert(:user) - -      response = -        conn -        |> post("/ostatus_subscribe", %{ -          "authorization" => %{"name" => "jimm", "password" => "test", "id" => user.id} -        }) -        |> response(200) - -      assert response =~ "Wrong username or password" -    end - -    test "returns error when password invalid", %{conn: conn} do -      user = insert(:user) -      user2 = insert(:user) - -      response = -        conn -        |> post("/ostatus_subscribe", %{ -          "authorization" => %{"name" => user.nickname, "password" => "42", "id" => user2.id} -        }) -        |> response(200) - -      assert response =~ "Wrong username or password" -    end - -    test "returns error when user is blocked", %{conn: conn} do -      Pleroma.Config.put([:user, :deny_follow_blocked], true) -      user = insert(:user) -      user2 = insert(:user) -      {:ok, _user} = Pleroma.User.block(user2, user) - -      response = -        conn -        |> post("/ostatus_subscribe", %{ -          "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id} -        }) -        |> response(200) - -      assert response =~ "Error following account" -    end -  end -    describe "GET /api/pleroma/healthcheck" do -    clear_config([:instance, :healthcheck]) +    setup do: clear_config([:instance, :healthcheck])      test "returns 503 when healthcheck disabled", %{conn: conn} do -      Pleroma.Config.put([:instance, :healthcheck], false) +      Config.put([:instance, :healthcheck], false)        response =          conn @@ -513,7 +379,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end      test "returns 200 when healthcheck enabled and all ok", %{conn: conn} do -      Pleroma.Config.put([:instance, :healthcheck], true) +      Config.put([:instance, :healthcheck], true)        with_mock Pleroma.Healthcheck,          system_info: fn -> %Pleroma.Healthcheck{healthy: true} end do @@ -532,8 +398,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        end      end -    test "returns 503 when healthcheck enabled and  health is false", %{conn: conn} do -      Pleroma.Config.put([:instance, :healthcheck], true) +    test "returns 503 when healthcheck enabled and health is false", %{conn: conn} do +      Config.put([:instance, :healthcheck], true)        with_mock Pleroma.Healthcheck,          system_info: fn -> %Pleroma.Healthcheck{healthy: false} end do @@ -554,12 +420,11 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    end    describe "POST /api/pleroma/disable_account" do -    test "it returns HTTP 200", %{conn: conn} do -      user = insert(:user) +    setup do: oauth_access(["write:accounts"]) +    test "with valid permissions and password, it disables the account", %{conn: conn, user: user} do        response =          conn -        |> assign(:user, user)          |> post("/api/pleroma/disable_account", %{"password" => "test"})          |> json_response(:ok) @@ -568,22 +433,21 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        user = User.get_cached_by_id(user.id) -      assert user.info.deactivated == true +      assert user.deactivated == true      end -    test "it returns returns when password invalid", %{conn: conn} do +    test "with valid permissions and invalid password, it returns an error", %{conn: conn} do        user = insert(:user)        response =          conn -        |> assign(:user, user)          |> post("/api/pleroma/disable_account", %{"password" => "test1"})          |> json_response(:ok)        assert response == %{"error" => "Invalid password."}        user = User.get_cached_by_id(user.id) -      refute user.info.deactivated +      refute user.deactivated      end    end @@ -610,6 +474,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    end    describe "POST /main/ostatus - remote_subscribe/2" do +    setup do: clear_config([:instance, :federating], true) +      test "renders subscribe form", %{conn: conn} do        user = insert(:user) @@ -646,7 +512,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do                 "https://social.heldscal.la/main/ostatussub?profile=#{user.ap_id}"      end -    test "it renders form with error when use not found", %{conn: conn} do +    test "it renders form with error when user not found", %{conn: conn} do        user2 = insert(:user, ap_id: "shp@social.heldscal.la")        response = @@ -671,29 +537,21 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end    end -  defp with_credentials(conn, username, password) do -    header_content = "Basic " <> Base.encode64("#{username}:#{password}") -    put_req_header(conn, "authorization", header_content) -  end - -  defp valid_user(_context) do -    user = insert(:user) -    [user: user] -  end -    describe "POST /api/pleroma/change_email" do -    setup [:valid_user] +    setup do: oauth_access(["write:accounts"]) + +    test "without permissions", %{conn: conn} do +      conn = +        conn +        |> assign(:token, nil) +        |> post("/api/pleroma/change_email") -    test "without credentials", %{conn: conn} do -      conn = post(conn, "/api/pleroma/change_email") -      assert json_response(conn, 403) == %{"error" => "Invalid credentials."} +      assert json_response(conn, 403) == %{"error" => "Insufficient permissions: write:accounts."}      end -    test "with credentials and invalid password", %{conn: conn, user: current_user} do +    test "with proper permissions and invalid password", %{conn: conn} do        conn = -        conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/change_email", %{ +        post(conn, "/api/pleroma/change_email", %{            "password" => "hi",            "email" => "test@test.com"          }) @@ -701,14 +559,11 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert json_response(conn, 200) == %{"error" => "Invalid password."}      end -    test "with credentials, valid password and invalid email", %{ -      conn: conn, -      user: current_user +    test "with proper permissions, valid password and invalid email", %{ +      conn: conn      } do        conn = -        conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/change_email", %{ +        post(conn, "/api/pleroma/change_email", %{            "password" => "test",            "email" => "foobar"          }) @@ -716,28 +571,22 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert json_response(conn, 200) == %{"error" => "Email has invalid format."}      end -    test "with credentials, valid password and no email", %{ -      conn: conn, -      user: current_user +    test "with proper permissions, valid password and no email", %{ +      conn: conn      } do        conn = -        conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/change_email", %{ +        post(conn, "/api/pleroma/change_email", %{            "password" => "test"          })        assert json_response(conn, 200) == %{"error" => "Email can't be blank."}      end -    test "with credentials, valid password and blank email", %{ -      conn: conn, -      user: current_user +    test "with proper permissions, valid password and blank email", %{ +      conn: conn      } do        conn = -        conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/change_email", %{ +        post(conn, "/api/pleroma/change_email", %{            "password" => "test",            "email" => ""          }) @@ -745,16 +594,13 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert json_response(conn, 200) == %{"error" => "Email can't be blank."}      end -    test "with credentials, valid password and non unique email", %{ -      conn: conn, -      user: current_user +    test "with proper permissions, valid password and non unique email", %{ +      conn: conn      } do        user = insert(:user)        conn = -        conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/change_email", %{ +        post(conn, "/api/pleroma/change_email", %{            "password" => "test",            "email" => user.email          }) @@ -762,14 +608,11 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert json_response(conn, 200) == %{"error" => "Email has already been taken."}      end -    test "with credentials, valid password and valid email", %{ -      conn: conn, -      user: current_user +    test "with proper permissions, valid password and valid email", %{ +      conn: conn      } do        conn = -        conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/change_email", %{ +        post(conn, "/api/pleroma/change_email", %{            "password" => "test",            "email" => "cofe@foobar.com"          }) @@ -779,18 +622,20 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    end    describe "POST /api/pleroma/change_password" do -    setup [:valid_user] +    setup do: oauth_access(["write:accounts"]) + +    test "without permissions", %{conn: conn} do +      conn = +        conn +        |> assign(:token, nil) +        |> post("/api/pleroma/change_password") -    test "without credentials", %{conn: conn} do -      conn = post(conn, "/api/pleroma/change_password") -      assert json_response(conn, 403) == %{"error" => "Invalid credentials."} +      assert json_response(conn, 403) == %{"error" => "Insufficient permissions: write:accounts."}      end -    test "with credentials and invalid password", %{conn: conn, user: current_user} do +    test "with proper permissions and invalid password", %{conn: conn} do        conn = -        conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/change_password", %{ +        post(conn, "/api/pleroma/change_password", %{            "password" => "hi",            "new_password" => "newpass",            "new_password_confirmation" => "newpass" @@ -799,14 +644,12 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert json_response(conn, 200) == %{"error" => "Invalid password."}      end -    test "with credentials, valid password and new password and confirmation not matching", %{ -      conn: conn, -      user: current_user -    } do +    test "with proper permissions, valid password and new password and confirmation not matching", +         %{ +           conn: conn +         } do        conn = -        conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/change_password", %{ +        post(conn, "/api/pleroma/change_password", %{            "password" => "test",            "new_password" => "newpass",            "new_password_confirmation" => "notnewpass" @@ -817,14 +660,11 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do               }      end -    test "with credentials, valid password and invalid new password", %{ -      conn: conn, -      user: current_user +    test "with proper permissions, valid password and invalid new password", %{ +      conn: conn      } do        conn = -        conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/change_password", %{ +        post(conn, "/api/pleroma/change_password", %{            "password" => "test",            "new_password" => "",            "new_password_confirmation" => "" @@ -835,51 +675,48 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do               }      end -    test "with credentials, valid password and matching new password and confirmation", %{ +    test "with proper permissions, valid password and matching new password and confirmation", %{        conn: conn, -      user: current_user +      user: user      } do        conn = -        conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/change_password", %{ +        post(conn, "/api/pleroma/change_password", %{            "password" => "test",            "new_password" => "newpass",            "new_password_confirmation" => "newpass"          })        assert json_response(conn, 200) == %{"status" => "success"} -      fetched_user = User.get_cached_by_id(current_user.id) -      assert Comeonin.Pbkdf2.checkpw("newpass", fetched_user.password_hash) == true +      fetched_user = User.get_cached_by_id(user.id) +      assert Pbkdf2.verify_pass("newpass", fetched_user.password_hash) == true      end    end    describe "POST /api/pleroma/delete_account" do -    setup [:valid_user] - -    test "without credentials", %{conn: conn} do -      conn = post(conn, "/api/pleroma/delete_account") -      assert json_response(conn, 403) == %{"error" => "Invalid credentials."} -    end +    setup do: oauth_access(["write:accounts"]) -    test "with credentials and invalid password", %{conn: conn, user: current_user} do +    test "without permissions", %{conn: conn} do        conn =          conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/delete_account", %{"password" => "hi"}) +        |> assign(:token, nil) +        |> post("/api/pleroma/delete_account") -      assert json_response(conn, 200) == %{"error" => "Invalid password."} +      assert json_response(conn, 403) == +               %{"error" => "Insufficient permissions: write:accounts."}      end -    test "with credentials and valid password", %{conn: conn, user: current_user} do -      conn = -        conn -        |> with_credentials(current_user.nickname, "test") -        |> post("/api/pleroma/delete_account", %{"password" => "test"}) +    test "with proper permissions and wrong or missing password", %{conn: conn} do +      for params <- [%{"password" => "hi"}, %{}] do +        ret_conn = post(conn, "/api/pleroma/delete_account", params) + +        assert json_response(ret_conn, 200) == %{"error" => "Invalid password."} +      end +    end + +    test "with proper permissions and valid password", %{conn: conn} do +      conn = post(conn, "/api/pleroma/delete_account", %{"password" => "test"})        assert json_response(conn, 200) == %{"status" => "success"} -      # Wait a second for the started task to end -      :timer.sleep(1000)      end    end  end | 
