Skip to content

Commit

Permalink
Add feature toggle for add downtime transition
Browse files Browse the repository at this point in the history
  • Loading branch information
Ana Botto committed Jan 30, 2024
1 parent 4a58b74 commit d6cad9a
Show file tree
Hide file tree
Showing 10 changed files with 364 additions and 99 deletions.
28 changes: 2 additions & 26 deletions app/controllers/downtimes_controller.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
class DowntimesController < ApplicationController
before_action :require_govuk_editor
before_action :load_edition, except: [:index]
before_action :process_params, only: %i[create update]

def index
@transactions = TransactionEdition.published.order_by(%i[title asc])
end
before_action :load_edition
before_action :process_params, only: %i[create]

def new
@downtime = Downtime.new(artefact: @edition.artefact)
Expand All @@ -22,26 +18,6 @@ def create
end
end

def edit
@downtime = Downtime.for(@edition.artefact)
end

def update
@downtime = Downtime.for(@edition.artefact)

if params["commit"] == "Cancel downtime"
DowntimeRemover.destroy_immediately(@downtime)
flash[:success] = "#{edition_link} downtime message cancelled".html_safe
redirect_to downtimes_path
elsif @downtime.update(downtime_params)
DowntimeScheduler.schedule_publish_and_expiry(@downtime)
flash[:success] = "#{edition_link} downtime message re-scheduled (from #{view_context.downtime_datetime(@downtime)})".html_safe
redirect_to downtimes_path
else
render :edit
end
end

private

def downtime_params
Expand Down
75 changes: 75 additions & 0 deletions app/controllers/legacy_downtimes_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
class LegacyDowntimesController < ApplicationController
before_action :require_govuk_editor
before_action :load_edition, except: [:index]
before_action :process_params, only: %i[create update]

def index
@transactions = TransactionEdition.published.order_by(%i[title asc])
end

def new
@downtime = Downtime.new(artefact: @edition.artefact)
end

def create
@downtime = Downtime.new(downtime_params)
if @downtime.save
DowntimeScheduler.schedule_publish_and_expiry(@downtime)
flash[:success] = "#{edition_link} downtime message scheduled (from #{view_context.downtime_datetime(@downtime)})".html_safe
redirect_to downtimes_path
else
render :new
end
end

def edit
@downtime = Downtime.for(@edition.artefact)
end

def update
@downtime = Downtime.for(@edition.artefact)

if params["commit"] == "Cancel downtime"
DowntimeRemover.destroy_immediately(@downtime)
flash[:success] = "#{edition_link} downtime message cancelled".html_safe
redirect_to downtimes_path
elsif @downtime.update(downtime_params)
DowntimeScheduler.schedule_publish_and_expiry(@downtime)
flash[:success] = "#{edition_link} downtime message re-scheduled (from #{view_context.downtime_datetime(@downtime)})".html_safe
redirect_to downtimes_path
else
render :edit
end
end

private

def downtime_params
params[:downtime].permit([
"artefact_id",
"message",
"end_time(1i)",
"end_time(2i)",
"end_time(3i)",
"end_time(4i)",
"end_time(5i)",
"start_time(1i)",
"start_time(2i)",
"start_time(3i)",
"start_time(4i)",
"start_time(5i)",
])
end

def load_edition
@edition = Edition.find(params[:edition_id])
end

def process_params
squash_multiparameter_datetime_attributes(downtime_params, %w[start_time end_time])
end

def edition_link
view_context.link_to(@edition.title, edit_edition_downtime_path(@edition), class: "link-inherit bold")
end
end
88 changes: 88 additions & 0 deletions app/views/legacy_downtimes/_form.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<%= f.hidden_field :artefact_id %>
<%= render :partial => 'shared/error_summary', locals: { object: @downtime} %>

<div class="downtime-dates">
<div class="form-group">
<p>This service will be unavailable from</p>
</div>

<div class="row js-start-time">
<div class="form-group date col-sm-1">
<%= f.label :start_time, "Hour", for: "downtime_start_time_4i" %>
<%= select_hour @downtime.start_time&.hour || 1.hour.from_now.beginning_of_hour, { field_name: "start_time(4i)", prefix: "downtime" }, { class: "form-control date" } %>
</div>

