code.gitea.io/gitea@v1.22.3/modules/indexer/code/indexer_test.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package code
     5  
     6  import (
     7  	"context"
     8  	"os"
     9  	"testing"
    10  
    11  	"code.gitea.io/gitea/models/db"
    12  	"code.gitea.io/gitea/models/unittest"
    13  	"code.gitea.io/gitea/modules/git"
    14  	"code.gitea.io/gitea/modules/indexer/code/bleve"
    15  	"code.gitea.io/gitea/modules/indexer/code/elasticsearch"
    16  	"code.gitea.io/gitea/modules/indexer/code/internal"
    17  
    18  	_ "code.gitea.io/gitea/models"
    19  	_ "code.gitea.io/gitea/models/actions"
    20  	_ "code.gitea.io/gitea/models/activities"
    21  
    22  	"github.com/stretchr/testify/assert"
    23  )
    24  
    25  func TestMain(m *testing.M) {
    26  	unittest.MainTest(m)
    27  }
    28  
    29  func testIndexer(name string, t *testing.T, indexer internal.Indexer) {
    30  	t.Run(name, func(t *testing.T) {
    31  		var repoID int64 = 1
    32  		err := index(git.DefaultContext, indexer, repoID)
    33  		assert.NoError(t, err)
    34  		keywords := []struct {
    35  			RepoIDs []int64
    36  			Keyword string
    37  			IDs     []int64
    38  			Langs   int
    39  		}{
    40  			{
    41  				RepoIDs: nil,
    42  				Keyword: "Description",
    43  				IDs:     []int64{repoID},
    44  				Langs:   1,
    45  			},
    46  			{
    47  				RepoIDs: []int64{2},
    48  				Keyword: "Description",
    49  				IDs:     []int64{},
    50  				Langs:   0,
    51  			},
    52  			{
    53  				RepoIDs: nil,
    54  				Keyword: "repo1",
    55  				IDs:     []int64{repoID},
    56  				Langs:   1,
    57  			},
    58  			{
    59  				RepoIDs: []int64{2},
    60  				Keyword: "repo1",
    61  				IDs:     []int64{},
    62  				Langs:   0,
    63  			},
    64  			{
    65  				RepoIDs: nil,
    66  				Keyword: "non-exist",
    67  				IDs:     []int64{},
    68  				Langs:   0,
    69  			},
    70  		}
    71  
    72  		for _, kw := range keywords {
    73  			t.Run(kw.Keyword, func(t *testing.T) {
    74  				total, res, langs, err := indexer.Search(context.TODO(), &internal.SearchOptions{
    75  					RepoIDs: kw.RepoIDs,
    76  					Keyword: kw.Keyword,
    77  					Paginator: &db.ListOptions{
    78  						Page:     1,
    79  						PageSize: 10,
    80  					},
    81  					IsKeywordFuzzy: true,
    82  				})
    83  				assert.NoError(t, err)
    84  				assert.Len(t, kw.IDs, int(total))
    85  				assert.Len(t, langs, kw.Langs)
    86  
    87  				ids := make([]int64, 0, len(res))
    88  				for _, hit := range res {
    89  					ids = append(ids, hit.RepoID)
    90  					assert.EqualValues(t, "# repo1\n\nDescription for repo1", hit.Content)
    91  				}
    92  				assert.EqualValues(t, kw.IDs, ids)
    93  			})
    94  		}
    95  
    96  		assert.NoError(t, indexer.Delete(context.Background(), repoID))
    97  	})
    98  }
    99  
   100  func TestBleveIndexAndSearch(t *testing.T) {
   101  	unittest.PrepareTestEnv(t)
   102  
   103  	dir := t.TempDir()
   104  
   105  	idx := bleve.NewIndexer(dir)
   106  	_, err := idx.Init(context.Background())
   107  	if err != nil {
   108  		if idx != nil {
   109  			idx.Close()
   110  		}
   111  		assert.FailNow(t, "Unable to create bleve indexer Error: %v", err)
   112  	}
   113  	defer idx.Close()
   114  
   115  	testIndexer("beleve", t, idx)
   116  }
   117  
   118  func TestESIndexAndSearch(t *testing.T) {
   119  	unittest.PrepareTestEnv(t)
   120  
   121  	u := os.Getenv("TEST_INDEXER_CODE_ES_URL")
   122  	if u == "" {
   123  		t.SkipNow()
   124  		return
   125  	}
   126  
   127  	indexer := elasticsearch.NewIndexer(u, "gitea_codes")
   128  	if _, err := indexer.Init(context.Background()); err != nil {
   129  		if indexer != nil {
   130  			indexer.Close()
   131  		}
   132  		assert.FailNow(t, "Unable to init ES indexer Error: %v", err)
   133  	}
   134  
   135  	defer indexer.Close()
   136  
   137  	testIndexer("elastic_search", t, indexer)
   138  }