require 'rails_helper'

RSpec.describe Base::ReceitaStn, type: :model do
	it { is_expected.to belong_to :orcamento }
	it { is_expected.to have_many(:niveis_opcionais_stn).dependent(:destroy) }
	it { is_expected.to have_many(:naturezas_da_receita).class_name("Base::NaturezaDaReceita").dependent(:restrict_with_exception) }
	it { is_expected.to validate_presence_of :codigo }
	it { is_expected.to validate_presence_of :descricao }
	it { is_expected.to validate_uniqueness_of(:codigo).scoped_to(:orcamento_id) }

	describe 'codigo_formatado_e_descricao' do
		it 'retorna codigo da receita stn formatado junto com a descricao' do
			receita = FactoryBot.create(:receita_analitica_stn)
			expect(receita.codigo_formatado_e_descricao).to eq('1.1.1.2.01.1.1 - Imposto sobre a Propriedade Territorial Rural - Municípios Conveniados - Multas e Juros (IPTR)')
		end
	end

	describe 'codigos_da_hierarquia' do
		it 'retorna os 7 codigos das receitas' do
			receita = FactoryBot.create(:receita_analitica_stn)
			expect(receita.codigos_da_hierarquia).to eq(
				[
					'10000000',
					'11000000',
					'11100000',
					'11120000',
					'11120100',
					'11120110',
					'11120111'
				]
			)
		end
	end

	describe 'before_validation' do
		describe '#popula_analitica' do
			context 'quando ultimo digito do código é 0' do
				it 'coloca false em analítica' do
					receita = FactoryBot.build(:receita_analitica_stn, codigo: "11120110", analitica: nil)
					expect(receita.analitica).to be_falsey
				end
			end

			context 'quando ultimo digito do código é diferente de 0' do
				it 'coloca true em analítica' do
					receita = FactoryBot.build(:receita_analitica_stn, codigo: "11120111", analitica: nil)
					receita.save
					expect(receita.analitica).to be_truthy
				end
			end
		end
	end

	describe 'after_create' do
		describe '#cria_receitas_filhas' do
			context 'quando não passa o atributo receitas_filhas' do
				it 'cria apenas uma receita' do
					expect { FactoryBot.create(:receita_analitica_stn, codigo: "11120110", descricao: "teste") }.to change(Base::ReceitaStn, :count).by(1)
				end
			end
		end
	end
end
