require 'rails_helper'

RSpec.describe Contabilidade::ImpostosDeRendaController, type: :controller do
	sign_in_admin
	set_contabilidade_na_sessao

	let(:atributos_validos) { FactoryBot.attributes_for :imposto_de_renda }
	let(:atributos_invalidos) { atributos_validos.except(:mes_de_competencia) }

	describe 'get #index' do
		it 'redireciona para a lista de impostos de renda do orçamento/contabilidade atual por competência' do
			imposto_de_renda = FactoryBot.create :imposto_de_renda
			get :index

			expect(assigns(:impostos_de_renda)).to include imposto_de_renda
		end
	end

	describe 'get #show' do
		it 'retorna o imposto de renda requisitado' do
			imposto_de_renda = FactoryBot.create :imposto_de_renda
			get :show, params: { id: imposto_de_renda.id }

			expect(assigns(:imposto_de_renda)).to eq imposto_de_renda
		end
	end

	describe 'get #new' do
		before(:each) { get :new }
		it 'atribui um novo imposto de renda não salvo à @imposto_de_renda' do
			expect(assigns(:imposto_de_renda)).to be_a_new(Contabilidade::ImpostoDeRenda)
		end

		it 'renderiza template :new' do
			expect(response).to render_template :new
		end
	end

	describe 'post #create' do
		context 'com parâmetros válidos' do
			it 'criar um novo Contabilidade::ImpostoDeRenda' do
				expect {
					post :create, params: { contabilidade_imposto_de_renda: atributos_validos }
				}.to change(Contabilidade::ImpostoDeRenda, :count).by(1)
			end

			it 'atribui o novo imposto de renda à @imposto_de_renda' do
				post :create, params: { contabilidade_imposto_de_renda: atributos_validos }

				expect(assigns(:imposto_de_renda)).to be_a(Contabilidade::ImpostoDeRenda)
			end

			it 'salva o @imposto_de_renda' do
				post :create, params: { contabilidade_imposto_de_renda: atributos_validos }

				expect(assigns(:imposto_de_renda)).to be_persisted
			end

			it 'redireciona para a lista de impostos de renda' do
				post :create, params: { contabilidade_imposto_de_renda: atributos_validos }

				expect(response).to redirect_to contabilidade_impostos_de_renda_path
			end
		end

		context 'com parâmetros inválidos' do
			it 'não cria um novo Contabilidade::ImpostoDeRenda' do
				expect {
					post :create, params: { contabilidade_imposto_de_renda: atributos_invalidos }
				}.not_to change(Contabilidade::ImpostoDeRenda, :count)
			end

			it 'atribui o novo imposto de renda à @imposto_de_renda' do
				post :create, params: { contabilidade_imposto_de_renda: atributos_invalidos }

				expect(assigns(:imposto_de_renda)).to be_a(Contabilidade::ImpostoDeRenda)
			end

			it 'não salva o @imposto_de_renda' do
				post :create, params: { contabilidade_imposto_de_renda: atributos_invalidos }

				expect(assigns(:imposto_de_renda)).not_to be_persisted
			end

			it 'renderixa o template :new' do
				post :create, params: { contabilidade_imposto_de_renda: atributos_invalidos }

				expect(response).to render_template :new
			end
		end
	end

	describe 'get #edit' do
		before(:each) do
			@imposto_de_renda = FactoryBot.create :imposto_de_renda
			get :edit, params: { id: @imposto_de_renda.id }
		end

		it 'renderiza o template :edit' do
			expect(response).to render_template :edit
		end

		it 'atribui o imposto de renda requisitado à @imposto_de_renda' do
			expect(assigns(:imposto_de_renda)).to eq @imposto_de_renda
		end
	end

	describe 'put #update' do
		context 'com parâmetros válidos' do
			let(:novos_atributos) { { desconto_por_dependente: 189.59 } }
			before(:each) do
				@imposto_de_renda = FactoryBot.create :imposto_de_renda
				post :update, params: { id: @imposto_de_renda.id, contabilidade_imposto_de_renda: novos_atributos }
			end

			it 'atribui o imposto de renda ao @imposto_de_renda' do
				expect(assigns(:imposto_de_renda)).to eq @imposto_de_renda
			end

			it 'atualiza o registro requisitado' do
				@imposto_de_renda.reload

				expect(@imposto_de_renda.desconto_por_dependente.to_f).to eq 189.59
			end

			it 'redireciona para o registro atualizado' do
				expect(response).to redirect_to @imposto_de_renda
			end
		end

		context 'com parâmetros inválidos' do
			before(:each) do
				@imposto_de_renda = FactoryBot.create :imposto_de_renda
				post :update, params: { id: @imposto_de_renda.id, contabilidade_imposto_de_renda: atributos_invalidos }
			end

			it 'atribui o imposto de renda ao @imposto_de_renda' do
				expect(assigns(:imposto_de_renda)).to eq @imposto_de_renda
			end

			it 'renderiza o template :edit' do
				expect(response).to redirect_to @imposto_de_renda
			end
		end
	end

	describe 'delete #destroy' do
		before(:each) do
		  @imposto_de_renda = FactoryBot.create :imposto_de_renda
		end

		it 'deleta o registro requisitado' do
			expect {
				delete :destroy, params: {id: @imposto_de_renda.id}
			}.to change(Contabilidade::ImpostoDeRenda, :count).by(-1)
		end

		it 'redireciona para a lista de impostos de rendas, do orçamento/contabilidade atual, por competência' do
			delete :destroy, params: {id: @imposto_de_renda.id}

			expect(response).to redirect_to contabilidade_impostos_de_renda_path
		end
	end
end
