Browse Source

Maintenance: Improve execution time of Elasticsearch related tests.

Florian Liebe 2 years ago
parent
commit
c3458133af

+ 1 - 1
.gitlab/ci/__includes__/variables.yml

@@ -19,7 +19,7 @@ variables:
   KEEP_ON_MAIL_SERVER_ACCOUNT: "zammad@mail.test.dc.zammad.com:zammad"
 
   # Settings for elasticsearch, if active
-  ES_INDEX_RAND: 'true'
+  ES_INDEX: 'estest.ci'
   ELASTICSEARCH_TAG: '7.16'
 
   # Temporary switch to enable the mobile front end for testing.

+ 3 - 1
app/models/concerns/has_search_index_backend.rb

@@ -208,7 +208,7 @@ reload search index with full data
 
 =end
 
-    def search_index_reload
+    def search_index_reload(silent: false)
       tolerance       = 10
       tolerance_count = 0
       query           = order(created_at: :desc)
@@ -227,6 +227,8 @@ reload search index with full data
           end
         end
 
+        next if silent
+
         record_count += 1
         if (record_count % batch_size).zero? || record_count == total
           print "\r    #{record_count}/#{total}" # rubocop:disable Rails/Output

+ 1 - 0
lib/tasks/zammad/search_index_es.rake

@@ -62,6 +62,7 @@ namespace :zammad do
     task refresh: %i[zammad:searchindex:version_supported] do
       print 'Refreshing all indexes... '
       SearchIndexBackend.refresh
+      puts 'done.'
     end
 
     desc 'Full re-creation of all search indexes and re-indexing of all data'

+ 1 - 2
spec/graphql/gql/queries/search_spec.rb

@@ -98,8 +98,7 @@ RSpec.describe Gql::Queries::Search, type: :graphql do
 
     context 'with search index', searchindex: true do
       let(:es_setup) do
-        configure_elasticsearch
-        rebuild_searchindex
+        searchindex_model_reload([::Ticket, ::User, ::Organization])
       end
 
       include_examples 'test search query'

+ 1 - 1
spec/lib/report/ticket_generic_time_spec.rb

@@ -369,7 +369,7 @@ RSpec.describe Report::TicketGenericTime, searchindex: true do
 
       ticket_with_category
 
-      rebuild_searchindex
+      searchindex_model_reload([::Ticket])
     end
 
     let(:ticket_with_category) do

+ 13 - 23
spec/lib/report_examples.rb

@@ -4,29 +4,19 @@ RSpec.shared_context 'with report examples' do
   before do |example|
     next if !example.metadata[:searchindex]
 
-    configure_elasticsearch(required: true, rebuild: true) do
-      ticket_1
-
-      ticket_2
-
-      ticket_3
-
-      ticket_4
-
-      ticket_5
-
-      ticket_6
-
-      ticket_7
-
-      ticket_8
-
-      ticket_9
-
-      ticket_after_72h
-
-      ticket_before_40d
-    end
+    ticket_1
+    ticket_2
+    ticket_3
+    ticket_4
+    ticket_5
+    ticket_6
+    ticket_7
+    ticket_8
+    ticket_9
+    ticket_after_72h
+    ticket_before_40d
+
+    searchindex_model_reload([::Ticket])
   end
 
   let(:group_1)  { Group.lookup(name: 'Users') }

+ 1 - 1
spec/lib/search_index_backend_spec.rb

@@ -7,7 +7,7 @@ RSpec.describe SearchIndexBackend do
   before do |example|
     next if !example.metadata[:searchindex]
 
-    configure_elasticsearch(required: true, rebuild: true)
+    searchindex_model_reload([::Ticket, ::User, ::Organization])
   end
 
   describe '.build_query' do

+ 23 - 9
spec/lib/search_knowledge_base_backend_spec.rb

@@ -16,13 +16,15 @@ RSpec.describe SearchKnowledgeBaseBackend do
     }
   end
 
-  context 'with ES', searchindex: true do
-    before do
-      configure_elasticsearch(required: true, rebuild: true) do
-        published_answer
-      end
+  def handle_elasticsearch(enabled)
+    if enabled
+      searchindex_model_reload([::KnowledgeBase::Translation, ::KnowledgeBase::Category::Translation, ::KnowledgeBase::Answer::Translation])
+    else
+      Setting.set('es_url', nil)
     end
+  end
 
+  context 'with ES', searchindex: true do
     describe '#search' do
       context 'when highlight enabled' do
         let(:options) do
@@ -34,6 +36,11 @@ RSpec.describe SearchKnowledgeBaseBackend do
           }
         end
 
