From 8a76966062fcd60265acbe0e3fca46535980dc85 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 16 Feb 2022 18:13:29 +0100 Subject: [PATCH] Add more steps from the book but with additoinal tests --- issues/lib/issues/cli.ex | 13 +++++++++++++ issues/test/cli_test.exs | 25 ++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/issues/lib/issues/cli.ex b/issues/lib/issues/cli.ex index d6d88d3..52c9c67 100644 --- a/issues/lib/issues/cli.ex +++ b/issues/lib/issues/cli.ex @@ -51,6 +51,8 @@ defmodule Issues.CLI do def process({user, project, count}) do Issues.GithubIssues.fetch(user, project) |> decode_response() + |> sort_into_descending_order + |> last(count) end def decode_response({:ok, body}), do: body @@ -58,4 +60,15 @@ defmodule Issues.CLI do IO.puts "Error fetching from Github: #{error["message"]}" System.halt(2) end + + def sort_into_descending_order(list_of_issues) do + list_of_issues + |> Enum.sort(fn lhs, rhs -> Map.get(lhs, "created_at") >= Map.get(rhs, "created_at") end) + end + + def last(list, count) do + list + |> Enum.take(count) + |> Enum.reverse + end end diff --git a/issues/test/cli_test.exs b/issues/test/cli_test.exs index 5d4652c..952aa2a 100644 --- a/issues/test/cli_test.exs +++ b/issues/test/cli_test.exs @@ -2,7 +2,12 @@ defmodule CliTest do use ExUnit.Case doctest Issues - import Issues.CLI, only: [parse_args: 1] + import Issues.CLI, + only: [ + parse_args: 1, + sort_into_descending_order: 1, + last: 2 + ] test ":help returned by option parsing the -h and --help options" do assert parse_args(["-h", "anything"]) == :help @@ -16,4 +21,22 @@ defmodule CliTest do test "two values and default count returned if two values given" do assert parse_args(["user", "project"]) == {"user", "project", 4} end + + test "sort descending orders the correct way" do + result = sort_into_descending_order(fake_created_at_list(["c", "a", "b"])) + issues = for issue <- result, do: Map.get(issue, "created_at") + assert issues == ~w{ c b a } + end + + defp fake_created_at_list(values) do + for value <- values, do: %{"created_at" => value, "other_data" => "xxx"} + end + + test "fetch the last two elements of a list" do + list = [1,2,3,4,5] + count = 2 + expected = [2, 1] + result = last(list, count) + assert expected == result + end end