test/openagents/issues_aggregates_test.exs

58e6347eeb72 · 3 KB

defmodule OpenAgents.IssuesAggregatesTest do
  @moduledoc """
  The counts the assignee and milestone indexes print (#159).

  Both pages measured a collection by loading it: every issue in the
  repository, in memory, once per visit. `93c3383` removed that read from the
  homepage, and a page that follows the issues it counts would pay it once per
  write instead. These are the grouped aggregates that replaced it.
  """

  use OpenAgents.DataCase

  import OpenAgents.AccountsFixtures

  alias OpenAgents.Issues
  alias OpenAgents.Milestones
  alias OpenAgents.Repositories

  setup do
    author = repository_user_fixture("issues-aggregate-author")
    helper = repository_user_fixture("issues-aggregate-helper")
    repository = repository_with_member_fixture(author)
    {:ok, _membership} = Repositories.add_member(repository, helper, "contributor")

    %{repository: repository, author: author, helper: helper}
  end

  describe "count_issues_by_assignee/1" do
    test "counts each login once per issue, most assigned first", context do
      %{author: author, helper: helper} = context

      {:ok, _one} =
        Issues.create_issue(
          context.repository,
          %{"title" => "One", "assignees" => [author.github_login, helper.github_login]},
          author
        )

      {:ok, _two} =
        Issues.create_issue(
          context.repository,
          %{"title" => "Two", "assignees" => [author.github_login]},
          author
        )

      assert [{first, 2}, {second, 1}] = Issues.count_issues_by_assignee(context.repository)
      assert first == author.github_login
      assert second == helper.github_login
    end

    test "counts closed issues too, and unassigned ones not at all", context do
      author = context.author

      {:ok, closed} =
        Issues.create_issue(
          context.repository,
          %{"title" => "Closed", "assignees" => [author.github_login]},
          author
        )

      {:ok, _} = Issues.update_issue(closed, %{"state" => "closed"}, author)
      {:ok, _unassigned} = Issues.create_issue(context.repository, %{"title" => "Nobody"}, author)

      assert [{login, 1}] = Issues.count_issues_by_assignee(context.repository)
      assert login == author.github_login
    end
  end

  describe "count_issues_by_milestone/1" do
    test "splits each milestone's issues by state", context do
      author = context.author

      {:ok, milestone} =
        Milestones.create_milestone(context.repository, %{"title" => "v1"}, author)

      {:ok, _open} =
        Issues.create_issue(
          context.repository,
          %{"title" => "Still open", "milestone" => milestone.number},
          author
        )

      {:ok, closed} =
        Issues.create_issue(
          context.repository,
          %{"title" => "Done", "milestone" => milestone.number},
          author
        )

      {:ok, _} = Issues.update_issue(closed, %{"state" => "closed"}, author)
      {:ok, _none} = Issues.create_issue(context.repository, %{"title" => "No milestone"}, author)

      counts = Issues.count_issues_by_milestone(context.repository)

      assert counts[milestone.number] == %{open: 1, closed: 1}
      assert map_size(counts) == 1
    end
  end

  describe "list_issue_options/1" do
    test "labels each issue by number and title, newest first", context do
      author = context.author
      {:ok, first} = Issues.create_issue(context.repository, %{"title" => "First"}, author)
      {:ok, second} = Issues.create_issue(context.repository, %{"title" => "Second"}, author)

      assert [{second_label, second_number}, {first_label, first_number}] =
               Issues.list_issue_options(context.repository)

      assert second_number == second.number
      assert second_label == "##{second.number} Second"
      assert first_number == first.number
      assert first_label == "##{first.number} First"
    end
  end
end