Skip to content
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
3 changes: 3 additions & 0 deletions app/controllers/forms/copy_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ def create
if @copy_input.submit
copied_form = FormCopyService.new(current_form, current_user).copy(tag: @copy_input.tag)
copied_form.update!(name: @copy_input.name)

OrgAdminAlertsService.new(form: copied_form, current_user:).new_draft_form_created

redirect_to form_path(copied_form.id), success: t("banner.success.form.copied")
else
set_back_link(current_form)
Expand Down
4 changes: 4 additions & 0 deletions app/controllers/forms/make_live_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ def create
@make_form_live_service = MakeFormLiveService.call(current_form:, current_user:)
@make_form_live_service.make_live unless current_form.live?

if current_form.state_previously_changed?
OrgAdminAlertsService.new(form: current_form, current_user:).form_made_live
end

render "confirmation", locals: { current_form:, confirmation_page_title: @make_form_live_service.page_title, confirmation_page_body: @make_form_live_service.confirmation_page_body }
end

Expand Down
4 changes: 4 additions & 0 deletions app/controllers/forms/unarchive_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ def create
@make_form_live_service = MakeFormLiveService.call(current_form:, current_user:)
@make_form_live_service.make_live

if current_form.state_previously_changed?
OrgAdminAlertsService.new(form: current_form, current_user:).form_made_live
end

render "forms/make_live/confirmation", locals: { current_form:, confirmation_page_title: @make_form_live_service.page_title, confirmation_page_body: @make_form_live_service.confirmation_page_body }
end

Expand Down
20 changes: 17 additions & 3 deletions app/controllers/forms_controller.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
class FormsController < WebController
before_action :load_form
after_action :verify_authorized
after_action :alert_org_admins_if_draft_created

def current_form
@current_form ||= Form.find(params[:form_id])
end
attr_reader :current_form

def current_live_form
@current_live_form ||= FormDocument::Content.from_form_document(current_form.live_form_document)
Expand All @@ -20,4 +20,18 @@ def current_archived_form
def current_archived_welsh_form
@current_archived_welsh_form ||= FormDocument::Content.from_form_document(current_form.archived_welsh_form_document)
end

private

def load_form
@current_form = Form.find(params[:form_id])
@initial_form_state = @current_form.state
end

def alert_org_admins_if_draft_created
return if current_form.destroyed?
return unless @current_form.reload.draft_created?(@initial_form_state)

OrgAdminAlertsService.new(form: current_form, current_user:).draft_of_existing_form_created
end
end
1 change: 1 addition & 0 deletions app/controllers/group_forms_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ def create

if @name_input.valid?
@form = CreateFormService.new.create!(creator: @current_user, group: @group, name: @name_input.name)
OrgAdminAlertsService.new(form: @form, current_user:).new_draft_form_created

redirect_to form_path(@form.id)
else
Expand Down
9 changes: 9 additions & 0 deletions app/models/form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,15 @@ def normalise_welsh!
pages.each(&:normalise_welsh!)
end

# Pass in the previous state rather than getting it from #state_previously_was as the Form may have been updated in a
# separate instance
def draft_created?(previous_state)
return false if state.to_sym == previous_state.to_sym

(previous_state.to_sym == :live && live_with_draft?) ||
(previous_state.to_sym == :archived && archived_with_draft?)
end

private

def set_external_id
Expand Down
86 changes: 86 additions & 0 deletions app/services/org_admin_alerts_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
class OrgAdminAlertsService
def initialize(form:, current_user:)
@form = form
@current_user = current_user
@org_admins = @form.group.organisation.admin_users.where.not(id: @current_user.id)
end

def form_made_live
return unless feature_enabled?

@org_admins.each do |org_admin_user|
form_made_live_email(to_email: org_admin_user.email).deliver_now
end
end

def new_draft_form_created
return unless feature_enabled?
return unless @form.group.active?

@org_admins.each do |org_admin_user|
new_draft_form_created_email(to_email: org_admin_user.email).deliver_now
end
end

def draft_of_existing_form_created
return unless feature_enabled?

@org_admins.each do |org_admin_user|
draft_of_existing_form_created_email(to_email: org_admin_user.email).deliver_now
end
end

private

def form_made_live_email(to_email:)
previous_state = @form.state_previously_was.to_sym