+        before do
+          published_answer
+          handle_elasticsearch(true)
+        end
+
         # https://github.com/zammad/zammad/issues/3070
         it 'lists item with an attachment' do
           expect(instance.search('Hello World', user: user)).to be_present
@@ -64,7 +71,8 @@ RSpec.describe SearchKnowledgeBaseBackend do
       context "when elastic search is #{elasticsearch}", searchindex: elasticsearch do
         before do
           answers
-          configure_elasticsearch(required: true, rebuild: true) if elasticsearch
+
+          handle_elasticsearch(elasticsearch)
         end
 
         it 'first page is first 5 answers' do
@@ -104,10 +112,14 @@ RSpec.describe SearchKnowledgeBaseBackend do
   end
 
   context 'with successful API response' do
+    before do
+      published_answer
+    end
+
     shared_examples 'verify response' do |elasticsearch:|
       it "ID is an Integer when ES=#{elasticsearch}", searchindex: elasticsearch do
-        published_answer
-        configure_elasticsearch(required: true, rebuild: true) if elasticsearch
+        handle_elasticsearch(elasticsearch)
+
         first_result = instance.search(published_answer.translations.first.title, user: user).first
         expect(first_result[:id]).to be_a(Integer)
       end
@@ -136,7 +148,9 @@ RSpec.describe SearchKnowledgeBaseBackend do
       it "#{prefix} in #{ui} interface when ES=#{elasticsearch}", searchindex: elasticsearch do
         instance = expected_visibility_instance ui
         object
-        configure_elasticsearch(required: true, rebuild: true) if elasticsearch
+
+        handle_elasticsearch(elasticsearch)
+
         expect(instance.search(object.translations.first.title, user: user)).to is_visible ? be_present : be_blank
       end
     end

+ 4 - 3
spec/models/knowledge_base/answer/translation/search_with_attachment_spec.rb

@@ -13,9 +13,10 @@ RSpec.describe KnowledgeBase::Answer::Translation, type: :model, current_user_id
 
   context 'search with attachment' do
     before do
-      configure_elasticsearch(required: true, rebuild: true) do
-        published_answer.add_attachment File.open "spec/fixtures/files/upload/#{filename}"
-      end
+      published_answer
+      published_answer.add_attachment File.open "spec/fixtures/files/upload/#{filename}"
+
+      searchindex_model_reload([::KnowledgeBase::Translation, ::KnowledgeBase::Category::Translation, ::KnowledgeBase::Answer::Translation])
     end
 
     it do

+ 14 - 6
spec/models/knowledge_base/answer/translation_spec.rb

@@ -14,6 +14,14 @@ RSpec.describe KnowledgeBase::Answer::Translation, type: :model, current_user_id
   it { is_expected.to belong_to(:answer) }
   it { is_expected.to belong_to(:kb_locale) }
 
+  def handle_elasticsearch(enabled)
+    if enabled
+      searchindex_model_reload([::KnowledgeBase::Translation, ::KnowledgeBase::Category::Translation, ::KnowledgeBase::Answer::Translation])
+    else
+      Setting.set('es_url', nil)
+    end
+  end
+
   describe '.search' do
     include_context 'basic Knowledge Base'
 
@@ -23,10 +31,10 @@ RSpec.describe KnowledgeBase::Answer::Translation, type: :model, current_user_id
       it "#{prefix} #{trait} answer to #{user_id} when ES=#{elasticsearch}", searchindex: elasticsearch do
         user   = create(user_id)
         object = create(:knowledge_base_answer, trait, knowledge_base: knowledge_base)
-        configure_elasticsearch(required: true, rebuild: true) if elasticsearch
 
-        expect(described_class.search({ query: object.translations.first.title, current_user: user }))
-          .to is_visible ? be_present : be_blank
+        handle_elasticsearch(elasticsearch)
+
+        expect(described_class.search({ query: object.translations.first.title, current_user: user })).to is_visible ? be_present : be_blank
       end
     end
 
@@ -49,12 +57,12 @@ RSpec.describe KnowledgeBase::Answer::Translation, type: :model, current_user_id
     shared_examples 'verify multiple KBs support' do |elasticsearch:|
       it 'searches in multiple KBs', searchindex: elasticsearch do
         title = Faker::Appliance.equipment
-        user  = create(:admin)
 
         create_list(:knowledge_base_answer, 2, :published, translation_attributes: { title: title })
 
-        configure_elasticsearch(required: true, rebuild: true) if elasticsearch
-        expect(described_class.search({ query: title, current_user: user }).count).to be 2
+        handle_elasticsearch(elasticsearch)
+
+        expect(described_class.search({ query: title, current_user: create(:admin) }).count).to be 2
       end
     end
 

Some files were not shown because too many files changed in this diff