Merge branch 'master' into mark-as-unread

Этот коммит содержится в:
Harrison Healey
2019-11-07 10:58:09 -05:00
родитель 47409aaa4b 540cfb0239
Коммит 6e6174a9ee
41 изменённых файлов: 1565 добавлений и 1907 удалений

Просмотреть файл

@@ -1,203 +0,0 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
package store
import (
"context"
"github.com/mattermost/mattermost-server/einterfaces"
)
type LayeredStoreDatabaseLayer interface {
LayeredStoreSupplier
Store
}
type LayeredStore struct {
TmpContext context.Context
DatabaseLayer LayeredStoreDatabaseLayer
LocalCacheLayer *LocalCacheSupplier
LayerChainHead LayeredStoreSupplier
}
func NewLayeredStore(db LayeredStoreDatabaseLayer, metrics einterfaces.MetricsInterface, cluster einterfaces.ClusterInterface) Store {
store := &LayeredStore{
TmpContext: context.TODO(),
DatabaseLayer: db,
LocalCacheLayer: NewLocalCacheSupplier(metrics, cluster),
}
// Setup the chain
store.LocalCacheLayer.SetChainNext(store.DatabaseLayer)
store.LayerChainHead = store.LocalCacheLayer
return store
}
type QueryFunction func(LayeredStoreSupplier) *LayeredStoreSupplierResult
func (s *LayeredStore) GetCurrentSchemaVersion() string {
return s.DatabaseLayer.GetCurrentSchemaVersion()
}
func (s *LayeredStore) Team() TeamStore {
return s.DatabaseLayer.Team()
}
func (s *LayeredStore) Channel() ChannelStore {
return s.DatabaseLayer.Channel()
}
func (s *LayeredStore) Post() PostStore {
return s.DatabaseLayer.Post()
}
func (s *LayeredStore) User() UserStore {
return s.DatabaseLayer.User()
}
func (s *LayeredStore) Bot() BotStore {
return s.DatabaseLayer.Bot()
}
func (s *LayeredStore) Audit() AuditStore {
return s.DatabaseLayer.Audit()
}
func (s *LayeredStore) ClusterDiscovery() ClusterDiscoveryStore {
return s.DatabaseLayer.ClusterDiscovery()
}
func (s *LayeredStore) Compliance() ComplianceStore {
return s.DatabaseLayer.Compliance()
}
func (s *LayeredStore) Session() SessionStore {
return s.DatabaseLayer.Session()
}
func (s *LayeredStore) OAuth() OAuthStore {
return s.DatabaseLayer.OAuth()
}
func (s *LayeredStore) System() SystemStore {
return s.DatabaseLayer.System()
}
func (s *LayeredStore) Webhook() WebhookStore {
return s.DatabaseLayer.Webhook()
}
func (s *LayeredStore) Command() CommandStore {
return s.DatabaseLayer.Command()
}
func (s *LayeredStore) CommandWebhook() CommandWebhookStore {
return s.DatabaseLayer.CommandWebhook()
}
func (s *LayeredStore) Preference() PreferenceStore {
return s.DatabaseLayer.Preference()
}
func (s *LayeredStore) License() LicenseStore {
return s.DatabaseLayer.License()
}
func (s *LayeredStore) Token() TokenStore {
return s.DatabaseLayer.Token()
}
func (s *LayeredStore) Emoji() EmojiStore {
return s.DatabaseLayer.Emoji()
}
func (s *LayeredStore) Status() StatusStore {
return s.DatabaseLayer.Status()
}
func (s *LayeredStore) FileInfo() FileInfoStore {
return s.DatabaseLayer.FileInfo()
}
func (s *LayeredStore) Reaction() ReactionStore {
return s.DatabaseLayer.Reaction()
}
func (s *LayeredStore) Job() JobStore {
return s.DatabaseLayer.Job()
}
func (s *LayeredStore) UserAccessToken() UserAccessTokenStore {
return s.DatabaseLayer.UserAccessToken()
}
func (s *LayeredStore) ChannelMemberHistory() ChannelMemberHistoryStore {
return s.DatabaseLayer.ChannelMemberHistory()
}
func (s *LayeredStore) Plugin() PluginStore {
return s.DatabaseLayer.Plugin()
}
func (s *LayeredStore) Role() RoleStore {
return s.DatabaseLayer.Role()
}
func (s *LayeredStore) TermsOfService() TermsOfServiceStore {
return s.DatabaseLayer.TermsOfService()
}
func (s *LayeredStore) UserTermsOfService() UserTermsOfServiceStore {
return s.DatabaseLayer.UserTermsOfService()
}
func (s *LayeredStore) Scheme() SchemeStore {
return s.DatabaseLayer.Scheme()
}
func (s *LayeredStore) Group() GroupStore {
return s.DatabaseLayer.Group()
}
func (s *LayeredStore) LinkMetadata() LinkMetadataStore {
return s.DatabaseLayer.LinkMetadata()
}
func (s *LayeredStore) MarkSystemRanUnitTests() {
s.DatabaseLayer.MarkSystemRanUnitTests()
}
func (s *LayeredStore) Close() {
s.DatabaseLayer.Close()
}
func (s *LayeredStore) LockToMaster() {
s.DatabaseLayer.LockToMaster()
}
func (s *LayeredStore) UnlockFromMaster() {
s.DatabaseLayer.UnlockFromMaster()
}
func (s *LayeredStore) DropAllTables() {
defer s.LocalCacheLayer.Invalidate()
s.DatabaseLayer.DropAllTables()
}
func (s *LayeredStore) TotalMasterDbConnections() int {
return s.DatabaseLayer.TotalMasterDbConnections()
}
func (s *LayeredStore) TotalReadDbConnections() int {
return s.DatabaseLayer.TotalReadDbConnections()
}
func (s *LayeredStore) TotalSearchDbConnections() int {
return s.DatabaseLayer.TotalSearchDbConnections()
}
func (s *LayeredStore) CheckIntegrity() <-chan IntegrityCheckResult {
return s.DatabaseLayer.CheckIntegrity()
}

Просмотреть файл

@@ -1,11 +0,0 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
package store
type LayeredStoreHint int
const (
LSH_NO_CACHE LayeredStoreHint = iota
LSH_MASTER_ONLY
)

Просмотреть файл

@@ -1,20 +0,0 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
package store
type LayeredStoreSupplierResult struct {
StoreResult
}
func NewSupplierResult() *LayeredStoreSupplierResult {
return &LayeredStoreSupplierResult{}
}
type LayeredStoreSupplier interface {
//
// Control
//
SetChainNext(LayeredStoreSupplier)
Next() LayeredStoreSupplier
}

Просмотреть файл

@@ -1,83 +0,0 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
package store
import (
"context"
"github.com/mattermost/mattermost-server/einterfaces"
"github.com/mattermost/mattermost-server/model"
)
const (
CLEAR_CACHE_MESSAGE_DATA = ""
)
type LocalCacheSupplier struct {
next LayeredStoreSupplier
metrics einterfaces.MetricsInterface
cluster einterfaces.ClusterInterface
}
// Caching Interface
type ObjectCache interface {
AddWithExpiresInSecs(key, value interface{}, expireAtSecs int64)
AddWithDefaultExpires(key, value interface{})
Purge()
Get(key interface{}) (value interface{}, ok bool)
Remove(key interface{})
Len() int
Name() string
GetInvalidateClusterEvent() string
}
func NewLocalCacheSupplier(metrics einterfaces.MetricsInterface, cluster einterfaces.ClusterInterface) *LocalCacheSupplier {
supplier := &LocalCacheSupplier{
metrics: metrics,
cluster: cluster,
}
return supplier
}
func (s *LocalCacheSupplier) SetChainNext(next LayeredStoreSupplier) {
s.next = next
}
func (s *LocalCacheSupplier) Next() LayeredStoreSupplier {
return s.next
}
func (s *LocalCacheSupplier) doStandardAddToCache(ctx context.Context, cache ObjectCache, key string, result *LayeredStoreSupplierResult, hints ...LayeredStoreHint) {
if result.Err == nil && result.Data != nil {
cache.AddWithDefaultExpires(key, result.Data)
}
}
func (s *LocalCacheSupplier) doInvalidateCacheCluster(cache ObjectCache, key string) {
cache.Remove(key)
if s.cluster != nil {
msg := &model.ClusterMessage{
Event: cache.GetInvalidateClusterEvent(),
SendType: model.CLUSTER_SEND_BEST_EFFORT,
Data: key,
}
s.cluster.SendClusterMessage(msg)
}
}
func (s *LocalCacheSupplier) doClearCacheCluster(cache ObjectCache) {
cache.Purge()
if s.cluster != nil {
msg := &model.ClusterMessage{
Event: cache.GetInvalidateClusterEvent(),
SendType: model.CLUSTER_SEND_BEST_EFFORT,
Data: CLEAR_CACHE_MESSAGE_DATA,
}
s.cluster.SendClusterMessage(msg)
}
}
func (s *LocalCacheSupplier) Invalidate() {
}

Просмотреть файл