case previous_state
when :draft
new_draft_made_live_email(to_email:)
when :live_with_draft
OrgAdminAlerts::MadeLiveMailer.live_form_changes_made_live(form: @form, user: @current_user, to_email:)
when :archived
OrgAdminAlerts::MadeLiveMailer.archived_form_made_live(form: @form, user: @current_user, to_email:)
when :archived_with_draft
OrgAdminAlerts::MadeLiveMailer.archived_form_changes_made_live(form: @form, user: @current_user, to_email:)
else
raise StandardError, "Unexpected previous state: #{previous_state}"
end
end

def new_draft_made_live_email(to_email:)
if copied_from_form
OrgAdminAlerts::MadeLiveMailer.copied_form_made_live(form: @form, copied_from_form:, user: @current_user, to_email:)
else
OrgAdminAlerts::MadeLiveMailer.new_draft_form_made_live(form: @form, user: @current_user, to_email:)
end
end

def new_draft_form_created_email(to_email:)
if copied_from_form
OrgAdminAlerts::DraftCreatedMailer.copied_draft_form_created(form: @form, copied_from_form:, user: @current_user, to_email:)
else
OrgAdminAlerts::DraftCreatedMailer.new_draft_form_created(form: @form, user: @current_user, to_email:)
end
end

def draft_of_existing_form_created_email(to_email:)
case @form.state.to_sym
when :live_with_draft
OrgAdminAlerts::DraftCreatedMailer.new_live_form_draft_created(form: @form, user: @current_user, to_email:)
when :archived_with_draft
OrgAdminAlerts::DraftCreatedMailer.new_archived_form_draft_created(form: @form, user: @current_user, to_email:)
else
raise StandardError, "Unexpected form state: #{@form.state}"
end
end

def copied_from_form
Form.find_by(id: @form.copied_from_id)
end

def feature_enabled?
FeatureService.enabled?(:org_admin_alerts_enabled)
end
end
26 changes: 0 additions & 26 deletions spec/controllers/forms_controller_spec.rb

This file was deleted.

39 changes: 39 additions & 0 deletions spec/models/form_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1306,6 +1306,45 @@
}
end

describe "#draft_created?" do
subject(:draft_created?) { form.draft_created?(initial_state) }

context "when a draft has been created for a live form" do
let(:form) { create(:form, :live_with_draft) }
let(:initial_state) { "live" }

it { is_expected.to be true }
end

context "when a draft has been created for an archived form" do
let(:form) { create(:form, :archived_with_draft) }
let(:initial_state) { "archived" }

it { is_expected.to be true }
end

context "when the state has not changed" do
let(:form) { create(:form, :live_with_draft) }
let(:initial_state) { "live_with_draft" }

it { is_expected.to be false }
end

context "when the state has been updated to live" do
let(:form) { create(:form, :live) }
let(:initial_state) { "live_with_draft" }

it { is_expected.to be false }
end

context "when the state has been updated from live with draft to archived with draft" do
let(:form) { create(:form, :archived_with_draft) }
let(:initial_state) { "live_with_draft" }

it { is_expected.to be false }
end
end

context "when Welsh is not an available language" do
let(:languages) { %w[en] }

Expand Down
21 changes: 19 additions & 2 deletions spec/requests/forms/copy_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
require "rails_helper"

RSpec.describe Forms::CopyController, type: :request do
RSpec.describe Forms::CopyController, :feature_org_admin_alerts_enabled, type: :request do
let(:id) { form.id }
let(:form) { create(:form) }

let(:group) { create(:group, organisation: standard_user.organisation) }
let(:group) { create(:group, organisation: standard_user.organisation, status: :active) }

before do
Membership.create!(group_id: group.id, user: standard_user, added_by: standard_user)
Expand Down Expand Up @@ -54,13 +54,25 @@
end

describe "#create" do
before do
create(:organisation_admin_user, organisation: standard_user.organisation)
end

context "when the copy is successful" do
it "redirects to the form page" do
post create_copy_form_path(id), params: { forms_copy_input: { name: "Copied Form", tag: "draft" } }

expect(response).to have_http_status(:found)
expect(response).to redirect_to(form_path(Form.last.id))
end

it "sends an email to the organisation admins" do
post create_copy_form_path(id), params: { forms_copy_input: { name: "Copied Form", tag: "draft" } }
expect(ActionMailer::Base.deliveries.count).to eq(1)

