github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/services/searchengine/bleveengine/bleve_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package bleveengine
     5  
     6  import (
     7  	"io/ioutil"
     8  	"os"
     9  	"testing"
    10  
    11  	"github.com/blevesearch/bleve"
    12  	"github.com/stretchr/testify/require"
    13  	"github.com/stretchr/testify/suite"
    14  
    15  	"github.com/mattermost/mattermost-server/v5/model"
    16  	"github.com/mattermost/mattermost-server/v5/services/searchengine"
    17  	"github.com/mattermost/mattermost-server/v5/store/searchlayer"
    18  	"github.com/mattermost/mattermost-server/v5/store/searchtest"
    19  	"github.com/mattermost/mattermost-server/v5/store/sqlstore"
    20  	"github.com/mattermost/mattermost-server/v5/store/storetest"
    21  	"github.com/mattermost/mattermost-server/v5/testlib"
    22  )
    23  
    24  type BleveEngineTestSuite struct {
    25  	suite.Suite
    26  
    27  	SQLSettings  *model.SqlSettings
    28  	SQLStore     *sqlstore.SqlStore
    29  	SearchEngine *searchengine.Broker
    30  	Store        *searchlayer.SearchStore
    31  	BleveEngine  *BleveEngine
    32  	IndexDir     string
    33  }
    34  
    35  func TestBleveEngineTestSuite(t *testing.T) {
    36  	suite.Run(t, new(BleveEngineTestSuite))
    37  }
    38  
    39  func (s *BleveEngineTestSuite) setupIndexes() {
    40  	indexDir, err := ioutil.TempDir("", "mmbleve")
    41  	if err != nil {
    42  		s.Require().FailNow("Cannot setup bleveengine tests: %s", err.Error())
    43  	}
    44  	s.IndexDir = indexDir
    45  }
    46  
    47  func (s *BleveEngineTestSuite) setupStore() {
    48  	driverName := os.Getenv("MM_SQLSETTINGS_DRIVERNAME")
    49  	if driverName == "" {
    50  		driverName = model.DATABASE_DRIVER_POSTGRES
    51  	}
    52  	s.SQLSettings = storetest.MakeSqlSettings(driverName)
    53  	s.SQLStore = sqlstore.New(*s.SQLSettings, nil)
    54  
    55  	cfg := &model.Config{}
    56  	cfg.SetDefaults()
    57  	cfg.BleveSettings.EnableIndexing = model.NewBool(true)
    58  	cfg.BleveSettings.EnableSearching = model.NewBool(true)
    59  	cfg.BleveSettings.EnableAutocomplete = model.NewBool(true)
    60  	cfg.BleveSettings.IndexDir = model.NewString(s.IndexDir)
    61  	cfg.SqlSettings.DisableDatabaseSearch = model.NewBool(true)
    62  
    63  	s.SearchEngine = searchengine.NewBroker(cfg, nil)
    64  	s.Store = searchlayer.NewSearchLayer(&testlib.TestStore{Store: s.SQLStore}, s.SearchEngine, cfg)
    65  
    66  	s.BleveEngine = NewBleveEngine(cfg, nil)
    67  	s.BleveEngine.indexSync = true
    68  	s.SearchEngine.RegisterBleveEngine(s.BleveEngine)
    69  	if err := s.BleveEngine.Start(); err != nil {
    70  		s.Require().FailNow("Cannot start bleveengine: %s", err.Error())
    71  	}
    72  }
    73  
    74  func (s *BleveEngineTestSuite) SetupSuite() {
    75  	s.setupIndexes()
    76  	s.setupStore()
    77  }
    78  
    79  func (s *BleveEngineTestSuite) TearDownSuite() {
    80  	os.RemoveAll(s.IndexDir)
    81  	s.SQLStore.Close()
    82  	storetest.CleanupSqlSettings(s.SQLSettings)
    83  }
    84  
    85  func (s *BleveEngineTestSuite) TestBleveSearchStoreTests() {
    86  	searchTestEngine := &searchtest.SearchTestEngine{
    87  		Driver: searchtest.EngineBleve,
    88  	}
    89  
    90  	s.Run("TestSearchChannelStore", func() {
    91  		searchtest.TestSearchChannelStore(s.T(), s.Store, searchTestEngine)
    92  	})
    93  
    94  	s.Run("TestSearchUserStore", func() {
    95  		searchtest.TestSearchUserStore(s.T(), s.Store, searchTestEngine)
    96  	})
    97  
    98  	s.Run("TestSearchPostStore", func() {
    99  		searchtest.TestSearchPostStore(s.T(), s.Store, searchTestEngine)
   100  	})
   101  
   102  	s.Run("TestSearchFileInfoStore", func() {
   103  		searchtest.TestSearchFileInfoStore(s.T(), s.Store, searchTestEngine)
   104  	})
   105  }
   106  
   107  func (s *BleveEngineTestSuite) TestDeleteChannelPosts() {
   108  	s.Run("Should remove all the posts that belongs to a channel", func() {
   109  		s.BleveEngine.PurgeIndexes()
   110  		teamID := model.NewId()
   111  		userID := model.NewId()
   112  		channelID := model.NewId()
   113  		channelToAvoidID := model.NewId()
   114  		posts := make([]*model.Post, 0)
   115  		for i := 0; i < 10; i++ {
   116  			post := createPost(userID, channelID, "test one two three")
   117  			appErr := s.SearchEngine.BleveEngine.IndexPost(post, teamID)
   118  			require.Nil(s.T(), appErr)
   119  			posts = append(posts, post)
   120  		}
   121  		postToAvoid := createPost(userID, channelToAvoidID, "test one two three")
   122  		appErr := s.SearchEngine.BleveEngine.IndexPost(postToAvoid, teamID)
   123  		require.Nil(s.T(), appErr)
   124  
   125  		s.SearchEngine.BleveEngine.DeleteChannelPosts(channelID)
   126  
   127  		doc, err := s.BleveEngine.PostIndex.Document(postToAvoid.Id)
   128  		require.NoError(s.T(), err)
   129  		require.Equal(s.T(), postToAvoid.Id, doc.ID)
   130  		numberDocs, err := s.BleveEngine.PostIndex.DocCount()
   131  		require.NoError(s.T(), err)
   132  		require.Equal(s.T(), 1, int(numberDocs))
   133  	})
   134  
   135  	s.Run("Shouldn't do anything if there is not posts for the selected channel", func() {
   136  		s.BleveEngine.PurgeIndexes()
   137  		teamID := model.NewId()
   138  		userID := model.NewId()
   139  		channelID := model.NewId()
   140  		channelToDeleteID := model.NewId()
   141  		post := createPost(userID, channelID, "test one two three")
   142  		appErr := s.SearchEngine.BleveEngine.IndexPost(post, teamID)
   143  		require.Nil(s.T(), appErr)
   144  
   145  		s.SearchEngine.BleveEngine.DeleteChannelPosts(channelToDeleteID)
   146  
   147  		_, err := s.BleveEngine.PostIndex.Document(post.Id)
   148  		require.NoError(s.T(), err)
   149  		numberDocs, err := s.BleveEngine.PostIndex.DocCount()
   150  		require.NoError(s.T(), err)
   151  		require.Equal(s.T(), 1, int(numberDocs))
   152  	})
   153  }
   154  
   155  func (s *BleveEngineTestSuite) TestDeleteUserPosts() {
   156  	s.Run("Should remove all the posts that belongs to a user", func() {
   157  		s.BleveEngine.PurgeIndexes()
   158  		teamID := model.NewId()
   159  		userID := model.NewId()
   160  		userToAvoidID := model.NewId()
   161  		channelID := model.NewId()
   162  		posts := make([]*model.Post, 0)
   163  		for i := 0; i < 10; i++ {
   164  			post := createPost(userID, channelID, "test one two three")
   165  			appErr := s.SearchEngine.BleveEngine.IndexPost(post, teamID)
   166  			require.Nil(s.T(), appErr)
   167  			posts = append(posts, post)
   168  		}
   169  		postToAvoid := createPost(userToAvoidID, channelID, "test one two three")
   170  		appErr := s.SearchEngine.BleveEngine.IndexPost(postToAvoid, teamID)
   171  		require.Nil(s.T(), appErr)
   172  
   173  		s.SearchEngine.BleveEngine.DeleteUserPosts(userID)
   174  
   175  		doc, err := s.BleveEngine.PostIndex.Document(postToAvoid.Id)
   176  		require.NoError(s.T(), err)
   177  		require.Equal(s.T(), postToAvoid.Id, doc.ID)
   178  		numberDocs, err := s.BleveEngine.PostIndex.DocCount()
   179  		require.NoError(s.T(), err)
   180  		require.Equal(s.T(), 1, int(numberDocs))
   181  	})
   182  
   183  	s.Run("Shouldn't do anything if there is not posts for the selected user", func() {
   184  		s.BleveEngine.PurgeIndexes()
   185  		teamID := model.NewId()
   186  		userID := model.NewId()
   187  		userToDeleteID := model.NewId()
   188  		channelID := model.NewId()
   189  		post := createPost(userID, channelID, "test one two three")
   190  		appErr := s.SearchEngine.BleveEngine.IndexPost(post, teamID)
   191  		require.Nil(s.T(), appErr)
   192  
   193  		s.SearchEngine.BleveEngine.DeleteUserPosts(userToDeleteID)
   194  
   195  		_, err := s.BleveEngine.PostIndex.Document(post.Id)
   196  		require.NoError(s.T(), err)
   197  		numberDocs, err := s.BleveEngine.PostIndex.DocCount()
   198  		require.NoError(s.T(), err)
   199  		require.Equal(s.T(), 1, int(numberDocs))
   200  	})
   201  }
   202  
   203  func (s *BleveEngineTestSuite) TestDeletePosts() {
   204  	s.BleveEngine.PurgeIndexes()
   205  	teamID := model.NewId()
   206  	userID := model.NewId()
   207  	userToAvoidID := model.NewId()
   208  	channelID := model.NewId()
   209  	posts := make([]*model.Post, 0)
   210  	for i := 0; i < 10; i++ {
   211  		post := createPost(userID, channelID, "test one two three")
   212  		appErr := s.SearchEngine.BleveEngine.IndexPost(post, teamID)
   213  		require.Nil(s.T(), appErr)
   214  		posts = append(posts, post)
   215  	}
   216  	postToAvoid := createPost(userToAvoidID, channelID, "test one two three")
   217  	appErr := s.SearchEngine.BleveEngine.IndexPost(postToAvoid, teamID)
   218  	require.Nil(s.T(), appErr)
   219  
   220  	query := bleve.NewTermQuery(userID)
   221  	query.SetField("UserId")
   222  	search := bleve.NewSearchRequest(query)
   223  	count, err := s.BleveEngine.deletePosts(search, 1)
   224  	require.NoError(s.T(), err)
   225  	require.Equal(s.T(), 10, int(count))
   226  
   227  	doc, err := s.BleveEngine.PostIndex.Document(postToAvoid.Id)
   228  	require.NoError(s.T(), err)
   229  	require.Equal(s.T(), postToAvoid.Id, doc.ID)
   230  	numberDocs, err := s.BleveEngine.PostIndex.DocCount()
   231  	require.NoError(s.T(), err)
   232  	require.Equal(s.T(), 1, int(numberDocs))
   233  }