Skip to content

Commit

Permalink
feat(LiquidObjects): support reduced fares for the RIDE (#2134)
Browse files Browse the repository at this point in the history
* chore(LiquidObjectsTest): enable test to use mock

* feat(LiquidObjects): support reduced fares for the RIDE

This requires adjusting the logic for fetching The RIDE fares, which had assumed they were always reduced value and paid using senior cards... neither of which are true.
  • Loading branch information
thecristen authored Jul 30, 2024
1 parent 4e1b0e1 commit 4f9c439
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 14 deletions.
2 changes: 1 addition & 1 deletion lib/dotcom/content_rewriters/liquid_objects/fare.ex
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ defmodule Dotcom.ContentRewriters.LiquidObjects.Fare do
end

defp parse_token(value, good, bad) when value in @fare_ride do
{filter_insert(good, name: value, reduced: "senior_disabled"), bad}
{filter_insert(good, name: value), bad}
end

defp parse_token(value, good, bad) when value in @fare_media do
Expand Down
6 changes: 4 additions & 2 deletions lib/dotcom/content_rewriters/liquid_objects/route.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ defmodule Dotcom.ContentRewriters.LiquidObjects.Route do
"""

alias Routes.{Repo, Route}
alias Routes.Route

@routes_repo Application.compile_env!(:dotcom, :repo_modules)[:routes]

@type request_error :: {:error, {:empty | :unmatched, String.t()}}
@type request_tuple :: {:ok, String.t()}
Expand All @@ -23,7 +25,7 @@ defmodule Dotcom.ContentRewriters.LiquidObjects.Route do
defp compose_args(route), do: {:ok, route}

@spec request_route(request_tuple | request_error) :: Route.t() | request_error | nil
defp request_route({:ok, route}), do: Repo.get(route)
defp request_route({:ok, route}), do: @routes_repo.get(route)
defp request_route(error), do: error

@spec process_results(Route.t() | request_error | nil) :: {:ok, String.t()} | request_error
Expand Down
35 changes: 29 additions & 6 deletions lib/fares/fare_info.ex
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,13 @@ defmodule Fares.FareInfo do
day_pass_price: "11.00",
week_pass_price: "22.50"
},
%{mode: :the_ride, ada_ride: "3.35", premium_ride: "5.60"},
%{
mode: :the_ride,
ada_ride: "3.35",
ada_ride_reduced: "1.70",
premium_ride: "5.60",
premium_ride_reduced: "2.80"
},
# Logan Express Back Bay
%{mode: :massport_shuttle, name: "Massport-32511", single_trip: "3.00"},
# Logan Express Framingham
Expand Down Expand Up @@ -670,23 +676,40 @@ defmodule Fares.FareInfo do
fares ++ reduced_fares
end

def mapper(%{mode: :the_ride, ada_ride: ada_ride, premium_ride: premium_ride}) do
def mapper(%{
mode: :the_ride,
ada_ride: ada_ride,
premium_ride: premium_ride,
ada_ride_reduced: ada_ride_reduced,
premium_ride_reduced: premium_ride_reduced
}) do
[
%Fare{
mode: :the_ride,
name: :ada_ride,
media: [:senior_card],
reduced: :senior_disabled,
reduced: nil,
duration: :single_trip,
cents: dollars_to_cents(ada_ride)
},
%Fare{
mode: :the_ride,
name: :premium_ride,
media: [:senior_card],
reduced: :senior_disabled,
duration: :single_trip,
cents: dollars_to_cents(premium_ride)
},
%Fare{
mode: :the_ride,
name: :ada_ride,
reduced: :any,
duration: :single_trip,
cents: dollars_to_cents(ada_ride_reduced)
},
%Fare{
mode: :the_ride,
name: :premium_ride,
reduced: :any,
duration: :single_trip,
cents: dollars_to_cents(premium_ride_reduced)
}
]
end
Expand Down
14 changes: 12 additions & 2 deletions test/dotcom/content_rewriters/liquid_objects/fare_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,23 @@ defmodule Dotcom.ContentRewriters.LiquidObjects.FareTest do
test "it handles the ride fare requests" do
assert [
name: :ada_ride,
reduced: :senior_disabled,
reduced: nil,
duration: :single_trip
]
|> Repo.all()
|> fare_result() == "$3.35"

assert fare_request("subway:ada_ride") == {:ok, "$3.35"}
assert fare_request("ada_ride") == {:ok, "$3.35"}

assert [
name: :ada_ride,
reduced: :any,
duration: :single_trip
]
|> Repo.all()
|> fare_result() == "$1.70"

assert fare_request("ada_ride:reduced") == {:ok, "$1.70"}
end

test "it handles mticket fare requests" do
Expand Down
17 changes: 14 additions & 3 deletions test/dotcom/content_rewriters/liquid_objects_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ defmodule Dotcom.ContentRewriters.LiquidObjectsTest do
import Phoenix.HTML, only: [safe_to_string: 1]
import DotcomWeb.PartialView.SvgIconWithCircle, only: [svg_icon_with_circle: 1]
import DotcomWeb.ViewHelpers, only: [fa: 1, svg: 1]
import Mox

alias DotcomWeb.PartialView.SvgIconWithCircle
alias Fares.{Format, Repo}
alias Routes

@routes_repo Application.compile_env!(:dotcom, :repo_modules)[:routes]
setup :verify_on_exit!

describe "replace/1" do
test "it replaces fa- prefixed objects" do
Expand Down Expand Up @@ -62,6 +63,14 @@ defmodule Dotcom.ContentRewriters.LiquidObjectsTest do
assert replace(~s(fare:local_bus:cash)) == results |> List.first() |> Format.price()
end

test "it handles reduced fare requests for the RIDE" do
ada = replace(~s(fare:ada_ride))
ada_reduced = replace(~s(fare:ada_ride:reduced))
assert ada
assert ada_reduced
assert ada != ada_reduced
end

test "it handles bad fare requests" do
assert replace(~s(fare:spaceship)) ==
~s({{ fare:<span class="text-danger">spaceship</span> }})
Expand All @@ -70,9 +79,11 @@ defmodule Dotcom.ContentRewriters.LiquidObjectsTest do
~s({{ <span class="text-danger">missing mode/name</span> fare:cash }})
end

@tag :external
test "it handles route requests" do
assert replace(~s(route:83)) == "83" |> @routes_repo.get() |> Map.get(:long_name)
route_id = Faker.Internet.slug()
route_name = Faker.App.name()
expect(Routes.Repo.Mock, :get, fn ^route_id -> %Routes.Route{long_name: route_name} end)
assert replace(~s(route:#{route_id})) == route_name
end

test "it returns a liquid object when not otherwise handled" do
Expand Down

0 comments on commit 4f9c439

Please sign in to comment.