require 'rails_helper'

RSpec.describe Base::Item, type: :model do
	it{ is_expected.to belong_to( :unidade_de_medida ).required }
	it{ is_expected.to belong_to( :ncm ) }
	it{ is_expected.to belong_to( :categoria ) }

	[:descricao, :unidade_de_medida_id, :categoria_id].each do |atributo|
		it{ is_expected.to validate_presence_of atributo }
	end

	it{ is_expected.to validate_uniqueness_of( :descricao ).scoped_to(:categoria_id).case_insensitive.with_message("Item já cadastrado nessa mesma categoria.") }
	# descricao falha no teste com shoulda matchers
	# it{ is_expected.to validate_uniqueness_of( :ncm_id ).scoped_to(:descricao, :categoria_id).allow_blank.with_message("Ncm já está em uso para esse item, nessa mesma categoria") }

	describe '#codigo_na_prefeitura_composto_por_numeros?' do
		context 'quando a string é composta por números' do
			it 'salva' do
				item = FactoryBot.build(:caderno, codigo_na_prefeitura: "01")
				item.save
				expect(item).to be_persisted
			end
		end
		context 'quando a string não é composta por números' do
			it 'retorna erro' do
				item = FactoryBot.build(:caderno, codigo_na_prefeitura: "a")
				item.save
				expect(item.errors[:codigo_na_prefeitura]).to include("deve ser numérico")
			end
		end
		context 'quando a string é composta por número negativo' do
			it 'retorna erro' do
				item = FactoryBot.build(:caderno, codigo_na_prefeitura: "-2")
				item.save
				expect(item.errors[:codigo_na_prefeitura]).to include("deve ser numérico")
			end
		end
	end

	describe '#validates_associated :categoria' do
		describe '#nao_deve_possuir_itens_e_categorias' do
			context 'quando possui categorias e tenta salvar um item' do
				it 'retorna erro' do
					categoria = FactoryBot.create :categoria
					categoria.subcategorias.build.save(validate: false)
					item = categoria.itens.build
					item.validate
					expect(item).to_not be_valid
					expect(item.categoria.errors[:base]).to include("não pode possuir itens e categorias")
				end
			end
		end
	end
end
