require 'rails_helper'

RSpec.describe Usuario, type: :model do
	it { is_expected.to belong_to :perfil }
	it { is_expected.to have_one(:agente_publico_municipal).class_name('Base::AgentePublicoMunicipal')}
	it { is_expected.to have_many(:mensagens_do_usuario).class_name('Comunicacao::MensagemDoUsuario')}
	it { is_expected.to have_many(:unidades_orcamentarias_por_usuario)}
	it { is_expected.to have_many(:unidades_orcamentarias).through(:unidades_orcamentarias_por_usuario).class_name('Loa::UnidadeOrcamentaria')}

	it_behaves_like "mantem orcamento"

	[:nome_de_usuario, :nome_completo].each do |atributo|
		it {
			FactoryBot.create(:admin)
			is_expected.to validate_uniqueness_of atributo
		}
	end

	[:email, :nome_de_usuario, :nome_completo, :perfil_id, :nivel_de_permissao_a_unidades].each do |attr|
		it { is_expected.to validate_presence_of attr }
	end

	it { is_expected.to validate_presence_of(:cpf).with_message('CPF não pode ficar vazio') }

	it { is_expected.to delegate_method(:administrador?).to(:perfil) }

	describe '#deve_acessar_todas_as_unidades' do
		it 'retorna mensagem de erro se for comissao ou compra' do
			perfil = FactoryBot.create( :perfil_setor_compra )
			usuario =  Usuario.find_or_create_by(FactoryBot.attributes_for( :usuario_comum, perfil_id: perfil.id ))
			usuario.update(nivel_de_permissao_a_unidades: 'unidades_selecionadas')
			expect(usuario.errors[:nivel_de_permissao_a_unidades]).to include("Usuário com perfil Setor de Compras ou devem acessar todas as unidades")
		end
		it 'não retorna mensagem de erro se não for comissao ou compra' do
			perfil = FactoryBot.create( :perfil_administrador )
			usuario = Usuario.find_or_create_by(FactoryBot.attributes_for( :usuario_comum, perfil_id: perfil.id ))
			usuario.update(nivel_de_permissao_a_unidades: 'unidades_selecionadas')
			expect(usuario.errors[:nivel_de_permissao_a_unidades]).to_not include("Usuário com perfil Setor de Compras ou devem acessar todas as unidades")
		end
	end

	# No momento os niveis de permissão a unidade estão apenas no controllers. 
	# O código foi comentado para uma futura correção, quando os níveis dos usuários saírem dos controllers

	# describe '#atualiza_unidades_do_usuario' do
	# 	context 'quando o usuário é criado com todas as unidades' do
	# 		it 'usuario é ligado a todas as unidades' do
	# 			usuario = Usuario.find_or_create_by(FactoryBot.attributes_for(:usuario_comum, nivel_de_permissao_a_unidades: :todas_as_unidades ))
	# 			expect(usuario.unidades_orcamentarias_por_usuario.count).to eq 0
	# 		end
	# 		context 'e é atualizado para nenhuma unidade' do
	# 			it 'usuário perde todas as unidades' do
	# 				unidades = 3.times { Loa::UnidadeOrcamentaria.new.save!(validate: false) }
	# 				usuario = Usuario.find_or_create_by(FactoryBot.attributes_for( :usuario_comum, nivel_de_permissao_a_unidades: :todas_as_unidades ))
	# 				expect {
	# 					usuario.update(nivel_de_permissao_a_unidades: :nenhuma_unidade)
	# 				}.to change(usuario.unidades_orcamentarias_por_usuario, :count).from(0).to(0)
	# 			end
	# 		end
	# 	end
	# end
end
