require 'rails_helper'

RSpec.describe Base::ReceitasStnController, type: :controller do
	sign_in_admin
	set_orcamento_na_sessao

	describe "GET #selecionar_receita_para_importar" do
		it "atribui a lista de receitas_stn à @receitas_stn" do
			receita_analitica_stn = FactoryBot.create(:receita_analitica_stn)
			get :selecionar_receita_para_importar
			expect(assigns(:receitas_stn)).to eq([receita_analitica_stn])
		end

		it "atribui a lista de tipos_de_orcamento à @tipos_de_orcamento" do
			get :selecionar_receita_para_importar
			expect(assigns(:tipos_de_orcamento)).to eq(Orcamento.first.tipos_de_orcamento)
		end

		it "atribui a lista de tipos_de_deducao à @tipos_de_deducao" do
			get :selecionar_receita_para_importar
			expect(assigns(:tipos_de_deducao)).to eq(Orcamento.first.tipos_de_deducao.where.not(codigo: '00'))
		end

		it "atribui uma nova natureza_da_receita à @natureza_da_receita" do
			get :selecionar_receita_para_importar
			expect(assigns(:natureza_da_receita)).to be_a_new(Base::NaturezaDaReceita)
		end
	end

	describe "POST #importar_receita_stn" do
		before :all do
			DatabaseCleaner.strategy = :transaction
			DatabaseCleaner.start

			load File.expand_path('seed_receitas_stn.rb', Rails.root.to_s + '/db')
		end

		after :all do
			DatabaseCleaner.clean
		end

		before :each do
			orcamento = Orcamento.first
			@receita_analitica_stn = Base::ReceitaStn.where(analitica: true).order(:codigo).first

			@parametros = {
				base_natureza_da_receita: {
					id: @receita_analitica_stn.id,
					tipo_de_deducao_id: orcamento.tipos_de_deducao.first.id,
					tipo_de_receita: 'primaria',
					tipo_de_orcamento_id: orcamento.tipos_de_orcamento.first.id,
					de_convenio: false,
					percentual_de_aplicacao_na_educacao: nil,
					percentual_de_aplicacao_na_saude: nil,
					pedir_cadastro_de_convenio: false,
					percentual_para_legislativo: nil,
					evento_contabil_obrigatorio: false,
					historico_padrao: nil
				}
			}
		end

		context "ao importar uma receita analitica" do
			it "cria a respectiva natureza da receita e seus níveis superiores" do
				expect {
					post :importar_receita_stn, @parametros
				}.to change(Base::NaturezaDaReceita, :count).by(7)
			end
		end

		context "ao importar uma receita analitica e suas intra_orcamentarias" do
			it "cria a respectiva natureza, suas equivalentes intra-orçamentárias e os níveis superiores" do
				expect {
					post :importar_receita_stn, @parametros.merge(intra_orcamentaria: 'true')
				}.to change(Base::NaturezaDaReceita, :count).by(14)
			end
		end

		context "ao importar uma receita analitica e suas deducoes" do
			it "cria a respectiva natureza, suas deduções equivalentes e os níveis superiores" do
				@parametros.merge!({deducao: 'true'})
				@parametros.merge!({tipo_de_deducao_id: Loa::TipoDeDeducao.last.id})

				expect {
					post :importar_receita_stn, @parametros
				}.to change(Base::NaturezaDaReceita, :count).by(14)
			end
		end

		context "ao importar uma receita analitica com nivel opcional da stn" do
			it "cria a natureza, seus niveis superiores e seu nivel opcional" do
				FactoryBot.create(:base_nivel_opcional_stn, receita_stn_id: @receita_analitica_stn.id)

				expect {
					post :importar_receita_stn, @parametros
				}.to change(Base::NaturezaDaReceita, :count).by(8)
			end
		end
	end
end
