From 96c1c276ee466c282138bbedc8416b39024500f2 Mon Sep 17 00:00:00 2001
From: SamSeed-Softwire <63662292+SamSeed-Softwire@users.noreply.github.com>
Date: Wed, 8 Nov 2023 12:08:28 +0000
Subject: [PATCH] CLDC-2863: Create 'redirect to new service' page (#2022)
* CLDC-2863: rename maintenance_mode_enabled? to service_unavailable?
* CLDC-2863: update 'maintenance' to 'service unavailable' in tests
* CLDC-2863: rename check_maintenance to check_maintenance_status
* CLDC-2863: implement service_moved functionality
* CLDC-2863: add tests for service_moved functionality
* CLDC-2863: add tests for when both feature toggles are on
* CLDC-2863: remove full stop from service moved page title
* CLDC-2863: turn on service moved feature
* CLDC-2863: turn off service moved feature
---
app/controllers/application_controller.rb | 16 ++-
app/controllers/maintenance_controller.rb | 6 ++
app/services/feature_toggle.rb | 6 +-
app/views/layouts/application.html.erb | 2 +-
app/views/maintenance/service_moved.html.erb | 9 ++
config/initializers/sidekiq.rb | 2 +-
config/routes.rb | 1 +
.../maintenance_controller_spec.rb | 30 +++++-
spec/features/user_spec.rb | 36 ++++++-
spec/requests/content_controller_spec.rb | 75 +++++++++++++-
spec/requests/cookies_controller_spec.rb | 47 ++++++++-
spec/requests/maintenance_controller_spec.rb | 99 ++++++++++++++++---
12 files changed, 296 insertions(+), 33 deletions(-)
create mode 100644 app/views/maintenance/service_moved.html.erb
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index ae9e1beb9..a68b55f8d 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -3,13 +3,19 @@ class ApplicationController < ActionController::Base
rescue_from Pundit::NotAuthorizedError, with: :render_not_authorized
- before_action :check_maintenance
+ before_action :check_maintenance_status
before_action :set_paper_trail_whodunnit
- def check_maintenance
- if FeatureToggle.maintenance_mode_enabled? && !%w[service-unavailable accessibility-statement privacy-notice cookies].include?(request.fullpath.split("?")[0].delete("/"))
- redirect_to service_unavailable_path
- elsif !FeatureToggle.maintenance_mode_enabled? && request.fullpath.split("?")[0].delete("/") == "service-unavailable"
+ def check_maintenance_status
+ if FeatureToggle.service_moved?
+ unless %w[service-moved accessibility-statement privacy-notice cookies].include?(request.fullpath.split("?")[0].delete("/"))
+ redirect_to service_moved_path
+ end
+ elsif FeatureToggle.service_unavailable?
+ unless %w[service-unavailable accessibility-statement privacy-notice cookies].include?(request.fullpath.split("?")[0].delete("/"))
+ redirect_to service_unavailable_path
+ end
+ elsif %w[service-moved service-unavailable].include?(request.fullpath.split("?")[0].delete("/"))
redirect_back(fallback_location: root_path)
end
end
diff --git a/app/controllers/maintenance_controller.rb b/app/controllers/maintenance_controller.rb
index bb6ae1f80..26dd8188d 100644
--- a/app/controllers/maintenance_controller.rb
+++ b/app/controllers/maintenance_controller.rb
@@ -1,4 +1,10 @@
class MaintenanceController < ApplicationController
+ def service_moved
+ if current_user
+ sign_out
+ end
+ end
+
def service_unavailable
if current_user
sign_out
diff --git a/app/services/feature_toggle.rb b/app/services/feature_toggle.rb
index 3cad5dadb..2829c0958 100644
--- a/app/services/feature_toggle.rb
+++ b/app/services/feature_toggle.rb
@@ -38,7 +38,11 @@ class FeatureToggle
!Rails.env.production?
end
- def self.maintenance_mode_enabled?
+ def self.service_unavailable?
+ false
+ end
+
+ def self.service_moved?
false
end
end
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index d70c1e09a..3b051a8bc 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -91,7 +91,7 @@
navigation_classes: "govuk-header__navigation--end",
) do |component|
component.product_name(name: t("service_name"))
- unless FeatureToggle.maintenance_mode_enabled?
+ unless FeatureToggle.service_moved? || FeatureToggle.service_unavailable?
if current_user.nil?
component.navigation_item(text: "Sign in", href: user_session_path)
else
diff --git a/app/views/maintenance/service_moved.html.erb b/app/views/maintenance/service_moved.html.erb
new file mode 100644
index 000000000..44aff91d1
--- /dev/null
+++ b/app/views/maintenance/service_moved.html.erb
@@ -0,0 +1,9 @@
+
+ The URL for this service has changed
+
+
+
+
+
Submit social housing lettings and sales data (CORE) can now be found at <%= govuk_link_to "https://submit-social-housing-data.levellingup.gov.uk", "https://submit-social-housing-data.levellingup.gov.uk" %>. If you have bookmarked this page, you need to update it.
+
+
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index 60cc29b3a..94fe9e91f 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -33,7 +33,7 @@ Redis.silence_deprecations = true
Sidekiq.configure_server do |config|
config.on(:startup) do
Sidekiq::Cron::Job.all.each(&:destroy)
- unless FeatureToggle.maintenance_mode_enabled?
+ unless FeatureToggle.service_moved? || FeatureToggle.service_unavailable?
Sidekiq::Cron::Job.load_from_hash YAML.load_file("config/sidekiq_cron_schedule.yml")
end
end
diff --git a/config/routes.rb b/config/routes.rb
index 498e7d9a2..052570cb1 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -35,6 +35,7 @@ Rails.application.routes.draw do
get "/accessibility-statement", to: "content#accessibility_statement"
get "/privacy-notice", to: "content#privacy_notice"
get "/data-sharing-agreement", to: "content#data_sharing_agreement"
+ get "/service-moved", to: "maintenance#service_moved"
get "/service-unavailable", to: "maintenance#service_unavailable"
get "/download-23-24-lettings-form", to: "start#download_23_24_lettings_form"
diff --git a/spec/controllers/maintenance_controller_spec.rb b/spec/controllers/maintenance_controller_spec.rb
index 032ac4858..ca67a5189 100644
--- a/spec/controllers/maintenance_controller_spec.rb
+++ b/spec/controllers/maintenance_controller_spec.rb
@@ -3,10 +3,32 @@ require "rails_helper"
RSpec.describe MaintenanceController do
let(:user) { FactoryBot.create(:user) }
+ describe "GET #service_moved" do
+ context "when the service has moved" do
+ it "logs the user out" do
+ allow(FeatureToggle).to receive(:service_moved?).and_return(true)
+ sign_in user
+ expect(controller).to be_user_signed_in
+ get :service_moved
+ expect(controller).not_to be_user_signed_in
+ end
+ end
+
+ context "when the service hasn't moved" do
+ it "doesn't log the user out" do
+ allow(FeatureToggle).to receive(:service_moved?).and_return(false)
+ sign_in user
+ expect(controller).to be_user_signed_in
+ get :service_moved
+ expect(controller).to be_user_signed_in
+ end
+ end
+ end
+
describe "GET #service_unavailable" do
- context "when maintenance mode is enabled" do
+ context "when the service is unavailable" do
it "logs the user out" do
- allow(FeatureToggle).to receive(:maintenance_mode_enabled?).and_return(true)
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(true)
sign_in user
expect(controller).to be_user_signed_in
get :service_unavailable
@@ -14,9 +36,9 @@ RSpec.describe MaintenanceController do
end
end
- context "when maintenance mode is disabled" do
+ context "when the service is available" do
it "doesn't log the user out" do
- allow(FeatureToggle).to receive(:maintenance_mode_enabled?).and_return(false)
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(false)
sign_in user
expect(controller).to be_user_signed_in
get :service_unavailable
diff --git a/spec/features/user_spec.rb b/spec/features/user_spec.rb
index ca4e01ac6..ce0e1317f 100644
--- a/spec/features/user_spec.rb
+++ b/spec/features/user_spec.rb
@@ -140,8 +140,21 @@ RSpec.describe "User Features" do
expect(page).to have_content("Sign in to your account to submit CORE data")
end
- it "does not show 'Sign in' link if maintenance mode is enabled" do
- allow(FeatureToggle).to receive(:maintenance_mode_enabled?).and_return(true)
+ it "does not show 'Sign in' link when the service has moved" do
+ allow(FeatureToggle).to receive(:service_moved?).and_return(true)
+ visit("/lettings-logs")
+ expect(page).not_to have_link("Sign in")
+ end
+
+ it "does not show 'Sign in' link when the service is unavailable" do
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(true)
+ visit("/lettings-logs")
+ expect(page).not_to have_link("Sign in")
+ end
+
+ it "does not show 'Sign in' link when both the service_moved? and service_unavailable? feature toggles are on" do
+ allow(FeatureToggle).to receive(:service_moved?).and_return(true)
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(true)
visit("/lettings-logs")
expect(page).not_to have_link("Sign in")
end
@@ -331,8 +344,23 @@ RSpec.describe "User Features" do
expect(page).to have_selector('[data-qa="change-key-contact"]')
end
- it "does not show 'Your account' or 'Sign out' links if maintenance mode is enabled" do
- allow(FeatureToggle).to receive(:maintenance_mode_enabled?).and_return(true)
+ it "does not show 'Your account' or 'Sign out' links when the service has moved" do
+ allow(FeatureToggle).to receive(:service_moved?).and_return(true)
+ visit("/lettings-logs")
+ expect(page).not_to have_link("Your account")
+ expect(page).not_to have_link("Sign out")
+ end
+
+ it "does not show 'Your account' or 'Sign out' links when the service is unavailable" do
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(true)
+ visit("/lettings-logs")
+ expect(page).not_to have_link("Your account")
+ expect(page).not_to have_link("Sign out")
+ end
+
+ it "does not show 'Your account' or 'Sign out' links when both the service_moved? and service_unavailable? feature toggles are on" do
+ allow(FeatureToggle).to receive(:service_moved?).and_return(true)
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(true)
visit("/lettings-logs")
expect(page).not_to have_link("Your account")
expect(page).not_to have_link("Sign out")
diff --git a/spec/requests/content_controller_spec.rb b/spec/requests/content_controller_spec.rb
index c978ecaa9..598b3dfff 100644
--- a/spec/requests/content_controller_spec.rb
+++ b/spec/requests/content_controller_spec.rb
@@ -4,7 +4,7 @@ RSpec.describe ContentController, type: :request do
let(:headers) { { "Accept" => "text/html" } }
let(:page) { Capybara::Node::Simple.new(response.body) }
- describe "when maintenance mode is disabled" do
+ describe "when the service is available" do
describe "render privacy notice content page" do
before do
get "/privacy-notice", headers:, params: {}
@@ -48,9 +48,78 @@ RSpec.describe ContentController, type: :request do
end
end
- describe "when maintenance mode is enabled" do
+ describe "when the service has moved" do
before do
- allow(FeatureToggle).to receive(:maintenance_mode_enabled?).and_return(true)
+ allow(FeatureToggle).to receive(:service_moved?).and_return(true)
+ end
+
+ describe "render privacy notice content page" do
+ before do
+ get "/privacy-notice", headers:, params: {}
+ end
+
+ it "returns a 200" do
+ expect(response).to have_http_status(:success)
+ end
+
+ it "returns the page" do
+ expect(page).to have_title("Privacy notice")
+ end
+ end
+
+ describe "render accessibility statement content page" do
+ before do
+ get "/accessibility-statement", headers:, params: {}
+ end
+
+ it "returns a 200" do
+ expect(response).to have_http_status(:success)
+ end
+
+ it "returns the page" do
+ expect(page).to have_title("Accessibility statement")
+ end
+ end
+ end
+
+ describe "when the service is unavailable" do
+ before do
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(true)
+ end
+
+ describe "render privacy notice content page" do
+ before do
+ get "/privacy-notice", headers:, params: {}
+ end
+
+ it "returns a 200" do
+ expect(response).to have_http_status(:success)
+ end
+
+ it "returns the page" do
+ expect(page).to have_title("Privacy notice")
+ end
+ end
+
+ describe "render accessibility statement content page" do
+ before do
+ get "/accessibility-statement", headers:, params: {}
+ end
+
+ it "returns a 200" do
+ expect(response).to have_http_status(:success)
+ end
+
+ it "returns the page" do
+ expect(page).to have_title("Accessibility statement")
+ end
+ end
+ end
+
+ describe "when both the service_moved? and service_unavailable? feature toggles are on" do
+ before do
+ allow(FeatureToggle).to receive(:service_moved?).and_return(true)
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(true)
end
describe "render privacy notice content page" do
diff --git a/spec/requests/cookies_controller_spec.rb b/spec/requests/cookies_controller_spec.rb
index 82cf06a10..b82684b5e 100644
--- a/spec/requests/cookies_controller_spec.rb
+++ b/spec/requests/cookies_controller_spec.rb
@@ -4,7 +4,7 @@ RSpec.describe CookiesController, type: :request do
let(:headers) { { "Accept" => "text/html" } }
let(:page) { Capybara::Node::Simple.new(response.body) }
- describe "when maintenance mode is disabled" do
+ describe "when the service is available" do
describe "render cookies page" do
before do
get "/cookies", headers:, params: {}
@@ -20,9 +20,50 @@ RSpec.describe CookiesController, type: :request do
end
end
- describe "when maintenance mode is enabled" do
+ describe "when the service has moved" do
before do
- allow(FeatureToggle).to receive(:maintenance_mode_enabled?).and_return(true)
+ allow(FeatureToggle).to receive(:service_moved?).and_return(true)
+ end
+
+ describe "render cookies page" do
+ before do
+ get "/cookies", headers:, params: {}
+ end
+
+ it "returns a 200" do
+ expect(response).to have_http_status(:success)
+ end
+
+ it "returns the page" do
+ expect(page).to have_title("Cookies")
+ end
+ end
+ end
+
+ describe "when the service is unavailable" do
+ before do
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(true)
+ end
+
+ describe "render cookies page" do
+ before do
+ get "/cookies", headers:, params: {}
+ end
+
+ it "returns a 200" do
+ expect(response).to have_http_status(:success)
+ end
+
+ it "returns the page" do
+ expect(page).to have_title("Cookies")
+ end
+ end
+ end
+
+ describe "when both the service_moved? and service_unavailable? feature toggles are on" do
+ before do
+ allow(FeatureToggle).to receive(:service_moved?).and_return(true)
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(true)
end
describe "render cookies page" do
diff --git a/spec/requests/maintenance_controller_spec.rb b/spec/requests/maintenance_controller_spec.rb
index d900df3c5..4d7f8ab8c 100644
--- a/spec/requests/maintenance_controller_spec.rb
+++ b/spec/requests/maintenance_controller_spec.rb
@@ -8,17 +8,55 @@ RSpec.describe MaintenanceController, type: :request do
sign_in user
end
- describe "when maintenance mode is enabled" do
+ describe "when the service has moved" do
before do
- allow(FeatureToggle).to receive(:maintenance_mode_enabled?).and_return(true)
+ allow(FeatureToggle).to receive(:service_moved?).and_return(true)
end
- context "when a user visits a page other than the maintenance page" do
+ context "when a user visits a page other than the service moved page" do
+ before do
+ get "/service-unavailable"
+ end
+
+ it "redirects the user to the service moved page" do
+ expect(response).to redirect_to(service_moved_path)
+ follow_redirect!
+ expect(page).to have_content("The URL for this service has changed")
+ end
+
+ it "the cookie banner is visible" do
+ follow_redirect!
+ expect(page).to have_content("We’d like to use analytics cookies so we can understand how you use the service and make improvements.")
+ end
+ end
+
+ context "when a user visits the service moved page" do
+ before do
+ get "/service-moved"
+ end
+
+ it "keeps the user on the service moved page" do
+ expect(response).not_to redirect_to(service_moved_path)
+ expect(page).to have_content("The URL for this service has changed")
+ end
+
+ it "the cookie banner is visible" do
+ expect(page).to have_content("We’d like to use analytics cookies so we can understand how you use the service and make improvements.")
+ end
+ end
+ end
+
+ describe "when the service is unavailable" do
+ before do
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(true)
+ end
+
+ context "when a user visits a page other than the service unavailable page" do
before do
get "/lettings-logs"
end
- it "redirects the user to the maintenance page" do
+ it "redirects the user to the service unavailable page" do
expect(response).to redirect_to(service_unavailable_path)
follow_redirect!
expect(page).to have_content("Sorry, the service is unavailable")
@@ -30,12 +68,12 @@ RSpec.describe MaintenanceController, type: :request do
end
end
- context "when a user visits the maintenance page" do
+ context "when a user visits the service unavailable page" do
before do
get "/service-unavailable"
end
- it "keeps the user on the maintenance page" do
+ it "keeps the user on the service unavailable page" do
expect(response).not_to redirect_to(service_unavailable_path)
expect(page).to have_content("Sorry, the service is unavailable")
end
@@ -46,17 +84,56 @@ RSpec.describe MaintenanceController, type: :request do
end
end
- describe "when maintenance mode is disabled" do
+ describe "when both the service_moved? and service_unavailable? feature toggles are on" do
+ before do
+ allow(FeatureToggle).to receive(:service_moved?).and_return(true)
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(true)
+ end
+
+ context "when a user visits a page other than the service moved page" do
+ before do
+ get "/service-unavailable"
+ end
+
+ it "redirects the user to the service moved page" do
+ expect(response).to redirect_to(service_moved_path)
+ follow_redirect!
+ expect(page).to have_content("The URL for this service has changed")
+ end
+
+ it "the cookie banner is visible" do
+ follow_redirect!
+ expect(page).to have_content("We’d like to use analytics cookies so we can understand how you use the service and make improvements.")
+ end
+ end
+
+ context "when a user visits the service moved page" do
+ before do
+ get "/service-moved"
+ end
+
+ it "keeps the user on the service moved page" do
+ expect(response).not_to redirect_to(service_moved_path)
+ expect(page).to have_content("The URL for this service has changed")
+ end
+
+ it "the cookie banner is visible" do
+ expect(page).to have_content("We’d like to use analytics cookies so we can understand how you use the service and make improvements.")
+ end
+ end
+ end
+
+ describe "when the service is available" do
before do
- allow(FeatureToggle).to receive(:maintenance_mode_enabled?).and_return(false)
+ allow(FeatureToggle).to receive(:service_unavailable?).and_return(false)
end
- context "when a user visits a page other than the maintenance page" do
+ context "when a user visits a page other than the service unavailable page" do
before do
get "/lettings-logs"
end
- it "doesn't redirect the user to the maintenance page" do
+ it "doesn't redirect the user to the service unavailable page" do
expect(response).not_to redirect_to(service_unavailable_path)
expect(page).to have_content("Create a new lettings log")
end
@@ -66,7 +143,7 @@ RSpec.describe MaintenanceController, type: :request do
end
end
- context "when a user visits the maintenance page" do
+ context "when a user visits the service unavailable page" do
before do
get "/service-unavailable"
end