diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/repo_test.exs | 44 | ||||
| -rw-r--r-- | test/web/oauth/oauth_controller_test.exs | 196 | 
2 files changed, 240 insertions, 0 deletions
| diff --git a/test/repo_test.exs b/test/repo_test.exs new file mode 100644 index 000000000..5382289c7 --- /dev/null +++ b/test/repo_test.exs @@ -0,0 +1,44 @@ +defmodule Pleroma.RepoTest do +  use Pleroma.DataCase +  import Pleroma.Factory + +  describe "find_resource/1" do +    test "returns user" do +      user = insert(:user) +      query = from(t in Pleroma.User, where: t.id == ^user.id) +      assert Repo.find_resource(query) == {:ok, user} +    end + +    test "returns not_found" do +      query = from(t in Pleroma.User, where: t.id == ^"9gBuXNpD2NyDmmxxdw") +      assert Repo.find_resource(query) == {:error, :not_found} +    end +  end + +  describe "get_assoc/2" do +    test "get assoc from preloaded data" do +      user = %Pleroma.User{name: "Agent Smith"} +      token = %Pleroma.Web.OAuth.Token{insert(:oauth_token) | user: user} +      assert Repo.get_assoc(token, :user) == {:ok, user} +    end + +    test "get one-to-one assoc from repo" do +      user = insert(:user, name: "Jimi Hendrix") +      token = refresh_record(insert(:oauth_token, user: user)) + +      assert Repo.get_assoc(token, :user) == {:ok, user} +    end + +    test "get one-to-many assoc from repo" do +      user = insert(:user) +      notification = refresh_record(insert(:notification, user: user)) + +      assert Repo.get_assoc(user, :notifications) == {:ok, [notification]} +    end + +    test "return error if has not assoc " do +      token = insert(:oauth_token, user: nil) +      assert Repo.get_assoc(token, :user) == {:error, :not_found} +    end +  end +end diff --git a/test/web/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs index 6e96537ec..cb6836983 100644 --- a/test/web/oauth/oauth_controller_test.exs +++ b/test/web/oauth/oauth_controller_test.exs @@ -12,6 +12,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do    alias Pleroma.Web.OAuth.Authorization    alias Pleroma.Web.OAuth.Token +  @oauth_config_path [:oauth2, :issue_new_refresh_token]    @session_opts [      store: :cookie,      key: "_test", @@ -714,4 +715,199 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        refute Map.has_key?(resp, "access_token")      end    end + +  describe "POST /oauth/token - refresh token" do +    setup do +      oauth_token_config = Pleroma.Config.get(@oauth_config_path) + +      on_exit(fn -> +        Pleroma.Config.get(@oauth_config_path, oauth_token_config) +      end) +    end + +    test "issues a new access token with keep fresh token" do +      Pleroma.Config.put(@oauth_config_path, true) +      user = insert(:user) +      app = insert(:oauth_app, scopes: ["read", "write"]) + +      {:ok, auth} = Authorization.create_authorization(app, user, ["write"]) +      {:ok, token} = Token.exchange_token(app, auth) + +      response = +        build_conn() +        |> post("/oauth/token", %{ +          "grant_type" => "refresh_token", +          "refresh_token" => token.refresh_token, +          "client_id" => app.client_id, +          "client_secret" => app.client_secret +        }) +        |> json_response(200) + +      ap_id = user.ap_id + +      assert match?( +               %{ +                 "scope" => "write", +                 "token_type" => "Bearer", +                 "expires_in" => 600, +                 "access_token" => _, +                 "refresh_token" => _, +                 "me" => ^ap_id +               }, +               response +             ) + +      refute Repo.get_by(Token, token: token.token) +      new_token = Repo.get_by(Token, token: response["access_token"]) +      assert new_token.refresh_token == token.refresh_token +      assert new_token.scopes == auth.scopes +      assert new_token.user_id == user.id +      assert new_token.app_id == app.id +    end + +    test "issues a new access token with new fresh token" do +      Pleroma.Config.put(@oauth_config_path, false) +      user = insert(:user) +      app = insert(:oauth_app, scopes: ["read", "write"]) + +      {:ok, auth} = Authorization.create_authorization(app, user, ["write"]) +      {:ok, token} = Token.exchange_token(app, auth) + +      response = +        build_conn() +        |> post("/oauth/token", %{ +          "grant_type" => "refresh_token", +          "refresh_token" => token.refresh_token, +          "client_id" => app.client_id, +          "client_secret" => app.client_secret +        }) +        |> json_response(200) + +      ap_id = user.ap_id + +      assert match?( +               %{ +                 "scope" => "write", +                 "token_type" => "Bearer", +                 "expires_in" => 600, +                 "access_token" => _, +                 "refresh_token" => _, +                 "me" => ^ap_id +               }, +               response +             ) + +      refute Repo.get_by(Token, token: token.token) +      new_token = Repo.get_by(Token, token: response["access_token"]) +      refute new_token.refresh_token == token.refresh_token +      assert new_token.scopes == auth.scopes +      assert new_token.user_id == user.id +      assert new_token.app_id == app.id +    end + +    test "returns 400 if we try use access token" do +      user = insert(:user) +      app = insert(:oauth_app, scopes: ["read", "write"]) + +      {:ok, auth} = Authorization.create_authorization(app, user, ["write"]) +      {:ok, token} = Token.exchange_token(app, auth) + +      response = +        build_conn() +        |> post("/oauth/token", %{ +          "grant_type" => "refresh_token", +          "refresh_token" => token.token, +          "client_id" => app.client_id, +          "client_secret" => app.client_secret +        }) +        |> json_response(400) + +      assert %{"error" => "Invalid credentials"} == response +    end + +    test "returns 400 if refresh_token invalid" do +      app = insert(:oauth_app, scopes: ["read", "write"]) + +      response = +        build_conn() +        |> post("/oauth/token", %{ +          "grant_type" => "refresh_token", +          "refresh_token" => "token.refresh_token", +          "client_id" => app.client_id, +          "client_secret" => app.client_secret +        }) +        |> json_response(400) + +      assert %{"error" => "Invalid credentials"} == response +    end + +    test "issues a new token if token expired" do +      user = insert(:user) +      app = insert(:oauth_app, scopes: ["read", "write"]) + +      {:ok, auth} = Authorization.create_authorization(app, user, ["write"]) +      {:ok, token} = Token.exchange_token(app, auth) + +      change = +        Ecto.Changeset.change( +          token, +          %{valid_until: NaiveDateTime.add(NaiveDateTime.utc_now(), -86_400 * 30)} +        ) + +      {:ok, access_token} = Repo.update(change) + +      response = +        build_conn() +        |> post("/oauth/token", %{ +          "grant_type" => "refresh_token", +          "refresh_token" => access_token.refresh_token, +          "client_id" => app.client_id, +          "client_secret" => app.client_secret +        }) +        |> json_response(200) + +      ap_id = user.ap_id + +      assert match?( +               %{ +                 "scope" => "write", +                 "token_type" => "Bearer", +                 "expires_in" => 600, +                 "access_token" => _, +                 "refresh_token" => _, +                 "me" => ^ap_id +               }, +               response +             ) + +      refute Repo.get_by(Token, token: token.token) +      token = Repo.get_by(Token, token: response["access_token"]) +      assert token +      assert token.scopes == auth.scopes +      assert token.user_id == user.id +      assert token.app_id == app.id +    end +  end + +  describe "POST /oauth/token - bad request" do +    test "returns 500" do +      response = +        build_conn() +        |> post("/oauth/token", %{}) +        |> json_response(500) + +      assert %{"error" => "Bad request"} == response +    end +  end + +  describe "POST /oauth/revoke - bad request" do +    test "returns 500" do +      response = +        build_conn() +        |> post("/oauth/revoke", %{}) +        |> json_response(500) + +      assert %{"error" => "Bad request"} == response +    end +  end  end | 
