diff --git a/app/services/idv/steps/in_person/state_id_step.rb b/app/services/idv/steps/in_person/state_id_step.rb index 7f4c13bfa42..85fa5ab86f7 100644 --- a/app/services/idv/steps/in_person/state_id_step.rb +++ b/app/services/idv/steps/in_person/state_id_step.rb @@ -14,19 +14,25 @@ def self.analytics_submitted_event def call pii_from_user = flow_session[:pii_from_user] + initial_state_of_same_address_as_id = flow_session[:pii_from_user][:same_address_as_id] Idv::StateIdForm::ATTRIBUTES.each do |attr| flow_session[:pii_from_user][attr] = flow_params[attr] end # Accept Date of Birth from both memorable date and input date components formatted_dob = MemorableDateComponent.extract_date_param flow_params&.[](:dob) pii_from_user[:dob] = formatted_dob if formatted_dob - if capture_secondary_id_enabled? && pii_from_user[:same_address_as_id] == 'true' - pii_from_user[:address1] = flow_params[:identity_doc_address1] - pii_from_user[:address2] = flow_params[:identity_doc_address2] - pii_from_user[:city] = flow_params[:identity_doc_city] - pii_from_user[:state] = flow_params[:identity_doc_address_state] - pii_from_user[:zipcode] = flow_params[:identity_doc_zipcode] - mark_step_complete(:address) + + if capture_secondary_id_enabled? + if pii_from_user[:same_address_as_id] == 'true' + copy_state_id_address_to_residential_address(pii_from_user) + mark_step_complete(:address) + end + + if initial_state_of_same_address_as_id == 'true' && + pii_from_user[:same_address_as_id] == 'false' + clear_residential_address(pii_from_user) + mark_step_incomplete(:address) + end end end @@ -46,6 +52,22 @@ def capture_secondary_id_enabled? current_user.establishing_in_person_enrollment.capture_secondary_id_enabled end + def clear_residential_address(pii_from_user) + pii_from_user.delete(:address1) + pii_from_user.delete(:address2) + pii_from_user.delete(:city) + pii_from_user.delete(:state) + pii_from_user.delete(:zipcode) + end + + def copy_state_id_address_to_residential_address(pii_from_user) + pii_from_user[:address1] = flow_params[:identity_doc_address1] + pii_from_user[:address2] = flow_params[:identity_doc_address2] + pii_from_user[:city] = flow_params[:identity_doc_city] + pii_from_user[:state] = flow_params[:identity_doc_address_state] + pii_from_user[:zipcode] = flow_params[:identity_doc_zipcode] + end + def updating_state_id flow_session[:pii_from_user].has_key?(:first_name) end diff --git a/spec/features/idv/in_person_spec.rb b/spec/features/idv/in_person_spec.rb index aa0b9b77892..3f0db70a9d2 100644 --- a/spec/features/idv/in_person_spec.rb +++ b/spec/features/idv/in_person_spec.rb @@ -688,4 +688,158 @@ expect(page).to have_content(t('headings.verify')) end end + + context 'in_person_capture_secondary_id_enabled feature flag enabled and' do + context 'when updates are made on state ID page starting from Verify Your Information', + allow_browser_log: true do + let(:user) { user_with_2fa } + + before(:each) do + allow(IdentityConfig.store).to receive(:in_person_capture_secondary_id_enabled). + and_return(true) + + sign_in_and_2fa_user(user) + begin_in_person_proofing(user) + complete_location_step(user) + complete_prepare_step(user) + end + + it 'does not update their previous selection of "Yes, + I live at the address on my state-issued ID"' do + complete_state_id_step(user, same_address_as_id: true, double_address_verification: true) + # skip address step + complete_ssn_step(user) + # expect to be on verify page + expect(page).to have_content(t('headings.verify')) + expect(page).to have_current_path(idv_in_person_step_url(step: :verify)) + # click update state ID button on the verify page + click_button t('idv.buttons.change_state_id_label') + # expect to be on the state ID page + expect(page).to have_content(t('in_person_proofing.headings.update_state_id')) + # change address + fill_in t('in_person_proofing.form.state_id.address1'), with: '' + fill_in t('in_person_proofing.form.state_id.address1'), with: 'test update address' + click_button t('forms.buttons.submit.update') + # expect to be back on verify page + expect(page).to have_content(t('headings.verify')) + expect(page).to have_current_path(idv_in_person_step_url(step: :verify)) + expect(page).to have_content(t('headings.verify')) + # expect to see state ID address update on verify twice + expect(page).to have_text('test update address').twice # for state id addr and addr update + # click update state id address + click_button t('idv.buttons.change_state_id_label') + # expect to be on the state ID page + expect(page).to have_content(t('in_person_proofing.headings.update_state_id')) + # expect "Yes, I live at a different address" is checked" + expect(page).to have_checked_field( + t('in_person_proofing.form.state_id.same_address_as_id_yes'), + visible: false, + ) + end + + it 'does not update their previous selection of "No, I live at a different address"' do + complete_state_id_step(user, same_address_as_id: false, double_address_verification: true) + # expect to be on address page + expect(page).to have_content(t('in_person_proofing.headings.address')) + # complete address step + complete_address_step(user, double_address_verification: true) + complete_ssn_step(user) + # expect to be back on verify page + expect(page).to have_content(t('headings.verify')) + expect(page).to have_current_path(idv_in_person_step_url(step: :verify)) + # click update state ID button on the verify page + click_button t('idv.buttons.change_state_id_label') + # expect to be on the state ID page + expect(page).to have_content(t('in_person_proofing.headings.update_state_id')) + # change address + fill_in t('in_person_proofing.form.state_id.address1'), with: '' + fill_in t('in_person_proofing.form.state_id.address1'), with: 'test update address' + click_button t('forms.buttons.submit.update') + # expect to be back on verify page + expect(page).to have_content(t('headings.verify')) + expect(page).to have_current_path(idv_in_person_step_url(step: :verify)) + expect(page).to have_content(t('headings.verify')) + # expect to see state ID address update on verify + expect(page).to have_text('test update address').once # only state id address update + # click update state id address + click_button t('idv.buttons.change_state_id_label') + # expect to be on the state ID page + expect(page).to have_content(t('in_person_proofing.headings.update_state_id')) + expect(page).to have_checked_field( + t('in_person_proofing.form.state_id.same_address_as_id_no'), + visible: false, + ) + end + + it 'updates their previous selection from "Yes" TO "No, I live at a different address"' do + complete_state_id_step(user, same_address_as_id: true, double_address_verification: true) + # skip address step + complete_ssn_step(user) + # click update state ID button on the verify page + click_button t('idv.buttons.change_state_id_label') + # expect to be on the state ID page + expect(page).to have_content(t('in_person_proofing.headings.update_state_id')) + # change address + fill_in t('in_person_proofing.form.state_id.address1'), with: '' + fill_in t('in_person_proofing.form.state_id.address1'), with: 'test update address' + # change response to No + choose t('in_person_proofing.form.state_id.same_address_as_id_no') + click_button t('forms.buttons.submit.update') + # expect to be on address page + expect(page).to have_content(t('in_person_proofing.headings.address')) + # complete address step + complete_address_step(user, double_address_verification: true) + # expect to be on verify page + expect(page).to have_content(t('headings.verify')) + expect(page).to have_current_path(idv_in_person_step_url(step: :verify)) + # expect to see state ID address update on verify + expect(page).to have_text('test update address').once # only state id address update + # click update state id address + click_button t('idv.buttons.change_state_id_label') + # expect to be on the state ID page + expect(page).to have_content(t('in_person_proofing.headings.update_state_id')) + # check that the "No, I live at a different address" is checked" + expect(page).to have_checked_field( + t('in_person_proofing.form.state_id.same_address_as_id_no'), + visible: false, + ) + end + + it 'updates their previous selection from "No" TO "Yes, + I live at the address on my state-issued ID"' do + complete_state_id_step(user, same_address_as_id: false, double_address_verification: true) + # expect to be on address page + expect(page).to have_content(t('in_person_proofing.headings.address')) + # complete address step + complete_address_step(user, double_address_verification: true) + complete_ssn_step(user) + # expect to be on verify page + expect(page).to have_content(t('headings.verify')) + expect(page).to have_current_path(idv_in_person_step_url(step: :verify)) + # click update state ID button on the verify page + click_button t('idv.buttons.change_state_id_label') + # expect to be on the state ID page + expect(page).to have_content(t('in_person_proofing.headings.update_state_id')) + # change address + fill_in t('in_person_proofing.form.state_id.address1'), with: '' + fill_in t('in_person_proofing.form.state_id.address1'), with: 'test update address' + # change response to Yes + choose t('in_person_proofing.form.state_id.same_address_as_id_yes') + click_button t('forms.buttons.submit.update') + # expect to be back on verify page + expect(page).to have_content(t('headings.verify')) + expect(page).to have_current_path(idv_in_person_step_url(step: :verify)) + # expect to see state ID address update on verify twice + expect(page).to have_text('test update address').twice # for state id addr and addr update + # click update state ID button on the verify page + click_button t('idv.buttons.change_state_id_label') + # expect to be on the state ID page + expect(page).to have_content(t('in_person_proofing.headings.update_state_id')) + expect(page).to have_checked_field( + t('in_person_proofing.form.state_id.same_address_as_id_yes'), + visible: false, + ) + end + end + end end diff --git a/spec/services/idv/steps/in_person/address_step_spec.rb b/spec/services/idv/steps/in_person/address_step_spec.rb index 00c09be1b91..194fac40b6d 100644 --- a/spec/services/idv/steps/in_person/address_step_spec.rb +++ b/spec/services/idv/steps/in_person/address_step_spec.rb @@ -1,6 +1,7 @@ require 'rails_helper' describe Idv::Steps::InPerson::AddressStep do + include InPersonHelper let(:submitted_values) { {} } let(:pii_from_user) { flow.flow_session[:pii_from_user] } let(:params) { ActionController::Parameters.new({ in_person_address: submitted_values }) } @@ -115,7 +116,7 @@ let(:params) { ActionController::Parameters.new } context 'address1 is set' do - it 'returns extra view variables' do + it 'returns extra view variables and updating_address is true' do pii_from_user[:address1] = address1 expect(step.extra_view_variables).to include( @@ -127,6 +128,18 @@ end end + context 'address1 is not set' do + it 'does not return extra view variables and updating_address is false' do + expect(step.extra_view_variables[:pii]).not_to include( + address1:, + ) + + expect(step.extra_view_variables).to include( + updating_address: false, + ) + end + end + it 'returns capture enabled = false' do expect(step.extra_view_variables).to include( capture_secondary_id_enabled: false, diff --git a/spec/services/idv/steps/in_person/state_id_step_spec.rb b/spec/services/idv/steps/in_person/state_id_step_spec.rb index 3018263966c..b5c16c2a7b0 100644 --- a/spec/services/idv/steps/in_person/state_id_step_spec.rb +++ b/spec/services/idv/steps/in_person/state_id_step_spec.rb @@ -1,6 +1,7 @@ require 'rails_helper' describe Idv::Steps::InPerson::StateIdStep do + include InPersonHelper let(:submitted_values) { {} } let(:params) { ActionController::Parameters.new({ state_id: submitted_values }) } let(:user) { build(:user) } @@ -81,6 +82,238 @@ end end end + + context 'when capture_secondary_id_enabled is...' do + let(:pii_from_user) { flow.flow_session[:pii_from_user] } + let(:params) { ActionController::Parameters.new({ state_id: submitted_values }) } + let(:capture_secondary_id_enabled) { true } + let(:dob) { InPersonHelper::GOOD_DOB } + # let(:same_address_as_id) { 'false' } # value on submission + # residential + let(:address1) { InPersonHelper::GOOD_ADDRESS1 } + let(:address2) { InPersonHelper::GOOD_ADDRESS2 } + let(:city) { InPersonHelper::GOOD_CITY } + let(:state) { InPersonHelper::GOOD_STATE } + let(:zipcode) { InPersonHelper::GOOD_ZIPCODE } + # identity_doc_ + let(:identity_doc_address1) { InPersonHelper::GOOD_IDENTITY_DOC_ADDRESS1 } + let(:identity_doc_address2) { InPersonHelper::GOOD_IDENTITY_DOC_ADDRESS2 } + let(:identity_doc_city) { InPersonHelper::GOOD_IDENTITY_DOC_CITY } + let(:identity_doc_address_state) { InPersonHelper::GOOD_IDENTITY_DOC_ADDRESS_STATE } + let(:identity_doc_zipcode) { InPersonHelper::GOOD_IDENTITY_DOC_ZIPCODE } + + before(:each) do + allow(user).to receive(:establishing_in_person_enrollment). + and_return(enrollment) + end + + context 'enabled, and + same_address_as_id changed from "true" to "false"' do + let(:submitted_values) do + { + dob:, + same_address_as_id: 'false', # value on submission + address1:, + address2:, + city:, + state:, + zipcode:, + identity_doc_address1:, + identity_doc_address2:, + identity_doc_city:, + identity_doc_address_state:, + identity_doc_zipcode:, + } + end + it 'marks address step as incomplete, retains identity_doc_ attrs/value + but removes addr attr in flow session' do + Idv::StateIdForm::ATTRIBUTES.each do |attr| + expect(flow.flow_session[:pii_from_user]).to_not have_key attr + end + + # User picks "Yes, I live at the address on my state-issued ID" on state ID + pii_from_user[:same_address_as_id] = 'true' # on form before submission + pii_from_user[:identity_doc_address1] = identity_doc_address1 + pii_from_user[:identity_doc_address2] = identity_doc_address2 + pii_from_user[:identity_doc_city] = identity_doc_city + pii_from_user[:identity_doc_address_state] = identity_doc_address_state + pii_from_user[:identity_doc_zipcode] = identity_doc_zipcode + pii_from_user[:address1] = address1 + pii_from_user[:address2] = address2 + pii_from_user[:city] = city + pii_from_user[:state] = state + pii_from_user[:zipcode] = zipcode + + # On Verify, user changes response from "Yes,..." to + # "No, I live at a different address", see submitted_values above + step.call + + # marks address step as incomplete + address_step = flow.flow_session[Idv::Steps::InPerson::AddressStep.name] + expect(address_step).to eq nil + + # retains identity_doc_ attributes and values in flow session + expect(flow.flow_session[:pii_from_user]).to include( + identity_doc_address1:, + identity_doc_address2:, + identity_doc_city:, + identity_doc_address_state:, + identity_doc_zipcode:, + ) + + # removes address attributes (non identity_doc_ attributes) in flow session + expect(flow.flow_session[:pii_from_user]).not_to include( + address1:, + address2:, + city:, + state:, + zipcode:, + ) + end + end + + context 'enabled, and + same_address_as_id changed from "false" to "true"' do + let(:submitted_values) do + { + dob:, + same_address_as_id: 'true', # value on submission + address1:, # address1 and identity_doc_address1 is innitially different + address2:, + city:, + state:, + zipcode:, + identity_doc_address1:, + identity_doc_address2:, + identity_doc_city:, + identity_doc_address_state:, + identity_doc_zipcode:, + } + end + + it 'retains identity_doc_ attrs/value ands addr attr + with same value as identity_doc in flow session' do + Idv::StateIdForm::ATTRIBUTES.each do |attr| + expect(flow.flow_session[:pii_from_user]).to_not have_key attr + end + # On Verify, user changes response from "No,..." to + # "Yes, I live at the address on my state-issued ID + step.call + # expect addr attr values to the same as the identity_doc attr values + expect(pii_from_user[:address1]).to eq identity_doc_address1 + expect(pii_from_user[:address2]).to eq identity_doc_address2 + expect(pii_from_user[:city]).to eq identity_doc_city + expect(pii_from_user[:state]).to eq identity_doc_address_state + expect(pii_from_user[:zipcode]).to eq identity_doc_zipcode + end + end + + context 'enabled, and + same_address_as_id does not change from from "false"' do + let(:submitted_values) do + { + dob:, + same_address_as_id: 'false', + address1:, + address2:, + city:, + state:, + zipcode:, + identity_doc_address1:, + identity_doc_address2:, + identity_doc_city:, + identity_doc_address_state:, + identity_doc_zipcode:, + } + end + it 'retains identity_doc_ and addr attrs/value in flow session' do + Idv::StateIdForm::ATTRIBUTES.each do |attr| + expect(flow.flow_session[:pii_from_user]).to_not have_key attr + end + + # User picks "No, I live at a different address" on state ID + pii_from_user[:same_address_as_id] = 'false' # on form before submission + pii_from_user[:identity_doc_address1] = identity_doc_address1 + pii_from_user[:identity_doc_address2] = identity_doc_address2 + pii_from_user[:identity_doc_city] = identity_doc_city + pii_from_user[:identity_doc_address_state] = identity_doc_address_state + pii_from_user[:identity_doc_zipcode] = identity_doc_zipcode + pii_from_user[:address1] = address1 + pii_from_user[:address2] = address2 + pii_from_user[:city] = city + pii_from_user[:state] = state + pii_from_user[:zipcode] = zipcode + + # On Verify, user does not changes response "No,..." + step.call + + # retains identity_doc_ & addr attributes and values in flow session + expect(flow.flow_session[:pii_from_user]).to include( + identity_doc_address1:, + identity_doc_address2:, + identity_doc_city:, + identity_doc_address_state:, + identity_doc_zipcode:, + address1:, + address2:, + city:, + state:, + zipcode:, + ) + + # those values are different + pii_from_user = flow.flow_session[:pii_from_user] + expect(pii_from_user[:address1]).to_not eq identity_doc_address1 + expect(pii_from_user[:address2]).to_not eq identity_doc_address2 + expect(pii_from_user[:city]).to_not eq identity_doc_city + expect(pii_from_user[:state]).to_not eq identity_doc_address_state + expect(pii_from_user[:zipcode]).to_not eq identity_doc_zipcode + end + end + + context 'not enabled' do + let(:capture_secondary_id_enabled) { false } + let(:submitted_values) do + { + dob:, + same_address_as_id: 'false', + address1:, + address2:, + city:, + state:, + zipcode:, + identity_doc_address1:, + identity_doc_address2:, + identity_doc_city:, + identity_doc_address_state:, + identity_doc_zipcode:, + } + end + + it 'retains identity_doc_ attr/values in flow session' do + Idv::StateIdForm::ATTRIBUTES.each do |attr| + expect(flow.flow_session[:pii_from_user]).to_not have_key attr + end + + pii_from_user[:same_address_as_id] = 'true' # on form before submission + pii_from_user[:identity_doc_address1] = identity_doc_address1 + pii_from_user[:identity_doc_address2] = identity_doc_address2 + pii_from_user[:identity_doc_city] = identity_doc_city + pii_from_user[:identity_doc_address_state] = identity_doc_address_state + pii_from_user[:identity_doc_zipcode] = identity_doc_zipcode + + step.call + + expect(flow.flow_session[:pii_from_user]).to include( + identity_doc_address1:, + identity_doc_address2:, + identity_doc_city:, + identity_doc_address_state:, + identity_doc_zipcode:, + ) + end + end + end end describe '#extra_view_variables' do