require 'rails_helper'

RSpec.describe ApplicationController, type: :controller do

	describe "#ppa_atual" do
		it "busca o ppa atual da sessão" do
			ppa_fortaleza = FactoryBot.create :ppa_fortaleza_2014
			@request.session['contexto_id'] = ppa_fortaleza.id
			@request.session['contexto_tipo'] = ppa_fortaleza.class.name

			expect( controller.ppa_atual ).to eq ppa_fortaleza
		end
	end

	describe "#orcamento_atual" do
		it "busca o orcamento atual da session" do
			orcamento = FactoryBot.create :orcamento_2016
			@request.session['contexto_id'] = orcamento.id
			@request.session['contexto_tipo'] = orcamento.class.name

			expect( controller.orcamento_atual ).to eq orcamento
		end
	end

	describe "#contabilidade_atual" do
		it "busca o exercício da contabilidade atual da session baseado no orçamento" do
			orcamento = FactoryBot.create :orcamento_2016
			@request.session['contexto_id'] = orcamento.id
			@request.session['contexto_tipo'] = 'Contabilidade'

			expect( controller.contabilidade_atual ).to eq orcamento
		end
	end

	describe "#contexto_atual" do
		it "busca na sessão o contexto atual" do
			ppa = FactoryBot.create :ppa_fortaleza_2014
			orcamento = FactoryBot.create :orcamento_2016
			[ppa, orcamento].each do |contexto|
				@request.session['contexto_id'] = contexto.id
				@request.session['contexto_tipo'] = contexto.class.name

				expect( controller.contexto_atual ).to eq contexto
			end
		end
	end

	describe "#esta_autorizado" do
		it "verifica se usuario nao existe ao acessar metodo sem device" do
			expect(controller.esta_autorizado?(":show")).to be_falsy
		end

		it "verifica se usuario administrador esta_autorizado por padrao" do
			usuario_admin = FactoryBot.create :admin

			allow( controller ).to receive( :current_usuario ).and_return(usuario_admin)
			acesso_aprovado = controller.esta_autorizado?(":show")
			expect(acesso_aprovado).to be_truthy
		end

		it "verifica se usuario comum nao esta_autorizado por padrao" do
			usuario_comum = FactoryBot.create :usuario_comum

			allow( controller ).to receive( :current_usuario ).and_return(usuario_comum)
			acesso_aprovado = controller.esta_autorizado?(":show")
			expect(acesso_aprovado).to be_falsy
		end

		it "verifica se usuario comum esta_autorizado a acessar metodo requisitado" do
			usuario_comum = FactoryBot.create :usuario_comum
			allow( controller ).to receive( :current_usuario ).and_return(usuario_comum)

			FactoryBot.create :permissao_show_de_application_para_perfil_comum

			acesso_aprovado = controller.esta_autorizado?('show', 'application')
			expect(acesso_aprovado).to be_truthy
		end
	end

	describe "#verifica_autorizacao_orcamento" do
		set_orcamento_na_sessao

		it 'caso não tenha acesso ao orçamento retorna falso' do
			ENV['mostrar_orcamento'] = 'false'
			usuario_admin = FactoryBot.create :admin

			allow( controller ).to receive( :current_usuario ).and_return(usuario_admin)
			acesso_aprovado = controller.esta_autorizado?(":show", @orcamento.class.name)
			expect(acesso_aprovado).to be_falsy
		end

		it 'caso tenha acesso ao orçamento retorna verdadeiro' do
			ENV['mostrar_orcamento'] = 'true'
			usuario_admin = FactoryBot.create :admin

			allow( controller ).to receive( :current_usuario ).and_return(usuario_admin)
			acesso_aprovado = controller.esta_autorizado?(":show", @orcamento.class.name)
			expect(acesso_aprovado).to be_truthy
		end
	end

	describe "#verifica_autorizacao_ppa" do
		set_ppa_id_na_sessao

		it 'caso não tenha acesso ao ppa retorna falso' do
			ENV['mostrar_ppa'] = 'false'
			usuario_admin = FactoryBot.create :admin

			allow( controller ).to receive( :current_usuario ).and_return(usuario_admin)
			acesso_aprovado = controller.esta_autorizado?(":show", @ppa.class.name)
			expect(acesso_aprovado).to be_falsy
		end

		it 'caso tenha acesso ao ppa retorna true' do
			ENV['mostrar_ppa'] = 'true'
			usuario_admin = FactoryBot.create :admin

			allow( controller ).to receive( :current_usuario ).and_return(usuario_admin)
			acesso_aprovado = controller.esta_autorizado?(":show", @ppa.class.name)
			expect(acesso_aprovado).to be_truthy
		end
	end
end
