Submit social housing lettings and sales data (CORE)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

317 lines
11 KiB

require "rails_helper"
RSpec.describe HomepagePresenter do
let(:organisation) { create(:organisation) }
let(:user) { create(:user, organisation:) }
let(:in_crossover_period) { true }
let(:presenter) { described_class.new(user) }
let(:date_this_year) { Time.zone.today }
let(:date_last_year) { Time.zone.today - 1.year }
let(:expected_count) { rand 1..10 }
before do
allow(FormHandler.instance).to receive(:in_crossover_period?).and_return(in_crossover_period)
end
context "when the user is support" do
let(:user) { create(:user, :support) }
it "sets the correct title" do
expect(presenter.title_text_for_user).to eq "Manage all data"
end
it "returns that schemes should be displayed" do
expect(presenter.display_schemes?).to be true
end
it "returns that sales logs should be displayed" do
expect(presenter.display_sales?).to be true
end
end
context "when the user is a data coordinator" do
let(:user) { create(:user, :data_coordinator) }
it "sets the correct title" do
expect(presenter.title_text_for_user).to eq "Manage your organisation's logs"
end
it "returns that schemes should be displayed" do
expect(presenter.display_schemes?).to be true
end
end
context "when the user is a data provider" do
let(:user) { create(:user, :data_provider) }
it "sets the correct title" do
expect(presenter.title_text_for_user).to eq "Manage logs assigned to you"
end
it "returns that schemes should not be displayed" do
expect(presenter.display_schemes?).to be false
end
end
context "when the user's organisation has never submitted sales logs" do
it "shows the user's organisation does not log sales" do
expect(presenter.display_sales?).to be false
end
context "when in the crossover period" do
let(:in_crossover_period) { true }
it "leaves all sales related data as nil" do
sales_data = [
presenter.current_year_in_progress_sales_data,
presenter.current_year_completed_sales_data,
presenter.last_year_in_progress_sales_data,
presenter.last_year_completed_sales_data,
]
expect(sales_data).to all be nil
end
end
context "when not in the crossover period" do
let(:in_crossover_period) { false }
it "leaves all sales related data as nil" do
sales_data = [
presenter.current_year_in_progress_sales_data,
presenter.current_year_completed_sales_data,
presenter.last_year_in_progress_sales_data,
presenter.last_year_completed_sales_data,
]
expect(sales_data).to all be nil
end
end
end
context "when the user's organisation has submitted sales logs" do
before do
create(:sales_log, assigned_to: user)
end
it "shows the user's organisation logs sales" do
expect(presenter.display_sales?).to be true
end
context "when in the crossover period" do
let(:in_crossover_period) { true }
it "populates all sales related data" do
sales_data = [
presenter.current_year_in_progress_sales_data,
presenter.current_year_completed_sales_data,
presenter.last_year_in_progress_sales_data,
presenter.last_year_completed_sales_data,
]
expect(sales_data).to all be_an_instance_of(Hash)
end
end
context "when not in the crossover period" do
let(:in_crossover_period) { false }
it "populates all relevant sales related data" do
sales_data = [
presenter.current_year_in_progress_sales_data,
presenter.current_year_completed_sales_data,
presenter.last_year_completed_sales_data,
]
expect(sales_data).to all be_an_instance_of(Hash)
end
it "does not populate data for last year's in progress logs" do
last_year_in_progress_data = [
presenter.last_year_in_progress_lettings_data,
presenter.last_year_in_progress_sales_data,
]
expect(last_year_in_progress_data).to all be nil
end
end
end
context "when in the crossover period" do
let(:in_crossover_period) { true }
it "returns that we are in the crossover period" do
expect(presenter.in_crossover_period?).to be true
end
end
context "when not in the crossover period" do
let(:in_crossover_period) { false }
it "returns that we are in the crossover period" do
expect(presenter.in_crossover_period?).to be false
end
end
describe "the data collected and exposed by the presenter" do
context "with lettings logs" do
let(:type) { :lettings_log }
context "with in progress status" do
let(:status) { :in_progress }
context "and the current year" do
let(:startdate) { date_this_year }
it "exposes the correct data for the data box" do
create_list(type, expected_count, status, assigned_to: user, startdate:)
data = presenter.current_year_in_progress_lettings_data
expect(data[:count]).to be expected_count
expect(data[:text]).to eq "Lettings in progress"
uri = URI.parse(data[:path])
expect(uri.path).to eq "/#{type.to_s.dasherize}s"
query_params = CGI.parse(uri.query)
expect(query_params["status[]"]).to eq [status.to_s]
expect(query_params["years[]"]).to eq [date_this_year.year.to_s]
end
end
context "and the last year" do
let(:startdate) { date_last_year }
it "exposes the correct data for the data box" do
logs = build_list(type, expected_count, status, assigned_to: user, startdate:)
logs.each { |log| log.save(validate: false) }
data = presenter.last_year_in_progress_lettings_data
expect(data[:count]).to be expected_count
expect(data[:text]).to eq "Lettings in progress"
uri = URI.parse(data[:path])
expect(uri.path).to eq "/#{type.to_s.dasherize}s"
query_params = CGI.parse(uri.query)
expect(query_params["status[]"]).to eq [status.to_s]
expect(query_params["years[]"]).to eq [date_last_year.year.to_s]
end
end
end
context "with completed status" do
let(:status) { :completed }
context "and the current year" do
let(:startdate) { date_this_year }
it "exposes the correct data for the data box" do
create_list(type, expected_count, :completed, assigned_to: user, startdate:)
data = presenter.current_year_completed_lettings_data
expect(data[:count]).to be expected_count
expect(data[:text]).to eq "Completed lettings"
uri = URI.parse(data[:path])
expect(uri.path).to eq "/#{type.to_s.dasherize}s"
query_params = CGI.parse(uri.query)
expect(query_params["status[]"]).to eq [status.to_s]
expect(query_params["years[]"]).to eq [date_this_year.year.to_s]
end
end
context "and the last year" do
let(:startdate) { date_last_year }
it "exposes the correct data for the data box" do
logs = build_list(type, expected_count, status, assigned_to: user, startdate:)
logs.each { |log| log.save(validate: false) }
data = presenter.last_year_completed_lettings_data
expect(data[:count]).to be expected_count
expect(data[:text]).to eq "Completed lettings"
uri = URI.parse(data[:path])
expect(uri.path).to eq "/#{type.to_s.dasherize}s"
query_params = CGI.parse(uri.query)
expect(query_params["status[]"]).to eq [status.to_s]
expect(query_params["years[]"]).to eq [date_last_year.year.to_s]
end
end
end
end
context "with sales logs" do
let(:type) { :sales_log }
context "with in progress status" do
let(:status) { :in_progress }
context "and the current year" do
let(:saledate) { date_this_year }
it "exposes the correct data for the data box" do
create_list(type, expected_count, status, assigned_to: user, saledate:)
data = presenter.current_year_in_progress_sales_data
expect(data[:count]).to be expected_count
expect(data[:text]).to eq "Sales in progress"
uri = URI.parse(data[:path])
expect(uri.path).to eq "/#{type.to_s.dasherize}s"
query_params = CGI.parse(uri.query)
expect(query_params["status[]"]).to eq [status.to_s]
expect(query_params["years[]"]).to eq [date_this_year.year.to_s]
end
end
context "and the last year" do
let(:saledate) { date_last_year }
it "exposes the correct data for the data box" do
logs = build_list(type, expected_count, status, assigned_to: user, saledate:)
logs.each { |log| log.save(validate: false) }
data = presenter.last_year_in_progress_sales_data
expect(data[:count]).to be expected_count
expect(data[:text]).to eq "Sales in progress"
uri = URI.parse(data[:path])
expect(uri.path).to eq "/#{type.to_s.dasherize}s"
query_params = CGI.parse(uri.query)
expect(query_params["status[]"]).to eq [status.to_s]
expect(query_params["years[]"]).to eq [date_last_year.year.to_s]
end
end
end
context "with completed status" do
let(:status) { :completed }
context "and the current year" do
let(:saledate) { date_this_year }
it "exposes the correct data for the data box" do
create_list(type, expected_count, :completed, assigned_to: user, saledate:)
data = presenter.current_year_completed_sales_data
expect(data[:count]).to be expected_count
expect(data[:text]).to eq "Completed sales"
uri = URI.parse(data[:path])
expect(uri.path).to eq "/#{type.to_s.dasherize}s"
query_params = CGI.parse(uri.query)
expect(query_params["status[]"]).to eq [status.to_s]
expect(query_params["years[]"]).to eq [date_this_year.year.to_s]
end
end
context "and the last year" do
let(:saledate) { date_last_year }
it "exposes the correct data for the data box" do
logs = build_list(type, expected_count, status, assigned_to: user, saledate:)
logs.each { |log| log.save(validate: false) }
data = presenter.last_year_completed_sales_data
expect(data[:count]).to be expected_count
expect(data[:text]).to eq "Completed sales"
uri = URI.parse(data[:path])
expect(uri.path).to eq "/#{type.to_s.dasherize}s"
query_params = CGI.parse(uri.query)
expect(query_params["status[]"]).to eq [status.to_s]
expect(query_params["years[]"]).to eq [date_last_year.year.to_s]
end
end
end
end
end
end