Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into 1993-confirm-users...
authorlain <lain@soykaf.club>
Wed, 29 Jul 2020 12:42:09 +0000 (14:42 +0200)
committerlain <lain@soykaf.club>
Wed, 29 Jul 2020 12:42:09 +0000 (14:42 +0200)
1  2 
test/user_test.exs
test/web/mastodon_api/controllers/account_controller_test.exs

diff --combined test/user_test.exs
index 80c0bd79ccb32b2d51e37be6cb26bc237cded072,624baf8ad15d323356a9fa767137de9a5e7afe5f..904cea5368a94bcf4957de64045e523cd329fda0
@@@ -500,24 -500,6 +500,24 @@@ defmodule Pleroma.UserTest d
  
        assert changeset.changes.follower_address == "#{changeset.changes.ap_id}/followers"
      end
 +
 +    test "it sets the 'accepts_chat_messages' set to true" do
 +      changeset = User.register_changeset(%User{}, @full_user_data)
 +      assert changeset.valid?
 +
 +      {:ok, user} = Repo.insert(changeset)
 +
 +      assert user.accepts_chat_messages
 +    end
 +
 +    test "it creates a confirmed user" do
 +      changeset = User.register_changeset(%User{}, @full_user_data)
 +      assert changeset.valid?
 +
 +      {:ok, user} = Repo.insert(changeset)
 +
 +      refute user.confirmation_pending
 +    end
    end
  
    describe "user registration, with :account_activation_required" do
      }
      setup do: clear_config([:instance, :account_activation_required], true)
  
 -    test "it sets the 'accepts_chat_messages' set to true" do
 -      changeset = User.register_changeset(%User{}, @full_user_data)
 -      assert changeset.valid?
 -
 -      {:ok, user} = Repo.insert(changeset)
 -
 -      assert user.accepts_chat_messages
 -    end
 -
      test "it creates unconfirmed user" do
        changeset = User.register_changeset(%User{}, @full_user_data)
        assert changeset.valid?
      end
    end
  
+   describe "user registration, with :account_approval_required" do
+     @full_user_data %{
+       bio: "A guy",
+       name: "my name",
+       nickname: "nick",
+       password: "test",
+       password_confirmation: "test",
+       email: "email@example.com",
+       registration_reason: "I'm a cool guy :)"
+     }
+     setup do: clear_config([:instance, :account_approval_required], true)
+     test "it creates unapproved user" do
+       changeset = User.register_changeset(%User{}, @full_user_data)
+       assert changeset.valid?
+       {:ok, user} = Repo.insert(changeset)
+       assert user.approval_pending
+       assert user.registration_reason == "I'm a cool guy :)"
+     end
+     test "it restricts length of registration reason" do
+       reason_limit = Pleroma.Config.get([:instance, :registration_reason_length])
+       assert is_integer(reason_limit)
+       params =
+         @full_user_data
+         |> Map.put(
+           :registration_reason,
+           "Quia et nesciunt dolores numquam ipsam nisi sapiente soluta. Ullam repudiandae nisi quam porro officiis officiis ad. Consequatur animi velit ex quia. Odit voluptatem perferendis quia ut nisi. Dignissimos sit soluta atque aliquid dolorem ut dolorum ut. Labore voluptates iste iusto amet voluptatum earum. Ad fugit illum nam eos ut nemo. Pariatur ea fuga non aspernatur. Dignissimos debitis officia corporis est nisi ab et. Atque itaque alias eius voluptas minus. Accusamus numquam tempore occaecati in."
+         )
+       changeset = User.register_changeset(%User{}, params)
+       refute changeset.valid?
+     end
+   end
    describe "get_or_fetch/1" do
      test "gets an existing user by nickname" do
        user = insert(:user)
      end
    end
  
+   describe "approve" do
+     test "approves a user" do
+       user = insert(:user, approval_pending: true)
+       assert true == user.approval_pending
+       {:ok, user} = User.approve(user)
+       assert false == user.approval_pending
+     end
+     test "approves a list of users" do
+       unapproved_users = [
+         insert(:user, approval_pending: true),
+         insert(:user, approval_pending: true),
+         insert(:user, approval_pending: true)
+       ]
+       {:ok, users} = User.approve(unapproved_users)
+       assert Enum.count(users) == 3
+       Enum.each(users, fn user ->
+         assert false == user.approval_pending
+       end)
+     end
+   end
    describe "delete" do
      setup do
        {:ok, user} = insert(:user) |> User.set_cache()
      end
    end
  
+   test "delete/1 when approval is pending deletes the user" do
+     user = insert(:user, approval_pending: true)
+     {:ok, user: user}
+     {:ok, job} = User.delete(user)
+     {:ok, _} = ObanHelpers.perform(job)
+     refute User.get_cached_by_id(user.id)
+     refute User.get_by_id(user.id)
+   end
    test "get_public_key_for_ap_id fetches a user that's not in the db" do
      assert {:ok, _key} = User.get_public_key_for_ap_id("http://mastodon.example.org/users/admin")
    end
        user = insert(:user, local: true, confirmation_pending: false, deactivated: true)
        assert User.account_status(user) == :deactivated
      end
+     test "returns :approval_pending for unapproved user" do
+       user = insert(:user, local: true, approval_pending: true)
+       assert User.account_status(user) == :approval_pending
+       user = insert(:user, local: true, confirmation_pending: true, approval_pending: true)
+       assert User.account_status(user) == :approval_pending
+     end
    end
  
    describe "superuser?/1" do
