Newer
Older
dmpopidor / spec / models / stat_created_plan_spec.rb
# frozen_string_literal: true

require "rails_helper"

RSpec.describe StatCreatedPlan, type: :model do
  describe ".to_json" do
    it "returns only the count and date if no details are defined" do
      stat = build(:stat_created_plan)
      json = JSON.parse(stat.to_json)
      expect(json["count"]).to eql(stat.count)
      expect(json["date"]).to eql(stat.date.strftime("%Y-%m-%d"))
      expect(json["by_template"]).to eql([])
      expect(json["org_id"]).to eql(nil)
      expect(json["created_at"]).to eql(nil)
    end
  end
  describe ".to_csv" do
    context "when no instances" do
      it "returns empty" do
        csv = described_class.to_csv([])

        expect(csv).to be_empty
      end
    end
    context "when instances" do
      let(:org) { FactoryBot.create(:org) }

      context "when no details" do
        it "returns counts in a comma-separated row" do
          may = FactoryBot.create(:stat_created_plan,
            date: Date.new(2018, 05, 31),
            org: org, count: 20)
          june = FactoryBot.create(:stat_created_plan,
            date: Date.new(2018, 06, 30),
            org: org, count: 10)
          data = [may, june]

          csv = described_class.to_csv(data)

          expected_csv = <<~HERE
          Date,Count
          2018-05-31,20
          2018-06-30,10
          HERE
          expect(csv).to eq(expected_csv)
        end
      end

      context "when details by template is true" do
        it "returns counts by_template in a comma-separated row" do
          may = FactoryBot.create(:stat_created_plan,
            date: Date.new(2018, 05, 31),
            org: org,
            count: 20,
            details: { by_template: [
            { name: "Template1", count: 5 },
            { name: "Template2", count: 15 }] })
          june = FactoryBot.create(:stat_created_plan,
            date: Date.new(2018, 06, 30),
            org: org, count: 10,
            details: { by_template: [
            { name: "Template1", count: 2 },
            { name: "Template3", count: 8 }] })
          july = FactoryBot.create(:stat_created_plan,
            date: Date.new(2018, 07, 31),
            org: org,
            count: 0)
          data = [may, june, july]

          csv = described_class.to_csv(data, details: { by_template: true, sep: ","})

          expected_csv = <<~HERE
          Date,Template1,Template2,Template3,Count
          May 2018,5,15,0,20
          Jun 2018,2,0,8,10
          Jul 2018,0,0,0,0
          HERE
          expect(csv).to eq(expected_csv)
        end
      end
    end
  end

  describe ".serialize" do
    let(:org) { FactoryBot.create(:org,
      name: "An Org",
      contact_email: "foo@bar.com",
      contact_name: "Foo") }
    let(:details) do
      { "by_template" => [
        { "name" => "Template 1", "count" => 10 },
        { "name" => "Template 2", "count" => 10 }]
      }
    end

    it "retrieves JSON details as a hash object" do
      september = FactoryBot.create(:stat_created_plan,
        date: "2018-09-30",
        org: org,
        count: 20,
        details: details)

      json_details = described_class.find_by_date("2018-09-30").details

      expect(json_details).to eq(details)
    end
  end
end