Sha256: 0a68042dc5f5e861d81bdddbf093da1e03181c91eec7e16ac43d3179f21c0e44

Contents?: true

Size: 2 KB

Versions: 4

Compression:

Stored size: 2 KB

Contents

require "spec_helper"
require "timecop"

RSpec.describe Devise::PinfirmableController do
  describe "POST create" do
    before do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = User.create(email: "test@example.com", password: "password")
      sign_in @user
      Timecop.freeze(Time.local(1990))
    end

    after do
      Timecop.return
    end

    context "correct pin" do
      it "returns success" do
        post :create, params: { digits: @user.pinfirmable_pin.split("") }
        expect(response).to redirect_to("/")
      end
    end

    context "incorrect pin" do
      let(:pin) { %w(1 2 3 4 5 6) }

      it "returns success" do
        post :create, params: { digits: pin }
        expect(response).to redirect_to("/users/confirmemail")
      end

      it "increments the tries" do
        post :create, params: { digits: pin }
        expect(@user.reload.pinfirmable_tries).to eq(1)
      end

      it "after 3 tries the user is stopped from trying anymore pins for 1 minute" do
        Timecop.freeze(Time.now)
        3.times { post :create, params: { digits: pin } }
        expect(@user.reload.pinfirmable_lockout).to eq(1.minute.from_now)
      end

      it "after 6 tries the user is stopped from trying anymore pins for 1 minute" do
        3.times { post :create, params: { digits: pin } }
        Timecop.freeze(2.minutes.from_now)
        3.times { post :create, params: { digits: pin } }
        expect(@user.reload.pinfirmable_lockout).to eq(2.minutes.from_now)
      end

      it "while locked out no tries are allowed" do
        Timecop.freeze(Time.now)
        4.times { post :create, params: { digits: pin } }
        expect(response.status).to eq(429)
      end

      it "after the lockout you can try again" do
        Timecop.freeze(Time.now)
        4.times { post :create, params: { digits: pin } }
        Timecop.freeze(2.minutes.from_now)
        post :create, params: { digits: pin }
        expect(@user.reload.pinfirmable_tries).to eq(4)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
pinfirmable-0.1.5 spec/controllers/pinfirmable_controller/create_spec.rb
pinfirmable-0.1.4 spec/controllers/pinfirmable_controller/create_spec.rb
pinfirmable-0.1.3 spec/controllers/pinfirmable_controller/create_spec.rb
pinfirmable-0.1.2 spec/controllers/pinfirmable_controller/create_spec.rb