require "rails_helper"

describe SDG::Goal do
  describe "validations" do
    it "is valid with an existent code" do
      goal = SDG::Goal[1]

      expect(goal).to be_valid
    end

    it "is not valid without a code" do
      expect(build(:sdg_goal, code: nil)).not_to be_valid
    end

    it "is not valid with a nonexistent code" do
      [0, 18].each do |code|
        goal = SDG::Goal.where(code: code).first_or_initialize

        expect(goal).not_to be_valid
      end
    end
  end

  describe "#<=>" do
    let(:goal) { SDG::Goal[10] }

    it "can be compared against goals" do
      lesser_goal = SDG::Goal[9]
      greater_goal = SDG::Goal[11]

      expect(goal).to be > lesser_goal
      expect(goal).to be < greater_goal
    end

    it "can be compared against global targets" do
      lesser_target = build(:sdg_target, code: "9.A", goal: SDG::Goal[9])
      greater_target = build(:sdg_target, code: "10.1", goal: SDG::Goal[10])

      expect(goal).to be > lesser_target
      expect(goal).to be < greater_target
    end

    it "can be compared against local targets" do
      lesser_local_target = build(:sdg_local_target, code: "9.B.12")
      greater_local_target = build(:sdg_local_target, code: "10.1.4")

      expect(goal).to be > lesser_local_target
      expect(goal).to be < greater_local_target
    end
  end

  describe ".[]" do
    it "finds existing goals by code" do
      expect(SDG::Goal[1].code).to be 1
    end

    it "raises an exception for non-existing codes" do
      expect { SDG::Goal[100] }.to raise_exception ActiveRecord::RecordNotFound
    end
  end

  it "translates title" do
    goal = SDG::Goal[1]

    expect(goal.title).to eq "No Poverty"

    I18n.with_locale(:es) do
      expect(goal.title).to eq "Fin de la pobreza"
    end
  end

  it "translates description" do
    goal = SDG::Goal[1]

    expect(goal.description).to eq "End poverty in all its forms, everywhere."

    I18n.with_locale(:es) do
      expect(goal.description).to eq "Poner fin a la pobreza en todas sus formas en todo el mundo."
    end
  end

  describe "#long_title" do
    it "returns the title" do
      expect(SDG::Goal[1].long_title).to eq "No Poverty"
    end
  end
end
