Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add feature toggle for add downtime transition #2030

Merged
merged 1 commit into from
Jan 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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" %>
<%= [email protected]_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>
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
Loading