Migrate to stateless app.App (#17542)
* add request context * move initialialization to server * use app interface instead of global app functions * remove app context from webconn * cleanup * remove duplicated services * move context to separate package * remove finalize init method and move content to NewServer function * restart workers and schedulers after adding license for tests * reflect review comments Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
c09369f14a
Коммит
5ea06e51d0
@@ -17,6 +17,7 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/mattermost/mattermost-server/v5/app/request"
|
||||
"github.com/mattermost/mattermost-server/v5/einterfaces"
|
||||
"github.com/mattermost/mattermost-server/v5/model"
|
||||
oauthgitlab "github.com/mattermost/mattermost-server/v5/model/gitlab"
|
||||
@@ -84,16 +85,16 @@ func TestCreateOAuthUser(t *testing.T) {
|
||||
glUser := oauthgitlab.GitLabUser{Id: 42, Username: "o" + model.NewId(), Email: model.NewId() + "@simulator.amazonses.com", Name: "Joram Wilander"}
|
||||
|
||||
json := glUser.ToJson()
|
||||
user, err := th.App.CreateOAuthUser(model.USER_AUTH_SERVICE_GITLAB, strings.NewReader(json), th.BasicTeam.Id, nil)
|
||||
user, err := th.App.CreateOAuthUser(th.Context, model.USER_AUTH_SERVICE_GITLAB, strings.NewReader(json), th.BasicTeam.Id, nil)
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Equal(t, glUser.Username, user.Username, "usernames didn't match")
|
||||
|
||||
th.App.PermanentDeleteUser(user)
|
||||
th.App.PermanentDeleteUser(th.Context, user)
|
||||
|
||||
*th.App.Config().TeamSettings.EnableUserCreation = false
|
||||
|
||||
_, err = th.App.CreateOAuthUser(model.USER_AUTH_SERVICE_GITLAB, strings.NewReader(json), th.BasicTeam.Id, nil)
|
||||
_, err = th.App.CreateOAuthUser(th.Context, model.USER_AUTH_SERVICE_GITLAB, strings.NewReader(json), th.BasicTeam.Id, nil)
|
||||
require.NotNil(t, err, "should have failed - user creation disabled")
|
||||
}
|
||||
|
||||
@@ -160,7 +161,7 @@ func TestUpdateUserToRestrictedDomain(t *testing.T) {
|
||||
defer th.TearDown()
|
||||
|
||||
user := th.CreateUser()
|
||||
defer th.App.PermanentDeleteUser(user)
|
||||
defer th.App.PermanentDeleteUser(th.Context, user)
|
||||
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.TeamSettings.RestrictCreationToDomains = "foo.com"
|
||||
@@ -175,7 +176,7 @@ func TestUpdateUserToRestrictedDomain(t *testing.T) {
|
||||
|
||||
t.Run("Restricted Domains must be ignored for guest users", func(t *testing.T) {
|
||||
guest := th.CreateGuest()
|
||||
defer th.App.PermanentDeleteUser(guest)
|
||||
defer th.App.PermanentDeleteUser(th.Context, guest)
|
||||
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.TeamSettings.RestrictCreationToDomains = "foo.com"
|
||||
@@ -189,7 +190,7 @@ func TestUpdateUserToRestrictedDomain(t *testing.T) {
|
||||
|
||||
t.Run("Guest users should be affected by guest restricted domains", func(t *testing.T) {
|
||||
guest := th.CreateGuest()
|
||||
defer th.App.PermanentDeleteUser(guest)
|
||||
defer th.App.PermanentDeleteUser(th.Context, guest)
|
||||
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.GuestAccountsSettings.RestrictCreationToDomains = "foo.com"
|
||||
@@ -220,7 +221,7 @@ func TestUpdateUserActive(t *testing.T) {
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.TeamSettings.EnableUserDeactivation = true
|
||||
})
|
||||
err := th.App.UpdateUserActive(user.Id, false)
|
||||
err := th.App.UpdateUserActive(th.Context, user.Id, false)
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
||||
@@ -228,7 +229,7 @@ func TestUpdateActiveBotsSideEffect(t *testing.T) {
|
||||
th := Setup(t).InitBasic()
|
||||
defer th.TearDown()
|
||||
|
||||
bot, err := th.App.CreateBot(&model.Bot{
|
||||
bot, err := th.App.CreateBot(th.Context, &model.Bot{
|
||||
Username: "username",
|
||||
Description: "a bot",
|
||||
OwnerId: th.BasicUser.Id,
|
||||
@@ -241,7 +242,7 @@ func TestUpdateActiveBotsSideEffect(t *testing.T) {
|
||||
*cfg.ServiceSettings.DisableBotsWhenOwnerIsDeactivated = false
|
||||
})
|
||||
|
||||
th.App.UpdateActive(th.BasicUser, false)
|
||||
th.App.UpdateActive(th.Context, th.BasicUser, false)
|
||||
|
||||
retbot1, err := th.App.GetBot(bot.UserId, true)
|
||||
require.Nil(t, err)
|
||||
@@ -250,14 +251,14 @@ func TestUpdateActiveBotsSideEffect(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
require.Zero(t, user1.DeleteAt)
|
||||
|
||||
th.App.UpdateActive(th.BasicUser, true)
|
||||
th.App.UpdateActive(th.Context, th.BasicUser, true)
|
||||
|
||||
// Automatic deactivation enabled
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.ServiceSettings.DisableBotsWhenOwnerIsDeactivated = true
|
||||
})
|
||||
|
||||
th.App.UpdateActive(th.BasicUser, false)
|
||||
th.App.UpdateActive(th.Context, th.BasicUser, false)
|
||||
|
||||
retbot2, err := th.App.GetBot(bot.UserId, true)
|
||||
require.Nil(t, err)
|
||||
@@ -266,7 +267,7 @@ func TestUpdateActiveBotsSideEffect(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
require.NotZero(t, user2.DeleteAt)
|
||||
|
||||
th.App.UpdateActive(th.BasicUser, true)
|
||||
th.App.UpdateActive(th.Context, th.BasicUser, true)
|
||||
}
|
||||
|
||||
func TestUpdateOAuthUserAttrs(t *testing.T) {
|
||||
@@ -288,8 +289,8 @@ func TestUpdateOAuthUserAttrs(t *testing.T) {
|
||||
|
||||
var user, user2 *model.User
|
||||
var gitlabUserObj oauthgitlab.GitLabUser
|
||||
user, gitlabUserObj = createGitlabUser(t, th.App, 1, username, email)
|
||||
user2, _ = createGitlabUser(t, th.App, 2, username2, email2)
|
||||
user, gitlabUserObj = createGitlabUser(t, th.App, th.Context, 1, username, email)
|
||||
user2, _ = createGitlabUser(t, th.App, th.Context, 2, username2, email2)
|
||||
|
||||
t.Run("UpdateUsername", func(t *testing.T) {
|
||||
t.Run("NoExistingUserWithSameUsername", func(t *testing.T) {
|
||||
@@ -534,14 +535,14 @@ func getGitlabUserPayload(gitlabUser oauthgitlab.GitLabUser, t *testing.T) []byt
|
||||
return payload
|
||||
}
|
||||
|
||||
func createGitlabUser(t *testing.T, a *App, id int64, username string, email string) (*model.User, oauthgitlab.GitLabUser) {
|
||||
func createGitlabUser(t *testing.T, a *App, c *request.Context, id int64, username string, email string) (*model.User, oauthgitlab.GitLabUser) {
|
||||
gitlabUserObj := oauthgitlab.GitLabUser{Id: id, Username: username, Login: "user1", Email: email, Name: "Test User"}
|
||||
gitlabUser := getGitlabUserPayload(gitlabUserObj, t)
|
||||
|
||||
var user *model.User
|
||||
var err *model.AppError
|
||||
|
||||
user, err = a.CreateOAuthUser("gitlab", bytes.NewReader(gitlabUser), "", nil)
|
||||
user, err = a.CreateOAuthUser(c, "gitlab", bytes.NewReader(gitlabUser), "", nil)
|
||||
require.Nil(t, err, "unable to create the user", err)
|
||||
|
||||
return user, gitlabUserObj
|
||||
@@ -552,7 +553,7 @@ func TestGetUsersByStatus(t *testing.T) {
|
||||
defer th.TearDown()
|
||||
|
||||
team := th.CreateTeam()
|
||||
channel, err := th.App.CreateChannel(&model.Channel{
|
||||
channel, err := th.App.CreateChannel(th.Context, &model.Channel{
|
||||
DisplayName: "dn_" + model.NewId(),
|
||||
Name: "name_" + model.NewId(),
|
||||
Type: model.CHANNEL_OPEN,
|
||||
@@ -564,7 +565,7 @@ func TestGetUsersByStatus(t *testing.T) {
|
||||
createUserWithStatus := func(username string, status string) *model.User {
|
||||
id := model.NewId()
|
||||
|
||||
user, err := th.App.CreateUser(&model.User{
|
||||
user, err := th.App.CreateUser(th.Context, &model.User{
|
||||
Email: "success+" + id + "@simulator.amazonses.com",
|
||||
Username: "un_" + username + "_" + id,
|
||||
Nickname: "nn_" + id,
|
||||
@@ -684,13 +685,13 @@ func TestCreateUserWithInviteId(t *testing.T) {
|
||||
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
|
||||
|
||||
t.Run("should create a user", func(t *testing.T) {
|
||||
u, err := th.App.CreateUserWithInviteId(&user, th.BasicTeam.InviteId, "")
|
||||
u, err := th.App.CreateUserWithInviteId(th.Context, &user, th.BasicTeam.InviteId, "")
|
||||
require.Nil(t, err)
|
||||
require.Equal(t, u.Id, user.Id)
|
||||
})
|
||||
|
||||
t.Run("invalid invite id", func(t *testing.T) {
|
||||
_, err := th.App.CreateUserWithInviteId(&user, "", "")
|
||||
_, err := th.App.CreateUserWithInviteId(th.Context, &user, "", "")
|
||||
require.NotNil(t, err)
|
||||
require.Contains(t, err.Id, "app.team.get_by_invite_id")
|
||||
})
|
||||
@@ -699,7 +700,7 @@ func TestCreateUserWithInviteId(t *testing.T) {
|
||||
th.BasicTeam.AllowedDomains = "mattermost.com"
|
||||
_, nErr := th.App.Srv().Store.Team().Update(th.BasicTeam)
|
||||
require.NoError(t, nErr)
|
||||
_, err := th.App.CreateUserWithInviteId(&user, th.BasicTeam.InviteId, "")
|
||||
_, err := th.App.CreateUserWithInviteId(th.Context, &user, th.BasicTeam.InviteId, "")
|
||||
require.NotNil(t, err)
|
||||
require.Equal(t, "api.team.invite_members.invalid_email.app_error", err.Id)
|
||||
})
|
||||
@@ -712,7 +713,7 @@ func TestCreateUserWithToken(t *testing.T) {
|
||||
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
|
||||
|
||||
t.Run("invalid token", func(t *testing.T) {
|
||||
_, err := th.App.CreateUserWithToken(&user, &model.Token{Token: "123"})
|
||||
_, err := th.App.CreateUserWithToken(th.Context, &user, &model.Token{Token: "123"})
|
||||
require.NotNil(t, err, "Should fail on unexisting token")
|
||||
})
|
||||
|
||||
@@ -723,7 +724,7 @@ func TestCreateUserWithToken(t *testing.T) {
|
||||
)
|
||||
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
||||
defer th.App.DeleteToken(token)
|
||||
_, err := th.App.CreateUserWithToken(&user, token)
|
||||
_, err := th.App.CreateUserWithToken(th.Context, &user, token)
|
||||
require.NotNil(t, err, "Should fail on bad token type")
|
||||
})
|
||||
|
||||
@@ -735,7 +736,7 @@ func TestCreateUserWithToken(t *testing.T) {
|
||||
token.CreateAt = model.GetMillis() - InvitationExpiryTime - 1
|
||||
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
||||
defer th.App.DeleteToken(token)
|
||||
_, err := th.App.CreateUserWithToken(&user, token)
|
||||
_, err := th.App.CreateUserWithToken(th.Context, &user, token)
|
||||
require.NotNil(t, err, "Should fail on expired token")
|
||||
})
|
||||
|
||||
@@ -746,7 +747,7 @@ func TestCreateUserWithToken(t *testing.T) {
|
||||
)
|
||||
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
||||
defer th.App.DeleteToken(token)
|
||||
_, err := th.App.CreateUserWithToken(&user, token)
|
||||
_, err := th.App.CreateUserWithToken(th.Context, &user, token)
|
||||
require.NotNil(t, err, "Should fail on bad team id")
|
||||
})
|
||||
|
||||
@@ -757,7 +758,7 @@ func TestCreateUserWithToken(t *testing.T) {
|
||||
model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "email": invitationEmail}),
|
||||
)
|
||||
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
||||
newUser, err := th.App.CreateUserWithToken(&user, token)
|
||||
newUser, err := th.App.CreateUserWithToken(th.Context, &user, token)
|
||||
require.Nil(t, err, "Should add user to the team. err=%v", err)
|
||||
assert.False(t, newUser.IsGuest())
|
||||
require.Equal(t, invitationEmail, newUser.Email, "The user email must be the invitation one")
|
||||
@@ -778,7 +779,7 @@ func TestCreateUserWithToken(t *testing.T) {
|
||||
)
|
||||
require.NoError(t, th.App.Srv().Store.Token().Save(token))
|
||||
guest := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
|
||||
newGuest, err := th.App.CreateUserWithToken(&guest, token)
|
||||
newGuest, err := th.App.CreateUserWithToken(th.Context, &guest, token)
|
||||
require.Nil(t, err, "Should add user to the team. err=%v", err)
|
||||
|
||||
assert.True(t, newGuest.IsGuest())
|
||||
@@ -819,12 +820,12 @@ func TestCreateUserWithToken(t *testing.T) {
|
||||
Password: "passwd1",
|
||||
AuthService: "",
|
||||
}
|
||||
newGuest, err := th.App.CreateUserWithToken(&guest, forbiddenDomainToken)
|
||||
newGuest, err := th.App.CreateUserWithToken(th.Context, &guest, forbiddenDomainToken)
|
||||
require.NotNil(t, err)
|
||||
require.Nil(t, newGuest)
|
||||
assert.Equal(t, "api.user.create_user.accepted_domain.app_error", err.Id)
|
||||
|
||||
newGuest, err = th.App.CreateUserWithToken(&guest, grantedDomainToken)
|
||||
newGuest, err = th.App.CreateUserWithToken(th.Context, &guest, grantedDomainToken)
|
||||
require.Nil(t, err)
|
||||
assert.True(t, newGuest.IsGuest())
|
||||
require.Equal(t, grantedInvitationEmail, newGuest.Email)
|
||||
@@ -861,7 +862,7 @@ func TestCreateUserWithToken(t *testing.T) {
|
||||
Password: "passwd1",
|
||||
AuthService: "",
|
||||
}
|
||||
newGuest, err := th.App.CreateUserWithToken(&guest, token)
|
||||
newGuest, err := th.App.CreateUserWithToken(th.Context, &guest, token)
|
||||
require.Nil(t, err)
|
||||
assert.True(t, newGuest.IsGuest())
|
||||
assert.Equal(t, invitationEmail, newGuest.Email, "The user email must be the invitation one")
|
||||
@@ -881,11 +882,11 @@ func TestPermanentDeleteUser(t *testing.T) {
|
||||
|
||||
b := []byte("testimage")
|
||||
|
||||
finfo, err := th.App.DoUploadFile(time.Now(), th.BasicTeam.Id, th.BasicChannel.Id, th.BasicUser.Id, "testfile.txt", b)
|
||||
finfo, err := th.App.DoUploadFile(th.Context, time.Now(), th.BasicTeam.Id, th.BasicChannel.Id, th.BasicUser.Id, "testfile.txt", b)
|
||||
|
||||
require.Nil(t, err, "Unable to upload file. err=%v", err)
|
||||
|
||||
bot, err := th.App.CreateBot(&model.Bot{
|
||||
bot, err := th.App.CreateBot(th.Context, &model.Bot{
|
||||
Username: "botname",
|
||||
Description: "a bot",
|
||||
OwnerId: model.NewId(),
|
||||
@@ -904,14 +905,14 @@ func TestPermanentDeleteUser(t *testing.T) {
|
||||
retUser1, err := th.App.GetUser(bot.UserId)
|
||||
assert.Nil(t, err)
|
||||
|
||||
err = th.App.PermanentDeleteUser(retUser1)
|
||||
err = th.App.PermanentDeleteUser(th.Context, retUser1)
|
||||
assert.Nil(t, err)
|
||||
|
||||
_, err1 = sqlStore.GetMaster().Select(&bots2, "SELECT * FROM Bots")
|
||||
assert.NoError(t, err1)
|
||||
assert.Equal(t, 0, len(bots2))
|
||||
|
||||
err = th.App.PermanentDeleteUser(th.BasicUser)
|
||||
err = th.App.PermanentDeleteUser(th.Context, th.BasicUser)
|
||||
require.Nil(t, err, "Unable to delete user. err=%v", err)
|
||||
|
||||
res, err := th.App.FileExists(finfo.Path)
|
||||
@@ -1086,7 +1087,7 @@ func TestPromoteGuestToUser(t *testing.T) {
|
||||
|
||||
t.Run("Must fail with regular user", func(t *testing.T) {
|
||||
require.Equal(t, "system_user", th.BasicUser.Roles)
|
||||
err := th.App.PromoteGuestToUser(th.BasicUser, th.BasicUser.Id)
|
||||
err := th.App.PromoteGuestToUser(th.Context, th.BasicUser, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
|
||||
user, err := th.App.GetUser(th.BasicUser.Id)
|
||||
@@ -1098,7 +1099,7 @@ func TestPromoteGuestToUser(t *testing.T) {
|
||||
guest := th.CreateGuest()
|
||||
require.Equal(t, "system_guest", guest.Roles)
|
||||
|
||||
err := th.App.PromoteGuestToUser(guest, th.BasicUser.Id)
|
||||
err := th.App.PromoteGuestToUser(th.Context, guest, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
guest, err = th.App.GetUser(guest.Id)
|
||||
assert.Nil(t, err)
|
||||
@@ -1114,7 +1115,7 @@ func TestPromoteGuestToUser(t *testing.T) {
|
||||
require.True(t, teamMember.SchemeGuest)
|
||||
require.False(t, teamMember.SchemeUser)
|
||||
|
||||
err = th.App.PromoteGuestToUser(guest, th.BasicUser.Id)
|
||||
err = th.App.PromoteGuestToUser(th.Context, guest, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
guest, err = th.App.GetUser(guest.Id)
|
||||
assert.Nil(t, err)
|
||||
@@ -1138,7 +1139,7 @@ func TestPromoteGuestToUser(t *testing.T) {
|
||||
require.True(t, channelMember.SchemeGuest)
|
||||
require.False(t, channelMember.SchemeUser)
|
||||
|
||||
err = th.App.PromoteGuestToUser(guest, th.BasicUser.Id)
|
||||
err = th.App.PromoteGuestToUser(th.Context, guest, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
guest, err = th.App.GetUser(guest.Id)
|
||||
assert.Nil(t, err)
|
||||
@@ -1170,7 +1171,7 @@ func TestPromoteGuestToUser(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
require.Len(t, *channelMembers, 1)
|
||||
|
||||
err = th.App.PromoteGuestToUser(guest, th.BasicUser.Id)
|
||||
err = th.App.PromoteGuestToUser(th.Context, guest, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
guest, err = th.App.GetUser(guest.Id)
|
||||
assert.Nil(t, err)
|
||||
@@ -1208,7 +1209,7 @@ func TestPromoteGuestToUser(t *testing.T) {
|
||||
guestCount, _ = th.App.GetChannelGuestCount(th.BasicChannel.Id)
|
||||
require.Equal(t, int64(1), guestCount)
|
||||
|
||||
err = th.App.PromoteGuestToUser(guest, th.BasicUser.Id)
|
||||
err = th.App.PromoteGuestToUser(th.Context, guest, th.BasicUser.Id)
|
||||
require.Nil(t, err)
|
||||
|
||||
guestCount, _ = th.App.GetChannelGuestCount(th.BasicChannel.Id)
|
||||
@@ -1407,7 +1408,7 @@ func TestDeactivateGuests(t *testing.T) {
|
||||
guest2 := th.CreateGuest()
|
||||
user := th.CreateUser()
|
||||
|
||||
err := th.App.DeactivateGuests()
|
||||
err := th.App.DeactivateGuests(th.Context)
|
||||
require.Nil(t, err)
|
||||
|
||||
guest1, err = th.App.GetUser(guest1.Id)
|
||||
@@ -1463,7 +1464,7 @@ func TestPatchUser(t *testing.T) {
|
||||
defer th.TearDown()
|
||||
|
||||
testUser := th.CreateUser()
|
||||
defer th.App.PermanentDeleteUser(testUser)
|
||||
defer th.App.PermanentDeleteUser(th.Context, testUser)
|
||||
|
||||
t.Run("Patch with a username already exists", func(t *testing.T) {
|
||||
_, err := th.App.PatchUser(testUser.Id, &model.UserPatch{
|
||||
|
||||
Ссылка в новой задаче
Block a user