require 'rails_helper'

describe User do
  let(:bob) { users(:bob) }

  describe "validations" do
    describe "invitation_code" do
      context "when configured to use invitation codes" do
        before do
          allow(User).to receive(:using_invitation_code?) {true}
        end
        
        it "only accepts valid invitation codes" do
          User::INVITATION_CODES.each do |v|
            should allow_value(v).for(:invitation_code)
          end
        end
  
        it "can reject invalid invitation codes" do
          %w['foo', 'bar'].each do |v|
            should_not allow_value(v).for(:invitation_code)
          end
        end

        it "requires no authentication code when requires_no_invitation_code! is called" do
          u = User.new(username: 'test', email: 'test@test.com', password: '12345678', password_confirmation: '12345678')
          u.requires_no_invitation_code!
          expect(u).to be_valid
        end
      end
      
      context "when configured not to use invitation codes" do
        before do
          allow(User).to receive(:using_invitation_code?) {false}
        end
        
        it "skips this validation" do
          %w['foo', 'bar', nil, ''].each do |v|
            should allow_value(v).for(:invitation_code)
          end
        end
      end
    end
  end

  context '#deactivate!' do
    it "deactivates the user and all her agents" do
      agent = agents(:jane_website_agent)
      users(:jane).deactivate!
      agent.reload
      expect(agent.deactivated).to be_truthy
      expect(users(:jane).deactivated_at).not_to be_nil
    end
  end

  context '#activate!' do
    before do
      users(:bob).deactivate!
    end

    it 'activates the user and all his agents' do
      agent = agents(:bob_website_agent)
      users(:bob).activate!
      agent.reload
      expect(agent.deactivated).to be_falsy
      expect(users(:bob).deactivated_at).to be_nil
    end
  end

  context '#undefined_agent_types' do
    it 'returns an empty array when no agents are undefined' do
      expect(bob.undefined_agent_types).to be_empty
    end

    it 'returns the undefined agent types' do
      agent = agents(:bob_website_agent)
      agent.update_attribute(:type, 'Agents::UndefinedAgent')
      expect(bob.undefined_agent_types).to match_array(['Agents::UndefinedAgent'])
    end
  end

  context '#undefined_agents' do
    it 'returns an empty array when no agents are undefined' do
      expect(bob.undefined_agents).to be_empty
    end

    it 'returns the undefined agent types' do
      agent = agents(:bob_website_agent)
      agent.update_attribute(:type, 'Agents::UndefinedAgent')
      expect(bob.undefined_agents).not_to be_empty
      expect(bob.undefined_agents.first).to be_a(Agent)
    end
  end
end
