diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index 1e350829a..868b4936d 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -3,7 +3,11 @@ class SessionsController < ApplicationController
session[session_name_for(params[:filter_type])] = "{}"
path_params = params[:path_params].presence || {}
- redirect_to send("#{params[:filter_type]}_path", scheme_id: path_params[:scheme_id], search: path_params[:search])
+ if path_params[:organisation_id].present?
+ redirect_to send("#{params[:filter_type]}_organisation_path", id: path_params[:organisation_id], scheme_id: path_params[:scheme_id], search: path_params[:search])
+ else
+ redirect_to send("#{params[:filter_type]}_path", scheme_id: path_params[:scheme_id], search: path_params[:search])
+ end
end
private
diff --git a/app/helpers/duplicate_logs_helper.rb b/app/helpers/duplicate_logs_helper.rb
index ec8ac9185..8df911103 100644
--- a/app/helpers/duplicate_logs_helper.rb
+++ b/app/helpers/duplicate_logs_helper.rb
@@ -33,15 +33,15 @@ module DuplicateLogsHelper
def duplicates_for_user(user)
{
- lettings: user.duplicate_lettings_logs_sets,
- sales: user.duplicate_sales_logs_sets,
+ lettings: user.editable_duplicate_lettings_logs_sets,
+ sales: user.editable_duplicate_sales_logs_sets,
}
end
def duplicates_for_organisation(organisation)
{
- lettings: organisation.duplicate_lettings_logs_sets,
- sales: organisation.duplicate_sales_logs_sets,
+ lettings: organisation.editable_duplicate_lettings_logs_sets,
+ sales: organisation.editable_duplicate_sales_logs_sets,
}
end
diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb
index 91038dbc9..2df2d21b1 100644
--- a/app/helpers/filters_helper.rb
+++ b/app/helpers/filters_helper.rb
@@ -139,6 +139,10 @@ module FiltersHelper
request.path.include?("/lettings-logs")
end
+ def specific_organisation_path?
+ request.path.include?("/organisations")
+ end
+
def applied_filters_count(filter_type)
filters_count(applied_filters(filter_type))
end
diff --git a/app/helpers/schemes_helper.rb b/app/helpers/schemes_helper.rb
index 6b069fbbb..aea892a18 100644
--- a/app/helpers/schemes_helper.rb
+++ b/app/helpers/schemes_helper.rb
@@ -11,11 +11,11 @@ module SchemesHelper
{ name: "Support services provided by", value: scheme.arrangement_type },
{ name: "Primary client group", value: scheme.primary_client_group },
{ name: "Has another client group", value: scheme.has_other_client_group },
- { name: "Secondary client group", value: scheme.secondary_client_group },
+ scheme.has_other_client_group == "Yes" ? { name: "Secondary client group", value: scheme.secondary_client_group } : nil,
{ name: "Level of support given", value: scheme.support_type },
{ name: "Intended length of stay", value: scheme.intended_stay },
{ name: "Availability", value: scheme_availability(scheme) },
- ]
+ ].compact
end
def scheme_availability(scheme)
diff --git a/app/models/form_handler.rb b/app/models/form_handler.rb
index 645efb1b4..83bfb0f8a 100644
--- a/app/models/form_handler.rb
+++ b/app/models/form_handler.rb
@@ -178,6 +178,22 @@ class FormHandler
end
end
+ def lettings_earliest_open_for_editing_collection_start_date(now: Time.zone.now)
+ if lettings_in_edit_crossover_period?(now:)
+ collection_start_date(now) - 1.year
+ else
+ collection_start_date(now)
+ end
+ end
+
+ def sales_earliest_open_for_editing_collection_start_date(now: Time.zone.now)
+ if sales_in_edit_crossover_period?(now:)
+ collection_start_date(now) - 1.year
+ else
+ collection_start_date(now)
+ end
+ end
+
private
def get_all_forms
diff --git a/app/models/lettings_log.rb b/app/models/lettings_log.rb
index 51dc6ff4d..cba85320a 100644
--- a/app/models/lettings_log.rb
+++ b/app/models/lettings_log.rb
@@ -659,7 +659,7 @@ private
not_required << "tshortfall" if tshortfall_unknown?
not_required << "tenancylength" if tenancylength_optional?
- not_required |= %w[address_line2 county postcode_full] if startdate && startdate.year >= 2023
+ not_required |= %w[address_line2 county postcode_full] if startdate && collection_start_year_for_date(startdate) >= 2023
not_required
end
@@ -780,6 +780,6 @@ private
end
def should_process_uprn_change?
- uprn && startdate && (uprn_changed? || startdate_changed?) && startdate.year >= 2023
+ uprn && startdate && (uprn_changed? || startdate_changed?) && collection_start_year_for_date(startdate) >= 2023
end
end
diff --git a/app/models/organisation.rb b/app/models/organisation.rb
index e17d0d6eb..1e05bddab 100644
--- a/app/models/organisation.rb
+++ b/app/models/organisation.rb
@@ -133,12 +133,12 @@ class Organisation < ApplicationRecord
:active
end
- def duplicate_lettings_logs_sets
- lettings_logs.duplicate_sets.map { |array_str| array_str ? array_str.map(&:to_i) : [] }
+ def editable_duplicate_lettings_logs_sets
+ lettings_logs.after_date(FormHandler.instance.lettings_earliest_open_for_editing_collection_start_date).duplicate_sets.map { |array_str| array_str ? array_str.map(&:to_i) : [] }
end
- def duplicate_sales_logs_sets
- sales_logs.duplicate_sets.map { |array_str| array_str ? array_str.map(&:to_i) : [] }
+ def editable_duplicate_sales_logs_sets
+ sales_logs.after_date(FormHandler.instance.sales_earliest_open_for_editing_collection_start_date).duplicate_sets.map { |array_str| array_str ? array_str.map(&:to_i) : [] }
end
def recently_absorbed_organisations_grouped_by_merge_date
diff --git a/app/models/sales_log.rb b/app/models/sales_log.rb
index 905b7d5a1..bf059cc88 100644
--- a/app/models/sales_log.rb
+++ b/app/models/sales_log.rb
@@ -115,7 +115,7 @@ class SalesLog < Log
not_required << "mortlen" if mortlen_optional?
not_required << "frombeds" if frombeds_optional?
- not_required |= %w[address_line2 county postcode_full] if saledate && saledate.year >= 2023
+ not_required |= %w[address_line2 county postcode_full] if saledate && collection_start_year_for_date(saledate) >= 2023
not_required
end
@@ -393,7 +393,7 @@ class SalesLog < Log
end
def should_process_uprn_change?
- uprn && saledate && (uprn_changed? || saledate_changed?) && saledate.year >= 2023
+ uprn && saledate && (uprn_changed? || saledate_changed?) && collection_start_year_for_date(saledate) >= 2023
end
def value_with_discount
diff --git a/app/models/scheme.rb b/app/models/scheme.rb
index 254953c19..9d760998d 100644
--- a/app/models/scheme.rb
+++ b/app/models/scheme.rb
@@ -6,7 +6,7 @@ class Scheme < ApplicationRecord
has_paper_trail
- scope :filter_by_id, ->(id) { where(id: (id.start_with?("S") ? id[1..] : id)) }
+ scope :filter_by_id, ->(id) { where(id: (id.start_with?("S", "s") ? id[1..] : id)) }
scope :search_by_service_name, ->(name) { where("service_name ILIKE ?", "%#{name}%") }
scope :search_by_postcode, ->(postcode) { where("schemes.id IN (SELECT DISTINCT scheme_id FROM locations WHERE REPLACE(locations.postcode, ' ', '') ILIKE ?)", "%#{postcode.delete(' ')}%") }
scope :search_by_location_name, ->(name) { where("schemes.id IN (SELECT DISTINCT scheme_id FROM locations WHERE locations.name ILIKE ?)", "%#{name}%") }
diff --git a/app/models/user.rb b/app/models/user.rb
index 7042034b4..52e2c850d 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -15,8 +15,8 @@ class User < ApplicationRecord
validates :email, uniqueness: { allow_blank: true, case_sensitive: true, if: :will_save_change_to_email? }
validates :email, format: { with: Devise.email_regexp, allow_blank: true, if: :will_save_change_to_email? }
validates :password, presence: { if: :password_required? }
- validates :password, confirmation: { if: :password_required? }
validates :password, length: { within: Devise.password_length, allow_blank: true }
+ validates :password, confirmation: { if: :password_required? }
after_validation :send_data_protection_confirmation_reminder, if: :is_dpo_changed?
@@ -203,12 +203,12 @@ class User < ApplicationRecord
super && active?
end
- def duplicate_lettings_logs_sets
- lettings_logs.duplicate_sets(id).map { |array_str| array_str ? array_str.map(&:to_i) : [] }
+ def editable_duplicate_lettings_logs_sets
+ lettings_logs.after_date(FormHandler.instance.lettings_earliest_open_for_editing_collection_start_date).duplicate_sets(id).map { |array_str| array_str ? array_str.map(&:to_i) : [] }
end
- def duplicate_sales_logs_sets
- sales_logs.duplicate_sets(id).map { |array_str| array_str ? array_str.map(&:to_i) : [] }
+ def editable_duplicate_sales_logs_sets
+ sales_logs.after_date(FormHandler.instance.sales_earliest_open_for_editing_collection_start_date).duplicate_sets(id).map { |array_str| array_str ? array_str.map(&:to_i) : [] }
end
protected
diff --git a/app/views/logs/_log_filters.html.erb b/app/views/logs/_log_filters.html.erb
index 96e9eeeff..72f73e47c 100644
--- a/app/views/logs/_log_filters.html.erb
+++ b/app/views/logs/_log_filters.html.erb
@@ -12,7 +12,7 @@
<%= filters_applied_text(@filter_type) %>
- <%= reset_filters_link(@filter_type, { search: request.params["search"] }.compact) %>
+ <%= reset_filters_link(@filter_type, { search: request.params["search"], organisation_id: @organisation&.id }.compact) %>
<% if bulk_upload_options(@bulk_upload).present? %>
diff --git a/app/views/schemes/_scheme_filters.html.erb b/app/views/schemes/_scheme_filters.html.erb
index 6e66e38ba..af9ed093f 100644
--- a/app/views/schemes/_scheme_filters.html.erb
+++ b/app/views/schemes/_scheme_filters.html.erb
@@ -5,13 +5,13 @@
- <%= form_with url: users_path, html: { method: :get } do |f| %>
+ <%= form_with url: specific_organisation_path? ? users_organisation_path(@organisation) : users_path, html: { method: :get } do |f| %>
<%= filters_applied_text(@filter_type) %>
- <%= reset_filters_link(@filter_type, { search: request.params["search"] }.compact) %>
+ <%= reset_filters_link(@filter_type, { search: request.params["search"], organisation_id: @organisation&.id }.compact) %>
diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml
index 16299ea10..e40af1d37 100644
--- a/config/locales/devise.en.yml
+++ b/config/locales/devise.en.yml
@@ -62,7 +62,7 @@ en:
messages:
already_confirmed: "Email has already been confirmed. Sign in."
blank: "can’t be blank"
- confirmation: "Password confirmation doesn’t match new password"
+ confirmation: "The passwords you entered do not match. Try again."
confirmation_period_expired: "Email needs to be confirmed within %{period}. Request a new link below."
expired: "Token has expired. Request a new token."
not_found: "was not found"
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 69a4a8bb9..b420e3088 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -164,7 +164,9 @@ en:
blank: "Select role"
password:
blank: Enter a password
- too_short: Password is too short (minimum is %{count} characters)
+ too_short: The password you entered is too short. Enter a password that is %{count} characters or longer.
+ reset_password_token:
+ invalid: "That link is invalid. Check you are using the correct link."
merge_request:
attributes:
absorbing_organisation_id:
diff --git a/spec/features/schemes_spec.rb b/spec/features/schemes_spec.rb
index d7a9609f8..5d57b31e6 100644
--- a/spec/features/schemes_spec.rb
+++ b/spec/features/schemes_spec.rb
@@ -81,7 +81,7 @@ RSpec.describe "Schemes scheme Features" do
it "displays the filters component with a correct count and clear button" do
expect(page).to have_content("2 filters applied")
- expect(page).to have_link("Clear", href: "/clear-filters?filter_type=schemes")
+ expect(page).to have_link("Clear", href: /clear-filters\?filter_type=schemes/)
end
context "when clearing the filters" do
diff --git a/spec/features/user_spec.rb b/spec/features/user_spec.rb
index ce0e1317f..2da53970b 100644
--- a/spec/features/user_spec.rb
+++ b/spec/features/user_spec.rb
@@ -252,7 +252,7 @@ RSpec.describe "User Features" do
context "when no filters are selected" do
it "displays the filters component with no clear button" do
expect(page).to have_content("No filters applied")
- expect(page).not_to have_link("Clear", href: "/clear-filters?filter_type=users")
+ expect(page).not_to have_link("Clear", href: /clear-filters\?filter_type=users/)
end
end
@@ -265,7 +265,7 @@ RSpec.describe "User Features" do
it "displays the filters component with a correct count and clear button" do
expect(page).to have_content("2 filters applied")
- expect(page).to have_link("Clear", href: "/clear-filters?filter_type=users")
+ expect(page).to have_link("Clear", href: /clear-filters\?filter_type=users/)
end
context "when clearing the filters" do
diff --git a/spec/helpers/schemes_helper_spec.rb b/spec/helpers/schemes_helper_spec.rb
index 5aa825e79..ab4b8da5b 100644
--- a/spec/helpers/schemes_helper_spec.rb
+++ b/spec/helpers/schemes_helper_spec.rb
@@ -266,6 +266,31 @@ RSpec.describe SchemesHelper do
end
end
end
+
+ context "when scheme has no secondary client group" do
+ before do
+ scheme.update!(has_other_client_group: 0)
+ end
+
+ it "returns correct display attributes" do
+ attributes = [
+ { name: "Scheme code", value: "S#{scheme.id}" },
+ { name: "Name", value: "Test service_name", edit: true },
+ { name: "Status", value: status_tag(:incomplete) },
+ { name: "Confidential information", value: "No", edit: true },
+ { name: "Type of scheme", value: "Housing for older people" },
+ { name: "Registered under Care Standards Act 2000", value: "Yes – registered care home providing personal care" },
+ { name: "Housing stock owned by", value: "Acme LTD Owning", edit: true },
+ { name: "Support services provided by", value: "A registered charity or voluntary organisation" },
+ { name: "Primary client group", value: "Rough sleepers" },
+ { name: "Has another client group", value: "No" },
+ { name: "Level of support given", value: "High level" },
+ { name: "Intended length of stay", value: "Permanent" },
+ { name: "Availability", value: "Active from 1 April 2021" },
+ ]
+ expect(display_scheme_attributes(scheme)).to eq(attributes)
+ end
+ end
end
describe "edit_scheme_text" do
diff --git a/spec/lib/tasks/blank_migrated_soctenant_values_spec.rb b/spec/lib/tasks/blank_migrated_soctenant_values_spec.rb
index ddc5ca8e9..333a846cc 100644
--- a/spec/lib/tasks/blank_migrated_soctenant_values_spec.rb
+++ b/spec/lib/tasks/blank_migrated_soctenant_values_spec.rb
@@ -30,21 +30,30 @@ RSpec.describe "blank_migrated_soctenant_values" do
expect(sales_log.values_updated_at).not_to be_nil
end
- it "does not blank soctenant (and subsequent questions) values from 2022 logs" do
- sales_log.old_id = "404"
- sales_log.frombeds = nil
- sales_log.fromprop = 0 # don't know
- sales_log.socprevten = 10 # don't know
- sales_log.soctenant = 0 # don't know
- sales_log.saledate = Time.zone.local(2022, 5, 5)
- sales_log.save!
- task.invoke
- sales_log.reload
- expect(sales_log.soctenant).to eq(0)
- expect(sales_log.frombeds).to eq(nil)
- expect(sales_log.fromprop).to eq(0)
- expect(sales_log.socprevten).to eq(10)
- expect(sales_log.values_updated_at).to be_nil
+ context "with 2022 logs" do
+ around do |example|
+ Timecop.freeze(Time.zone.local(2022, 5, 5)) do
+ Singleton.__init__(FormHandler)
+ example.run
+ end
+ end
+
+ it "does not blank soctenant (and subsequent questions) values" do
+ sales_log.old_id = "404"
+ sales_log.frombeds = nil
+ sales_log.fromprop = 0 # don't know
+ sales_log.socprevten = 10 # don't know
+ sales_log.soctenant = 0 # don't know
+ sales_log.saledate = Time.zone.local(2022, 5, 5)
+ sales_log.save!
+ task.invoke
+ sales_log.reload
+ expect(sales_log.soctenant).to eq(0)
+ expect(sales_log.frombeds).to eq(nil)
+ expect(sales_log.fromprop).to eq(0)
+ expect(sales_log.socprevten).to eq(10)
+ expect(sales_log.values_updated_at).to be_nil
+ end
end
it "does not blank soctenant (and subsequent questions) values from non imported logs" do
diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb
index 6c4d9b1e0..145155ee2 100644
--- a/spec/models/lettings_log_spec.rb
+++ b/spec/models/lettings_log_spec.rb
@@ -1576,7 +1576,7 @@ RSpec.describe LettingsLog do
expect { lettings_log.update!(renewal: 1) }.to change(lettings_log, :underoccupation_benefitcap).to 2
Timecop.return
Singleton.__init__(FormHandler)
- expect { lettings_log.update!(startdate: Time.zone.local(2023, 1, 1)) }.to change(lettings_log, :underoccupation_benefitcap).from(2).to nil
+ expect { lettings_log.update!(startdate: Time.zone.local(2023, 4, 1)) }.to change(lettings_log, :underoccupation_benefitcap).from(2).to nil
end
context "when the log is general needs" do
@@ -2122,10 +2122,15 @@ RSpec.describe LettingsLog do
context "and the location no local authorities associated with the location_code" do
before do
+ Timecop.freeze(Time.zone.local(2022, 4, 2))
location.update!(location_code: "E01231231")
lettings_log.update!(location:)
end
+ after do
+ Timecop.return
+ end
+
it "returns the correct la" do
expect(location.location_code).to eq("E01231231")
expect(lettings_log["location_id"]).to eq(location.id)
@@ -2334,7 +2339,7 @@ RSpec.describe LettingsLog do
end
end
- context "when saledate is before 2023" do
+ context "when startdate is before 2023" do
let(:lettings_log) { build(:lettings_log, startdate: Time.zone.parse("2022-07-01")) }
it "returns optional fields" do
@@ -2347,7 +2352,7 @@ RSpec.describe LettingsLog do
end
end
- context "when saledate is after 2023" do
+ context "when startdate is after 2023" do
let(:lettings_log) { build(:lettings_log, startdate: Time.zone.parse("2023-07-01")) }
it "returns optional fields" do
diff --git a/spec/models/scheme_spec.rb b/spec/models/scheme_spec.rb
index 70eccc5c2..cb9d74578 100644
--- a/spec/models/scheme_spec.rb
+++ b/spec/models/scheme_spec.rb
@@ -77,6 +77,8 @@ RSpec.describe Scheme, type: :model do
it "returns case insensitive matching records" do
expect(described_class.search_by(scheme_1.id.to_s).count).to eq(1)
+ expect(described_class.search_by("S#{scheme_1.id}").count).to eq(1)
+ expect(described_class.search_by("s#{scheme_1.id}").count).to eq(1)
expect(described_class.search_by(scheme_1.id.to_s).first.id).to eq(scheme_1.id)
expect(described_class.search_by(scheme_2.service_name.upcase).count).to eq(1)
expect(described_class.search_by(scheme_2.service_name.downcase).count).to eq(1)
diff --git a/spec/requests/auth/passwords_controller_spec.rb b/spec/requests/auth/passwords_controller_spec.rb
index 29a032395..92c36608c 100644
--- a/spec/requests/auth/passwords_controller_spec.rb
+++ b/spec/requests/auth/passwords_controller_spec.rb
@@ -107,7 +107,7 @@ RSpec.describe Auth::PasswordsController, type: :request do
put "/account/password", headers: headers, params: params
expect(response).to have_http_status(:unprocessable_entity)
expect(page).to have_css("h1", text: "Reset your password")
- expect(page).to have_content("doesn’t match new password")
+ expect(page).to have_content("passwords you entered do not match")
end
end
diff --git a/spec/requests/duplicate_logs_controller_spec.rb b/spec/requests/duplicate_logs_controller_spec.rb
index 933a0f54d..960b43a22 100644
--- a/spec/requests/duplicate_logs_controller_spec.rb
+++ b/spec/requests/duplicate_logs_controller_spec.rb
@@ -717,13 +717,13 @@ RSpec.describe DuplicateLogsController, type: :request do
before do
allow(Organisation).to receive(:find).with(user.organisation_id.to_s).and_return(user.organisation)
- allow(user.organisation).to receive(:duplicate_lettings_logs_sets).and_return([[1, 2], [3, 4, 5]])
- allow(user.organisation).to receive(:duplicate_sales_logs_sets).and_return([[11, 12]])
+ allow(user.organisation).to receive(:editable_duplicate_lettings_logs_sets).and_return([[1, 2], [3, 4, 5]])
+ allow(user.organisation).to receive(:editable_duplicate_sales_logs_sets).and_return([[11, 12]])
end
it "gets organisation duplicates" do
- expect(user.organisation).to receive(:duplicate_lettings_logs_sets)
- expect(user.organisation).to receive(:duplicate_sales_logs_sets)
+ expect(user.organisation).to receive(:editable_duplicate_lettings_logs_sets)
+ expect(user.organisation).to receive(:editable_duplicate_sales_logs_sets)
get organisation_duplicates_path(organisation_id: user.organisation_id)
end
@@ -759,8 +759,8 @@ RSpec.describe DuplicateLogsController, type: :request do
context "when there are no duplicate logs" do
before do
allow(Organisation).to receive(:find).with(user.organisation_id.to_s).and_return(user.organisation)
- allow(user.organisation).to receive(:duplicate_lettings_logs_sets).and_return([])
- allow(user.organisation).to receive(:duplicate_sales_logs_sets).and_return([])
+ allow(user.organisation).to receive(:editable_duplicate_lettings_logs_sets).and_return([])
+ allow(user.organisation).to receive(:editable_duplicate_sales_logs_sets).and_return([])
get organisation_duplicates_path(organisation_id: user.organisation_id)
end
@@ -780,13 +780,13 @@ RSpec.describe DuplicateLogsController, type: :request do
let(:user) { create(:user, :data_coordinator) }
before do
- allow(user.organisation).to receive(:duplicate_lettings_logs_sets).and_return([[1, 2], [3, 4, 5]])
- allow(user.organisation).to receive(:duplicate_sales_logs_sets).and_return([[11, 12]])
+ allow(user.organisation).to receive(:editable_duplicate_lettings_logs_sets).and_return([[1, 2], [3, 4, 5]])
+ allow(user.organisation).to receive(:editable_duplicate_sales_logs_sets).and_return([[11, 12]])
end
it "gets organisation duplicates" do
- expect(user.organisation).to receive(:duplicate_lettings_logs_sets)
- expect(user.organisation).to receive(:duplicate_sales_logs_sets)
+ expect(user.organisation).to receive(:editable_duplicate_lettings_logs_sets)
+ expect(user.organisation).to receive(:editable_duplicate_sales_logs_sets)
get duplicate_logs_path(organisation_id: user.organisation.id)
end
end
@@ -795,13 +795,13 @@ RSpec.describe DuplicateLogsController, type: :request do
let(:user) { create(:user) }
before do
- allow(user).to receive(:duplicate_lettings_logs_sets).and_return([[1, 2], [3, 4, 5]])
- allow(user).to receive(:duplicate_sales_logs_sets).and_return([[11, 12]])
+ allow(user).to receive(:editable_duplicate_lettings_logs_sets).and_return([[1, 2], [3, 4, 5]])
+ allow(user).to receive(:editable_duplicate_sales_logs_sets).and_return([[11, 12]])
end
it "calls the helper method to retrieve duplicates for the current user" do
- expect(user).to receive(:duplicate_lettings_logs_sets)
- expect(user).to receive(:duplicate_sales_logs_sets)
+ expect(user).to receive(:editable_duplicate_lettings_logs_sets)
+ expect(user).to receive(:editable_duplicate_sales_logs_sets)
get duplicate_logs_path
end
@@ -836,8 +836,8 @@ RSpec.describe DuplicateLogsController, type: :request do
context "when there are no duplicate logs" do
before do
- allow(user).to receive(:duplicate_lettings_logs_sets).and_return([])
- allow(user).to receive(:duplicate_sales_logs_sets).and_return([])
+ allow(user).to receive(:editable_duplicate_lettings_logs_sets).and_return([])
+ allow(user).to receive(:editable_duplicate_sales_logs_sets).and_return([])
get duplicate_logs_path
end
diff --git a/spec/requests/form_controller_spec.rb b/spec/requests/form_controller_spec.rb
index 5f0e7b273..fbe3dbb1d 100644
--- a/spec/requests/form_controller_spec.rb
+++ b/spec/requests/form_controller_spec.rb
@@ -254,6 +254,15 @@ RSpec.describe FormController, type: :request do
end
describe "GET" do
+ around do |example|
+ Timecop.freeze(Time.zone.local(2022, 5, 1)) do
+ Singleton.__init__(FormHandler)
+ example.run
+ end
+ Timecop.return
+ Singleton.__init__(FormHandler)
+ end
+
context "with form pages" do
context "when forms exist" do
let(:lettings_log) { create(:lettings_log, :setup_completed, startdate: Time.zone.local(2022, 5, 1), owning_organisation: organisation, created_by: user) }
diff --git a/spec/requests/lettings_logs_controller_spec.rb b/spec/requests/lettings_logs_controller_spec.rb
index ea9debdc1..6844ad6b4 100644
--- a/spec/requests/lettings_logs_controller_spec.rb
+++ b/spec/requests/lettings_logs_controller_spec.rb
@@ -889,14 +889,12 @@ RSpec.describe LettingsLogsController, type: :request do
end
context "and there are duplicate logs for this user" do
- before do
- FactoryBot.create_list(:lettings_log, 2, :duplicate, owning_organisation: user.organisation, created_by: user)
- end
+ let!(:duplicate_logs) { FactoryBot.create_list(:lettings_log, 2, :duplicate, owning_organisation: user.organisation, created_by: user) }
it "displays a notification banner with a link to review logs" do
get lettings_logs_path
expect(page).to have_content "duplicate logs"
- expect(page).to have_link "Review logs" # add an href when routing done
+ expect(page).to have_link "Review logs", href: "/duplicate-logs?referrer=duplicate_logs_banner"
end
context "when there is one set of duplicates" do
@@ -904,6 +902,20 @@ RSpec.describe LettingsLogsController, type: :request do
get lettings_logs_path
expect(page).to have_content "There is 1 set of duplicate logs"
end
+
+ context "when the set is not editable" do
+ before do
+ duplicate_logs.each do |log|
+ log.startdate = Time.zone.now - 3.years
+ log.save!(validate: false)
+ end
+ end
+
+ it "does not display the banner" do
+ get lettings_logs_path
+ expect(page).not_to have_content "duplicate logs"
+ end
+ end
end
context "when there are multiple sets of duplicates" do
@@ -914,6 +926,21 @@ RSpec.describe LettingsLogsController, type: :request do
it "displays the correct copy in the banner" do
get lettings_logs_path
expect(page).to have_content "There are 2 sets of duplicate logs"
+ expect(page).to have_link "Review logs", href: "/duplicate-logs?referrer=duplicate_logs_banner"
+ end
+
+ context "when one set is not editable" do
+ before do
+ log = duplicate_logs.first
+ log.startdate = Time.zone.now - 3.years
+ log.save!(validate: false)
+ end
+
+ it "displays the correct copy in the banner" do
+ get lettings_logs_path
+ expect(page).to have_content "There is 1 set of duplicate logs"
+ expect(page).to have_link "Review logs", href: "/duplicate-logs?referrer=duplicate_logs_banner"
+ end
end
end
end
diff --git a/spec/requests/organisations_controller_spec.rb b/spec/requests/organisations_controller_spec.rb
index 340f1facf..4bd6e0eb6 100644
--- a/spec/requests/organisations_controller_spec.rb
+++ b/spec/requests/organisations_controller_spec.rb
@@ -1440,6 +1440,16 @@ RSpec.describe OrganisationsController, type: :request do
}.to enqueue_job(EmailCsvJob).with(user, nil, {}, false, organisation, codes_only_export_type)
end
end
+
+ context "when filters are applied" do
+ before do
+ get lettings_logs_organisation_path(organisation, status: %w[completed])
+ end
+
+ it "has clear filters link" do
+ expect(page).to have_link("Clear", href: clear_filters_path(filter_type: "lettings_logs", path_params: { organisation_id: organisation.id }))
+ end
+ end
end
context "when they view the sales logs tab" do
diff --git a/spec/requests/sales_logs_controller_spec.rb b/spec/requests/sales_logs_controller_spec.rb
index 97c5851fd..2b7f6e172 100644
--- a/spec/requests/sales_logs_controller_spec.rb
+++ b/spec/requests/sales_logs_controller_spec.rb
@@ -235,6 +235,18 @@ RSpec.describe SalesLogsController, type: :request do
expect(page).to have_link("Download (CSV, codes only)", href: "/sales-logs/csv-download?codes_only=true")
end
+ context "when there are duplicate logs for this user" do
+ before do
+ FactoryBot.create_list(:sales_log, 2, :duplicate, owning_organisation: user.organisation, created_by: user)
+ end
+
+ it "does not show a notification banner even if there are duplicate logs for this user" do
+ get sales_logs_path
+ expect(page).not_to have_content "duplicate logs"
+ expect(page).not_to have_link "Review logs"
+ end
+ end
+
context "when there are no logs in the database" do
before do
SalesLog.destroy_all
@@ -566,6 +578,12 @@ RSpec.describe SalesLogsController, type: :request do
expect(page).not_to have_link("Download (CSV, codes only)")
end
+ it "does not show a notification banner even if there are duplicate logs for this user" do
+ get sales_logs_path
+ expect(page).not_to have_content "duplicate logs"
+ expect(page).not_to have_link "Review logs"
+ end
+
context "when using a search query" do
let(:logs) { FactoryBot.create_list(:sales_log, 3, :completed, owning_organisation: user.organisation, created_by: user) }
let(:log_to_search) { FactoryBot.create(:sales_log, :completed, owning_organisation: user.organisation, created_by: user) }
@@ -727,6 +745,63 @@ RSpec.describe SalesLogsController, type: :request do
end
end
end
+
+ context "and there are duplicate logs for this user" do
+ let!(:duplicate_logs) { FactoryBot.create_list(:lettings_log, 2, :duplicate, owning_organisation: user.organisation, created_by: user) }
+
+ it "displays a notification banner with a link to review logs" do
+ get sales_logs_path
+ expect(page).to have_content "duplicate logs"
+ expect(page).to have_link "Review logs", href: "/duplicate-logs?referrer=duplicate_logs_banner"
+ end
+
+ context "when there is one set of duplicates" do
+ it "displays the correct copy in the banner" do
+ get sales_logs_path
+ expect(page).to have_content "There is 1 set of duplicate logs"
+ end
+
+ context "when the set is not editable" do
+ before do
+ duplicate_logs.each do |log|
+ log.startdate = Time.zone.now - 3.years
+ log.save!(validate: false)
+ end
+ end
+
+ it "does not display the banner" do
+ get sales_logs_path
+ expect(page).not_to have_content "duplicate logs"
+ end
+ end
+ end
+
+ context "when there are multiple sets of duplicates" do
+ before do
+ FactoryBot.create_list(:sales_log, 2, :duplicate, owning_organisation: user.organisation, created_by: user)
+ end
+
+ it "displays the correct copy in the banner" do
+ get sales_logs_path
+ expect(page).to have_content "There are 2 sets of duplicate logs"
+ expect(page).to have_link "Review logs", href: "/duplicate-logs?referrer=duplicate_logs_banner"
+ end
+
+ context "when one set is not editable" do
+ before do
+ log = duplicate_logs.first
+ log.startdate = Time.zone.now - 3.years
+ log.save!(validate: false)
+ end
+
+ it "displays the correct copy in the banner" do
+ get sales_logs_path
+ expect(page).to have_content "There is 1 set of duplicate logs"
+ expect(page).to have_link "Review logs", href: "/duplicate-logs?referrer=duplicate_logs_banner"
+ end
+ end
+ end
+ end
end
end
diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb
index 958f2187a..aad0b9f28 100644
--- a/spec/requests/users_controller_spec.rb
+++ b/spec/requests/users_controller_spec.rb
@@ -67,7 +67,7 @@ RSpec.describe UsersController, type: :request do
expect(response).to have_http_status(:unprocessable_entity)
expect(page).to have_css("h1", class: "govuk-heading-l", text: "Change your password")
expect(page).to have_selector("#error-summary-title")
- expect(page).to have_content("Password confirmation doesn’t match new password")
+ expect(page).to have_content("passwords you entered do not match")
end
end
end
diff --git a/spec/services/bulk_upload/lettings/log_creator_spec.rb b/spec/services/bulk_upload/lettings/log_creator_spec.rb
index 6dfaff46c..c240caef8 100644
--- a/spec/services/bulk_upload/lettings/log_creator_spec.rb
+++ b/spec/services/bulk_upload/lettings/log_creator_spec.rb
@@ -9,6 +9,13 @@ RSpec.describe BulkUpload::Lettings::LogCreator do
let(:bulk_upload) { create(:bulk_upload, :lettings, user:) }
let(:path) { file_fixture("2022_23_lettings_bulk_upload.csv") }
+ around do |example|
+ Timecop.freeze(Time.zone.local(2023, 1, 1)) do
+ Singleton.__init__(FormHandler)
+ example.run
+ end
+ end
+
describe "#call" do
context "when a valid csv with new log" do
it "creates a new log" do
diff --git a/spec/services/bulk_upload/lettings/validator_spec.rb b/spec/services/bulk_upload/lettings/validator_spec.rb
index 595192210..8cbbae29a 100644
--- a/spec/services/bulk_upload/lettings/validator_spec.rb
+++ b/spec/services/bulk_upload/lettings/validator_spec.rb
@@ -10,6 +10,13 @@ RSpec.describe BulkUpload::Lettings::Validator do
let(:path) { file.path }
let(:file) { Tempfile.new }
+ around do |example|
+ Timecop.freeze(Date.new(2023, 10, 1)) do
+ example.run
+ end
+ Timecop.return
+ end
+
describe "validations" do
context "when 2022" do
let(:bulk_upload) { create(:bulk_upload, user:, year: 2022) }
diff --git a/spec/services/bulk_upload/lettings/year2022/row_parser_spec.rb b/spec/services/bulk_upload/lettings/year2022/row_parser_spec.rb
index 101a17b3b..9fdfab47d 100644
--- a/spec/services/bulk_upload/lettings/year2022/row_parser_spec.rb
+++ b/spec/services/bulk_upload/lettings/year2022/row_parser_spec.rb
@@ -153,11 +153,14 @@ RSpec.describe BulkUpload::Lettings::Year2022::RowParser do
end
around do |example|
- FormHandler.instance.use_real_forms!
+ Timecop.freeze(Date.new(2023, 3, 1)) do
+ FormHandler.instance.use_real_forms!
- example.run
+ example.run
- FormHandler.instance.use_fake_forms!
+ FormHandler.instance.use_fake_forms!
+ end
+ Timecop.return
end
describe "#blank_row?" do
diff --git a/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb b/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb
index f24fa5010..dc7dbeaea 100644
--- a/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb
+++ b/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb
@@ -47,9 +47,11 @@ RSpec.describe BulkUpload::Lettings::Year2023::RowParser do
end
around do |example|
- FormHandler.instance.use_real_forms!
-
- example.run
+ Timecop.freeze(Date.new(2023, 10, 1)) do
+ FormHandler.instance.use_real_forms!
+ example.run
+ end
+ Timecop.return
end
describe "#blank_row?" do
diff --git a/spec/services/bulk_upload/processor_spec.rb b/spec/services/bulk_upload/processor_spec.rb
index 9f287c592..c79599656 100644
--- a/spec/services/bulk_upload/processor_spec.rb
+++ b/spec/services/bulk_upload/processor_spec.rb
@@ -7,6 +7,13 @@ RSpec.describe BulkUpload::Processor do
let(:user) { create(:user, organisation: owning_org) }
let(:owning_org) { create(:organisation, old_visible_id: 123) }
+ around do |example|
+ Timecop.freeze(Time.utc(2023, 1, 1)) do
+ Singleton.__init__(FormHandler)
+ example.run
+ end
+ end
+
describe "#call" do
context "when errors exist from prior job run" do
let!(:existing_error) { create(:bulk_upload_error, bulk_upload:) }
diff --git a/spec/services/bulk_upload/sales/year2023/row_parser_spec.rb b/spec/services/bulk_upload/sales/year2023/row_parser_spec.rb
index 2e38e4f2c..0745274fc 100644
--- a/spec/services/bulk_upload/sales/year2023/row_parser_spec.rb
+++ b/spec/services/bulk_upload/sales/year2023/row_parser_spec.rb
@@ -3,7 +3,7 @@ require "rails_helper"
RSpec.describe BulkUpload::Sales::Year2023::RowParser do
subject(:parser) { described_class.new(attributes) }
- let(:now) { Time.zone.parse("01/03/2023") }
+ let(:now) { Time.zone.parse("01/05/2023") }
let(:attributes) { { bulk_upload: } }
let(:bulk_upload) { create(:bulk_upload, :sales, user:, year: 2023) }
@@ -760,7 +760,7 @@ RSpec.describe BulkUpload::Sales::Year2023::RowParser do
let(:attributes) { setup_section_params.merge({ field_19: "3", data[:field] => nil }) }
it "cannot be blank" do
- expect(parser.errors[data[:field]]).not_to be_blank
+ expect(parser.errors[data[:field]]).to be_present
end
end
end
diff --git a/spec/services/csv/missing_addresses_csv_service_spec.rb b/spec/services/csv/missing_addresses_csv_service_spec.rb
index e8482f4cb..453ee5370 100644
--- a/spec/services/csv/missing_addresses_csv_service_spec.rb
+++ b/spec/services/csv/missing_addresses_csv_service_spec.rb
@@ -38,6 +38,13 @@ RSpec.describe Csv::MissingAddressesCsvService do
.to_return(status: 200, body: body_2, headers: {})
end
+ around do |example|
+ Timecop.freeze(Time.zone.local(2023, 4, 5)) do
+ Singleton.__init__(FormHandler)
+ example.run
+ end
+ end
+
def replace_entity_ids(lettings_log, export_template)
export_template.sub!(/\{id\}/, lettings_log.id.to_s)
end
diff --git a/spec/services/imports/sales_logs_field_import_service_spec.rb b/spec/services/imports/sales_logs_field_import_service_spec.rb
index ef7762da8..bee07b24a 100644
--- a/spec/services/imports/sales_logs_field_import_service_spec.rb
+++ b/spec/services/imports/sales_logs_field_import_service_spec.rb
@@ -27,6 +27,13 @@ RSpec.describe Imports::SalesLogsFieldImportService do
.and_return(sales_log_file)
end
+ around do |example|
+ Timecop.freeze(Time.zone.local(2023, 1, 17)) do
+ Singleton.__init__(FormHandler)
+ example.run
+ end
+ end
+
context "when updating creation method" do
let(:field) { "creation_method" }
let(:sales_log) { SalesLog.find_by(old_id: sales_log_filename) }