require 'rails_helper'

RSpec.describe Contabilidade::DotacaoOrigem, 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 "#solicitacao_de_alteracao_orcamentaria_criada_no_administrativo" do
		it "retorna true quando avulso é true" do
			dotacao_origem = FactoryBot.build(:dotacao_origem)
			dotacao_origem.solicitacao_de_alteracao_orcamentaria.update_attribute(:avulso, true)

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

			expect(dotacao_origem.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_origem = FactoryBot.build(:dotacao_origem)
				dotacao_origem.retorna_atributos_baseado_no_orcamento_da_despesa
				expect([dotacao_origem.subacao_id, dotacao_origem.elemento_de_despesa_id, dotacao_origem.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_origem = FactoryBot.build(:dotacao_origem)
				dotacao_origem.dotacao_id = nil
				dotacao_origem.retorna_atributos_baseado_no_orcamento_da_despesa
				expect([dotacao_origem.subacao_id, dotacao_origem.elemento_de_despesa_id, dotacao_origem.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_origem = FactoryBot.build(:dotacao_origem)
				orcamento_da_despesa = dotacao_origem.orcamento_da_despesa
				dotacao_origem.retorna_atributos_baseado_no_orcamento_da_despesa
				dotacao_origem.dotacao_id = nil

				dotacao_origem.atribui_dotacao_baseado_na_fonte_e_elemento_de_despesa_por_subacao
				expect(dotacao_origem.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_origem = FactoryBot.build(:dotacao_origem)
				dotacao_origem.dotacao_id = nil

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

	end
