test/openagents_web/controllers/atif_export_controller_test.exs

main at 58e6347eeb72 · 2 KB

defmodule OpenAgentsWeb.AtifExportControllerTest do
  use OpenAgentsWeb.ConnCase, async: false
  import Phoenix.LiveViewTest

  alias OpenAgents.Conversations.Visitor
  alias OpenAgents.{Conversations, Repo}

  test "the account owner downloads one ATIF v1.7 attachment for the conversation", %{
    conn: conn
  } do
    token = "atif-export-owner-browser-credential-0000000000000"
    user = github_user(token)
    {:ok, conversation} = Conversations.ensure_conversation(user)

    Repo.insert!(%OpenAgents.Conversations.Message{
      conversation_id: conversation.id,
      role: "user",
      content: "Export me as a trajectory.",
      status: "complete"
    })

    Repo.insert!(%OpenAgents.Conversations.Message{
      conversation_id: conversation.id,
      role: "assistant",
      content: "One trajectory, coming up.",
      status: "complete"
    })

    conn =
      conn
      |> log_in_github_user(token)
      |> get(~p"/data/export/atif")

    assert get_resp_header(conn, "cache-control") == ["no-store"]
    assert [disposition] = get_resp_header(conn, "content-disposition")
    assert disposition =~ "attachment"
    assert disposition =~ "sarah-conversation-#{conversation.id}-atif.json"

    export = json_response(conn, 200)
    assert export["schema_version"] == "ATIF-v1.7"
    assert export["session_id"] == conversation.id
    assert export["trajectory_id"] == conversation.id
    assert export["agent"]["name"] == "simply-sarah"

    # Sarah's seeded greeting opens the conversation, then the two inserts.
    assert [
             %{"step_id" => 1, "source" => "agent"},
             %{"step_id" => 2, "source" => "user", "message" => "Export me as a trajectory."},
             %{"step_id" => 3, "source" => "agent", "message" => "One trajectory, coming up."}
           ] = export["steps"]

    assert export["final_metrics"]["total_steps"] == 3
  end

  test "an anonymous request redirects before any data loads", %{conn: conn} do
    response = get(conn, ~p"/data/export/atif")

    assert redirected_to(response) == ~p"/"
    assert Repo.aggregate(Visitor, :count) == 0
  end

  test "the chat command bar carries the export chip as a download link", %{conn: conn} do
    conn = log_in_github_user(conn, "atif-export-chip-browser")
    assert {:ok, view, _html} = live(conn, ~p"/sarah")

    assert has_element?(view, ~s(a#export-atif[href="/data/export/atif"][download]))
  end
end