diff --git a/lib/bike_brigade/delivery.ex b/lib/bike_brigade/delivery.ex index 0e921ded..1225320d 100644 --- a/lib/bike_brigade/delivery.ex +++ b/lib/bike_brigade/delivery.ex @@ -311,6 +311,24 @@ defmodule BikeBrigade.Delivery do |> Repo.preload([:program, :tasks]) end + @doc """ + Returns campaigns whose delivery window ended within the given time range. + + ## Parameters + - `from_datetime` - Start of the time window (inclusive) + - `to_datetime` - End of the time window (inclusive) + """ + def list_campaigns_ended_between(from_utc_datetime, to_utc_datetime) do + query = + from c in Campaign, + where: + c.delivery_end >= ^from_utc_datetime and + c.delivery_end <= ^to_utc_datetime, + select: c + + Repo.all(query) + end + @doc """ Fetches how many open vs filled tasks there are (optionally, by week) and groups them by campaign ID. diff --git a/test/bike_brigade/delivery_test.exs b/test/bike_brigade/delivery_test.exs index 33d4d05a..0fe218c4 100644 --- a/test/bike_brigade/delivery_test.exs +++ b/test/bike_brigade/delivery_test.exs @@ -345,5 +345,39 @@ defmodule BikeBrigade.DeliveryTest do end end + describe "list_campaigns_ended_between/2" do + setup do + now = get_utc_now() + + campaign = + fixture(:campaign, %{ + delivery_start: NaiveDateTime.add(now, -7, :hour), + delivery_end: NaiveDateTime.add(now, -1, :hour) + }) + + %{campaign: campaign, now: now} + end + + test "returns a campaign available in the given window", %{ + campaign: campaign, + now: now + } do + from_datetime = NaiveDateTime.add(now, -75, :minute) + to_datetime = NaiveDateTime.add(now, -60, :minute) + + [ended_campaign] = Delivery.list_campaigns_ended_between(from_datetime, to_datetime) + assert campaign.id == ended_campaign.id + end + + test "returns no campaign in the given window", %{now: now} do + from_datetime = NaiveDateTime.add(now, -45, :minute) + to_datetime = NaiveDateTime.add(now, -30, :minute) + + assert [] == Delivery.list_campaigns_ended_between(from_datetime, to_datetime) + end + end + def item_name(%Task{task_items: [%{item: %{name: item_name}}]}), do: item_name + + defp get_utc_now(), do: NaiveDateTime.utc_now() end