require "rails_helper"

describe Poll::Booth do
  let(:booth) { build(:poll_booth) }

  it "is valid" do
    expect(booth).to be_valid
  end

  it "is not valid without a name" do
    booth.name = nil
    expect(booth).not_to be_valid
  end

  describe ".search" do
    it "finds booths searching by name or location" do
      booth1 = create(:poll_booth, name: "Booth number 1", location: "City center")
      booth2 = create(:poll_booth, name: "Central", location: "Town hall")

      expect(Poll::Booth.search("number")).to eq([booth1])
      expect(Poll::Booth.search("hall")).to eq([booth2])
      expect(Poll::Booth.search("cen")).to match_array [booth1, booth2]
    end

    it "returns all booths if search term is blank" do
      2.times { create(:poll_booth) }

      expect(Poll::Booth.search("").count).to eq 2
    end

    it "returns all booths if search term is nil" do
      2.times { create(:poll_booth) }

      expect(Poll::Booth.search(nil).count).to eq 2
    end
  end

  describe ".quick_search" do
    it "returns no booths if search term is blank" do
      create(:poll_booth)

      expect(Poll::Booth.quick_search("")).to be_empty
    end
  end

  describe ".available" do
    it "returns booths associated to current polls" do
      booth_for_current_poll = create(:poll_booth, polls: [create(:poll)])
      booth_for_expired_poll = create(:poll_booth, polls: [create(:poll, :expired)])

      expect(Poll::Booth.available).to eq [booth_for_current_poll]
      expect(Poll::Booth.available).not_to include(booth_for_expired_poll)
    end

    it "returns polls with multiple translations only once" do
      create(:poll_booth, polls: [create(:poll, name: "English", name_es: "Spanish")])

      expect(Poll::Booth.available.count).to eq 1
    end
  end
end
