mirror of
https://github.com/andwati/zitadel.git
synced 2026-10-20 22:44:25 +00:00
# Which Problems Are Solved In the context of moving our datastore to relational tables, Identity Provider Intents have no definition of a relational table nor any DB API that can be used to store the IDP intents as relational objects. # How the Problems Are Solved The PR follows the guidelines left in #11190 - A table `zitadel.identity_provider_intents` is created: it defines its relational constraints (foreign keys) with the other tables, as well as an ENUM to represent the state of the intent. - An IDP Intent repository has been created, which offers CRUD operations implemented as `Create`, `Get`, `Update` and `Delete` methods for the IDP intent. - The repository also defines all columns and conditions useful for performing DB operations on the IDP intents. - DB mocks have been added as well to ease testing on the `domain` package. - Reduction functions have been implemented for the existing IDP events so to keep the relational table in sync with the event store. # Additional Changes To allow testing LDAP intent flow, the `Session.FetchUser()` method has been extracted to a separate file. A corresponding mock has been created as well in `fetch_user_mock.go`. The files are mutually excluded and added at build time through go build tags: the mock is added when the `integration` tag is specified, while the real implementation is added when the same tag IS NOT added to the build tags. # Additional Context - Closes #11190 --------- Co-authored-by: Livio Spring <[email protected]> Co-authored-by: Silvan <[email protected]>
115 lines
3.4 KiB
Go
115 lines
3.4 KiB
Go
//go:build integration
|
|
|
|
package events_test
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
|
|
"github.com/zitadel/zitadel/backend/v3/storage/database"
|
|
"github.com/zitadel/zitadel/backend/v3/storage/database/dialect/postgres"
|
|
"github.com/zitadel/zitadel/internal/integration"
|
|
"github.com/zitadel/zitadel/pkg/grpc/admin"
|
|
"github.com/zitadel/zitadel/pkg/grpc/authorization/v2"
|
|
v2beta "github.com/zitadel/zitadel/pkg/grpc/instance/v2beta"
|
|
mgmt "github.com/zitadel/zitadel/pkg/grpc/management"
|
|
v2beta_org "github.com/zitadel/zitadel/pkg/grpc/org/v2beta"
|
|
v2beta_project "github.com/zitadel/zitadel/pkg/grpc/project/v2beta"
|
|
"github.com/zitadel/zitadel/pkg/grpc/session/v2"
|
|
"github.com/zitadel/zitadel/pkg/grpc/system"
|
|
"github.com/zitadel/zitadel/pkg/grpc/user/v2"
|
|
)
|
|
|
|
func getEnv(key, fallback string) string {
|
|
if value, exists := os.LookupEnv(key); exists {
|
|
return value
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
var ConnString = fmt.Sprintf(
|
|
"host=%s port=%s user=%s password=%s dbname=%s sslmode=%s",
|
|
getEnv("ZITADEL_DATABASE_POSTGRES_HOST", "localhost"),
|
|
getEnv("ZITADEL_DATABASE_POSTGRES_PORT", "5433"),
|
|
getEnv("ZITADEL_DATABASE_POSTGRES_USER", "zitadel"),
|
|
getEnv("ZITADEL_DATABASE_POSTGRES_PASSWORD", "zitadel"),
|
|
getEnv("ZITADEL_DATABASE_POSTGRES_DATABASE", "zitadel"),
|
|
getEnv("ZITADEL_DATABASE_POSTGRES_SSL_MODE", "disable"),
|
|
)
|
|
|
|
var (
|
|
dbPool *pgxpool.Pool
|
|
CTX context.Context
|
|
IAMCTX context.Context
|
|
Instance *integration.Instance
|
|
SystemClient system.SystemServiceClient
|
|
OrgClient v2beta_org.OrganizationServiceClient
|
|
ProjectClient v2beta_project.ProjectServiceClient
|
|
SessionClient session.SessionServiceClient
|
|
UserClient user.UserServiceClient
|
|
AdminClient admin.AdminServiceClient
|
|
MgmtClient mgmt.ManagementServiceClient
|
|
AuthorizationClient authorization.AuthorizationServiceClient
|
|
)
|
|
|
|
var pool database.Pool
|
|
|
|
func TestMain(m *testing.M) {
|
|
os.Exit(func() int {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Minute)
|
|
defer cancel()
|
|
|
|
CTX = integration.WithSystemAuthorization(ctx)
|
|
Instance = integration.NewInstance(CTX)
|
|
|
|
IAMCTX = Instance.WithAuthorizationToken(ctx, integration.UserTypeIAMOwner)
|
|
SystemClient = integration.SystemClient()
|
|
OrgClient = Instance.Client.OrgV2beta
|
|
ProjectClient = Instance.Client.Projectv2Beta
|
|
SessionClient = Instance.Client.SessionV2
|
|
UserClient = Instance.Client.UserV2
|
|
AdminClient = Instance.Client.Admin
|
|
MgmtClient = Instance.Client.Mgmt
|
|
AuthorizationClient = Instance.Client.AuthorizationV2
|
|
|
|
defer func() {
|
|
_, err := Instance.Client.InstanceV2Beta.DeleteInstance(CTX, &v2beta.DeleteInstanceRequest{
|
|
InstanceId: Instance.Instance.Id,
|
|
})
|
|
if err != nil {
|
|
log.Printf("Failed to delete instance on cleanup: %v\n", err)
|
|
}
|
|
}()
|
|
|
|
var err error
|
|
dbConfig, err := pgxpool.ParseConfig(ConnString)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
dbConfig.AfterConnect = func(ctx context.Context, conn *pgx.Conn) error {
|
|
orgState, err := conn.LoadType(ctx, "zitadel.organization_state")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
conn.TypeMap().RegisterType(orgState)
|
|
return nil
|
|
}
|
|
|
|
dbPool, err = pgxpool.NewWithConfig(context.Background(), dbConfig)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
pool = postgres.PGxPool(dbPool)
|
|
|
|
return m.Run()
|
|
}())
|
|
}
|