@@ -58,7 +58,7 @@ func initStores() {
go func() {
defer wg.Done()
st.SqlSupplier = sqlstore.NewSqlSupplier(*st.SqlSettings, nil)
st.Store = NewLocalCacheLayer(store.NewLayeredStore(st.SqlSupplier, nil, nil), nil, nil)
st.Store = NewLocalCacheLayer(st.SqlSupplier, nil, nil)
st.Store.DropAllTables()
st.Store.MarkSystemRanUnitTests()
}()

Просмотреть файл

@@ -362,7 +362,7 @@ func TestCheckIntegrity(t *testing.T) {
func TestCheckParentChildIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
t.Run("should receive an error", func(t *testing.T) {
config := relationalCheckConfig{
parentName: "NotValid",
@@ -379,7 +379,7 @@ func TestCheckParentChildIntegrity(t *testing.T) {
func TestCheckChannelsCommandWebhooksIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -407,7 +407,7 @@ func TestCheckChannelsCommandWebhooksIntegrity(t *testing.T) {
func TestCheckChannelsChannelMemberHistoryIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -437,7 +437,7 @@ func TestCheckChannelsChannelMemberHistoryIntegrity(t *testing.T) {
func TestCheckChannelsChannelMembersIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -465,7 +465,7 @@ func TestCheckChannelsChannelMembersIntegrity(t *testing.T) {
func TestCheckChannelsIncomingWebhooksIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -493,7 +493,7 @@ func TestCheckChannelsIncomingWebhooksIntegrity(t *testing.T) {
func TestCheckChannelsOutgoingWebhooksIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -523,7 +523,7 @@ func TestCheckChannelsOutgoingWebhooksIntegrity(t *testing.T) {
func TestCheckChannelsPostsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -550,7 +550,7 @@ func TestCheckChannelsPostsIntegrity(t *testing.T) {
func TestCheckCommandsCommandWebhooksIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -578,7 +578,7 @@ func TestCheckCommandsCommandWebhooksIntegrity(t *testing.T) {
func TestCheckPostsFileInfoIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -605,7 +605,7 @@ func TestCheckPostsFileInfoIntegrity(t *testing.T) {
func TestCheckPostsPostsParentIdIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -637,7 +637,7 @@ func TestCheckPostsPostsParentIdIntegrity(t *testing.T) {
func TestCheckPostsPostsRootIdIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -667,7 +667,7 @@ func TestCheckPostsPostsRootIdIntegrity(t *testing.T) {
func TestCheckPostsReactionsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -694,7 +694,7 @@ func TestCheckPostsReactionsIntegrity(t *testing.T) {
func TestCheckSchemesChannelsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -725,7 +725,7 @@ func TestCheckSchemesChannelsIntegrity(t *testing.T) {
func TestCheckSchemesTeamsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -756,7 +756,7 @@ func TestCheckSchemesTeamsIntegrity(t *testing.T) {
func TestCheckSessionsAuditsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -787,7 +787,7 @@ func TestCheckSessionsAuditsIntegrity(t *testing.T) {
func TestCheckTeamsChannelsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -814,7 +814,7 @@ func TestCheckTeamsChannelsIntegrity(t *testing.T) {
func TestCheckTeamsCommandsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -842,7 +842,7 @@ func TestCheckTeamsCommandsIntegrity(t *testing.T) {
func TestCheckTeamsIncomingWebhooksIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -870,7 +870,7 @@ func TestCheckTeamsIncomingWebhooksIntegrity(t *testing.T) {
func TestCheckTeamsOutgoingWebhooksIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -898,7 +898,7 @@ func TestCheckTeamsOutgoingWebhooksIntegrity(t *testing.T) {
func TestCheckTeamsTeamMembersIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -926,7 +926,7 @@ func TestCheckTeamsTeamMembersIntegrity(t *testing.T) {
func TestCheckUsersAuditsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -956,7 +956,7 @@ func TestCheckUsersAuditsIntegrity(t *testing.T) {
func TestCheckUsersCommandWebhooksIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -984,7 +984,7 @@ func TestCheckUsersCommandWebhooksIntegrity(t *testing.T) {
func TestCheckUsersChannelsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1011,7 +1011,7 @@ func TestCheckUsersChannelsIntegrity(t *testing.T) {
func TestCheckUsersChannelMemberHistoryIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1041,7 +1041,7 @@ func TestCheckUsersChannelMemberHistoryIntegrity(t *testing.T) {
func TestCheckUsersChannelMembersIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1071,7 +1071,7 @@ func TestCheckUsersChannelMembersIntegrity(t *testing.T) {
func TestCheckUsersCommandsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1099,7 +1099,7 @@ func TestCheckUsersCommandsIntegrity(t *testing.T) {
func TestCheckUsersCompliancesIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1129,7 +1129,7 @@ func TestCheckUsersCompliancesIntegrity(t *testing.T) {
func TestCheckUsersEmojiIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1159,7 +1159,7 @@ func TestCheckUsersEmojiIntegrity(t *testing.T) {
func TestCheckUsersFileInfoIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1188,7 +1188,7 @@ func TestCheckUsersFileInfoIntegrity(t *testing.T) {
func TestCheckUsersIncomingWebhooksIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1216,7 +1216,7 @@ func TestCheckUsersIncomingWebhooksIntegrity(t *testing.T) {
func TestCheckUsersOAuthAccessDataIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1246,7 +1246,7 @@ func TestCheckUsersOAuthAccessDataIntegrity(t *testing.T) {
func TestCheckUsersOAuthAppsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1276,7 +1276,7 @@ func TestCheckUsersOAuthAppsIntegrity(t *testing.T) {
func TestCheckUsersOAuthAuthDataIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1306,7 +1306,7 @@ func TestCheckUsersOAuthAuthDataIntegrity(t *testing.T) {
func TestCheckUsersOutgoingWebhooksIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1334,7 +1334,7 @@ func TestCheckUsersOutgoingWebhooksIntegrity(t *testing.T) {
func TestCheckUsersPostsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1361,7 +1361,7 @@ func TestCheckUsersPostsIntegrity(t *testing.T) {
func TestCheckUsersPreferencesIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1390,7 +1390,7 @@ func TestCheckUsersPreferencesIntegrity(t *testing.T) {
func TestCheckUsersReactionsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1419,7 +1419,7 @@ func TestCheckUsersReactionsIntegrity(t *testing.T) {
func TestCheckUsersSessionsIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1447,7 +1447,7 @@ func TestCheckUsersSessionsIntegrity(t *testing.T) {
func TestCheckUsersStatusIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1476,7 +1476,7 @@ func TestCheckUsersStatusIntegrity(t *testing.T) {
func TestCheckUsersTeamMembersIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {
@@ -1506,7 +1506,7 @@ func TestCheckUsersTeamMembersIntegrity(t *testing.T) {
func TestCheckUsersUserAccessTokensIntegrity(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
supplier := ss.(*store.LayeredStore).DatabaseLayer.(*SqlSupplier)
supplier := ss.(*SqlSupplier)
dbmap := supplier.GetMaster()
t.Run("should generate a report with no records", func(t *testing.T) {

Просмотреть файл

@@ -70,7 +70,7 @@ func initStores() {
go func() {
defer wg.Done()
st.SqlSupplier = NewSqlSupplier(*st.SqlSettings, nil)
st.Store = store.NewLayeredStore(st.SqlSupplier, nil, nil)
st.Store = st.SqlSupplier
st.Store.DropAllTables()
st.Store.MarkSystemRanUnitTests()
}()

Просмотреть файл

@@ -67,7 +67,7 @@ const (
EXIT_DOES_COLUMN_EXISTS_SQLITE = 138
)
type SqlSupplierOldStores struct {
type SqlSupplierStores struct {
team store.TeamStore
channel store.ChannelStore
post store.PostStore
@@ -106,11 +106,10 @@ type SqlSupplier struct {
// See https://github.com/mattermost/mattermost-server/pull/7281
rrCounter int64
srCounter int64
next store.LayeredStoreSupplier
master *gorp.DbMap
replicas []*gorp.DbMap
searchReplicas []*gorp.DbMap
oldStores SqlSupplierOldStores
stores SqlSupplierStores
settings *model.SqlSettings
lockedToMaster bool
}
@@ -124,37 +123,37 @@ func NewSqlSupplier(settings model.SqlSettings, metrics einterfaces.MetricsInter
supplier.initConnection()
supplier.oldStores.team = NewSqlTeamStore(supplier, metrics)
supplier.oldStores.channel = NewSqlChannelStore(supplier, metrics)
supplier.oldStores.post = NewSqlPostStore(supplier, metrics)
supplier.oldStores.user = NewSqlUserStore(supplier, metrics)
supplier.oldStores.bot = NewSqlBotStore(supplier, metrics)
supplier.oldStores.audit = NewSqlAuditStore(supplier)
supplier.oldStores.cluster = NewSqlClusterDiscoveryStore(supplier)
supplier.oldStores.compliance = NewSqlComplianceStore(supplier)
supplier.oldStores.session = NewSqlSessionStore(supplier)
supplier.oldStores.oauth = NewSqlOAuthStore(supplier)
supplier.oldStores.system = NewSqlSystemStore(supplier)
supplier.oldStores.webhook = NewSqlWebhookStore(supplier, metrics)
supplier.oldStores.command = NewSqlCommandStore(supplier)
supplier.oldStores.commandWebhook = NewSqlCommandWebhookStore(supplier)
supplier.oldStores.preference = NewSqlPreferenceStore(supplier)
supplier.oldStores.license = NewSqlLicenseStore(supplier)
supplier.oldStores.token = NewSqlTokenStore(supplier)
supplier.oldStores.emoji = NewSqlEmojiStore(supplier, metrics)
supplier.oldStores.status = NewSqlStatusStore(supplier)
supplier.oldStores.fileInfo = NewSqlFileInfoStore(supplier, metrics)
supplier.oldStores.job = NewSqlJobStore(supplier)
supplier.oldStores.userAccessToken = NewSqlUserAccessTokenStore(supplier)
supplier.oldStores.channelMemberHistory = NewSqlChannelMemberHistoryStore(supplier)
supplier.oldStores.plugin = NewSqlPluginStore(supplier)
supplier.oldStores.TermsOfService = NewSqlTermsOfServiceStore(supplier, metrics)
supplier.oldStores.UserTermsOfService = NewSqlUserTermsOfServiceStore(supplier)
supplier.oldStores.linkMetadata = NewSqlLinkMetadataStore(supplier)
supplier.oldStores.reaction = NewSqlReactionStore(supplier)
supplier.oldStores.role = NewSqlRoleStore(supplier)
supplier.oldStores.scheme = NewSqlSchemeStore(supplier)
supplier.oldStores.group = NewSqlGroupStore(supplier)
supplier.stores.team = NewSqlTeamStore(supplier, metrics)
supplier.stores.channel = NewSqlChannelStore(supplier, metrics)
supplier.stores.post = NewSqlPostStore(supplier, metrics)
supplier.stores.user = NewSqlUserStore(supplier, metrics)
supplier.stores.bot = NewSqlBotStore(supplier, metrics)
supplier.stores.audit = NewSqlAuditStore(supplier)
supplier.stores.cluster = NewSqlClusterDiscoveryStore(supplier)
supplier.stores.compliance = NewSqlComplianceStore(supplier)
supplier.stores.session = NewSqlSessionStore(supplier)
supplier.stores.oauth = NewSqlOAuthStore(supplier)
supplier.stores.system = NewSqlSystemStore(supplier)
supplier.stores.webhook = NewSqlWebhookStore(supplier, metrics)
supplier.stores.command = NewSqlCommandStore(supplier)
supplier.stores.commandWebhook = NewSqlCommandWebhookStore(supplier)
supplier.stores.preference = NewSqlPreferenceStore(supplier)
supplier.stores.license = NewSqlLicenseStore(supplier)
supplier.stores.token = NewSqlTokenStore(supplier)
supplier.stores.emoji = NewSqlEmojiStore(supplier, metrics)
supplier.stores.status = NewSqlStatusStore(supplier)
supplier.stores.fileInfo = NewSqlFileInfoStore(supplier, metrics)
supplier.stores.job = NewSqlJobStore(supplier)
supplier.stores.userAccessToken = NewSqlUserAccessTokenStore(supplier)
supplier.stores.channelMemberHistory = NewSqlChannelMemberHistoryStore(supplier)
supplier.stores.plugin = NewSqlPluginStore(supplier)
supplier.stores.TermsOfService = NewSqlTermsOfServiceStore(supplier, metrics)
supplier.stores.UserTermsOfService = NewSqlUserTermsOfServiceStore(supplier)
supplier.stores.linkMetadata = NewSqlLinkMetadataStore(supplier)
supplier.stores.reaction = NewSqlReactionStore(supplier)
supplier.stores.role = NewSqlRoleStore(supplier)
supplier.stores.scheme = NewSqlSchemeStore(supplier)
supplier.stores.group = NewSqlGroupStore(supplier)
err := supplier.GetMaster().CreateTablesIfNotExists()
if err != nil {
@@ -170,46 +169,37 @@ func NewSqlSupplier(settings model.SqlSettings, metrics einterfaces.MetricsInter
os.Exit(EXIT_GENERIC_FAILURE)
}
supplier.oldStores.team.(*SqlTeamStore).CreateIndexesIfNotExists()
supplier.oldStores.channel.(*SqlChannelStore).CreateIndexesIfNotExists()
supplier.oldStores.post.(*SqlPostStore).CreateIndexesIfNotExists()
supplier.oldStores.user.(*SqlUserStore).CreateIndexesIfNotExists()
supplier.oldStores.bot.(*SqlBotStore).CreateIndexesIfNotExists()
supplier.oldStores.audit.(*SqlAuditStore).CreateIndexesIfNotExists()
supplier.oldStores.compliance.(*SqlComplianceStore).CreateIndexesIfNotExists()
supplier.oldStores.session.(*SqlSessionStore).CreateIndexesIfNotExists()
supplier.oldStores.oauth.(*SqlOAuthStore).CreateIndexesIfNotExists()
supplier.oldStores.system.(*SqlSystemStore).CreateIndexesIfNotExists()
supplier.oldStores.webhook.(*SqlWebhookStore).CreateIndexesIfNotExists()
supplier.oldStores.command.(*SqlCommandStore).CreateIndexesIfNotExists()
supplier.oldStores.commandWebhook.(*SqlCommandWebhookStore).CreateIndexesIfNotExists()
supplier.oldStores.preference.(*SqlPreferenceStore).CreateIndexesIfNotExists()
supplier.oldStores.license.(*SqlLicenseStore).CreateIndexesIfNotExists()
supplier.oldStores.token.(*SqlTokenStore).CreateIndexesIfNotExists()
supplier.oldStores.emoji.(*SqlEmojiStore).CreateIndexesIfNotExists()
supplier.oldStores.status.(*SqlStatusStore).CreateIndexesIfNotExists()
supplier.oldStores.fileInfo.(*SqlFileInfoStore).CreateIndexesIfNotExists()
supplier.oldStores.job.(*SqlJobStore).CreateIndexesIfNotExists()
supplier.oldStores.userAccessToken.(*SqlUserAccessTokenStore).CreateIndexesIfNotExists()
supplier.oldStores.plugin.(*SqlPluginStore).CreateIndexesIfNotExists()
supplier.oldStores.TermsOfService.(SqlTermsOfServiceStore).CreateIndexesIfNotExists()
supplier.oldStores.UserTermsOfService.(SqlUserTermsOfServiceStore).CreateIndexesIfNotExists()
supplier.oldStores.linkMetadata.(*SqlLinkMetadataStore).CreateIndexesIfNotExists()
supplier.oldStores.group.(*SqlGroupStore).CreateIndexesIfNotExists()
supplier.oldStores.preference.(*SqlPreferenceStore).DeleteUnusedFeatures()
supplier.stores.team.(*SqlTeamStore).CreateIndexesIfNotExists()
supplier.stores.channel.(*SqlChannelStore).CreateIndexesIfNotExists()
supplier.stores.post.(*SqlPostStore).CreateIndexesIfNotExists()
supplier.stores.user.(*SqlUserStore).CreateIndexesIfNotExists()
supplier.stores.bot.(*SqlBotStore).CreateIndexesIfNotExists()
supplier.stores.audit.(*SqlAuditStore).CreateIndexesIfNotExists()
supplier.stores.compliance.(*SqlComplianceStore).CreateIndexesIfNotExists()
supplier.stores.session.(*SqlSessionStore).CreateIndexesIfNotExists()
supplier.stores.oauth.(*SqlOAuthStore).CreateIndexesIfNotExists()
supplier.stores.system.(*SqlSystemStore).CreateIndexesIfNotExists()
supplier.stores.webhook.(*SqlWebhookStore).CreateIndexesIfNotExists()
supplier.stores.command.(*SqlCommandStore).CreateIndexesIfNotExists()
supplier.stores.commandWebhook.(*SqlCommandWebhookStore).CreateIndexesIfNotExists()
supplier.stores.preference.(*SqlPreferenceStore).CreateIndexesIfNotExists()
supplier.stores.license.(*SqlLicenseStore).CreateIndexesIfNotExists()
supplier.stores.token.(*SqlTokenStore).CreateIndexesIfNotExists()
supplier.stores.emoji.(*SqlEmojiStore).CreateIndexesIfNotExists()
supplier.stores.status.(*SqlStatusStore).CreateIndexesIfNotExists()
supplier.stores.fileInfo.(*SqlFileInfoStore).CreateIndexesIfNotExists()
supplier.stores.job.(*SqlJobStore).CreateIndexesIfNotExists()
supplier.stores.userAccessToken.(*SqlUserAccessTokenStore).CreateIndexesIfNotExists()
supplier.stores.plugin.(*SqlPluginStore).CreateIndexesIfNotExists()
supplier.stores.TermsOfService.(SqlTermsOfServiceStore).CreateIndexesIfNotExists()
supplier.stores.UserTermsOfService.(SqlUserTermsOfServiceStore).CreateIndexesIfNotExists()
supplier.stores.linkMetadata.(*SqlLinkMetadataStore).CreateIndexesIfNotExists()
supplier.stores.group.(*SqlGroupStore).CreateIndexesIfNotExists()
supplier.stores.preference.(*SqlPreferenceStore).DeleteUnusedFeatures()
return supplier
}
func (s *SqlSupplier) SetChainNext(next store.LayeredStoreSupplier) {
s.next = next
}
func (s *SqlSupplier) Next() store.LayeredStoreSupplier {
return s.next
}
func setupConnection(con_type string, dataSource string, settings *model.SqlSettings) *gorp.DbMap {
db, err := dbsql.Open(*settings.DriverName, dataSource)
if err != nil {
@@ -930,127 +920,127 @@ func (ss *SqlSupplier) UnlockFromMaster() {
}
func (ss *SqlSupplier) Team() store.TeamStore {
return ss.oldStores.team
return ss.stores.team
}
func (ss *SqlSupplier) Channel() store.ChannelStore {
return ss.oldStores.channel
return ss.stores.channel
}
func (ss *SqlSupplier) Post() store.PostStore {
return ss.oldStores.post
return ss.stores.post
}
func (ss *SqlSupplier) User() store.UserStore {
return ss.oldStores.user
return ss.stores.user
}
func (ss *SqlSupplier) Bot() store.BotStore {
return ss.oldStores.bot
return ss.stores.bot
}
func (ss *SqlSupplier) Session() store.SessionStore {
return ss.oldStores.session
return ss.stores.session
}
func (ss *SqlSupplier) Audit() store.AuditStore {
return ss.oldStores.audit
return ss.stores.audit
}
func (ss *SqlSupplier) ClusterDiscovery() store.ClusterDiscoveryStore {
return ss.oldStores.cluster
return ss.stores.cluster
}
func (ss *SqlSupplier) Compliance() store.ComplianceStore {
return ss.oldStores.compliance
return ss.stores.compliance
}
func (ss *SqlSupplier) OAuth() store.OAuthStore {
return ss.oldStores.oauth
return ss.stores.oauth
}
func (ss *SqlSupplier) System() store.SystemStore {
return ss.oldStores.system
return ss.stores.system
}
func (ss *SqlSupplier) Webhook() store.WebhookStore {
return ss.oldStores.webhook
return ss.stores.webhook
}
func (ss *SqlSupplier) Command() store.CommandStore {
return ss.oldStores.command
return ss.stores.command
}
func (ss *SqlSupplier) CommandWebhook() store.CommandWebhookStore {
return ss.oldStores.commandWebhook
return ss.stores.commandWebhook
}
func (ss *SqlSupplier) Preference() store.PreferenceStore {
return ss.oldStores.preference
return ss.stores.preference
}
func (ss *SqlSupplier) License() store.LicenseStore {
return ss.oldStores.license
return ss.stores.license
}
func (ss *SqlSupplier) Token() store.TokenStore {
return ss.oldStores.token
return ss.stores.token
}
func (ss *SqlSupplier) Emoji() store.EmojiStore {
return ss.oldStores.emoji
return ss.stores.emoji
}
func (ss *SqlSupplier) Status() store.StatusStore {
return ss.oldStores.status
return ss.stores.status
}
func (ss *SqlSupplier) FileInfo() store.FileInfoStore {
return ss.oldStores.fileInfo
return ss.stores.fileInfo
}
func (ss *SqlSupplier) Reaction() store.ReactionStore {
return ss.oldStores.reaction
return ss.stores.reaction
}
func (ss *SqlSupplier) Job() store.JobStore {
return ss.oldStores.job
return ss.stores.job
}
func (ss *SqlSupplier) UserAccessToken() store.UserAccessTokenStore {
return ss.oldStores.userAccessToken
return ss.stores.userAccessToken
}
func (ss *SqlSupplier) ChannelMemberHistory() store.ChannelMemberHistoryStore {
return ss.oldStores.channelMemberHistory
return ss.stores.channelMemberHistory
}
func (ss *SqlSupplier) Plugin() store.PluginStore {
return ss.oldStores.plugin
return ss.stores.plugin
}
func (ss *SqlSupplier) Role() store.RoleStore {
return ss.oldStores.role
return ss.stores.role
}
func (ss *SqlSupplier) TermsOfService() store.TermsOfServiceStore {
return ss.oldStores.TermsOfService
return ss.stores.TermsOfService
}
func (ss *SqlSupplier) UserTermsOfService() store.UserTermsOfServiceStore {
return ss.oldStores.UserTermsOfService
return ss.stores.UserTermsOfService
}
func (ss *SqlSupplier) Scheme() store.SchemeStore {
return ss.oldStores.scheme
return ss.stores.scheme
}
func (ss *SqlSupplier) Group() store.GroupStore {
return ss.oldStores.group
return ss.stores.group
}
func (ss *SqlSupplier) LinkMetadata() store.LinkMetadataStore {
return ss.oldStores.linkMetadata
return ss.stores.linkMetadata
}
func (ss *SqlSupplier) DropAllTables() {

Просмотреть файл

@@ -12,7 +12,7 @@ import (
func TestStoreUpgrade(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
sqlStore := ss.(*store.LayeredStore).DatabaseLayer.(SqlStore)
sqlStore := ss.(SqlStore)
t.Run("invalid currentModelVersion", func(t *testing.T) {
err := UpgradeDatabase(sqlStore, "notaversion")
@@ -81,7 +81,7 @@ func TestStoreUpgrade(t *testing.T) {
func TestSaveSchemaVersion(t *testing.T) {
StoreTest(t, func(t *testing.T, ss store.Store) {
sqlStore := ss.(*store.LayeredStore).DatabaseLayer.(SqlStore)
sqlStore := ss.(SqlStore)
t.Run("set earliest version", func(t *testing.T) {
saveSchemaVersion(sqlStore, VERSION_3_0_0)

Просмотреть файл

@@ -30,33 +30,26 @@ func testEmojiSaveDelete(t *testing.T, ss store.Store) {
Name: model.NewId(),
}
if _, err := ss.Emoji().Save(emoji1); err != nil {
t.Fatal(err)
}
_, err := ss.Emoji().Save(emoji1)
require.Nil(t, err)
if len(emoji1.Id) != 26 {
t.Fatal("should've set id for emoji")
}
assert.Len(t, emoji1.Id, 26, "should've set id for emoji")
emoji2 := model.Emoji{
CreatorId: model.NewId(),
Name: emoji1.Name,
}
if _, err := ss.Emoji().Save(&emoji2); err == nil {
t.Fatal("shouldn't be able to save emoji with duplicate name")
}
_, err = ss.Emoji().Save(&emoji2)
require.NotNil(t, err, "shouldn't be able to save emoji with duplicate name")
if err := ss.Emoji().Delete(emoji1, time.Now().Unix()); err != nil {
t.Fatal(err)
}
err = ss.Emoji().Delete(emoji1, time.Now().Unix())
require.Nil(t, err)
if _, err := ss.Emoji().Save(&emoji2); err != nil {
t.Fatal("should be able to save emoji with duplicate name now that original has been deleted", err)
}
_, err = ss.Emoji().Save(&emoji2)
require.Nil(t, err, "should be able to save emoji with duplicate name now that original has been deleted")
if err := ss.Emoji().Delete(&emoji2, time.Now().Unix()+1); err != nil {
t.Fatal(err)
}
err = ss.Emoji().Delete(&emoji2, time.Now().Unix()+1)
require.Nil(t, err)
}
func testEmojiGet(t *testing.T, ss store.Store) {
@@ -88,15 +81,13 @@ func testEmojiGet(t *testing.T, ss store.Store) {
}()
for _, emoji := range emojis {
if _, err := ss.Emoji().Get(emoji.Id, false); err != nil {
t.Fatalf("failed to get emoji with id %v: %v", emoji.Id, err)
}
_, err := ss.Emoji().Get(emoji.Id, false)
require.Nilf(t, err, "failed to get emoji with id %v", emoji.Id)
}
for _, emoji := range emojis {
if _, err := ss.Emoji().Get(emoji.Id, true); err != nil {
t.Fatalf("failed to get emoji with id %v: %v", emoji.Id, err)
}
_, err := ss.Emoji().Get(emoji.Id, true)
require.Nilf(t, err, "failed to get emoji with id %v", emoji.Id)
}
}
@@ -184,9 +175,8 @@ func testEmojiGetByName(t *testing.T, ss store.Store) {
}()
for _, emoji := range emojis {
if _, err := ss.Emoji().GetByName(emoji.Name, true); err != nil {
t.Fatalf("failed to get emoji with name %v: %v", emoji.Name, err)
}
_, err := ss.Emoji().GetByName(emoji.Name, true)
require.Nilf(t, err, "failed to get emoji with name %v", emoji.Name)
}
}
@@ -219,35 +209,28 @@ func testEmojiGetMultipleByName(t *testing.T, ss store.Store) {
}()
t.Run("one emoji", func(t *testing.T) {
if received, err := ss.Emoji().GetMultipleByName([]string{emojis[0].Name}); err != nil {
t.Fatal("could not get emoji", err)
} else if len(received) != 1 || *received[0] != emojis[0] {
t.Fatal("got incorrect emoji")
}
received, err := ss.Emoji().GetMultipleByName([]string{emojis[0].Name})
require.Nilf(t, err, "could not get emoji")
require.Len(t, received, 1, "got incorrect emoji")
require.Equal(t, *received[0], emojis[0], "got incorrect emoji")
})
t.Run("multiple emojis", func(t *testing.T) {
if received, err := ss.Emoji().GetMultipleByName([]string{emojis[0].Name, emojis[1].Name, emojis[2].Name}); err != nil {
t.Fatal("could not get emojis", err)
} else if len(received) != 3 {
t.Fatal("got incorrect emojis")
}
received, err := ss.Emoji().GetMultipleByName([]string{emojis[0].Name, emojis[1].Name, emojis[2].Name})
require.Nil(t, err, "could not get emojis")
require.Len(t, received, 3, "got incorrect emojis")
})
t.Run("one nonexistent emoji", func(t *testing.T) {
if received, err := ss.Emoji().GetMultipleByName([]string{"ab"}); err != nil {
t.Fatal("could not get emoji", err)
} else if len(received) != 0 {
t.Fatal("got incorrect emoji")
}
received, err := ss.Emoji().GetMultipleByName([]string{"ab"})
require.Nilf(t, err, "%v, could not get emoji", err)
require.Len(t, received, 0, "got incorrect emoji")
})
t.Run("multiple emojis with nonexistent names", func(t *testing.T) {
if received, err := ss.Emoji().GetMultipleByName([]string{emojis[0].Name, emojis[1].Name, emojis[2].Name, "abcd", "1234"}); err != nil {
t.Fatal("could not get emojis", err)
} else if len(received) != 3 {
t.Fatal("got incorrect emojis")
}
received, err := ss.Emoji().GetMultipleByName([]string{emojis[0].Name, emojis[1].Name, emojis[2].Name, "abcd", "1234"})
require.Nil(t, err, "could not get emojis")
require.Len(t, received, 3, "got incorrect emojis")
})
}
@@ -292,9 +275,7 @@ func testEmojiGetList(t *testing.T, ss store.Store) {
}
}
if !found {
t.Fatalf("failed to get emoji with id %v", emoji.Id)
}
require.Truef(t, found, "failed to get emoji with id %v", emoji.Id)
}
}
@@ -347,38 +328,34 @@ func testEmojiSearch(t *testing.T, ss store.Store) {
shouldFind := []bool{true, false, false, false}
if result, err := ss.Emoji().Search("blargh", true, 100); err != nil {
t.Fatal(err)
} else {
for i, emoji := range emojis {
found := false
result, err := ss.Emoji().Search("blargh", true, 100)
require.Nil(t, err)
for i, emoji := range emojis {
found := false
for _, savedEmoji := range result {
if emoji.Id == savedEmoji.Id {
found = true
break
}
for _, savedEmoji := range result {
if emoji.Id == savedEmoji.Id {
found = true
break
}
assert.Equal(t, shouldFind[i], found, emoji.Name)
}
assert.Equal(t, shouldFind[i], found, emoji.Name)
}
shouldFind = []bool{true, true, true, false}
if result, err := ss.Emoji().Search("blargh", false, 100); err != nil {
t.Fatal(err)
} else {
for i, emoji := range emojis {
found := false
result, err = ss.Emoji().Search("blargh", false, 100)
require.Nil(t, err)
for i, emoji := range emojis {
found := false
for _, savedEmoji := range result {
if emoji.Id == savedEmoji.Id {
found = true
break
}
for _, savedEmoji := range result {
if emoji.Id == savedEmoji.Id {
found = true
break
}
assert.Equal(t, shouldFind[i], found, emoji.Name)
}
assert.Equal(t, shouldFind[i], found, emoji.Name)
}
}

Просмотреть файл

@@ -1,629 +0,0 @@
// Code generated by mockery v1.0.0. DO NOT EDIT.
// Regenerate this file using `make store-mocks`.
package mocks
import (
store "github.com/mattermost/mattermost-server/store"
mock "github.com/stretchr/testify/mock"
)
// LayeredStoreDatabaseLayer is an autogenerated mock type for the LayeredStoreDatabaseLayer type
type LayeredStoreDatabaseLayer struct {
mock.Mock
}
// Audit provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Audit() store.AuditStore {
ret := _m.Called()
var r0 store.AuditStore
if rf, ok := ret.Get(0).(func() store.AuditStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.AuditStore)
}
}
return r0
}
// Bot provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Bot() store.BotStore {
ret := _m.Called()
var r0 store.BotStore
if rf, ok := ret.Get(0).(func() store.BotStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.BotStore)
}
}
return r0
}
// Channel provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Channel() store.ChannelStore {
ret := _m.Called()
var r0 store.ChannelStore
if rf, ok := ret.Get(0).(func() store.ChannelStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.ChannelStore)
}
}
return r0
}
// ChannelMemberHistory provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) ChannelMemberHistory() store.ChannelMemberHistoryStore {
ret := _m.Called()
var r0 store.ChannelMemberHistoryStore
if rf, ok := ret.Get(0).(func() store.ChannelMemberHistoryStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.ChannelMemberHistoryStore)
}
}
return r0
}
// CheckIntegrity provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) CheckIntegrity() <-chan store.IntegrityCheckResult {
ret := _m.Called()
var r0 <-chan store.IntegrityCheckResult
if rf, ok := ret.Get(0).(func() <-chan store.IntegrityCheckResult); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(<-chan store.IntegrityCheckResult)
}
}
return r0
}
// Close provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Close() {
_m.Called()
}
// ClusterDiscovery provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) ClusterDiscovery() store.ClusterDiscoveryStore {
ret := _m.Called()
var r0 store.ClusterDiscoveryStore
if rf, ok := ret.Get(0).(func() store.ClusterDiscoveryStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.ClusterDiscoveryStore)
}
}
return r0
}
// Command provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Command() store.CommandStore {
ret := _m.Called()
var r0 store.CommandStore
if rf, ok := ret.Get(0).(func() store.CommandStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.CommandStore)
}
}
return r0
}
// CommandWebhook provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) CommandWebhook() store.CommandWebhookStore {
ret := _m.Called()
var r0 store.CommandWebhookStore
if rf, ok := ret.Get(0).(func() store.CommandWebhookStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.CommandWebhookStore)
}
}
return r0
}
// Compliance provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Compliance() store.ComplianceStore {
ret := _m.Called()
var r0 store.ComplianceStore
if rf, ok := ret.Get(0).(func() store.ComplianceStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.ComplianceStore)
}
}
return r0
}
// DropAllTables provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) DropAllTables() {
_m.Called()
}
// Emoji provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Emoji() store.EmojiStore {
ret := _m.Called()
var r0 store.EmojiStore
if rf, ok := ret.Get(0).(func() store.EmojiStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.EmojiStore)
}
}
return r0
}
// FileInfo provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) FileInfo() store.FileInfoStore {
ret := _m.Called()
var r0 store.FileInfoStore
if rf, ok := ret.Get(0).(func() store.FileInfoStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.FileInfoStore)
}
}
return r0
}
// GetCurrentSchemaVersion provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) GetCurrentSchemaVersion() string {
ret := _m.Called()
var r0 string
if rf, ok := ret.Get(0).(func() string); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(string)
}
return r0
}
// Group provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Group() store.GroupStore {
ret := _m.Called()
var r0 store.GroupStore
if rf, ok := ret.Get(0).(func() store.GroupStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.GroupStore)
}
}
return r0
}
// Job provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Job() store.JobStore {
ret := _m.Called()
var r0 store.JobStore
if rf, ok := ret.Get(0).(func() store.JobStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.JobStore)
}
}
return r0
}
// License provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) License() store.LicenseStore {
ret := _m.Called()
var r0 store.LicenseStore
if rf, ok := ret.Get(0).(func() store.LicenseStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.LicenseStore)
}
}
return r0
}
// LinkMetadata provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) LinkMetadata() store.LinkMetadataStore {
ret := _m.Called()
var r0 store.LinkMetadataStore
if rf, ok := ret.Get(0).(func() store.LinkMetadataStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.LinkMetadataStore)
}
}
return r0
}
// LockToMaster provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) LockToMaster() {
_m.Called()
}
// MarkSystemRanUnitTests provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) MarkSystemRanUnitTests() {
_m.Called()
}
// Next provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Next() store.LayeredStoreSupplier {
ret := _m.Called()
var r0 store.LayeredStoreSupplier
if rf, ok := ret.Get(0).(func() store.LayeredStoreSupplier); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.LayeredStoreSupplier)
}
}
return r0
}
// OAuth provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) OAuth() store.OAuthStore {
ret := _m.Called()
var r0 store.OAuthStore
if rf, ok := ret.Get(0).(func() store.OAuthStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.OAuthStore)
}
}
return r0
}
// Plugin provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Plugin() store.PluginStore {
ret := _m.Called()
var r0 store.PluginStore
if rf, ok := ret.Get(0).(func() store.PluginStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.PluginStore)
}
}
return r0
}
// Post provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Post() store.PostStore {
ret := _m.Called()
var r0 store.PostStore
if rf, ok := ret.Get(0).(func() store.PostStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.PostStore)
}
}
return r0
}
// Preference provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Preference() store.PreferenceStore {
ret := _m.Called()
var r0 store.PreferenceStore
if rf, ok := ret.Get(0).(func() store.PreferenceStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.PreferenceStore)
}
}
return r0
}
// Reaction provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Reaction() store.ReactionStore {
ret := _m.Called()
var r0 store.ReactionStore
if rf, ok := ret.Get(0).(func() store.ReactionStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.ReactionStore)
}
}
return r0
}
// Role provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Role() store.RoleStore {
ret := _m.Called()
var r0 store.RoleStore
if rf, ok := ret.Get(0).(func() store.RoleStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.RoleStore)
}
}
return r0
}
// Scheme provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Scheme() store.SchemeStore {
ret := _m.Called()
var r0 store.SchemeStore
if rf, ok := ret.Get(0).(func() store.SchemeStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.SchemeStore)
}
}
return r0
}
// Session provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Session() store.SessionStore {
ret := _m.Called()
var r0 store.SessionStore
if rf, ok := ret.Get(0).(func() store.SessionStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.SessionStore)
}
}
return r0
}
// SetChainNext provides a mock function with given fields: _a0
func (_m *LayeredStoreDatabaseLayer) SetChainNext(_a0 store.LayeredStoreSupplier) {
_m.Called(_a0)
}
// Status provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Status() store.StatusStore {
ret := _m.Called()
var r0 store.StatusStore
if rf, ok := ret.Get(0).(func() store.StatusStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.StatusStore)
}
}
return r0
}
// System provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) System() store.SystemStore {
ret := _m.Called()
var r0 store.SystemStore
if rf, ok := ret.Get(0).(func() store.SystemStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.SystemStore)
}
}
return r0
}
// Team provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Team() store.TeamStore {
ret := _m.Called()
var r0 store.TeamStore
if rf, ok := ret.Get(0).(func() store.TeamStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.TeamStore)
}
}
return r0
}
// TermsOfService provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) TermsOfService() store.TermsOfServiceStore {
ret := _m.Called()
var r0 store.TermsOfServiceStore
if rf, ok := ret.Get(0).(func() store.TermsOfServiceStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.TermsOfServiceStore)
}
}
return r0
}
// Token provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Token() store.TokenStore {
ret := _m.Called()
var r0 store.TokenStore
if rf, ok := ret.Get(0).(func() store.TokenStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.TokenStore)
}
}
return r0
}
// TotalMasterDbConnections provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) TotalMasterDbConnections() int {
ret := _m.Called()
var r0 int
if rf, ok := ret.Get(0).(func() int); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(int)
}
return r0
}
// TotalReadDbConnections provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) TotalReadDbConnections() int {
ret := _m.Called()
var r0 int
if rf, ok := ret.Get(0).(func() int); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(int)
}
return r0
}
// TotalSearchDbConnections provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) TotalSearchDbConnections() int {
ret := _m.Called()
var r0 int
if rf, ok := ret.Get(0).(func() int); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(int)
}
return r0
}
// UnlockFromMaster provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) UnlockFromMaster() {
_m.Called()
}
// User provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) User() store.UserStore {
ret := _m.Called()
var r0 store.UserStore
if rf, ok := ret.Get(0).(func() store.UserStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.UserStore)
}
}
return r0
}
// UserAccessToken provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) UserAccessToken() store.UserAccessTokenStore {
ret := _m.Called()
var r0 store.UserAccessTokenStore
if rf, ok := ret.Get(0).(func() store.UserAccessTokenStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.UserAccessTokenStore)
}
}
return r0
}
// UserTermsOfService provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) UserTermsOfService() store.UserTermsOfServiceStore {
ret := _m.Called()
var r0 store.UserTermsOfServiceStore
if rf, ok := ret.Get(0).(func() store.UserTermsOfServiceStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.UserTermsOfServiceStore)
}
}
return r0
}
// Webhook provides a mock function with given fields:
func (_m *LayeredStoreDatabaseLayer) Webhook() store.WebhookStore {
ret := _m.Called()
var r0 store.WebhookStore
if rf, ok := ret.Get(0).(func() store.WebhookStore); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.WebhookStore)
}
}
return r0
}

