require 'rails_helper'

RSpec.describe Contabilidade::DotacaoDestino, type: :model do
  it{ is_expected.to belong_to :solicitacao_de_alteracao_orcamentaria }
	it{ is_expected.to belong_to(:orcamento_da_despesa).required }

	[:subacao_id, :elemento_de_despesa_id, :fonte_de_recurso_id, :valor].each do |atributo|
		before { allow(subject).to receive(:solicitacao_de_alteracao_orcamentaria_criada_no_administrativo?).and_return(true)}
		it{ is_expected.to validate_presence_of(atributo) }
	end

	[:solicitacao_de_alteracao_orcamentaria_id, :dotacao_id].each { |atributo| it { is_expected.to validate_presence_of atributo }}

  describe "Valida presença de valor" do
		subject{
			Contabilidade::DotacaoDestino.new(dotacao_id: 1)
		}

		it{ is_expected.to validate_presence_of(:valor) }
	end

	describe "#solicitacao_de_alteracao_orcamentaria_criada_no_administrativo" do
		it "retorna true quando avulso é true" do
			dotacao_destino = FactoryBot.build(:dotacao_destino)
			dotacao_destino.solicitacao_de_alteracao_orcamentaria.update_attribute(:avulso, true)

			expect(dotacao_destino.solicitacao_de_alteracao_orcamentaria_criada_no_administrativo?).to be_truthy
		end
		it "retorna false quando avulso é falso" do
			dotacao_destino = FactoryBot.build(:dotacao_destino)
			dotacao_destino.solicitacao_de_alteracao_orcamentaria.update_attribute(:avulso, false)

			expect(dotacao_destino.solicitacao_de_alteracao_orcamentaria_criada_no_administrativo?).to be_falsey
		end
	end

	describe "#retorna_atributos_baseado_no_orcamento_da_despesa" do
		context "Quando o orçamento da despesa esta preenchido" do
			it "retorna os dados para os attr_accessor" do
				dotacao_destino = FactoryBot.build(:dotacao_destino)
				dotacao_destino.retorna_atributos_baseado_no_orcamento_da_despesa
				expect([dotacao_destino.subacao_id, dotacao_destino.elemento_de_despesa_id, dotacao_destino.fonte_de_recurso_id]).to_not include nil
			end
		end
		context "Quando o orçamento da despesa não está preenchido" do
			it "não retorna os dados para os attr_accessor" do
				dotacao_destino = FactoryBot.build(:dotacao_destino)
				dotacao_destino.dotacao_id = nil
				dotacao_destino.retorna_atributos_baseado_no_orcamento_da_despesa
				expect([dotacao_destino.subacao_id, dotacao_destino.elemento_de_despesa_id, dotacao_destino.fonte_de_recurso_id].compact).to be_empty
			end
		end
	end

	describe "#atribui_dotacao_baseado_na_fonte_e_elemento_de_despesa_por_subacao" do
		context "Quando attr_acessor estão preenchidos" do
			it "atribui a dotação baseada nos parametros" do
				dotacao_destino = FactoryBot.build(:dotacao_destino)
				orcamento_da_despesa = dotacao_destino.orcamento_da_despesa
				dotacao_destino.retorna_atributos_baseado_no_orcamento_da_despesa
				dotacao_destino.dotacao_id = nil

				dotacao_destino.atribui_dotacao_baseado_na_fonte_e_elemento_de_despesa_por_subacao
				expect(dotacao_destino.orcamento_da_despesa).to eq orcamento_da_despesa
			end
		end
		context "Quando attr_acessor não está preenchido" do
			it "não atribui dotação baseada nos paramatros" do
				dotacao_destino = FactoryBot.build(:dotacao_destino)
				dotacao_destino.dotacao_id = nil

				dotacao_destino.atribui_dotacao_baseado_na_fonte_e_elemento_de_despesa_por_subacao
				expect(dotacao_destino.orcamento_da_despesa).to eq nil
			end
		end
	end

end
