From a23b5c369c8385e5769202a30ef1aaf8ab624f5e Mon Sep 17 00:00:00 2001 From: Antoine Augusti Date: Wed, 2 Oct 2024 10:08:20 +0200 Subject: [PATCH] Backoffice : ajout bouton pour consolider BNZFE (#4236) --- .../transport/lib/jobs/consolidate_lez_job.ex | 3 +- ..._view.ex => start_consolidate_job_view.ex} | 14 +++-- .../templates/backoffice/page/index.html.heex | 22 ++++++- .../jobs/consolidate_lez_job_test.exs | 62 +++++++++++++++++++ 4 files changed, 94 insertions(+), 7 deletions(-) rename apps/transport/lib/transport_web/live/{start_consolidate_bnlc_view.ex => start_consolidate_job_view.ex} (85%) diff --git a/apps/transport/lib/jobs/consolidate_lez_job.ex b/apps/transport/lib/jobs/consolidate_lez_job.ex index 82842f7057..0c9563d4e9 100644 --- a/apps/transport/lib/jobs/consolidate_lez_job.ex +++ b/apps/transport/lib/jobs/consolidate_lez_job.ex @@ -45,8 +45,9 @@ defmodule Transport.Jobs.ConsolidateLEZsJob do } @impl Oban.Worker - def perform(%Oban.Job{}) do + def perform(%Oban.Job{id: job_id}) do consolidate() |> update_files() + Oban.Notifier.notify(Oban, :gossip, %{complete: job_id}) :ok end diff --git a/apps/transport/lib/transport_web/live/start_consolidate_bnlc_view.ex b/apps/transport/lib/transport_web/live/start_consolidate_job_view.ex similarity index 85% rename from apps/transport/lib/transport_web/live/start_consolidate_bnlc_view.ex rename to apps/transport/lib/transport_web/live/start_consolidate_job_view.ex index bd91c07593..9d89833f99 100644 --- a/apps/transport/lib/transport_web/live/start_consolidate_bnlc_view.ex +++ b/apps/transport/lib/transport_web/live/start_consolidate_job_view.ex @@ -1,4 +1,4 @@ -defmodule TransportWeb.Live.SendConsolidateBNLCView do +defmodule TransportWeb.Live.SendConsolidateJobView do # Very similar to `TransportWeb.Live.SendNowOnNAPNotificationView` use Phoenix.LiveView @button_disabled [:dispatched, :sent] @@ -13,7 +13,12 @@ defmodule TransportWeb.Live.SendConsolidateBNLCView do def mount( _params, - %{"button_texts" => button_texts, "button_default_class" => button_default_class, "job_args" => job_args}, + %{ + "button_texts" => button_texts, + "button_default_class" => button_default_class, + "job_module" => job_module, + "job_args" => job_args + }, socket ) do socket = @@ -21,6 +26,7 @@ defmodule TransportWeb.Live.SendConsolidateBNLCView do |> assign( button_texts: button_texts, button_default_class: button_default_class, + job_module: job_module, job_args: job_args ) |> assign_step(:first) @@ -33,9 +39,9 @@ defmodule TransportWeb.Live.SendConsolidateBNLCView do {:noreply, socket} end - def handle_info(:dispatch, %Phoenix.LiveView.Socket{assigns: %{job_args: job_args}} = socket) do + def handle_info(:dispatch, %Phoenix.LiveView.Socket{assigns: %{job_args: job_args, job_module: job_module}} = socket) do new_socket = - case job_args |> Transport.Jobs.ConsolidateBNLCJob.new() |> Oban.insert() do + case job_args |> job_module.new() |> Oban.insert() do {:ok, %Oban.Job{id: job_id}} -> send(self(), {:wait_for_completion, job_id}) assign_step(socket, :dispatched) diff --git a/apps/transport/lib/transport_web/templates/backoffice/page/index.html.heex b/apps/transport/lib/transport_web/templates/backoffice/page/index.html.heex index 93dbcbff88..f317da15ca 100644 --- a/apps/transport/lib/transport_web/templates/backoffice/page/index.html.heex +++ b/apps/transport/lib/transport_web/templates/backoffice/page/index.html.heex @@ -91,7 +91,7 @@

Consolidation BNLC

- <%= live_render(@conn, TransportWeb.Live.SendConsolidateBNLCView, + <%= live_render(@conn, TransportWeb.Live.SendConsolidateJobView, session: %{ "button_texts" => %{ sent: "Rapport disponible par e-mail", @@ -99,12 +99,13 @@ default: "🧪 Consolider à blanc" }, "button_default_class" => "button", + "job_module" => Transport.Jobs.ConsolidateBNLCJob, "job_args" => %{} } ) %>
- <%= live_render(@conn, TransportWeb.Live.SendConsolidateBNLCView, + <%= live_render(@conn, TransportWeb.Live.SendConsolidateJobView, session: %{ "button_texts" => %{ sent: "Fichier mis à jour et rapport envoyé", @@ -112,11 +113,28 @@ default: "📥 Consolider et remplacer sur data.gouv.fr" }, "button_default_class" => "button warning-light", + "job_module" => Transport.Jobs.ConsolidateBNLCJob, "job_args" => %{"action" => "datagouv_update"} } ) %>
+

Consolidation ZFE

+
+ <%= live_render(@conn, TransportWeb.Live.SendConsolidateJobView, + session: %{ + "button_texts" => %{ + sent: "Fichiers mis à jour", + dispatched: "Consolidation en cours", + default: "📥 Consolider et remplacer sur data.gouv.fr" + }, + "button_default_class" => "button warning-light", + "job_module" => Transport.Jobs.ConsolidateLEZsJob, + "job_args" => %{} + } + ) %> +
+

<%= dgettext("backoffice", "Validations") %>

<%= form_for @conn, backoffice_dataset_path(@conn, :force_validate_gtfs_transport), [class: "no-margin"], fn _f -> %> diff --git a/apps/transport/test/transport/jobs/consolidate_lez_job_test.exs b/apps/transport/test/transport/jobs/consolidate_lez_job_test.exs index 43c9e7a66f..6bae3507f1 100644 --- a/apps/transport/test/transport/jobs/consolidate_lez_job_test.exs +++ b/apps/transport/test/transport/jobs/consolidate_lez_job_test.exs @@ -1,5 +1,6 @@ defmodule Transport.Test.Transport.Jobs.ConsolidateLEZsJobTest do use ExUnit.Case, async: true + use Oban.Testing, repo: DB.Repo import DB.Factory import Mox alias Transport.Jobs.ConsolidateLEZsJob @@ -275,6 +276,67 @@ defmodule Transport.Test.Transport.Jobs.ConsolidateLEZsJobTest do refute File.exists?(ConsolidateLEZsJob.tmp_filepath("aires.geojson")) end + test "perform" do + aom = insert(:aom, siren: "253800825") + dataset = insert(:dataset, type: "low-emission-zones", aom: aom) + + zfe_aire = + insert(:resource, + dataset: dataset, + url: "https://example.com/aires.geojson", + schema_name: "etalab/schema-zfe" + ) + + zfe_voies = + insert(:resource, + dataset: dataset, + url: "https://example.com/voies.geojson", + schema_name: "etalab/schema-zfe" + ) + + resource_history_aire = + insert(:resource_history, + resource_id: zfe_aire.id, + payload: %{ + "permanent_url" => permanent_url_aires = "https://example.com/permanent_url/aires" + } + ) + + resource_history_voies = + insert(:resource_history, + resource_id: zfe_voies.id, + payload: %{ + "permanent_url" => permanent_url_voies = "https://example.com/permanent_url/voies" + } + ) + + insert(:multi_validation, resource_history_id: resource_history_aire.id, result: %{"has_errors" => false}) + insert(:multi_validation, resource_history_id: resource_history_voies.id, result: %{"has_errors" => false}) + + setup_http_mocks(permanent_url_aires, permanent_url_voies) + + Transport.HTTPoison.Mock + |> expect(:request, fn :post, _url, args, _headers, [follow_redirect: true] -> + {:multipart, [{:file, path, {"form-data", [name: "file", filename: "aires.geojson"]}, []}]} = args + assert String.ends_with?(path, "aires.geojson") + {:ok, %HTTPoison.Response{body: "", status_code: 200}} + end) + + Transport.HTTPoison.Mock + |> expect(:request, fn :post, _url, args, _headers, [follow_redirect: true] -> + {:multipart, [{:file, path, {"form-data", [name: "file", filename: "voies.geojson"]}, []}]} = args + assert String.ends_with?(path, "voies.geojson") + {:ok, %HTTPoison.Response{body: "", status_code: 200}} + end) + + assert :ok == perform_job(ConsolidateLEZsJob, %{}) + + # When Oban 2.19.0 will be released we should be able to make sure that + # a broadcast notification was sent on the `:gossip` channel. + # => We need to control the `job_id` when dispatching a job. + # https://github.com/oban-bg/oban/commit/fae376232ef44d8405940d3d287ab8fd93912d0a + end + defp setup_http_mocks(url_aires, url_voies) do Transport.HTTPoison.Mock |> expect(:get!, fn ^url_aires, [], follow_redirect: true ->