From 21e5aa6437fdcce7a176a609ee302a14ee78757f Mon Sep 17 00:00:00 2001 From: snewcomer24 Date: Wed, 20 Dec 2017 07:42:50 -0800 Subject: [PATCH] Add active filter --- lib/code_corps/messages/conversation_query.ex | 28 +++++++++++++------ lib/code_corps/messages/messages.ex | 1 + .../messages/conversation_query_test.exs | 23 +++++++++++++++ .../lib/code_corps/messages/messages_test.exs | 8 +++--- 4 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 test/lib/code_corps/messages/conversation_query_test.exs diff --git a/lib/code_corps/messages/conversation_query.ex b/lib/code_corps/messages/conversation_query.ex index 95fdc5e22..b2363708f 100644 --- a/lib/code_corps/messages/conversation_query.ex +++ b/lib/code_corps/messages/conversation_query.ex @@ -33,16 +33,16 @@ defmodule CodeCorps.Messages.ConversationQuery do @doc ~S""" - Narrows down a `CodeCorps.Conversation` query to return only those records - considered to have a specific status. + Filters `CodeCorps.Conversation` record queries to return only those + considered to be active. - The status of `active` means that only those records are included which either - - belong to a `CodeCorps.Message` initiated by user - - belong to a `CodeCorps.Message` initiated by admin, with at least a single - reply in the form of a `CodeCorps.ConversationPart` + Active conversations belong either: + - to a `CodeCorps.Message` initiated by user + - to a `CodeCorps.Message` initiated by an admin, with at least a single + conversation part """ - @spec status_filter(Queryable.t, map) :: Queryable.t - def status_filter(queryable, %{"status" => "active"}) do + @spec active_filter(Queryable.t, map) :: Queryable.t + def active_filter(queryable, %{"active" => true}) do prefiltered_ids = queryable |> select([c], c.id) |> Repo.all Conversation @@ -53,5 +53,15 @@ defmodule CodeCorps.Messages.ConversationQuery do |> having([_c, m, _cp], m.initiated_by == "user") |> or_having([c, m, cp], m.initiated_by == "admin" and count(cp.id) > 0) end - def status_filter(query, %{}), do: query + def active_filter(query, %{}), do: query + + @doc ~S""" + Filters `CodeCorps.Conversation` record queries by their status. + """ + @spec status_filter(Queryable.t, map) :: Queryable.t + def status_filter(queryable, %{"status" => status}) do + queryable + |> where([c], c.status == ^status) + end + def status_filter(query, _), do: query end diff --git a/lib/code_corps/messages/messages.ex b/lib/code_corps/messages/messages.ex index 0b9decdfa..23353a98e 100644 --- a/lib/code_corps/messages/messages.ex +++ b/lib/code_corps/messages/messages.ex @@ -30,6 +30,7 @@ defmodule CodeCorps.Messages do def list_conversations(scope, %{} = params) do scope |> Messages.ConversationQuery.project_filter(params) + |> Messages.ConversationQuery.active_filter(params) |> Messages.ConversationQuery.status_filter(params) |> Messages.ConversationQuery.user_filter(params) |> Repo.all() diff --git a/test/lib/code_corps/messages/conversation_query_test.exs b/test/lib/code_corps/messages/conversation_query_test.exs new file mode 100644 index 000000000..722f47561 --- /dev/null +++ b/test/lib/code_corps/messages/conversation_query_test.exs @@ -0,0 +1,23 @@ +defmodule CodeCorps.Messages.ConversationQueryTest do + use CodeCorps.DbAccessCase + + alias CodeCorps.{ + Conversation, + Messages.ConversationQuery, + Repo + } + + describe "status_filter/2" do + test "filters by status" do + open_conversation = insert(:conversation, status: "open") + _closed_conversation = insert(:conversation, status: "closed") + + [result] = + Conversation + |> ConversationQuery.status_filter(%{"status" => "open"}) + |> Repo.all() + + assert result.id == open_conversation.id + end + end +end diff --git a/test/lib/code_corps/messages/messages_test.exs b/test/lib/code_corps/messages/messages_test.exs index 83c9d9399..98a051640 100644 --- a/test/lib/code_corps/messages/messages_test.exs +++ b/test/lib/code_corps/messages/messages_test.exs @@ -115,7 +115,7 @@ defmodule CodeCorps.MessagesTest do result_ids = Conversation - |> Messages.list_conversations(%{"status" => "active"}) + |> Messages.list_conversations(%{"active" => true}) |> get_and_sort_ids() refute conversation_started_by_admin_without_reply.id in result_ids @@ -125,7 +125,7 @@ defmodule CodeCorps.MessagesTest do result_ids = Conversation - |> Messages.list_conversations(%{"status" => "any"}) + |> Messages.list_conversations(%{"status" => "open"}) |> get_and_sort_ids() assert conversation_started_by_admin_without_reply.id in result_ids @@ -192,7 +192,7 @@ defmodule CodeCorps.MessagesTest do conversation: other_conversation_started_by_admin_with_reply ) - params = %{"status" => "active", "project_id" => project_1.id} + params = %{"active" => true, "project_id" => project_1.id} result_ids = Conversation |> Messages.list_conversations(params) @@ -208,7 +208,7 @@ defmodule CodeCorps.MessagesTest do # project refute other_conversation_started_by_admin_with_reply.id in result_ids - params = %{"status" => "active", "project_id" => project_2.id} + params = %{"active" => true, "project_id" => project_2.id} result_ids = Conversation |> Messages.list_conversations(params)