index a2332d2af527c089031bfbb20faaeea43ad93437,e6b283aab390790074cb911678363b60f21038fa..708f8b5b39e2989dad69fb2958b55a3a18a5eb87
@@@ -903,73 -903,10 +903,75 @@@ defmodule Pleroma.Web.MastodonAPI.Accou
        [valid_params: valid_params]
      end
  
 -    setup do: clear_config([:instance, :account_activation_required])
 +    test "Account registration via Application, no confirmation required", %{conn: conn} do
 +      clear_config([:instance, :account_activation_required], false)
 +
 +      conn =
 +        conn
 +        |> put_req_header("content-type", "application/json")
 +        |> post("/api/v1/apps", %{
 +          client_name: "client_name",
 +          redirect_uris: "urn:ietf:wg:oauth:2.0:oob",
 +          scopes: "read, write, follow"
 +        })
 +
 +      assert %{
 +               "client_id" => client_id,
 +               "client_secret" => client_secret,
 +               "id" => _,
 +               "name" => "client_name",
 +               "redirect_uri" => "urn:ietf:wg:oauth:2.0:oob",
 +               "vapid_key" => _,
 +               "website" => nil
 +             } = json_response_and_validate_schema(conn, 200)
 +
 +      conn =
 +        post(conn, "/oauth/token", %{
 +          grant_type: "client_credentials",
 +          client_id: client_id,
 +          client_secret: client_secret
 +        })
 +
 +      assert %{"access_token" => token, "refresh_token" => refresh, "scope" => scope} =
 +               json_response(conn, 200)
 +
 +      assert token
 +      token_from_db = Repo.get_by(Token, token: token)
 +      assert token_from_db
 +      assert refresh
 +      assert scope == "read write follow"
 +
 +      conn =
 +        build_conn()
 +        |> put_req_header("content-type", "multipart/form-data")
 +        |> put_req_header("authorization", "Bearer " <> token)
 +        |> post("/api/v1/accounts", %{
 +          username: "lain",
 +          email: "lain@example.org",
 +          password: "PlzDontHackLain",
 +          bio: "Test Bio",
 +          agreement: true
 +        })
 +
 +      %{
 +        "access_token" => token,
 +        "created_at" => _created_at,
 +        "scope" => ^scope,
 +        "token_type" => "Bearer"
 +      } = json_response_and_validate_schema(conn, 200)
 +
 +      token_from_db = Repo.get_by(Token, token: token)
 +      assert token_from_db
 +      token_from_db = Repo.preload(token_from_db, :user)
 +      assert token_from_db.user
 +      refute token_from_db.user.confirmation_pending
 +    end
 +
+     setup do: clear_config([:instance, :account_approval_required])
      test "Account registration via Application", %{conn: conn} do
 +      clear_config([:instance, :account_activation_required], true)
 +
        conn =
          conn
          |> put_req_header("content-type", "application/json")
        assert token_from_db.user.confirmation_pending
      end
  
 -      assert token_from_db.user.confirmation_pending
+     test "Account registration via app with account_approval_required", %{conn: conn} do
+       Pleroma.Config.put([:instance, :account_approval_required], true)
+       conn =
+         conn
+         |> put_req_header("content-type", "application/json")
+         |> post("/api/v1/apps", %{
+           client_name: "client_name",
+           redirect_uris: "urn:ietf:wg:oauth:2.0:oob",
+           scopes: "read, write, follow"
+         })
+       assert %{
+                "client_id" => client_id,
+                "client_secret" => client_secret,
+                "id" => _,
+                "name" => "client_name",
+                "redirect_uri" => "urn:ietf:wg:oauth:2.0:oob",
+                "vapid_key" => _,
+                "website" => nil
+              } = json_response_and_validate_schema(conn, 200)
+       conn =
+         post(conn, "/oauth/token", %{
+           grant_type: "client_credentials",
+           client_id: client_id,
+           client_secret: client_secret
+         })
+       assert %{"access_token" => token, "refresh_token" => refresh, "scope" => scope} =
+                json_response(conn, 200)
+       assert token
+       token_from_db = Repo.get_by(Token, token: token)
+       assert token_from_db
+       assert refresh
+       assert scope == "read write follow"
+       conn =
+         build_conn()
+         |> put_req_header("content-type", "multipart/form-data")
+         |> put_req_header("authorization", "Bearer " <> token)
+         |> post("/api/v1/accounts", %{
+           username: "lain",
+           email: "lain@example.org",
+           password: "PlzDontHackLain",
+           bio: "Test Bio",
+           agreement: true,
+           reason: "I'm a cool dude, bro"
+         })
+       %{
+         "access_token" => token,
+         "created_at" => _created_at,
+         "scope" => ^scope,
+         "token_type" => "Bearer"
+       } = json_response_and_validate_schema(conn, 200)
+       token_from_db = Repo.get_by(Token, token: token)
+       assert token_from_db
+       token_from_db = Repo.preload(token_from_db, :user)
+       assert token_from_db.user
+       assert token_from_db.user.approval_pending
+       assert token_from_db.user.registration_reason == "I'm a cool dude, bro"
+     end
      test "returns error when user already registred", %{conn: conn, valid_params: valid_params} do
        _user = insert(:user, email: "lain@example.org")
        app_token = insert(:oauth_token, user: nil)
          assert token_from_db
          token_from_db = Repo.preload(token_from_db, :user)
          assert token_from_db.user
 -
 -        assert token_from_db.user.confirmation_pending
        end
  
        conn =