<div class="form-group date col-sm-1">
<%= f.label :start_time, "Minute", for: "downtime_start_time_5i" %>
<%= select_minute @downtime.start_time&.minute, { field_name: "start_time(5i)", prefix: "downtime" }, { class: "form-control date" } %>
</div>

<div class="form-group date col-sm-1">
<p class="joining-on">on</p>
</div>

<div class="form-group date col-sm-1">
<%= f.label :start_time, "Day", for: "downtime_start_time_3i" %>
<%= select_day @downtime.start_time&.day || Date.tomorrow.day, { field_name: "start_time(3i)", prefix: "downtime" }, { class: "form-control date" } %>
</div>
<div class="form-group date col-sm-1">
<%= f.label :start_time, "Month", for: "downtime_start_time_2i" %>
<%= select_month@downtime.start_time&.month || Date.tomorrow.month, { field_name: "start_time(2i)", prefix: "downtime" }, { class: "form-control date" } %>
</div>

<div class="form-group date col-sm-1">
<%= f.label :start_time, "Year", for: "downtime_start_time_1i" %>
<%= select_year @downtime.start_time&.year || Date.tomorrow.year, { field_name: "start_time(1i)", prefix: "downtime" }, { class: "form-control date" } %>
</div>
</div>

<div class="form-group">
<p>to</p>
</div>

<div class="row js-stop-time">

<div class="form-group date col-sm-1">
<%= f.label :end_time, "Hour", for: "downtime_end_time_4i" %>
<%= select_hour @downtime.end_time&.hour || 1.hour.from_now.beginning_of_hour, { field_name: "end_time(4i)", prefix: "downtime" }, { class: "form-control date" } %>
</div>

<div class="form-group date col-sm-1">
<%= f.label :end_time, "Minute", for: "downtime_end_time_5i" %>
<%= select_minute @downtime.end_time&.minute, { field_name: "end_time(5i)", prefix: "downtime" }, { class: "form-control date" } %>
</div>

<div class="form-group date col-sm-1">
<p class="joining-on">on</p>
</div>

<div class="form-group date col-sm-1">
<%= f.label :start_time, "Day", for: "downtime_end_time_3i" %>
<%= select_day @downtime.end_time&.day || Date.tomorrow.day, { field_name: "end_time(3i)", prefix: "downtime" }, { class: "form-control date" } %>
</div>

<div class="form-group date col-sm-1">
<%= f.label :end_time, "Month", for: "downtime_end_time_2i" %>
<%= select_month @downtime.end_time&.month || Date.tomorrow.month, { field_name: "end_time(2i)", prefix: "downtime" }, { class: "form-control date" } %>
</div>

<div class="form-group date col-sm-1">
<%= f.label :end_time, "Year", for: "downtime_end_time_1i" %>
<%= select_year @downtime.end_time&.year || Date.tomorrow.year, { field_name: "end_time(1i)", prefix: "downtime" }, { class: "form-control date" } %>
</div>
</div>
</div>

<hr>

<%= form_group(f, :message) do %>
<%= f.text_area :message, class: 'form-control input-md-6 js-downtime-message', rows: 5 %>
<% end %>

<p class="add-bottom-margin help-note">
<span class="glyphicon glyphicon-exclamation-sign"></span>
<span class="js-schedule-message">Messages appear on the start page one day before the downtime is due.</span>
</p>

<hr>
File renamed without changes.
File renamed without changes.
18 changes: 18 additions & 0 deletions app/views/legacy_downtimes/new.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<% content_for :page_title, 'Schedule downtime' %>

<ul class="breadcrumb">
<li class="crumb"><%= link_to 'Downtime', downtimes_path %></li>
<li class="active"><%= @downtime.artefact.name %></li>
</ul>

<div class="page-title">
<h1>
<span class="small"><%= @downtime.artefact.name %></span>
Schedule a downtime message
</h1>
</div>

