require 'spec_helper'

describe 'Instace of TestClass' do
  before do
    @test = TestClass.new
    throttle = TestClass.instance_variable_get(:@limits)
    key = throttle.keys[0]
    @count_to_fail = throttle[key][:limit]
    @time_til_okay = throttle[key][:threshold]
  end

  it 'includes RedisThrottler' do
    expect(@test).to be_a_kind_of(RedisThrottler)
  end

  it '.limits' do
    expect(@test.limits).to be_a(Hash)
  end

  it '.limits?' do
    expect(@test.limits?).to eq(true)
  end

  it '.#{key}_throttler' do
    expect(@test.logins_throttler.class).to eq(RedisThrottler::Base)
  end

  it '.#{key}_increment' do
    @test.logins_increment
    @test.logins_increment
    expect(@test.logins_count).to eq(2)
  end

  it '.#{key}_exceeded?' do
    @count_to_fail.times do
      @test.logins_increment
    end
    expect(@test.logins_exceeded?).to eq(true)
  end

  it 'counts right' do
    expect(@test.logins_count).to eq(TestClass.logins_count(@test.id))

    4.times { @test.logins_increment }

    Timecop.travel(@time_til_okay) do
      (@count_to_fail - 1).times do
        @test.logins_increment
      end

      expect(@test.logins_count(1)).to eq(@count_to_fail - 1)
      expect(@test.logins_exceeded?).to eq(false)
    end
  end


  it 'recovers after limit passed' do
    @count_to_fail.times do
      @test.logins_increment
    end
    expect(@test.logins_exceeded?).to eq(true)
    Timecop.travel(@time_til_okay) do
      expect(@test.logins_exceeded?).to eq(false)
    end
  end
end