Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 0 additions & 2 deletions app/controllers/idv/review_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,6 @@ def idv_address_complete?

def init_profile
idv_session.create_profile_from_applicant_with_password(password)
idv_session.cache_encrypted_pii(password)
idv_session.complete_session

if idv_session.profile.active?
event = create_user_event_with_disavowal(:account_verified)
Expand Down
52 changes: 24 additions & 28 deletions app/forms/api/profile_creation_form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,7 @@ def initialize(password:, jwt:, user_session:, service_provider: nil)

def submit
@form_valid = valid?

if form_valid?
create_profile
cache_encrypted_pii
complete_session
end
create_profile if form_valid?

response = FormResponse.new(
success: form_valid?,
Expand All @@ -39,34 +34,40 @@ def submit

def create_profile
profile_maker = build_profile_maker
profile = profile_maker.save_profile
profile = profile_maker.save_profile(
active: deactivation_reason.nil?,
deactivation_reason: deactivation_reason,
)
@profile = profile
session[:pii] = profile_maker.pii_attributes
session[:profile_id] = profile.id
session[:personal_key] = profile.personal_key
end

def cache_encrypted_pii
cacher = Pii::Cacher.new(user, session)
cacher.save(password, profile)
end

def complete_session
cache_encrypted_pii
associate_in_person_enrollment_with_profile

if user_bundle.gpo_address_verification?
profile.deactivate(:gpo_verification_pending)
if profile.active
move_pii_to_user_session
elsif user_bundle.gpo_address_verification?
create_gpo_entry
elsif phone_confirmed?
if pending_in_person_enrollment?
UspsInPersonProofing::EnrollmentHelper.schedule_in_person_enrollment(user, session[:pii])
profile.deactivate(:in_person_verification_pending)
else
complete_profile
end
elsif pending_in_person_enrollment?
UspsInPersonProofing::EnrollmentHelper.schedule_in_person_enrollment(user, session[:pii])
end
end

def deactivation_reason
if !phone_confirmed? || user_bundle.gpo_address_verification?
:gpo_verification_pending
elsif pending_in_person_enrollment?
:in_person_verification_pending
end
end

def cache_encrypted_pii
cacher = Pii::Cacher.new(user, session)
cacher.save(password, profile)
end

def associate_in_person_enrollment_with_profile
return unless pending_in_person_enrollment? && user.establishing_in_person_enrollment
user.establishing_in_person_enrollment.update(profile: profile)
Expand All @@ -81,11 +82,6 @@ def phone_confirmed?
user_bundle.vendor_phone_confirmation? && user_bundle.user_phone_confirmation?
end

def complete_profile
profile.activate
move_pii_to_user_session
end

def move_pii_to_user_session
return if session[:decrypted_pii].blank?
user_session[:decrypted_pii] = session.delete(:decrypted_pii)
Expand Down
5 changes: 3 additions & 2 deletions app/services/idv/profile_maker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ def initialize(applicant:, user:, user_password:)
self.user_password = user_password
end

def save_profile
profile = Profile.new(user: user, active: false)
def save_profile(active:, deactivation_reason: nil)
profile = Profile.new(user: user, active: false, deactivation_reason: deactivation_reason)
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.

Note: This must be active: false and not active: active, since the activate call below would try to find an existing profile with active: true and incorrectly catch the profile which had just been created here.

profile.encrypt_pii(pii_attributes, user_password)
profile.proofing_components = current_proofing_components
profile.save!
profile.activate if active
profile
end

Expand Down
51 changes: 26 additions & 25 deletions app/services/idv/session.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,35 @@ def proofing_started?

def create_profile_from_applicant_with_password(user_password)
profile_maker = build_profile_maker(user_password)
profile = profile_maker.save_profile
profile = profile_maker.save_profile(
active: deactivation_reason.nil?,
deactivation_reason: deactivation_reason,
)
self.pii = profile_maker.pii_attributes
self.profile_id = profile.id
self.personal_key = profile.personal_key

cache_encrypted_pii(user_password)
associate_in_person_enrollment_with_profile

if profile.active?
move_pii_to_user_session
elsif address_verification_mechanism == 'gpo'
create_gpo_entry
elsif pending_in_person_enrollment?
UspsInPersonProofing::EnrollmentHelper.schedule_in_person_enrollment(
current_user,
applicant,
)
end
end

def deactivation_reason
if !phone_confirmed? || address_verification_mechanism == 'gpo'
:gpo_verification_pending
elsif pending_in_person_enrollment?
:in_person_verification_pending
end
end

def cache_encrypted_pii(password)
Expand Down Expand Up @@ -81,35 +106,11 @@ def phone_confirmed?
vendor_phone_confirmation == true && user_phone_confirmation == true
end

def complete_session
associate_in_person_enrollment_with_profile

if address_verification_mechanism == 'gpo'
profile.deactivate(:gpo_verification_pending)
create_gpo_entry
elsif phone_confirmed?
if pending_in_person_enrollment?
UspsInPersonProofing::EnrollmentHelper.schedule_in_person_enrollment(
current_user,
applicant,
)
profile.deactivate(:in_person_verification_pending)
else
complete_profile
end
end
end

def associate_in_person_enrollment_with_profile
return unless pending_in_person_enrollment? && current_user.establishing_in_person_enrollment
current_user.establishing_in_person_enrollment.update(profile: profile)
end

def complete_profile
profile.activate
move_pii_to_user_session
end

def create_gpo_entry
move_pii_to_user_session
self.pii = Pii::Cacher.new(current_user, user_session).fetch if pii.is_a?(String)
Expand Down
18 changes: 4 additions & 14 deletions spec/controllers/idv/personal_key_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def stub_idv_session
user: user,
user_password: password,
)
profile = profile_maker.save_profile
profile = profile_maker.save_profile(active: false)
idv_session.pii = profile_maker.pii_attributes
idv_session.profile_id = profile.id
idv_session.personal_key = profile.personal_key
Expand All @@ -27,17 +27,7 @@ def stub_idv_session

