From f1576329d70d030c4e9c418bbea0fa0d4526f17f Mon Sep 17 00:00:00 2001 From: Bogdan Irimie Date: Wed, 1 Apr 2020 15:41:02 +0300 Subject: [PATCH] (FACT-2499) Add test to check that each fact is loaded only once, even if it is requested by multiple searched facts. --- .../internal/internal_fact_manager_spec.rb | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/spec/framework/core/fact/internal/internal_fact_manager_spec.rb b/spec/framework/core/fact/internal/internal_fact_manager_spec.rb index 3ecc30536..d1c093cb8 100644 --- a/spec/framework/core/fact/internal/internal_fact_manager_spec.rb +++ b/spec/framework/core/fact/internal/internal_fact_manager_spec.rb @@ -1,11 +1,12 @@ # frozen_string_literal: true describe Facter::InternalFactManager do + let(:internal_fact_manager) { Facter::InternalFactManager.new } + let(:os_name_class_spy) { class_spy(Facts::Debian::Os::Name) } + let(:os_name_instance_spy) { instance_spy(Facts::Debian::Os::Name) } + describe '#resolve_facts' do it 'resolved one core fact' do - os_name_class_spy = class_spy(Facts::Debian::Os::Name) - os_name_instance_spy = instance_spy(Facts::Debian::Os::Name) - resolved_fact = mock_resolved_fact('os', 'Ubuntu', nil, []) allow(os_name_class_spy).to receive(:new).and_return(os_name_instance_spy) @@ -14,8 +15,7 @@ searched_fact = instance_spy(Facter::SearchedFact, name: 'os', fact_class: os_name_class_spy, filter_tokens: [], user_query: '', type: :core) - core_fact_manager = Facter::InternalFactManager.new - resolved_facts = core_fact_manager.resolve_facts([searched_fact]) + resolved_facts = internal_fact_manager.resolve_facts([searched_fact]) expect(resolved_facts).to eq([resolved_fact]) end @@ -32,10 +32,31 @@ searched_fact = instance_spy(Facter::SearchedFact, name: 'network_.*', fact_class: networking_interface_class_spy, filter_tokens: [], user_query: '', type: :core) - core_fact_manager = Facter::InternalFactManager.new - resolved_facts = core_fact_manager.resolve_facts([searched_fact]) + resolved_facts = internal_fact_manager.resolve_facts([searched_fact]) expect(resolved_facts).to eq([resolved_fact]) end + + context 'when there are multiple search facts pointing to the same fact' do + before do + resolved_fact = mock_resolved_fact('os', 'Ubuntu', nil, []) + + allow(os_name_class_spy).to receive(:new).and_return(os_name_instance_spy) + allow(os_name_instance_spy).to receive(:call_the_resolver).and_return(resolved_fact) + + searched_fact = instance_spy(Facter::SearchedFact, name: 'os.name', fact_class: os_name_class_spy, + filter_tokens: [], user_query: '', type: :core) + + searched_fact_with_alias = instance_spy(Facter::SearchedFact, name: 'operatingsystem', + fact_class: os_name_class_spy, filter_tokens: [], + user_query: '', type: :core) + + internal_fact_manager.resolve_facts([searched_fact, searched_fact_with_alias]) + end + + it 'resolves the fact only once' do + expect(os_name_instance_spy).to have_received(:call_the_resolver).once + end + end end end