test/openagents_web/live/issue_new_live_test.exs

main at 58e6347eeb72 · 4 KB

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

  import Phoenix.LiveViewTest
  import OpenAgents.LabelsFixtures
  import OpenAgents.MilestonesFixtures

  alias OpenAgents.Issues

  setup %{conn: conn} do
    {:ok, conn: log_in_repository_user(conn, "issue-new", repository())}
  end

  test "mounts with an empty form and a cancel link back to the list", %{conn: conn} do
    {:ok, view, html} = live(conn, ~p"/OpenAgentsInc/openagents.com/issues/new")

    assert html =~ "New issue"
    assert has_element?(view, "#new-issue-form")
    assert has_element?(view, "#issue_title")
    assert has_element?(view, "#issue_body")
    assert has_element?(view, ~s{a[href="/OpenAgentsInc/openagents.com/issues"]}, "Cancel")
  end

  test "the milestone and label selects offer the seeded records", %{conn: conn} do
    milestone = milestone_fixture(repository(), %{title: "v1.0", due_on: nil})
    label_fixture(repository(), %{name: "bug", color: "d73a4a"})

    {:ok, view, _html} = live(conn, ~p"/OpenAgentsInc/openagents.com/issues/new")

    assert has_element?(view, ~s{#issue_milestone option[value="#{milestone.number}"]}, "v1.0")
    assert has_element?(view, ~s{#issue_labels option[value="bug"]}, "bug")
    assert has_element?(view, ~s{#issue_milestone option[value=""]}, "Select a milestone")
  end

  test "with no milestones or labels the selects render only the prompt", %{conn: conn} do
    {:ok, view, _html} = live(conn, ~p"/OpenAgentsInc/openagents.com/issues/new")

    assert has_element?(view, "#issue_milestone")
    refute has_element?(view, ~s{#issue_labels option})
  end

  test "submitting a title creates the issue and navigates to it", %{conn: conn} do
    {:ok, view, _html} = live(conn, ~p"/OpenAgentsInc/openagents.com/issues/new")

    result =
      view
      |> form("#new-issue-form", issue: %{title: "Add a runbook", body: "Please"})
      |> render_submit()

    assert [issue] = Issues.list_issues(repository())
    assert issue.title == "Add a runbook"
    assert issue.body == "Please"

    {:ok, _show, html} =
      follow_redirect(result, conn, ~p"/OpenAgentsInc/openagents.com/issues/#{issue.number}")

    assert html =~ "Issue created"
    assert html =~ "Add a runbook"
  end

  test "a submitted label and milestone are applied to the new issue", %{conn: conn} do
    milestone = milestone_fixture(repository(), %{title: "v1.0", due_on: nil})
    label_fixture(repository(), %{name: "bug", color: "d73a4a"})

    {:ok, view, _html} = live(conn, ~p"/OpenAgentsInc/openagents.com/issues/new")

    assert {:error, {:live_redirect, _}} =
             view
             |> form("#new-issue-form",
               issue: %{
                 title: "Tagged",
                 body: "",
                 milestone: to_string(milestone.number),
                 labels: ["bug"]
               }
             )
             |> render_submit()

    assert [issue] = Issues.list_issues(repository())
    assert [%{"name" => "bug", "color" => "d73a4a"}] = issue.labels
    assert issue.milestone["title"] == "v1.0"
    assert issue.milestone["number"] == milestone.number
  end

  test "an empty label and milestone selection leaves the issue bare", %{conn: conn} do
    label_fixture(repository(), %{name: "bug", color: "d73a4a"})

    {:ok, view, _html} = live(conn, ~p"/OpenAgentsInc/openagents.com/issues/new")

    assert {:error, {:live_redirect, _}} =
             view
             |> form("#new-issue-form",
               issue: %{title: "Bare", body: "", milestone: "", labels: []}
             )
             |> render_submit()

    assert [issue] = Issues.list_issues(repository())
    assert issue.labels == []
    assert issue.milestone == nil
  end

  test "a blank title re-renders the form with an error and creates nothing", %{conn: conn} do
    {:ok, view, _html} = live(conn, ~p"/OpenAgentsInc/openagents.com/issues/new")

    html =
      view
      |> form("#new-issue-form", issue: %{title: "", body: "no title"})
      |> render_submit()

    assert html =~ "can't be blank"
    assert has_element?(view, "#new-issue-form")
    assert Issues.list_issues(repository(), state: "all") == []
  end

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