diff --git a/spec/concerns/verification_spec.rb b/spec/concerns/verification_spec.rb new file mode 100644 index 000000000..da66da915 --- /dev/null +++ b/spec/concerns/verification_spec.rb @@ -0,0 +1,163 @@ +require 'rails_helper' + +shared_examples_for "verifiable" do + let(:model) { described_class } + + describe "#scopes" do + describe "#level_three_verified" do + it "returns level three verified users" do + user1 = create(:user, verified_at: Time.now) + user2 = create(:user, verified_at: nil) + + expect(model.level_three_verified).to include(user1) + expect(model.level_three_verified).to_not include(user2) + end + end + + describe "#level_two_verified" do + it "returns level two verified users" do + user1 = create(:user, confirmed_phone: "123456789", residence_verified_at: Time.now) + user2 = create(:user, confirmed_phone: "123456789", residence_verified_at: nil) + user3 = create(:user, confirmed_phone: nil, residence_verified_at: Time.now) + + expect(model.level_two_verified).to include(user1) + expect(model.level_two_verified).to_not include(user2) + expect(model.level_two_verified).to_not include(user3) + end + end + + describe "#level_two_or_three_verified" do + it "returns level two or three verified users" do + user1 = create(:user, confirmed_phone: "123456789", residence_verified_at: Time.now) + user2 = create(:user, verified_at: Time.now) + user3 = create(:user, confirmed_phone: "123456789", residence_verified_at: nil) + user4 = create(:user, confirmed_phone: nil, residence_verified_at: Time.now) + + + expect(model.level_two_or_three_verified).to include(user1) + expect(model.level_two_or_three_verified).to include(user2) + expect(model.level_two_or_three_verified).to_not include(user3) + expect(model.level_two_or_three_verified).to_not include(user4) + end + end + + describe "#unverified" do + it "returns unverified users" do + user1 = create(:user, verified_at: nil, confirmed_phone: nil) + user2 = create(:user, verified_at: nil, residence_verified_at: nil, confirmed_phone: "123456789") + user3 = create(:user, verified_at: nil, residence_verified_at: Time.now, confirmed_phone: nil) + user4 = create(:user, verified_at: Time.now, residence_verified_at: Time.now, confirmed_phone: "123456789") + + expect(model.unverified).to include(user1) + expect(model.unverified).to include(user2) + expect(model.unverified).to include(user3) + expect(model.unverified).to_not include(user4) + end + end + + describe "#with_failed_attempts" do + it "returns users with failed verification attempts" do + user1 = create(:user, verified_at: nil, confirmed_phone: nil) + user2 = create(:user, verified_at: nil, confirmed_phone: nil) + create(:failed_census_call, user: user1) + + expect(model.with_failed_attempts).to include(user1) + expect(model.with_failed_attempts).to_not include(user2) + end + end + + describe "#incomplete_verification" do + it "returns users with incomplete verifications" do + user1 = create(:user, verified_at: nil, confirmed_phone: nil) + user2 = create(:user, verified_at: nil, confirmed_phone: nil) + user3 = create(:user, verified_at: Time.now, residence_verified_at: Time.now, confirmed_phone: "123456789") + create(:failed_census_call, user: user1) + + expect(model.with_failed_attempts).to include(user1) + expect(model.with_failed_attempts).to_not include(user2) + expect(model.with_failed_attempts).to_not include(user3) + end + end + end + + describe "#methods" do + it "residence_verified? is true only if residence_verified_at" do + user = create(:user, residence_verified_at: Time.now) + expect(user.residence_verified?).to eq(true) + + user = create(:user, residence_verified_at: nil) + expect(user.residence_verified?).to eq(false) + end + + it "sms_verified? is true only if confirmed_phone" do + user = create(:user, confirmed_phone: "123456789") + expect(user.sms_verified?).to eq(true) + + user = create(:user, confirmed_phone: nil) + expect(user.sms_verified?).to eq(false) + end + + it "level_two_verified? is true only if residence_verified_at and confirmed_phone" do + user = create(:user, confirmed_phone: "123456789", residence_verified_at: Time.now) + expect(user.level_two_verified?).to eq(true) + + user = create(:user, confirmed_phone: nil, residence_verified_at: Time.now) + expect(user.level_two_verified?).to eq(false) + + user = create(:user, confirmed_phone: "123456789", residence_verified_at: nil) + expect(user.level_two_verified?).to eq(false) + end + + it "level_three_verified? is true only if verified_at" do + user = create(:user, verified_at: Time.now) + expect(user.level_three_verified?).to eq(true) + + user = create(:user, verified_at: nil) + expect(user.level_three_verified?).to eq(false) + end + + it "unverified? is true only if not level_three_verified and not level_two_verified" do + user = create(:user, verified_at: nil, confirmed_phone: nil) + expect(user.unverified?).to eq(true) + + user = create(:user, verified_at: Time.now, confirmed_phone: "123456789", residence_verified_at: Time.now) + expect(user.unverified?).to eq(false) + end + + it "verification_email_sent? is true only if user has email_verification_token" do + user = create(:user, email_verification_token: "xxxxxxx") + expect(user.verification_email_sent?).to eq(true) + + user = create(:user, email_verification_token: nil) + expect(user.verification_email_sent?).to eq(false) + end + + it "verification_sms_sent? is true only if user has unconfirmed_phone and sms_confirmation_code" do + user = create(:user, unconfirmed_phone: "666666666", sms_confirmation_code: "666") + expect(user.verification_sms_sent?).to eq(true) + + user = create(:user, unconfirmed_phone: nil, sms_confirmation_code: "666") + expect(user.verification_sms_sent?).to eq(false) + + user = create(:user, unconfirmed_phone: "666666666", sms_confirmation_code: nil) + expect(user.verification_sms_sent?).to eq(false) + + user = create(:user, unconfirmed_phone: nil, sms_confirmation_code: nil) + expect(user.verification_sms_sent?).to eq(false) + end + + it "verification_letter_sent? is true only if user has letter_requested_at and letter_verification_code" do + user = create(:user, letter_requested_at: Time.now, letter_verification_code: "666") + expect(user.verification_letter_sent?).to eq(true) + + user = create(:user, letter_requested_at: nil, letter_verification_code: "666") + expect(user.verification_letter_sent?).to eq(false) + + user = create(:user, letter_requested_at: Time.now, letter_verification_code: nil) + expect(user.verification_letter_sent?).to eq(false) + + user = create(:user, letter_requested_at: nil, letter_verification_code: nil) + expect(user.verification_letter_sent?).to eq(false) + end + end +end \ No newline at end of file diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index f7ef59121..29b239da9 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -262,85 +262,8 @@ describe User do end end - describe "verification levels" do - it "residence_verified? is true only if residence_verified_at" do - user = create(:user, residence_verified_at: Time.now) - expect(user.residence_verified?).to eq(true) - - user = create(:user, residence_verified_at: nil) - expect(user.residence_verified?).to eq(false) - end - - it "sms_verified? is true only if confirmed_phone" do - user = create(:user, confirmed_phone: "123456789") - expect(user.sms_verified?).to eq(true) - - user = create(:user, confirmed_phone: nil) - expect(user.sms_verified?).to eq(false) - end - - it "level_two_verified? is true only if residence_verified_at and confirmed_phone" do - user = create(:user, confirmed_phone: "123456789", residence_verified_at: Time.now) - expect(user.level_two_verified?).to eq(true) - - user = create(:user, confirmed_phone: nil, residence_verified_at: Time.now) - expect(user.level_two_verified?).to eq(false) - - user = create(:user, confirmed_phone: "123456789", residence_verified_at: nil) - expect(user.level_two_verified?).to eq(false) - end - - it "level_three_verified? is true only if verified_at" do - user = create(:user, verified_at: Time.now) - expect(user.level_three_verified?).to eq(true) - - user = create(:user, verified_at: nil) - expect(user.level_three_verified?).to eq(false) - end - - it "unverified? is true only if not level_three_verified and not level_two_verified" do - user = create(:user, verified_at: nil, confirmed_phone: nil) - expect(user.unverified?).to eq(true) - - user = create(:user, verified_at: Time.now, confirmed_phone: "123456789", residence_verified_at: Time.now) - expect(user.unverified?).to eq(false) - end - - it "verification_email_sent? is true only if user has email_verification_token" do - user = create(:user, email_verification_token: "xxxxxxx") - expect(user.verification_email_sent?).to eq(true) - - user = create(:user, email_verification_token: nil) - expect(user.verification_email_sent?).to eq(false) - end - - it "verification_sms_sent? is true only if user has unconfirmed_phone and sms_confirmation_code" do - user = create(:user, unconfirmed_phone: "666666666", sms_confirmation_code: "666") - expect(user.verification_sms_sent?).to eq(true) - - user = create(:user, unconfirmed_phone: nil, sms_confirmation_code: "666") - expect(user.verification_sms_sent?).to eq(false) - - user = create(:user, unconfirmed_phone: "666666666", sms_confirmation_code: nil) - expect(user.verification_sms_sent?).to eq(false) - - user = create(:user, unconfirmed_phone: nil, sms_confirmation_code: nil) - expect(user.verification_sms_sent?).to eq(false) - end - - it "verification_letter_sent? is true only if user has letter_requested_at and letter_verification_code" do - user = create(:user, letter_requested_at: Time.now, letter_verification_code: "666") - expect(user.verification_letter_sent?).to eq(true) - - user = create(:user, letter_requested_at: nil, letter_verification_code: "666") - expect(user.verification_letter_sent?).to eq(false) - - user = create(:user, letter_requested_at: Time.now, letter_verification_code: nil) - expect(user.verification_letter_sent?).to eq(false) - - user = create(:user, letter_requested_at: nil, letter_verification_code: nil) - expect(user.verification_letter_sent?).to eq(false) - end + describe "verification" do + it_behaves_like "verifiable" end describe "cache" do