let(:password) { 'sekrit phrase' }
let(:user) { create(:user, :signed_up, password: password) }
let(:applicant) do
{
first_name: 'Some',
last_name: 'One',
address1: '123 Any St',
address2: 'Ste 456',
city: 'Anywhere',
state: 'KS',
zipcode: '66666',
}
end
let(:applicant) { Idp::Constants::MOCK_IDV_APPLICANT_WITH_PHONE }
let(:profile) { subject.idv_session.profile }

describe 'before_actions' do
Expand Down Expand Up @@ -150,7 +140,7 @@ def index
subject.idv_session.address_verification_mechanism = 'phone'
subject.idv_session.vendor_phone_confirmation = true
subject.idv_session.user_phone_confirmation = true
subject.idv_session.complete_session
subject.idv_session.create_profile_from_applicant_with_password(password)
end

it 'redirects to sign up completed for an sp' do
Expand All @@ -177,7 +167,7 @@ def index
context 'user selected gpo verification' do
before do
subject.idv_session.address_verification_mechanism = 'gpo'
subject.idv_session.complete_session
subject.idv_session.create_profile_from_applicant_with_password(password)
end

it 'redirects to come back later path' do
Expand Down
23 changes: 22 additions & 1 deletion spec/services/idv/profile_maker_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

it 'creates an inactive Profile with encrypted PII' do
proofing_component = ProofingComponent.create(user_id: user.id, document_check: 'acuant')
profile = subject.save_profile
profile = subject.save_profile(active: false)
pii = subject.pii_attributes

expect(profile).to be_a Profile
Expand All @@ -31,5 +31,26 @@
expect(pii.first_name).to eq 'Some'
expect(profile.reproof_at).to be_nil
end

context 'with deactivation reason' do
it 'creates an inactive profile with deactivation reason' do
profile = subject.save_profile(
active: false,
deactivation_reason: :gpo_verification_pending,
)

expect(profile.active).to eq false
expect(profile.deactivation_reason).to eq 'gpo_verification_pending'
end
end