Просмотреть файл

@@ -1,36 +0,0 @@
// Code generated by mockery v1.0.0. DO NOT EDIT.
// Regenerate this file using `make store-mocks`.
package mocks
import (
store "github.com/mattermost/mattermost-server/store"
mock "github.com/stretchr/testify/mock"
)
// LayeredStoreSupplier is an autogenerated mock type for the LayeredStoreSupplier type
type LayeredStoreSupplier struct {
mock.Mock
}
// Next provides a mock function with given fields:
func (_m *LayeredStoreSupplier) Next() store.LayeredStoreSupplier {
ret := _m.Called()
var r0 store.LayeredStoreSupplier
if rf, ok := ret.Get(0).(func() store.LayeredStoreSupplier); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.LayeredStoreSupplier)
}
}
return r0
}
// SetChainNext provides a mock function with given fields: _a0
func (_m *LayeredStoreSupplier) SetChainNext(_a0 store.LayeredStoreSupplier) {
_m.Called(_a0)
}

Просмотреть файл

@@ -69,18 +69,15 @@ func testTeamStoreSave(t *testing.T, ss store.Store) {
o1.Email = MakeEmail()
o1.Type = model.TEAM_OPEN
if _, err := ss.Team().Save(&o1); err != nil {
t.Fatal("couldn't save item", err)
}
_, err := ss.Team().Save(&o1)
require.Nil(t, err, "couldn't save item")
if _, err := ss.Team().Save(&o1); err == nil {
t.Fatal("shouldn't be able to update from save")
}
_, err = ss.Team().Save(&o1)
require.NotNil(t, err, "shouldn't be able to update from save")
o1.Id = ""
if _, err := ss.Team().Save(&o1); err == nil {
t.Fatal("should be unique domain")
}
_, err = ss.Team().Save(&o1)
require.NotNil(t, err, "should be unique domain")
}
func testTeamStoreUpdate(t *testing.T, ss store.Store) {
@@ -89,25 +86,21 @@ func testTeamStoreUpdate(t *testing.T, ss store.Store) {
o1.Name = "z-z-z" + model.NewId() + "b"
o1.Email = MakeEmail()
o1.Type = model.TEAM_OPEN
if _, err := ss.Team().Save(&o1); err != nil {
t.Fatal(err)
}
_, err := ss.Team().Save(&o1)
require.Nil(t, err)
time.Sleep(100 * time.Millisecond)
if _, err := ss.Team().Update(&o1); err != nil {
t.Fatal(err)
}
_, err = ss.Team().Update(&o1)
require.Nil(t, err)
o1.Id = "missing"
if _, err := ss.Team().Update(&o1); err == nil {
t.Fatal("Update should have failed because of missing key")
}
_, err = ss.Team().Update(&o1)
require.NotNil(t, err, "Update should have failed because of missing key")
o1.Id = model.NewId()
if _, err := ss.Team().Update(&o1); err == nil {
t.Fatal("Update should have faile because id change")
}
_, err = ss.Team().Update(&o1)
require.NotNil(t, err, "Update should have faile because id change")
}
func testTeamStoreGet(t *testing.T, ss store.Store) {
@@ -134,21 +127,15 @@ func testTeamStoreGetByName(t *testing.T, ss store.Store) {
o1.Email = MakeEmail()
o1.Type = model.TEAM_OPEN
if _, err := ss.Team().Save(&o1); err != nil {
t.Fatal(err)
}
_, err := ss.Team().Save(&o1)
require.Nil(t, err)
if team, err := ss.Team().GetByName(o1.Name); err != nil {
t.Fatal(err)
} else {
if team.ToJson() != o1.ToJson() {
t.Fatal("invalid returned team")
}
}
team, err := ss.Team().GetByName(o1.Name)
require.Nil(t, err)
require.Equal(t, *team, o1, "invalid returned team")
if _, err := ss.Team().GetByName(""); err == nil {
t.Fatal("Missing id should have failed")
}
_, err = ss.Team().GetByName("")
require.NotNil(t, err, "Missing id should have failed")
}
func testTeamStoreSearchAll(t *testing.T, ss store.Store) {
@@ -363,9 +350,7 @@ func testTeamStoreGetByInviteId(t *testing.T, ss store.Store) {
o1.InviteId = model.NewId()
save1, err := ss.Team().Save(&o1)
if err != nil {
t.Fatal(err)
}
require.Nil(t, err)
o2 := model.Team{}
o2.DisplayName = "DisplayName"
@@ -373,17 +358,12 @@ func testTeamStoreGetByInviteId(t *testing.T, ss store.Store) {
o2.Email = MakeEmail()
o2.Type = model.TEAM_OPEN
if r1, err := ss.Team().GetByInviteId(save1.InviteId); err != nil {
t.Fatal(err)
} else {
if r1.ToJson() != o1.ToJson() {
t.Fatal("invalid returned team")
}
}
r1, err := ss.Team().GetByInviteId(save1.InviteId)
require.Nil(t, err)
require.Equal(t, *r1, o1, "invalid returned team")
if _, err := ss.Team().GetByInviteId(""); err == nil {
t.Fatal("Missing id should have failed")
}
_, err = ss.Team().GetByInviteId("")
require.NotNil(t, err, "Missing id should have failed")
}
func testTeamStoreByUserId(t *testing.T, ss store.Store) {
@@ -400,18 +380,10 @@ func testTeamStoreByUserId(t *testing.T, ss store.Store) {
_, err = ss.Team().SaveMember(m1, -1)
require.Nil(t, err)
if teams, err := ss.Team().GetTeamsByUserId(m1.UserId); err != nil {
t.Fatal(err)
} else {
if len(teams) == 0 {
t.Fatal("Should return a team")
}
if teams[0].Id != o1.Id {
t.Fatal("should be a member")
}
}
teams, err := ss.Team().GetTeamsByUserId(m1.UserId)
require.Nil(t, err)
require.Len(t, teams, 1, "Should return a team")
require.Equal(t, teams[0].Id, o1.Id, "should be a member")
}
func testGetAllTeamListing(t *testing.T, ss store.Store) {
@@ -449,19 +421,13 @@ func testGetAllTeamListing(t *testing.T, ss store.Store) {
_, err = ss.Team().Save(&o4)
require.Nil(t, err)
if teams, err := ss.Team().GetAllTeamListing(); err != nil {
t.Fatal(err)
} else {
for _, team := range teams {
if !team.AllowOpenInvite {
t.Fatal("should have returned team with AllowOpenInvite as true")
}
}
if len(teams) == 0 {
t.Fatal("failed team listing")
}
teams, err := ss.Team().GetAllTeamListing()
require.Nil(t, err)
for _, team := range teams {
require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
}
require.NotEmpty(t, teams, "failed team listing")
}
func testGetAllTeamPageListing(t *testing.T, ss store.Store) {
@@ -505,14 +471,10 @@ func testGetAllTeamPageListing(t *testing.T, ss store.Store) {
require.Nil(t, err)
for _, team := range teams {
if !team.AllowOpenInvite {
t.Fatal("should have returned team with AllowOpenInvite as true")
}
require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
}
if len(teams) > 10 {
t.Fatal("should have returned max of 10 teams")
}
require.LessOrEqual(t, len(teams), 10, "should have returned max of 10 teams")
o5 := model.Team{}
o5.DisplayName = "DisplayName"
@@ -527,27 +489,19 @@ func testGetAllTeamPageListing(t *testing.T, ss store.Store) {
require.Nil(t, err)
for _, team := range teams {
if !team.AllowOpenInvite {
t.Fatal("should have returned team with AllowOpenInvite as true")
}
require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
}
if len(teams) > 4 {
t.Fatal("should have returned max of 4 teams")
}
require.LessOrEqual(t, len(teams), 4, "should have returned max of 4 teams")
teams, err = ss.Team().GetAllTeamPageListing(1, 1)
require.Nil(t, err)
for _, team := range teams {
if !team.AllowOpenInvite {
t.Fatal("should have returned team with AllowOpenInvite as true")
}
require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
}
if len(teams) > 1 {
t.Fatal("should have returned max of 1 team")
}
require.LessOrEqual(t, len(teams), 1, "should have returned max of 1 team")
}
func testGetAllPrivateTeamListing(t *testing.T, ss store.Store) {
@@ -585,18 +539,12 @@ func testGetAllPrivateTeamListing(t *testing.T, ss store.Store) {
_, err = ss.Team().Save(&o4)
require.Nil(t, err)
if teams, err := ss.Team().GetAllPrivateTeamListing(); err != nil {
t.Fatal(err)
} else {
for _, team := range teams {
if team.AllowOpenInvite {
t.Fatal("should have returned team with AllowOpenInvite as false")
}
}
teams, err := ss.Team().GetAllPrivateTeamListing()
require.Nil(t, err)
require.NotEmpty(t, teams, "failed team listing")
if len(teams) == 0 {
t.Fatal("failed team listing")
}
for _, team := range teams {
require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
}
}
@@ -637,20 +585,14 @@ func testGetAllPrivateTeamPageListing(t *testing.T, ss store.Store) {
_, err = ss.Team().Save(&o4)
require.Nil(t, err)
if teams, listErr := ss.Team().GetAllPrivateTeamPageListing(0, 10); listErr != nil {
t.Fatal(listErr)
} else {
for _, team := range teams {
if team.AllowOpenInvite {
t.Fatal("should have returned team with AllowOpenInvite as false")
}
}
if len(teams) > 10 {
t.Fatal("should have returned max of 10 teams")
}
teams, listErr := ss.Team().GetAllPrivateTeamPageListing(0, 10)
require.Nil(t, listErr)
for _, team := range teams {
require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
}
require.LessOrEqual(t, len(teams), 10, "should have returned max of 10 teams")
o5 := model.Team{}
o5.DisplayName = "DisplayName"
o5.Name = "z-z-z" + model.NewId() + "b"
@@ -660,33 +602,21 @@ func testGetAllPrivateTeamPageListing(t *testing.T, ss store.Store) {
_, err = ss.Team().Save(&o5)
require.Nil(t, err)
if teams, listErr := ss.Team().GetAllPrivateTeamPageListing(0, 4); listErr != nil {
t.Fatal(listErr)
} else {
for _, team := range teams {
if team.AllowOpenInvite {
t.Fatal("should have returned team with AllowOpenInvite as false")
}
}
if len(teams) > 4 {
t.Fatal("should have returned max of 4 teams")
}
teams, listErr = ss.Team().GetAllPrivateTeamPageListing(0, 4)
require.Nil(t, listErr)
for _, team := range teams {
require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
}
if teams, listErr := ss.Team().GetAllPrivateTeamPageListing(1, 1); listErr != nil {
t.Fatal(listErr)
} else {
for _, team := range teams {
if team.AllowOpenInvite {
t.Fatal("should have returned team with AllowOpenInvite as false")
}
}
require.LessOrEqual(t, len(teams), 4, "should have returned max of 4 teams")
if len(teams) > 1 {
t.Fatal("should have returned max of 1 team")
}
teams, listErr = ss.Team().GetAllPrivateTeamPageListing(1, 1)
require.Nil(t, listErr)
for _, team := range teams {
require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
}
require.LessOrEqual(t, len(teams), 1, "should have returned max of 1 team")
}
func testGetAllPublicTeamPageListing(t *testing.T, ss store.Store) {
@@ -767,9 +697,8 @@ func testDelete(t *testing.T, ss store.Store) {
_, err = ss.Team().Save(&o2)
require.Nil(t, err)
if r1 := ss.Team().PermanentDelete(o1.Id); r1 != nil {
t.Fatal(r1)
}
r1 := ss.Team().PermanentDelete(o1.Id)
require.Nil(t, r1)
}
func testPublicTeamCount(t *testing.T, ss store.Store) {
@@ -852,13 +781,9 @@ func testTeamCount(t *testing.T, ss store.Store) {
_, err := ss.Team().Save(&o1)
require.Nil(t, err)
if teamCount, err := ss.Team().AnalyticsTeamCount(); err != nil {
t.Fatal(err)
} else {
if teamCount == 0 {
t.Fatal("should be at least 1 team")
}
}
teamCount, err := ss.Team().AnalyticsTeamCount()
require.Nil(t, err)
require.NotEqual(t, 0, int(teamCount), "should be at least 1 team")
}
func testTeamMembers(t *testing.T, ss store.Store) {
@@ -880,47 +805,33 @@ func testTeamMembers(t *testing.T, ss store.Store) {
require.Nil(t, err)
assert.Len(t, ms, 2)
if ms, err = ss.Team().GetMembers(teamId2, 0, 100, nil); err != nil {
t.Fatal(err)
} else {
ms, err = ss.Team().GetMembers(teamId2, 0, 100, nil)
require.Nil(t, err)
require.Len(t, ms, 1)
require.Equal(t, m3.UserId, ms[0].UserId)
require.Len(t, ms, 1)
require.Equal(t, m3.UserId, ms[0].UserId)
}
ms, err = ss.Team().GetTeamsForUser(m1.UserId)
require.Nil(t, err)
require.Len(t, ms, 1)
require.Equal(t, m1.TeamId, ms[0].TeamId)
if ms, err = ss.Team().GetTeamsForUser(m1.UserId); err != nil {
t.Fatal(err)
} else {
err = ss.Team().RemoveMember(teamId1, m1.UserId)
require.Nil(t, err)
require.Len(t, ms, 1)
require.Equal(t, m1.TeamId, ms[0].TeamId)
}
if err = ss.Team().RemoveMember(teamId1, m1.UserId); err != nil {
t.Fatal(err)
}
if ms, err = ss.Team().GetMembers(teamId1, 0, 100, nil); err != nil {
t.Fatal(err)
} else {
require.Len(t, ms, 1)
require.Equal(t, m2.UserId, ms[0].UserId)
}
ms, err = ss.Team().GetMembers(teamId1, 0, 100, nil)
require.Nil(t, err)
require.Len(t, ms, 1)
require.Equal(t, m2.UserId, ms[0].UserId)
_, err = ss.Team().SaveMember(m1, -1)
require.Nil(t, err)
if err = ss.Team().RemoveAllMembersByTeam(teamId1); err != nil {
t.Fatal(err)
}
err = ss.Team().RemoveAllMembersByTeam(teamId1)
require.Nil(t, err)
if ms, err = ss.Team().GetMembers(teamId1, 0, 100, nil); err != nil {
t.Fatal(err)
} else {
require.Len(t, ms, 0)
}
ms, err = ss.Team().GetMembers(teamId1, 0, 100, nil)
require.Nil(t, err)
require.Len(t, ms, 0)
uid := model.NewId()
m4 := &model.TeamMember{TeamId: teamId1, UserId: uid}
@@ -930,23 +841,16 @@ func testTeamMembers(t *testing.T, ss store.Store) {
_, err = ss.Team().SaveMember(m5, -1)
require.Nil(t, err)
if ms, err = ss.Team().GetTeamsForUser(uid); err != nil {
t.Fatal(err)
} else {
ms, err = ss.Team().GetTeamsForUser(uid)
require.Nil(t, err)
require.Len(t, ms, 2)
require.Len(t, ms, 2)
}
err = ss.Team().RemoveAllMembersByUser(uid)
require.Nil(t, err)
if err = ss.Team().RemoveAllMembersByUser(uid); err != nil {
t.Fatal(err)
}
if ms, err = ss.Team().GetTeamsForUser(m1.UserId); err != nil {
t.Fatal(err)
} else {
require.Len(t, ms, 0)
}
ms, err = ss.Team().GetTeamsForUser(m1.UserId)
require.Nil(t, err)
require.Len(t, ms, 0)
}
func testTeamMembersWithPagination(t *testing.T, ss store.Store) {
@@ -1044,11 +948,9 @@ func testSaveTeamMemberMaxMembers(t *testing.T, ss store.Store) {
}(userIds[i])
}
if totalMemberCount, err := ss.Team().GetTotalMemberCount(team.Id, nil); err != nil {
t.Fatal(err)
} else if int(totalMemberCount) != maxUsersPerTeam {
t.Fatalf("should start with 5 team members, had %v instead", totalMemberCount)
}
totalMemberCount, err := ss.Team().GetTotalMemberCount(team.Id, nil)
require.Nil(t, err)
require.Equal(t, int(totalMemberCount), maxUsersPerTeam, "should start with 5 team members, had %v instead", totalMemberCount)
user, err := ss.User().Save(&model.User{
Username: model.NewId(),
@@ -1060,47 +962,36 @@ func testSaveTeamMemberMaxMembers(t *testing.T, ss store.Store) {
ss.User().PermanentDelete(newUserId)
}()
if _, err = ss.Team().SaveMember(&model.TeamMember{
_, err = ss.Team().SaveMember(&model.TeamMember{
TeamId: team.Id,
UserId: newUserId,
}, maxUsersPerTeam); err == nil {
t.Fatal("shouldn't be able to save member when at maximum members per team")
}
}, maxUsersPerTeam)
require.NotNil(t, err, "shouldn't be able to save member when at maximum members per team")
if totalMemberCount, teamErr := ss.Team().GetTotalMemberCount(team.Id, nil); teamErr != nil {
t.Fatal(teamErr)
} else if int(totalMemberCount) != maxUsersPerTeam {
t.Fatalf("should still have 5 team members, had %v instead", totalMemberCount)
}
totalMemberCount, teamErr := ss.Team().GetTotalMemberCount(team.Id, nil)
require.Nil(t, teamErr)
require.Equal(t, maxUsersPerTeam, int(totalMemberCount), "should still have 5 team members, had %v instead", totalMemberCount)
// Leaving the team from the UI sets DeleteAt instead of using TeamStore.RemoveMember
if _, teamErr := ss.Team().UpdateMember(&model.TeamMember{
_, teamErr = ss.Team().UpdateMember(&model.TeamMember{
TeamId: team.Id,
UserId: userIds[0],
DeleteAt: 1234,
}); teamErr != nil {
panic(teamErr)
}
})
require.Nil(t, teamErr)
if totalMemberCount, teamErr := ss.Team().GetTotalMemberCount(team.Id, nil); teamErr != nil {
t.Fatal(teamErr)
} else if int(totalMemberCount) != maxUsersPerTeam-1 {
t.Fatalf("should now only have 4 team members, had %v instead", totalMemberCount)
}
totalMemberCount, teamErr = ss.Team().GetTotalMemberCount(team.Id, nil)
require.Nil(t, teamErr)
require.Equal(t, maxUsersPerTeam-1, int(totalMemberCount), "should now only have 4 team members, had %v instead", totalMemberCount)
if _, err = ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId}, maxUsersPerTeam); err != nil {
t.Fatal("should've been able to save new member after deleting one", err)
} else {
defer func(userId string) {
ss.Team().RemoveMember(team.Id, userId)
}(newUserId)
}
_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId}, maxUsersPerTeam)
require.Nil(t, err, "should've been able to save new member after deleting one")
if totalMemberCount, teamErr := ss.Team().GetTotalMemberCount(team.Id, nil); teamErr != nil {
t.Fatal(teamErr)
} else if int(totalMemberCount) != maxUsersPerTeam {
t.Fatalf("should have 5 team members again, had %v instead", totalMemberCount)
}
defer ss.Team().RemoveMember(team.Id, newUserId)
totalMemberCount, teamErr = ss.Team().GetTotalMemberCount(team.Id, nil)
require.Nil(t, teamErr)
require.Equal(t, maxUsersPerTeam, int(totalMemberCount), "should have 5 team members again, had %v instead", totalMemberCount)
// Deactivating a user should make them stop counting against max members
user2, err := ss.User().Get(userIds[1])
@@ -1115,13 +1006,10 @@ func testSaveTeamMemberMaxMembers(t *testing.T, ss store.Store) {
})
require.Nil(t, err)
newUserId2 := user.Id
if _, err := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId2}, maxUsersPerTeam); err != nil {
t.Fatal("should've been able to save new member after deleting one", err)
} else {
defer func(userId string) {
ss.Team().RemoveMember(team.Id, userId)
}(newUserId2)
}
_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId2}, maxUsersPerTeam)
require.Nil(t, err, "should've been able to save new member after deleting one")
defer ss.Team().RemoveMember(team.Id, newUserId2)
}
func testGetTeamMember(t *testing.T, ss store.Store) {
@@ -1132,26 +1020,18 @@ func testGetTeamMember(t *testing.T, ss store.Store) {
require.Nil(t, err)
var rm1 *model.TeamMember
if rm1, err = ss.Team().GetMember(m1.TeamId, m1.UserId); err != nil {
t.Fatal(err)
} else {
rm1, err = ss.Team().GetMember(m1.TeamId, m1.UserId)
require.Nil(t, err)
if rm1.TeamId != m1.TeamId {
t.Fatal("bad team id")
}
require.Equal(t, rm1.TeamId, m1.TeamId, "bad team id")
if rm1.UserId != m1.UserId {
t.Fatal("bad user id")
}
}
require.Equal(t, rm1.UserId, m1.UserId, "bad user id")
if _, err = ss.Team().GetMember(m1.TeamId, ""); err == nil {
t.Fatal("empty user id - should have failed")
}
_, err = ss.Team().GetMember(m1.TeamId, "")
require.NotNil(t, err, "empty user id - should have failed")
if _, err = ss.Team().GetMember("", m1.UserId); err == nil {
t.Fatal("empty team id - should have failed")
}
_, err = ss.Team().GetMember("", m1.UserId)
require.NotNil(t, err, "empty team id - should have failed")
// Test with a custom team scheme.
s2 := &model.Scheme{
@@ -1204,36 +1084,24 @@ func testGetTeamMembersByIds(t *testing.T, ss store.Store) {
require.Nil(t, err)
var r []*model.TeamMember
if r, err = ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId}, nil); err != nil {
t.Fatal(err)
} else {
rm1 := r[0]
r, err = ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId}, nil)
require.Nil(t, err)
rm1 := r[0]
if rm1.TeamId != m1.TeamId {
t.Fatal("bad team id")
}
if rm1.UserId != m1.UserId {
t.Fatal("bad user id")
}
}
require.Equal(t, rm1.TeamId, m1.TeamId, "bad team id")
require.Equal(t, rm1.UserId, m1.UserId, "bad user id")
m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
_, err = ss.Team().SaveMember(m2, -1)
require.Nil(t, err)
if rm, err := ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId, m2.UserId, model.NewId()}, nil); err != nil {
t.Fatal(err)
} else {
rm, err := ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId, m2.UserId, model.NewId()}, nil)
require.Nil(t, err)
if len(rm) != 2 {
t.Fatal("return wrong number of results")
}
}
require.Len(t, rm, 2, "return wrong number of results")
if _, err := ss.Team().GetMembersByIds(m1.TeamId, []string{}, nil); err == nil {
t.Fatal("empty user ids - should have failed")
}
_, err = ss.Team().GetMembersByIds(m1.TeamId, []string{}, nil)
require.NotNil(t, err, "empty user ids - should have failed")
}
func testTeamStoreMemberCount(t *testing.T, ss store.Store) {
@@ -1258,42 +1126,26 @@ func testTeamStoreMemberCount(t *testing.T, ss store.Store) {
require.Nil(t, err)
var totalMemberCount int64
if totalMemberCount, err = ss.Team().GetTotalMemberCount(teamId1, nil); err != nil {
t.Fatal(err)
} else {
if totalMemberCount != 2 {
t.Fatal("wrong count")
}
}
totalMemberCount, err = ss.Team().GetTotalMemberCount(teamId1, nil)
require.Nil(t, err)
require.Equal(t, int(totalMemberCount), 2, "wrong count")
var result int64
if result, err = ss.Team().GetActiveMemberCount(teamId1, nil); err != nil {
t.Fatal(err)
} else {
if result != 1 {
t.Fatal("wrong count")
}
}
result, err = ss.Team().GetActiveMemberCount(teamId1, nil)
require.Nil(t, err)
require.Equal(t, 1, int(result), "wrong count")
m3 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
_, err = ss.Team().SaveMember(m3, -1)
require.Nil(t, err)
if totalMemberCount, err := ss.Team().GetTotalMemberCount(teamId1, nil); err != nil {
t.Fatal(err)
} else {
if totalMemberCount != 2 {
t.Fatal("wrong count")
}
}
totalMemberCount, err = ss.Team().GetTotalMemberCount(teamId1, nil)
require.Nil(t, err)
require.Equal(t, 2, int(totalMemberCount), "wrong count")
if result, err := ss.Team().GetActiveMemberCount(teamId1, nil); err != nil {
t.Fatal(err)
} else {
if result != 1 {
t.Fatal("wrong count")
}
}
result, err = ss.Team().GetActiveMemberCount(teamId1, nil)
require.Nil(t, err)
require.Equal(t, 1, int(result), "wrong count")
}
func testGetChannelUnreadsForAllTeams(t *testing.T, ss store.Store) {
@@ -1323,48 +1175,35 @@ func testGetChannelUnreadsForAllTeams(t *testing.T, ss store.Store) {
_, err = ss.Channel().SaveMember(cm2)
require.Nil(t, err)
if ms1, err := ss.Team().GetChannelUnreadsForAllTeams("", uid); err != nil {
t.Fatal(err)
} else {
membersMap := make(map[string]bool)
for i := range ms1 {
id := ms1[i].TeamId
if _, ok := membersMap[id]; !ok {
membersMap[id] = true
}
}
if len(membersMap) != 2 {
t.Fatal("Should be the unreads for all the teams")
ms1, err := ss.Team().GetChannelUnreadsForAllTeams("", uid)
require.Nil(t, err)
membersMap := make(map[string]bool)
for i := range ms1 {
id := ms1[i].TeamId
if _, ok := membersMap[id]; !ok {
membersMap[id] = true
}
}
require.Len(t, membersMap, 2, "Should be the unreads for all the teams")
if ms1[0].MsgCount != 10 {
t.Fatal("subtraction failed")
require.Equal(t, 10, int(ms1[0].MsgCount), "subtraction failed")
ms2, err := ss.Team().GetChannelUnreadsForAllTeams(teamId1, uid)
require.Nil(t, err)
membersMap = make(map[string]bool)
for i := range ms2 {
id := ms2[i].TeamId
if _, ok := membersMap[id]; !ok {
membersMap[id] = true
}
}
if ms2, err := ss.Team().GetChannelUnreadsForAllTeams(teamId1, uid); err != nil {
t.Fatal(err)
} else {
membersMap := make(map[string]bool)
for i := range ms2 {
id := ms2[i].TeamId
if _, ok := membersMap[id]; !ok {
membersMap[id] = true
}
}
require.Len(t, membersMap, 1, "Should be the unreads for just one team")
if len(membersMap) != 1 {
t.Fatal("Should be the unreads for just one team")
}
require.Equal(t, 10, int(ms2[0].MsgCount), "subtraction failed")
if ms2[0].MsgCount != 10 {
t.Fatal("subtraction failed")
}
}
if err := ss.Team().RemoveAllMembersByUser(uid); err != nil {
t.Fatal(err)
}
err = ss.Team().RemoveAllMembersByUser(uid)
require.Nil(t, err)
}
func testGetChannelUnreadsForTeam(t *testing.T, ss store.Store) {
@@ -1390,17 +1229,11 @@ func testGetChannelUnreadsForTeam(t *testing.T, ss store.Store) {
_, err = ss.Channel().SaveMember(cm2)
require.Nil(t, err)
if ms, err := ss.Team().GetChannelUnreadsForTeam(m1.TeamId, m1.UserId); err != nil {
t.Fatal(err)
} else {
if len(ms) != 2 {
t.Fatal("wrong length")
}
ms, err := ss.Team().GetChannelUnreadsForTeam(m1.TeamId, m1.UserId)
require.Nil(t, err)
require.Len(t, ms, 2, "wrong length")
if ms[0].MsgCount != 10 {
t.Fatal("subtraction failed")
}
}
require.Equal(t, 10, int(ms[0].MsgCount), "subtraction failed")
}
func testUpdateLastTeamIconUpdate(t *testing.T, ss store.Store) {
@@ -1419,16 +1252,13 @@ func testUpdateLastTeamIconUpdate(t *testing.T, ss store.Store) {
curTime := model.GetMillis()
if err = ss.Team().UpdateLastTeamIconUpdate(o1.Id, curTime); err != nil {
t.Fatal(err)
}
err = ss.Team().UpdateLastTeamIconUpdate(o1.Id, curTime)
require.Nil(t, err)
ro1, err := ss.Team().Get(o1.Id)
require.Nil(t, err)
if ro1.LastTeamIconUpdate <= lastTeamIconUpdateInitial {
t.Fatal("LastTeamIconUpdate not updated")
}
require.Greater(t, ro1.LastTeamIconUpdate, lastTeamIconUpdateInitial, "LastTeamIconUpdate not updated")
}
func testGetTeamsByScheme(t *testing.T, ss store.Store) {

Просмотреть файл

@@ -43,13 +43,11 @@ func TestWebhookStore(t *testing.T, ss store.Store) {
func testWebhookStoreSaveIncoming(t *testing.T, ss store.Store) {
o1 := buildIncomingWebhook()
if _, err := ss.Webhook().SaveIncoming(o1); err != nil {
t.Fatal("couldn't save item", err)
}
_, err := ss.Webhook().SaveIncoming(o1)
require.Nil(t, err, "couldn't save item")
if _, err := ss.Webhook().SaveIncoming(o1); err == nil {
t.Fatal("shouldn't be able to update from save")
}
_, err = ss.Webhook().SaveIncoming(o1)
require.NotNil(t, err, "shouldn't be able to update from save")
}
func testWebhookStoreUpdateIncoming(t *testing.T, ss store.Store) {
@@ -58,9 +56,7 @@ func testWebhookStoreUpdateIncoming(t *testing.T, ss store.Store) {
o1 := buildIncomingWebhook()
o1, err = ss.Webhook().SaveIncoming(o1)
if err != nil {
t.Fatal("unable to save webhook", err)
}
require.Nil(t, err, "unable to save webhook")
previousUpdatedAt := o1.UpdateAt
@@ -70,14 +66,9 @@ func testWebhookStoreUpdateIncoming(t *testing.T, ss store.Store) {
webhook, err := ss.Webhook().UpdateIncoming(o1)
require.Nil(t, err)
if webhook.UpdateAt == previousUpdatedAt {
t.Fatal("should have updated the UpdatedAt of the hook")
}
if webhook.DisplayName != "TestHook" {
t.Fatal("display name is not updated")
}
require.NotEqual(t, webhook.UpdateAt, previousUpdatedAt, "should have updated the UpdatedAt of the hook")
require.Equal(t, "TestHook", webhook.DisplayName, "display name is not updated")
}
func testWebhookStoreGetIncoming(t *testing.T, ss store.Store) {
@@ -85,33 +76,25 @@ func testWebhookStoreGetIncoming(t *testing.T, ss store.Store) {
o1 := buildIncomingWebhook()
o1, err = ss.Webhook().SaveIncoming(o1)
if err != nil {
t.Fatal("unable to save webhook", err)
}
require.Nil(t, err, "unable to save webhook")
webhook, err := ss.Webhook().GetIncoming(o1.Id, false)
require.Nil(t, err)
if webhook.CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
require.Equal(t, webhook.CreateAt, o1.CreateAt, "invalid returned webhook")
webhook, err = ss.Webhook().GetIncoming(o1.Id, true)
require.Nil(t, err)
if webhook.CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
require.Equal(t, webhook.CreateAt, o1.CreateAt, "invalid returned webhook")
if _, err = ss.Webhook().GetIncoming("123", false); err == nil {
t.Fatal("Missing id should have failed")
}
_, err = ss.Webhook().GetIncoming("123", false)
require.NotNil(t, err, "Missing id should have failed")
if _, err = ss.Webhook().GetIncoming("123", true); err == nil {
t.Fatal("Missing id should have failed")
}
_, err = ss.Webhook().GetIncoming("123", true)
require.NotNil(t, err, "Missing id should have failed")
if _, err = ss.Webhook().GetIncoming("123", true); err.StatusCode != http.StatusNotFound {
t.Fatal("Should have set the status as not found for missing id")
}
_, err = ss.Webhook().GetIncoming("123", true)
require.NotNil(t, err)
require.Equal(t, err.StatusCode, http.StatusNotFound, "Should have set the status as not found for missing id")
}
func testWebhookStoreGetIncomingList(t *testing.T, ss store.Store) {
@@ -122,31 +105,22 @@ func testWebhookStoreGetIncomingList(t *testing.T, ss store.Store) {
var err *model.AppError
o1, err = ss.Webhook().SaveIncoming(o1)
if err != nil {
t.Fatal("unable to save webhook", err)
}
require.Nil(t, err, "unable to save webhook")
if hooks, err := ss.Webhook().GetIncomingList(0, 1000); err != nil {
t.Fatal(err)
} else {
found := false
for _, hook := range hooks {
if hook.Id == o1.Id {
found = true
}
}
if !found {
t.Fatal("missing webhook")
}
}
hooks, err := ss.Webhook().GetIncomingList(0, 1000)
require.Nil(t, err)
if hooks, err := ss.Webhook().GetIncomingList(0, 1); err != nil {
t.Fatal(err)
} else {
if len(hooks) != 1 {
t.Fatal("only 1 should be returned")
found := false
for _, hook := range hooks {
if hook.Id == o1.Id {
found = true
}
}
require.True(t, found, "missing webhook")
hooks, err = ss.Webhook().GetIncomingList(0, 1)
require.Nil(t, err)
require.Len(t, hooks, 1, "only 1 should be returned")
}
func testWebhookStoreGetIncomingListByUser(t *testing.T, ss store.Store) {
@@ -179,21 +153,13 @@ func testWebhookStoreGetIncomingByTeam(t *testing.T, ss store.Store) {
o1, err = ss.Webhook().SaveIncoming(o1)
require.Nil(t, err)
if hooks, err := ss.Webhook().GetIncomingByTeam(o1.TeamId, 0, 100); err != nil {
t.Fatal(err)
} else {
if hooks[0].CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
}
hooks, err := ss.Webhook().GetIncomingByTeam(o1.TeamId, 0, 100)
require.Nil(t, err)
require.Equal(t, hooks[0].CreateAt, o1.CreateAt, "invalid returned webhook")
if hooks, err := ss.Webhook().GetIncomingByTeam("123", 0, 100); err != nil {
t.Fatal(err)
} else {
if len(hooks) != 0 {
t.Fatal("no webhooks should have returned")
}
}
hooks, err = ss.Webhook().GetIncomingByTeam("123", 0, 100)
require.Nil(t, err)
require.Len(t, hooks, 0, "no webhooks should have returned")
}
func TestWebhookStoreGetIncomingByTeamByUser(t *testing.T, ss store.Store) {
@@ -232,23 +198,15 @@ func TestWebhookStoreGetIncomingByChannel(t *testing.T, ss store.Store) {
o1 := buildIncomingWebhook()
o1, err := ss.Webhook().SaveIncoming(o1)
if err != nil {
t.Fatal("unable to save webhook")
}
require.Nil(t, err, "unable to save webhook")
webhooks, err := ss.Webhook().GetIncomingByChannel(o1.ChannelId)
require.Nil(t, err)
if webhooks[0].CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
require.Equal(t, webhooks[0].CreateAt, o1.CreateAt, "invalid returned webhook")
if webhooks, err = ss.Webhook().GetIncomingByChannel("123"); err != nil {
t.Fatal(err)
} else {
if len(webhooks) != 0 {
t.Fatal("no webhooks should have returned")
}
}
webhooks, err = ss.Webhook().GetIncomingByChannel("123")
require.Nil(t, err)
require.Len(t, webhooks, 0, "no webhooks should have returned")
}
func testWebhookStoreDeleteIncoming(t *testing.T, ss store.Store) {
@@ -256,19 +214,14 @@ func testWebhookStoreDeleteIncoming(t *testing.T, ss store.Store) {
o1 := buildIncomingWebhook()
o1, err = ss.Webhook().SaveIncoming(o1)
if err != nil {
t.Fatal("unable to save webhook", err)
}
require.Nil(t, err, "unable to save webhook")
webhook, err := ss.Webhook().GetIncoming(o1.Id, true)
require.Nil(t, err)
if webhook.CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
require.Equal(t, webhook.CreateAt, o1.CreateAt, "invalid returned webhook")
if err = ss.Webhook().DeleteIncoming(o1.Id, model.GetMillis()); err != nil {
t.Fatal(err)
}
err = ss.Webhook().DeleteIncoming(o1.Id, model.GetMillis())
require.Nil(t, err)
webhook, err = ss.Webhook().GetIncoming(o1.Id, true)
require.NotNil(t, err)
@@ -279,23 +232,17 @@ func testWebhookStoreDeleteIncomingByChannel(t *testing.T, ss store.Store) {
o1 := buildIncomingWebhook()
o1, err = ss.Webhook().SaveIncoming(o1)
if err != nil {
t.Fatal("unable to save webhook", err)
}
require.Nil(t, err, "unable to save webhook")
webhook, err := ss.Webhook().GetIncoming(o1.Id, true)
require.Nil(t, err)
if webhook.CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
require.Equal(t, webhook.CreateAt, o1.CreateAt, "invalid returned webhook")
if err = ss.Webhook().PermanentDeleteIncomingByChannel(o1.ChannelId); err != nil {
t.Fatal(err)
}
err = ss.Webhook().PermanentDeleteIncomingByChannel(o1.ChannelId)
require.Nil(t, err)
if _, err = ss.Webhook().GetIncoming(o1.Id, true); err == nil {
t.Fatal("Missing id should have failed")
}
_, err = ss.Webhook().GetIncoming(o1.Id, true)
require.NotNil(t, err, "Missing id should have failed")
}
func testWebhookStoreDeleteIncomingByUser(t *testing.T, ss store.Store) {
@@ -303,23 +250,17 @@ func testWebhookStoreDeleteIncomingByUser(t *testing.T, ss store.Store) {
o1 := buildIncomingWebhook()
o1, err = ss.Webhook().SaveIncoming(o1)
if err != nil {
t.Fatal("unable to save webhook", err)
}
require.Nil(t, err, "unable to save webhook")
webhook, err := ss.Webhook().GetIncoming(o1.Id, true)
require.Nil(t, err)
if webhook.CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
require.Equal(t, webhook.CreateAt, o1.CreateAt, "invalid returned webhook")
if err = ss.Webhook().PermanentDeleteIncomingByUser(o1.UserId); err != nil {
t.Fatal(err)
}
err = ss.Webhook().PermanentDeleteIncomingByUser(o1.UserId)
require.Nil(t, err)
if _, err = ss.Webhook().GetIncoming(o1.Id, true); err == nil {
t.Fatal("Missing id should have failed")
}
_, err = ss.Webhook().GetIncoming(o1.Id, true)
require.NotNil(t, err, "Missing id should have failed")
}
func buildIncomingWebhook() *model.IncomingWebhook {
@@ -340,13 +281,11 @@ func testWebhookStoreSaveOutgoing(t *testing.T, ss store.Store) {
o1.Username = "test-user-name"
o1.IconURL = "http://nowhere.com/icon"
if _, err := ss.Webhook().SaveOutgoing(&o1); err != nil {
t.Fatal("couldn't save item", err)
}
_, err := ss.Webhook().SaveOutgoing(&o1)
require.Nil(t, err, "couldn't save item")
if _, err := ss.Webhook().SaveOutgoing(&o1); err == nil {
t.Fatal("shouldn't be able to update from save")
}
_, err = ss.Webhook().SaveOutgoing(&o1)
require.NotNil(t, err, "shouldn't be able to update from save")
}
func testWebhookStoreGetOutgoing(t *testing.T, ss store.Store) {
@@ -362,13 +301,10 @@ func testWebhookStoreGetOutgoing(t *testing.T, ss store.Store) {
webhook, err := ss.Webhook().GetOutgoing(o1.Id)
require.Nil(t, err)
if webhook.CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
require.Equal(t, webhook.CreateAt, o1.CreateAt, "invalid returned webhook")
if _, err := ss.Webhook().GetOutgoing("123"); err == nil {
t.Fatal("Missing id should have failed")
}
_, err = ss.Webhook().GetOutgoing("123")
require.NotNil(t, err, "Missing id should have failed")
}
func testWebhookStoreGetOutgoingListByUser(t *testing.T, ss store.Store) {
@@ -412,38 +348,28 @@ func testWebhookStoreGetOutgoingList(t *testing.T, ss store.Store) {
o2, _ = ss.Webhook().SaveOutgoing(o2)
if r1, err := ss.Webhook().GetOutgoingList(0, 1000); err != nil {
t.Fatal(err)
} else {
hooks := r1
found1 := false
found2 := false
r1, err := ss.Webhook().GetOutgoingList(0, 1000)
require.Nil(t, err)
hooks := r1
found1 := false
found2 := false
for _, hook := range hooks {
if hook.CreateAt != o1.CreateAt {
found1 = true
}
if hook.CreateAt != o2.CreateAt {
found2 = true
}
for _, hook := range hooks {
if hook.CreateAt != o1.CreateAt {
found1 = true
}
if !found1 {
t.Fatal("missing hook1")
}
if !found2 {
t.Fatal("missing hook2")
if hook.CreateAt != o2.CreateAt {
found2 = true
}
}
if result, err := ss.Webhook().GetOutgoingList(0, 2); err != nil {
t.Fatal(err)
} else {
if len(result) != 2 {
t.Fatal("wrong number of hooks returned")
}
}
require.True(t, found1, "missing hook1")
require.True(t, found2, "missing hook2")
result, err := ss.Webhook().GetOutgoingList(0, 2)
require.Nil(t, err)
require.Len(t, result, 2, "wrong number of hooks returned")
}
func testWebhookStoreGetOutgoingByChannel(t *testing.T, ss store.Store) {
@@ -455,21 +381,13 @@ func testWebhookStoreGetOutgoingByChannel(t *testing.T, ss store.Store) {
o1, _ = ss.Webhook().SaveOutgoing(o1)
if r1, err := ss.Webhook().GetOutgoingByChannel(o1.ChannelId, 0, 100); err != nil {
t.Fatal(err)
} else {
if r1[0].CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
}
r1, err := ss.Webhook().GetOutgoingByChannel(o1.ChannelId, 0, 100)
require.Nil(t, err)
require.Equal(t, r1[0].CreateAt, o1.CreateAt, "invalid returned webhook")
if result, err := ss.Webhook().GetOutgoingByChannel("123", -1, -1); err != nil {
t.Fatal(err)
} else {
if len(result) != 0 {
t.Fatal("no webhooks should have returned")
}
}
result, err := ss.Webhook().GetOutgoingByChannel("123", -1, -1)
require.Nil(t, err)
require.Len(t, result, 0, "no webhooks should have returned")
}
func testWebhookStoreGetOutgoingByChannelByUser(t *testing.T, ss store.Store) {
@@ -520,21 +438,13 @@ func testWebhookStoreGetOutgoingByTeam(t *testing.T, ss store.Store) {
o1, _ = ss.Webhook().SaveOutgoing(o1)
if r1, err := ss.Webhook().GetOutgoingByTeam(o1.TeamId, 0, 100); err != nil {
t.Fatal(err)
} else {
if r1[0].CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
}
r1, err := ss.Webhook().GetOutgoingByTeam(o1.TeamId, 0, 100)
require.Nil(t, err)
require.Equal(t, r1[0].CreateAt, o1.CreateAt, "invalid returned webhook")
if result, err := ss.Webhook().GetOutgoingByTeam("123", -1, -1); err != nil {
t.Fatal(err)
} else {
if len(result) != 0 {
t.Fatal("no webhooks should have returned")
}
}
result, err := ss.Webhook().GetOutgoingByTeam("123", -1, -1)
require.Nil(t, err)
require.Len(t, result, 0, "no webhooks should have returned")
}
func testWebhookStoreGetOutgoingByTeamByUser(t *testing.T, ss store.Store) {
@@ -589,17 +499,13 @@ func testWebhookStoreDeleteOutgoing(t *testing.T, ss store.Store) {
webhook, err := ss.Webhook().GetOutgoing(o1.Id)
require.Nil(t, err)
if webhook.CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
require.Equal(t, webhook.CreateAt, o1.CreateAt, "invalid returned webhook")
if err := ss.Webhook().DeleteOutgoing(o1.Id, model.GetMillis()); err != nil {
t.Fatal(err)
}
err = ss.Webhook().DeleteOutgoing(o1.Id, model.GetMillis())
require.Nil(t, err)
if _, err := ss.Webhook().GetOutgoing(o1.Id); err == nil {
t.Fatal("Missing id should have failed")
}
_, err = ss.Webhook().GetOutgoing(o1.Id)
require.NotNil(t, err, "Missing id should have failed")
}
func testWebhookStoreDeleteOutgoingByChannel(t *testing.T, ss store.Store) {
@@ -613,17 +519,13 @@ func testWebhookStoreDeleteOutgoingByChannel(t *testing.T, ss store.Store) {
webhook, err := ss.Webhook().GetOutgoing(o1.Id)
require.Nil(t, err)
if webhook.CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
require.Equal(t, webhook.CreateAt, o1.CreateAt, "invalid returned webhook")
if err := ss.Webhook().PermanentDeleteOutgoingByChannel(o1.ChannelId); err != nil {
t.Fatal(err)
}
err = ss.Webhook().PermanentDeleteOutgoingByChannel(o1.ChannelId)
require.Nil(t, err)
if _, err := ss.Webhook().GetOutgoing(o1.Id); err == nil {
t.Fatal("Missing id should have failed")
}
_, err = ss.Webhook().GetOutgoing(o1.Id)
require.NotNil(t, err, "Missing id should have failed")
}
func testWebhookStoreDeleteOutgoingByUser(t *testing.T, ss store.Store) {
@@ -637,17 +539,13 @@ func testWebhookStoreDeleteOutgoingByUser(t *testing.T, ss store.Store) {
webhook, err := ss.Webhook().GetOutgoing(o1.Id)
require.Nil(t, err)
if webhook.CreateAt != o1.CreateAt {
t.Fatal("invalid returned webhook")
}
require.Equal(t, webhook.CreateAt, o1.CreateAt, "invalid returned webhook")
if err := ss.Webhook().PermanentDeleteOutgoingByUser(o1.CreatorId); err != nil {
t.Fatal(err)
}
err = ss.Webhook().PermanentDeleteOutgoingByUser(o1.CreatorId)
require.Nil(t, err)
if _, err := ss.Webhook().GetOutgoing(o1.Id); err == nil {
t.Fatal("Missing id should have failed")
}
_, err = ss.Webhook().GetOutgoing(o1.Id)
require.NotNil(t, err, "Missing id should have failed")
}
func testWebhookStoreUpdateOutgoing(t *testing.T, ss store.Store) {
@@ -664,9 +562,8 @@ func testWebhookStoreUpdateOutgoing(t *testing.T, ss store.Store) {
o1.Token = model.NewId()
o1.Username = "another-test-user-name"
if _, err := ss.Webhook().UpdateOutgoing(o1); err != nil {
t.Fatal(err)
}
_, err := ss.Webhook().UpdateOutgoing(o1)
require.Nil(t, err)
}
func testWebhookStoreCountIncoming(t *testing.T, ss store.Store) {
@@ -678,13 +575,9 @@ func testWebhookStoreCountIncoming(t *testing.T, ss store.Store) {
_, _ = ss.Webhook().SaveIncoming(o1)
c, err := ss.Webhook().AnalyticsIncomingCount("")
if err != nil {
t.Fatal(err)
}
require.Nil(t, err)
if c == 0 {
t.Fatal("should have at least 1 incoming hook")
}
require.NotEqual(t, 0, c, "should have at least 1 incoming hook")
}
func testWebhookStoreCountOutgoing(t *testing.T, ss store.Store) {
@@ -696,11 +589,7 @@ func testWebhookStoreCountOutgoing(t *testing.T, ss store.Store) {
ss.Webhook().SaveOutgoing(o1)
if r, err := ss.Webhook().AnalyticsOutgoingCount(""); err != nil {
t.Fatal(err)
} else {
if r == 0 {
t.Fatal("should have at least 1 outgoing hook")
}
}
r, err := ss.Webhook().AnalyticsOutgoingCount("")
require.Nil(t, err)
require.NotEqual(t, 0, r, "should have at least 1 outgoing hook")
}