Browse Source
* Get and display subsection completion status in tasklist * update gitignore * Add styling change return of get status * Make skip to next incomplete section functional * update tasklist helper methods not to use the default form * Display completed sections count * shuffle if statement * Pass question keys without the content to get the status * remove return status, shuffle if statement * Access styles and statuses directlypull/33/head
kosiakkatrina
3 years ago
committed by
GitHub
8 changed files with 207 additions and 21 deletions
@ -0,0 +1,49 @@ |
|||||||
|
module TasklistHelper |
||||||
|
STATUSES = { |
||||||
|
not_started: "Not started", |
||||||
|
cannot_start_yet: "Cannot start yet", |
||||||
|
completed: "Completed", |
||||||
|
in_progress: "In progress", |
||||||
|
}.freeze |
||||||
|
|
||||||
|
STYLES = { |
||||||
|
not_started: "govuk-tag--grey", |
||||||
|
cannot_start_yet: "govuk-tag--grey", |
||||||
|
completed: "", |
||||||
|
in_progress: "govuk-tag--blue", |
||||||
|
}.freeze |
||||||
|
|
||||||
|
def get_subsection_status(subsection_name, case_log, questions) |
||||||
|
if subsection_name == "declaration" |
||||||
|
return all_questions_completed(case_log) ? :not_started : :cannot_start_yet |
||||||
|
end |
||||||
|
|
||||||
|
return :not_started if questions.all? { |question| case_log[question].blank? } |
||||||
|
return :completed if questions.all? { |question| case_log[question].present? } |
||||||
|
|
||||||
|
:in_progress |
||||||
|
end |
||||||
|
|
||||||
|
def get_next_incomplete_section(form, case_log) |
||||||
|
subsections = form.all_subsections.keys |
||||||
|
subsections.find { |subsection| is_incomplete?(subsection, case_log, form.questions_for_subsection(subsection).keys) } |
||||||
|
end |
||||||
|
|
||||||
|
def get_sections_count(form, case_log, status = :all) |
||||||
|
subsections = form.all_subsections.keys |
||||||
|
return subsections.count if status == :all |
||||||
|
|
||||||
|
subsections.count { |subsection| get_subsection_status(subsection, case_log, form.questions_for_subsection(subsection).keys) == status } |
||||||
|
end |
||||||
|
|
||||||
|
private |
||||||
|
|
||||||
|
def all_questions_completed(case_log) |
||||||
|
case_log.attributes.all? { |_question, answer| answer.present? } |
||||||
|
end |
||||||
|
|
||||||
|
def is_incomplete?(subsection, case_log, questions) |
||||||
|
status = get_subsection_status(subsection, case_log, questions) |
||||||
|
%i[not_started in_progress].include?(status) |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,84 @@ |
|||||||
|
require "rails_helper" |
||||||
|
|
||||||
|
RSpec.describe TasklistHelper do |
||||||
|
describe "get subsection status" do |
||||||
|
@form = Form.new(2021, 2022) |
||||||
|
income_and_benefits_questions = @form.questions_for_subsection("income_and_benefits").keys |
||||||
|
declaration_questions = @form.questions_for_subsection("declaration").keys |
||||||
|
local_authority_questions = @form.questions_for_subsection("local_authority").keys |
||||||
|
let!(:case_log) { FactoryBot.create(:case_log) } |
||||||
|
|
||||||
|
it "returns not started if none of the questions in the subsection are answered" do |
||||||
|
status = get_subsection_status("income_and_benefits", case_log, income_and_benefits_questions) |
||||||
|
expect(status).to eq(:not_started) |
||||||
|
end |
||||||
|
|
||||||
|
it "returns cannot start yet if the subsection is declaration" do |
||||||
|
status = get_subsection_status("declaration", case_log, declaration_questions) |
||||||
|
expect(status).to eq(:cannot_start_yet) |
||||||
|
end |
||||||
|
|
||||||
|
it "returns in progress if some of the questions have been answered" do |
||||||
|
case_log["previous_postcode"] = "P0 5TT" |
||||||
|
status = get_subsection_status("local_authority", case_log, local_authority_questions) |
||||||
|
expect(status).to eq(:in_progress) |
||||||
|
end |
||||||
|
|
||||||
|
it "returns completed if all the questions in the subsection have been answered" do |
||||||
|
%w[net_income net_income_frequency net_income_uc_proportion housing_benefit].each { |x| case_log[x] = "value" } |
||||||
|
status = get_subsection_status("income_and_benefits", case_log, income_and_benefits_questions) |
||||||
|
expect(status).to eq(:completed) |
||||||
|
end |
||||||
|
|
||||||
|
it "returns not started if the subsection is declaration and all the questions are completed" do |
||||||
|
completed_case_log = CaseLog.new(case_log.attributes.map { |key, value| Hash[key, value || "value"] }.reduce(:merge)) |
||||||
|
status = get_subsection_status("declaration", completed_case_log, declaration_questions) |
||||||
|
expect(status).to eq(:not_started) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
describe "get next incomplete section" do |
||||||
|
let!(:case_log) { FactoryBot.create(:case_log) } |
||||||
|
|
||||||
|
it "returns the first subsection name if it is not completed" do |
||||||
|
@form = Form.new(2021, 2022) |
||||||
|
expect(get_next_incomplete_section(@form, case_log)).to eq("household_characteristics") |
||||||
|
end |
||||||
|
|
||||||
|
it "returns the first subsection name if it is partially completed" do |
||||||
|
@form = Form.new(2021, 2022) |
||||||
|
case_log["tenant_code"] = 123 |
||||||
|
expect(get_next_incomplete_section(@form, case_log)).to eq("household_characteristics") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
describe "get sections count" do |
||||||
|
let!(:empty_case_log) { FactoryBot.create(:case_log) } |
||||||
|
let!(:case_log) { FactoryBot.create(:case_log, :in_progress) } |
||||||
|
|
||||||
|
it "returns the total of sections if no status is given" do |
||||||
|
@form = Form.new(2021, 2022) |
||||||
|
expect(get_sections_count(@form, empty_case_log)).to eq(9) |
||||||
|
end |
||||||
|
|
||||||
|
it "returns 0 sections for completed sections if no sections are completed" do |
||||||
|
@form = Form.new(2021, 2022) |
||||||
|
expect(get_sections_count(@form, empty_case_log, :completed)).to eq(0) |
||||||
|
end |
||||||
|
|
||||||
|
it "returns the number of not started sections" do |
||||||
|
@form = Form.new(2021, 2022) |
||||||
|
expect(get_sections_count(@form, empty_case_log, :not_started)).to eq(8) |
||||||
|
end |
||||||
|
|
||||||
|
it "returns the number of sections in progress" do |
||||||
|
@form = Form.new(2021, 2022) |
||||||
|
expect(get_sections_count(@form, case_log, :in_progress)).to eq(1) |
||||||
|
end |
||||||
|
|
||||||
|
it "returns 0 for invalid state" do |
||||||
|
@form = Form.new(2021, 2022) |
||||||
|
expect(get_sections_count(@form, case_log, :fake)).to eq(0) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
Loading…
Reference in new issue