require 'test_helper'

class CertPoolTest < ActiveSupport::TestCase

  setup do
    2.times { Cert.create! }
  end

  teardown do
    Cert.all.each {|c| c.destroy}
  end

  test "picks random sample" do
    Cert.create! # with 3 certs chances are pretty low we pick the same one 40 times.
    picked = []
    first = Cert.sample.id
    current = Cert.sample.id
    40.times do
      break if current != first
      current = Cert.sample.id
    end
    assert_not_equal current, first
  end

  test "picks cert from the pool" do
    assert_difference "Cert.count", -1 do
      cert = Cert.pick_from_pool
    end
  end

  test "err's out if all certs have been destroyed" do
    sample = Cert.first.tap{|c| c.destroy}
    Cert.all.each {|c| c.destroy}
    assert_raises RECORD_NOT_FOUND do
      Cert.expects(:sample).returns(sample)
      cert = Cert.pick_from_pool
    end
  end

  test "picks other cert if first pick has been destroyed" do
    first = Cert.first.tap{|c| c.destroy}
    second = Cert.first
    Cert.expects(:sample).at_least_once.
      returns(first).
      then.returns(second)
    cert = Cert.pick_from_pool
    assert_equal second, cert
    assert_nil Cert.first
  end

end