context 'as active' do
it 'creates an active profile' do
profile = subject.save_profile(active: true, deactivation_reason: nil)

expect(profile.active).to eq true
expect(profile.deactivation_reason).to be_nil
end
end
end
end
45 changes: 28 additions & 17 deletions spec/services/idv/session_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,26 +36,35 @@
end
end

describe '#complete_session' do
describe '#create_profile_from_applicant_with_password' do
before do
subject.applicant = Idp::Constants::MOCK_IDV_APPLICANT_WITH_SSN
end

context 'with phone verifed by vendor' do
before do
subject.address_verification_mechanism = 'phone'
subject.vendor_phone_confirmation = true
allow(subject).to receive(:complete_profile)
subject.applicant = Idp::Constants::MOCK_IDV_APPLICANT_WITH_PHONE
allow(subject).to receive(:move_pii_to_user_session)
end

it 'completes the profile if the user has completed OTP phone confirmation' do
subject.user_phone_confirmation = true
subject.complete_session
subject.create_profile_from_applicant_with_password(user.password)

expect(subject).to have_received(:complete_profile)
expect(subject).to have_received(:move_pii_to_user_session)
expect(subject.profile.active?).to eq(true)
expect(subject.profile.deactivation_reason).to be_nil
end

it 'does not complete the profile if the user has not completed OTP phone confirmation' do
subject.user_phone_confirmation = nil
subject.complete_session
subject.create_profile_from_applicant_with_password(user.password)

expect(subject).not_to have_received(:complete_profile)
expect(subject).not_to have_received(:move_pii_to_user_session)
expect(subject.profile.active?).to eq(false)
expect(subject.profile.deactivation_reason).to eq('gpo_verification_pending')
end

context 'with establishing in person enrollment' do
Expand All @@ -70,13 +79,13 @@
subject.applicant = Idp::Constants::MOCK_IDV_APPLICANT_WITH_PHONE.merge(
same_address_as_id: true,
).with_indifferent_access
subject.create_profile_from_applicant_with_password(user.password)
end

it 'sets profile to pending in person verification' do
subject.complete_session
subject.create_profile_from_applicant_with_password(user.password)

expect(subject).not_to have_received(:complete_profile)
expect(subject).not_to have_received(:move_pii_to_user_session)
expect(subject.profile.active?).to eq(false)
expect(subject.profile.deactivation_reason).to eq('in_person_verification_pending')
end

Expand All @@ -85,7 +94,7 @@
to receive(:schedule_in_person_enrollment).
with(user, subject.applicant.transform_keys(&:to_s))

subject.complete_session
subject.create_profile_from_applicant_with_password(user.password)

expect(enrollment.reload.profile).to eq(user.profiles.last)
end
Expand All @@ -96,15 +105,14 @@
before do
subject.address_verification_mechanism = 'gpo'
subject.vendor_phone_confirmation = false
allow(subject).to receive(:complete_profile)
allow(subject).to receive(:move_pii_to_user_session)
end

it 'sets profile to pending gpo verification' do
subject.applicant = {}
subject.create_profile_from_applicant_with_password(user.password)
subject.complete_session

expect(subject).not_to have_received(:complete_profile)
expect(subject).to have_received(:move_pii_to_user_session)
expect(subject.profile.active?).to eq(false)
expect(subject.profile.deactivation_reason).to eq('gpo_verification_pending')
end
end
Expand All @@ -113,12 +121,15 @@
before do
subject.address_verification_mechanism = 'phone'
subject.vendor_phone_confirmation = false
allow(subject).to receive(:move_pii_to_user_session)
end

it 'does not complete the user profile' do
allow(subject).to receive(:complete_profile)
subject.complete_session
expect(subject).not_to have_received(:complete_profile)
subject.create_profile_from_applicant_with_password(user.password)

expect(subject).not_to have_received(:move_pii_to_user_session)
expect(subject.profile.active?).to eq(false)
expect(subject.profile.deactivation_reason).to eq('gpo_verification_pending')
end
end
end
Expand Down