Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
841a0f2
LG-12631: WIP
dawei-nava Mar 14, 2024
b26d41b
LG-12631: deal with back button on ipp prepare page.
dawei-nava Mar 14, 2024
188a45d
LG-12631: UI update and tests.
dawei-nava Mar 15, 2024
be3faa3
LG-12631: translation format.
dawei-nava Mar 15, 2024
2cd1977
LG-12631: Use conditional action.
dawei-nava Mar 15, 2024
95d23c1
LG-12631: test update.
dawei-nava Mar 16, 2024
b31b55b
LG-12631: erb template test update.
dawei-nava Mar 16, 2024
4e23871
LG-12631: explicitly allow skip handoff in test.
dawei-nava Mar 18, 2024
0b308b1
LG-12631: introduce dedicated flag for choosing IPP from handoff page.
dawei-nava Mar 19, 2024
527e65a
LG-12631: set step indicator correctly.
dawei-nava Mar 19, 2024
22580ba
LG-12631: rename controller var to avoid confusion.
dawei-nava Mar 19, 2024
36d42d4
LG-12631: update tests WIP.
dawei-nava Mar 19, 2024
3441b4b
LG-12631: update tests WIP.
dawei-nava Mar 20, 2024
62063fd
LG-12631: update tests WIP.
dawei-nava Mar 21, 2024
0d1343d
LG-12631: update tests for various scenarios.
dawei-nava Mar 21, 2024
308f3f0
LG-12631: update tests for various scenarios.
dawei-nava Mar 21, 2024
d3b4557
LG-12631: update based on comments.
dawei-nava Mar 21, 2024
2a11005
LG-12631: fix tests.
dawei-nava Mar 21, 2024
850a873
LG-12631: some minor changes.
dawei-nava Mar 26, 2024
b83783e
LG-12631: extra character.
dawei-nava Mar 28, 2024
e44e1ff
LG-12631: check whether the consent was given upon direct access of ipp.
dawei-nava Mar 28, 2024
4dda380
LG-12631: update test to confirm IPP from how to verify page.
dawei-nava Mar 28, 2024
2f130b0
LG-12631: minor change.
dawei-nava Mar 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion app/controllers/idv/document_capture_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class DocumentCaptureController < ApplicationController
include StepIndicatorConcern

before_action :confirm_not_rate_limited, except: [:update]
before_action :confirm_step_allowed
before_action :confirm_step_allowed, unless: -> { allow_direct_ipp? }
Copy link
Copy Markdown
Contributor

@amirbey amirbey Mar 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this does not enforce that welcome and agreement pages were completed if IPP is enabled? 🤔
perhaps we should make this less lax?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@amirbey, good suggestions, i was thinking add checking the referer, but this sounds better. Added check and tests.

before_action :override_csp_to_allow_acuant

