test/openagents_web/controllers/comment_controller_test.exs

58e6347eeb72 · 3 KB

defmodule OpenAgentsWeb.CommentControllerTest do
  use OpenAgentsWeb.ConnCase

  setup %{conn: conn}, do: {:ok, conn: put_forge_api_token(conn, "comments", repository())}

  alias OpenAgents.Issues
  alias OpenAgents.Agents

  setup do
    {:ok, issue} = Issues.create_issue(repository(), %{title: "Comment target"})
    %{issue: issue}
  end

  test "GET /api/v1/repos/:owner/:repo/issues/:issue_number/comments lists comments", %{
    conn: conn,
    issue: issue
  } do
    Issues.create_comment(%{issue_id: issue.id, body: "First comment"})

    conn =
      get(conn, ~p"/api/v1/repos/OpenAgentsInc/openagents.com/issues/#{issue.number}/comments")

    assert %{"comments" => [comment]} = json_response(conn, 200)
    assert comment["body"] == "First comment"
  end

  test "POST /api/v1/repos/:owner/:repo/issues/:issue_number/comments creates a comment", %{
    conn: conn,
    issue: issue
  } do
    conn =
      post(
        conn,
        ~p"/api/v1/repos/OpenAgentsInc/openagents.com/issues/#{issue.number}/comments",
        %{
          body: "New comment"
        }
      )

    assert %{"body" => "New comment"} = json_response(conn, 201)
  end

  test "an unlinked agent can create a comment with an agent author", %{
    conn: conn,
    issue: issue
  } do
    {:ok, _agent, credential} =
      Agents.register(%{
        handle: "comment-agent",
        display_name: "Comment agent",
        registration_ip: "192.0.2.51"
      })

    conn =
      conn
      |> put_req_header("authorization", "Bearer #{credential}")
      |> post(
        ~p"/api/v1/repos/OpenAgentsInc/openagents.com/issues/#{issue.number}/comments",
        %{body: "Agent comment"}
      )

    assert %{"body" => "Agent comment", "user" => %{"agent" => true, "handle" => "comment-agent"}} =
             json_response(conn, 201)
  end

  test "GET /api/v1/repos/:owner/:repo/issues/comments/:id returns a comment", %{
    conn: conn,
    issue: issue
  } do
    {:ok, comment} = Issues.create_comment(%{issue_id: issue.id, body: "Show me"})

    conn =
      get(conn, ~p"/api/v1/repos/OpenAgentsInc/openagents.com/issues/comments/#{comment.id}")

    assert %{"body" => "Show me"} = json_response(conn, 200)
  end

  test "PATCH /api/v1/repos/:owner/:repo/issues/comments/:id updates a comment", %{
    conn: conn,
    issue: issue
  } do
    {:ok, comment} = Issues.create_comment(%{issue_id: issue.id, body: "Before"})

    conn =
      patch(conn, ~p"/api/v1/repos/OpenAgentsInc/openagents.com/issues/comments/#{comment.id}", %{
        body: "After"
      })

    assert %{"body" => "After"} = json_response(conn, 200)
  end

  test "DELETE /api/v1/repos/:owner/:repo/issues/comments/:id removes a comment", %{
    conn: conn,
    issue: issue
  } do
    {:ok, comment} = Issues.create_comment(%{issue_id: issue.id, body: "Delete me"})

    conn =
      delete(conn, ~p"/api/v1/repos/OpenAgentsInc/openagents.com/issues/comments/#{comment.id}")

    assert response(conn, 204)
  end

  defp repository do
    OpenAgents.Repositories.get_by_path!("OpenAgentsInc", "openagents.com")
  end
end