Skip to content

Commit

Permalink
fix: prevent setting shuttle to inactive when in use
Browse files Browse the repository at this point in the history
  • Loading branch information
lemald committed Feb 27, 2025
1 parent 4cf52c1 commit 3d318a1
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 1 deletion.
23 changes: 22 additions & 1 deletion lib/arrow/shuttles/shuttle.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ defmodule Arrow.Shuttles.Shuttle do
@moduledoc "schema for a shuttle for the db"
use Ecto.Schema
import Ecto.Changeset
import Ecto.Query

alias Arrow.Disruptions.ReplacementService
alias Arrow.Repo

@type id :: integer
@type t :: %__MODULE__{
Expand Down Expand Up @@ -59,7 +63,24 @@ defmodule Arrow.Shuttles.Shuttle do
end

_ ->
changeset
id = get_field(changeset, :id)

replacement_services =
if is_nil(id) do
[]
else
Repo.all(from r in ReplacementService, where: r.shuttle_id == ^id)
end

if length(replacement_services) > 0 do
add_error(
changeset,
:status,
"cannot set to a non-active status while in use as a replacement servie"
)
else
changeset
end
end
end

Expand Down
114 changes: 114 additions & 0 deletions test/arrow/shuttle/shuttle_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -121,5 +121,119 @@ defmodule Arrow.Shuttles.ShuttleTest do

assert %Ecto.Changeset{valid?: true} = changeset
end

test "cannot mark a shuttle as inactive when in use by a replacement service" do
shuttle = shuttle_fixture()
[route0, route1] = shuttle.routes

[stop1, stop2, stop3, stop4] = insert_list(4, :gtfs_stop)

route0
|> Arrow.Shuttles.Route.changeset(%{
"route_stops" => [
%{
"direction_id" => "0",
"stop_sequence" => "1",
"display_stop_id" => stop1.id,
"time_to_next_stop" => 30.0
},
%{
"direction_id" => "0",
"stop_sequence" => "2",
"display_stop_id" => stop2.id
}
]
})
|> Arrow.Repo.update()

route1
|> Arrow.Shuttles.Route.changeset(%{
"route_stops" => [
%{
"direction_id" => "1",
"stop_sequence" => "1",
"display_stop_id" => stop3.id,
"time_to_next_stop" => 30.0
},
%{
"direction_id" => "0",
"stop_sequence" => "2",
"display_stop_id" => stop4.id
}
]
})
|> Arrow.Repo.update()

{:ok, shuttle} =
shuttle.id
|> Arrow.Shuttles.get_shuttle!()
|> Shuttle.changeset(%{status: :active})
|> Arrow.Repo.update()

insert(:replacement_service, shuttle: shuttle)

changeset = Shuttle.changeset(shuttle, %{status: :draft})

assert %Ecto.Changeset{
valid?: false,
errors: [
status:
{"cannot set to a non-active status while in use as a replacement servie", []}
]
} = changeset
end

test "can mark a shuttle as inactive when not in use by a replacement service" do
shuttle = shuttle_fixture()
[route0, route1] = shuttle.routes

[stop1, stop2, stop3, stop4] = insert_list(4, :gtfs_stop)

route0
|> Arrow.Shuttles.Route.changeset(%{
"route_stops" => [
%{
"direction_id" => "0",
"stop_sequence" => "1",
"display_stop_id" => stop1.id,
"time_to_next_stop" => 30.0
},
%{
"direction_id" => "0",
"stop_sequence" => "2",
"display_stop_id" => stop2.id
}
]
})
|> Arrow.Repo.update()

route1
|> Arrow.Shuttles.Route.changeset(%{
"route_stops" => [
%{
"direction_id" => "1",
"stop_sequence" => "1",
"display_stop_id" => stop3.id,
"time_to_next_stop" => 30.0
},
%{
"direction_id" => "0",
"stop_sequence" => "2",
"display_stop_id" => stop4.id
}
]
})
|> Arrow.Repo.update()

{:ok, shuttle} =
shuttle.id
|> Arrow.Shuttles.get_shuttle!()
|> Shuttle.changeset(%{status: :active})
|> Arrow.Repo.update()

changeset = Shuttle.changeset(shuttle, %{status: :draft})

assert %Ecto.Changeset{valid?: true} = changeset
end
end
end

0 comments on commit 3d318a1

Please sign in to comment.