storj/satellite/console/consoleweb/consoleql/mutation_test.go

483 lines
13 KiB
Go
Raw Normal View History

2019-01-24 16:26:36 +00:00
// Copyright (C) 2019 Storj Labs, Inc.
2019-01-08 14:54:35 +00:00
// See LICENSE for copying information.
2019-01-24 16:26:36 +00:00
package consoleql_test
2019-01-08 14:54:35 +00:00
import (
"bytes"
"fmt"
"testing"
"time"
"github.com/graphql-go/graphql"
"github.com/skyrings/skyring-common/tools/uuid"
"github.com/stretchr/testify/assert"
"go.uber.org/zap"
"storj.io/storj/internal/testcontext"
"storj.io/storj/pkg/auth"
2019-01-24 16:26:36 +00:00
"storj.io/storj/satellite"
"storj.io/storj/satellite/console"
"storj.io/storj/satellite/console/consoleauth"
2019-01-24 16:26:36 +00:00
"storj.io/storj/satellite/console/consoleweb/consoleql"
"storj.io/storj/satellite/satellitedb/satellitedbtest"
2019-01-08 14:54:35 +00:00
)
func TestGrapqhlMutation(t *testing.T) {
2019-01-24 16:26:36 +00:00
satellitedbtest.Run(t, func(t *testing.T, db satellite.DB) {
ctx := testcontext.New(t)
defer ctx.Cleanup()
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
log := zap.NewExample()
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
service, err := console.NewService(
log,
&consoleauth.Hmac{Secret: []byte("my-suppa-secret-key")},
db.Console(),
2019-01-08 14:54:35 +00:00
)
2019-01-24 16:26:36 +00:00
if err != nil {
t.Fatal(err)
}
creator := consoleql.TypeCreator{}
if err = creator.Create(service); err != nil {
t.Fatal(err)
}
schema, err := graphql.NewSchema(graphql.SchemaConfig{
Query: creator.RootQuery(),
Mutation: creator.RootMutation(),
2019-01-08 14:54:35 +00:00
})
2019-01-24 16:26:36 +00:00
if err != nil {
t.Fatal(err)
2019-01-08 14:54:35 +00:00
}
2019-01-24 16:26:36 +00:00
createUser := console.CreateUser{
UserInfo: console.UserInfo{
FirstName: "John",
LastName: "Roll",
Email: "test@email.com",
},
Password: "123a123",
2019-01-08 14:54:35 +00:00
}
2019-01-24 16:26:36 +00:00
rootUser, err := service.CreateUser(ctx, createUser)
if err != nil {
t.Fatal(err)
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
token, err := service.Token(ctx, createUser.Email, createUser.Password)
if err != nil {
t.Fatal(err)
}
sauth, err := service.Authorize(auth.WithAPIKey(ctx, []byte(token)))
if err != nil {
t.Fatal(err)
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
authCtx := console.WithAuth(ctx, sauth)
t.Run("Create user mutation", func(t *testing.T) {
newUser := console.CreateUser{
UserInfo: console.UserInfo{
FirstName: "Mickey",
LastName: "Green",
Email: "u1@email.com",
},
Password: "123a123",
}
query := fmt.Sprintf(
"mutation {createUser(input:{email:\"%s\",password:\"%s\",firstName:\"%s\",lastName:\"%s\"})}",
newUser.Email,
newUser.Password,
newUser.FirstName,
newUser.LastName,
)
result := graphql.Do(graphql.Params{
Schema: schema,
Context: ctx,
RequestString: query,
RootObject: make(map[string]interface{}),
})
for _, err := range result.Errors {
assert.NoError(t, err)
}
if result.HasErrors() {
t.Fatal()
}
data := result.Data.(map[string]interface{})
id := data[consoleql.CreateUserMutation].(string)
uID, err := uuid.Parse(id)
assert.NoError(t, err)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
user, err := service.GetUser(authCtx, *uID)
assert.NoError(t, err)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, newUser.Email, user.Email)
assert.Equal(t, newUser.FirstName, user.FirstName)
assert.Equal(t, newUser.LastName, user.LastName)
2019-01-08 14:54:35 +00:00
})
2019-01-24 16:26:36 +00:00
testQuery := func(t *testing.T, query string) interface{} {
result := graphql.Do(graphql.Params{
Schema: schema,
Context: authCtx,
RequestString: query,
RootObject: make(map[string]interface{}),
})
for _, err := range result.Errors {
assert.NoError(t, err)
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
if result.HasErrors() {
t.Fatal()
}
return result.Data
2019-01-08 14:54:35 +00:00
}
2019-01-24 16:26:36 +00:00
t.Run("Update account mutation email only", func(t *testing.T) {
email := "new@email.com"
query := fmt.Sprintf(
"mutation {updateAccount(input:{email:\"%s\"}){id,email,firstName,lastName,createdAt}}",
email,
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
user := data[consoleql.UpdateAccountMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, rootUser.ID.String(), user[consoleql.FieldID])
assert.Equal(t, email, user[consoleql.FieldEmail])
assert.Equal(t, rootUser.FirstName, user[consoleql.FieldFirstName])
assert.Equal(t, rootUser.LastName, user[consoleql.FieldLastName])
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
t.Run("Update account mutation firstName only", func(t *testing.T) {
firstName := "George"
query := fmt.Sprintf(
"mutation {updateAccount(input:{firstName:\"%s\"}){id,email,firstName,lastName,createdAt}}",
firstName,
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
user := data[consoleql.UpdateAccountMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, rootUser.ID.String(), user[consoleql.FieldID])
assert.Equal(t, rootUser.Email, user[consoleql.FieldEmail])
assert.Equal(t, firstName, user[consoleql.FieldFirstName])
assert.Equal(t, rootUser.LastName, user[consoleql.FieldLastName])
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
t.Run("Update account mutation lastName only", func(t *testing.T) {
lastName := "Yellow"
query := fmt.Sprintf(
"mutation {updateAccount(input:{lastName:\"%s\"}){id,email,firstName,lastName,createdAt}}",
lastName,
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
user := data[consoleql.UpdateAccountMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, rootUser.ID.String(), user[consoleql.FieldID])
assert.Equal(t, rootUser.Email, user[consoleql.FieldEmail])
assert.Equal(t, rootUser.FirstName, user[consoleql.FieldFirstName])
assert.Equal(t, lastName, user[consoleql.FieldLastName])
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
t.Run("Update account mutation all info", func(t *testing.T) {
email := "test@newmail.com"
firstName := "Fill"
lastName := "Goal"
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
query := fmt.Sprintf(
"mutation {updateAccount(input:{email:\"%s\",firstName:\"%s\",lastName:\"%s\"}){id,email,firstName,lastName,createdAt}}",
email,
firstName,
lastName,
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
user := data[consoleql.UpdateAccountMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, rootUser.ID.String(), user[consoleql.FieldID])
assert.Equal(t, email, user[consoleql.FieldEmail])
assert.Equal(t, firstName, user[consoleql.FieldFirstName])
assert.Equal(t, lastName, user[consoleql.FieldLastName])
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
createdAt := time.Time{}
err := createdAt.UnmarshalText([]byte(user[consoleql.FieldCreatedAt].(string)))
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.NoError(t, err)
assert.Equal(t, rootUser.CreatedAt, createdAt)
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
t.Run("Change password mutation", func(t *testing.T) {
newPassword := "145a145a"
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
query := fmt.Sprintf(
"mutation {changePassword(password:\"%s\",newPassword:\"%s\"){id,email,firstName,lastName,createdAt}}",
createUser.Password,
newPassword,
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
data := result.(map[string]interface{})
user := data[consoleql.ChangePasswordMutation].(map[string]interface{})
assert.Equal(t, rootUser.ID.String(), user[consoleql.FieldID])
assert.Equal(t, rootUser.Email, user[consoleql.FieldEmail])
assert.Equal(t, rootUser.FirstName, user[consoleql.FieldFirstName])
assert.Equal(t, rootUser.LastName, user[consoleql.FieldLastName])
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
createdAt := time.Time{}
err := createdAt.UnmarshalText([]byte(user[consoleql.FieldCreatedAt].(string)))
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.NoError(t, err)
assert.Equal(t, rootUser.CreatedAt, createdAt)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
oldHash := rootUser.PasswordHash
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
rootUser, err = service.GetUser(authCtx, rootUser.ID)
if err != nil {
t.Fatal(err)
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.False(t, bytes.Equal(oldHash, rootUser.PasswordHash))
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
createUser.Password = newPassword
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
token, err = service.Token(ctx, rootUser.Email, createUser.Password)
2019-01-08 14:54:35 +00:00
if err != nil {
t.Fatal(err)
}
2019-01-24 16:26:36 +00:00
sauth, err = service.Authorize(auth.WithAPIKey(ctx, []byte(token)))
if err != nil {
t.Fatal(err)
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
authCtx = console.WithAuth(ctx, sauth)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
var projectID string
t.Run("Create project mutation", func(t *testing.T) {
projectInfo := console.ProjectInfo{
Name: "Project name",
Description: "desc",
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
query := fmt.Sprintf(
"mutation {createProject(input:{name:\"%s\",description:\"%s\",isTermsAccepted:true}){name,description,id,createdAt}}",
projectInfo.Name,
projectInfo.Description,
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
project := data[consoleql.CreateProjectMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, projectInfo.Name, project[consoleql.FieldName])
assert.Equal(t, projectInfo.Description, project[consoleql.FieldDescription])
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
projectID = project[consoleql.FieldID].(string)
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
pID, err := uuid.Parse(projectID)
if err != nil {
t.Fatal(err)
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
project, err := service.GetProject(authCtx, *pID)
if err != nil {
t.Fatal(err, project)
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
t.Run("Update project description mutation", func(t *testing.T) {
query := fmt.Sprintf(
"mutation {updateProjectDescription(id:\"%s\",description:\"%s\"){id,name,description}}",
project.ID.String(),
"",
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
proj := data[consoleql.UpdateProjectDescriptionMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, project.ID.String(), proj[consoleql.FieldID])
assert.Equal(t, project.Name, proj[consoleql.FieldName])
assert.Equal(t, "", proj[consoleql.FieldDescription])
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
user1, err := service.CreateUser(authCtx, console.CreateUser{
UserInfo: console.UserInfo{
FirstName: "User1",
Email: "u1@email.net",
},
Password: "123a123",
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
if err != nil {
t.Fatal(err, project)
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
user2, err := service.CreateUser(authCtx, console.CreateUser{
UserInfo: console.UserInfo{
FirstName: "User1",
Email: "u2@email.net",
},
Password: "123a123",
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
if err != nil {
t.Fatal(err, project)
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
t.Run("Add project members mutation", func(t *testing.T) {
query := fmt.Sprintf(
"mutation {addProjectMembers(projectID:\"%s\",email:[\"%s\",\"%s\"]){id,name,members(limit:50,offset:0){joinedAt}}}",
project.ID.String(),
user1.Email,
user2.Email,
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
proj := data[consoleql.AddProjectMembersMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, project.ID.String(), proj[consoleql.FieldID])
assert.Equal(t, project.Name, proj[consoleql.FieldName])
assert.Equal(t, 3, len(proj[consoleql.FieldMembers].([]interface{})))
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
t.Run("Delete project members mutation", func(t *testing.T) {
query := fmt.Sprintf(
"mutation {deleteProjectMembers(projectID:\"%s\",email:[\"%s\",\"%s\"]){id,name,members(limit:50,offset:0){user{id}}}}",
project.ID.String(),
user1.Email,
user2.Email,
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
proj := data[consoleql.DeleteProjectMembersMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
members := proj[consoleql.FieldMembers].([]interface{})
rootMember := members[0].(map[string]interface{})[consoleql.UserType].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, project.ID.String(), proj[consoleql.FieldID])
assert.Equal(t, project.Name, proj[consoleql.FieldName])
assert.Equal(t, 1, len(members))
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, rootUser.ID.String(), rootMember[consoleql.FieldID])
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
var keyID string
t.Run("Create api key mutation", func(t *testing.T) {
keyName := "key1"
query := fmt.Sprintf(
"mutation {createAPIKey(projectID:\"%s\",name:\"%s\"){key,keyInfo{id,name,projectID}}}",
project.ID.String(),
keyName,
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
createAPIKey := data[consoleql.CreateAPIKeyMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
key := createAPIKey[consoleql.FieldKey].(string)
keyInfo := createAPIKey[consoleql.APIKeyInfoType].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.NotEqual(t, "", key)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, keyName, keyInfo[consoleql.FieldName])
assert.Equal(t, project.ID.String(), keyInfo[consoleql.FieldProjectID])
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
keyID = keyInfo[consoleql.FieldID].(string)
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
t.Run("Delete api key mutation", func(t *testing.T) {
id, err := uuid.Parse(keyID)
if err != nil {
t.Fatal(err)
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
info, err := service.GetAPIKeyInfo(authCtx, *id)
if err != nil {
t.Fatal(err)
}
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
query := fmt.Sprintf(
"mutation {deleteAPIKey(id:\"%s\"){name,projectID}}",
id.String(),
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
keyInfo := data[consoleql.DeleteAPIKeyMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, info.Name, keyInfo[consoleql.FieldName])
assert.Equal(t, project.ID.String(), keyInfo[consoleql.FieldProjectID])
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
t.Run("Delete project mutation", func(t *testing.T) {
query := fmt.Sprintf(
"mutation {deleteProject(id:\"%s\"){id,name}}",
projectID,
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
proj := data[consoleql.DeleteProjectMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, project.Name, proj[consoleql.FieldName])
assert.Equal(t, project.ID.String(), proj[consoleql.FieldID])
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
_, err := service.GetProject(authCtx, project.ID)
assert.Error(t, err)
})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
t.Run("Delete account mutation", func(t *testing.T) {
query := fmt.Sprintf(
"mutation {deleteAccount(password:\"%s\"){id}}",
createUser.Password,
)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
result := testQuery(t, query)
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
data := result.(map[string]interface{})
user := data[consoleql.DeleteAccountMutation].(map[string]interface{})
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
assert.Equal(t, rootUser.ID.String(), user[consoleql.FieldID])
2019-01-08 14:54:35 +00:00
2019-01-24 16:26:36 +00:00
_, err := service.GetUser(authCtx, rootUser.ID)
assert.Error(t, err)
})
2019-01-08 14:54:35 +00:00
})
}