<%= form_for @downtime, url: edition_downtime_path(@edition), html: { class: 'form well remove-top-margin', 'data-module' => 'downtime-message' } do |f| %>
<%= render 'form', f: f %>
<%= f.submit 'Schedule downtime message', class: 'js-submit btn btn-success' %>
<% end %>
4 changes: 4 additions & 0 deletions config/features.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,8 @@
feature :design_system_reports_page,
default: false,
description: "A transition of the reports page to use the GOV.UK Design System"

feature :design_system_downtime_new,
default: false,
description: "A transition of the add downtime page to use the GOV.UK Design System"
end
7 changes: 5 additions & 2 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
put "resolve", on: :member
end

get "downtimes" => "downtimes#index"
get "downtimes" => "legacy_downtimes#index"

resources :artefacts, only: %i[new create update]

Expand Down Expand Up @@ -42,7 +42,10 @@
}
end

resource :downtime, only: %i[new create edit update destroy]
constraints FeatureConstraint.new("design_system_downtime_new") do
resource :downtime, only: %i[new create]
end
resource :downtime, only: %i[new create edit update destroy], controller: "legacy_downtimes"
end

constraints FeatureConstraint.new("design_system_reports_page") do
Expand Down
72 changes: 1 addition & 71 deletions test/functional/downtimes_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,6 @@ class DowntimesControllerTest < ActionController::TestCase
login_as_stub_user
end

context "#index" do
should "list all published transaction editions" do
unpublished_transaction_edition = FactoryBot.create(:transaction_edition)
transaction_editions = FactoryBot.create_list(:transaction_edition, 2, :published)

get :index

assert_response :ok
assert_select "h3.publication-table-title", count: 0, text: unpublished_transaction_edition.title
transaction_editions.each do |edition|
assert_select "h3.publication-table-title", text: edition.title
end
end

should "redirect to root page if welsh_editor" do
login_as_welsh_editor

get :index

assert_response :redirect
assert_redirected_to controller: "root", action: "index"
assert_includes flash[:danger], "do not have permission"
end
end

context "#new" do
should "render the page ok" do
get :new, params: { edition_id: edition.id }
Expand All @@ -53,7 +28,7 @@ class DowntimesControllerTest < ActionController::TestCase
should "redirect to the downtime index page" do
DowntimeScheduler.stubs(:schedule_publish_and_expiry)
post :create, params: { edition_id: edition.id, downtime: downtime_params }
assert_redirected_to controller: "downtimes", action: "index"
assert_redirected_to controller: "legacy_downtimes", action: "index"
end
end

Expand All @@ -75,51 +50,6 @@ class DowntimesControllerTest < ActionController::TestCase
end
end

context "#edit" do
should "render the page ok" do
create_downtime
get :edit, params: { edition_id: edition.id }
assert_response :ok
end
end

context "#update" do
context "cancelling scheduled downtime" do
should "invoke the DowntimeRemover" do
DowntimeRemover.expects(:destroy_immediately).with(downtime)
put :update, params: { edition_id: edition.id, downtime: downtime_params, commit: "Cancel downtime" }
end

should "redirect to the downtime index" do
DowntimeRemover.stubs(:destroy_immediately)
put :update, params: { edition_id: edition.id, downtime: downtime_params, commit: "Cancel downtime" }
assert_redirected_to controller: "downtimes", action: "index"
end
end

context "rescheduling planned downtime" do
should "schedule the changes for publication and expiration" do
DowntimeScheduler.expects(:schedule_publish_and_expiry).with(downtime)
put :update, params: { edition_id: edition.id, downtime: downtime_params, commit: "Re-schedule downtime message" }
end

should "redirect to the downtime index" do
create_downtime
DowntimeScheduler.stubs(:schedule_publish_and_expiry)
put :update, params: { edition_id: edition.id, downtime: downtime_params, commit: "Re-schedule downtime message" }
assert_redirected_to controller: "downtimes", action: "index"
end
end

context "with invalid form data" do
should "rerender the page" do
create_downtime
put :update, params: { edition_id: edition.id, downtime: invalid_params, commit: "Re-schedule downtime message" }
assert_template :edit
end
end
end

def edition
@edition ||= FactoryBot.create(:transaction_edition)
end
Expand Down
Loading

0 comments on commit d6cad9a

Please sign in to comment.