template_id = Settings.govuk_notify.org_admin_alerts.copied_draft_form_created_template_id
expect(ActionMailer::Base.deliveries.last.govuk_notify_template).to eq(template_id)
end
end

context "when the copy fails" do
Expand All @@ -70,6 +82,11 @@
expect(response).to have_http_status(:ok)
expect(response).to render_template(:confirm)
end

it "does not send an email to the organisation admins" do
post create_copy_form_path(id), params: { forms_copy_input: { name: "", tag: "draft" } }
expect(ActionMailer::Base.deliveries.count).to eq(0)
end
end
end
end
9 changes: 2 additions & 7 deletions spec/requests/forms/daily_submission_batch_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
require "rails_helper"

RSpec.describe Forms::DailySubmissionBatchController, type: :request do
RSpec.describe Forms::DailySubmissionBatchController, :feature_daily_submission_emails_enabled, type: :request do
let(:form) { create(:form, :live, send_daily_submission_batch: send_daily_submission_batch_original_value) }
let(:send_daily_submission_batch_original_value) { false }
let(:current_user) { standard_user }
let(:group) { create(:group, organisation: standard_user.organisation) }
let(:daily_submission_emails_enabled) { true }

before do
allow(FeatureService).to receive(:enabled?).with(:daily_submission_emails_enabled).and_return(daily_submission_emails_enabled)

Membership.create!(group_id: group.id, user: standard_user, added_by: standard_user)
GroupForm.create!(form_id: form.id, group_id: group.id)

Expand Down Expand Up @@ -37,9 +34,7 @@
end
end

context "when the feature flag is disabled" do
let(:daily_submission_emails_enabled) { false }

context "when the feature flag is disabled", feature_daily_submission_emails_enabled: false do
it "returns 404" do
expect(response).to have_http_status(:not_found)
end
Expand Down
26 changes: 23 additions & 3 deletions spec/requests/forms/make_live_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
require "rails_helper"

RSpec.describe Forms::MakeLiveController, type: :request do
let(:user) { build :user }
RSpec.describe Forms::MakeLiveController, :feature_org_admin_alerts_enabled, type: :request do
let(:user) { build :user, organisation: }
let(:form) { create(:form, :ready_for_live) }
let(:id) { form.id }

let(:form_params) { nil }

let(:organisation) { test_org }
let(:group_role) { :group_admin }
let(:group) { create(:group, organisation: user.organisation, status: :active) }
let(:group) { create(:group, organisation:, status: :active) }

describe "#new" do
before do
Expand Down Expand Up @@ -59,6 +60,7 @@
before do
Membership.create!(group_id: group.id, user:, added_by: user, role: group_role)
GroupForm.create!(form_id: form.id, group_id: group.id)
create(:organisation_admin_user, organisation:)

login_as user
end
Expand All @@ -76,6 +78,14 @@
expect(response).to render_template(:confirmation)
end

it "sends an email to the organisation admins" do
post(make_live_path(form_id: form.id), params: form_params)
expect(ActionMailer::Base.deliveries.count).to eq(1)

template_id = Settings.govuk_notify.org_admin_alerts.new_draft_form_made_live_template_id
expect(ActionMailer::Base.deliveries.last.govuk_notify_template).to eq(template_id)
end

context "and that form has not been made live before" do
it "has the page title 'Your form is live'" do
post(make_live_path(form_id: form.id), params: form_params)
Expand Down Expand Up @@ -108,6 +118,11 @@
post(make_live_path(form_id: form.id), params: form_params)
}.not_to(change { form.reload.live_form_document.updated_at })
end

it "does not send an email to the organisation admins" do
post(make_live_path(form_id: form.id), params: form_params)
expect(ActionMailer::Base.deliveries.count).to eq(0)
end
end

context "and has draft changes" do
Expand Down Expand Up @@ -145,6 +160,11 @@
it "redirects you to the form page" do
expect(response).to redirect_to(form_path(form.id))
end

it "does not send an email to the organisation admins" do
post(make_live_path(form_id: form.id), params: form_params)
expect(ActionMailer::Base.deliveries.count).to eq(0)
end
end

context "when all tasks are not complete" do
Expand Down
Loading
Loading