def show
Expand Down Expand Up @@ -47,6 +47,7 @@ def extra_view_variables
sp_name: decorated_sp_session.sp_name,
failure_to_proof_url: return_to_sp_failure_to_proof_url(step: 'document_capture'),
skip_doc_auth: idv_session.skip_doc_auth,
skip_doc_auth_from_handoff: idv_session.skip_doc_auth_from_handoff,
opted_in_to_in_person_proofing: idv_session.opted_in_to_in_person_proofing,
doc_auth_selfie_capture: decorated_sp_session.selfie_required?,
}.merge(
Expand All @@ -62,6 +63,7 @@ def self.step_info
preconditions: ->(idv_session:, user:) {
idv_session.flow_path == 'standard' && (
# mobile
idv_session.skip_doc_auth_from_handoff ||
idv_session.skip_hybrid_handoff ||
idv_session.skip_doc_auth ||
!idv_session.selfie_check_required || # desktop but selfie not required
Expand Down Expand Up @@ -109,5 +111,22 @@ def handle_stored_result
failure(I18n.t('doc_auth.errors.general.network_error'), extra)
end
end

def allow_direct_ipp?
return false unless idv_session.welcome_visited &&
idv_session.idv_consent_given
# not allowed when no step param and action:show(get request)
return false if params[:step].blank? || params[:action].to_s != 'show' ||
idv_session.flow_path == 'hybrid'
# Only allow direct access to document capture if IPP available
return false unless IdentityConfig.store.in_person_doc_auth_button_enabled &&
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏻

Idv::InPersonConfig.enabled_for_issuer?(decorated_sp_session.sp_issuer)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For posterity (you're the one that shared this, just want to note it here as well): that first line is due to https://gsa-tts.slack.com/archives/C5QUGUANN/p1689380596444809?thread_ts=1689376275.536679&cid=C5QUGUANN — it's a rarely-used shutoff valve.

We have not been using Idv::InPersonConfig, but arguably should be. The only issue with it right now is that it doesn't take into account the in_person_proofing_opt_in_enabled feature flag. Long-term that's going away and it'll just always be on. (Right now, in_person_proofing_enabled controls IPP globally, including as a fallback to remote proofing, while in_person_proofing_opt_in_enabled only controls whether we offer IPP up front.) I think we may want to add that conditional for now. It might sense to add it right on the enabled? method in InPersonConfig.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I chatted with @JackRyan1989 a bit about this, and filed LG-12768 for us to update our code to use Idv::InPersonConfig.enabled_for_issuer?. Don't hold off until we do it, though, just noting it for your awareness.

Copy link
Copy Markdown
Contributor Author

@dawei-nava dawei-nava Mar 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@n1zyy , i used this condition based on like in the frontend

idv_in_person_url: (IdentityConfig.store.in_person_doc_auth_button_enabled && Idv::InPersonConfig.enabled_for_issuer?(decorated_sp_session.sp_issuer)) ? idv_in_person_url : nil,

Here I did not add in_person_proofing_opt_in_enabled because regardless of the how to verify opt-in screen enabled or not, the handoff page ipp option is not affected, only affected by system wide feature and sp option.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@n1zyy is there existing documentation about IdentityConfig.store.in_person_doc_auth_button_enabled and Idv::InPersonConfig? I want to make sure this information is accessible outside of this github conversation.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eileen-nava I don't think there is (yet). :( For want of a better solution, I left comments here as little breadcrumbs. I'm still not quite sure what the best way to capture this information is. Do you have a better sense than I do of where we could capture this knowledge?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@n1zyy Since the knowledge that needs to be documented is Team Joy domain, I will leave the decision up to you of where to document it.

@previous_step_url = params[:step] == 'hybrid_handoff' ? idv_hybrid_handoff_path : nil
# allow
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Helpful comment, I didn't wrap my head around this at first.

idv_session.flow_path = 'standard'
idv_session.skip_doc_auth_from_handoff = true
idv_session.skip_hybrid_handoff = nil
true
end
end
end
11 changes: 10 additions & 1 deletion app/controllers/idv/hybrid_handoff_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ def show
@upload_disabled = idv_session.selfie_check_required &&
!idv_session.desktop_selfie_test_mode_enabled?

@direct_ipp_with_selfie_enabled = IdentityConfig.store.in_person_doc_auth_button_enabled &&
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏻

Idv::InPersonConfig.enabled_for_issuer?(
Copy link
Copy Markdown
Contributor

@gina-yamada gina-yamada Mar 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I may very much be wrong here so please poke back- vacation brain.

I am wondering if in_person_doc_auth_button_enabled can be replaced by the already existing in_person_proofing_enabled flag? If you follow the flow through- if you fail remote and this flag is set to false- you will only be asked to retry remote- you will not have the option to move into IPP. If the flag is set to true (and you fail remote)- you will have the option to retry remote or start IPP. It seems like when we want the same logic here. Is there a situation in which the flags could be different? Or wondering if we want that extra control- should we also be evaluating the in_person_proofing_enabled flag here? Again, sorry if I am thinking about this all wrong but maybe good to think about more.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gina-yamada , that in_person_proofing_enabled flag is already considered in Idv::InPersonConfig.enabled_for_issuer?.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This raises the question should we push in_person_doc_auth_button_enabled down there too?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dawei-nava looks like we maybe don't want to since that is a global configuration value independent of the service provider? See link

decorated_sp_session.sp_issuer,
)

@selfie_required = idv_session.selfie_check_required

analytics.idv_doc_auth_hybrid_handoff_visited(**analytics_arguments)
Expand All @@ -22,6 +27,8 @@ def show
true
)

# reset if we visit or come back
idv_session.skip_doc_auth_from_handoff = nil
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm checking my own understanding: why do we need to reset skip_doc_auth_from_handoff to nil if the user returns to this page? Is it to enable a user to select IPP on the hybrid handoff page (skip_doc_auth_from_handoff = true), navigate forward, change their mind, then navigate backward and select remote proofing (skip_doc_auth_from_handoff = false)?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eileen-nava , yes you are correct, it's kind of non-reentrant ticket, once you exit the venue, you have to get a ticket again.

render :show, locals: extra_view_variables
end

Expand Down Expand Up @@ -55,7 +62,9 @@ def self.step_info
next_steps: [:link_sent, :document_capture],
preconditions: ->(idv_session:, user:) {
idv_session.idv_consent_given &&
self.selected_remote(idv_session: idv_session)
(self.selected_remote(idv_session: idv_session) || # from opt-in screen
# back from ipp doc capture screen
idv_session.skip_doc_auth_from_handoff)
},
undo_step: ->(idv_session:, user:) do
idv_session.flow_path = nil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ function DocumentCapture({ onStepChange = () => {} }: DocumentCaptureProps) {
const { t } = useI18n();
const { flowPath } = useContext(UploadContext);
const { trackSubmitEvent, trackVisitEvent } = useContext(AnalyticsContext);
const { inPersonFullAddressEntryEnabled, inPersonURL, skipDocAuth } = useContext(InPersonContext);
const { inPersonFullAddressEntryEnabled, inPersonURL, skipDocAuth, skipDocAuthFromHandoff } =
useContext(InPersonContext);
const appName = getConfigValue('appName');

useDidUpdateEffect(onStepChange, [stepName]);
Expand Down Expand Up @@ -137,12 +138,14 @@ function DocumentCapture({ onStepChange = () => {} }: DocumentCaptureProps) {

// If the user got here by opting-in to in-person proofing, when skipDocAuth === true,
// then set steps to inPersonSteps
const steps: FormStep[] = skipDocAuth ? inPersonSteps : defaultSteps;
const isInPersonStepEnabled = skipDocAuth || skipDocAuthFromHandoff;
const steps: FormStep[] = isInPersonStepEnabled ? inPersonSteps : defaultSteps;

// If the user got here by opting-in to in-person proofing, when skipDocAuth === true,
// If the user got here by opting-in to in-person proofing, when skipDocAuth === true;
// or opting-in ipp from handoff page, and selfie is required, when skipDocAuthFromHandoff === true
// then set stepIndicatorPath to VerifyFlowPath.IN_PERSON
const stepIndicatorPath =
(stepName && ['location', 'prepare', 'switch_back'].includes(stepName)) || skipDocAuth
(stepName && ['location', 'prepare', 'switch_back'].includes(stepName)) || isInPersonStepEnabled
? VerifyFlowPath.IN_PERSON
: VerifyFlowPath.DEFAULT;

Expand Down Expand Up @@ -181,7 +184,7 @@ function DocumentCapture({ onStepChange = () => {} }: DocumentCaptureProps) {
onStepSubmit={trackSubmitEvent}
autoFocus={!!submissionError}
titleFormat={`%{step} - ${appName}`}
initialStep={skipDocAuth ? steps[0].name : undefined}
initialStep={isInPersonStepEnabled ? steps[0].name : undefined}
/>
</>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,16 @@ function InPersonPrepareStep({ toPreviousStep }) {
inPersonOutageMessageEnabled,
inPersonOutageExpectedUpdateDate,
skipDocAuth,
skipDocAuthFromHandoff,
howToVerifyURL,
previousStepURL,
} = useContext(InPersonContext);

function goBack() {
if (skipDocAuth && howToVerifyURL) {
if (skipDocAuthFromHandoff && previousStepURL) {
// directly from handoff page
forceRedirect(previousStepURL);
} else if (skipDocAuth && howToVerifyURL) {
forceRedirect(howToVerifyURL);
} else {
toPreviousStep();
Expand Down
11 changes: 11 additions & 0 deletions app/javascript/packages/document-capture/context/in-person.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,21 @@ export interface InPersonContextProps {
*/
skipDocAuth?: boolean;

/**
* Flag set when user select IPP from handoff page when IPP is available
* and selfie is required
*/
skipDocAuthFromHandoff?: boolean;

/**
* URL for Opt-in IPP, used when in_person_proofing_opt_in_enabled is enabled
*/
howToVerifyURL?: string;

/**
* URL for going back to previous steps in Doc Auth, like handoff and howToVerify
*/
previousStepURL?: string;
}

const InPersonContext = createContext<InPersonContextProps>({
Expand Down
6 changes: 6 additions & 0 deletions app/javascript/packs/document-capture.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@ interface AppRootData {
optedInToInPersonProofing: string;
securityAndPrivacyHowItWorksUrl: string;
skipDocAuth: string;
skipDocAuthFromHandoff: string;
howToVerifyURL: string;
previousStepUrl: string;
uiExitQuestionSectionEnabled: string;
docAuthSelfieDesktopTestMode: string;
}
Expand Down Expand Up @@ -105,7 +107,9 @@ const {
optedInToInPersonProofing,
usStatesTerritories = '',
skipDocAuth,
skipDocAuthFromHandoff,
howToVerifyUrl,
previousStepUrl,
uiExitQuestionSectionEnabled = '',
docAuthSelfieDesktopTestMode,
} = appRoot.dataset as DOMStringMap & AppRootData;
Expand All @@ -131,7 +135,9 @@ const App = composeComponents(
optedInToInPersonProofing: optedInToInPersonProofing === 'true',
usStatesTerritories: parsedUsStatesTerritories,
skipDocAuth: skipDocAuth === 'true',
skipDocAuthFromHandoff: skipDocAuthFromHandoff === 'true',
howToVerifyURL: howToVerifyUrl,
previousStepURL: previousStepUrl,
},
},
],
Expand Down
1 change: 1 addition & 0 deletions app/services/idv/session.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class Session
selfie_check_performed
selfie_check_required
skip_doc_auth
skip_doc_auth_from_handoff
skip_hybrid_handoff
ssn
threatmetrix_review_status
Expand Down
1 change: 1 addition & 0 deletions app/views/idv/document_capture/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@
acuant_version: acuant_version,
opted_in_to_in_person_proofing: opted_in_to_in_person_proofing,
skip_doc_auth: skip_doc_auth,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@n1zyy I vote for opening a ticket to rename skip_doc_auth to skip_doc_auth_from_opt_in, what do you think?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@n1zyy and @JackRyan1989 ... I also strongly vote to renameskip_doc_auth ... i think renaming skip_doc_auth to be more inline with what is trying to be accomplished would be alot more helpful to folks across appDev teams to understand what is happening.

When reviewing this PR, I was confused and really had to dig around in the code to understand the goal of skip_doc_auth. Could the rename more so reflect the goal with something like ie: ipp_requested or opted_in_to_ipp?

is there a ticket open that I can follow? Thanks 🙏🏿

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

skip_doc_auth_from_handoff: skip_doc_auth_from_handoff,
doc_auth_selfie_capture: doc_auth_selfie_capture,
) %>
10 changes: 10 additions & 0 deletions app/views/idv/hybrid_handoff/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,16 @@
<%= f.submit t('forms.buttons.send_link') %>
<% end %>
</div>
<% if @direct_ipp_with_selfie_enabled %>
<div class="margin-top-4 padding-top-2 border-top border-primary-light">
<p class="margin-top-1">
<%= t('doc_auth.info.hybrid_handoff_ipp_html') %>
</p>
<p class="margin-top-1 margin-bottom-0">
<%= link_to t('in_person_proofing.headings.prepare'), idv_document_capture_path(step: :hybrid_handoff) %>
</p>
</div>
<% end %>
</div>
<% end %>

Expand Down
1 change: 1 addition & 0 deletions app/views/idv/hybrid_mobile/document_capture/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@
acuant_version: acuant_version,
opted_in_to_in_person_proofing: false,
skip_doc_auth: false,
skip_doc_auth_from_handoff: nil,
doc_auth_selfie_capture: doc_auth_selfie_capture,
) %>
2 changes: 2 additions & 0 deletions app/views/idv/shared/_document_capture.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@
doc_auth_selfie_capture: FeatureManagement.idv_allow_selfie_check? && doc_auth_selfie_capture,
doc_auth_selfie_desktop_test_mode: IdentityConfig.store.doc_auth_selfie_desktop_test_mode,
skip_doc_auth: skip_doc_auth,
skip_doc_auth_from_handoff: skip_doc_auth_from_handoff,
how_to_verify_url: idv_how_to_verify_url,
previous_step_url: @previous_step_url,
ui_exit_question_section_enabled: IdentityConfig.store.doc_auth_exit_question_section_enabled,
} %>
<%= simple_form_for(
Expand Down
2 changes: 2 additions & 0 deletions config/locales/doc_auth/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,8 @@ en:
at a participating Post Office
how_to_verify_troubleshooting_options_header: Want to learn more about how to verify your identity?
hybrid_handoff: We’ll collect information about you by reading your state‑issued ID.
hybrid_handoff_ipp_html: <strong>Don’t have a mobile phone?</strong> You can
verify your identity at a United States Post Office instead.
image_loaded: Image loaded
image_loading: Image loading
image_updated: Image updated
Expand Down
3 changes: 3 additions & 0 deletions config/locales/doc_auth/es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,9 @@ es:
how_to_verify_troubleshooting_options_header: ¿Quiere saber más sobre cómo verificar su identidad?
hybrid_handoff: Recopilaremos información sobre usted leyendo su documento de
identidad expedido por el estado.
hybrid_handoff_ipp_html: <strong>¿No tiene celular?</strong> Como alternativa,
puede verificar su identidad en una oficina de correos de Estados
Unidos.
image_loaded: Imagen cargada
image_loading: Cargando la imagen
image_updated: Imagen actualizada
Expand Down
3 changes: 3 additions & 0 deletions config/locales/doc_auth/fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,9 @@ fr:
how_to_verify_troubleshooting_options_header: Vous voulez en savoir plus sur la façon de vérifier votre identité?
hybrid_handoff: Nous recueillons des informations sur vous en lisant votre carte
d’identité délivrée par l’État.
hybrid_handoff_ipp_html: <strong>Vous n’avez pas de téléphone
cellulaire?</strong> Vous pouvez vérifier votre identité dans un bureau
de poste américain.
image_loaded: Image chargée
image_loading: Chargement de l’image
image_updated: Image mise à jour
Expand Down
24 changes: 24 additions & 0 deletions spec/controllers/idv/document_capture_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,8 @@
before do
allow(IdentityConfig.store).to receive(:in_person_proofing_enabled) { true }
allow(IdentityConfig.store).to receive(:in_person_proofing_opt_in_enabled) { true }
allow(Idv::InPersonConfig).to receive(:enabled_for_issuer?).and_return(true)
allow(IdentityConfig.store).to receive(:in_person_doc_auth_button_enabled).and_return(true)
end

it 'renders show when flow path is standard' do
Expand All @@ -249,6 +251,28 @@

expect(response).to redirect_to(idv_hybrid_handoff_url)
end

it 'renders show when accessed from handoff' do
allow(Idv::InPersonConfig).to receive(:enabled_for_issuer?).and_return(true)
allow(IdentityConfig.store).to receive(:in_person_doc_auth_button_enabled).and_return(true)
get :show, params: { step: 'hybrid_handoff' }
expect(response).to render_template :show
expect(subject.idv_session.skip_doc_auth_from_handoff).to eq(true)
end
end

context 'ipp disabled for sp' do
before do
allow(IdentityConfig.store).to receive(:doc_auth_selfie_desktop_test_mode).and_return(false)
allow(Idv::InPersonConfig).to receive(:enabled_for_issuer?).with(anything).and_return(false)
allow(subject.decorated_sp_session).to receive(:selfie_required?).and_return(true)
end
it 'redirect back when accessed from handoff' do
subject.idv_session.skip_hybrid_handoff = nil
get :show, params: { step: 'hybrid_handoff' }
expect(response).to redirect_to(idv_hybrid_handoff_url)
expect(subject.idv_session.skip_doc_auth_from_handoff).to_not eq(true)
end
end
end

Expand Down
1 change: 1 addition & 0 deletions spec/controllers/idv/hybrid_handoff_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@
allow(IdentityConfig.store).to receive(:doc_auth_selfie_desktop_test_mode).
and_return(false)
subject.idv_session.skip_doc_auth = true
subject.idv_session.skip_hybrid_handoff = true
end

it 'redirects to the how to verify page' do
Expand Down
Loading