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"
RSpec.describe SalesLogsController, type: :request do
include CollectionTimeHelper
let(:user) { FactoryBot.create(:user) }
let(:owning_organisation) { user.organisation }
let(:api_username) { "test_user" }
@ -26,18 +28,11 @@ RSpec.describe SalesLogsController, type: :request do
end
before do
Timecop.freeze(Time.zone.local(2024, 3, 1))
Singleton.__init__(FormHandler)
allow(ENV).to receive(:[])
allow(ENV).to receive(:[]).with("API_USER").and_return(api_username)
allow(ENV).to receive(:[]).with("API_KEY").and_return(api_password)
end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
describe "POST #create" do
context "when API" do
before do
@ -71,18 +66,19 @@ RSpec.describe SalesLogsController, type: :request do
context "with a request containing invalid json parameters" 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,
"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,
sales_log: invalid_sales_log.attributes,
}
end
@ -93,7 +89,25 @@ RSpec.describe SalesLogsController, type: :request do
it "validates sales log parameters" do
json_response = JSON.parse(response.body)
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
@ -341,72 +355,50 @@ RSpec.describe SalesLogsController, type: :request do
end
context "with year filter" do
before 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
let!(:sales_log_current) do
FactoryBot.create(:sales_log, :completed,
owning_organisation: organisation,
assigned_to: user,
saledate: Time.zone.today)
saledate: current_collection_start_date)
end
let!(:sales_log_2023) do
let!(:sales_log_previous) do
FactoryBot.create(:sales_log,
owning_organisation: organisation,
assigned_to: user,
saledate: Time.zone.today)
saledate: previous_collection_start_date)
end
it "shows sales logs for multiple selected years" do
get "/sales-logs?years[]=2021&years[]=2022", headers: headers, params: {}
expect(page).to have_link(sales_log_2022.id.to_s)
expect(page).to have_link(sales_log_2023.id.to_s)
get "/sales-logs?years[]=#{previous_collection_start_year}&years[]=#{current_collection_start_year}", headers: headers, params: {}
expect(page).to have_link(sales_log_current.id.to_s)
expect(page).to have_link(sales_log_previous.id.to_s)
end
it "shows sales logs for one selected year" do
get "/sales-logs?years[]=2022", headers: headers, params: {}
expect(page).to have_link(sales_log_2022.id.to_s)
expect(page).to have_link(sales_log_2023.id.to_s)
get "/sales-logs?years[]=#{current_collection_start_year}", headers: headers, params: {}
expect(page).to have_link(sales_log_current.id.to_s)
expect(page).not_to have_link(sales_log_previous.id.to_s)
end
end
context "with year and status filter" do
before 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
let!(:sales_log_current) do
FactoryBot.create(:sales_log, :completed,
owning_organisation: organisation,
assigned_to: user,
saledate: Time.zone.today)
saledate: current_collection_start_date)
end
let!(:sales_log_2023) do
let!(:sales_log_previous) do
FactoryBot.create(:sales_log,
owning_organisation: organisation,
assigned_to: user,
saledate: Time.zone.today)
saledate: previous_collection_start_date)
end
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: {}
expect(page).to have_link(sales_log_2022.id.to_s)
expect(page).to have_link(sales_log_2023.id.to_s)
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_current.id.to_s)
expect(page).to have_link(sales_log_previous.id.to_s)
end
end
@ -856,10 +848,6 @@ RSpec.describe SalesLogsController, type: :request do
before do
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
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: {}
end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
it "shows the tasklist for sales logs you have access to" do
expect(response.body).to match("Log")
expect(response.body).to match(completed_sales_log.id.to_s)
end
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
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(page).to have_link("review and make changes to this log", href: "/sales-logs/#{completed_sales_log.id}/review?sales_log=true")
end
@ -894,53 +877,44 @@ RSpec.describe SalesLogsController, type: :request do
get "/sales-logs/#{completed_sales_log.id}", headers:, params: {}
end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
it "shows the tasklist for sales logs you have access to" do
expect(response.body).to match("Log")
expect(response.body).to match(completed_sales_log.id.to_s)
end
end
context "with sales logs from a closed collection period before the previous collection" do
before do
sign_in user
Timecop.return
Singleton.__init__(FormHandler)
get "/sales-logs/#{completed_sales_log.id}", headers:, params: {}
end
it "redirects to review page" do
expect(response).to redirect_to("/sales-logs/#{completed_sales_log.id}/review?sales_log=true")
context "with sales logs from a closed previous collection period" do
let(:completed_sales_log) do
FactoryBot.create(
:sales_log,
:completed,
:ignore_validation_errors,
owning_organisation: user.organisation,
assigned_to: user,
saledate: archived_collection_start_date,
)
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
sign_in user
Timecop.freeze(2023, 2, 1)
Singleton.__init__(FormHandler)
# allow(closed_previous_sales_form).to receive_messages(
# new_logs_end_date: closed_previous_collection_end,
# edit_end_date: closed_previous_collection_end,
# )
get "/sales-logs/#{completed_sales_log.id}", headers:, params: {}
end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
it "redirects to review page" do
expect(response).to redirect_to("/sales-logs/#{completed_sales_log.id}/review?sales_log=true")
end
it "displays a closed collection window message for previous collection year logs" do
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")
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
@ -959,6 +933,7 @@ RSpec.describe SalesLogsController, type: :request do
let(:headers) { { "Accept" => "text/html" } }
let(:search_term) { "foot" }
let(:codes_only) { false }
let(:selected_year) { current_collection_start_year }
before do
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
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
it "returns http success" do
@ -1023,7 +998,7 @@ RSpec.describe SalesLogsController, type: :request do
context "when user is not support" 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
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) }
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
context "and export type is not codes only" do
@ -1100,6 +1075,7 @@ RSpec.describe SalesLogsController, type: :request do
end
describe "POST #email-csv" do
let(:selected_year) { current_collection_start_year }
let(:other_organisation) { FactoryBot.create(:organisation) }
let(:user) { FactoryBot.create(:user, :support) }
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
expect {
post "/sales-logs/email-csv?years[]=2023&codes_only=true", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => %w[2023] }, false, nil, true, "sales", 2023)
post "/sales-logs/email-csv?years[]=#{selected_year}&codes_only=true", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => [selected_year.to_s] }, false, nil, true, "sales", selected_year)
end
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)
end
it "passes the search term" do
expect {
post "/sales-logs/email-csv?search=#{sales_log.id}&years[]=2023&codes_only=false", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, sales_log.id.to_s, { "years" => %w[2023] }, false, nil, false, "sales", 2023)
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" => [selected_year.to_s] }, false, nil, false, "sales", selected_year)
end
it "passes filter parameters" do
expect {
post "/sales-logs/email-csv?years[]=2023&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)
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" => [selected_year.to_s] }, false, nil, true, "sales", selected_year)
end
it "passes export type flag" do
expect {
post "/sales-logs/email-csv?years[]=2023&codes_only=true", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => %w[2023] }, false, nil, true, "sales", 2023)
post "/sales-logs/email-csv?years[]=#{selected_year}&codes_only=true", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => [selected_year.to_s] }, false, nil, true, "sales", selected_year)
expect {
post "/sales-logs/email-csv?years[]=2023&codes_only=false", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => %w[2023] }, false, nil, false, "sales", 2023)
post "/sales-logs/email-csv?years[]=#{selected_year}&codes_only=false", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => [selected_year.to_s] }, false, nil, false, "sales", selected_year)
end
it "passes a combination of search term, export type and filter parameters" do
postcode = "XX1 1TG"
expect {
post "/sales-logs/email-csv?years[]=2023&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)
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" => [selected_year.to_s] }, false, nil, false, "sales", selected_year)
end
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
codes_only_export = false
expect {
post "/sales-logs/email-csv?years[]=2023&codes_only=#{codes_only_export}", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => %w[2023] }, false, nil, false, "sales", 2023)
post "/sales-logs/email-csv?years[]=#{selected_year}&codes_only=#{codes_only_export}", headers:, params: {}
}.to enqueue_job(EmailCsvJob).with(user, nil, { "years" => [selected_year.to_s] }, false, nil, false, "sales", selected_year)
end
it "is not authorized to download codes only csv" do
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)
end
end

Loading…
Cancel
Save