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>
223 lines
6.7 KiB
Go
223 lines
6.7 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package storetest
|
|
|
|
import (
|
|
"database/sql"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/mattermost/mattermost/server/public/model"
|
|
"github.com/mattermost/mattermost/server/public/shared/request"
|
|
"github.com/mattermost/mattermost/server/v8/channels/store"
|
|
)
|
|
|
|
const PluginIDJenkins = "jenkins"
|
|
|
|
func TestNotifyAdminStore(t *testing.T, rctx request.CTX, ss store.Store) {
|
|
t.Run("Save", func(t *testing.T) { testNotifyAdminStoreSave(t, rctx, ss) })
|
|
t.Run("testGetDataByUserIdAndFeature", func(t *testing.T) { testGetDataByUserIDAndFeature(t, rctx, ss) })
|
|
t.Run("testGet", func(t *testing.T) { testGet(t, rctx, ss) })
|
|
t.Run("testDeleteBefore", func(t *testing.T) { testDeleteBefore(t, rctx, ss) })
|
|
t.Run("testUpdate", func(t *testing.T) { testUpdate(t, rctx, ss) })
|
|
}
|
|
|
|
func tearDown(t *testing.T, rctx request.CTX, ss store.Store) {
|
|
err := ss.NotifyAdmin().DeleteBefore(true, model.GetMillis()+model.GetMillis())
|
|
require.NoError(t, err)
|
|
|
|
err = ss.NotifyAdmin().DeleteBefore(false, model.GetMillis()+model.GetMillis())
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func testNotifyAdminStoreSave(t *testing.T, rctx request.CTX, ss store.Store) {
|
|
d1 := &model.NotifyAdminData{
|
|
UserId: model.NewId(),
|
|
RequiredPlan: model.LicenseShortSkuProfessional,
|
|
RequiredFeature: model.PaidFeatureAllProfessionalfeatures,
|
|
}
|
|
|
|
_, err := ss.NotifyAdmin().Save(d1)
|
|
require.NoError(t, err)
|
|
|
|
// unknow plan error
|
|
d2 := &model.NotifyAdminData{
|
|
UserId: model.NewId(),
|
|
RequiredPlan: model.LicenseShortSkuProfessional,
|
|
RequiredFeature: "Unknown feature",
|
|
}
|
|
|
|
_, err = ss.NotifyAdmin().Save(d2)
|
|
require.Error(t, err)
|
|
|
|
// unknown feature error
|
|
d3 := &model.NotifyAdminData{
|
|
UserId: model.NewId(),
|
|
RequiredPlan: "Unknown plan",
|
|
RequiredFeature: model.PaidFeatureAllProfessionalfeatures,
|
|
}
|
|
_, err = ss.NotifyAdmin().Save(d3)
|
|
require.Error(t, err)
|
|
|
|
// same user requesting same feature error
|
|
singleUserID := model.NewId()
|
|
d5 := &model.NotifyAdminData{
|
|
UserId: singleUserID,
|
|
RequiredPlan: model.LicenseShortSkuProfessional,
|
|
RequiredFeature: model.PaidFeatureAllProfessionalfeatures,
|
|
}
|
|
_, err = ss.NotifyAdmin().Save(d5)
|
|
require.NoError(t, err)
|
|
|
|
d6 := &model.NotifyAdminData{
|
|
UserId: singleUserID,
|
|
RequiredPlan: model.LicenseShortSkuProfessional,
|
|
RequiredFeature: model.PaidFeatureAllProfessionalfeatures,
|
|
}
|
|
_, err = ss.NotifyAdmin().Save(d6)
|
|
require.Error(t, err)
|
|
|
|
tearDown(t, rctx, ss)
|
|
}
|
|
|
|
func testGet(t *testing.T, rctx request.CTX, ss store.Store) {
|
|
userID1 := model.NewId()
|
|
d1 := &model.NotifyAdminData{
|
|
UserId: userID1,
|
|
RequiredPlan: model.LicenseShortSkuProfessional,
|
|
RequiredFeature: model.PaidFeatureAllProfessionalfeatures,
|
|
}
|
|
|
|
_, err := ss.NotifyAdmin().Save(d1)
|
|
require.NoError(t, err)
|
|
|
|
d1Trial := &model.NotifyAdminData{
|
|
UserId: userID1,
|
|
RequiredPlan: model.LicenseShortSkuEnterprise,
|
|
RequiredFeature: model.PaidFeatureAllEnterprisefeatures,
|
|
Trial: true,
|
|
}
|
|
_, err = ss.NotifyAdmin().Save(d1Trial)
|
|
require.NoError(t, err)
|
|
|
|
d1Trial2 := &model.NotifyAdminData{
|
|
UserId: model.NewId(),
|
|
RequiredPlan: model.LicenseShortSkuEnterprise,
|
|
RequiredFeature: model.PaidFeatureAllEnterprisefeatures,
|
|
Trial: true,
|
|
}
|
|
_, err = ss.NotifyAdmin().Save(d1Trial2)
|
|
require.NoError(t, err)
|
|
|
|
upgradeRequests, err := ss.NotifyAdmin().Get(false)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(upgradeRequests), 1)
|
|
|
|
trialRequests, err := ss.NotifyAdmin().Get(true)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(trialRequests), 2)
|
|
|
|
tearDown(t, rctx, ss)
|
|
}
|
|
|
|
func testGetDataByUserIDAndFeature(t *testing.T, rctx request.CTX, ss store.Store) {
|
|
userID1 := model.NewId()
|
|
d1 := &model.NotifyAdminData{
|
|
UserId: userID1,
|
|
RequiredPlan: model.LicenseShortSkuProfessional,
|
|
RequiredFeature: model.PaidFeatureAllProfessionalfeatures,
|
|
}
|
|
|
|
_, err := ss.NotifyAdmin().Save(d1)
|
|
require.NoError(t, err)
|
|
|
|
userID2 := model.NewId()
|
|
d2 := &model.NotifyAdminData{
|
|
UserId: userID2,
|
|
RequiredPlan: model.LicenseShortSkuProfessional,
|
|
RequiredFeature: model.PaidFeatureCustomUsergroups,
|
|
}
|
|
|
|
_, err = ss.NotifyAdmin().Save(d2)
|
|
require.NoError(t, err)
|
|
|
|
user1Request, err := ss.NotifyAdmin().GetDataByUserIdAndFeature(userID1, model.PaidFeatureAllProfessionalfeatures)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(user1Request), 1)
|
|
require.Equal(t, user1Request[0].RequiredFeature, model.PaidFeatureAllProfessionalfeatures)
|
|
|
|
tearDown(t, rctx, ss)
|
|
}
|
|
|
|
func testUpdate(t *testing.T, rctx request.CTX, ss store.Store) {
|
|
userID1 := model.NewId()
|
|
d1 := &model.NotifyAdminData{
|
|
UserId: userID1,
|
|
RequiredPlan: PluginIDJenkins,
|
|
RequiredFeature: model.PluginFeature,
|
|
}
|
|
_, err := ss.NotifyAdmin().Save(d1)
|
|
require.NoError(t, err)
|
|
|
|
err = ss.NotifyAdmin().Update(d1.UserId, d1.RequiredPlan, d1.RequiredFeature, 100)
|
|
require.NoError(t, err)
|
|
|
|
userRequest, err := ss.NotifyAdmin().GetDataByUserIdAndFeature(d1.UserId, d1.RequiredFeature)
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, len(userRequest), 1)
|
|
require.Equal(t, userRequest[0].SentAt, sql.NullInt64{Int64: 100, Valid: true})
|
|
|
|
tearDown(t, rctx, ss)
|
|
}
|
|
|
|
func testDeleteBefore(t *testing.T, rctx request.CTX, ss store.Store) {
|
|
userID1 := model.NewId()
|
|
d1 := &model.NotifyAdminData{
|
|
UserId: userID1,
|
|
RequiredPlan: model.LicenseShortSkuProfessional,
|
|
RequiredFeature: model.PaidFeatureAllProfessionalfeatures,
|
|
}
|
|
|
|
_, err := ss.NotifyAdmin().Save(d1)
|
|
require.NoError(t, err)
|
|
|
|
d1Trial := &model.NotifyAdminData{
|
|
UserId: userID1,
|
|
RequiredPlan: model.LicenseShortSkuProfessional,
|
|
RequiredFeature: model.PaidFeatureAllEnterprisefeatures,
|
|
Trial: true,
|
|
}
|
|
_, err = ss.NotifyAdmin().Save(d1Trial)
|
|
require.NoError(t, err)
|
|
|
|
d1Trial2 := &model.NotifyAdminData{
|
|
UserId: model.NewId(),
|
|
RequiredPlan: model.LicenseShortSkuProfessional,
|
|
RequiredFeature: model.PaidFeatureAllEnterprisefeatures,
|
|
Trial: true,
|
|
}
|
|
_, err = ss.NotifyAdmin().Save(d1Trial2)
|
|
require.NoError(t, err)
|
|
|
|
err = ss.NotifyAdmin().DeleteBefore(false, model.GetMillis()+model.GetMillis()) // delete all upgrade requests
|
|
require.NoError(t, err)
|
|
|
|
upgradeRequests, err := ss.NotifyAdmin().Get(false)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(upgradeRequests), 0)
|
|
|
|
trialRequests, err := ss.NotifyAdmin().Get(true)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(trialRequests), 2) // trial requests should still exist
|
|
|
|
err = ss.NotifyAdmin().DeleteBefore(true, model.GetMillis()+model.GetMillis()) // delete all trial requests
|
|
require.NoError(t, err)
|
|
|
|
trialRequests, err = ss.NotifyAdmin().Get(false)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(trialRequests), 0)
|
|
}
|