require 'rails_helper'
include ActiveSupport::Testing::TimeHelpers

RSpec.describe Ppa::Ppa, type: :model do

	it{ is_expected.to have_one(:projecao_de_receita).class_name('Projecao::ProjecaoDeReceita').dependent(:destroy)}

	it{ is_expected.to have_many(:funcoes).dependent(:destroy) }
	it{ is_expected.to have_many(:orgaos).dependent(:restrict_with_exception) }
	it{ is_expected.to have_many(:convenios).dependent(:restrict_with_exception) }
	it{ is_expected.to have_many(:valores_do_convenio).through(:convenios) }
	it{ is_expected.to have_many(:eixos).dependent(:destroy) }
	it{ is_expected.to have_many(:sub_areas_tematicas_dos_convenios).through(:convenios).source(:sub_area_tematica)}
	it{ is_expected.to have_many(:regioes).dependent(:restrict_with_exception) }
	it{ is_expected.to have_many(:tecnicos).dependent(:destroy) }
	it{ is_expected.to have_many(:programas).dependent(:restrict_with_exception) }
	it{ is_expected.to have_many(:areas_tematicas).dependent(:destroy) }
	it{ is_expected.to have_many(:paginas).class_name('Ppa::Pagina').dependent(:destroy) }
	it{ is_expected.to have_many(:propostas).class_name('Ppa::Proposta').dependent(:destroy) }
	it{ is_expected.to have_many(:impressao_das_receitas).class_name('Ppa::ImpressaoDaReceita').dependent(:destroy) }

	it{ is_expected.to have_many(:sub_areas_tematicas_dos_convenios).through(:convenios).source(:sub_area_tematica) }

	it { is_expected.to validate_attachment_content_type(:url_arquivo_de_contexto).allowing('application/pdf').rejecting('image/png', 'image/gif') }
	it { is_expected.to validate_attachment_size(:url_arquivo_de_contexto).less_than(10.megabytes) }

	it { is_expected.to allow_value('01/01/2016').for(:data_da_legislacao) }
	it { is_expected.to allow_value('').for(:data_da_legislacao) }
	it { is_expected.to_not allow_value('00/').for(:data_da_legislacao) }

	it {
		travel_to Date.parse('01/01/2017') do
			is_expected.to allow_value('01/01/2017').for(:abertura_do_periodo_de_propostas)
		end
	}
	it { is_expected.to allow_value('').for(:abertura_do_periodo_de_propostas) }
	it { is_expected.to_not allow_value('00/').for(:abertura_do_periodo_de_propostas) }

	it { is_expected.to allow_value('01/01/2017').for(:fim_do_periodo_de_propostas) }
	it { is_expected.to allow_value('').for(:fim_do_periodo_de_propostas) }
	it { is_expected.to_not allow_value('00/').for(:fim_do_periodo_de_propostas) }

	it {
		travel_to Date.parse('02/01/2017') do
			is_expected.to allow_value('02/01/2017').for(:abertura_do_periodo_de_votacao)
		end
	}

	it { is_expected.to allow_value('').for(:abertura_do_periodo_de_votacao) }
	it { is_expected.to_not allow_value('00/').for(:abertura_do_periodo_de_votacao) }

	it { is_expected.to allow_value('01/01/2017').for(:fim_do_periodo_de_votacao) }
	it { is_expected.to allow_value('').for(:fim_do_periodo_de_votacao) }
	it { is_expected.to_not allow_value('00/').for(:fim_do_periodo_de_votacao) }

	it { is_expected.to validate_numericality_of(:quantidade_limite_de_propostas).is_greater_than_or_equal_to(0) }
	it { is_expected.to validate_numericality_of(:quantidade_de_caracteres_das_propostas).is_greater_than_or_equal_to(0) }

	it { is_expected.to validate_numericality_of(:exercicio_inicial) }
	it { is_expected.to validate_numericality_of(:exercicio_final) }

	[:exercicio_inicial, :exercicio_final, :prefeito, :vice_prefeito].each {|atributo| it{ is_expected.to validate_presence_of atributo} }

	it "não permite alterações no exercicio final" do
		ppa = FactoryBot.create(:ppa_fortaleza_2014 )
		ppa.exercicio_final = "2080"
		ppa.validate
		expect(ppa.errors[:exercicio_final]).to include "não pode ser alterado"
	end

	it "não permite alterações no exercicio inicial" do
		ppa = FactoryBot.create(:ppa_fortaleza_2014 )
		ppa.exercicio_inicial = "2070"
		ppa.validate
		expect(ppa.errors[:exercicio_inicial]).to include "não pode ser alterado"
	end

	describe "#valida_status_do_ppa" do
		context "não permite colocar data da legislação com ppas do mesmo exercicio" do
			it "retorna erro" do
				FactoryBot.create :ppa_fortaleza_2020, exercicio_inicial: '2017', data_da_legislacao: '13/07/2017', legislacao: '10.203' , status: 2
				ppa_2 = FactoryBot.build :ppa_fortaleza_2020, exercicio_inicial: '2017', data_da_legislacao: '13/07/2017', legislacao: '10.203'
				ppa_2.validate
				expect(ppa_2.errors[:data_da_legislacao]).to include "Impossível finalizar este PPA caso exista outro PPA finalizado."
			end
		end
	end

	describe 'validate_presence_of' do
		context ':abertura_do_periodo_de_propostas' do
			subject { FactoryBot.build :ppa_fortaleza_2014, fim_do_periodo_de_propostas: '01/01/2017' }
			it{ is_expected.to validate_presence_of :abertura_do_periodo_de_propostas }
		end

		context ':fim_do_periodo_de_propostas' do
			subject { FactoryBot.build :ppa_fortaleza_2014, abertura_do_periodo_de_propostas: '01/01/2017' }
			it{ is_expected.to validate_presence_of :fim_do_periodo_de_propostas }
		end

		context ':abertura_do_periodo_de_votacao' do
			subject { FactoryBot.build :ppa_fortaleza_2014, fim_do_periodo_de_votacao: '01/01/2017' }
			it{ is_expected.to validate_presence_of :abertura_do_periodo_de_votacao }
		end

		context ':fim_do_periodo_de_votacao' do
			subject { FactoryBot.build :ppa_fortaleza_2014, abertura_do_periodo_de_votacao: '01/01/2017' }
			it{ is_expected.to validate_presence_of :fim_do_periodo_de_votacao }
		end
	end

	describe '#intervalo' do
		it 'retorna uma string com o exercício inicial e final do PPA' do
			ppa = Ppa::Ppa.new( exercicio_inicial: 2016, exercicio_final: 2020 )
			expect( ppa.intervalo ).to eq '2016 - 2020'
		end
	end

	describe '#valor_total_da_despesa_por_exercicio' do
		it 'retorna o valor total de receitas naquele exercio' do
			ppa =FactoryBot.create(:ppa_fortaleza_2014)
			expect( ppa.valor_total_da_despesa_por_exercicio(ppa.exercicio_inicial) ).to eq 0
		end
	end

	describe '#save' do
		it "não pode ter exercicio final menor que exericicio inicial" do
			ppa = Ppa::Ppa.new
			ppa.exercicio_inicial = 2014
			ppa.exercicio_final = 2010
			ppa.save
			expect( ppa.errors[:exercicio_final] ).to include 'deve ser maior que o exercício inicial'
		end

		it "o intervalo entre exercicio inicial e final não pode ser maior que 4 anos" do
			ppa = Ppa::Ppa.new
			ppa.exercicio_inicial = 2000
			ppa.exercicio_final = 2010
			ppa.save
			expect(ppa.errors[:exercicio_final]).to include 'deve ter 4 anos de diferença para o Exercício Inicial'
		end

		it "não pode passar uma data da legislação que não exista" do
			ppa = Ppa::Ppa.new( data_da_legislacao: '32/01/2016' )
			ppa.save

			expect(ppa.errors[:data_da_legislacao]).to include 'não é uma data válida'
		end
	end

	describe "#after_create" do
		before(:each) do
			allow(Rails.env).to receive(:test?).and_return( false )
		end

		it "cria suas funções" do
			expect {
				FactoryBot.create(:ppa_fortaleza_2014)
			}.to change(Ppa::Funcao, :count).by(29)
		end

		it "cria suas subfunções" do
			expect {
				FactoryBot.create(:ppa_fortaleza_2014)
			}.to change(Ppa::SubFuncao, :count).by(111)
		end

		it "cria eixos" do
			expect {
				FactoryBot.create(:ppa_fortaleza_2014)
			}.to change(Ppa::Eixo, :count).by(1)
		end

		it "cria areas tematicas" do
			expect {
				FactoryBot.create(:ppa_fortaleza_2014)
			}.to change(Ppa::AreaTematica, :count).by(4)
		end
	end

	describe "#periodo" do
		it "retorna o range entre exercicio inicial e exercicio final" do
			ppa = Ppa::Ppa.new
			ppa.exercicio_inicial = 2000
			ppa.exercicio_final = 2003
			expect( ppa.periodo ).to eq 2000..2003
		end
	end

	describe "#configuracoes" do
		it "retorna suas configurações" do
			ppa = FactoryBot.create(:ppa_fortaleza_2014)
			expect( ppa.configuracoes ).to be_a(RailsSettings::SettingObject)
			expect( ppa.configuracoes .target_id ).to eq ppa.id
		end
	end

	describe "#detalha_despesas_na_iniciativa?" do
		it "retorna o valor armazenado nas configurações" do
			ppa = FactoryBot.create(:ppa_fortaleza_2014)
			expect( ppa.detalha_despesas_nas_iniciativas? ).to be false

			ppa.configuracoes.detalhar_despesas_nas_iniciativas = true
			ppa.configuracoes.save
			expect( ppa.detalha_despesas_nas_iniciativas? ).to be true
		end
	end

	describe '#detalhar_despesas_na_iniciativa!' do
		context "quando não há nenhuma iniciativa para aquele programa" do
			before(:each) do
				@ppa = FactoryBot.create(:ppa_fortaleza_2014)
			end
			it "configura detalhar_despesas_na_iniciativa para true" do
				@ppa.detalhar_despesas_nas_iniciativas!
				expect(  @ppa.configuracoes.detalhar_despesas_nas_iniciativas ).to be true
			end

			it "retorna true" do
				expect(  @ppa.detalhar_despesas_nas_iniciativas! ).to be true
			end
		end

		context "quando há inciativas cadastradas para aquele programa" do
			cria_tipos_de_despesa
			before(:each) do
				@ppa = FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental).ppa
			end
			it "mantém detalhar_despesas_na_iniciativa com valor false" do
				@ppa.detalhar_despesas_nas_iniciativas!
				expect( @ppa.configuracoes.detalhar_despesas_nas_iniciativas ).to be false
			end

			it "retorna false" do
				expect(  @ppa.detalhar_despesas_nas_iniciativas! ).to be_falsy
			end
		end
	end

	describe "#tem_iniciativas?" do
		context "quando tem iniciativas" do
			cria_tipos_de_despesa

			it "retorna true" do
				ppa = FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental).ppa

				expect( ppa.tem_iniciativas? ).to be true
			end
		end

		context "quando não tem iniciativas" do
			it "retorna false" do
				ppa = FactoryBot.create(:ppa_fortaleza_2014)

				expect( ppa.tem_iniciativas? ).to be false
			end
		end
	end

	describe "Retorna valor total das despesas" do
		cria_tipos_de_despesa

		before(:each) {
			valor_de_cada_despesa_por_exercicio = {
					"2014" => 100,
					"2015" => 200,
					"2016" => 300,
					"2017" => 400
			}
		iniciativa = FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental)
				FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental, codigo: '200', descricao: 'iniciativa 2')

				Ppa::ProjecaoDeDespesa.where(
					unidade_orcamentaria_id: iniciativa.unidade_orcamentaria_id,
					orcador_id: iniciativa.programa.id,
					orcador_type: 'Ppa::Programa'
				).each do |despesa|
					despesa.update( valor: valor_de_cada_despesa_por_exercicio[despesa.exercicio.to_s])
				end
		}

		context '#valor_total_da_despesas' do
			it 'retorna o valor total de todas as despesas do ppa' do
				expect( Ppa::Ppa.first.valor_total_da_despesa ).to eq 2000
			end
		end

		context '#valor_total_da_despesa_por_exercicio' do
			it 'retorna o valor total do ppa por exercicio' do
				expect( Ppa::Ppa.first.valor_total_da_despesa_por_exercicio(Ppa::Ppa.first.exercicio_inicial) ).to eq "200.00"
			end
		end
	end

	describe 'convenios > valores do convênio' do
		before(:each) {

			FactoryBot.create( :despesa_corrente )
			FactoryBot.create( :despesa_de_capital )

			@ppa = FactoryBot.create( :ppa_fortaleza_2014 )
			@convenio = FactoryBot.build( :ppa_convenio, ppa_id: @ppa.id )
			@convenio.save

			atributos =  {
				'valor': 80,
				"valores_do_convenio_attributes" => {}
			}

			valores_do_convenio = []

			@convenio.valores_do_convenio.each_with_index do |valor_do_convenio, index|

				valores_do_convenio[index] =  {
					"id" => valor_do_convenio.id,
					"valor" => "10"
				}

			end

			atributos['valores_do_convenio_attributes'] = valores_do_convenio
			@convenio.update( atributos )
		}

		context '#total_geral_de_previsao_de_convenios' do
			it 'retorna o total_geral_de_previsao_de_convenios' do
				expect(@ppa.total_geral_de_previsao_de_convenios).to eq 80.0
			end
		end

		context '#total_previsao_de_convenios_correntes' do
			it 'retorna o total_previsao_de_convenios_correntes' do
				expect(@ppa.total_previsao_de_convenios_correntes).to eq 40.0
			end
		end

		context '#total_previsao_de_convenios_de_capital' do
			it 'retorna o total_previsao_de_convenios_de_capital' do
				expect(@ppa.total_previsao_de_convenios_de_capital).to eq 40.0
			end
		end

		context '#total_geral_de_previsao_de_convenios_por_exercicio' do
			it 'retorna o total_geral_de_previsao_de_convenios_por_exercicio' do
				expect(@ppa.total_geral_de_previsao_de_convenios_por_exercicio( 2016 )).to eq 20.0
			end
		end

		context '#total_previsao_de_convenios_correntes_por_exercicio' do
			it 'retorna o total_previsao_de_convenios_correntes_por_exercicio' do
				expect(@ppa.total_previsao_de_convenios_correntes_por_exercicio( 2016 )).to eq 10.0
			end
		end

		context '#total_previsao_de_convenios_de_capital_por_exercicio' do
			it 'retornar o total_previsao_de_convenios_de_capital_por_exercicio' do
				expect(@ppa.total_previsao_de_convenios_de_capital_por_exercicio( 2016 )).to eq 10.0
			end
		end
	end

	describe '#possui_eixo_com_diretrizes?' do
		context 'quando possui diretriz' do
			it 'retorna true' do
				eixo = FactoryBot.create( :eixo_sustentavel, :ppa_2014 )
				expect(eixo.ppa.possui_eixo_com_diretrizes?).to eq true
			end
		end

		context 'quando não possui diretriz' do
			it 'retorna false' do
				eixo = FactoryBot.create( :eixo_sustentavel, :ppa_2014, diretrizes: [] )
				expect(eixo.ppa.possui_eixo_com_diretrizes?).to eq false
			end
		end
	end

	describe '#titulo_para_relatorio_ppa' do
		context 'quando não tem data de legislação' do
			it 'retorna titulo informando ppa como projeto de lei' do
				ppa = FactoryBot.build(:ppa_fortaleza_2014, data_da_legislacao: nil)
				expect(ppa.titulo_para_relatorio_ppa).to eq 'Projeto de Lei Plano Plurianual 2014 / 2017'
			end
		end

		context 'quando tem data de legislação' do
			it 'retorna titulo informando ppa já finalizado' do
				ppa = FactoryBot.build(:ppa_fortaleza_2014)
				expect(ppa.titulo_para_relatorio_ppa).to eq 'Projeto de Lei Plano Plurianual 2014 / 2017'
			end
		end
	end

	describe '#orgaos_que_participam_da_elaboracao_do_ppa' do
		context 'quando possui orgãos que participam do ppa' do
			it 'retorna orgãos participativos' do
				orgao = FactoryBot.create(:orgao_secretaria_da_fazenda, :ppa_2014, participa_da_elaboracao_do_ppa: true, secretario: 'Tonho Gonzales')
				expect(orgao.ppa.orgaos_que_participam_da_elaboracao_do_ppa).to include (orgao)
			end
		end
	end

	describe 'validate_presence_of :legislacao' do
		context 'quando data da legislação é preenchida, valida presença' do
			subject { FactoryBot.build(:ppa_fortaleza_2014, data_da_legislacao: '30/03/2014', legislacao: nil) }
			it{ is_expected.to validate_presence_of :legislacao }
		end

		context 'quando data da legislação é preenchida, não valida presença' do
			subject { FactoryBot.build(:ppa_fortaleza_2014, data_da_legislacao: nil, legislacao: nil) }
			it{ is_expected.not_to validate_presence_of :legislacao }
		end
	end

	describe 'validate_presence_of :data_da_legislacao' do
		context 'quando legislacao é preenchida, valida presença' do
			subject { FactoryBot.build(:ppa_fortaleza_2014, data_da_legislacao: nil, legislacao: '123.32') }
			it{ is_expected.to validate_presence_of :data_da_legislacao }
		end

		context 'quando legislação é preenchida, não valida presença' do
			subject { FactoryBot.build(:ppa_fortaleza_2014, data_da_legislacao: nil, legislacao: nil) }
			it { is_expected.not_to validate_presence_of :data_da_legislacao }
		end
	end

	describe '#programas_invalidos' do
		context 'quando não há objetivo em um programa' do
			it 'retorna dados com programa e sem objetivo' do
				programa = FactoryBot.create(:programa_saude, :ppa_2014)
				expect(programa.ppa.programas_invalidos.first['ppa_id']).to eq programa.ppa.id
				expect(programa.ppa.programas_invalidos.first['programa_id']).to eq programa.id
				expect(programa.ppa.programas_invalidos.first['programa_codigo']).to eq programa.tipo_de_programa_id.to_s + programa.codigo.to_s
				expect(programa.ppa.programas_invalidos.first['objetivo_id']).to eq nil
			end
		end

		context 'quando os programas estão criados corretamente' do
			cria_tipos_de_despesa
			it 'não retorna dados' do
				unidade = FactoryBot.create(:unidade_de_medida)
				meta = FactoryBot.create(:meta_contratar_profissionais_para_ppa_atual)
				iniciativa = FactoryBot.create(:ppa_iniciativa_para_ensino_fundamental, objetivo_id: Ppa::Ppa.first.programas.first.objetivos.first.id)
				quantitativo = meta.quantitativos.first
				quantitativo.update(unidade_de_medida_id: unidade.id, indice_de_referencia: 100)
				FactoryBot.create(:indicador_escolas_construidas, :ppa_atual, programa_id: iniciativa.objetivo[:programa_id])

				ppa = iniciativa.objetivo.programa.ppa
				expect(ppa.programas_invalidos).to eq []
			end
		end
	end

	describe '#tem_contexto?' do
		context 'quando não há contexto cadastrado' do
			it 'retorna falso' do
				ppa = FactoryBot.create(:ppa_fortaleza_2014)
				expect(ppa.tem_contexto?).to eq false
			end
		end
	end

	describe 'ppa_participativo' do
		describe '#validar_termos_de_uso_vazio' do
			context 'quando os termos de uso estão vazios e está habilitado' do
				it 'retorna mensagem de erro' do
					ppa = FactoryBot.create :ppa_fortaleza_2014, ppa_participativo_ativo: true
					ppa.update(habilitar_termos_de_uso: true, termos_de_uso: "")
					expect(ppa.errors[:termos_de_uso]).to include "Você não pode habilitar os termos de uso sem escreve-los."
				end
			end
		end

		describe 'validates_each de abertura do período' do
			context 'quando a data de abertura do perído de propostas é menor que a data do dia' do
				it 'retorna mensagem de erro' do
					travel_to Date.parse('03/01/2017')
					ppa = FactoryBot.create :ppa_fortaleza_2014, ppa_participativo_ativo: true
					ppa.update(abertura_do_periodo_de_propostas: '01/01/2017', fim_do_periodo_de_propostas: '29/01/2017')

					expect(ppa.errors[:abertura_do_periodo_de_propostas]).to include "início do período deve ser maior ou igual a data de hoje (03/01/2017)"
					travel_back
				end
			end

			context 'quando a data de abertura do perído de votação é menor que a data do dia' do
				it 'retorna mensagem de erro' do
					travel_to Date.parse('03/01/2017')
					ppa = FactoryBot.create :ppa_fortaleza_2014, ppa_participativo_ativo: true
					ppa.update(abertura_do_periodo_de_votacao: '01/01/2017', fim_do_periodo_de_votacao: '29/01/2017')

					expect(ppa.errors[:abertura_do_periodo_de_votacao]).to include "início do período deve ser maior ou igual a data de hoje (03/01/2017)"
					travel_back
				end
			end

			context 'quando a data de abertura do perído e fim do periodo de votação é retirada' do
				it 'não retorna mensagens de erro' do
					travel_to Date.parse('03/01/2017')
					ppa = FactoryBot.create :ppa_fortaleza_2014, ppa_participativo_ativo: true
					ppa.update(abertura_do_periodo_de_votacao: '05/01/2017', fim_do_periodo_de_votacao: '29/01/2017')
					ppa.update(abertura_do_periodo_de_votacao: nil, fim_do_periodo_de_votacao: nil)
					expect(ppa.errors.first).to eq nil
					travel_back
				end
			end
		end

		describe "#inclui_chamadas_de_redes_sociais" do
			context "PPA é novo" do
				it "retorna mensagem padrão" do
					ppa = FactoryBot.build(:ppa_fortaleza_2014)
					expect( ppa.chamada_para_envio_de_propostas ).to eq "Envie sua proposta e seja parceiro no planejamento de governo."
					expect( ppa.chamada_para_votacao_de_propostas ).to eq "Ajude seu município a escolher as melhores propostas, participe da votação!"
				end
			end

			context "PPA está sendo editado" do
				it "retorna mensagem nova" do
					ppa = FactoryBot.build(:ppa_fortaleza_2014)
					ppa.chamada_para_envio_de_propostas = "Envie!"
					ppa.chamada_para_votacao_de_propostas = "Vote!"
					ppa.save!
					ppa = Ppa::Ppa.last
					expect( ppa.chamada_para_envio_de_propostas ).to eq "Envie!"
					expect( ppa.chamada_para_votacao_de_propostas ).to eq "Vote!"
				end
			end
		end

		describe '#data_maior_e_ou_menor_que' do
			context 'quando o período de abertura é maior que o fim' do
				it 'retorna mensagem de erro' do
					travel_to Date.parse('01/01/2017')
					ppa = FactoryBot.build :ppa_fortaleza_2014, abertura_do_periodo_de_propostas: '05/01/2017', fim_do_periodo_de_propostas: '04/01/2017', abertura_do_periodo_de_votacao: '03/01/2017', fim_do_periodo_de_votacao: '02/01/2017'
					ppa.save
					expect(ppa.errors[:abertura_do_periodo_de_propostas]).to include 'início do período de propostas deve ser menor que o término do período de propostas'
					# expect(ppa.errors[:fim_do_periodo_de_propostas]).to include 'término do período de propostas deve ser menor que o início do período de votação'
					expect(ppa.errors[:abertura_do_periodo_de_votacao]).to include 'início do período de votação deve ser menor que o término do período de votação'
					travel_back
				end
			end
		end

		describe '#iniciar_projecao' do
			context ' depois de criar o ppa deve criar a projecao' do
				it 'retorna mensagem de sucesso' do
					ppa = Ppa::Ppa.create(FactoryBot.attributes_for :ppa_fortaleza_2014)
					expect(ppa.projecao_de_receita).not_to be_nil
				end
			end
		end
	end

	# describe '#votacao_proposta_impedido_de_salvar_ao_mesmo_tempo' do
	# 	context 'impede de liberar votação e propostas ao mesmo tempo' do
	# 		it 'retorna mensagem' do
	# 			ppa = Ppa::Ppa.new(FactoryBot.attributes_for :ppa_fortaleza_2014, abertura_do_periodo_de_propostas: '05/01/2017', fim_do_periodo_de_propostas: '04/01/2017', abertura_do_periodo_de_votacao: '17/05/2017', fim_do_periodo_de_votacao: '21/05/2017', libera_votacao: true, libera_propostas: true)
	# 			ppa.save
	# 			expect(ppa.errors[:libera_votacao]).to include 'Impossível liberar propostas e votação ao mesmo tempo.'
	# 			expect(ppa.errors[:libera_propostas]).to include 'Impossível liberar propostas e votação ao mesmo tempo.'
	# 		end
	# 	end
	# end

	describe '#abrir_votacao' do
		context 'Verifica se votacao foi aberta com sucesso' do
			it 'retorna mensagem de sucesso' do
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014)
				mensagem = ppa.abrir_votacao
				expect(mensagem).to eq "Período de votação liberado com sucesso."
				expect(ppa.libera_votacao).to be_truthy
			end
		end

		# context 'verifica se envio de propostas foi fechada com sucesso' do
		# 	it 'retorna falso' do
		# 		ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, libera_propostas: true)
		# 		ppa.abrir_votacao
		# 		expect(ppa.libera_propostas).to be_falsy
		# 	end
		# end

		context 'Período abertura de votação é depois do fim de votação' do
			it 'retorna mensagem de erro' do
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, libera_propostas: true, abertura_do_periodo_de_votacao: '01/01/2017', fim_do_periodo_de_votacao: '02/01/2017')
				mensagem = ppa.abrir_votacao
				expect(mensagem).to eq "Não foi possível liberar o período de votação pois o período estabelecido anteriormente já passou. Por favor, configure um novo período na tela de configurações do PPA Participativo."
			end
		end
		context 'caso data de abertura de votação for maior que fim do período de votação' do
			it 'retorna mensagem' do
				travel_to Date.parse('03/01/2017')
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, libera_propostas: true, abertura_do_periodo_de_votacao: '03/01/2017', fim_do_periodo_de_votacao: '02/01/2017')
				mensagem = ppa.abrir_votacao
				expect(mensagem).to include "Por favor, configure um novo período na tela de configurações do PPA Participativo."
				travel_back
			end
		end
	end

	describe '#fechar_votacao' do
		context 'Verifica se periodo de votacao foi fechado com sucesso' do
			it 'retorna uma mensagem de sucesso' do
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, libera_votacao: true)
				mensagem = ppa.fechar_votacao
				expect(ppa.libera_votacao).to be_falsy
				expect(mensagem).to eq "Período de votação fechado com sucesso."
			end
		end

		context 'Verifica se inicio do periodo esta nulo quando a data de abertura é a data de hoje' do
			it 'valida as datas' do
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, abertura_do_periodo_de_votacao: Date.today, fim_do_periodo_de_votacao: Date.today + 1)
				ppa.fechar_votacao
				expect(ppa.abertura_do_periodo_de_votacao).to be_nil
			end
		end

		context 'Verifica se fim do periodo esta nulo quando a data de abertura é a data de hoje' do
			it 'valida as datas' do
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, abertura_do_periodo_de_votacao: Date.today, fim_do_periodo_de_votacao: Date.today + 1)
				ppa.fechar_votacao
				expect(ppa.fim_do_periodo_de_votacao).to be_nil
			end
		end

		context 'Verifica se fim do periodo esta igual a data do dia anterior ao fechamento' do
			it 'valida as datas' do
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, abertura_do_periodo_de_votacao: Date.today + 1, fim_do_periodo_de_votacao: Date.today + 3)
				ppa.fechar_votacao
				expect(ppa.fim_do_periodo_de_votacao).to eq Date.current - 1
			end
		end
	end

	describe '#abrir_propostas' do
		context 'Verifica se proposta foi aberto com sucesso' do
			it 'retorna mensagem de sucesso' do
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014)
				mensagem = ppa.abrir_propostas
				expect(mensagem).to eq "Período de envio de propostas aberto com sucesso."
				expect(ppa.libera_propostas).to be_truthy
			end
		end

		# context 'Verifica se votacao foi fechado com sucesso' do
		# 	it 'retorna falso' do
		# 		ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, libera_votacao: true)
		# 		ppa.abrir_propostas
		# 		expect(ppa.libera_votacao).to be false
		# 	end
		# end

		context 'Período estabelecido anteriormente já passou' do
			it 'retorna mensagem' do
				travel_to Date.parse('05/01/2017')
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, libera_votacao: true, abertura_do_periodo_de_propostas: '05/01/2017', fim_do_periodo_de_propostas: '04/01/2017')
				mensagem = ppa.abrir_propostas
				expect(mensagem).to eq "Não foi possível liberar o período de envio de propostas pois o período estabelecido anteriormente já passou. Por favor, configure um novo período na tela de configurações do PPA Participativo."
				travel_back
			end
		end
		context 'Período de abertura de propostas é maior que fim do período de propostas' do
			it 'retorna mensagem' do
				travel_to Date.parse('03/01/2017')
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, libera_votacao: true, abertura_do_periodo_de_propostas: '03/01/2017', fim_do_periodo_de_propostas: '02/01/2017')
				mensagem = ppa.abrir_propostas
				expect(mensagem).to include "Por favor, configure um novo período na tela de configurações do PPA Participativo."
				travel_back
			end
		end
	end

	describe '#fechar_propostas' do
		context 'Verifica se periodo de propostas foi fechado com sucesso' do
			it 'retorna uma mensagem de sucesso' do
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, libera_propostas: true)
				mensagem = ppa.fechar_propostas
				expect(mensagem).to eq "Período de propostas fechado com sucesso."
			end
		end

		context 'Verifica se inicio do periodo esta nulo quando a data de abertura é a data de hoje' do
			it 'valida as datas' do
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, abertura_do_periodo_de_propostas: Date.today, fim_do_periodo_de_propostas: Date.today + 1)
				ppa.fechar_propostas
				expect(ppa.abertura_do_periodo_de_propostas).to be_nil
			end
		end

		context 'Verifica se fim do periodo esta nulo quando a data de abertura é a data de hoje' do
			it 'valida as datas' do
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, abertura_do_periodo_de_propostas: Date.today, fim_do_periodo_de_propostas: Date.today + 1)
				ppa.fechar_propostas
				expect(ppa.fim_do_periodo_de_propostas).to be_nil
			end
		end

		context 'Verifica se fim do periodo esta igual a data do dia anterior ao fechamento' do
			it 'valida as datas' do
				ppa = Ppa::Ppa.find_or_create_by(FactoryBot.attributes_for :ppa_fortaleza_2014, abertura_do_periodo_de_propostas: Date.today + 1, fim_do_periodo_de_propostas: Date.today + 3)
				ppa.fechar_propostas
				expect(ppa.fim_do_periodo_de_propostas).to eq Date.current - 1
			end
		end
	end

	describe "#utiliza_novo_tipo_para_receita?" do
		context "quando exercicio_inicial do ppa é maior que 2018" do
			it "retorna true" do
				ppa = FactoryBot.build(:ppa_fortaleza_2020, exercicio_inicial: 2022, exercicio_final: 2025)
				expect(ppa.utiliza_novo_tipo_para_receita?).to eq true
			end
		end
		context "quando exercicio_inicial ppa é menor ou igual a 2018" do
			it "retorna false" do
				ppa = FactoryBot.build(:ppa_fortaleza_2014)
				expect(ppa.utiliza_novo_tipo_para_receita?).to eq false
			end
		end
	end
end
