describe StatsController, type: :controller do
  before { Timecop.travel(Date.parse("2021/12/15")) }
  after { Timecop.return }

  describe "#last_four_months_hash" do
    context "while a regular user is logged in" do
      before do
        create(:procedure, created_at: 6.months.ago, updated_at: 6.months.ago)
        create(:procedure, created_at: 2.months.ago, updated_at: 62.days.ago)
        create(:procedure, created_at: 2.months.ago, updated_at: 62.days.ago)
        create(:procedure, created_at: 2.months.ago, updated_at: 31.days.ago)
        create(:procedure, created_at: 2.months.ago, updated_at: Time.zone.now)
        @controller = StatsController.new

        allow(@controller).to receive(:super_admin_signed_in?).and_return(false)
      end

      let(:association) { Procedure.all }

      subject { @controller.send(:last_four_months_serie, association, :updated_at) }

      it do
        expect(subject).to eq({
          4.months.ago => 0,
          3.months.ago => 0,
          62.days.ago => 2,
          31.days.ago => 1
        }.transform_keys { |date| I18n.l(date, format: '%B %Y') })
      end
    end

    context "while a super admin is logged in" do
      before do
        create(:procedure, updated_at: 6.months.ago)
        create(:procedure, updated_at: 45.days.ago)
        create(:procedure, updated_at: 1.day.ago)
        create(:procedure, updated_at: 1.day.ago)

        @controller = StatsController.new

        allow(@controller).to receive(:super_admin_signed_in?).and_return(true)
      end

      let (:association) { Procedure.all }

      subject { @controller.send(:last_four_months_serie, association, :updated_at) }

      it do
        expect(subject).to eq({
          3.months.ago => 0,
          45.days.ago => 1,
          1.month.ago => 0,
          1.day.ago => 2
        }.transform_keys { |date| I18n.l(date, format: '%B %Y') })
      end
    end
  end

  describe '#cumulative_hash' do
    before do
      Timecop.freeze(Time.zone.local(2016, 10, 2))
      create(:procedure, created_at: 55.days.ago, updated_at: 43.days.ago)
      create(:procedure, created_at: 45.days.ago, updated_at: 40.days.ago)
      create(:procedure, created_at: 45.days.ago, updated_at: 20.days.ago)
      create(:procedure, created_at: 15.days.ago, updated_at: 20.days.ago)
      create(:procedure, created_at: 15.days.ago, updated_at: 1.hour.ago)
    end

    after { Timecop.return }

    let (:association) { Procedure.all }

    context "while a super admin is logged in" do
      before { allow(@controller).to receive(:super_admin_signed_in?).and_return(true) }

      subject { @controller.send(:cumulative_month_serie, association, :updated_at) }

      it do
        expect(subject).to eq({
          Date.new(2016, 8, 1) => 2,
          Date.new(2016, 9, 1) => 4,
          Date.new(2016, 10, 1) => 5
        })
      end
    end

    context "while a super admin is not logged in" do
      before { allow(@controller).to receive(:super_admin_signed_in?).and_return(false) }

      subject { @controller.send(:cumulative_month_serie, association, :updated_at) }

      it do
        expect(subject).to eq({
          Date.new(2016, 8, 1) => 2,
          Date.new(2016, 9, 1) => 4
        })
      end
    end
  end
end