diff --git a/app/controllers/concerns/idv_step_concern.rb b/app/controllers/concerns/idv_step_concern.rb index 537b8cb33be..7701aca863f 100644 --- a/app/controllers/concerns/idv_step_concern.rb +++ b/app/controllers/concerns/idv_step_concern.rb @@ -119,6 +119,10 @@ def url_for_latest_step end def clear_future_steps! - flow_policy.undo_future_steps_from_controller!(controller: self.class) + clear_future_steps_from!(controller: self.class) + end + + def clear_future_steps_from!(controller:) + flow_policy.undo_future_steps_from_controller!(controller: controller) end end diff --git a/app/controllers/idv/in_person/address_controller.rb b/app/controllers/idv/in_person/address_controller.rb index 506b2614246..8d143bea89a 100644 --- a/app/controllers/idv/in_person/address_controller.rb +++ b/app/controllers/idv/in_person/address_controller.rb @@ -6,6 +6,7 @@ class AddressController < ApplicationController before_action :render_404_if_in_person_residential_address_controller_enabled_not_set before_action :confirm_in_person_state_id_step_complete + ## before_action :confirm_step_allowed # pending FSM removal of state id step before_action :confirm_in_person_address_step_needed, only: :show def show @@ -15,6 +16,8 @@ def show end def update + # don't clear the ssn when updating address, clear after SsnController + clear_future_steps_from!(controller: Idv::InPerson::SsnController) attrs = Idv::InPerson::AddressForm::ATTRIBUTES.difference([:same_address_as_id]) pii_from_user[:same_address_as_id] = 'false' if updating_address? form_result = form.submit(flow_params) @@ -42,6 +45,24 @@ def extra_view_variables } end + # update Idv::DocumentCaptureController.step_info.next_steps to include + # :ipp_address instead of :ipp_ssn in delete PR + def self.step_info + Idv::StepInfo.new( + key: :ipp_address, + controller: self, + next_steps: [:ipp_ssn], + preconditions: ->(idv_session:, user:) { idv_session.ipp_state_id_complete? }, + undo_step: ->(idv_session:, user:) do + flow_session[:pii_from_user][:address1] = nil + flow_session[:pii_from_user][:address2] = nil + flow_session[:pii_from_user][:city] = nil + flow_session[:pii_from_user][:zipcode] = nil + flow_session[:pii_from_user][:state] = nil + end, + ) + end + private def flow_session diff --git a/app/policies/idv/flow_policy.rb b/app/policies/idv/flow_policy.rb index 1a6f82787c2..89ac98cf2d1 100644 --- a/app/policies/idv/flow_policy.rb +++ b/app/policies/idv/flow_policy.rb @@ -56,6 +56,7 @@ def steps hybrid_handoff: Idv::HybridHandoffController.step_info, link_sent: Idv::LinkSentController.step_info, document_capture: Idv::DocumentCaptureController.step_info, + ipp_address: Idv::InPerson::AddressController.step_info, ssn: Idv::SsnController.step_info, ipp_ssn: Idv::InPerson::SsnController.step_info, verify_info: Idv::VerifyInfoController.step_info, diff --git a/app/services/idv/session.rb b/app/services/idv/session.rb index 0a4d56c2798..ec9fc3380e9 100644 --- a/app/services/idv/session.rb +++ b/app/services/idv/session.rb @@ -183,7 +183,13 @@ def remote_document_capture_complete? end def ipp_document_capture_complete? - has_pii_from_user_in_flow_session + has_pii_from_user_in_flow_session && + user_session['idv/in_person'][:pii_from_user].has_key?(:address1) + end + + def ipp_state_id_complete? + has_pii_from_user_in_flow_session && + user_session['idv/in_person'][:pii_from_user].has_key?(:identity_doc_address1) end def verify_info_step_complete? diff --git a/spec/controllers/idv/in_person/address_controller_spec.rb b/spec/controllers/idv/in_person/address_controller_spec.rb index 9f50201c762..086d7af1491 100644 --- a/spec/controllers/idv/in_person/address_controller_spec.rb +++ b/spec/controllers/idv/in_person/address_controller_spec.rb @@ -1,31 +1,32 @@ require 'rails_helper' RSpec.describe Idv::InPerson::AddressController do + include FlowPolicyHelper include InPersonHelper - let(:pii_from_user) { Idp::Constants::MOCK_IPP_APPLICANT_SAME_ADDRESS_AS_ID_FALSE.dup } let(:user) { build(:user) } - let(:flow_session) do - { pii_from_user: pii_from_user } - end - let(:ssn) { nil } before do allow(IdentityConfig.store).to receive(:in_person_residential_address_controller_enabled). and_return(true) allow(IdentityConfig.store).to receive(:usps_ipp_transliteration_enabled). and_return(true) - allow(subject).to receive(:current_user). - and_return(user) - allow(subject).to receive(:pii_from_user).and_return(pii_from_user) - allow(subject).to receive(:flow_session).and_return(flow_session) stub_sign_in(user) - subject.idv_session.flow_path = 'standard' - subject.idv_session.ssn = ssn + stub_up_to(:hybrid_handoff, idv_session: subject.idv_session) + subject.user_session['idv/in_person'] = { + pii_from_user: Idp::Constants::MOCK_IPP_APPLICANT_SAME_ADDRESS_AS_ID_FALSE.dup, + } + subject.idv_session.ssn = nil stub_analytics allow(@analytics).to receive(:track_event) end + describe '#step_info' do + it 'returns a valid StepInfo object' do + expect(Idv::InPerson::AddressController.step_info).to be_valid + end + end + describe 'before_actions' do context '#render_404_if_in_person_residential_address_controller_enabled not set' do context 'flag not set' do @@ -55,7 +56,7 @@ context '#confirm_in_person_state_id_step_complete' do it 'redirects to state id page if not complete' do - flow_session[:pii_from_user].delete(:identity_doc_address1) + subject.user_session['idv/in_person'][:pii_from_user].delete(:identity_doc_address1) get :show expect(response).to redirect_to idv_in_person_step_url(step: :state_id) @@ -99,7 +100,7 @@ end it 'redirects to ssn page when address1 present' do - flow_session[:pii_from_user][:address1] = '123 Main St' + subject.user_session['idv/in_person'][:pii_from_user][:address1] = '123 Main St' get :show @@ -143,7 +144,6 @@ state: state, } } end - let(:ssn) { '900123456' } let(:analytics_name) { 'IdV: in person proofing residential address submitted' } let(:analytics_args) do { @@ -165,7 +165,7 @@ it 'sets values in the flow session' do put :update, params: params - expect(flow_session[:pii_from_user]).to include( + expect(subject.user_session['idv/in_person'][:pii_from_user]).to include( address1:, address2:, city:, @@ -184,48 +184,53 @@ context 'when updating the residential address' do before do - flow_session[:pii_from_user][:address1] = '123 New Residential Ave' + subject.user_session['idv/in_person'][:pii_from_user][:address1] = + '123 New Residential Ave' end context 'user previously selected that the residential address matched state ID' do before do - flow_session[:pii_from_user][:same_address_as_id] = 'true' + subject.user_session['idv/in_person'][:pii_from_user][:same_address_as_id] = 'true' end it 'infers and sets the "same_address_as_id" in the flow session to false' do put :update, params: params - expect(flow_session[:pii_from_user][:same_address_as_id]).to eq('false') + expect(subject.user_session['idv/in_person'][:pii_from_user][:same_address_as_id]). + to eq('false') end end context 'user previously selected that the residential address did not match state ID' do before do - flow_session[:pii_from_user][:same_address_as_id] = 'false' + subject.user_session['idv/in_person'][:pii_from_user][:same_address_as_id] = 'false' end it 'leaves the "same_address_as_id" in the flow session as false' do put :update, params: params - expect(flow_session[:pii_from_user][:same_address_as_id]).to eq('false') + expect(subject.user_session['idv/in_person'][:pii_from_user][:same_address_as_id]). + to eq('false') end end end + + it 'invalidates future steps, but does not clear ssn' do + subject.idv_session.ssn = '123-45-6789' + expect(subject).to receive(:clear_future_steps_from!).and_call_original + + expect { put :update, params: params }.not_to change { subject.idv_session.ssn } + end end context 'invalid address details' do - let(:address1) { '1 F@KE RD' } - let(:address2) { '@?T 1B' } - let(:city) { 'GR3AT F&LLS' } - let(:zipcode) { '59010' } - let(:state) { 'Montana' } let(:params) do { in_person_address: { - address1: address1, - address2: address2, - city: city, - zipcode: zipcode, - state: state, + address1: '1 F@KE RD', + address2: '@?T 1B', + city: 'GR3AT F&LLS', + zipcode: '59010', + state: 'Montana', } } end let(:analytics_name) { 'IdV: in person proofing residential address submitted' } diff --git a/spec/policies/idv/flow_policy_spec.rb b/spec/policies/idv/flow_policy_spec.rb index 4c51192fc7d..97591ea48a3 100644 --- a/spec/policies/idv/flow_policy_spec.rb +++ b/spec/policies/idv/flow_policy_spec.rb @@ -222,7 +222,9 @@ context 'preconditions for in_person ssn are present' do before do stub_up_to(:hybrid_handoff, idv_session: idv_session) - idv_session.send(:user_session)['idv/in_person'] = { pii_from_user: { pii: 'value' } } + idv_session.send(:user_session)['idv/in_person'] = { + pii_from_user: Idp::Constants::MOCK_IDV_APPLICANT_SAME_ADDRESS_AS_ID.dup, + } end it 'returns ipp_ssn' do