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 }