fixup! fixup! fixup! feat(db): Adding identity_providers table for relational database

This commit is contained in:
Iraq Jaber
2025-07-21 13:24:35 +01:00
parent 4638118e29
commit 95f18433ef
4 changed files with 798 additions and 19 deletions

View File

@@ -105,6 +105,6 @@ type IDProviderRepository interface {
List(ctx context.Context, conditions ...database.Condition) ([]*IdentityProvider, error) List(ctx context.Context, conditions ...database.Condition) ([]*IdentityProvider, error)
Create(ctx context.Context, idp *IdentityProvider) error Create(ctx context.Context, idp *IdentityProvider) error
Update(ctx context.Context, id IDPIdentifierCondition, changes ...database.Change) (int64, error) Update(ctx context.Context, id IDPIdentifierCondition, instnaceID string, orgID string, changes ...database.Change) (int64, error)
Delete(ctx context.Context, id IDPIdentifierCondition) (int64, error) Delete(ctx context.Context, id IDPIdentifierCondition) (int64, error)
} }

View File

@@ -61,8 +61,19 @@ const createIDProviderStmt = `INSERT INTO zitadel.identity_providers` +
func (i *idProvider) Create(ctx context.Context, idp *domain.IdentityProvider) error { func (i *idProvider) Create(ctx context.Context, idp *domain.IdentityProvider) error {
builder := database.StatementBuilder{} builder := database.StatementBuilder{}
builder.AppendArgs(idp.InstanceID, idp.OrgID, idp.ID, idp.State, idp.Name, idp.Type, idp.AllowCreation, builder.AppendArgs(
idp.AllowAutoCreation, idp.AllowAutoUpdate, idp.AllowLinking, idp.StylingType, idp.Payload) idp.InstanceID,
idp.OrgID,
idp.ID,
idp.State,
idp.Name,
idp.Type,
idp.AllowCreation,
idp.AllowAutoCreation,
idp.AllowAutoUpdate,
idp.AllowLinking,
idp.StylingType,
idp.Payload)
builder.WriteString(createIDProviderStmt) builder.WriteString(createIDProviderStmt)
err := i.client.QueryRow(ctx, builder.String(), builder.Args()...).Scan(&idp.CreatedAt, &idp.UpdatedAt) err := i.client.QueryRow(ctx, builder.String(), builder.Args()...).Scan(&idp.CreatedAt, &idp.UpdatedAt)
@@ -72,22 +83,24 @@ func (i *idProvider) Create(ctx context.Context, idp *domain.IdentityProvider) e
return nil return nil
} }
func (i *idProvider) Update(ctx context.Context, id domain.IDPIdentifierCondition, changes ...database.Change) (int64, error) { func (i *idProvider) Update(ctx context.Context, id domain.IDPIdentifierCondition, instnaceID string, orgID string, changes ...database.Change) (int64, error) {
if changes == nil { if changes == nil {
return 0, errors.New("Update must contain a condition") // (otherwise ALL identity_providers will be updated) return 0, errors.New("Update must contain at least one change")
} }
builder := database.StatementBuilder{} builder := database.StatementBuilder{}
builder.WriteString(`UPDATE zitadel.identity_provider SET `) builder.WriteString(`UPDATE zitadel.identity_providers SET `)
// conditions := []database.Condition{i.IDCondition(id)} conditions := []database.Condition{
conditions := []database.Condition{id} id,
i.InstanceIDCondition(instnaceID),
i.OrgIDCondition(orgID),
}
database.Changes(changes).Write(&builder) database.Changes(changes).Write(&builder)
writeCondition(&builder, database.And(conditions...)) writeCondition(&builder, database.And(conditions...))
stmt := builder.String() stmt := builder.String()
rowsAffected, err := i.client.Exec(ctx, stmt, builder.Args()...) return i.client.Exec(ctx, stmt, builder.Args()...)
return rowsAffected, err
} }
func (i *idProvider) Delete(ctx context.Context, id domain.IDPIdentifierCondition) (int64, error) { func (i *idProvider) Delete(ctx context.Context, id domain.IDPIdentifierCondition) (int64, error) {
@@ -230,7 +243,7 @@ func (i idProvider) SetAllowCreation(allow bool) database.Change {
} }
func (i idProvider) SetAllowAutoCreation(allow bool) database.Change { func (i idProvider) SetAllowAutoCreation(allow bool) database.Change {
return database.NewChange(i.AllowAutoUpdateColumn(), allow) return database.NewChange(i.AllowAutoCreationColumn(), allow)
} }
func (i idProvider) SetAllowAutoUpdate(allow bool) database.Change { func (i idProvider) SetAllowAutoUpdate(allow bool) database.Change {
@@ -246,7 +259,7 @@ func (i idProvider) SetStylingType(stylingType int16) database.Change {
} }
func (i idProvider) SetPayload(payload string) database.Change { func (i idProvider) SetPayload(payload string) database.Change {
return database.NewChange(i.StylingTypeColumn(), payload) return database.NewChange(i.PayloadColumn(), payload)
} }
func scanIDProvider(ctx context.Context, querier database.Querier, builder *database.StatementBuilder) (*domain.IdentityProvider, error) { func scanIDProvider(ctx context.Context, querier database.Querier, builder *database.StatementBuilder) (*domain.IdentityProvider, error) {

View File

@@ -334,12 +334,783 @@ func TestCreateIDProvider(t *testing.T) {
) )
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, tt.idp.InstanceID, idp.InstanceID)
assert.Equal(t, tt.idp.OrgID, idp.OrgID)
assert.Equal(t, tt.idp.State, idp.State)
assert.Equal(t, tt.idp.ID, idp.ID) assert.Equal(t, tt.idp.ID, idp.ID)
assert.Equal(t, tt.idp.Name, idp.Name) assert.Equal(t, tt.idp.Name, idp.Name)
assert.Equal(t, tt.idp.InstanceID, idp.InstanceID) assert.Equal(t, tt.idp.Type, idp.Type)
assert.Equal(t, tt.idp.State, idp.State) assert.Equal(t, tt.idp.AllowCreation, idp.AllowCreation)
assert.Equal(t, tt.idp.AllowAutoCreation, idp.AllowAutoCreation)
assert.Equal(t, tt.idp.AllowAutoUpdate, idp.AllowAutoUpdate)
assert.Equal(t, tt.idp.AllowLinking, idp.AllowLinking)
assert.Equal(t, tt.idp.StylingType, idp.StylingType)
assert.Equal(t, tt.idp.Payload, idp.Payload)
assert.WithinRange(t, idp.CreatedAt, beforeCreate, afterCreate) assert.WithinRange(t, idp.CreatedAt, beforeCreate, afterCreate)
assert.WithinRange(t, idp.UpdatedAt, beforeCreate, afterCreate) assert.WithinRange(t, idp.UpdatedAt, beforeCreate, afterCreate)
}) })
} }
} }
func TestUpdateIDProvider(t *testing.T) {
// create instance
instanceId := gofakeit.Name()
instance := domain.Instance{
ID: instanceId,
Name: gofakeit.Name(),
DefaultOrgID: "defaultOrgId",
IAMProjectID: "iamProject",
ConsoleClientID: "consoleCLient",
ConsoleAppID: "consoleApp",
DefaultLanguage: "defaultLanguage",
}
instanceRepo := repository.InstanceRepository(pool)
err := instanceRepo.Create(t.Context(), &instance)
require.NoError(t, err)
// create org
orgId := gofakeit.Name()
org := domain.Organization{
ID: orgId,
Name: gofakeit.Name(),
InstanceID: instanceId,
State: domain.OrgStateActive.String(),
}
organizationRepo := repository.OrganizationRepository(pool)
err = organizationRepo.Create(t.Context(), &org)
require.NoError(t, err)
idpRepo := repository.IDProviderRepository(pool)
tests := []struct {
name string
testFunc func(ctx context.Context, t *testing.T) *domain.IdentityProvider
update []database.Change
rowsAffected int64
}{
{
name: "happy path update name",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: gofakeit.Name(),
State: domain.IDPStateActive.String(),
Name: gofakeit.Name(),
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
idp.Name = "new_name"
return &idp
},
update: []database.Change{idpRepo.SetName("new_name")},
rowsAffected: 1,
},
{
name: "happy path update state",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: gofakeit.Name(),
State: domain.IDPStateActive.String(),
Name: gofakeit.Name(),
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
idp.State = domain.IDPStateInactive.String()
return &idp
},
update: []database.Change{idpRepo.SetState(domain.IDPStateInactive)},
rowsAffected: 1,
},
{
name: "happy path update AllowCreation",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: gofakeit.Name(),
State: domain.IDPStateActive.String(),
Name: gofakeit.Name(),
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
idp.AllowCreation = false
return &idp
},
update: []database.Change{idpRepo.SetAllowCreation(false)},
rowsAffected: 1,
},
{
name: "happy path update AllowAutoCreation",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: gofakeit.Name(),
State: domain.IDPStateActive.String(),
Name: gofakeit.Name(),
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
idp.AllowAutoCreation = false
return &idp
},
update: []database.Change{idpRepo.SetAllowAutoCreation(false)},
rowsAffected: 1,
},
{
name: "happy path update AllowLinking",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: gofakeit.Name(),
State: domain.IDPStateActive.String(),
Name: gofakeit.Name(),
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
idp.AllowLinking = false
return &idp
},
update: []database.Change{idpRepo.SetAllowLinking(false)},
rowsAffected: 1,
},
{
name: "happy path update StylingType",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: gofakeit.Name(),
State: domain.IDPStateActive.String(),
Name: gofakeit.Name(),
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
idp.StylingType = 2
return &idp
},
update: []database.Change{idpRepo.SetStylingType(2)},
rowsAffected: 1,
},
{
name: "happy path update Payload",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: gofakeit.Name(),
State: domain.IDPStateActive.String(),
Name: gofakeit.Name(),
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
idp.Payload = `{"json": {}}`
return &idp
},
// update: []database.Change{idpRepo.SetPayload("{{}}")},
update: []database.Change{idpRepo.SetPayload(`{"json": {}}`)},
rowsAffected: 1,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := t.Context()
organizationRepo := repository.OrganizationRepository(pool)
idpRepo := repository.IDProviderRepository(pool)
createdIDP := tt.testFunc(ctx, t)
// update org
beforeUpdate := time.Now()
rowsAffected, err := idpRepo.Update(ctx,
idpRepo.IDCondition(createdIDP.ID),
createdIDP.InstanceID,
createdIDP.OrgID,
tt.update...,
)
afterUpdate := time.Now()
require.NoError(t, err)
assert.Equal(t, tt.rowsAffected, rowsAffected)
if rowsAffected == 0 {
return
}
// check organization values
idp, err := idpRepo.Get(ctx,
organizationRepo.IDCondition(createdIDP.ID),
createdIDP.InstanceID,
createdIDP.OrgID,
)
require.NoError(t, err)
assert.Equal(t, createdIDP.InstanceID, idp.InstanceID)
assert.Equal(t, createdIDP.OrgID, idp.OrgID)
assert.Equal(t, createdIDP.State, idp.State)
assert.Equal(t, createdIDP.ID, idp.ID)
assert.Equal(t, createdIDP.Name, idp.Name)
assert.Equal(t, createdIDP.Type, idp.Type)
assert.Equal(t, createdIDP.AllowCreation, idp.AllowCreation)
assert.Equal(t, createdIDP.AllowAutoCreation, idp.AllowAutoCreation)
assert.Equal(t, createdIDP.AllowAutoUpdate, idp.AllowAutoUpdate)
assert.Equal(t, createdIDP.AllowLinking, idp.AllowLinking)
assert.Equal(t, createdIDP.StylingType, idp.StylingType)
assert.Equal(t, createdIDP.Payload, idp.Payload)
assert.WithinRange(t, idp.UpdatedAt, beforeUpdate, afterUpdate)
})
}
}
func TestGetIDProvider(t *testing.T) {
// create instance
instanceId := gofakeit.Name()
instance := domain.Instance{
ID: instanceId,
Name: gofakeit.Name(),
DefaultOrgID: "defaultOrgId",
IAMProjectID: "iamProject",
ConsoleClientID: "consoleCLient",
ConsoleAppID: "consoleApp",
DefaultLanguage: "defaultLanguage",
}
instanceRepo := repository.InstanceRepository(pool)
err := instanceRepo.Create(t.Context(), &instance)
require.NoError(t, err)
// create org
orgId := gofakeit.Name()
org := domain.Organization{
ID: orgId,
Name: gofakeit.Name(),
InstanceID: instanceId,
State: domain.OrgStateActive.String(),
}
organizationRepo := repository.OrganizationRepository(pool)
err = organizationRepo.Create(t.Context(), &org)
require.NoError(t, err)
// create organization
// this org is created as an additional org which should NOT
// be returned in the results of the tests
preexistingOrg := domain.Organization{
ID: gofakeit.Name(),
Name: gofakeit.Name(),
InstanceID: instanceId,
State: domain.OrgStateActive.String(),
}
err = organizationRepo.Create(t.Context(), &preexistingOrg)
require.NoError(t, err)
idpRepo := repository.IDProviderRepository(pool)
type test struct {
name string
testFunc func(ctx context.Context, t *testing.T) *domain.IdentityProvider
idpIdentifierCondition domain.OrgIdentifierCondition
err error
}
tests := []test{
func() test {
id := gofakeit.Name()
return test{
name: "happy path get using id",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: id,
State: domain.IDPStateActive.String(),
Name: gofakeit.Name(),
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
return &idp
},
idpIdentifierCondition: idpRepo.IDCondition(id),
}
}(),
func() test {
name := gofakeit.Name()
return test{
name: "happy path get using name",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: gofakeit.Name(),
State: domain.IDPStateActive.String(),
Name: name,
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
return &idp
},
idpIdentifierCondition: idpRepo.NameCondition(name),
}
}(),
{
name: "get using non existent id",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: gofakeit.Name(),
State: domain.IDPStateActive.String(),
Name: gofakeit.Name(),
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
return &idp
},
idpIdentifierCondition: idpRepo.IDCondition("non-existent-id"),
err: new(database.NoRowFoundError),
},
{
name: "get using non existent name",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: gofakeit.Name(),
State: domain.IDPStateActive.String(),
Name: gofakeit.Name(),
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
return &idp
},
idpIdentifierCondition: idpRepo.NameCondition("non-existent-name"),
err: new(database.NoRowFoundError),
},
////////
func() test {
id := gofakeit.Name()
return test{
name: "non existent orgID",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: id,
State: domain.IDPStateActive.String(),
Name: gofakeit.Name(),
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
idp.OrgID = "non-existent-orgID"
return &idp
},
idpIdentifierCondition: idpRepo.IDCondition(id),
err: new(database.NoRowFoundError),
}
}(),
func() test {
name := gofakeit.Name()
return test{
name: "non existent instanceID",
testFunc: func(ctx context.Context, t *testing.T) *domain.IdentityProvider {
idp := domain.IdentityProvider{
InstanceID: instanceId,
OrgID: orgId,
ID: gofakeit.Name(),
State: domain.IDPStateActive.String(),
Name: name,
Type: domain.IDPTypeOIDC.String(),
AllowCreation: true,
AllowAutoCreation: true,
AllowAutoUpdate: true,
AllowLinking: true,
StylingType: 1,
Payload: "{}",
}
err := idpRepo.Create(ctx, &idp)
require.NoError(t, err)
idp.InstanceID = "non-existent-instnaceID"
return &idp
},
idpIdentifierCondition: idpRepo.NameCondition(name),
err: new(database.NoRowFoundError),
}
}(),
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := t.Context()
var idp *domain.IdentityProvider
if tt.testFunc != nil {
idp = tt.testFunc(ctx, t)
}
// get idp
returnedIDP, err := idpRepo.Get(ctx,
tt.idpIdentifierCondition,
idp.InstanceID,
idp.OrgID,
)
if err != nil {
require.ErrorIs(t, tt.err, err)
return
}
assert.Equal(t, returnedIDP.ID, idp.ID)
assert.Equal(t, returnedIDP.Name, idp.Name)
assert.Equal(t, returnedIDP.InstanceID, idp.InstanceID)
assert.Equal(t, returnedIDP.State, idp.State)
})
}
}
func TestListIDProvider(t *testing.T) {
ctx := t.Context()
pool, stop, err := newEmbeddedDB(ctx)
require.NoError(t, err)
defer stop()
organizationRepo := repository.OrganizationRepository(pool)
// create instance
instanceId := gofakeit.Name()
instance := domain.Instance{
ID: instanceId,
Name: gofakeit.Name(),
DefaultOrgID: "defaultOrgId",
IAMProjectID: "iamProject",
ConsoleClientID: "consoleCLient",
ConsoleAppID: "consoleApp",
DefaultLanguage: "defaultLanguage",
}
instanceRepo := repository.InstanceRepository(pool)
err = instanceRepo.Create(ctx, &instance)
require.NoError(t, err)
type test struct {
name string
testFunc func(ctx context.Context, t *testing.T) []*domain.Organization
conditionClauses []database.Condition
noOrganizationReturned bool
}
tests := []test{
{
name: "happy path single organization no filter",
testFunc: func(ctx context.Context, t *testing.T) []*domain.Organization {
noOfOrganizations := 1
organizations := make([]*domain.Organization, noOfOrganizations)
for i := range noOfOrganizations {
org := domain.Organization{
ID: gofakeit.Name(),
Name: gofakeit.Name(),
InstanceID: instanceId,
State: domain.OrgStateActive.String(),
}
// create organization
err := organizationRepo.Create(ctx, &org)
require.NoError(t, err)
organizations[i] = &org
}
return organizations
},
},
{
name: "happy path multiple organization no filter",
testFunc: func(ctx context.Context, t *testing.T) []*domain.Organization {
noOfOrganizations := 5
organizations := make([]*domain.Organization, noOfOrganizations)
for i := range noOfOrganizations {
org := domain.Organization{
ID: gofakeit.Name(),
Name: gofakeit.Name(),
InstanceID: instanceId,
State: domain.OrgStateActive.String(),
}
// create organization
err := organizationRepo.Create(ctx, &org)
require.NoError(t, err)
organizations[i] = &org
}
return organizations
},
},
func() test {
organizationId := gofakeit.Name()
return test{
name: "organization filter on id",
testFunc: func(ctx context.Context, t *testing.T) []*domain.Organization {
// create organization
// this org is created as an additional org which should NOT
// be returned in the results of this test case
org := domain.Organization{
ID: gofakeit.Name(),
Name: gofakeit.Name(),
InstanceID: instanceId,
State: domain.OrgStateActive.String(),
}
err = organizationRepo.Create(ctx, &org)
require.NoError(t, err)
noOfOrganizations := 1
organizations := make([]*domain.Organization, noOfOrganizations)
for i := range noOfOrganizations {
org := domain.Organization{
ID: organizationId,
Name: gofakeit.Name(),
InstanceID: instanceId,
State: domain.OrgStateActive.String(),
}
// create organization
err := organizationRepo.Create(ctx, &org)
require.NoError(t, err)
organizations[i] = &org
}
return organizations
},
conditionClauses: []database.Condition{organizationRepo.IDCondition(organizationId)},
}
}(),
{
name: "multiple organization filter on state",
testFunc: func(ctx context.Context, t *testing.T) []*domain.Organization {
// create organization
// this org is created as an additional org which should NOT
// be returned in the results of this test case
org := domain.Organization{
ID: gofakeit.Name(),
Name: gofakeit.Name(),
InstanceID: instanceId,
State: domain.OrgStateActive.String(),
}
err = organizationRepo.Create(ctx, &org)
require.NoError(t, err)
noOfOrganizations := 5
organizations := make([]*domain.Organization, noOfOrganizations)
for i := range noOfOrganizations {
org := domain.Organization{
ID: gofakeit.Name(),
Name: gofakeit.Name(),
InstanceID: instanceId,
State: domain.OrgStateInactive.String(),
}
// create organization
err := organizationRepo.Create(ctx, &org)
require.NoError(t, err)
organizations[i] = &org
}
return organizations
},
conditionClauses: []database.Condition{organizationRepo.StateCondition(domain.OrgStateInactive)},
},
func() test {
instanceId_2 := gofakeit.Name()
return test{
name: "multiple organization filter on instance",
testFunc: func(ctx context.Context, t *testing.T) []*domain.Organization {
// create instance 1
instanceId_1 := gofakeit.Name()
instance := domain.Instance{
ID: instanceId_1,
Name: gofakeit.Name(),
DefaultOrgID: "defaultOrgId",
IAMProjectID: "iamProject",
ConsoleClientID: "consoleCLient",
ConsoleAppID: "consoleApp",
DefaultLanguage: "defaultLanguage",
}
instanceRepo := repository.InstanceRepository(pool)
err = instanceRepo.Create(ctx, &instance)
assert.Nil(t, err)
// create organization
// this org is created as an additional org which should NOT
// be returned in the results of this test case
org := domain.Organization{
ID: gofakeit.Name(),
Name: gofakeit.Name(),
InstanceID: instanceId_1,
State: domain.OrgStateActive.String(),
}
err = organizationRepo.Create(ctx, &org)
require.NoError(t, err)
// create instance 2
instance_2 := domain.Instance{
ID: instanceId_2,
Name: gofakeit.Name(),
DefaultOrgID: "defaultOrgId",
IAMProjectID: "iamProject",
ConsoleClientID: "consoleCLient",
ConsoleAppID: "consoleApp",
DefaultLanguage: "defaultLanguage",
}
err = instanceRepo.Create(ctx, &instance_2)
assert.Nil(t, err)
noOfOrganizations := 5
organizations := make([]*domain.Organization, noOfOrganizations)
for i := range noOfOrganizations {
org := domain.Organization{
ID: gofakeit.Name(),
Name: gofakeit.Name(),
InstanceID: instanceId_2,
State: domain.OrgStateActive.String(),
}
// create organization
err := organizationRepo.Create(ctx, &org)
require.NoError(t, err)
organizations[i] = &org
}
return organizations
},
conditionClauses: []database.Condition{organizationRepo.InstanceIDCondition(instanceId_2)},
}
}(),
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Cleanup(func() {
_, err := pool.Exec(ctx, "DELETE FROM zitadel.organizations")
require.NoError(t, err)
})
organizations := tt.testFunc(ctx, t)
// check organization values
returnedOrgs, err := organizationRepo.List(ctx,
tt.conditionClauses...,
)
require.NoError(t, err)
if tt.noOrganizationReturned {
assert.Nil(t, returnedOrgs)
return
}
assert.Equal(t, len(organizations), len(returnedOrgs))
for i, org := range organizations {
assert.Equal(t, returnedOrgs[i].ID, org.ID)
assert.Equal(t, returnedOrgs[i].Name, org.Name)
assert.Equal(t, returnedOrgs[i].InstanceID, org.InstanceID)
assert.Equal(t, returnedOrgs[i].State, org.State)
}
})
}
}

View File

@@ -519,11 +519,6 @@ func TestGetOrganization(t *testing.T) {
return return
} }
if org.Name == "non existent org" {
assert.Nil(t, returnedOrg)
return
}
assert.Equal(t, returnedOrg.ID, org.ID) assert.Equal(t, returnedOrg.ID, org.ID)
assert.Equal(t, returnedOrg.Name, org.Name) assert.Equal(t, returnedOrg.Name, org.Name)
assert.Equal(t, returnedOrg.InstanceID, org.InstanceID) assert.Equal(t, returnedOrg.InstanceID, org.InstanceID)