consul/consul

View on GitHub
spec/models/statisticable_spec.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "rails_helper"

describe Statisticable do
  before do
    dummy_stats = Class.new do
      include Statisticable

      def participants
        User.all
      end
    end

    stub_const("DummyStats", dummy_stats)
  end

  let(:stats) { DummyStats.new(nil) }

  describe "#gender?" do
    context "No participants" do
      it "is false" do
        expect(stats.gender?).to be false
      end
    end

    context "All participants have no defined gender" do
      before { create(:user, gender: nil) }

      it "is false" do
        expect(stats.gender?).to be false
      end
    end

    context "There's a male participant" do
      before { create(:user, gender: "male") }

      it "is true" do
        expect(stats.gender?).to be true
      end
    end

    context "There's a female participant" do
      before { create(:user, gender: "female") }

      it "is true" do
        expect(stats.gender?).to be true
      end
    end
  end

  describe "#age?" do
    context "No participants" do
      it "is false" do
        expect(stats.age?).to be false
      end
    end

    context "All participants have no defined age" do
      before { create(:user, date_of_birth: nil) }

      it "is false" do
        expect(stats.age?).to be false
      end
    end

    context "All participants have impossible ages" do
      before do
        create(:user, date_of_birth: 3.seconds.ago)
        create(:user, date_of_birth: 3000.years.ago)
      end

      it "is false" do
        expect(stats.age?).to be false
      end
    end

    context "There's a participant with a defined age" do
      before { create(:user, date_of_birth: 30.years.ago) }

      it "is true" do
        expect(stats.age?).to be true
      end
    end
  end

  describe "#geozone?" do
    context "No participants" do
      it "is false" do
        expect(stats.geozone?).to be false
      end
    end

    context "All participants have no defined geozone" do
      before { create(:user, geozone: nil) }

      it "is false" do
        expect(stats.geozone?).to be false
      end
    end

    context "There's a participant with a defined geozone" do
      before { create(:user, geozone: create(:geozone)) }

      it "is true" do
        expect(stats.geozone?).to be true
      end
    end
  end

  describe "#total_no_demographic_data" do
    it "returns users with no defined gender" do
      create(:user, gender: nil)

      expect(stats.total_no_demographic_data).to be 1
    end

    it "returns users with no defined age" do
      create(:user, gender: "female", date_of_birth: nil)

      expect(stats.total_no_demographic_data).to be 1
    end

    it "returns users with no defined geozone" do
      create(:user, gender: "female", geozone: nil)

      expect(stats.total_no_demographic_data).to be 1
    end

    it "returns users with no defined gender, age nor geozone" do
      create(:user, gender: nil, date_of_birth: nil, geozone: nil)

      expect(stats.total_no_demographic_data).to be 1
    end

    it "doesn't return users with defined gender, age and geozone" do
      create(:user, gender: "male", date_of_birth: 20.years.ago, geozone: create(:geozone))

      expect(stats.total_no_demographic_data).to be 0
    end
  end

  describe "#stats_methods" do
    it "includes total participants" do
      expect(stats.stats_methods).to include(:total_participants)
    end

    context "no gender stats" do
      before { allow(stats).to receive(:gender?).and_return(false) }

      it "doesn't include gender methods" do
        expect(stats.stats_methods).not_to include(:total_male_participants)
      end
    end

    context "no age stats" do
      before { allow(stats).to receive(:age?).and_return(false) }

      it "doesn't include age methods" do
        expect(stats.stats_methods).not_to include(:participants_by_age)
      end
    end

    context "no geozone stats" do
      before { allow(stats).to receive(:geozone?).and_return(false) }

      it "doesn't include age methods" do
        expect(stats.stats_methods).not_to include(:participants_by_geozone)
      end
    end

    context "all gender, age and geozone stats" do
      before do
        allow(stats).to receive_messages(gender?: true, age?: true, geozone?: true)
      end

      it "includes all stats methods" do
        expect(stats.stats_methods).to include(:total_male_participants)
        expect(stats.stats_methods).to include(:participants_by_age)
        expect(stats.stats_methods).to include(:participants_by_geozone)
      end
    end
  end
end