diff --git a/app/controllers/frontend_log_controller.rb b/app/controllers/frontend_log_controller.rb index b5110c0ed5e..5a7a5bf8163 100644 --- a/app/controllers/frontend_log_controller.rb +++ b/app/controllers/frontend_log_controller.rb @@ -18,6 +18,8 @@ class FrontendLogController < ApplicationController 'Multi-Factor Authentication: download backup code' => :multi_factor_auth_backup_code_download, 'Show Password button clicked' => :show_password_button_clicked, 'IdV: personal key acknowledgment toggled' => :idv_personal_key_acknowledgment_toggled, + 'IdV: user clicked sp link on ready to verify page' => :idv_in_person_ready_to_verify_sp_link_clicked, + 'IdV: user clicked what to bring link on ready to verify page' => :idv_in_person_ready_to_verify_what_to_bring_link_clicked, }.transform_values { |method| AnalyticsEvents.instance_method(method) }.freeze # rubocop:enable Layout/LineLength diff --git a/app/services/analytics_events.rb b/app/services/analytics_events.rb index 530ed65366b..f02e0d06c91 100644 --- a/app/services/analytics_events.rb +++ b/app/services/analytics_events.rb @@ -707,6 +707,22 @@ def idv_in_person_ready_to_verify_visit(proofing_components: nil, **extra) ) end + # The user clicked the sp link on the "ready to verify" page + def idv_in_person_ready_to_verify_sp_link_clicked(**extra) + track_event( + 'IdV: user clicked sp link on ready to verify page', + **extra, + ) + end + + # The user clicked the what to bring link on the "ready to verify" page + def idv_in_person_ready_to_verify_what_to_bring_link_clicked(**extra) + track_event( + 'IdV: user clicked what to bring link on ready to verify page', + **extra, + ) + end + # User has consented to share information with document upload and may # view the "hybrid handoff" step next unless "skip_upload" param is true def idv_doc_auth_agreement_submitted(**extra) diff --git a/app/views/idv/in_person/ready_to_verify/show.html.erb b/app/views/idv/in_person/ready_to_verify/show.html.erb index cc09feb91fd..858543541dd 100644 --- a/app/views/idv/in_person/ready_to_verify/show.html.erb +++ b/app/views/idv/in_person/ready_to_verify/show.html.erb @@ -30,16 +30,18 @@
<% if @presenter.service_provider_homepage_url.present? %> - <%= t( - 'in_person_proofing.body.barcode.return_to_partner_html', - link: link_to( - t( - 'in_person_proofing.body.barcode.return_to_partner_link', - sp_name: @presenter.sp_name, + <%= render ClickObserverComponent.new(event_name: 'IdV: user clicked sp link on ready to verify page') do %> + <%= t( + 'in_person_proofing.body.barcode.return_to_partner_html', + link: link_to( + t( + 'in_person_proofing.body.barcode.return_to_partner_link', + sp_name: @presenter.sp_name, + ), + @presenter.service_provider_homepage_url, ), - @presenter.service_provider_homepage_url, - ), - ) %> + ) %> + <% end %> <% else %> <%= t('in_person_proofing.body.barcode.close_window') %> <% end %> @@ -80,13 +82,15 @@ <% end %>
<%= t('in_person_proofing.body.barcode.questions') %> - <%= new_window_link_to( - t('in_person_proofing.body.barcode.learn_more'), - MarketingSite.help_center_article_url( - category: 'verify-your-identity', - article: 'verify-your-identity-in-person', - ), - ) %> + <%= render ClickObserverComponent.new(event_name: 'IdV: user clicked what to bring link on ready to verify page') do %> + <%= new_window_link_to( + t('in_person_proofing.body.barcode.learn_more'), + MarketingSite.help_center_article_url( + category: 'verify-your-identity', + article: 'verify-your-identity-in-person', + ), + ) %> + <% end %>
diff --git a/spec/features/idv/analytics_spec.rb b/spec/features/idv/analytics_spec.rb index ea9e9a5e475..f1030b9aa1c 100644 --- a/spec/features/idv/analytics_spec.rb +++ b/spec/features/idv/analytics_spec.rb @@ -116,6 +116,8 @@ 'IdV: personal key acknowledgment toggled' => { checked: true, proofing_components: { document_check: 'usps', source_check: 'aamva', resolution_check: 'lexis_nexis', address_check: 'lexis_nexis_address' } }, 'IdV: personal key submitted' => { proofing_components: { document_check: 'usps', source_check: 'aamva', resolution_check: 'lexis_nexis', address_check: 'lexis_nexis_address' }, address_verification_method: 'phone', deactivation_reason: 'in_person_verification_pending' }, 'IdV: in person ready to verify visited' => { proofing_components: { document_check: 'usps', source_check: 'aamva', resolution_check: 'lexis_nexis', address_check: 'lexis_nexis_address' } }, + 'IdV: user clicked what to bring link on ready to verify page' => {}, + 'IdV: user clicked sp link on ready to verify page' => {}, } end # rubocop:enable Layout/LineLength @@ -182,21 +184,44 @@ end context 'in person path' do + let(:return_sp_url) { 'https://example.com/some/idv/ipp/url' } + before do allow(IdentityConfig.store).to receive(:in_person_proofing_enabled).and_return(true) + allow(Idv::InPersonConfig).to receive(:enabled_for_issuer?).and_return(true) + ServiceProvider.find_by(issuer: sp1_issuer).update(return_to_sp_url: return_sp_url) + start_idv_from_sp(:saml) sign_in_and_2fa_user(user) begin_in_person_proofing(user) complete_all_in_person_proofing_steps(user) complete_phone_step(user) complete_review_step(user) acknowledge_and_confirm_personal_key + visit_help_center + visit_sp end it 'records all of the events', allow_browser_log: true do + max_wait = Time.zone.now + 5.seconds + wait_for_event('IdV: user clicked what to bring link on ready to verify page', max_wait) + wait_for_event('IdV: user clicked sp link on ready to verify page', max_wait) in_person_path_events.each do |event, attributes| expect(fake_analytics).to have_logged_event(event, attributes) end end + + # wait for event to happen + def wait_for_event(event, wait) + frequency = 0.1.seconds + loop do + expect(fake_analytics).to have_logged_event(event) + return + rescue RSpec::Expectations::ExpectationNotMetError => err + raise err if wait - Time.zone.now < frequency + sleep frequency + next + end + end end end diff --git a/spec/support/features/idv_step_helper.rb b/spec/support/features/idv_step_helper.rb index 9b1ddc652d1..c9c09aab450 100644 --- a/spec/support/features/idv_step_helper.rb +++ b/spec/support/features/idv_step_helper.rb @@ -55,6 +55,29 @@ def complete_idv_steps_with_phone_before_review_step(user = user_with_2fa) complete_phone_step(user) end + def visit_help_center + click_what_to_bring_link + end + + def click_what_to_bring_link + expect(page).to have_content(t('in_person_proofing.headings.barcode')) + click_link t('in_person_proofing.body.barcode.learn_more') + end + + def visit_sp + click_sp_link + end + + def click_sp_link + expect(page).to have_content(sp_text) + click_link('return to Test SP') + end + + def sp_text + 'You may now close this window or return to Test SP to complete any next steps' \ + ' you can access until your identity has been verified.' + end + def complete_review_step(user = user_with_2fa) password = user.password || user_password fill_in 'Password', with: password diff --git a/spec/support/features/in_person_helper.rb b/spec/support/features/in_person_helper.rb index dd5ec2eb272..a75e5c9eb86 100644 --- a/spec/support/features/in_person_helper.rb +++ b/spec/support/features/in_person_helper.rb @@ -42,7 +42,6 @@ def begin_in_person_proofing(_user = nil) complete_doc_auth_steps_before_document_capture_step mock_doc_auth_attention_with_barcode attach_and_submit_images - click_link t('in_person_proofing.body.cta.button') end diff --git a/spec/views/idv/in_person/ready_to_verify/show.html.erb_spec.rb b/spec/views/idv/in_person/ready_to_verify/show.html.erb_spec.rb index 32431c94380..7598ec89385 100644 --- a/spec/views/idv/in_person/ready_to_verify/show.html.erb_spec.rb +++ b/spec/views/idv/in_person/ready_to_verify/show.html.erb_spec.rb @@ -24,6 +24,8 @@ end let(:presenter) { Idv::InPerson::ReadyToVerifyPresenter.new(enrollment: enrollment) } let(:step_indicator_steps) { Idv::Flows::InPersonFlow::STEP_INDICATOR_STEPS } + let(:sp_event_name) { 'IdV: user clicked sp link on ready to verify page' } + let(:help_event_name) { 'IdV: user clicked what to bring link on ready to verify page' } before do assign(:presenter, presenter) @@ -34,6 +36,14 @@ render expect(rendered).to have_content(service_provider.friendly_name) + expect(rendered).to have_css("lg-click-observer[event-name='#{sp_event_name}']") + end + + it 'displays a link back to the help center' do + render + + expect(rendered).to have_link(t('in_person_proofing.body.barcode.learn_more')) + expect(rendered).to have_css("lg-click-observer[event-name='#{help_event_name}']") end context 'when the user is not coming from a service provider' do