github.com/adacta-ru/mattermost-server/v6@v6.0.0/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/adacta-ru/mattermost-server/v6/model"
    16  	"github.com/adacta-ru/mattermost-server/v6/services/searchengine"
    17  	"github.com/adacta-ru/mattermost-server/v6/store/searchlayer"
    18  	"github.com/adacta-ru/mattermost-server/v6/store/searchtest"
    19  	"github.com/adacta-ru/mattermost-server/v6/store/sqlstore"
    20  	"github.com/adacta-ru/mattermost-server/v6/store/storetest"
    21  	"github.com/adacta-ru/mattermost-server/v6/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.ENGINE_BLEVE,
    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  
   103  func (s *BleveEngineTestSuite) TestDeleteChannelPosts() {
   104  	s.Run("Should remove all the posts that belongs to a channel", func() {
   105  		s.BleveEngine.PurgeIndexes()
   106  		teamID := model.NewId()
   107  		userID := model.NewId()
   108  		channelID := model.NewId()
   109  		channelToAvoidID := model.NewId()
   110  		posts := make([]*model.Post, 0)
   111  		for i := 0; i < 10; i++ {
   112  			post := createPost(userID, channelID, "test one two three")
   113  			appErr := s.SearchEngine.BleveEngine.IndexPost(post, teamID)
   114  			require.Nil(s.T(), appErr)
   115  			posts = append(posts, post)
   116  		}
   117  		postToAvoid := createPost(userID, channelToAvoidID, "test one two three")
   118  		appErr := s.SearchEngine.BleveEngine.IndexPost(postToAvoid, teamID)
   119  		require.Nil(s.T(), appErr)
   120  
   121  		s.SearchEngine.BleveEngine.DeleteChannelPosts(channelID)
   122  
   123  		doc, err := s.BleveEngine.PostIndex.Document(postToAvoid.Id)
   124  		require.Nil(s.T(), err)
   125  		require.Equal(s.T(), postToAvoid.Id, doc.ID)
   126  		numberDocs, err := s.BleveEngine.PostIndex.DocCount()
   127  		require.Nil(s.T(), err)
   128  		require.Equal(s.T(), 1, int(numberDocs))
   129  	})
   130  
   131  	s.Run("Shouldn't do anything if there is not posts for the selected channel", func() {
   132  		s.BleveEngine.PurgeIndexes()
   133  		teamID := model.NewId()
   134  		userID := model.NewId()
   135  		channelID := model.NewId()
   136  		channelToDeleteID := model.NewId()
   137  		post := createPost(userID, channelID, "test one two three")
   138  		appErr := s.SearchEngine.BleveEngine.IndexPost(post, teamID)
   139  		require.Nil(s.T(), appErr)
   140  
   141  		s.SearchEngine.BleveEngine.DeleteChannelPosts(channelToDeleteID)
   142  
   143  		_, err := s.BleveEngine.PostIndex.Document(post.Id)
   144  		require.Nil(s.T(), err)
   145  		numberDocs, err := s.BleveEngine.PostIndex.DocCount()
   146  		require.Nil(s.T(), err)
   147  		require.Equal(s.T(), 1, int(numberDocs))
   148  	})
   149  }
   150  
   151  func (s *BleveEngineTestSuite) TestDeleteUserPosts() {
   152  	s.Run("Should remove all the posts that belongs to a user", func() {
   153  		s.BleveEngine.PurgeIndexes()
   154  		teamID := model.NewId()
   155  		userID := model.NewId()
   156  		userToAvoidID := model.NewId()
   157  		channelID := model.NewId()
   158  		posts := make([]*model.Post, 0)
   159  		for i := 0; i < 10; i++ {
   160  			post := createPost(userID, channelID, "test one two three")
   161  			appErr := s.SearchEngine.BleveEngine.IndexPost(post, teamID)
   162  			require.Nil(s.T(), appErr)
   163  			posts = append(posts, post)
   164  		}
   165  		postToAvoid := createPost(userToAvoidID, channelID, "test one two three")
   166  		appErr := s.SearchEngine.BleveEngine.IndexPost(postToAvoid, teamID)
   167  		require.Nil(s.T(), appErr)
   168  
   169  		s.SearchEngine.BleveEngine.DeleteUserPosts(userID)
   170  
   171  		doc, err := s.BleveEngine.PostIndex.Document(postToAvoid.Id)
   172  		require.Nil(s.T(), err)
   173  		require.Equal(s.T(), postToAvoid.Id, doc.ID)
   174  		numberDocs, err := s.BleveEngine.PostIndex.DocCount()
   175  		require.Nil(s.T(), err)
   176  		require.Equal(s.T(), 1, int(numberDocs))
   177  	})
   178  
   179  	s.Run("Shouldn't do anything if there is not posts for the selected user", func() {
   180  		s.BleveEngine.PurgeIndexes()
   181  		teamID := model.NewId()
   182  		userID := model.NewId()
   183  		userToDeleteID := model.NewId()
   184  		channelID := model.NewId()
   185  		post := createPost(userID, channelID, "test one two three")
   186  		appErr := s.SearchEngine.BleveEngine.IndexPost(post, teamID)
   187  		require.Nil(s.T(), appErr)
   188  
   189  		s.SearchEngine.BleveEngine.DeleteUserPosts(userToDeleteID)
   190  
   191  		_, err := s.BleveEngine.PostIndex.Document(post.Id)
   192  		require.Nil(s.T(), err)
   193  		numberDocs, err := s.BleveEngine.PostIndex.DocCount()
   194  		require.Nil(s.T(), err)
   195  		require.Equal(s.T(), 1, int(numberDocs))
   196  	})
   197  }
   198  
   199  func (s *BleveEngineTestSuite) TestDeletePosts() {
   200  	s.BleveEngine.PurgeIndexes()
   201  	teamID := model.NewId()
   202  	userID := model.NewId()
   203  	userToAvoidID := model.NewId()
   204  	channelID := model.NewId()
   205  	posts := make([]*model.Post, 0)
   206  	for i := 0; i < 10; i++ {
   207  		post := createPost(userID, channelID, "test one two three")
   208  		appErr := s.SearchEngine.BleveEngine.IndexPost(post, teamID)
   209  		require.Nil(s.T(), appErr)
   210  		posts = append(posts, post)
   211  	}
   212  	postToAvoid := createPost(userToAvoidID, channelID, "test one two three")
   213  	appErr := s.SearchEngine.BleveEngine.IndexPost(postToAvoid, teamID)
   214  	require.Nil(s.T(), appErr)
   215  
   216  	query := bleve.NewTermQuery(userID)
   217  	query.SetField("UserId")
   218  	search := bleve.NewSearchRequest(query)
   219  	count, err := s.BleveEngine.deletePosts(search, 1)
   220  	require.Nil(s.T(), err)
   221  	require.Equal(s.T(), 10, int(count))
   222  
   223  	doc, err := s.BleveEngine.PostIndex.Document(postToAvoid.Id)
   224  	require.Nil(s.T(), err)
   225  	require.Equal(s.T(), postToAvoid.Id, doc.ID)
   226  	numberDocs, err := s.BleveEngine.PostIndex.DocCount()
   227  	require.Nil(s.T(), err)
   228  	require.Equal(s.T(), 1, int(numberDocs))
   229  }