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 }