2017-02-08 21:20:07 +08:00
package api
import (
2021-12-01 22:43:31 +08:00
"context"
2020-01-14 00:10:19 +08:00
"fmt"
2019-09-11 20:43:05 +08:00
"net/http"
2017-02-08 21:20:07 +08:00
"testing"
2019-09-11 20:43:05 +08:00
"time"
2017-02-08 21:20:07 +08:00
2021-10-07 22:06:16 +08:00
"github.com/grafana/grafana/pkg/services/searchusers/filters"
2022-01-05 16:59:17 +08:00
"github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/setting"
2021-10-07 22:06:16 +08:00
2021-09-29 18:51:49 +08:00
"github.com/grafana/grafana/pkg/services/searchusers"
2020-01-14 00:10:19 +08:00
"github.com/grafana/grafana/pkg/api/dtos"
2017-02-08 21:20:07 +08:00
"github.com/grafana/grafana/pkg/bus"
"github.com/grafana/grafana/pkg/components/simplejson"
2019-09-11 20:43:05 +08:00
"github.com/grafana/grafana/pkg/models"
2020-11-13 16:52:38 +08:00
"github.com/stretchr/testify/assert"
2019-09-11 20:43:05 +08:00
"github.com/stretchr/testify/require"
2017-02-08 21:20:07 +08:00
)
2020-11-13 16:52:38 +08:00
func TestUserAPIEndpoint_userLoggedIn ( t * testing . T ) {
2022-01-05 16:59:17 +08:00
settings := setting . NewCfg ( )
hs := & HTTPServer { Cfg : settings }
sqlStore := sqlstore . InitTestDB ( t )
hs . SQLStore = sqlStore
2020-11-13 16:52:38 +08:00
mockResult := models . SearchUserQueryResult {
Users : [ ] * models . UserSearchHitDTO {
{ Name : "user1" } ,
{ Name : "user2" } ,
} ,
TotalCount : 2 ,
}
2022-01-15 00:55:57 +08:00
loggedInUserScenario ( t , "When calling GET on" , "api/users/1" , "api/users/:id" , func ( sc * scenarioContext ) {
2020-11-13 16:52:38 +08:00
fakeNow := time . Date ( 2019 , 2 , 11 , 17 , 30 , 40 , 0 , time . UTC )
2021-12-28 23:08:07 +08:00
bus . AddHandler ( "test" , func ( ctx context . Context , query * models . GetUserProfileQuery ) error {
2020-11-13 16:52:38 +08:00
query . Result = models . UserProfileDTO {
Id : int64 ( 1 ) ,
Email : "daniel@grafana.com" ,
Name : "Daniel" ,
Login : "danlee" ,
OrgId : int64 ( 2 ) ,
IsGrafanaAdmin : true ,
IsDisabled : false ,
IsExternal : false ,
UpdatedAt : fakeNow ,
CreatedAt : fakeNow ,
}
return nil
} )
2021-12-28 23:08:07 +08:00
bus . AddHandler ( "test" , func ( ctx context . Context , query * models . GetAuthInfoQuery ) error {
2020-11-13 16:52:38 +08:00
query . Result = & models . UserAuth {
AuthModule : models . AuthModuleLDAP ,
}
return nil
} )
2022-01-05 16:59:17 +08:00
sc . handlerFunc = hs . GetUserByID
2020-11-13 16:52:38 +08:00
avatarUrl := dtos . GetGravatarUrl ( "daniel@grafana.com" )
2022-01-15 00:55:57 +08:00
sc . fakeReqWithParams ( "GET" , sc . url , map [ string ] string { "id" : "1" } ) . exec ( )
2020-11-13 16:52:38 +08:00
expected := fmt . Sprintf ( `
2019-09-11 20:43:05 +08:00
{
"id" : 1 ,
"email" : "daniel@grafana.com" ,
"name" : "Daniel" ,
"login" : "danlee" ,
"theme" : "" ,
"orgId" : 2 ,
"isGrafanaAdmin" : true ,
"isDisabled" : false ,
"isExternal" : true ,
"authLabels" : [
"LDAP"
] ,
2020-01-14 00:10:19 +08:00
"avatarUrl" : "%s" ,
2019-09-28 19:12:33 +08:00
"updatedAt" : "2019-02-11T17:30:40Z" ,
"createdAt" : "2019-02-11T17:30:40Z"
2019-09-11 20:43:05 +08:00
}
2020-01-14 00:10:19 +08:00
` , avatarUrl )
2019-09-11 20:43:05 +08:00
2020-11-13 16:52:38 +08:00
require . Equal ( t , http . StatusOK , sc . resp . Code )
require . JSONEq ( t , expected , sc . resp . Body . String ( ) )
} )
2022-01-15 00:55:57 +08:00
loggedInUserScenario ( t , "When calling GET on" , "/api/users/lookup" , "/api/users/lookup" , func ( sc * scenarioContext ) {
2020-11-13 16:52:38 +08:00
fakeNow := time . Date ( 2019 , 2 , 11 , 17 , 30 , 40 , 0 , time . UTC )
2021-12-28 23:08:07 +08:00
bus . AddHandler ( "test" , func ( ctx context . Context , query * models . GetUserByLoginQuery ) error {
2020-11-13 16:52:38 +08:00
require . Equal ( t , "danlee" , query . LoginOrEmail )
query . Result = & models . User {
Id : int64 ( 1 ) ,
Email : "daniel@grafana.com" ,
Name : "Daniel" ,
Login : "danlee" ,
Theme : "light" ,
IsAdmin : true ,
OrgId : int64 ( 2 ) ,
IsDisabled : false ,
Updated : fakeNow ,
Created : fakeNow ,
}
return nil
2019-09-11 20:43:05 +08:00
} )
2020-11-13 16:52:38 +08:00
sc . handlerFunc = GetUserByLoginOrEmail
sc . fakeReqWithParams ( "GET" , sc . url , map [ string ] string { "loginOrEmail" : "danlee" } ) . exec ( )
expected := `
2019-10-01 03:54:09 +08:00
{
"id" : 1 ,
"email" : "daniel@grafana.com" ,
"name" : "Daniel" ,
"login" : "danlee" ,
"theme" : "light" ,
"orgId" : 2 ,
"isGrafanaAdmin" : true ,
"isDisabled" : false ,
"authLabels" : null ,
"isExternal" : false ,
2020-01-14 00:10:19 +08:00
"avatarUrl" : "" ,
2019-10-01 03:54:09 +08:00
"updatedAt" : "2019-02-11T17:30:40Z" ,
"createdAt" : "2019-02-11T17:30:40Z"
}
`
2020-11-13 16:52:38 +08:00
require . Equal ( t , http . StatusOK , sc . resp . Code )
require . JSONEq ( t , expected , sc . resp . Body . String ( ) )
} )
2022-01-15 00:55:57 +08:00
loggedInUserScenario ( t , "When calling GET on" , "/api/users" , "/api/users" , func ( sc * scenarioContext ) {
2020-11-13 16:52:38 +08:00
var sentLimit int
var sendPage int
2021-12-28 23:08:07 +08:00
bus . AddHandler ( "test" , func ( ctx context . Context , query * models . SearchUsersQuery ) error {
2020-11-13 16:52:38 +08:00
query . Result = mockResult
sentLimit = query . Limit
sendPage = query . Page
return nil
2019-10-01 03:54:09 +08:00
} )
2021-10-07 22:06:16 +08:00
searchUsersService := searchusers . ProvideUsersService ( bus . GetBus ( ) , filters . ProvideOSSSearchUserFilter ( ) )
2021-09-29 18:51:49 +08:00
sc . handlerFunc = searchUsersService . SearchUsers
2020-11-13 16:52:38 +08:00
sc . fakeReqWithParams ( "GET" , sc . url , map [ string ] string { } ) . exec ( )
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
assert . Equal ( t , 1000 , sentLimit )
assert . Equal ( t , 1 , sendPage )
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
respJSON , err := simplejson . NewJson ( sc . resp . Body . Bytes ( ) )
require . NoError ( t , err )
assert . Equal ( t , 2 , len ( respJSON . MustArray ( ) ) )
} )
2017-02-08 21:20:07 +08:00
2022-01-15 00:55:57 +08:00
loggedInUserScenario ( t , "When calling GET with page and limit querystring parameters on" , "/api/users" , "/api/users" , func ( sc * scenarioContext ) {
2020-11-13 16:52:38 +08:00
var sentLimit int
var sendPage int
2021-12-28 23:08:07 +08:00
bus . AddHandler ( "test" , func ( ctx context . Context , query * models . SearchUsersQuery ) error {
2020-11-13 16:52:38 +08:00
query . Result = mockResult
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
sentLimit = query . Limit
sendPage = query . Page
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
return nil
2017-02-08 21:20:07 +08:00
} )
2021-10-07 22:06:16 +08:00
searchUsersService := searchusers . ProvideUsersService ( bus . GetBus ( ) , filters . ProvideOSSSearchUserFilter ( ) )
2021-09-29 18:51:49 +08:00
sc . handlerFunc = searchUsersService . SearchUsers
2020-11-13 16:52:38 +08:00
sc . fakeReqWithParams ( "GET" , sc . url , map [ string ] string { "perpage" : "10" , "page" : "2" } ) . exec ( )
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
assert . Equal ( t , 10 , sentLimit )
assert . Equal ( t , 2 , sendPage )
} )
2017-02-08 21:20:07 +08:00
2022-01-15 00:55:57 +08:00
loggedInUserScenario ( t , "When calling GET on" , "/api/users/search" , "/api/users/search" , func ( sc * scenarioContext ) {
2020-11-13 16:52:38 +08:00
var sentLimit int
var sendPage int
2021-12-28 23:08:07 +08:00
bus . AddHandler ( "test" , func ( ctx context . Context , query * models . SearchUsersQuery ) error {
2020-11-13 16:52:38 +08:00
query . Result = mockResult
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
sentLimit = query . Limit
sendPage = query . Page
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
return nil
2017-02-08 21:20:07 +08:00
} )
2021-10-07 22:06:16 +08:00
searchUsersService := searchusers . ProvideUsersService ( bus . GetBus ( ) , filters . ProvideOSSSearchUserFilter ( ) )
2021-09-29 18:51:49 +08:00
sc . handlerFunc = searchUsersService . SearchUsersWithPaging
2020-11-13 16:52:38 +08:00
sc . fakeReqWithParams ( "GET" , sc . url , map [ string ] string { } ) . exec ( )
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
assert . Equal ( t , 1000 , sentLimit )
assert . Equal ( t , 1 , sendPage )
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
respJSON , err := simplejson . NewJson ( sc . resp . Body . Bytes ( ) )
require . NoError ( t , err )
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
assert . Equal ( t , 2 , respJSON . Get ( "totalCount" ) . MustInt ( ) )
assert . Equal ( t , 2 , len ( respJSON . Get ( "users" ) . MustArray ( ) ) )
} )
2017-02-08 21:20:07 +08:00
2022-01-15 00:55:57 +08:00
loggedInUserScenario ( t , "When calling GET with page and perpage querystring parameters on" , "/api/users/search" , "/api/users/search" , func ( sc * scenarioContext ) {
2020-11-13 16:52:38 +08:00
var sentLimit int
var sendPage int
2021-12-28 23:08:07 +08:00
bus . AddHandler ( "test" , func ( ctx context . Context , query * models . SearchUsersQuery ) error {
2020-11-13 16:52:38 +08:00
query . Result = mockResult
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
sentLimit = query . Limit
sendPage = query . Page
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
return nil
2017-02-08 21:20:07 +08:00
} )
2021-10-07 22:06:16 +08:00
searchUsersService := searchusers . ProvideUsersService ( bus . GetBus ( ) , filters . ProvideOSSSearchUserFilter ( ) )
2021-09-29 18:51:49 +08:00
sc . handlerFunc = searchUsersService . SearchUsersWithPaging
2020-11-13 16:52:38 +08:00
sc . fakeReqWithParams ( "GET" , sc . url , map [ string ] string { "perpage" : "10" , "page" : "2" } ) . exec ( )
2017-02-08 21:20:07 +08:00
2020-11-13 16:52:38 +08:00
assert . Equal ( t , 10 , sentLimit )
assert . Equal ( t , 2 , sendPage )
2017-02-08 21:20:07 +08:00
} )
}