require 'rails_helper'

RSpec.describe Loa::Relatorios::ImpressaoDeLoaController, type: :controller do
	sign_in_admin
	set_orcamento_na_sessao

	let(:atributos_orcamento) {
		FactoryBot.attributes_for :orcamento_2016
	}

	let(:orcamento) {
		Orcamento.find_or_create_by! atributos_orcamento
	}

	describe "relatorio jsPDF" do

		lista_de_relatorios = []

		controllers = Rails.application.routes.routes.map{ |r| r.defaults }.group_by{ |r| r[:controller] }
		controllers.each do |control|
			if control.first == 'loa/relatorios/impressao_de_loa'
				control.last.each do |action|
					lista_de_relatorios.push(action[:action]) unless action[:action] == 'opcoes' || action[:action] == 'gerar_relatorio'
				end
			end
		end

		lista_de_relatorios.each do |relatorio|
			if relatorio == 'demonstrativo_do_orcamento_tematico'
				it "#{relatorio.humanize} retorna status 200 OK" do
					skip "Mudar testes para o novo formato em pdf quando concluir a mudança"
					xhr :get, relatorio, {exercicio: orcamento.exercicio, tema: 1 }
	  				expect(response).to have_http_status(:ok)
				end
			else
				it "#{relatorio.humanize} retorna status 200 OK" do
					skip "Mudar testes para o novo formato em pdf quando concluir a mudança"
					xhr :get, relatorio, {exercicio: orcamento.exercicio }
	  				expect(response).to have_http_status(:ok)
				end
			end
		end
	end

	describe 'relatorios wicked_pdf' do
		before(:all) do
			DatabaseCleaner.strategy = :transaction
			DatabaseCleaner.start

			FactoryBot.create(:tipo_de_programa_tematico)
			FactoryBot.create(:tipo_de_programa_gestao)
		end
		after(:all) do
			DatabaseCleaner.clean
		end

		describe 'GET #mostrar_relatorio' do
			context 'quando é passado por parâmetro um nome de relatório válido' do
				it 'retorna um relatório com formato PDF' do
					get :mostrar_relatorio, {relatorio: "detalhamento_por_programa", exercicio: orcamento.exercicio}
					expect(response).to have_http_status(:ok)
					expect(response.headers["Content-Type"]).to eq "application/pdf"
				end
			end
			context 'quando é passado por parâmetro um nome de relatório inválido' do
				it 'retorna um relatório com formato PDF' do
					get :mostrar_relatorio, {relatorio: "isso_nao_se_trata_de_um_relatorio", exercicio: orcamento.exercicio}
					expect(response).to redirect_to loa_selecionar_relatorio_para_imprimir_path
				end
			end
			context 'quando não é passado parâmetro de relatório' do
				it 'retorna um relatório com formato PDF' do
					get :mostrar_relatorio, {exercicio: orcamento.exercicio}
					expect(response).to redirect_to loa_selecionar_relatorio_para_imprimir_path
				end
			end
		end

		describe 'POST #imprime_loa' do
			context 'quando é passado pelo menos um relatório para impressão' do
				it 'imprime PDF' do
					params = {opcoes: {detalhamento_por_programa: "1"}, exercicio: orcamento.exercicio}
					post :imprime_loa, params
					expect(response).to have_http_status(:ok)
					expect(response.headers["Content-Type"]).to eq "application/pdf"
				end
			end
			context ' quando não é passado pelo menos um relatório para impressão' do
				it 'redireciona para lista de relatórios e mostra erro' do
					params = {exercicio: orcamento.exercicio}
					post :imprime_loa, params
					expect(controller).to set_flash[:alert].to("Nenhum demonstrativo foi selecionado")
					expect(response).to redirect_to loa_prepara_impressao_path
				end
			end
		end
	end
end
