test/openagents_web/controllers/forge_user_controller_test.exs

main at 58e6347eeb72 · 1 KB

defmodule OpenAgentsWeb.ForgeUserControllerTest do
  use OpenAgentsWeb.ConnCase, async: false

  alias OpenAgents.{Accounts, ApiTokens, GitHubOAuth}

  setup {Req.Test, :verify_on_exit!}

  setup do
    original = Application.get_env(:openagents, :github_api)

    Application.put_env(:openagents, :github_api,
      base_url: "https://github-api.internal",
      request_options: [plug: {Req.Test, __MODULE__}]
    )

    on_exit(fn -> Application.put_env(:openagents, :github_api, original) end)
    :ok
  end

  test "GET /api/v1/user returns the GitHub identity and eligible namespaces", %{conn: conn} do
    user = github_user("forge-user", "octavia")

    {:ok, user} =
      Accounts.store_github_token(user, "github-token", GitHubOAuth.required_scopes())

    {:ok, _token, plaintext} =
      ApiTokens.create(user, %{name: "CLI status", scopes: ["forge:write"]})

    Req.Test.expect(__MODULE__, fn github_conn ->
      case github_conn.request_path do
        "/user/memberships/orgs" ->
          Req.Test.json(github_conn, [])

        path ->
          raise "unexpected GitHub path: #{path}"
      end
    end)

    response =
      conn
      |> put_req_header("authorization", "Bearer " <> plaintext)
      |> get(~p"/api/v1/user")

    assert %{
             "id" => github_id,
             "login" => "octavia",
             "namespaces" => [
               %{"id" => namespace_id, "login" => "octavia", "type" => "user"}
             ],
             "token_expires_at" => token_expires_at
           } = json_response(response, 200)

    assert github_id == user.github_id
    assert namespace_id == user.github_id
    assert {:ok, _date_time, 0} = DateTime.from_iso8601(token_expires_at)
    assert get_resp_header(response, "cache-control") == ["no-store"]
  end

  test "GET /api/v1/user requires a bearer token", %{conn: conn} do
    assert %{"error" => "invalid_api_token"} =
             conn
             |> get(~p"/api/v1/user")
             |> json_response(401)
  end
end