require 'rails_helper'


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

	let(:atributos_validos) {
		FactoryBot.attributes_for(:passagem_internacional)
	}

	let(:atributos_invalidos) {
		{valor: ''}
	}

	let(:passagem_diferente) {
		passagem = FactoryBot.create( :passagem_internacional )
		passagem.projeto.pedido.unidades_orcamentarias_por_pedido.first.update_column(:unidade_orcamentaria_id, FactoryBot.create(:loa_fes, :orcamento_2016).id )
		passagem
	}

	describe "GET #index" do
		before do
			@passagem = FactoryBot.create( :passagem_internacional )
			@outra_passagem = passagem_diferente
		end
		context 'quando o usuário acessa todas as unidades' do
			it "atribui a lista completa de passagens solicitadas à @passagens " do
				sign_in FactoryBot.create(:usuario_comum)
				get :index
				expect(assigns(:passagens)).to include(@passagem, @outra_passagem)
			end
		end
		context 'quando o usuário possui unidades selecionadas' do
			sign_in_secretario
			it 'retorna apenas passagens solicitados das unidades do usuário' do
				get :index
				expect(assigns(:passagens)).to eq([@passagem])
			end
		end
	end

	describe "GET #show" do
		sign_in_secretario
		context 'quando o usuário pode acessar unidade da passagem' do
			it 'atribui a passagem requisitada à @passagem' do
				passagem = Contabilidade::Passagem.create! atributos_validos
				get :show, params: {id: passagem.to_param}
				expect(assigns(:passagem)).to eq(passagem)
			end
		end

		context 'e o usuário não pode acessar unidade da passagem' do
			it 'redireciona para o index' do
				get :show, params: { id: passagem_diferente.to_param }
				expect(response).to redirect_to(passagens_path)
			end
		end
	end

	describe "GET #new" do
		it "atribui um(a) novo(a) passagem à @passagem" do
			get :new, diaria_id: atributos_validos[:diaria_id]
			expect(assigns(:passagem)).to be_a_new(Contabilidade::Passagem)
		end
	end

	describe "GET #edit" do
		it "atribui o(a) passagem requisitado à @passagem" do
			passagem = Contabilidade::Passagem.create! atributos_validos
			get :edit, params: {id: passagem.to_param}
			expect(assigns(:passagem)).to eq(passagem)
		end
	end

	describe "POST #create" do
		context "com parâmetros válidos" do
			it "cria um(a) novo(a) Contabilidade::Passagem" do
				expect {
					post :create, params: {passagem_internacional: atributos_validos, diaria_id: atributos_validos[:diaria_id]}
				}.to change(Contabilidade::Passagem, :count).by(1)
			end

			it "atribui o(a) passagem recém criado(a) à @passagem" do
				post :create, params: {passagem_internacional: atributos_validos, diaria_id: atributos_validos[:diaria_id]}
				expect(assigns(:passagem)).to be_a(Contabilidade::Passagem)
				expect(assigns(:passagem)).to be_persisted
			end

			it "redireciona para a lista de passagens" do
				post :create, params: {:passagem_internacional => atributos_validos, diaria_id: atributos_validos[:diaria_id]}
				expect(response).to redirect_to(passagens_path)
			end
		end

		context "com parâmetros inválidos" do
			it "atribui um(a) passagem recém criado(a), mas não salvo(a), à @passagem" do
				post :create, params: {passagem_internacional: atributos_invalidos, diaria_id: atributos_validos[:diaria_id]}
				expect(assigns(:passagem)).to be_a_new(Contabilidade::Passagem)
			end

			it "re-renderiza o template 'new'" do
				post :create, params: {passagem_internacional: atributos_invalidos, diaria_id: atributos_validos[:diaria_id]}
				expect(response).to render_template("new")
			end
		end
	end

	describe "PUT #update" do
		context "com parâmetros válidos" do
			let(:novos_atributos) {
				{valor: 123}
			}

			it "atualiza o(a) passagem requisitado(a)" do
				passagem = Contabilidade::Passagem.create! atributos_validos
				post :update, params: {id: passagem.to_param, passagem_internacional: novos_atributos}
				passagem.reload
				expect( passagem.valor ).to eq 123
			end

			it "atribui o(a) passagem requisitado(a) à @passagem" do
				passagem = Contabilidade::Passagem.create! atributos_validos
				post :update, params: {id: passagem.to_param, passagem_internacional: atributos_validos}
				expect(assigns(:passagem)).to eq(passagem)
			end

			it "redireciona para a lista de passagens" do
				passagem = Contabilidade::Passagem.create! atributos_validos
				post :update, params: {id: passagem.to_param, passagem_internacional: atributos_validos}
				expect(response).to redirect_to(passagens_path)
			end
		end

		context "com parâmetros inválidos" do
			it "atribui o(a) passagem à @passagem" do
				passagem = Contabilidade::Passagem.create! atributos_validos
				post :update, params: {id: passagem.to_param, passagem_internacional: atributos_invalidos}
				expect(assigns(:passagem)).to eq(passagem)
			end

			it "re-renderiza o template 'edit'" do
				passagem = Contabilidade::Passagem.create! atributos_validos
				post :update, params: {id: passagem.to_param, passagem_internacional: atributos_invalidos}
				expect(response).to render_template("edit")
			end
		end
	end

	describe "DELETE #destroy" do
		it "destrói o(a) passagem requisitado(a)" do
			passagem = Contabilidade::Passagem.create! atributos_validos
			expect {
				delete :destroy, params: {:id => passagem.to_param}
			}.to change(Contabilidade::Passagem, :count).by(-1)
		end

		it "redireciona para a lista de passagens" do
			passagem = Contabilidade::Passagem.create! atributos_validos
			delete :destroy, params: {:id => passagem.to_param}
			expect(response).to redirect_to(passagens_path)
		end
	end
end
