2021-11-16 08:44:56 +00:00
package query
import (
"database/sql"
"database/sql/driver"
"errors"
"fmt"
"regexp"
"testing"
2022-08-31 07:52:43 +00:00
"github.com/zitadel/zitadel/internal/database"
2022-04-26 23:01:45 +00:00
"github.com/zitadel/zitadel/internal/domain"
2023-12-08 14:30:55 +00:00
"github.com/zitadel/zitadel/internal/zerrors"
2021-11-16 08:44:56 +00:00
)
2022-10-27 06:08:36 +00:00
var (
2023-11-20 15:21:08 +00:00
projectGrantsQuery = ` SELECT projections.project_grants4.project_id, ` +
` projections.project_grants4.grant_id, ` +
` projections.project_grants4.creation_date, ` +
` projections.project_grants4.change_date, ` +
` projections.project_grants4.resource_owner, ` +
` projections.project_grants4.state, ` +
` projections.project_grants4.sequence, ` +
` projections.projects4.name, ` +
` projections.project_grants4.granted_org_id, ` +
2022-10-27 06:08:36 +00:00
` o.name, ` +
2023-11-20 15:21:08 +00:00
` projections.project_grants4.granted_role_keys, ` +
2022-10-27 06:08:36 +00:00
` r.name, ` +
` COUNT(*) OVER () ` +
2023-11-20 15:21:08 +00:00
` FROM projections.project_grants4 ` +
` LEFT JOIN projections.projects4 ON projections.project_grants4.project_id = projections.projects4.id AND projections.project_grants4.instance_id = projections.projects4.instance_id ` +
` LEFT JOIN projections.orgs1 AS r ON projections.project_grants4.resource_owner = r.id AND projections.project_grants4.instance_id = r.instance_id ` +
` LEFT JOIN projections.orgs1 AS o ON projections.project_grants4.granted_org_id = o.id AND projections.project_grants4.instance_id = o.instance_id ` +
2023-02-27 21:36:43 +00:00
` AS OF SYSTEM TIME '-1 ms' `
2022-10-27 06:08:36 +00:00
projectGrantsCols = [ ] string {
"project_id" ,
"grant_id" ,
"creation_date" ,
"change_date" ,
"resource_owner" ,
"state" ,
"sequence" ,
"name" ,
"granted_org_id" ,
"name" ,
"granted_role_keys" ,
"name" ,
"count" ,
}
2023-11-20 15:21:08 +00:00
projectGrantQuery = ` SELECT projections.project_grants4.project_id, ` +
` projections.project_grants4.grant_id, ` +
` projections.project_grants4.creation_date, ` +
` projections.project_grants4.change_date, ` +
` projections.project_grants4.resource_owner, ` +
` projections.project_grants4.state, ` +
` projections.project_grants4.sequence, ` +
` projections.projects4.name, ` +
` projections.project_grants4.granted_org_id, ` +
2022-10-27 06:08:36 +00:00
` o.name, ` +
2023-11-20 15:21:08 +00:00
` projections.project_grants4.granted_role_keys, ` +
2022-10-27 06:08:36 +00:00
` r.name ` +
2023-11-20 15:21:08 +00:00
` FROM projections.project_grants4 ` +
` LEFT JOIN projections.projects4 ON projections.project_grants4.project_id = projections.projects4.id AND projections.project_grants4.instance_id = projections.projects4.instance_id ` +
` LEFT JOIN projections.orgs1 AS r ON projections.project_grants4.resource_owner = r.id AND projections.project_grants4.instance_id = r.instance_id ` +
` LEFT JOIN projections.orgs1 AS o ON projections.project_grants4.granted_org_id = o.id AND projections.project_grants4.instance_id = o.instance_id ` +
2023-02-27 21:36:43 +00:00
` AS OF SYSTEM TIME '-1 ms' `
2022-10-27 06:08:36 +00:00
projectGrantCols = [ ] string {
"project_id" ,
"grant_id" ,
"creation_date" ,
"change_date" ,
"resource_owner" ,
"state" ,
"sequence" ,
"name" ,
"granted_org_id" ,
"name" ,
"granted_role_keys" ,
"name" ,
}
)
2021-11-16 08:44:56 +00:00
func Test_ProjectGrantPrepares ( t * testing . T ) {
type want struct {
sqlExpectations sqlExpectation
err checkErr
}
tests := [ ] struct {
name string
prepare interface { }
want want
object interface { }
} {
{
name : "prepareProjectGrantsQuery no result" ,
prepare : prepareProjectGrantsQuery ,
want : want {
sqlExpectations : mockQueries (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantsQuery ) ,
2021-11-16 08:44:56 +00:00
nil ,
nil ,
) ,
} ,
object : & ProjectGrants { ProjectGrants : [ ] * ProjectGrant { } } ,
} ,
{
name : "prepareProjectGrantsQuery one result" ,
prepare : prepareProjectGrantsQuery ,
want : want {
sqlExpectations : mockQueries (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantsQuery ) ,
projectGrantsCols ,
2021-11-16 08:44:56 +00:00
[ ] [ ] driver . Value {
{
"project-id" ,
"grant-id" ,
testNow ,
testNow ,
"ro" ,
domain . ProjectGrantStateActive ,
20211111 ,
"project-name" ,
"org-id" ,
"org-name" ,
2023-10-19 10:19:10 +00:00
database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
"ro-name" ,
} ,
} ,
) ,
} ,
object : & ProjectGrants {
SearchResponse : SearchResponse {
Count : 1 ,
} ,
ProjectGrants : [ ] * ProjectGrant {
{
ProjectID : "project-id" ,
CreationDate : testNow ,
ChangeDate : testNow ,
ResourceOwner : "ro" ,
Sequence : 20211111 ,
GrantID : "grant-id" ,
State : domain . ProjectGrantStateActive ,
ProjectName : "project-name" ,
GrantedOrgID : "org-id" ,
OrgName : "org-name" ,
2023-10-19 10:19:10 +00:00
GrantedRoleKeys : database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
ResourceOwnerName : "ro-name" ,
} ,
} ,
} ,
} ,
{
name : "prepareProjectGrantsQuery no project" ,
prepare : prepareProjectGrantsQuery ,
want : want {
sqlExpectations : mockQueries (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantsQuery ) ,
projectGrantsCols ,
2021-11-16 08:44:56 +00:00
[ ] [ ] driver . Value {
{
"project-id" ,
"grant-id" ,
testNow ,
testNow ,
"ro" ,
domain . ProjectGrantStateActive ,
20211111 ,
nil ,
"org-id" ,
"org-name" ,
2023-10-19 10:19:10 +00:00
database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
"ro-name" ,
} ,
} ,
) ,
} ,
object : & ProjectGrants {
SearchResponse : SearchResponse {
Count : 1 ,
} ,
ProjectGrants : [ ] * ProjectGrant {
{
ProjectID : "project-id" ,
CreationDate : testNow ,
ChangeDate : testNow ,
ResourceOwner : "ro" ,
Sequence : 20211111 ,
GrantID : "grant-id" ,
State : domain . ProjectGrantStateActive ,
ProjectName : "" ,
GrantedOrgID : "org-id" ,
OrgName : "org-name" ,
2023-10-19 10:19:10 +00:00
GrantedRoleKeys : database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
ResourceOwnerName : "ro-name" ,
} ,
} ,
} ,
} ,
{
name : "prepareProjectGrantsQuery no org" ,
prepare : prepareProjectGrantsQuery ,
want : want {
sqlExpectations : mockQueries (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantsQuery ) ,
projectGrantsCols ,
2021-11-16 08:44:56 +00:00
[ ] [ ] driver . Value {
{
"project-id" ,
"grant-id" ,
testNow ,
testNow ,
"ro" ,
domain . ProjectGrantStateActive ,
20211111 ,
"project-name" ,
"org-id" ,
nil ,
2023-10-19 10:19:10 +00:00
database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
"ro-name" ,
} ,
} ,
) ,
} ,
object : & ProjectGrants {
SearchResponse : SearchResponse {
Count : 1 ,
} ,
ProjectGrants : [ ] * ProjectGrant {
{
ProjectID : "project-id" ,
CreationDate : testNow ,
ChangeDate : testNow ,
ResourceOwner : "ro" ,
Sequence : 20211111 ,
GrantID : "grant-id" ,
State : domain . ProjectGrantStateActive ,
ProjectName : "project-name" ,
GrantedOrgID : "org-id" ,
OrgName : "" ,
2023-10-19 10:19:10 +00:00
GrantedRoleKeys : database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
ResourceOwnerName : "ro-name" ,
} ,
} ,
} ,
} ,
{
name : "prepareProjectGrantsQuery no resource owner" ,
prepare : prepareProjectGrantsQuery ,
want : want {
sqlExpectations : mockQueries (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantsQuery ) ,
projectGrantsCols ,
2021-11-16 08:44:56 +00:00
[ ] [ ] driver . Value {
{
"project-id" ,
"grant-id" ,
testNow ,
testNow ,
"ro" ,
domain . ProjectGrantStateActive ,
20211111 ,
"project-name" ,
"org-id" ,
"org-name" ,
2023-10-19 10:19:10 +00:00
database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
nil ,
} ,
} ,
) ,
} ,
object : & ProjectGrants {
SearchResponse : SearchResponse {
Count : 1 ,
} ,
ProjectGrants : [ ] * ProjectGrant {
{
ProjectID : "project-id" ,
CreationDate : testNow ,
ChangeDate : testNow ,
ResourceOwner : "ro" ,
Sequence : 20211111 ,
GrantID : "grant-id" ,
State : domain . ProjectGrantStateActive ,
ProjectName : "project-name" ,
GrantedOrgID : "org-id" ,
OrgName : "org-name" ,
2023-10-19 10:19:10 +00:00
GrantedRoleKeys : database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
ResourceOwnerName : "" ,
} ,
} ,
} ,
} ,
{
name : "prepareProjectGrantsQuery multiple result" ,
prepare : prepareProjectGrantsQuery ,
want : want {
sqlExpectations : mockQueries (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantsQuery ) ,
projectGrantsCols ,
2021-11-16 08:44:56 +00:00
[ ] [ ] driver . Value {
{
"project-id" ,
"grant-id-1" ,
testNow ,
testNow ,
"ro" ,
domain . ProjectGrantStateActive ,
20211111 ,
"project-name" ,
"org-id" ,
"org-name" ,
2023-10-19 10:19:10 +00:00
database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
"ro-name" ,
} ,
{
"project-id" ,
"grant-id-2" ,
testNow ,
testNow ,
"ro" ,
domain . ProjectGrantStateActive ,
20211111 ,
"project-name" ,
"org-id" ,
"org-name" ,
2023-10-19 10:19:10 +00:00
database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
"ro-name" ,
} ,
} ,
) ,
} ,
object : & ProjectGrants {
SearchResponse : SearchResponse {
Count : 2 ,
} ,
ProjectGrants : [ ] * ProjectGrant {
{
ProjectID : "project-id" ,
CreationDate : testNow ,
ChangeDate : testNow ,
ResourceOwner : "ro" ,
Sequence : 20211111 ,
GrantID : "grant-id-1" ,
State : domain . ProjectGrantStateActive ,
ProjectName : "project-name" ,
GrantedOrgID : "org-id" ,
OrgName : "org-name" ,
2023-10-19 10:19:10 +00:00
GrantedRoleKeys : database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
ResourceOwnerName : "ro-name" ,
} ,
{
ProjectID : "project-id" ,
CreationDate : testNow ,
ChangeDate : testNow ,
ResourceOwner : "ro" ,
Sequence : 20211111 ,
GrantID : "grant-id-2" ,
State : domain . ProjectGrantStateActive ,
ProjectName : "project-name" ,
GrantedOrgID : "org-id" ,
OrgName : "org-name" ,
2023-10-19 10:19:10 +00:00
GrantedRoleKeys : database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
ResourceOwnerName : "ro-name" ,
} ,
} ,
} ,
} ,
{
name : "prepareProjectGrantsQuery sql err" ,
prepare : prepareProjectGrantsQuery ,
want : want {
sqlExpectations : mockQueryErr (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantsQuery ) ,
2021-11-16 08:44:56 +00:00
sql . ErrConnDone ,
) ,
err : func ( err error ) ( error , bool ) {
if ! errors . Is ( err , sql . ErrConnDone ) {
return fmt . Errorf ( "err should be sql.ErrConnDone got: %w" , err ) , false
}
return nil , true
} ,
} ,
2023-08-22 10:49:22 +00:00
object : ( * ProjectGrants ) ( nil ) ,
2021-11-16 08:44:56 +00:00
} ,
{
name : "prepareProjectGrantQuery no result" ,
prepare : prepareProjectGrantQuery ,
want : want {
2023-08-22 10:49:22 +00:00
sqlExpectations : mockQueriesScanErr (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantQuery ) ,
2021-11-16 08:44:56 +00:00
nil ,
nil ,
) ,
err : func ( err error ) ( error , bool ) {
2023-12-08 14:30:55 +00:00
if ! zerrors . IsNotFound ( err ) {
2021-11-16 08:44:56 +00:00
return fmt . Errorf ( "err should be zitadel.NotFoundError got: %w" , err ) , false
}
return nil , true
} ,
} ,
object : ( * ProjectGrant ) ( nil ) ,
} ,
{
name : "prepareProjectGrantQuery found" ,
prepare : prepareProjectGrantQuery ,
want : want {
sqlExpectations : mockQuery (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantQuery ) ,
projectGrantCols ,
2021-11-16 08:44:56 +00:00
[ ] driver . Value {
"project-id" ,
"grant-id" ,
testNow ,
testNow ,
"ro" ,
domain . ProjectGrantStateActive ,
20211111 ,
"project-name" ,
"org-id" ,
"org-name" ,
2023-10-19 10:19:10 +00:00
database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
"ro-name" ,
} ,
) ,
} ,
object : & ProjectGrant {
ProjectID : "project-id" ,
CreationDate : testNow ,
ChangeDate : testNow ,
ResourceOwner : "ro" ,
Sequence : 20211111 ,
GrantID : "grant-id" ,
State : domain . ProjectGrantStateActive ,
ProjectName : "project-name" ,
GrantedOrgID : "org-id" ,
OrgName : "org-name" ,
2023-10-19 10:19:10 +00:00
GrantedRoleKeys : database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
ResourceOwnerName : "ro-name" ,
} ,
} ,
{
name : "prepareProjectGrantQuery no org" ,
prepare : prepareProjectGrantQuery ,
want : want {
sqlExpectations : mockQuery (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantQuery ) ,
projectGrantCols ,
2021-11-16 08:44:56 +00:00
[ ] driver . Value {
"project-id" ,
"grant-id" ,
testNow ,
testNow ,
"ro" ,
domain . ProjectGrantStateActive ,
20211111 ,
"project-name" ,
"org-id" ,
nil ,
2023-10-19 10:19:10 +00:00
database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
"ro-name" ,
} ,
) ,
} ,
object : & ProjectGrant {
ProjectID : "project-id" ,
CreationDate : testNow ,
ChangeDate : testNow ,
ResourceOwner : "ro" ,
Sequence : 20211111 ,
GrantID : "grant-id" ,
State : domain . ProjectGrantStateActive ,
ProjectName : "project-name" ,
GrantedOrgID : "org-id" ,
OrgName : "" ,
2023-10-19 10:19:10 +00:00
GrantedRoleKeys : database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
ResourceOwnerName : "ro-name" ,
} ,
} ,
{
name : "prepareProjectGrantQuery no resource owner" ,
prepare : prepareProjectGrantQuery ,
want : want {
sqlExpectations : mockQuery (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantQuery ) ,
projectGrantCols ,
2021-11-16 08:44:56 +00:00
[ ] driver . Value {
"project-id" ,
"grant-id" ,
testNow ,
testNow ,
"ro" ,
domain . ProjectGrantStateActive ,
20211111 ,
"project-name" ,
"org-id" ,
"org-name" ,
2023-10-19 10:19:10 +00:00
database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
nil ,
} ,
) ,
} ,
object : & ProjectGrant {
ProjectID : "project-id" ,
CreationDate : testNow ,
ChangeDate : testNow ,
ResourceOwner : "ro" ,
Sequence : 20211111 ,
GrantID : "grant-id" ,
State : domain . ProjectGrantStateActive ,
ProjectName : "project-name" ,
GrantedOrgID : "org-id" ,
OrgName : "org-name" ,
2023-10-19 10:19:10 +00:00
GrantedRoleKeys : database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
ResourceOwnerName : "" ,
} ,
} ,
{
name : "prepareProjectGrantQuery no project" ,
prepare : prepareProjectGrantQuery ,
want : want {
sqlExpectations : mockQuery (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantQuery ) ,
projectGrantCols ,
2021-11-16 08:44:56 +00:00
[ ] driver . Value {
"project-id" ,
"grant-id" ,
testNow ,
testNow ,
"ro" ,
domain . ProjectGrantStateActive ,
20211111 ,
nil ,
"org-id" ,
"org-name" ,
2023-10-19 10:19:10 +00:00
database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
"ro-name" ,
} ,
) ,
} ,
object : & ProjectGrant {
ProjectID : "project-id" ,
CreationDate : testNow ,
ChangeDate : testNow ,
ResourceOwner : "ro" ,
Sequence : 20211111 ,
GrantID : "grant-id" ,
State : domain . ProjectGrantStateActive ,
ProjectName : "" ,
GrantedOrgID : "org-id" ,
OrgName : "org-name" ,
2023-10-19 10:19:10 +00:00
GrantedRoleKeys : database . TextArray [ string ] { "role-key" } ,
2021-11-16 08:44:56 +00:00
ResourceOwnerName : "ro-name" ,
} ,
} ,
{
name : "prepareProjectGrantQuery sql err" ,
prepare : prepareProjectGrantQuery ,
want : want {
sqlExpectations : mockQueryErr (
2022-10-27 06:08:36 +00:00
regexp . QuoteMeta ( projectGrantQuery ) ,
2021-11-16 08:44:56 +00:00
sql . ErrConnDone ,
) ,
err : func ( err error ) ( error , bool ) {
if ! errors . Is ( err , sql . ErrConnDone ) {
return fmt . Errorf ( "err should be sql.ErrConnDone got: %w" , err ) , false
}
return nil , true
} ,
} ,
2023-08-22 10:49:22 +00:00
object : ( * ProjectGrant ) ( nil ) ,
2021-11-16 08:44:56 +00:00
} ,
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
2023-02-27 21:36:43 +00:00
assertPrepare ( t , tt . prepare , tt . object , tt . want . sqlExpectations , tt . want . err , defaultPrepareArgs ... )
2021-11-16 08:44:56 +00:00
} )
}
}