require 'rails_helper'

RSpec.describe Contabilidade::LancamentosManuaisEmUnidadesOrcamentariasController, type: :controller do
	sign_in_admin
	cria_configuracao_default
	set_contabilidade_na_sessao

	describe 'GET #edit' do
		it 'atribui nil à @transferir_para' do
			get :edit
			expect(assigns[:transferir_para]).to eq nil
		end
	end

	describe 'PUT #update' do
		before do
			@conta_bancaria_por_unidade_orcamentaria_da_seduc = FactoryBot.create(:conta_bancaria_por_unidade_orcamentaria_da_seduc)

			@atualiza_saldo_de_unidades_orcamentarias = {
				conta_para: @conta_bancaria_por_unidade_orcamentaria_da_seduc.conta_bancaria_id,
				transferir_para: @conta_bancaria_por_unidade_orcamentaria_da_seduc.unidade_orcamentaria_id,
				valor: 500,
				descricao: 'Realizando transferência de Créditos Extraordinários'
			}
		end

		context 'com parâmetros válidos' do
			it 'atualiza saldos da unidade orcamentaria requisitada' do
				put :update, @atualiza_saldo_de_unidades_orcamentarias
				@conta_bancaria_por_unidade_orcamentaria_da_seduc.reload
				expect(@conta_bancaria_por_unidade_orcamentaria_da_seduc.saldo_atual).to eq 509.99
			end

			it 'atualiza saldo da conta bancaria requisitada' do
				put :update, @atualiza_saldo_de_unidades_orcamentarias
				@conta_bancaria_por_unidade_orcamentaria_da_seduc.reload
				expect(@conta_bancaria_por_unidade_orcamentaria_da_seduc.conta_bancaria.saldo_atual).to eq 509.99
			end

			it 'atribui a valor requisitada à @valor' do
				put :update, @atualiza_saldo_de_unidades_orcamentarias
				expect(assigns(:valor)).to eq @atualiza_saldo_de_unidades_orcamentarias[:valor]
			end

			it 'atribui a valor_mensagem_de_obrigatorio requisitada à @valor_mensagem_de_obrigatorio' do
			  put :update, @atualiza_saldo_de_unidades_orcamentarias
				expect(assigns(:valor_mensagem_de_obrigatorio)).to eq ''
			end

			it 'atribui a valor_mensagem_de_obrigatorio requisitada à @valor_mensagem_de_obrigatorio' do
			  put :update, @atualiza_saldo_de_unidades_orcamentarias
				expect(assigns(:descricao_mensagem_de_obrigatorio)).to eq ''
			end

			it 'atribui a transferir_de requisitada à @transferir_para' do
			  put :update, @atualiza_saldo_de_unidades_orcamentarias
				expect(assigns(:transferir_para)).to eq @conta_bancaria_por_unidade_orcamentaria_da_seduc
			end

			it 'redireciona para tela inicial de transferencia' do
				put :update, @atualiza_saldo_de_unidades_orcamentarias
				expect(response).to redirect_to(base_movimentacoes_das_contas_bancarias_por_unidade_orcamentaria_path(@conta_bancaria_por_unidade_orcamentaria_da_seduc))
			end
		end

		context 'com parâmetros inválidos' do
			it 'campo transferir_para não é selecionado' do
				@atualiza_saldo_de_unidades_orcamentarias[:transferir_para] = nil
				put :update, @atualiza_saldo_de_unidades_orcamentarias
				expect(assigns(:transferir_para).errors[:unidade_orcamentaria_id]).to include 'Não pode ficar em branco'
			end

			it 'campo valor não pode ficar em branco' do
				@atualiza_saldo_de_unidades_orcamentarias[:valor] = nil
				put :update, @atualiza_saldo_de_unidades_orcamentarias
				expect(assigns(:valor_mensagem_de_obrigatorio)).to include 'Não pode ficar em branco'
			end

			it 'campo descricao não pode ficar em branco' do
				@atualiza_saldo_de_unidades_orcamentarias[:descricao] = nil
				put :update, @atualiza_saldo_de_unidades_orcamentarias
				expect(assigns(:descricao_mensagem_de_obrigatorio)).to include 'Não pode ficar em branco'
			end

			it 'campo valor deve ser maior que zero' do
				@atualiza_saldo_de_unidades_orcamentarias[:valor] = -5
				put :update, @atualiza_saldo_de_unidades_orcamentarias
				expect(assigns(:valor_mensagem_de_obrigatorio)).to include 'Preencha um valor maior que zero'

				@atualiza_saldo_de_unidades_orcamentarias[:valor] = 0
				put :update, @atualiza_saldo_de_unidades_orcamentarias
				expect(assigns(:valor_mensagem_de_obrigatorio)).to include 'Preencha um valor maior que zero'
			end

			it 're-renderiza o template edit' do
				@atualiza_saldo_de_unidades_orcamentarias[:transferir_para] = nil
				put :update, @atualiza_saldo_de_unidades_orcamentarias
				expect(response).to render_template(:edit)
			end
		end
	end
end
