# frozen_string_literal: true

require 'rails_helper'

describe ApplicationHelper do
  it "parses dates" do
    parse_date(nil).should be_nil
    parse_date('').should be_nil
    parse_date('2012-05-12').should eq Date.new(2012, 5, 12)
    parse_date('may 12th 2012').should eq Date.new(2012, 5, 12)
  end

  describe '#avatar_uri' do
    context 'with a normal user' do
      before do
        @member = FactoryBot.build(:member, email: 'example@example.com', preferred_avatar_uri: nil)
      end

      it 'renders a gravatar uri' do
        expect(avatar_uri(@member)).to eq 'https://secure.gravatar.com/avatar/23463b99b62a72f26ed677cc556c44e8?size=150&default=identicon'
      end

      it 'renders a gravatar uri for a given size' do
        expect(avatar_uri(@member, 456)).to eq 'https://secure.gravatar.com/avatar/23463b99b62a72f26ed677cc556c44e8?size=456&default=identicon'
      end
    end

    context 'with a user who specified a preferred avatar uri' do
      before do
        @member = FactoryBot.build(:member, email: 'example@example.com', preferred_avatar_uri: 'http://media.catmoji.com/post/ujg/cat-in-hat.jpg')
      end

      it 'renders a the specified uri' do
        expect(avatar_uri(@member)).to eq 'http://media.catmoji.com/post/ujg/cat-in-hat.jpg'
      end
    end
  end

  describe '#localize_plural' do
    let(:post) { create(:post) }

    context 'with a populated collection' do
      context 'with one element' do
        before { create(:comment, commentable: post) }

        it 'returns a string with the quantity and the plural of the model' do
          expect(localize_plural(post.comments, Comment)).to eq '1 comment'
        end
      end

      context 'with more than one element' do
        before { create_list(:comment, 2, commentable: post) }

        it 'returns a string with the quantity and the plural of the model' do
          expect(localize_plural(post.comments, Comment)).to eq '2 comments'
        end
      end
    end

    context 'without a populated collection' do
      it 'returns a string with the quantity and the plural of the model' do
        expect(localize_plural(post.comments, Comment)).to eq '0 comments'
      end
    end

    describe '#build_alert_classes' do
      context 'danger' do
        it 'works when :alert' do
          expect(build_alert_classes(:alert)).to include 'alert-danger'
        end

        it 'works when :danger' do
          expect(build_alert_classes(:danger)).to include 'alert-danger'
        end

        it 'works when :error' do
          expect(build_alert_classes(:error)).to include 'alert-danger'
        end

        it 'works when :validation_errors' do
          expect(build_alert_classes(:validation_errors)).to include 'alert-danger'
        end

        it 'includes base classes' do
          expect(build_alert_classes(:danger)).to include 'alert alert-dismissable'
        end

        it 'does not include danger when info' do
          expect(build_alert_classes(:info)).not_to include ' alert-danger'
        end
      end

      context 'warning' do
        it 'works when :warning' do
          expect(build_alert_classes(:warning)).to include 'alert-warning'
        end

        it 'works when :todo' do
          expect(build_alert_classes(:todo)).to include 'alert-warning'
        end

        it 'includes base classes' do
          expect(build_alert_classes(:warning)).to include 'alert alert-dismissable'
        end

        it 'does not include warning when info' do
          expect(build_alert_classes(:info)).not_to include ' alert-warning'
        end
      end

      context 'success' do
        it 'works when :notice' do
          expect(build_alert_classes(:notice)).to include 'alert-success'
        end

        it 'works when :success' do
          expect(build_alert_classes(:success)).to include 'alert-success'
        end

        it 'includes base classes' do
          expect(build_alert_classes(:success)).to include 'alert alert-dismissable'
        end

        it 'does not include success when info' do
          expect(build_alert_classes(:info)).not_to include ' alert-success'
        end
      end

      context 'info' do
        it 'works when :info' do
          expect(build_alert_classes(:info)).to include 'alert-info'
        end

        it 'works when blank' do
          expect(build_alert_classes).to include 'alert-info'
        end

        it 'includes base classes' do
          expect(build_alert_classes(:info)).to include 'alert alert-dismissable'
        end

        it 'does not include info when danger' do
          expect(build_alert_classes(:danger)).not_to include ' alert-info'
        end
      end
    end
  end
end
