require 'rails_helper'

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

  it { is_expected.to belong_to(:convenio).required.inverse_of(:valores_do_convenio) }
  it { is_expected.to belong_to :tipo_de_despesa }

	[:convenio_id, :tipo_de_despesa_id, :exercicio, :valor].each do |campo|
		it { is_expected.to validate_presence_of campo }
	end

	it { is_expected.to validate_uniqueness_of( :exercicio ).scoped_to( :convenio_id, :tipo_de_despesa_id ) }

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

	describe "#save" do
		before(:each) {
			@convenio = FactoryBot.create( :ppa_convenio )
			@valor_do_convenio = Ppa::ValorDoConvenio.find_or_create_by!( FactoryBot.attributes_for( :ppa_valor_do_convenio, convenio_id: @convenio.id ) )
		}

		it "não permite alteração no exercicio" do
			@valor_do_convenio.exercicio = @valor_do_convenio.exercicio + 1
			@valor_do_convenio.save

			expect( @valor_do_convenio.errors[:exercicio] ).to include( 'não pode ser alterado' )
		end

		it "não permite alteração na convenio_id" do
			@valor_do_convenio.convenio_id = @valor_do_convenio.convenio_id + 1
			@valor_do_convenio.save

			expect( @valor_do_convenio.errors[:convenio_id] ).to include( 'não pode ser alterado' )
		end

		it "não permite alteração no tipo_de_despesa_id" do
			@valor_do_convenio.tipo_de_despesa_id = @valor_do_convenio.tipo_de_despesa_id + 1
			@valor_do_convenio.save

			expect( @valor_do_convenio.errors[:tipo_de_despesa_id] ).to include( 'não pode ser alterado' )
		end

		context 'se a soma dos valores do convenio for diferente do convenio' do
			it 'retorna erro' do
				@convenio.valor = 1000
				atributos =  {
					"valores_do_convenio_attributes" => {
						"0" => {
							"id" => @convenio.valores_do_convenio[0].id,
							"valor" => "100"
						},
						"1" => {
							"id" => @convenio.valores_do_convenio[1].id,
							"valor" => "300"
						}
					}
				}
				@convenio.update(atributos)
				expect(@convenio.errors[:"valores_do_convenio.valor"]).to include "a soma dos valores das previsões deve ser igual ao valor do convênio"
			end
		end

		context 'se a soma dos valores do convenio for igual ao do convenio' do
			it 'salva' do
				@convenio.valor = 400
				atributos =  {
					"valores_do_convenio_attributes" => {
						"0" => {
							"id" => @convenio.valores_do_convenio[0].id,
							"valor" => "100"
						},
						"1" => {
							"id" => @convenio.valores_do_convenio[1].id,
							"valor" => "300"
						}
					}
				}
				@convenio.update(atributos)
				expect(@convenio).to be_persisted
			end
		end
	end
end
