MM-10233: Add scheme importing to bulk importer. (#8928)

Этот коммит содержится в:
George Goldberg
2018-06-21 12:02:35 +01:00
коммит произвёл GitHub
родитель 8e24dd78fb
Коммит 1f65f0e3d6
45 изменённых файлов: 1224 добавлений и 127 удалений

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

@@ -20,6 +20,7 @@ import (
"github.com/mattermost/mattermost-server/store/sqlstore" "github.com/mattermost/mattermost-server/store/sqlstore"
"github.com/mattermost/mattermost-server/store/storetest" "github.com/mattermost/mattermost-server/store/storetest"
"github.com/mattermost/mattermost-server/utils" "github.com/mattermost/mattermost-server/utils"
"testing"
) )
type TestHelper struct { type TestHelper struct {
@@ -446,6 +447,54 @@ func (me *TestHelper) ResetEmojisMigration() {
} }
} }
func (me *TestHelper) CheckTeamCount(t *testing.T, expected int64) {
if r := <-me.App.Srv.Store.Team().AnalyticsTeamCount(); r.Err == nil {
if r.Data.(int64) != expected {
t.Fatalf("Unexpected number of teams. Expected: %v, found: %v", expected, r.Data.(int64))
}
} else {
t.Fatalf("Failed to get team count.")
}
}
func (me *TestHelper) CheckChannelsCount(t *testing.T, expected int64) {
if r := <-me.App.Srv.Store.Channel().AnalyticsTypeCount("", model.CHANNEL_OPEN); r.Err == nil {
if r.Data.(int64) != expected {
t.Fatalf("Unexpected number of channels. Expected: %v, found: %v", expected, r.Data.(int64))
}
} else {
t.Fatalf("Failed to get channel count.")
}
}
func (me *TestHelper) SetupTeamScheme() *model.Scheme {
scheme := model.Scheme{
Name: model.NewId(),
DisplayName: model.NewId(),
Scope: model.SCHEME_SCOPE_TEAM,
}
if scheme, err := me.App.CreateScheme(&scheme); err == nil {
return scheme
} else {
panic(err)
}
}
func (me *TestHelper) SetupChannelScheme() *model.Scheme {
scheme := model.Scheme{
Name: model.NewId(),
DisplayName: model.NewId(),
Scope: model.SCHEME_SCOPE_CHANNEL,
}
if scheme, err := me.App.CreateScheme(&scheme); err == nil {
return scheme
} else {
panic(err)
}
}
type FakeClusterInterface struct { type FakeClusterInterface struct {
clusterMessageHandler einterfaces.ClusterMessageHandler clusterMessageHandler einterfaces.ClusterMessageHandler
} }

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

