Full Mattermost server source with integrated Community Enterprise features. Includes vendor directory for offline/air-gapped builds. Structure: - enterprise-impl/: Enterprise feature implementations - enterprise-community/: Init files that register implementations - enterprise/: Bridge imports (community_imports.go) - vendor/: All dependencies for offline builds Build (online): go build ./cmd/mattermost Build (offline/air-gapped): go build -mod=vendor ./cmd/mattermost 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
336 lines
10 KiB
Go
336 lines
10 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package storetest
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/mattermost/mattermost/server/public/model"
|
|
"github.com/mattermost/mattermost/server/public/shared/request"
|
|
"github.com/mattermost/mattermost/server/v8/channels/store"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestContentFlaggingStore(t *testing.T, rctx request.CTX, ss store.Store, s SqlStore) {
|
|
t.Run("SaveReviewerSettings", func(t *testing.T) { testSaveReviewerSettings(t, rctx, ss, s) })
|
|
t.Run("GetReviewerSettings", func(t *testing.T) { testGetReviewerSettings(t, rctx, ss, s) })
|
|
t.Run("SaveAndGetReviewerSettings", func(t *testing.T) { testSaveAndGetReviewerSettings(t, rctx, ss, s) })
|
|
}
|
|
|
|
func testSaveReviewerSettings(t *testing.T, rctx request.CTX, ss store.Store, s SqlStore) {
|
|
t.Run("save empty settings", func(t *testing.T) {
|
|
ss.ContentFlagging().ClearCaches()
|
|
|
|
commonReviewers := []string{}
|
|
teamSettings := map[string]*model.TeamReviewerSetting{}
|
|
|
|
reviewerSettings := model.ReviewerIDsSettings{
|
|
CommonReviewerIds: commonReviewers,
|
|
TeamReviewersSetting: teamSettings,
|
|
}
|
|
|
|
err := ss.ContentFlagging().SaveReviewerSettings(reviewerSettings)
|
|
assert.NoError(t, err)
|
|
|
|
// Verify settings were saved (should be empty)
|
|
settings, err := ss.ContentFlagging().GetReviewerSettings()
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 0, len(settings.CommonReviewerIds))
|
|
assert.Equal(t, 0, len(settings.TeamReviewersSetting))
|
|
})
|
|
|
|
t.Run("save common reviewers only", func(t *testing.T) {
|
|
ss.ContentFlagging().ClearCaches()
|
|
|
|
userId1 := model.NewId()
|
|
userId2 := model.NewId()
|
|
commonReviewers := []string{userId1, userId2}
|
|
teamSettings := map[string]*model.TeamReviewerSetting{}
|
|
|
|
reviewerSettings := model.ReviewerIDsSettings{
|
|
CommonReviewerIds: commonReviewers,
|
|
TeamReviewersSetting: teamSettings,
|
|
}
|
|
|
|
err := ss.ContentFlagging().SaveReviewerSettings(reviewerSettings)
|
|
assert.NoError(t, err)
|
|
|
|
// Verify settings were saved
|
|
settings, err := ss.ContentFlagging().GetReviewerSettings()
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, settings.CommonReviewerIds)
|
|
assert.Equal(t, 2, len(settings.CommonReviewerIds))
|
|
assert.Contains(t, settings.CommonReviewerIds, userId1)
|
|
assert.Contains(t, settings.CommonReviewerIds, userId2)
|
|
})
|
|
|
|
t.Run("save team settings only", func(t *testing.T) {
|
|
ss.ContentFlagging().ClearCaches()
|
|
|
|
teamId1 := model.NewId()
|
|
teamId2 := model.NewId()
|
|
enabled1 := true
|
|
enabled2 := false
|
|
|
|
commonReviewers := []string{}
|
|
teamSettings := map[string]*model.TeamReviewerSetting{
|
|
teamId1: {
|
|
Enabled: &enabled1,
|
|
ReviewerIds: []string{},
|
|
},
|
|
teamId2: {
|
|
Enabled: &enabled2,
|
|
ReviewerIds: []string{},
|
|
},
|
|
}
|
|
|
|
reviewerSettings := model.ReviewerIDsSettings{
|
|
CommonReviewerIds: commonReviewers,
|
|
TeamReviewersSetting: teamSettings,
|
|
}
|
|
|
|
err := ss.ContentFlagging().SaveReviewerSettings(reviewerSettings)
|
|
assert.NoError(t, err)
|
|
|
|
// Verify settings were saved
|
|
settings, err := ss.ContentFlagging().GetReviewerSettings()
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, settings.TeamReviewersSetting)
|
|
assert.Equal(t, 2, len(settings.TeamReviewersSetting))
|
|
|
|
teamSetting1, exists := (settings.TeamReviewersSetting)[teamId1]
|
|
assert.True(t, exists)
|
|
assert.NotNil(t, teamSetting1.Enabled)
|
|
assert.True(t, *teamSetting1.Enabled)
|
|
|
|
teamSetting2, exists := (settings.TeamReviewersSetting)[teamId2]
|
|
assert.True(t, exists)
|
|
assert.NotNil(t, teamSetting2.Enabled)
|
|
assert.False(t, *teamSetting2.Enabled)
|
|
})
|
|
|
|
t.Run("save team reviewers", func(t *testing.T) {
|
|
ss.ContentFlagging().ClearCaches()
|
|
|
|
teamId := model.NewId()
|
|
userId1 := model.NewId()
|
|
userId2 := model.NewId()
|
|
enabled := true
|
|
|
|
commonReviewers := []string{}
|
|
teamSettings := map[string]*model.TeamReviewerSetting{
|
|
teamId: {
|
|
Enabled: &enabled,
|
|
ReviewerIds: []string{userId1, userId2},
|
|
},
|
|
}
|
|
|
|
reviewerSettings := model.ReviewerIDsSettings{
|
|
CommonReviewerIds: commonReviewers,
|
|
TeamReviewersSetting: teamSettings,
|
|
}
|
|
|
|
err := ss.ContentFlagging().SaveReviewerSettings(reviewerSettings)
|
|
assert.NoError(t, err)
|
|
|
|
// Verify settings were saved
|
|
settings, err := ss.ContentFlagging().GetReviewerSettings()
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, settings.TeamReviewersSetting)
|
|
|
|
teamSetting, exists := settings.TeamReviewersSetting[teamId]
|
|
assert.True(t, exists)
|
|
assert.NotNil(t, teamSetting.ReviewerIds)
|
|
assert.Equal(t, 2, len(teamSetting.ReviewerIds))
|
|
assert.Contains(t, teamSetting.ReviewerIds, userId1)
|
|
assert.Contains(t, teamSetting.ReviewerIds, userId2)
|
|
})
|
|
|
|
t.Run("update existing settings", func(t *testing.T) {
|
|
ss.ContentFlagging().ClearCaches()
|
|
|
|
// First save some initial settings
|
|
userId1 := model.NewId()
|
|
teamId1 := model.NewId()
|
|
enabled1 := true
|
|
|
|
commonReviewers := []string{userId1}
|
|
teamSettings := map[string]*model.TeamReviewerSetting{
|
|
teamId1: {
|
|
Enabled: &enabled1,
|
|
ReviewerIds: []string{userId1},
|
|
},
|
|
}
|
|
|
|
reviewerSettings := model.ReviewerIDsSettings{
|
|
CommonReviewerIds: commonReviewers,
|
|
TeamReviewersSetting: teamSettings,
|
|
}
|
|
|
|
err := ss.ContentFlagging().SaveReviewerSettings(reviewerSettings)
|
|
assert.NoError(t, err)
|
|
|
|
// Now update with different settings
|
|
userId2 := model.NewId()
|
|
userId3 := model.NewId()
|
|
teamId2 := model.NewId()
|
|
enabled2 := false
|
|
|
|
newCommonReviewers := []string{userId2, userId3}
|
|
newTeamSettings := map[string]*model.TeamReviewerSetting{
|
|
teamId2: {
|
|
Enabled: &enabled2,
|
|
ReviewerIds: []string{userId2},
|
|
},
|
|
}
|
|
|
|
newReviewerSettings := model.ReviewerIDsSettings{
|
|
CommonReviewerIds: newCommonReviewers,
|
|
TeamReviewersSetting: newTeamSettings,
|
|
}
|
|
|
|
err = ss.ContentFlagging().SaveReviewerSettings(newReviewerSettings)
|
|
assert.NoError(t, err)
|
|
|
|
// Verify old settings were replaced
|
|
settings, err := ss.ContentFlagging().GetReviewerSettings()
|
|
assert.NoError(t, err)
|
|
|
|
// Common reviewers should be updated
|
|
assert.NotNil(t, settings.CommonReviewerIds)
|
|
assert.Equal(t, 2, len(settings.CommonReviewerIds))
|
|
assert.Contains(t, settings.CommonReviewerIds, userId2)
|
|
assert.Contains(t, settings.CommonReviewerIds, userId3)
|
|
assert.NotContains(t, settings.CommonReviewerIds, userId1)
|
|
|
|
// Team settings should be updated
|
|
assert.NotNil(t, settings.TeamReviewersSetting)
|
|
assert.Equal(t, 1, len(settings.TeamReviewersSetting))
|
|
|
|
_, exists := (settings.TeamReviewersSetting)[teamId1]
|
|
assert.False(t, exists) // Old team should be gone
|
|
|
|
teamSetting2, exists := (settings.TeamReviewersSetting)[teamId2]
|
|
assert.True(t, exists)
|
|
assert.NotNil(t, teamSetting2.Enabled)
|
|
assert.False(t, *teamSetting2.Enabled)
|
|
})
|
|
}
|
|
|
|
func testGetReviewerSettings(t *testing.T, rctx request.CTX, ss store.Store, s SqlStore) {
|
|
t.Run("get empty settings", func(t *testing.T) {
|
|
ss.ContentFlagging().ClearCaches()
|
|
|
|
// Clear any existing settings first
|
|
emptyCommonReviewers := []string{}
|
|
emptyTeamSettings := map[string]*model.TeamReviewerSetting{}
|
|
|
|
reviewerSettings := model.ReviewerIDsSettings{
|
|
CommonReviewerIds: emptyCommonReviewers,
|
|
TeamReviewersSetting: emptyTeamSettings,
|
|
}
|
|
|
|
err := ss.ContentFlagging().SaveReviewerSettings(reviewerSettings)
|
|
assert.NoError(t, err)
|
|
|
|
settings, err := ss.ContentFlagging().GetReviewerSettings()
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, settings)
|
|
assert.Equal(t, 0, len(settings.CommonReviewerIds))
|
|
assert.Equal(t, 0, len(settings.TeamReviewersSetting))
|
|
})
|
|
}
|
|
|
|
func testSaveAndGetReviewerSettings(t *testing.T, rctx request.CTX, ss store.Store, s SqlStore) {
|
|
t.Run("comprehensive save and get", func(t *testing.T) {
|
|
ss.ContentFlagging().ClearCaches()
|
|
|
|
// Create comprehensive test data
|
|
commonUserId1 := model.NewId()
|
|
commonUserId2 := model.NewId()
|
|
commonUserId3 := model.NewId()
|
|
|
|
teamId1 := model.NewId()
|
|
teamId2 := model.NewId()
|
|
teamId3 := model.NewId()
|
|
|
|
teamUserId1 := model.NewId()
|
|
teamUserId2 := model.NewId()
|
|
teamUserId3 := model.NewId()
|
|
|
|
enabled1 := true
|
|
enabled2 := false
|
|
enabled3 := true
|
|
|
|
commonReviewers := []string{commonUserId1, commonUserId2, commonUserId3}
|
|
teamSettings := map[string]*model.TeamReviewerSetting{
|
|
teamId1: {
|
|
Enabled: &enabled1,
|
|
ReviewerIds: []string{teamUserId1, teamUserId2},
|
|
},
|
|
teamId2: {
|
|
Enabled: &enabled2,
|
|
ReviewerIds: []string{teamUserId3},
|
|
},
|
|
teamId3: {
|
|
Enabled: &enabled3,
|
|
ReviewerIds: []string{}, // Empty reviewers list
|
|
},
|
|
}
|
|
|
|
reviewerSettings := model.ReviewerIDsSettings{
|
|
CommonReviewerIds: commonReviewers,
|
|
TeamReviewersSetting: teamSettings,
|
|
}
|
|
|
|
// Save the settings
|
|
err := ss.ContentFlagging().SaveReviewerSettings(reviewerSettings)
|
|
assert.NoError(t, err)
|
|
|
|
// Get the settings back
|
|
retrievedSettings, err := ss.ContentFlagging().GetReviewerSettings()
|
|
assert.NoError(t, err)
|
|
require.NotNil(t, retrievedSettings)
|
|
|
|
// Verify common reviewers
|
|
assert.NotNil(t, retrievedSettings.CommonReviewerIds)
|
|
assert.Equal(t, 3, len(retrievedSettings.CommonReviewerIds))
|
|
assert.Contains(t, retrievedSettings.CommonReviewerIds, commonUserId1)
|
|
assert.Contains(t, retrievedSettings.CommonReviewerIds, commonUserId2)
|
|
assert.Contains(t, retrievedSettings.CommonReviewerIds, commonUserId3)
|
|
|
|
// Verify team settings
|
|
assert.NotNil(t, retrievedSettings.TeamReviewersSetting)
|
|
assert.Equal(t, 3, len(retrievedSettings.TeamReviewersSetting))
|
|
|
|
// Verify team 1
|
|
team1Setting, exists := (retrievedSettings.TeamReviewersSetting)[teamId1]
|
|
assert.True(t, exists)
|
|
assert.NotNil(t, team1Setting.Enabled)
|
|
assert.True(t, *team1Setting.Enabled)
|
|
assert.NotNil(t, team1Setting.ReviewerIds)
|
|
assert.Equal(t, 2, len(team1Setting.ReviewerIds))
|
|
assert.Contains(t, team1Setting.ReviewerIds, teamUserId1)
|
|
assert.Contains(t, team1Setting.ReviewerIds, teamUserId2)
|
|
|
|
// Verify team 2
|
|
team2Setting, exists := (retrievedSettings.TeamReviewersSetting)[teamId2]
|
|
assert.True(t, exists)
|
|
assert.NotNil(t, team2Setting.Enabled)
|
|
assert.False(t, *team2Setting.Enabled)
|
|
assert.NotNil(t, team2Setting.ReviewerIds)
|
|
assert.Equal(t, 1, len(team2Setting.ReviewerIds))
|
|
assert.Contains(t, team2Setting.ReviewerIds, teamUserId3)
|
|
|
|
// Verify team 3
|
|
team3Setting, exists := (retrievedSettings.TeamReviewersSetting)[teamId3]
|
|
assert.True(t, exists)
|
|
assert.NotNil(t, team3Setting.Enabled)
|
|
assert.True(t, *team3Setting.Enabled)
|
|
assert.NotNil(t, team3Setting.ReviewerIds)
|
|
assert.Equal(t, 0, len(team3Setting.ReviewerIds))
|
|
})
|
|
}
|