From 3d7d7590299254e96470d83312c9ca194238c76b Mon Sep 17 00:00:00 2001
From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com>
Date: Mon, 12 Aug 2024 13:23:05 +0100
Subject: [PATCH] Refactor details view and add tests
---
.../merge_requests/_details_list.html.erb | 27 +++
.../merge_requests/_summary_card.html.erb | 8 +
app/views/merge_requests/details.html.erb | 174 ++++--------------
spec/factories/merge_requests.rb | 3 +-
.../merge_requests/details.html.erb_spec.rb | 105 +++++++++++
5 files changed, 182 insertions(+), 135 deletions(-)
create mode 100644 app/views/merge_requests/_details_list.html.erb
create mode 100644 app/views/merge_requests/_summary_card.html.erb
create mode 100644 spec/views/merge_requests/details.html.erb_spec.rb
diff --git a/app/views/merge_requests/_details_list.html.erb b/app/views/merge_requests/_details_list.html.erb
new file mode 100644
index 000000000..d67bc8336
--- /dev/null
+++ b/app/views/merge_requests/_details_list.html.erb
@@ -0,0 +1,27 @@
+<%= govuk_summary_list do |summary_list| %>
+ <% details.each do |detail| %>
+ <% summary_list.with_row do |row| %>
+ <% row.with_key { detail[:label]} %>
+
+ <% row.with_value do %>
+
+ <% if detail[:value].html_safe? %>
+ <%= raw(detail[:value]) %>
+ <% elsif detail[:value].is_a?(Date) || detail[:value].is_a?(Time) %>
+ <%= detail[:value].strftime("%d %B %Y") %>
+ <% else %>
+ <%= simple_format(detail[:value]) %>
+ <% end %>
+
+ <% end %>
+
+ <% if detail[:action].present? %>
+ <% row.with_action(
+ text: detail[:action][:text],
+ href: detail[:action][:href],
+ visually_hidden_text: detail[:action][:visually_hidden_text],
+ ) %>
+ <% end %>
+ <% end %>
+ <% end %>
+<% end %>
diff --git a/app/views/merge_requests/_summary_card.html.erb b/app/views/merge_requests/_summary_card.html.erb
new file mode 100644
index 000000000..b6d5ae0bc
--- /dev/null
+++ b/app/views/merge_requests/_summary_card.html.erb
@@ -0,0 +1,8 @@
+
-
-
-
The absorbing organisation must accept the Data Sharing Agreement before merging.
-
Contact the Data Protection Officer:
+<% unless @merge_request.signed_dsa || @merge_request.absorbing_organisation_id.blank? %>
+
+
+
+ The absorbing organisation must accept the Data Sharing Agreement before merging.
+
<% if @merge_request.dpo_user %>
- <%= link_to @merge_request.dpo_user.name, user_path(@merge_request.dpo_user.id) %>
+ Contact the Data Protection Officer: <%= link_to @merge_request.dpo_user.name, user_path(@merge_request.dpo_user.id) %>
<% else %>
- None belong to the organisation
+ <%= @merge_request.absorbing_organisation_name %> does not have a Data Protection Officer. You can assign one on the <%= link_to 'users page', "#{organisation_path(@merge_request.absorbing_organisation_id)}/users" %>.
<% end %>
-
+
-
<% end %>
Merge details
<%= @merge_request.absorbing_organisation_name %>
+<% unless @merge_request.status == "request_merged"%>
class="govuk-button" data-module="govuk-button">
Begin merge
- class="govuk-button govuk-button--warning" data-module="govuk-button">
+
Delete merge request
+<% end %>
-
-
-
-
-
-
-
-
-
- <%= display_value_or_placeholder(@merge_request.requesting_user&.name) %>
-
-
-
-
- <% ticket_base_url = "https://dluhcdigital.atlassian.net/browse/" %>
-
- <% if @merge_request.helpdesk_ticket.blank? %>
- <%= display_value_or_placeholder(nil) %>
- <% else %>
-
- <%= @merge_request.helpdesk_ticket %> (opens in a new tab)
-
- <% end %>
-
- Change
-
-
-
- <%= status_tag(@merge_request.status) %>
-
-
-
-
+<% request_details = [
+ { label: "Requester", value: display_value_or_placeholder(@merge_request.requesting_user&.name) },
+ { label: "Helpdesk ticket", value: @merge_request.helpdesk_ticket.present? ? link_to(@merge_request.helpdesk_ticket, "https://dluhcdigital.atlassian.net/browse/#{@merge_request.helpdesk_ticket}", target: "_blank", rel: "noopener noreferrer") : display_value_or_placeholder(nil), action: @merge_request.status == "request_merged" ? nil : { text: "Change", href: "#", visually_hidden_text: "helpdesk ticket" } },
+ { label: "Status", value: status_tag(@merge_request.status) },
+] %>
-
-
-
-
-
-
-
-
-
- <%= display_value_or_placeholder(@merge_request.absorbing_organisation_name) %>
- Change
-
-
-
-
- <% if @merge_request.other_merging_organisations.blank? %>
- <%= display_value_or_placeholder(nil) %>
- <% else %>
- <% @merge_request.other_merging_organisations.split(',').each do |organisation| %>
- <%= organisation.strip %>
- <% end %>
- <% end %>
-
- Change
-
-
-
- <%= display_value_or_placeholder(@merge_request.merge_date) %>
- Change
-
-
-
+<%= render partial: "merge_requests/summary_card", locals: { title: "Request details", details: request_details } %>
-
-
-
-
-
-
-
-
-
- <%= display_value_or_placeholder(@merge_request.total_users) %>
- View
-
-
-
- <%= display_value_or_placeholder(@merge_request.total_schemes) %>
- View
-
-
-
-
- <% if @merge_request.total_lettings_logs.blank? && @merge_request.total_sales_logs.blank? %>
- <%= display_value_or_placeholder(nil) %>
- <% else %>
- <% unless @merge_request.total_lettings_logs.blank? %>
- <%= @merge_request.total_lettings_logs %> lettings logs
- <% end %>
-
- <% unless @merge_request.total_sales_logs.blank? %>
- <%= @merge_request.total_sales_logs %> sales logs
- <% end %>
- <% end %>
-
- View
-
-
-
-
- <% if @merge_request.total_stock_owners.blank? && @merge_request.total_managing_agents.blank? %>
- <%= display_value_or_placeholder(nil) %>
- <% else %>
- <% unless @merge_request.total_stock_owners.blank? %>
- <%= @merge_request.total_stock_owners %> stock owners
- <% end %>
-
- <% unless @merge_request.total_managing_agents.blank? %>
- <%= @merge_request.total_managing_agents %> managing agents
- <% end %>
- <% end %>
-
- View
-
-
-
+<% merge_details = [
+ { label: "Absorbing organisation", value: display_value_or_placeholder(@merge_request.absorbing_organisation_name), action: @merge_request.status == "request_merged" ? nil : { text: "Change", href: "#", visually_hidden_text: "absorbing organisation" } },
+ { label: "Merging organisations", value: @merge_request.other_merging_organisations.present? ? @merge_request.other_merging_organisations.split(',').map(&:strip).join('
').html_safe : display_value_or_placeholder(nil), action: @merge_request.status == "request_merged" ? nil : { text: "Change", href: "#", visually_hidden_text: "merging organisations" } },
+ { label: "Merge date", value: display_value_or_placeholder(@merge_request.merge_date), action: @merge_request.status == "request_merged" ? nil : { text: "Change", href: "#", visually_hidden_text: "merge date" } },
+] %>
+
+<%= render partial: "merge_requests/summary_card", locals: { title: "Merge details", details: merge_details } %>
+
+<% unless @merge_request.status == "incomplete" %>
+ <% merge_outcomes = [
+ { label: "Total users after merge", value: display_value_or_placeholder(@merge_request.total_users), action: { text: "View", href: "#", visually_hidden_text: "total users after merge" } },
+ { label: "Total schemes after merge", value: display_value_or_placeholder(@merge_request.total_schemes), action: { text: "View", href: "#", visually_hidden_text: "total schemes after merge" } },
+ { label: "Total logs after merge", value: @merge_request.total_lettings_logs.present? || @merge_request.total_sales_logs.present? ? "#{@merge_request.total_lettings_logs} lettings logs
#{@merge_request.total_sales_logs} sales logs".html_safe : display_value_or_placeholder(nil), action: { text: "View", href: "#", visually_hidden_text: "total logs after merge" } },
+ { label: "Total stock owners & managing agents after merge", value: @merge_request.total_stock_owners.present? || @merge_request.total_managing_agents.present? ? "#{@merge_request.total_stock_owners} stock owners
#{@merge_request.total_managing_agents} managing agents".html_safe : display_value_or_placeholder(nil), action: { text: "View", href: "#", visually_hidden_text: "total stock owners & managing agents after merge" } }
+ ] %>
+
+ <%= render partial: "merge_requests/summary_card", locals: { title: "Merge outcomes", details: merge_outcomes } %>
+<% end %>
diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb
index 888639b82..d46370e2a 100644
--- a/spec/factories/merge_requests.rb
+++ b/spec/factories/merge_requests.rb
@@ -1,7 +1,8 @@
FactoryBot.define do
factory :merge_request do
- status { "incomplete" }
+ status { "Incomplete" }
merge_date { nil }
+ helpdesk_ticket { "MSD-99999" }
association :requesting_organisation, factory: :organisation
end
end
diff --git a/spec/views/merge_requests/details.html.erb_spec.rb b/spec/views/merge_requests/details.html.erb_spec.rb
new file mode 100644
index 000000000..dea19a39b
--- /dev/null
+++ b/spec/views/merge_requests/details.html.erb_spec.rb
@@ -0,0 +1,105 @@
+require "rails_helper"
+
+RSpec.describe "merge_requests/details.html.erb", type: :view do
+ let(:absorbing_organisation) { create(:organisation, name: "Absorbing Org") }
+ let(:dpo_user) { create(:user, name: "DPO User", is_dpo: true, organisation: absorbing_organisation) }
+ let(:merge_request) { create(:merge_request, absorbing_organisation_id: absorbing_organisation.id, signed_dsa: false, status: 1) }
+
+ before do
+ assign(:merge_request, merge_request)
+ render
+ end
+
+ it "displays the correct title" do
+ expect(rendered).to have_selector("h1.govuk-heading-l") do |h1|
+ expect(h1).to have_selector("span.govuk-caption-l", text: "Merge details")
+ expect(h1).to have_content("Absorbing Org")
+ end
+ end
+
+ it "displays the notification banner when DSA is not signed" do
+ expect(rendered).to have_selector(".govuk-notification-banner")
+ expect(rendered).to have_content("The absorbing organisation must accept the Data Sharing Agreement before merging.")
+ end
+
+ it "displays the requester details" do
+ expect(rendered).to have_selector("dt", text: "Requester")
+ expect(rendered).to have_selector("dd", text: merge_request.requesting_user&.name || "You didn't answer this question")
+ end
+
+ it "displays the helpdesk ticket details" do
+ expect(rendered).to have_selector("dt", text: "Helpdesk ticket")
+ if merge_request.helpdesk_ticket.present?
+ expect(rendered).to have_link(merge_request.helpdesk_ticket, href: "https://dluhcdigital.atlassian.net/browse/#{merge_request.helpdesk_ticket}")
+ else
+ expect(rendered).to have_selector("dd", text: "You didn't answer this question")
+ end
+ end
+
+ it "displays the status details" do
+ expect(rendered).to have_selector("dt", text: "Status")
+ expect(rendered).to have_selector("dd", text: "Incomplete")
+ end
+
+ it "displays the absorbing organisation details" do
+ expect(rendered).to have_selector("dt", text: "Absorbing organisation")
+ expect(rendered).to have_selector("dd", text: merge_request.absorbing_organisation_name)
+ end
+
+ it "displays the merging organisations details" do
+ expect(rendered).to have_selector("dt", text: "Merging organisations")
+ if merge_request.other_merging_organisations.present?
+ merge_request.other_merging_organisations.split(",").each do |organisation|
+ expect(rendered).to have_selector("dd", text: organisation.strip)
+ end
+ end
+ end
+
+ it "displays the merge date details" do
+ expect(rendered).to have_selector("dt", text: "Merge date")
+ expect(rendered).to have_selector("dd", text: merge_request.merge_date || "You didn't answer this question")
+ end
+
+ context "when the merge request is complete" do
+
+ before do
+ merge_request.update!(status: 4, signed_dsa: true, total_users: 10, total_schemes: 5, total_lettings_logs: 20, total_sales_logs: 30, total_stock_owners: 40, total_managing_agents: 50)
+ assign(:merge_request, merge_request)
+ render
+ end
+
+ it "has status of 'Merged'" do
+ expect(rendered).to have_selector("dd", text: "Merged")
+ end
+
+ it "displays the total users after merge details" do
+ expect(rendered).to have_selector("dt", text: "Total users after merge")
+ expect(rendered).to have_selector("dd", text: merge_request.total_users)
+ end
+
+ it "displays the total schemes after merge details" do
+ expect(rendered).to have_selector("dt", text: "Total schemes after merge")
+ expect(rendered).to have_selector("dd", text: merge_request.total_schemes)
+ end
+
+ it "displays the total logs after merge details" do
+ expect(rendered).to have_selector("dt", text: "Total logs after merge")
+ if merge_request.total_lettings_logs.present? || merge_request.total_sales_logs.present?
+ combined_text = []
+ combined_text << "#{merge_request.total_lettings_logs} lettings logs" if merge_request.total_lettings_logs.present?
+ combined_text << "#{merge_request.total_sales_logs} sales logs" if merge_request.total_sales_logs.present?
+ expect(rendered).to have_selector("dd", text: combined_text.join(""))
+ end
+ end
+
+ it "displays the total stock owners & managing agents after merge details" do
+ expect(rendered).to have_selector("dt", text: "Total stock owners & managing agents after merge")
+ if merge_request.total_stock_owners.present? || merge_request.total_managing_agents.present?
+ combined_text = []
+ combined_text << "#{merge_request.total_stock_owners} stock owners" if merge_request.total_stock_owners.present?
+ combined_text << "#{merge_request.total_managing_agents} managing agents" if merge_request.total_managing_agents.present?
+ expect(rendered).to have_selector("dd", text: combined_text.join(""))
+ end
+ end
+ end
+end