@@ -26,6 +26,7 @@ import (
type LineImportData struct { type LineImportData struct {
Type string `json:"type"` Type string `json:"type"`
Scheme *SchemeImportData `json:"scheme"`
Team *TeamImportData `json:"team"` Team *TeamImportData `json:"team"`
Channel *ChannelImportData `json:"channel"` Channel *ChannelImportData `json:"channel"`
User *UserImportData `json:"user"` User *UserImportData `json:"user"`
@@ -41,6 +42,7 @@ type TeamImportData struct {
Type *string `json:"type"` Type *string `json:"type"`
Description *string `json:"description"` Description *string `json:"description"`
AllowOpenInvite *bool `json:"allow_open_invite"` AllowOpenInvite *bool `json:"allow_open_invite"`
Scheme *string `json:"scheme"`
} }
type ChannelImportData struct { type ChannelImportData struct {
@@ -50,6 +52,7 @@ type ChannelImportData struct {
Type *string `json:"type"` Type *string `json:"type"`
Header *string `json:"header"` Header *string `json:"header"`
Purpose *string `json:"purpose"` Purpose *string `json:"purpose"`
Scheme *string `json:"scheme"`
} }
type UserImportData struct { type UserImportData struct {
@@ -159,6 +162,24 @@ type DirectPostImportData struct {
Replies *[]ReplyImportData `json:"replies"` Replies *[]ReplyImportData `json:"replies"`
} }
type SchemeImportData struct {
Name *string `json:"name"`
DisplayName *string `json:"display_name"`
Description *string `json:"description"`
Scope *string `json:"scope"`
DefaultTeamAdminRole *RoleImportData `json:"default_team_admin_role"`
DefaultTeamUserRole *RoleImportData `json:"default_team_user_role"`
DefaultChannelAdminRole *RoleImportData `json:"default_channel_admin_role"`
DefaultChannelUserRole *RoleImportData `json:"default_channel_user_role"`
}
type RoleImportData struct {
Name *string `json:"name"`
DisplayName *string `json:"display_name"`
Description *string `json:"description"`
Permissions *[]string `json:"permissions"`
}
type LineImportWorkerData struct { type LineImportWorkerData struct {
LineImportData LineImportData
LineNumber int LineNumber int
@@ -271,6 +292,12 @@ func processImportDataFileVersionLine(line LineImportData) (int, *model.AppError
func (a *App) ImportLine(line LineImportData, dryRun bool) *model.AppError { func (a *App) ImportLine(line LineImportData, dryRun bool) *model.AppError {
switch { switch {
case line.Type == "scheme":
if line.Scheme == nil {
return model.NewAppError("BulkImport", "app.import.import_line.null_scheme.error", nil, "", http.StatusBadRequest)
} else {
return a.ImportScheme(line.Scheme, dryRun)
}
case line.Type == "team": case line.Type == "team":
if line.Team == nil { if line.Team == nil {
return model.NewAppError("BulkImport", "app.import.import_line.null_team.error", nil, "", http.StatusBadRequest) return model.NewAppError("BulkImport", "app.import.import_line.null_team.error", nil, "", http.StatusBadRequest)
@@ -312,6 +339,205 @@ func (a *App) ImportLine(line LineImportData, dryRun bool) *model.AppError {
} }
} }
func (a *App) ImportScheme(data *SchemeImportData, dryRun bool) *model.AppError {
if err := validateSchemeImportData(data); err != nil {
return err
}
// If this is a Dry Run, do not continue any further.
if dryRun {
return nil
}
scheme, err := a.GetSchemeByName(*data.Name)
if err != nil {
scheme = new(model.Scheme)
} else if scheme.Scope != *data.Scope {
return model.NewAppError("BulkImport", "app.import.import_scheme.scope_change.error", map[string]interface{}{"SchemeName": scheme.Name}, "", http.StatusBadRequest)
}
scheme.Name = *data.Name
scheme.DisplayName = *data.DisplayName
scheme.Scope = *data.Scope
if data.Description != nil {
scheme.Description = *data.Description
}
if len(scheme.Id) == 0 {
scheme, err = a.CreateScheme(scheme)
} else {
scheme, err = a.UpdateScheme(scheme)
}
if err != nil {
return err
}
if scheme.Scope == model.SCHEME_SCOPE_TEAM {
data.DefaultTeamAdminRole.Name = &scheme.DefaultTeamAdminRole
if err := a.ImportRole(data.DefaultTeamAdminRole, dryRun, true); err != nil {
return err
}
data.DefaultTeamUserRole.Name = &scheme.DefaultTeamUserRole
if err := a.ImportRole(data.DefaultTeamUserRole, dryRun, true); err != nil {
return err
}
}
if scheme.Scope == model.SCHEME_SCOPE_TEAM || scheme.Scope == model.SCHEME_SCOPE_CHANNEL {
data.DefaultChannelAdminRole.Name = &scheme.DefaultChannelAdminRole
if err := a.ImportRole(data.DefaultChannelAdminRole, dryRun, true); err != nil {
return err
}
data.DefaultChannelUserRole.Name = &scheme.DefaultChannelUserRole
if err := a.ImportRole(data.DefaultChannelUserRole, dryRun, true); err != nil {
return err
}
}
return nil
}
func (a *App) ImportRole(data *RoleImportData, dryRun bool, isSchemeRole bool) *model.AppError {
if !isSchemeRole {
if err := validateRoleImportData(data); err != nil {
return err
}
}
// If this is a Dry Run, do not continue any further.
if dryRun {
return nil
}
role, err := a.GetRoleByName(*data.Name)
if err != nil {
role = new(model.Role)
}
role.Name = *data.Name
if data.DisplayName != nil {
role.DisplayName = *data.DisplayName
}
if data.Description != nil {
role.Description = *data.Description
}
if data.Permissions != nil {
role.Permissions = *data.Permissions
}
if isSchemeRole {
role.SchemeManaged = true
} else {
role.SchemeManaged = false
}
if len(role.Id) == 0 {
role, err = a.CreateRole(role)
} else {
role, err = a.UpdateRole(role)
}
return err
}
func validateSchemeImportData(data *SchemeImportData) *model.AppError {
if data.Scope == nil {
return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.null_scope.error", nil, "", http.StatusBadRequest)
}
switch *data.Scope {
case model.SCHEME_SCOPE_TEAM:
if data.DefaultTeamAdminRole == nil || data.DefaultTeamUserRole == nil || data.DefaultChannelAdminRole == nil || data.DefaultChannelUserRole == nil {
return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.wrong_roles_for_scope.error", nil, "", http.StatusBadRequest)
}
case model.SCHEME_SCOPE_CHANNEL:
if data.DefaultTeamAdminRole != nil || data.DefaultTeamUserRole != nil || data.DefaultChannelAdminRole == nil || data.DefaultChannelUserRole == nil {
return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.wrong_roles_for_scope.error", nil, "", http.StatusBadRequest)
}
default:
return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.unknown_scheme.error", nil, "", http.StatusBadRequest)
}
if data.Name == nil || !model.IsValidSchemeName(*data.Name) {
return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.name_invalid.error", nil, "", http.StatusBadRequest)
}
if data.DisplayName == nil || len(*data.DisplayName) == 0 || len(*data.DisplayName) > model.SCHEME_DISPLAY_NAME_MAX_LENGTH {
return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.display_name_invalid.error", nil, "", http.StatusBadRequest)
}
if data.Description != nil && len(*data.Description) > model.SCHEME_DESCRIPTION_MAX_LENGTH {
return model.NewAppError("BulkImport", "app.import.validate_scheme_import_data.description_invalid.error", nil, "", http.StatusBadRequest)
}
if data.DefaultTeamAdminRole != nil {
if err := validateRoleImportData(data.DefaultTeamAdminRole); err != nil {
return err
}
}
if data.DefaultTeamUserRole != nil {
if err := validateRoleImportData(data.DefaultTeamUserRole); err != nil {
return err
}
}
if data.DefaultChannelAdminRole != nil {
if err := validateRoleImportData(data.DefaultChannelAdminRole); err != nil {
return err
}
}
if data.DefaultChannelUserRole != nil {
if err := validateRoleImportData(data.DefaultChannelUserRole); err != nil {
return err
}
}
return nil
}
func validateRoleImportData(data *RoleImportData) *model.AppError {
if data.Name == nil || !model.IsValidRoleName(*data.Name) {
return model.NewAppError("BulkImport", "app.import.validate_role_import_data.name_invalid.error", nil, "", http.StatusBadRequest)
}
if data.DisplayName == nil || len(*data.DisplayName) == 0 || len(*data.DisplayName) > model.ROLE_DISPLAY_NAME_MAX_LENGTH {
return model.NewAppError("BulkImport", "app.import.validate_role_import_data.display_name_invalid.error", nil, "", http.StatusBadRequest)
}
if data.Description != nil && len(*data.Description) > model.ROLE_DESCRIPTION_MAX_LENGTH {
return model.NewAppError("BulkImport", "app.import.validate_role_import_data.description_invalid.error", nil, "", http.StatusBadRequest)
}
if data.Permissions != nil {
for _, permission := range *data.Permissions {
permissionValidated := false
for _, p := range model.ALL_PERMISSIONS {
if permission == p.Id {
permissionValidated = true
break
}
}
if !permissionValidated {
return model.NewAppError("BulkImport", "app.import.validate_role_import_data.invalid_permission.error", nil, "permission"+permission, http.StatusBadRequest)
}
}
}
return nil
}
func (a *App) ImportTeam(data *TeamImportData, dryRun bool) *model.AppError { func (a *App) ImportTeam(data *TeamImportData, dryRun bool) *model.AppError {
if err := validateTeamImportData(data); err != nil { if err := validateTeamImportData(data); err != nil {
return err return err
@@ -341,12 +567,29 @@ func (a *App) ImportTeam(data *TeamImportData, dryRun bool) *model.AppError {
team.AllowOpenInvite = *data.AllowOpenInvite team.AllowOpenInvite = *data.AllowOpenInvite
} }
if data.Scheme != nil {
scheme, err := a.GetSchemeByName(*data.Scheme)
if err != nil {
return err
}
if scheme.DeleteAt != 0 {
return model.NewAppError("BulkImport", "app.import.import_team.scheme_deleted.error", nil, "", http.StatusBadRequest)
}
if scheme.Scope != model.SCHEME_SCOPE_TEAM {
return model.NewAppError("BulkImport", "app.import.import_team.scheme_wrong_scope.error", nil, "", http.StatusBadRequest)
}
team.SchemeId = &scheme.Id
}
if team.Id == "" { if team.Id == "" {
if _, err := a.CreateTeam(team); err != nil { if _, err := a.CreateTeam(team); err != nil {
return err return err
} }
} else { } else {
if _, err := a.UpdateTeam(team); err != nil { if _, err := a.updateTeamUnsanitized(team); err != nil {
return err return err
} }
} }
@@ -382,6 +625,10 @@ func validateTeamImportData(data *TeamImportData) *model.AppError {
return model.NewAppError("BulkImport", "app.import.validate_team_import_data.description_length.error", nil, "", http.StatusBadRequest) return model.NewAppError("BulkImport", "app.import.validate_team_import_data.description_length.error", nil, "", http.StatusBadRequest)
} }
if data.Scheme != nil && !model.IsValidSchemeName(*data.Scheme) {
return model.NewAppError("BulkImport", "app.import.validate_team_import_data.scheme_invalid.error", nil, "", http.StatusBadRequest)
}
return nil return nil
} }
@@ -422,6 +669,23 @@ func (a *App) ImportChannel(data *ChannelImportData, dryRun bool) *model.AppErro
channel.Purpose = *data.Purpose channel.Purpose = *data.Purpose
} }
if data.Scheme != nil {
scheme, err := a.GetSchemeByName(*data.Scheme)
if err != nil {
return err
}
if scheme.DeleteAt != 0 {
return model.NewAppError("BulkImport", "app.import.import_channel.scheme_deleted.error", nil, "", http.StatusBadRequest)
}
if scheme.Scope != model.SCHEME_SCOPE_CHANNEL {
return model.NewAppError("BulkImport", "app.import.import_channel.scheme_wrong_scope.error", nil, "", http.StatusBadRequest)
}
channel.SchemeId = &scheme.Id
}
if channel.Id == "" { if channel.Id == "" {
if _, err := a.CreateChannel(channel, false); err != nil { if _, err := a.CreateChannel(channel, false); err != nil {
return err return err
@@ -469,6 +733,10 @@ func validateChannelImportData(data *ChannelImportData) *model.AppError {
return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.purpose_length.error", nil, "", http.StatusBadRequest) return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.purpose_length.error", nil, "", http.StatusBadRequest)
} }
if data.Scheme != nil && !model.IsValidSchemeName(*data.Scheme) {
return model.NewAppError("BulkImport", "app.import.validate_channel_import_data.scheme_invalid.error", nil, "", http.StatusBadRequest)
}
return nil return nil
} }

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

@@ -9,6 +9,8 @@ import (
"strings" "strings"
"testing" "testing"
"github.com/stretchr/testify/assert"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/store" "github.com/mattermost/mattermost-server/store"
"github.com/mattermost/mattermost-server/utils" "github.com/mattermost/mattermost-server/utils"
@@ -78,6 +80,249 @@ func checkNoError(t *testing.T, err *model.AppError) {
} }
} }
func TestImportValidateSchemeImportData(t *testing.T) {
// Test with minimum required valid properties and team scope.
data := SchemeImportData{
Name: ptrStr("name"),
DisplayName: ptrStr("display name"),
Scope: ptrStr("team"),
DefaultTeamAdminRole: &RoleImportData{
Name: ptrStr("name"),
DisplayName: ptrStr("display name"),
Permissions: &[]string{"invite_user"},
},
DefaultTeamUserRole: &RoleImportData{
Name: ptrStr("name"),
DisplayName: ptrStr("display name"),
Permissions: &[]string{"invite_user"},
},
DefaultChannelAdminRole: &RoleImportData{
Name: ptrStr("name"),
DisplayName: ptrStr("display name"),
Permissions: &[]string{"invite_user"},
},
DefaultChannelUserRole: &RoleImportData{
Name: ptrStr("name"),
DisplayName: ptrStr("display name"),
Permissions: &[]string{"invite_user"},
},
}
if err := validateSchemeImportData(&data); err != nil {
t.Fatal("Validation failed but should have been valid.", err)
}
// Test with various invalid names.
data.Name = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid name.")
}
data.Name = ptrStr("")
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid name.")
}
data.Name = ptrStr(strings.Repeat("1234567890", 100))
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid name.")
}
data.Name = ptrStr("name")
// Test with invalid display name.
data.DisplayName = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid display name.")
}
data.DisplayName = ptrStr("")
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid display name.")
}
data.DisplayName = ptrStr(strings.Repeat("1234567890", 100))
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid display name.")
}
data.DisplayName = ptrStr("display name")
// Test with various missing roles.
data.DefaultTeamAdminRole = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to missing role.")
}
data.DefaultTeamAdminRole = &RoleImportData{
Name: ptrStr("name"),
DisplayName: ptrStr("display name"),
Permissions: &[]string{"invite_user"},
}
data.DefaultTeamUserRole = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to missing role.")
}
data.DefaultTeamUserRole = &RoleImportData{
Name: ptrStr("name"),
DisplayName: ptrStr("display name"),
Permissions: &[]string{"invite_user"},
}
data.DefaultChannelAdminRole = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to missing role.")
}
data.DefaultChannelAdminRole = &RoleImportData{
Name: ptrStr("name"),
DisplayName: ptrStr("display name"),
Permissions: &[]string{"invite_user"},
}
data.DefaultChannelUserRole = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to missing role.")
}
data.DefaultChannelUserRole = &RoleImportData{
Name: ptrStr("name"),
DisplayName: ptrStr("display name"),
Permissions: &[]string{"invite_user"},
}
// Test with various invalid roles.
data.DefaultTeamAdminRole.Name = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid role.")
}
data.DefaultTeamAdminRole.Name = ptrStr("name")
data.DefaultTeamUserRole.Name = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid role.")
}
data.DefaultTeamUserRole.Name = ptrStr("name")
data.DefaultChannelAdminRole.Name = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid role.")
}
data.DefaultChannelAdminRole.Name = ptrStr("name")
data.DefaultChannelUserRole.Name = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid role.")
}
data.DefaultChannelUserRole.Name = ptrStr("name")
// Change to a Channel scope role, and check with missing or extra roles again.
data.Scope = ptrStr("channel")
data.DefaultTeamAdminRole = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to spurious role.")
}
data.DefaultTeamAdminRole = &RoleImportData{
Name: ptrStr("name"),
DisplayName: ptrStr("display name"),
Permissions: &[]string{"invite_user"},
}
data.DefaultTeamUserRole = nil
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to spurious role.")
}
data.DefaultTeamAdminRole = nil
if err := validateSchemeImportData(&data); err != nil {
t.Fatal("Should have succeeded.")
}
// Test with all combinations of optional parameters.
data.Description = ptrStr(strings.Repeat("1234567890", 1024))
if err := validateSchemeImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid description.")
}
data.Description = ptrStr("description")
if err := validateSchemeImportData(&data); err != nil {
t.Fatal("Should have succeeded.")
}
}
func TestImportValidateRoleImportData(t *testing.T) {
// Test with minimum required valid properties.
data := RoleImportData{
Name: ptrStr("name"),
DisplayName: ptrStr("display name"),
}
if err := validateRoleImportData(&data); err != nil {
t.Fatal("Validation failed but should have been valid.", err)
}
// Test with various invalid names.
data.Name = nil
if err := validateRoleImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid name.")
}
data.Name = ptrStr("")
if err := validateRoleImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid name.")
}
data.Name = ptrStr(strings.Repeat("1234567890", 100))
if err := validateRoleImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid name.")
}
data.Name = ptrStr("name")
// Test with invalid display name.
data.DisplayName = nil
if err := validateRoleImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid display name.")
}
data.DisplayName = ptrStr("")
if err := validateRoleImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid display name.")
}
data.DisplayName = ptrStr(strings.Repeat("1234567890", 100))
if err := validateRoleImportData(&data); err == nil {
t.Fatal("Should have failed due to invalid display name.")
}
data.DisplayName = ptrStr("display name")
// Test with various valid/invalid permissions.
data.Permissions = &[]string{}
if err := validateRoleImportData(&data); err != nil {
t.Fatal("Validation failed but should have been valid.", err)
}
data.Permissions = &[]string{"invite_user", "add_user_to_team"}
if err := validateRoleImportData(&data); err != nil {
t.Fatal("Validation failed but should have been valid.", err)
}
data.Permissions = &[]string{"invite_user", "add_user_to_team", "derp"}
if err := validateRoleImportData(&data); err == nil {
t.Fatal("Validation should have failed due to invalid permission.", err)
}
data.Permissions = &[]string{"invite_user", "add_user_to_team"}
// Test with various valid/invalid descriptions.
data.Description = ptrStr(strings.Repeat("1234567890", 1024))
if err := validateRoleImportData(&data); err == nil {
t.Fatal("Validation should have failed due to invalid description.", err)
}
data.Description = ptrStr("description")
if err := validateRoleImportData(&data); err != nil {
t.Fatal("Validation failed but should have been valid.", err)
}
}
func TestImportValidateTeamImportData(t *testing.T) { func TestImportValidateTeamImportData(t *testing.T) {
// Test with minimum required valid properties. // Test with minimum required valid properties.
@@ -178,6 +423,19 @@ func TestImportValidateTeamImportData(t *testing.T) {
if err := validateTeamImportData(&data); err == nil { if err := validateTeamImportData(&data); err == nil {
t.Fatal("Should have failed due to too long description.") t.Fatal("Should have failed due to too long description.")
} }
// Test with an empty scheme name.
data.Description = ptrStr("abcdefg")
data.Scheme = ptrStr("")
if err := validateTeamImportData(&data); err == nil {
t.Fatal("Should have failed due to empty scheme name.")
}
// Test with a valid scheme name.
data.Scheme = ptrStr("abcdefg")
if err := validateTeamImportData(&data); err != nil {
t.Fatal("Should have succeeded with valid scheme name.")
}
} }
func TestImportValidateChannelImportData(t *testing.T) { func TestImportValidateChannelImportData(t *testing.T) {
@@ -291,6 +549,19 @@ func TestImportValidateChannelImportData(t *testing.T) {
if err := validateChannelImportData(&data); err == nil { if err := validateChannelImportData(&data); err == nil {
t.Fatal("Should have failed due to too long purpose.") t.Fatal("Should have failed due to too long purpose.")
} }
// Test with an empty scheme name.
data.Purpose = ptrStr("abcdefg")
data.Scheme = ptrStr("")
if err := validateChannelImportData(&data); err == nil {
t.Fatal("Should have failed due to empty scheme name.")
}
// Test with a valid scheme name.
data.Scheme = ptrStr("abcdefg")
if err := validateChannelImportData(&data); err != nil {
t.Fatal("Should have succeeded with valid scheme name.")
}
} }
func TestImportValidateUserImportData(t *testing.T) { func TestImportValidateUserImportData(t *testing.T) {
@@ -1134,10 +1405,314 @@ func TestImportValidateDirectPostImportData(t *testing.T) {
} }
} }
func TestImportImportScheme(t *testing.T) {
th := Setup()
defer th.TearDown()
// Mark the phase 2 permissions migration as completed.
<-th.App.Srv.Store.System().Save(&model.System{Name: model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2, Value: "true"})
defer func() {
<-th.App.Srv.Store.System().PermanentDeleteByName(model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2)
}()
// Try importing an invalid scheme in dryRun mode.
data := SchemeImportData{
Name: ptrStr(model.NewId()),
Scope: ptrStr("team"),
DefaultTeamUserRole: &RoleImportData{
Name: ptrStr(model.NewId()),
DisplayName: ptrStr(model.NewId()),
},
DefaultTeamAdminRole: &RoleImportData{
Name: ptrStr(model.NewId()),
DisplayName: ptrStr(model.NewId()),
},
DefaultChannelUserRole: &RoleImportData{
Name: ptrStr(model.NewId()),
DisplayName: ptrStr(model.NewId()),
},
DefaultChannelAdminRole: &RoleImportData{
Name: ptrStr(model.NewId()),
DisplayName: ptrStr(model.NewId()),
},
Description: ptrStr("description"),
}
if err := th.App.ImportScheme(&data, true); err == nil {
t.Fatalf("Should have failed to import.")
}
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err == nil {
t.Fatalf("Scheme should not have imported.")
}
// Try importing a valid scheme in dryRun mode.
data.DisplayName = ptrStr("display name")
if err := th.App.ImportScheme(&data, true); err != nil {
t.Fatalf("Should have succeeded.")
}
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err == nil {
t.Fatalf("Scheme should not have imported.")
}
// Try importing an invalid scheme.
data.DisplayName = nil
if err := th.App.ImportScheme(&data, false); err == nil {
t.Fatalf("Should have failed to import.")
}
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err == nil {
t.Fatalf("Scheme should not have imported.")
}
// Try importing a valid scheme with all params set.
data.DisplayName = ptrStr("display name")
if err := th.App.ImportScheme(&data, false); err != nil {
t.Fatalf("Should have succeeded.")
}
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err != nil {
t.Fatalf("Failed to import scheme: %v", res.Err)
} else {
scheme := res.Data.(*model.Scheme)
assert.Equal(t, *data.Name, scheme.Name)
assert.Equal(t, *data.DisplayName, scheme.DisplayName)
assert.Equal(t, *data.Description, scheme.Description)
assert.Equal(t, *data.Scope, scheme.Scope)
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamAdminRole); res.Err != nil {
t.Fatalf("Should have found the imported role.")
} else {
role := res.Data.(*model.Role)
assert.Equal(t, *data.DefaultTeamAdminRole.DisplayName, role.DisplayName)
assert.False(t, role.BuiltIn)
assert.True(t, role.SchemeManaged)
}
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamUserRole); res.Err != nil {
t.Fatalf("Should have found the imported role.")
} else {
role := res.Data.(*model.Role)
assert.Equal(t, *data.DefaultTeamUserRole.DisplayName, role.DisplayName)
assert.False(t, role.BuiltIn)
assert.True(t, role.SchemeManaged)
}
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelAdminRole); res.Err != nil {
t.Fatalf("Should have found the imported role.")
} else {
role := res.Data.(*model.Role)
assert.Equal(t, *data.DefaultChannelAdminRole.DisplayName, role.DisplayName)
assert.False(t, role.BuiltIn)
assert.True(t, role.SchemeManaged)
}
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelUserRole); res.Err != nil {
t.Fatalf("Should have found the imported role.")
} else {
role := res.Data.(*model.Role)
assert.Equal(t, *data.DefaultChannelUserRole.DisplayName, role.DisplayName)
assert.False(t, role.BuiltIn)
assert.True(t, role.SchemeManaged)
}
}
// Try modifying all the fields and re-importing.
data.DisplayName = ptrStr("new display name")
data.Description = ptrStr("new description")
if err := th.App.ImportScheme(&data, false); err != nil {
t.Fatalf("Should have succeeded: %v", err)
}
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err != nil {
t.Fatalf("Failed to import scheme: %v", res.Err)
} else {
scheme := res.Data.(*model.Scheme)
assert.Equal(t, *data.Name, scheme.Name)
assert.Equal(t, *data.DisplayName, scheme.DisplayName)
assert.Equal(t, *data.Description, scheme.Description)
assert.Equal(t, *data.Scope, scheme.Scope)
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamAdminRole); res.Err != nil {
t.Fatalf("Should have found the imported role.")
} else {
role := res.Data.(*model.Role)
assert.Equal(t, *data.DefaultTeamAdminRole.DisplayName, role.DisplayName)
assert.False(t, role.BuiltIn)
assert.True(t, role.SchemeManaged)
}
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultTeamUserRole); res.Err != nil {
t.Fatalf("Should have found the imported role.")
} else {
role := res.Data.(*model.Role)
assert.Equal(t, *data.DefaultTeamUserRole.DisplayName, role.DisplayName)
assert.False(t, role.BuiltIn)
assert.True(t, role.SchemeManaged)
}
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelAdminRole); res.Err != nil {
t.Fatalf("Should have found the imported role.")
} else {
role := res.Data.(*model.Role)
assert.Equal(t, *data.DefaultChannelAdminRole.DisplayName, role.DisplayName)
assert.False(t, role.BuiltIn)
assert.True(t, role.SchemeManaged)
}
if res := <-th.App.Srv.Store.Role().GetByName(scheme.DefaultChannelUserRole); res.Err != nil {
t.Fatalf("Should have found the imported role.")
} else {
role := res.Data.(*model.Role)
assert.Equal(t, *data.DefaultChannelUserRole.DisplayName, role.DisplayName)
assert.False(t, role.BuiltIn)
assert.True(t, role.SchemeManaged)
}
}
// Try changing the scope of the scheme and reimporting.
data.Scope = ptrStr("channel")
if err := th.App.ImportScheme(&data, false); err == nil {
t.Fatalf("Should have failed to import.")
}
if res := <-th.App.Srv.Store.Scheme().GetByName(*data.Name); res.Err != nil {
t.Fatalf("Failed to import scheme: %v", res.Err)
} else {
scheme := res.Data.(*model.Scheme)
assert.Equal(t, *data.Name, scheme.Name)
assert.Equal(t, *data.DisplayName, scheme.DisplayName)
assert.Equal(t, *data.Description, scheme.Description)
assert.Equal(t, "team", scheme.Scope)
}
}
func TestImportImportRole(t *testing.T) {
th := Setup()
defer th.TearDown()
// Try importing an invalid role in dryRun mode.
rid1 := model.NewId()
data := RoleImportData{
Name: &rid1,
}
if err := th.App.ImportRole(&data, true, false); err == nil {
t.Fatalf("Should have failed to import.")
}
if res := <-th.App.Srv.Store.Role().GetByName(rid1); res.Err == nil {
t.Fatalf("Role should not have imported.")
}
// Try importing the valid role in dryRun mode.
data.DisplayName = ptrStr("display name")
if err := th.App.ImportRole(&data, true, false); err != nil {
t.Fatalf("Should have succeeded.")
}
if res := <-th.App.Srv.Store.Role().GetByName(rid1); res.Err == nil {
t.Fatalf("Role should not have imported as we are in dry run mode.")
}
// Try importing an invalid role.
data.DisplayName = nil
if err := th.App.ImportRole(&data, false, false); err == nil {
t.Fatalf("Should have failed to import.")
}
if res := <-th.App.Srv.Store.Role().GetByName(rid1); res.Err == nil {
t.Fatalf("Role should not have imported.")
}
// Try importing a valid role with all params set.
data.DisplayName = ptrStr("display name")
data.Description = ptrStr("description")
data.Permissions = &[]string{"invite_user", "add_user_to_team"}
if err := th.App.ImportRole(&data, false, false); err != nil {
t.Fatalf("Should have succeeded.")
}
if res := <-th.App.Srv.Store.Role().GetByName(rid1); res.Err != nil {
t.Fatalf("Should have found the imported role.")
} else {
role := res.Data.(*model.Role)
assert.Equal(t, *data.Name, role.Name)
assert.Equal(t, *data.DisplayName, role.DisplayName)
assert.Equal(t, *data.Description, role.Description)
assert.Equal(t, *data.Permissions, role.Permissions)
assert.False(t, role.BuiltIn)
assert.False(t, role.SchemeManaged)
}
// Try changing all the params and reimporting.
data.DisplayName = ptrStr("new display name")
data.Description = ptrStr("description")
data.Permissions = &[]string{"use_slash_commands"}
if err := th.App.ImportRole(&data, false, true); err != nil {
t.Fatalf("Should have succeeded. %v", err)
}
if res := <-th.App.Srv.Store.Role().GetByName(rid1); res.Err != nil {
t.Fatalf("Should have found the imported role.")
} else {
role := res.Data.(*model.Role)
assert.Equal(t, *data.Name, role.Name)
assert.Equal(t, *data.DisplayName, role.DisplayName)
assert.Equal(t, *data.Description, role.Description)
assert.Equal(t, *data.Permissions, role.Permissions)
assert.False(t, role.BuiltIn)
assert.True(t, role.SchemeManaged)
}
// Check that re-importing with only required fields doesn't update the others.
data2 := RoleImportData{
Name: &rid1,
DisplayName: ptrStr("new display name again"),
}
if err := th.App.ImportRole(&data2, false, false); err != nil {
t.Fatalf("Should have succeeded.")
}
if res := <-th.App.Srv.Store.Role().GetByName(rid1); res.Err != nil {
t.Fatalf("Should have found the imported role.")
} else {
role := res.Data.(*model.Role)
assert.Equal(t, *data2.Name, role.Name)
assert.Equal(t, *data2.DisplayName, role.DisplayName)
assert.Equal(t, *data.Description, role.Description)
assert.Equal(t, *data.Permissions, role.Permissions)
assert.False(t, role.BuiltIn)
assert.False(t, role.SchemeManaged)
}
}
func TestImportImportTeam(t *testing.T) { func TestImportImportTeam(t *testing.T) {
th := Setup() th := Setup()
defer th.TearDown() defer th.TearDown()
// Mark the phase 2 permissions migration as completed.
<-th.App.Srv.Store.System().Save(&model.System{Name: model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2, Value: "true"})
defer func() {
<-th.App.Srv.Store.System().PermanentDeleteByName(model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2)
}()
scheme1 := th.SetupTeamScheme()
scheme2 := th.SetupTeamScheme()
// Check how many teams are in the database. // Check how many teams are in the database.
var teamsCount int64 var teamsCount int64
if r := <-th.App.Srv.Store.Team().AnalyticsTeamCount(); r.Err == nil { if r := <-th.App.Srv.Store.Team().AnalyticsTeamCount(); r.Err == nil {
@@ -1152,6 +1727,7 @@ func TestImportImportTeam(t *testing.T) {
Type: ptrStr("XYZ"), Type: ptrStr("XYZ"),
Description: ptrStr("The team description."), Description: ptrStr("The team description."),
AllowOpenInvite: ptrBool(true), AllowOpenInvite: ptrBool(true),
Scheme: &scheme1.Name,
} }
// Try importing an invalid team in dryRun mode. // Try importing an invalid team in dryRun mode.
@@ -1166,13 +1742,7 @@ func TestImportImportTeam(t *testing.T) {
} }
// Check that no more teams are in the DB. // Check that no more teams are in the DB.
if r := <-th.App.Srv.Store.Team().AnalyticsTeamCount(); r.Err == nil { th.CheckTeamCount(t, teamsCount)
if r.Data.(int64) != teamsCount {
t.Fatalf("Teams got persisted in dry run mode.")
}
} else {
t.Fatalf("Failed to get team count.")
}
// Do an invalid team in apply mode, check db changes. // Do an invalid team in apply mode, check db changes.
data.Type = ptrStr("XYZ") data.Type = ptrStr("XYZ")
@@ -1181,36 +1751,26 @@ func TestImportImportTeam(t *testing.T) {
} }
// Check that no more teams are in the DB. // Check that no more teams are in the DB.
if r := <-th.App.Srv.Store.Team().AnalyticsTeamCount(); r.Err == nil { th.CheckTeamCount(t, teamsCount)
if r.Data.(int64) != teamsCount {
t.Fatalf("Invalid team got persisted.")
}
} else {
t.Fatalf("Failed to get team count.")
}
// Do a valid team in apply mode, check db changes. // Do a valid team in apply mode, check db changes.
data.Type = ptrStr("O") data.Type = ptrStr("O")
if err := th.App.ImportTeam(&data, false); err != nil { if err := th.App.ImportTeam(&data, false); err != nil {
t.Fatalf("Received an error importing valid team.") t.Fatalf("Received an error importing valid team: %v", err)
} }
// Check that one more team is in the DB. // Check that one more team is in the DB.
if r := <-th.App.Srv.Store.Team().AnalyticsTeamCount(); r.Err == nil { th.CheckTeamCount(t, teamsCount+1)
if r.Data.(int64)-1 != teamsCount {
t.Fatalf("Team did not get saved in apply run mode. analytics=%v teamcount=%v", r.Data.(int64), teamsCount)
}
} else {
t.Fatalf("Failed to get team count.")
}
// Get the team and check that all the fields are correct. // Get the team and check that all the fields are correct.
if team, err := th.App.GetTeamByName(*data.Name); err != nil { if team, err := th.App.GetTeamByName(*data.Name); err != nil {
t.Fatalf("Failed to get team from database.") t.Fatalf("Failed to get team from database.")
} else { } else {
if team.DisplayName != *data.DisplayName || team.Type != *data.Type || team.Description != *data.Description || team.AllowOpenInvite != *data.AllowOpenInvite { assert.Equal(t, *data.DisplayName, team.DisplayName)
t.Fatalf("Imported team properties do not match import data.") assert.Equal(t, *data.Type, team.Type)
} assert.Equal(t, *data.Description, team.Description)
assert.Equal(t, *data.AllowOpenInvite, team.AllowOpenInvite)
assert.Equal(t, scheme1.Id, *team.SchemeId)
} }
// Alter all the fields of that team (apart from unique identifier) and import again. // Alter all the fields of that team (apart from unique identifier) and import again.
@@ -1218,6 +1778,7 @@ func TestImportImportTeam(t *testing.T) {
data.Type = ptrStr("P") data.Type = ptrStr("P")
data.Description = ptrStr("The new description") data.Description = ptrStr("The new description")
data.AllowOpenInvite = ptrBool(false) data.AllowOpenInvite = ptrBool(false)
data.Scheme = &scheme2.Name
// Check that the original number of teams are again in the DB (because this query doesn't include deleted). // Check that the original number of teams are again in the DB (because this query doesn't include deleted).
data.Type = ptrStr("O") data.Type = ptrStr("O")
@@ -1225,21 +1786,17 @@ func TestImportImportTeam(t *testing.T) {
t.Fatalf("Received an error importing updated valid team.") t.Fatalf("Received an error importing updated valid team.")
} }
if r := <-th.App.Srv.Store.Team().AnalyticsTeamCount(); r.Err == nil { th.CheckTeamCount(t, teamsCount+1)
if r.Data.(int64)-1 != teamsCount {
t.Fatalf("Team alterations did not get saved in apply run mode. analytics=%v teamcount=%v", r.Data.(int64), teamsCount)
}
} else {
t.Fatalf("Failed to get team count.")
}
// Get the team and check that all fields are correct. // Get the team and check that all fields are correct.
if team, err := th.App.GetTeamByName(*data.Name); err != nil { if team, err := th.App.GetTeamByName(*data.Name); err != nil {
t.Fatalf("Failed to get team from database.") t.Fatalf("Failed to get team from database.")
} else { } else {
if team.DisplayName != *data.DisplayName || team.Type != *data.Type || team.Description != *data.Description || team.AllowOpenInvite != *data.AllowOpenInvite { assert.Equal(t, *data.DisplayName, team.DisplayName)
t.Fatalf("Updated team properties do not match import data.") assert.Equal(t, *data.Type, team.Type)
} assert.Equal(t, *data.Description, team.Description)
assert.Equal(t, *data.AllowOpenInvite, team.AllowOpenInvite)
assert.Equal(t, scheme2.Id, *team.SchemeId)
} }
} }
@@ -1247,6 +1804,16 @@ func TestImportImportChannel(t *testing.T) {
th := Setup() th := Setup()
defer th.TearDown() defer th.TearDown()
// Mark the phase 2 permissions migration as completed.
<-th.App.Srv.Store.System().Save(&model.System{Name: model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2, Value: "true"})
defer func() {
<-th.App.Srv.Store.System().PermanentDeleteByName(model.MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2)
}()
scheme1 := th.SetupChannelScheme()
scheme2 := th.SetupChannelScheme()
// Import a Team. // Import a Team.
teamName := model.NewId() teamName := model.NewId()
th.App.ImportTeam(&TeamImportData{ th.App.ImportTeam(&TeamImportData{
@@ -1274,19 +1841,14 @@ func TestImportImportChannel(t *testing.T) {
Type: ptrStr("O"), Type: ptrStr("O"),
Header: ptrStr("Channe Header"), Header: ptrStr("Channe Header"),
Purpose: ptrStr("Channel Purpose"), Purpose: ptrStr("Channel Purpose"),
Scheme: &scheme1.Name,
} }
if err := th.App.ImportChannel(&data, true); err == nil { if err := th.App.ImportChannel(&data, true); err == nil {
t.Fatalf("Expected error due to invalid name.") t.Fatalf("Expected error due to invalid name.")
} }
// Check that no more channels are in the DB. // Check that no more channels are in the DB.
if r := <-th.App.Srv.Store.Channel().AnalyticsTypeCount("", model.CHANNEL_OPEN); r.Err == nil { th.CheckChannelsCount(t, channelCount)
if r.Data.(int64) != channelCount {
t.Fatalf("Channels got persisted in dry run mode.")
}
} else {
t.Fatalf("Failed to get channel count.")
}
// Do a valid channel with a nonexistent team in dry-run mode. // Do a valid channel with a nonexistent team in dry-run mode.
data.Name = ptrStr("channelname") data.Name = ptrStr("channelname")
@@ -1296,13 +1858,7 @@ func TestImportImportChannel(t *testing.T) {
} }
// Check that no more channels are in the DB. // Check that no more channels are in the DB.
if r := <-th.App.Srv.Store.Channel().AnalyticsTypeCount("", model.CHANNEL_OPEN); r.Err == nil { th.CheckChannelsCount(t, channelCount)
if r.Data.(int64) != channelCount {
t.Fatalf("Channels got persisted in dry run mode.")
}
} else {
t.Fatalf("Failed to get channel count.")
}
// Do a valid channel in dry-run mode. // Do a valid channel in dry-run mode.
data.Team = &teamName data.Team = &teamName
@@ -1311,13 +1867,7 @@ func TestImportImportChannel(t *testing.T) {
} }
// Check that no more channels are in the DB. // Check that no more channels are in the DB.
if r := <-th.App.Srv.Store.Channel().AnalyticsTypeCount("", model.CHANNEL_OPEN); r.Err == nil { th.CheckChannelsCount(t, channelCount)
if r.Data.(int64) != channelCount {
t.Fatalf("Channels got persisted in dry run mode.")
}
} else {
t.Fatalf("Failed to get channel count.")
}
// Do an invalid channel in apply mode. // Do an invalid channel in apply mode.
data.Name = nil data.Name = nil
@@ -1326,13 +1876,7 @@ func TestImportImportChannel(t *testing.T) {
} }
// Check that no more channels are in the DB. // Check that no more channels are in the DB.
if r := <-th.App.Srv.Store.Channel().AnalyticsTypeCount("", model.CHANNEL_OPEN); r.Err == nil { th.CheckChannelsCount(t, channelCount)
if r.Data.(int64) != channelCount {
t.Fatalf("Invalid channel got persisted in apply mode.")
}
} else {
t.Fatalf("Failed to get channel count.")
}
// Do a valid channel in apply mode with a non-existent team. // Do a valid channel in apply mode with a non-existent team.
data.Name = ptrStr("channelname") data.Name = ptrStr("channelname")
@@ -1342,13 +1886,7 @@ func TestImportImportChannel(t *testing.T) {
} }
// Check that no more channels are in the DB. // Check that no more channels are in the DB.
if r := <-th.App.Srv.Store.Channel().AnalyticsTypeCount("", model.CHANNEL_OPEN); r.Err == nil { th.CheckChannelsCount(t, channelCount)
if r.Data.(int64) != channelCount {
t.Fatalf("Invalid team channel got persisted in apply mode.")
}
} else {
t.Fatalf("Failed to get channel count.")
}
// Do a valid channel in apply mode. // Do a valid channel in apply mode.
data.Team = &teamName data.Team = &teamName
@@ -1356,22 +1894,19 @@ func TestImportImportChannel(t *testing.T) {
t.Fatalf("Expected success in apply mode: %v", err.Error()) t.Fatalf("Expected success in apply mode: %v", err.Error())
} }
// Check that no more channels are in the DB. // Check that 1 more channel is in the DB.
if r := <-th.App.Srv.Store.Channel().AnalyticsTypeCount("", model.CHANNEL_OPEN); r.Err == nil { th.CheckChannelsCount(t, channelCount+1)
if r.Data.(int64) != channelCount+1 {
t.Fatalf("Channels did not get persisted in apply mode: found %v expected %v + 1", r.Data.(int64), channelCount)
}
} else {
t.Fatalf("Failed to get channel count.")
}
// Get the Channel and check all the fields are correct. // Get the Channel and check all the fields are correct.
if channel, err := th.App.GetChannelByName(*data.Name, team.Id); err != nil { if channel, err := th.App.GetChannelByName(*data.Name, team.Id); err != nil {
t.Fatalf("Failed to get channel from database.") t.Fatalf("Failed to get channel from database.")
} else { } else {
if channel.Name != *data.Name || channel.DisplayName != *data.DisplayName || channel.Type != *data.Type || channel.Header != *data.Header || channel.Purpose != *data.Purpose { assert.Equal(t, *data.Name, channel.Name)
t.Fatalf("Imported team properties do not match Import Data.") assert.Equal(t, *data.DisplayName, channel.DisplayName)
} assert.Equal(t, *data.Type, channel.Type)
assert.Equal(t, *data.Header, channel.Header)
assert.Equal(t, *data.Purpose, channel.Purpose)
assert.Equal(t, scheme1.Id, *channel.SchemeId)
} }
// Alter all the fields of that channel. // Alter all the fields of that channel.
@@ -1379,26 +1914,24 @@ func TestImportImportChannel(t *testing.T) {
data.Type = ptrStr(model.CHANNEL_PRIVATE) data.Type = ptrStr(model.CHANNEL_PRIVATE)
data.Header = ptrStr("New Header") data.Header = ptrStr("New Header")
data.Purpose = ptrStr("New Purpose") data.Purpose = ptrStr("New Purpose")
data.Scheme = &scheme2.Name
if err := th.App.ImportChannel(&data, false); err != nil { if err := th.App.ImportChannel(&data, false); err != nil {
t.Fatalf("Expected success in apply mode: %v", err.Error()) t.Fatalf("Expected success in apply mode: %v", err.Error())
} }
// Check channel count the same. // Check channel count the same.
if r := <-th.App.Srv.Store.Channel().AnalyticsTypeCount("", model.CHANNEL_OPEN); r.Err == nil { th.CheckChannelsCount(t, channelCount)
if r.Data.(int64) != channelCount {
t.Fatalf("Updated channel did not get correctly persisted in apply mode.")
}
} else {
t.Fatalf("Failed to get channel count.")
}
// Get the Channel and check all the fields are correct. // Get the Channel and check all the fields are correct.
if channel, err := th.App.GetChannelByName(*data.Name, team.Id); err != nil { if channel, err := th.App.GetChannelByName(*data.Name, team.Id); err != nil {
t.Fatalf("Failed to get channel from database.") t.Fatalf("Failed to get channel from database.")
} else { } else {
if channel.Name != *data.Name || channel.DisplayName != *data.DisplayName || channel.Type != *data.Type || channel.Header != *data.Header || channel.Purpose != *data.Purpose { assert.Equal(t, *data.Name, channel.Name)
t.Fatalf("Updated team properties do not match Import Data.") assert.Equal(t, *data.DisplayName, channel.DisplayName)
} assert.Equal(t, *data.Type, channel.Type)
assert.Equal(t, *data.Header, channel.Header)
assert.Equal(t, *data.Purpose, channel.Purpose)
assert.Equal(t, scheme2.Id, *channel.SchemeId)
} }
} }
@@ -3109,6 +3642,12 @@ func TestImportImportLine(t *testing.T) {
if err := th.App.ImportLine(line, false); err == nil { if err := th.App.ImportLine(line, false); err == nil {
t.Fatalf("Expected an error when importing a line with type direct_post with a nil direct_post.") t.Fatalf("Expected an error when importing a line with type direct_post with a nil direct_post.")
} }
// Try import line with scheme type but nil scheme.
line.Type = "scheme"
if err := th.App.ImportLine(line, false); err == nil {
t.Fatalf("Expected an error when importing a line with type scheme with a nil scheme.")
}
} }
func TestImportBulkImport(t *testing.T) { func TestImportBulkImport(t *testing.T) {

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

@@ -50,6 +50,21 @@ func (a *App) PatchRole(role *model.Role, patch *model.RolePatch) (*model.Role,
return role, err return role, err
} }
func (a *App) CreateRole(role *model.Role) (*model.Role, *model.AppError) {
role.Id = ""
role.CreateAt = 0
role.UpdateAt = 0
role.DeleteAt = 0
role.BuiltIn = false
role.SchemeManaged = false
if result := <-a.Srv.Store.Role().Save(role); result.Err != nil {
return nil, result.Err
} else {
return result.Data.(*model.Role), nil
}
}
func (a *App) UpdateRole(role *model.Role) (*model.Role, *model.AppError) { func (a *App) UpdateRole(role *model.Role) (*model.Role, *model.AppError) {
if result := <-a.Srv.Store.Role().Save(role); result.Err != nil { if result := <-a.Srv.Store.Role().Save(role); result.Err != nil {
return nil, result.Err return nil, result.Err

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

@@ -22,6 +22,18 @@ func (a *App) GetScheme(id string) (*model.Scheme, *model.AppError) {
} }
} }
func (a *App) GetSchemeByName(name string) (*model.Scheme, *model.AppError) {
if err := a.IsPhase2MigrationCompleted(); err != nil {
return nil, err
}
if result := <-a.Srv.Store.Scheme().GetByName(name); result.Err != nil {
return nil, result.Err
} else {
return result.Data.(*model.Scheme), nil
}
}
func (a *App) GetSchemesPage(scope string, page int, perPage int) ([]*model.Scheme, *model.AppError) { func (a *App) GetSchemesPage(scope string, page int, perPage int) ([]*model.Scheme, *model.AppError) {
if err := a.IsPhase2MigrationCompleted(); err != nil { if err := a.IsPhase2MigrationCompleted(); err != nil {
return nil, err return nil, err

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

@@ -105,8 +105,9 @@ func (a *App) UpdateTeam(team *model.Team) (*model.Team, *model.AppError) {
oldTeam.AllowedDomains = team.AllowedDomains oldTeam.AllowedDomains = team.AllowedDomains
oldTeam.LastTeamIconUpdate = team.LastTeamIconUpdate oldTeam.LastTeamIconUpdate = team.LastTeamIconUpdate
if result := <-a.Srv.Store.Team().Update(oldTeam); result.Err != nil { oldTeam, err = a.updateTeamUnsanitized(oldTeam)
return nil, result.Err if err != nil {
return team, err
} }
a.sendTeamEvent(oldTeam, model.WEBSOCKET_EVENT_UPDATE_TEAM) a.sendTeamEvent(oldTeam, model.WEBSOCKET_EVENT_UPDATE_TEAM)
@@ -114,6 +115,14 @@ func (a *App) UpdateTeam(team *model.Team) (*model.Team, *model.AppError) {
return oldTeam, nil return oldTeam, nil
} }
func (a *App) updateTeamUnsanitized(team *model.Team) (*model.Team, *model.AppError) {
if result := <-a.Srv.Store.Team().Update(team); result.Err != nil {
return nil, result.Err
} else {
return result.Data.(*model.Team), nil
}
}
func (a *App) UpdateTeamScheme(team *model.Team) (*model.Team, *model.AppError) { func (a *App) UpdateTeamScheme(team *model.Team) (*model.Team, *model.AppError) {
var oldTeam *model.Team var oldTeam *model.Team
var err *model.AppError var err *model.AppError

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

@@ -3446,6 +3446,14 @@
"id": "app.import.import_line.null_channel.error", "id": "app.import.import_line.null_channel.error",
"translation": "Import data line has type \"channel\" but the channel object is null." "translation": "Import data line has type \"channel\" but the channel object is null."
}, },
{
"id": "app.import.import_line.null_scheme.error",
"translation": "Import data line has type \"scheme\" but the scheme object is null."
},
{
"id": "app.import.import_scheme.scope_change.error",
"translation": "The bulk importer cannot change the scope of an already-existing scheme."
},
{ {
"id": "app.import.import_line.null_direct_channel.error", "id": "app.import.import_line.null_direct_channel.error",
"translation": "Import data line has type \"direct_channel\" but the direct_channel object is null." "translation": "Import data line has type \"direct_channel\" but the direct_channel object is null."
@@ -3466,6 +3474,70 @@
"id": "app.import.import_line.null_user.error", "id": "app.import.import_line.null_user.error",
"translation": "Import data line has type \"user\" but the user object is null." "translation": "Import data line has type \"user\" but the user object is null."
}, },
{
"id": "app.import.validate_scheme_import_data.null_scope.error",
"translation": "Scheme scope is required."
},
{
"id": "app.import.validate_scheme_import_data.wrong_roles_for_scope.error",
"translation": "The wrong roles were provided for a scheme with this scope."
},
{
"id": "app.import.validate_scheme_import_data.unknown_scheme.error",
"translation": "Unknown scheme scope."
},
{
"id": "app.import.validate_scheme_import_data.name_invalid.error",
"translation": "Invalid scheme name."
},
{
"id": "app.import.validate_scheme_import_data.display_name_invalid.error",
"translation": "Invalid scheme display name."
},
{
"id": "app.import.validate_scheme_import_data.description_invalid.error",
"translation": "Invalid scheme description."
},
{
"id": "app.import.validate_role_import_data.name_invalid.error",
"translation": "Invalid role name."
},
{
"id": "app.import.validate_role_import_data.display_name_invalid.error",
"translation": "Invalid role display name."
},
{
"id": "app.import.validate_role_import_data.description_invalid.error",
"translation": "Invalid role description."
},
{
"id": "app.import.validate_role_import_data.invalid_permission.error",
"translation": "Invalid permission on role."
},
{
"id": "app.import.validate_team_import_data.scheme_invalid.error",
"translation": "Invalid scheme name for team."
},
{
"id": "app.import.validate_channel_import_data.scheme_invalid.error",
"translation": "Invalid scheme name for channel."
},
{
"id": "app.import.import_team.scheme_deleted.error",
"translation": "Cannot set a team to use a deleted scheme."
},
{
"id": "app.import.import_team.scheme_wrong_scope.error",
"translation": "Team must be assigned to a Team-scoped scheme."
},
{
"id": "app.import.import_channel.scheme_deleted.error",
"translation": "Cannot set a channel to use a deleted scheme."
},
{
"id": "app.import.import_channel.scheme_wrong_scope.error",
"translation": "Channel must be assigned to a Channel-scoped scheme."
},
{ {
"id": "app.import.import_line.unknown_line_type.error", "id": "app.import.import_line.unknown_line_type.error",
"translation": "Import data line has unknown type \"{{.Type}}\"." "translation": "Import data line has unknown type \"{{.Type}}\"."

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

@@ -192,7 +192,7 @@ func (p *SchemeIDPatch) ToJson() string {
} }
func IsValidSchemeName(name string) bool { func IsValidSchemeName(name string) bool {
re := regexp.MustCompile(fmt.Sprintf("^[a-z0-9_]{0,%d}$", SCHEME_NAME_MAX_LENGTH)) re := regexp.MustCompile(fmt.Sprintf("^[a-z0-9_]{2,%d}$", SCHEME_NAME_MAX_LENGTH))
return re.MatchString(name) return re.MatchString(name)
} }

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

@@ -287,6 +287,12 @@ func (s *LayeredSchemeStore) Get(schemeId string) StoreChannel {
}) })
} }
func (s *LayeredSchemeStore) GetByName(schemeName string) StoreChannel {
return s.RunQuery(func(supplier LayeredStoreSupplier) *LayeredStoreSupplierResult {
return supplier.SchemeGetByName(s.TmpContext, schemeName)
})
}
func (s *LayeredSchemeStore) Delete(schemeId string) StoreChannel { func (s *LayeredSchemeStore) Delete(schemeId string) StoreChannel {
return s.RunQuery(func(supplier LayeredStoreSupplier) *LayeredStoreSupplierResult { return s.RunQuery(func(supplier LayeredStoreSupplier) *LayeredStoreSupplierResult {
return supplier.SchemeDelete(s.TmpContext, schemeId) return supplier.SchemeDelete(s.TmpContext, schemeId)

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

@@ -41,6 +41,7 @@ type LayeredStoreSupplier interface {
// Schemes // Schemes
SchemeSave(ctx context.Context, scheme *model.Scheme, hints ...LayeredStoreHint) *LayeredStoreSupplierResult SchemeSave(ctx context.Context, scheme *model.Scheme, hints ...LayeredStoreHint) *LayeredStoreSupplierResult
SchemeGet(ctx context.Context, schemeId string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult SchemeGet(ctx context.Context, schemeId string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult
SchemeGetByName(ctx context.Context, schemeName string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult
SchemeDelete(ctx context.Context, schemeId string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult SchemeDelete(ctx context.Context, schemeId string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult
SchemeGetAllPage(ctx context.Context, scope string, offset int, limit int, hints ...LayeredStoreHint) *LayeredStoreSupplierResult SchemeGetAllPage(ctx context.Context, scope string, offset int, limit int, hints ...LayeredStoreHint) *LayeredStoreSupplierResult
SchemePermanentDeleteAll(ctx context.Context, hints ...LayeredStoreHint) *LayeredStoreSupplierResult SchemePermanentDeleteAll(ctx context.Context, hints ...LayeredStoreHint) *LayeredStoreSupplierResult

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

@@ -36,6 +36,10 @@ func (s *LocalCacheSupplier) SchemeGet(ctx context.Context, schemeId string, hin
return result return result
} }
func (s *LocalCacheSupplier) SchemeGetByName(ctx context.Context, schemeName string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult {
return s.Next().SchemeGetByName(ctx, schemeName, hints...)
}
func (s *LocalCacheSupplier) SchemeDelete(ctx context.Context, schemeId string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { func (s *LocalCacheSupplier) SchemeDelete(ctx context.Context, schemeId string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult {
defer s.doInvalidateCacheCluster(s.schemeCache, schemeId) defer s.doInvalidateCacheCluster(s.schemeCache, schemeId)
defer s.doClearCacheCluster(s.roleCache) defer s.doClearCacheCluster(s.roleCache)

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

@@ -19,6 +19,11 @@ func (s *RedisSupplier) SchemeGet(ctx context.Context, schemeId string, hints ..
return s.Next().SchemeGet(ctx, schemeId, hints...) return s.Next().SchemeGet(ctx, schemeId, hints...)
} }
func (s *RedisSupplier) SchemeGetByName(ctx context.Context, schemeName string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult {
// TODO: Redis caching.
return s.Next().SchemeGetByName(ctx, schemeName, hints...)
}
func (s *RedisSupplier) SchemeDelete(ctx context.Context, schemeId string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult { func (s *RedisSupplier) SchemeDelete(ctx context.Context, schemeId string, hints ...LayeredStoreHint) *LayeredStoreSupplierResult {
// TODO: Redis caching. // TODO: Redis caching.
return s.Next().SchemeDelete(ctx, schemeId, hints...) return s.Next().SchemeDelete(ctx, schemeId, hints...)

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

@@ -48,7 +48,7 @@ func (s *SqlSupplier) SchemeSave(ctx context.Context, scheme *model.Scheme, hint
} }
} else { } else {
if !scheme.IsValid() { if !scheme.IsValid() {
result.Err = model.NewAppError("SqlSchemeStore.Save", "store.sql_scheme.save.invalid_scheme.app_error", nil, "", http.StatusBadRequest) result.Err = model.NewAppError("SqlSchemeStore.Save", "store.sql_scheme.save.invalid_scheme.app_error", nil, "schemeId="+scheme.Id, http.StatusBadRequest)
return result return result
} }
@@ -199,6 +199,24 @@ func (s *SqlSupplier) SchemeGet(ctx context.Context, schemeId string, hints ...s
return result return result
} }
func (s *SqlSupplier) SchemeGetByName(ctx context.Context, schemeName string, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
result := store.NewSupplierResult()
var scheme model.Scheme
if err := s.GetReplica().SelectOne(&scheme, "SELECT * from Schemes WHERE Name = :Name", map[string]interface{}{"Name": schemeName}); err != nil {
if err == sql.ErrNoRows {
result.Err = model.NewAppError("SqlSchemeStore.GetByName", "store.sql_scheme.get.app_error", nil, "Name="+schemeName+", "+err.Error(), http.StatusNotFound)
} else {
result.Err = model.NewAppError("SqlSchemeStore.GetByName", "store.sql_scheme.get.app_error", nil, err.Error(), http.StatusInternalServerError)
}
}
result.Data = &scheme
return result
}
func (s *SqlSupplier) SchemeDelete(ctx context.Context, schemeId string, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult { func (s *SqlSupplier) SchemeDelete(ctx context.Context, schemeId string, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
result := store.NewSupplierResult() result := store.NewSupplierResult()

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

@@ -489,6 +489,7 @@ type RoleStore interface {
type SchemeStore interface { type SchemeStore interface {
Save(scheme *model.Scheme) StoreChannel Save(scheme *model.Scheme) StoreChannel
Get(schemeId string) StoreChannel Get(schemeId string) StoreChannel
GetByName(schemeName string) StoreChannel
GetAllPage(scope string, offset int, limit int) StoreChannel GetAllPage(scope string, offset int, limit int) StoreChannel
Delete(schemeId string) StoreChannel Delete(schemeId string) StoreChannel
PermanentDeleteAll() StoreChannel PermanentDeleteAll() StoreChannel

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.
@@ -655,6 +655,29 @@ func (_m *LayeredStoreDatabaseLayer) SchemeGetAllPage(ctx context.Context, scope
return r0 return r0
} }
// SchemeGetByName provides a mock function with given fields: ctx, schemeName, hints
func (_m *LayeredStoreDatabaseLayer) SchemeGetByName(ctx context.Context, schemeName string, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
_va := make([]interface{}, len(hints))
for _i := range hints {
_va[_i] = hints[_i]
}
var _ca []interface{}
_ca = append(_ca, ctx, schemeName)
_ca = append(_ca, _va...)
ret := _m.Called(_ca...)
var r0 *store.LayeredStoreSupplierResult
if rf, ok := ret.Get(0).(func(context.Context, string, ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult); ok {
r0 = rf(ctx, schemeName, hints...)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*store.LayeredStoreSupplierResult)
}
}
return r0
}
// SchemePermanentDeleteAll provides a mock function with given fields: ctx, hints // SchemePermanentDeleteAll provides a mock function with given fields: ctx, hints
func (_m *LayeredStoreDatabaseLayer) SchemePermanentDeleteAll(ctx context.Context, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult { func (_m *LayeredStoreDatabaseLayer) SchemePermanentDeleteAll(ctx context.Context, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
_va := make([]interface{}, len(hints)) _va := make([]interface{}, len(hints))

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.
@@ -352,6 +352,29 @@ func (_m *LayeredStoreSupplier) SchemeGetAllPage(ctx context.Context, scope stri
return r0 return r0
} }
// SchemeGetByName provides a mock function with given fields: ctx, schemeName, hints
func (_m *LayeredStoreSupplier) SchemeGetByName(ctx context.Context, schemeName string, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
_va := make([]interface{}, len(hints))
for _i := range hints {
_va[_i] = hints[_i]
}
var _ca []interface{}
_ca = append(_ca, ctx, schemeName)
_ca = append(_ca, _va...)
ret := _m.Called(_ca...)
var r0 *store.LayeredStoreSupplierResult
if rf, ok := ret.Get(0).(func(context.Context, string, ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult); ok {
r0 = rf(ctx, schemeName, hints...)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*store.LayeredStoreSupplierResult)
}
}
return r0
}
// SchemePermanentDeleteAll provides a mock function with given fields: ctx, hints // SchemePermanentDeleteAll provides a mock function with given fields: ctx, hints
func (_m *LayeredStoreSupplier) SchemePermanentDeleteAll(ctx context.Context, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult { func (_m *LayeredStoreSupplier) SchemePermanentDeleteAll(ctx context.Context, hints ...store.LayeredStoreHint) *store.LayeredStoreSupplierResult {
_va := make([]interface{}, len(hints)) _va := make([]interface{}, len(hints))

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.
@@ -66,9 +66,9 @@ func (_m *PostStore) ClearCaches() {
_m.Called() _m.Called()
} }
// Delete provides a mock function with given fields: postId, time // Delete provides a mock function with given fields: postId, time, deleteByID
func (_m *PostStore) Delete(postId string, time int64, deleteByID string) store.StoreChannel { func (_m *PostStore) Delete(postId string, time int64, deleteByID string) store.StoreChannel {
ret := _m.Called(postId, time) ret := _m.Called(postId, time, deleteByID)
var r0 store.StoreChannel var r0 store.StoreChannel
if rf, ok := ret.Get(0).(func(string, int64, string) store.StoreChannel); ok { if rf, ok := ret.Get(0).(func(string, int64, string) store.StoreChannel); ok {

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -61,6 +61,22 @@ func (_m *SchemeStore) GetAllPage(scope string, offset int, limit int) store.Sto
return r0 return r0
} }
// GetByName provides a mock function with given fields: schemeName
func (_m *SchemeStore) GetByName(schemeName string) store.StoreChannel {
ret := _m.Called(schemeName)
var r0 store.StoreChannel
if rf, ok := ret.Get(0).(func(string) store.StoreChannel); ok {
r0 = rf(schemeName)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.StoreChannel)
}
}
return r0
}
// PermanentDeleteAll provides a mock function with given fields: // PermanentDeleteAll provides a mock function with given fields:
func (_m *SchemeStore) PermanentDeleteAll() store.StoreChannel { func (_m *SchemeStore) PermanentDeleteAll() store.StoreChannel {
ret := _m.Called() ret := _m.Called()

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -1,4 +1,4 @@
// Code generated by mockery v1.0.0. DO NOT EDIT. // Code generated by mockery v1.0.0
// Regenerate this file using `make store-mocks`. // Regenerate this file using `make store-mocks`.

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

@@ -179,6 +179,42 @@ func testSchemeStoreGet(t *testing.T, ss store.Store) {
assert.NotNil(t, res3.Err) assert.NotNil(t, res3.Err)
} }
func testSchemeStoreGetByName(t *testing.T, ss store.Store) {
// Save a scheme to test with.
s1 := &model.Scheme{
DisplayName: model.NewId(),
Name: model.NewId(),
Description: model.NewId(),
Scope: model.SCHEME_SCOPE_TEAM,
}
res1 := <-ss.Scheme().Save(s1)
assert.Nil(t, res1.Err)
d1 := res1.Data.(*model.Scheme)
assert.Len(t, d1.Id, 26)
// Get a valid scheme
res2 := <-ss.Scheme().GetByName(d1.Name)
assert.Nil(t, res2.Err)
d2 := res1.Data.(*model.Scheme)
assert.Equal(t, d1.Id, d2.Id)
assert.Equal(t, s1.DisplayName, d2.DisplayName)
assert.Equal(t, s1.Name, d2.Name)
assert.Equal(t, d1.Description, d2.Description)
assert.NotZero(t, d2.CreateAt)
assert.NotZero(t, d2.UpdateAt)
assert.Zero(t, d2.DeleteAt)
assert.Equal(t, s1.Scope, d2.Scope)
assert.Equal(t, d1.DefaultTeamAdminRole, d2.DefaultTeamAdminRole)
assert.Equal(t, d1.DefaultTeamUserRole, d2.DefaultTeamUserRole)
assert.Equal(t, d1.DefaultChannelAdminRole, d2.DefaultChannelAdminRole)
assert.Equal(t, d1.DefaultChannelUserRole, d2.DefaultChannelUserRole)
// Get an invalid scheme
res3 := <-ss.Scheme().GetByName(model.NewId())
assert.NotNil(t, res3.Err)
}
func testSchemeStoreGetAllPage(t *testing.T, ss store.Store) { func testSchemeStoreGetAllPage(t *testing.T, ss store.Store) {
// Save a scheme to test with. // Save a scheme to test with.
schemes := []*model.Scheme{ schemes := []*model.Scheme{