Browse Source

CLDC-3499: Update sales logs controller

CLDC-3499-remove-pre-2025-tests
samyou-softwire 2 weeks ago
parent
commit
c1a9f85309
  1. 204
      spec/requests/sales_logs_controller_spec.rb

204
spec/requests/sales_logs_controller_spec.rb

@ -1,6 +1,8 @@
require "rails_helper" require "rails_helper"
RSpec.describe SalesLogsController, type: :request do RSpec.describe SalesLogsController, type: :request do
include CollectionTimeHelper
let(:user) { FactoryBot.create(:user) } let(:user) { FactoryBot.create(:user) }
let(:owning_organisation) { user.organisation } let(:owning_organisation) { user.organisation }
let(:api_username) { "test_user" } let(:api_username) { "test_user" }
@ -26,18 +28,11 @@ RSpec.describe SalesLogsController, type: :request do
end end
before do before do
Timecop.freeze(Time.zone.local(2024, 3, 1))
Singleton.__init__(FormHandler)
allow(ENV).to receive(:[]) allow(ENV).to receive(:[])
allow(ENV).to receive(:[]).with("API_USER").and_return(api_username) allow(ENV).to receive(:[]).with("API_USER").and_return(api_username)
allow(ENV).to receive(:[]).with("API_KEY").and_return(api_password) allow(ENV).to receive(:[]).with("API_KEY").and_return(api_password)
end end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
describe "POST #create" do describe "POST #create" do
context "when API" do context "when API" do
before do before do
@ -71,18 +66,19 @@ RSpec.describe SalesLogsController, type: :request do
context "with a request containing invalid json parameters" do context "with a request containing invalid json parameters" do
let(:params) do let(:params) do
invalid_sales_log = FactoryBot.build(
:sales_log,
:completed,
assigned_to: user,
owning_organisation: owning_organisation,
managing_organisation: owning_organisation,
saledate: archived_collection_start_date,
beds: 2,
proptype: 2,
)
{ {
"owning_organisation_id": owning_organisation.id, sales_log: invalid_sales_log.attributes,
"managing_organisation_id": owning_organisation.id,
"assigned_to_id": user.id,
"saledate": Time.zone.today,
"purchid": "1",
"ownershipsch": 1,
"type": 2,
"jointpur": 1,
"jointmore": 1,
"beds": 2,
"proptype": 2,
} }
end end
@ -93,7 +89,25 @@ RSpec.describe SalesLogsController, type: :request do
it "validates sales log parameters" do it "validates sales log parameters" do
json_response = JSON.parse(response.body) json_response = JSON.parse(response.body)
expect(response).to have_http_status(:unprocessable_content) expect(response).to have_http_status(:unprocessable_content)
expect(json_response["errors"]).to contain_exactly(["beds", ["Number of bedrooms must be 1 if the property is a bedsit."]], ["proptype", ["Answer cannot be 'Bedsit' if the property has 2 or more bedrooms."]]) expect(json_response["errors"]).to contain_exactly(
[
"beds",
[
"Number of bedrooms must be 1 if the property is a bedsit."
]
],
[
"proptype",
[
"Answer cannot be 'Bedsit' if the property has 2 or more bedrooms."
]
],
[
"saledate",
[
"Enter a date within the #{previous_collection_start_year} to #{previous_collection_end_year} or #{current_collection_start_year} to #{current_collection_end_year} collection years, which is between 1st April #{previous_collection_start_year} and 31st March #{current_collection_end_year}."
]
])
end end
end end
end end
@ -341,72 +355,50 @@ RSpec.describe SalesLogsController, type: :request do
end end
context "with year filter" do context "with year filter" do
before do let!(:sales_log_current) do
Timecop.freeze(2022, 4, 1)
sales_log_2022.update!(saledate: Time.zone.local(2022, 4, 1))
Timecop.freeze(2023, 1, 1)
sales_log_2022.update!(saledate: Time.zone.local(2023, 1, 1))
end
after do
Timecop.unfreeze
end
let!(:sales_log_2022) do
FactoryBot.create(:sales_log, :completed, FactoryBot.create(:sales_log, :completed,
owning_organisation: organisation, owning_organisation: organisation,
assigned_to: user, assigned_to: user,
saledate: Time.zone.today) saledate: current_collection_start_date)
end end
let!(:sales_log_2023) do let!(:sales_log_previous) do
FactoryBot.create(:sales_log, FactoryBot.create(:sales_log,
owning_organisation: organisation, owning_organisation: organisation,
assigned_to: user, assigned_to: user,
saledate: Time.zone.today) saledate: previous_collection_start_date)
end end
it "shows sales logs for multiple selected years" do it "shows sales logs for multiple selected years" do
get "/sales-logs?years[]=2021&years[]=2022", headers: headers, params: {} get "/sales-logs?years[]=#{previous_collection_start_year}&years[]=#{current_collection_start_year}", headers: headers, params: {}
expect(page).to have_link(sales_log_2022.id.to_s) expect(page).to have_link(sales_log_current.id.to_s)
expect(page).to have_link(sales_log_2023.id.to_s) expect(page).to have_link(sales_log_previous.id.to_s)
end end
it "shows sales logs for one selected year" do it "shows sales logs for one selected year" do
get "/sales-logs?years[]=2022", headers: headers, params: {} get "/sales-logs?years[]=#{current_collection_start_year}", headers: headers, params: {}
expect(page).to have_link(sales_log_2022.id.to_s) expect(page).to have_link(sales_log_current.id.to_s)
expect(page).to have_link(sales_log_2023.id.to_s) expect(page).not_to have_link(sales_log_previous.id.to_s)
end end
end end
context "with year and status filter" do context "with year and status filter" do
before do let!(:sales_log_current) do
Timecop.freeze(2022, 4, 1)
sales_log_2022.update!(saledate: Time.zone.local(2022, 4, 1))
Timecop.freeze(2023, 1, 1)
sales_log_2022.update!(saledate: Time.zone.local(2023, 1, 1))
end
after do
Timecop.unfreeze
end
let!(:sales_log_2022) do
FactoryBot.create(:sales_log, :completed, FactoryBot.create(:sales_log, :completed,
owning_organisation: organisation, owning_organisation: organisation,
assigned_to: user, assigned_to: user,
saledate: Time.zone.today) saledate: current_collection_start_date)
end end
let!(:sales_log_2023) do let!(:sales_log_previous) do
FactoryBot.create(:sales_log, FactoryBot.create(:sales_log,
owning_organisation: organisation, owning_organisation: organisation,
assigned_to: user, assigned_to: user,
saledate: Time.zone.today) saledate: previous_collection_start_date)
end end
it "shows sales logs for multiple selected statuses and years" do it "shows sales logs for multiple selected statuses and years" do
get "/sales-logs?years[]=2021&years[]=2022&status[]=in_progress&status[]=completed", headers: headers, params: {} get "/sales-logs?years[]=#{previous_collection_start_year}&years[]=#{current_collection_start_year}&status[]=in_progress&status[]=completed", headers: headers, params: {}
expect(page).to have_link(sales_log_2022.id.to_s) expect(page).to have_link(sales_log_current.id.to_s)
expect(page).to have_link(sales_log_2023.id.to_s) expect(page).to have_link(sales_log_previous.id.to_s)
end end
end end
@ -856,10 +848,6 @@ RSpec.describe SalesLogsController, type: :request do
before do before do
sign_in user sign_in user
Timecop.freeze(2021, 4, 1)
Singleton.__init__(FormHandler)
completed_sales_log.update!(saledate: Time.zone.local(2021, 4, 1))
completed_sales_log.reload
end end
context "with sales logs that are owned by your organisation" do context "with sales logs that are owned by your organisation" do
@ -867,22 +855,17 @@ RSpec.describe SalesLogsController, type: :request do
get "/sales-logs/#{completed_sales_log.id}", headers:, params: {} get "/sales-logs/#{completed_sales_log.id}", headers:, params: {}
end end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
it "shows the tasklist for sales logs you have access to" do it "shows the tasklist for sales logs you have access to" do
expect(response.body).to match("Log") expect(response.body).to match("Log")
expect(response.body).to match(completed_sales_log.id.to_s) expect(response.body).to match(completed_sales_log.id.to_s)
end end
it "displays a link to update the log for currently editable logs" do it "displays a link to update the log for currently editable logs" do
completed_sales_log.update!(saledate: Time.zone.local(2021, 4, 1)) completed_sales_log.update!(saledate: current_collection_start_date)
completed_sales_log.reload completed_sales_log.reload
get "/sales-logs/#{completed_sales_log.id}", headers:, params: {} get "/sales-logs/#{completed_sales_log.id}", headers:, params: {}
expect(completed_sales_log.form.new_logs_end_date).to eq(Time.zone.local(2022, 12, 31)) expect(completed_sales_log.form.new_logs_end_date).to eq(FormHandler.instance.current_sales_form.new_logs_end_date)
expect(completed_sales_log.status).to eq("completed") expect(completed_sales_log.status).to eq("completed")
expect(page).to have_link("review and make changes to this log", href: "/sales-logs/#{completed_sales_log.id}/review?sales_log=true") expect(page).to have_link("review and make changes to this log", href: "/sales-logs/#{completed_sales_log.id}/review?sales_log=true")
end end
@ -894,53 +877,44 @@ RSpec.describe SalesLogsController, type: :request do
get "/sales-logs/#{completed_sales_log.id}", headers:, params: {} get "/sales-logs/#{completed_sales_log.id}", headers:, params: {}
end end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
it "shows the tasklist for sales logs you have access to" do it "shows the tasklist for sales logs you have access to" do
expect(response.body).to match("Log") expect(response.body).to match("Log")
expect(response.body).to match(completed_sales_log.id.to_s) expect(response.body).to match(completed_sales_log.id.to_s)
end end
end end
context "with sales logs from a closed collection period before the previous collection" do context "with sales logs from a closed previous collection period" do
before do let(:completed_sales_log) do
sign_in user FactoryBot.create(
Timecop.return :sales_log,
Singleton.__init__(FormHandler) :completed,
get "/sales-logs/#{completed_sales_log.id}", headers:, params: {} :ignore_validation_errors,
end owning_organisation: user.organisation,
assigned_to: user,
it "redirects to review page" do saledate: archived_collection_start_date,
expect(response).to redirect_to("/sales-logs/#{completed_sales_log.id}/review?sales_log=true") )
end end
end let(:closed_previous_sales_form) { FormHandler.instance.sales_form_for_start_year(archived_collection_start_year) }
# let(:closed_previous_collection_end) { previous_collection_end_date.to_time.end_of_day }
context "with sales logs from a closed previous collection period" do
before do before do
sign_in user sign_in user
Timecop.freeze(2023, 2, 1) # allow(closed_previous_sales_form).to receive_messages(
Singleton.__init__(FormHandler) # new_logs_end_date: closed_previous_collection_end,
# edit_end_date: closed_previous_collection_end,
# )
get "/sales-logs/#{completed_sales_log.id}", headers:, params: {} get "/sales-logs/#{completed_sales_log.id}", headers:, params: {}
end end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
it "redirects to review page" do it "redirects to review page" do
expect(response).to redirect_to("/sales-logs/#{completed_sales_log.id}/review?sales_log=true") expect(response).to redirect_to("/sales-logs/#{completed_sales_log.id}/review?sales_log=true")
end end
it "displays a closed collection window message for previous collection year logs" do it "displays a closed collection window message for previous collection year logs" do
get "/sales-logs/#{completed_sales_log.id}", headers:, params: {} get "/sales-logs/#{completed_sales_log.id}", headers:, params: {}
expect(completed_sales_log.form.new_logs_end_date).to eq(Time.zone.local(2022, 12, 31))
expect(completed_sales_log.status).to eq("completed") expect(completed_sales_log.status).to eq("completed")
follow_redirect! follow_redirect!
expect(page).to have_content("This log is from the 2021 to 2022 collection window, which is now closed.") expect(page).to have_content("This log is from the #{archived_collection_start_year} to #{archived_collection_end_year} collection window, which is now closed.")
end end
end end
@ -959,6 +933,7 @@ RSpec.describe SalesLogsController, type: :request do
let(:headers) { { "Accept" => "text/html" } } let(:headers) { { "Accept" => "text/html" } }
let(:search_term) { "foot" } let(:search_term) { "foot" }
let(:codes_only) { false } let(:codes_only) { false }
let(:selected_year) { current_collection_start_year }
before do before do
create(:sales_log, :in_progress, assigned_to: user, purchid: search_term) create(:sales_log, :in_progress, assigned_to: user, purchid: search_term)
@ -968,7 +943,7 @@ RSpec.describe SalesLogsController, type: :request do
context "when there is 1 year selected in the filters" do context "when there is 1 year selected in the filters" do
before do before do
get "/sales-logs/csv-download?years[]=2023&search=#{search_term}&codes_only=#{codes_only}", headers: get "/sales-logs/csv-download?years[]=#{selected_year}&search=#{search_term}&codes_only=#{codes_only}", headers:
end end
it "returns http success" do it "returns http success" do
@ -1023,7 +998,7 @@ RSpec.describe SalesLogsController, type: :request do
context "when user is not support" do context "when user is not support" do
before do before do
get "/sales-logs/csv-download?years[]=2023&search=#{search_term}&codes_only=#{codes_only}", headers: get "/sales-logs/csv-download?years[]=#{selected_year}&search=#{search_term}&codes_only=#{codes_only}", headers:
end end
context "and export type is not codes only" do context "and export type is not codes only" do
@ -1069,7 +1044,7 @@ RSpec.describe SalesLogsController, type: :request do
let(:user) { FactoryBot.create(:user, :support) } let(:user) { FactoryBot.create(:user, :support) }
before do before do
get "/sales-logs/csv-download?years[]=2023&search=#{search_term}&codes_only=#{codes_only}", headers: get "/sales-logs/csv-download?years[]=#{selected_year}&search=#{search_term}&codes_only=#{codes_only}", headers:
end end
context "and export type is not codes only" do context "and export type is not codes only" do
@ -1100,6 +1075,7 @@ RSpec.describe SalesLogsController, type: :request do
end end
describe "POST #email-csv" do describe "POST #email-csv" do
let(:selected_year) { current_collection_start_year }
let(:other_organisation) { FactoryBot.create(:organisation) } let(:other_organisation) { FactoryBot.create(:organisation) }
let(:user) { FactoryBot.create(:user, :support) } let(:user) { FactoryBot.create(:user, :support) }
let!(:sales_log) do let!(:sales_log) do
@ -1121,42 +1097,42 @@ RSpec.describe SalesLogsController, type: :request do
it "creates an E-mail job with the correct log type" do it "creates an E-mail job with the correct log type" do
expect { expect {
post "/sales-logs/email-csv?years[]=2023&codes_only=true", headers:, params: {} post "/sales-logs/email-csv?years[]=#{selected_year}&codes_only=true", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => %w[2023] }, false, nil, true, "sales", 2023) }.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => [selected_year.to_s] }, false, nil, true, "sales", selected_year)
end end
it "redirects to the confirmation page" do it "redirects to the confirmation page" do
post "/sales-logs/email-csv?years[]=2023&codes_only=true", headers:, params: {} post "/sales-logs/email-csv?years[]=#{selected_year}&codes_only=true", headers:, params: {}
expect(response).to redirect_to(csv_confirmation_sales_logs_path) expect(response).to redirect_to(csv_confirmation_sales_logs_path)
end end
it "passes the search term" do it "passes the search term" do
expect { expect {
post "/sales-logs/email-csv?search=#{sales_log.id}&years[]=2023&codes_only=false", headers:, params: {} post "/sales-logs/email-csv?search=#{sales_log.id}&years[]=#{selected_year}&codes_only=false", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, sales_log.id.to_s, { "years" => %w[2023] }, false, nil, false, "sales", 2023) }.to enqueue_job(EmailCsvJob).with(user, sales_log.id.to_s, { "years" => [selected_year.to_s] }, false, nil, false, "sales", selected_year)
end end
it "passes filter parameters" do it "passes filter parameters" do
expect { expect {
post "/sales-logs/email-csv?years[]=2023&status[]=completed&codes_only=true", headers:, params: {} post "/sales-logs/email-csv?years[]=#{selected_year}&status[]=completed&codes_only=true", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "status" => %w[completed], "years" => %w[2023] }, false, nil, true, "sales", 2023) }.to enqueue_job(EmailCsvJob).with(user, nil, { "status" => %w[completed], "years" => [selected_year.to_s] }, false, nil, true, "sales", selected_year)
end end
it "passes export type flag" do it "passes export type flag" do
expect { expect {
post "/sales-logs/email-csv?years[]=2023&codes_only=true", headers:, params: {} post "/sales-logs/email-csv?years[]=#{selected_year}&codes_only=true", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => %w[2023] }, false, nil, true, "sales", 2023) }.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => [selected_year.to_s] }, false, nil, true, "sales", selected_year)
expect { expect {
post "/sales-logs/email-csv?years[]=2023&codes_only=false", headers:, params: {} post "/sales-logs/email-csv?years[]=#{selected_year}&codes_only=false", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => %w[2023] }, false, nil, false, "sales", 2023) }.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => [selected_year.to_s] }, false, nil, false, "sales", selected_year)
end end
it "passes a combination of search term, export type and filter parameters" do it "passes a combination of search term, export type and filter parameters" do
postcode = "XX1 1TG" postcode = "XX1 1TG"
expect { expect {
post "/sales-logs/email-csv?years[]=2023&status[]=completed&search=#{postcode}&codes_only=false", headers:, params: {} post "/sales-logs/email-csv?years[]=#{selected_year}&status[]=completed&search=#{postcode}&codes_only=false", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, postcode, { "status" => %w[completed], "years" => %w[2023] }, false, nil, false, "sales", 2023) }.to enqueue_job(EmailCsvJob).with(user, postcode, { "status" => %w[completed], "years" => [selected_year.to_s] }, false, nil, false, "sales", selected_year)
end end
context "when the user is not a support user" do context "when the user is not a support user" do
@ -1165,13 +1141,13 @@ RSpec.describe SalesLogsController, type: :request do
it "has permission to download human readable csv" do it "has permission to download human readable csv" do
codes_only_export = false codes_only_export = false
expect { expect {
post "/sales-logs/email-csv?years[]=2023&codes_only=#{codes_only_export}", headers:, params: {} post "/sales-logs/email-csv?years[]=#{selected_year}&codes_only=#{codes_only_export}", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => %w[2023] }, false, nil, false, "sales", 2023) }.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => [selected_year.to_s] }, false, nil, false, "sales", selected_year)
end end
it "is not authorized to download codes only csv" do it "is not authorized to download codes only csv" do
codes_only_export = true codes_only_export = true
post "/sales-logs/email-csv?years[]=2023&codes_only=#{codes_only_export}", headers:, params: {} post "/sales-logs/email-csv?years[]=#{selected_year}&codes_only=#{codes_only_export}", headers:, params: {}
expect(response).to have_http_status(:unauthorized) expect(response).to have_http_status(:unauthorized)
end end
end end

Loading…
Cancel
Save