require 'rails_helper'

RSpec.describe Contabilidade::AnulacaoDoEmpenho, type: :model do
	it{ is_expected.to have_many(:vistos).class_name("Controladoria::Visto") }

	describe "#enviar_para_controladoria" do
		context "Quando envia" do
			context "status solicitado" do
				it "Quando configuração está habiltiada" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: true)
					expect(anulacao).to transition_from(:solicitado).to(:enviado_para_controladoria).on_event(:enviar_para_controladoria)
				end
			end
		end
		context "Quando não envia" do
			context "status solicitado" do
				it "Quando configuração está desabiltiada" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: false)
					expect(anulacao).to_not transition_from(:solicitado).to(:enviado_para_controladoria).on_event(:enviar_para_controladoria)
				end
			end
		end
	end

	describe "#retornar_para_administrativo" do
		context "Quando envia" do
			context "status enviado_para_controladoria" do
				it "Foi reprovado pela controladoria" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_controladoria)
					anulacao.save(validate:false)
					FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: false, vistoriavel_id: anulacao.id, vistoriavel_type: "Contabilidade::AnulacaoDoEmpenho").save(validate: false)
					expect(anulacao).to transition_from(:enviado_para_controladoria).to(:solicitado).on_event(:retornar_para_administrativo)
				end
			end
			context "status enviado_para_contabilidade" do
				it "apenas status enviado_para_contabilidade" do
							anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_contabilidade)
							expect(anulacao).to transition_from(:enviado_para_contabilidade).to(:solicitado).on_event(:retornar_para_administrativo)
					end
			end
		end
		context "Quando não envia" do
			context "status enviado_para_controladoria" do
				it "Foi aprovado pela controladoria" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_controladoria)
					anulacao.save(validate:false)
					FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: anulacao.id, vistoriavel_type: "Contabilidade::AnulacaoDoEmpenho").save(validate: false)
					expect(anulacao).to_not transition_from(:enviado_para_controladoria).to(:solicitado).on_event(:retornar_para_administrativo)
				end
				it "Não possui visto" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_controladoria)
					expect(anulacao).to_not transition_from(:enviado_para_controladoria).to(:solicitado).on_event(:retornar_para_administrativo)
				end
			end
		end
	end

	describe "#receber" do
		context "Quando recebe" do
			context "status enviado_para_contabilidade" do
				it "apenas status enviado_para_contabilidade" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_contabilidade)
					expect(anulacao).to transition_from(:enviado_para_contabilidade).to(:recebido).on_event(:receber)
				end
			end
		end
	end


	describe "#confirmar" do
		context "Quando confirma" do
			context "status solicitado" do
				it "Configuração envia_empenho_para_controladoria e envia_empenho_para_contabilidade estão desabiltiadas" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: false, envia_empenho_para_contabilidade: false)
					expect(anulacao).to transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
				end
			end
			context "status enviado_para_administrativo" do
				it "apenas o status" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_administrativo)
					expect(anulacao).to transition_from(:enviado_para_administrativo).to(:confirmado).on_event(:confirmar)
				end
			end
			context "status recebido" do
				it "apenas o status" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :recebido)
					expect(anulacao).to transition_from(:recebido).to(:confirmado).on_event(:confirmar)
				end
			end
		end
		context "Quando não confirma" do
			context "status solicitado" do
				it "Configuração envia_empenho_para_controladoria habiltiada" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: true, envia_empenho_para_contabilidade: false)
					expect(anulacao).to_not transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
				end
				it "Configuração envia_empenho_para_contabilidade habilitada" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_controladoria: false, envia_empenho_para_contabilidade: true)
					expect(anulacao).to_not transition_from(:solicitado).to(:confirmado).on_event(:confirmar)
				end
			end
		end
	end

	describe "#enviar_para_administrativo" do
		context "Quando envia" do
			context "status enviado_para_controladoria" do
				it "Aprovado pela controladoria e Configuração envia_empenho_para_contabilidade desabilitada " do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_controladoria)
					anulacao.save(validate: false)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false)
					FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: anulacao.id, vistoriavel_type: "Contabilidade::AnulacaoDoEmpenho").save(validate: false)
					expect(anulacao).to transition_from(:enviado_para_controladoria).to(:enviado_para_administrativo).on_event(:enviar_para_administrativo)
				end
			end
		end
		context "Quando não envia" do
			context "status enviado_para_controladoria" do
				it "reprovrado pela controladoria" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_controladoria)
					anulacao.save(validate: false)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false)
					FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: false, vistoriavel_id: anulacao.id, vistoriavel_type: "Contabilidade::AnulacaoDoEmpenho").save(validate: false)
					expect(anulacao).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_administrativo).on_event(:enviar_para_administrativo)
				end
				it "não tem visto" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_controladoria)
					anulacao.save(validate: false)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false)
					expect(anulacao).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_administrativo).on_event(:enviar_para_administrativo)
				end
				it "Configuração envia_empenho_para_contabilidade habilitada" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_controladoria)
					anulacao.save(validate: false)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
					FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: anulacao.id, vistoriavel_type: "Contabilidade::AnulacaoDoEmpenho").save(validate: false)
					expect(anulacao).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_administrativo).on_event(:enviar_para_administrativo)
				end
			end
		end
	end

	describe "#enviar_para_contabilidade" do
		context "Quando envia" do
			context "status solicitado" do
				it "Configuração envia_empenho_para_contabilidade habilitada e envia_empenho_para_controladoria desabilitada" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true, envia_empenho_para_controladoria: false)
					expect(anulacao).to transition_from(:solicitado).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
			end
			context "status enviado_para_controladoria" do
				it "Visto aprovado pela controladoria e Configuração envia_empenho_para_contabilidade habilitada" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_controladoria)
					anulacao.save(validate: false)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
					FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: anulacao.id, vistoriavel_type: "Contabilidade::AnulacaoDoEmpenho").save(validate: false)
					expect(anulacao).to transition_from(:enviado_para_controladoria).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
			end
		end
		context "Quando não envia" do
			context "status solicitado" do
				it "Configuração envia_empenho_para_contabilidade desabilitada" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false, envia_empenho_para_controladoria: false)
					expect(anulacao).to_not transition_from(:solicitado).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
				it "Configuração envia_empenho_para_controladoria habilitada" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :solicitado)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true, envia_empenho_para_controladoria: true)
					expect(anulacao).to_not transition_from(:solicitado).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
			end
			context "status enviado_para_controladoria" do
				it "Visto reaprovado pela controladoria " do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_controladoria)
					anulacao.save(validate: false)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
					FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: false, vistoriavel_id: anulacao.id, vistoriavel_type: "Contabilidade::AnulacaoDoEmpenho").save(validate: false)
					expect(anulacao).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
				it "Sem visto" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_controladoria)
					anulacao.save(validate: false)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: true)
					expect(anulacao).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
				it "Confguraçao desabilitada" do
					anulacao = FactoryBot.build(:anulacao_do_empenho_total, status: :enviado_para_controladoria)
					anulacao.save(validate: false)
					FactoryBot.create(:configuracao, envia_empenho_para_contabilidade: false)
					FactoryBot.build(:controladoria_visto, tipo: :controladoria, aprovado: true, vistoriavel_id: anulacao.id, vistoriavel_type: "Contabilidade::AnulacaoDoEmpenho").save(validate: false)
					expect(anulacao).to_not transition_from(:enviado_para_controladoria).to(:enviado_para_contabilidade).on_event(:enviar_para_contabilidade)
				end
			end
		end
	end
end
