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