diff --git a/.github/workflows/code-analysis-lint-test.yaml b/.github/workflows/code-analysis-lint-test.yaml index c50e2f36..e8f2f50d 100644 --- a/.github/workflows/code-analysis-lint-test.yaml +++ b/.github/workflows/code-analysis-lint-test.yaml @@ -76,7 +76,7 @@ jobs: go-version-file: "go.mod" cache: true - name: golangci-lint - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v7 with: # Require: The version of golangci-lint to use. # When `install-mode` is `binary` (default) the value can be v1.2 or v1.2.3 or `latest` to use the latest version. @@ -123,30 +123,16 @@ jobs: needs: [build] runs-on: ubuntu-latest env: - PINGCLI_PINGONE_WORKER_CLIENT_ID: ${{ secrets.PINGCLI_PINGONE_WORKER_CLIENT_ID }} - PINGCLI_PINGONE_WORKER_CLIENT_SECRET: ${{ secrets.PINGCLI_PINGONE_WORKER_CLIENT_SECRET }} - PINGCLI_PINGONE_REGION_CODE: ${{ secrets.PINGCLI_PINGONE_REGION_CODE }} - PINGCLI_PINGONE_WORKER_ENVIRONMENT_ID: ${{ secrets.PINGCLI_PINGONE_WORKER_ENVIRONMENT_ID }} - PINGCLI_PINGONE_EXPORT_ENVIRONMENT_ID: ${{ secrets.PINGCLI_PINGONE_EXPORT_ENVIRONMENT_ID }} - PINGONE_CLIENT_ID: ${{ secrets.PINGONE_CLIENT_ID }} - PINGONE_CLIENT_SECRET: ${{ secrets.PINGONE_CLIENT_SECRET }} - PINGONE_ENVIRONMENT_ID: ${{ secrets.PINGONE_ENVIRONMENT_ID }} - PINGONE_REGION_CODE: ${{ secrets.PINGONE_REGION_CODE }} PINGCLI_LOG_LEVEL: ${{ vars.PINGCLI_LOG_LEVEL }} PINGCLI_LOG_PATH: ${{ vars.PINGCLI_LOG_PATH }} - PINGCLI_PINGONE_PROVIDER_VERSION: ${{ vars.PINGCLI_PINGONE_PROVIDER_VERSION }} - PINGCLI_PINGFEDERATE_ADMIN_API_PATH: ${{ secrets.PINGCLI_PINGFEDERATE_ADMIN_API_PATH }} - PINGCLI_PINGFEDERATE_CLIENT_ID: ${{ secrets.PINGCLI_PINGFEDERATE_CLIENT_ID }} - PINGCLI_PINGFEDERATE_CLIENT_SECRET: ${{ secrets.PINGCLI_PINGFEDERATE_CLIENT_SECRET }} - PINGCLI_PINGFEDERATE_HTTPS_HOST: ${{ secrets.PINGCLI_PINGFEDERATE_HTTPS_HOST }} - PINGCLI_PINGFEDERATE_PASSWORD: ${{ secrets.PINGCLI_PINGFEDERATE_PASSWORD }} - PINGCLI_PINGFEDERATE_SCOPES: ${{ secrets.PINGCLI_PINGFEDERATE_SCOPES }} - PINGCLI_PINGFEDERATE_TOKEN_URL: ${{ secrets.PINGCLI_PINGFEDERATE_TOKEN_URL }} - PINGCLI_PINGFEDERATE_USERNAME: ${{ secrets.PINGCLI_PINGFEDERATE_USERNAME }} - PINGCLI_PINGFEDERATE_PROVIDER_VERSION: ${{ vars.PINGCLI_PINGFEDERATE_PROVIDER_VERSION }} - PING_IDENTITY_DEVOPS_USER: ${{ secrets.PING_IDENTITY_DEVOPS_USER }} - PING_IDENTITY_DEVOPS_KEY: ${{ secrets.PING_IDENTITY_DEVOPS_KEY }} - PING_IDENTITY_ACCEPT_EULA: ${{ vars.PING_IDENTITY_ACCEPT_EULA }} + TEST_PING_IDENTITY_ACCEPT_EULA: ${{ vars.TEST_PING_IDENTITY_ACCEPT_EULA }} + TEST_PING_IDENTITY_DEVOPS_USER: ${{ secrets.TEST_PING_IDENTITY_DEVOPS_USER }} + TEST_PING_IDENTITY_DEVOPS_KEY: ${{ secrets.TEST_PING_IDENTITY_DEVOPS_KEY }} + TEST_PINGONE_ENVIRONMENT_ID: ${{ secrets.TEST_PINGONE_ENVIRONMENT_ID }} + TEST_PINGONE_WORKER_CLIENT_ID: ${{ secrets.TEST_PINGONE_WORKER_CLIENT_ID }} + TEST_PINGONE_WORKER_CLIENT_SECRET: ${{ secrets.TEST_PINGONE_WORKER_CLIENT_SECRET }} + TEST_PINGONE_REGION_CODE: ${{ secrets.TEST_PINGONE_REGION_CODE }} + steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 diff --git a/.golangci.yml b/.golangci.yml index f41f34c1..8c9abc90 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,8 +1,68 @@ -# Options for analysis running. -run: - timeout: 30m - -# Use all default linters + those defined here +version: "2" linters: enable: + - asasalint + - asciicheck + - bidichk + - canonicalheader + - copyloopvar + - decorder + - dogsled + - dupword + - durationcheck + - errcheck + - errchkjson + - errname + - errorlint + - exptostd + - forcetypeassert + - ginkgolinter + - gocheckcompilerdirectives + - gochecksumtype + - gocritic + - goheader + - gomoddirectives + - gomodguard + - goprintffuncname - gosec + - gosmopolitan + - govet + - grouper + - iface + - importas + - inamedparam + - ineffassign + - interfacebloat + - intrange + - ireturn + - makezero + - mirror + - misspell + - musttag + - nakedret + - nilerr + - nilnesserr + - nilnil + - nlreturn + - noctx + - nolintlint + - nosprintfhostport + - prealloc + - predeclared + - protogetter + - reassign + - rowserrcheck + - staticcheck + - tagalign + - testableexamples + - testpackage + - thelper + - tparallel + - unconvert + - unparam + - unused + - usestdlibvars + - usetesting + - wastedassign + - whitespace + - zerologlint diff --git a/Makefile b/Makefile index ac628f91..86b70d7e 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,15 @@ vet: exit 1; \ fi -test: --test-cmd --test-internal-commands --test-internal-configuration --test-internal-connector --test-internal-customtypes --test-internal-input --test-internal-profiles +test: --checktestenvvars --test-cmd --test-internal-commands --test-internal-configuration --test-internal-connector --test-internal-customtypes --test-internal-input --test-internal-profiles + +--checktestenvvars: + @echo -n "Checking for required environment variables to run pingcli tests..." + @test -n "$$TEST_PINGONE_ENVIRONMENT_ID" || { echo " FAILED"; echo "TEST_PINGONE_ENVIRONMENT_ID environment variable is not set.\n\nCreate/Specify an unconfigured PingOne environment to test PingCLI with. The following services are required: PingOne SSO, PingOne MFA, PingOne Protect, PingOne DaVinci, PingOne Authorize, and PingFederate"; exit 1; } + @test -n "$$TEST_PINGONE_REGION_CODE" || { echo " FAILED"; echo "TEST_PINGONE_REGION_CODE environment variable is not set.\n\nCreate/Specify an unconfigured PingOne environment to test PingCLI with. The following services are required: PingOne SSO, PingOne MFA, PingOne Protect, PingOne DaVinci, PingOne Authorize, and PingFederate"; exit 1; } + @test -n "$$TEST_PINGONE_WORKER_CLIENT_ID" || { echo " FAILED"; echo "TEST_PINGONE_WORKER_CLIENT_ID environment variable is not set.\n\nCreate/Specify a worker applicaiton in the unconfigured PingOne environment with all admin roles to test PingCLI with"; exit 1; } + @test -n "$$TEST_PINGONE_WORKER_CLIENT_SECRET" || { echo " FAILED"; echo "TEST_PINGONE_WORKER_CLIENT_SECRET environment variable is not set.\n\nCreate/Specify a worker applicaiton in an unconfigured PingOne environment with all admin roles to test PingCLI with"; exit 1; } + @echo " SUCCESS" --test-cmd: @echo "Running tests for cmd..." @@ -61,11 +69,19 @@ test: --test-cmd --test-internal-commands --test-internal-configuration --test-i @# Test the resources within each connector first @go test -count=1 ./internal/connector/pingfederate/resources - @go test -count=1 ./internal/connector/pingone/.../resources + @go test -count=1 ./internal/connector/pingone/authorize/resources + @go test -count=1 ./internal/connector/pingone/mfa/resources + @go test -count=1 ./internal/connector/pingone/platform/resources + @go test -count=1 ./internal/connector/pingone/protect/resources + @go test -count=1 ./internal/connector/pingone/sso/resources @# Test the connectors itegration terraform plan tests @go test -count=1 ./internal/connector/pingfederate - @go test -count=1 ./internal/connector/pingone/*/ + @go test -count=1 ./internal/connector/pingone/authorize + @go test -count=1 ./internal/connector/pingone/mfa + @go test -count=1 ./internal/connector/pingone/platform + @go test -count=1 ./internal/connector/pingone/protect + @go test -count=1 ./internal/connector/pingone/sso --test-internal-customtypes: @echo "Running tests for internal/customtypes..." @@ -93,22 +109,17 @@ importfmtlint: fi golangcilint: - @echo -n "Running 'golangci-lint' to check for code quality issues..." + @echo -n "Running 'golangci-lint' to check for code quality issues... " @# Clear the cache for every run, so that the linter outputs the same results as the GH Actions workflow - @if golangci-lint cache clean && golangci-lint run --timeout 5m ./...; then \ - echo " SUCCESS"; \ - else \ - echo " FAILED"; \ - exit 1; \ - fi + @golangci-lint cache clean && golangci-lint run --timeout 5m ./... -starttestcontainer: --checkneededpfenvvars --checkdocker --dockerrunpf --waitforpfhealthy +starttestcontainer: --checkpfcontainerenvvars --checkdocker --dockerrunpf --waitforpfhealthy ---checkneededpfenvvars: +--checkpfcontainerenvvars: @echo -n "Checking for required environment variables to run PingFederate container..." - @test -n "$$PING_IDENTITY_DEVOPS_USER" || { echo " FAILED"; echo "PING_IDENTITY_DEVOPS_USER environment variable is not set.\n\nNot Registered? Register for the DevOps Program at https://devops.pingidentity.com/how-to/devopsRegistration/."; exit 1; } - @test -n "$$PING_IDENTITY_DEVOPS_KEY" || { echo " FAILED"; echo "PING_IDENTITY_DEVOPS_KEY environment variable is not set.\n\nNot Registered? Register for the DevOps Program at https://devops.pingidentity.com/how-to/devopsRegistration/."; exit 1; } - @test "YES" = "$$PING_IDENTITY_ACCEPT_EULA" || { echo " FAILED"; echo "You must accept the EULA to use the PingFederate container. Set PING_IDENTITY_ACCEPT_EULA=YES to continue."; exit 1; } + @test -n "$$TEST_PING_IDENTITY_DEVOPS_USER" || { echo " FAILED"; echo "TEST_PING_IDENTITY_DEVOPS_USER environment variable is not set.\n\nNot Registered? Register for the DevOps Program at https://devops.pingidentity.com/how-to/devopsRegistration/."; exit 1; } + @test -n "$$TEST_PING_IDENTITY_DEVOPS_KEY" || { echo " FAILED"; echo "TEST_PING_IDENTITY_DEVOPS_KEY environment variable is not set.\n\nNot Registered? Register for the DevOps Program at https://devops.pingidentity.com/how-to/devopsRegistration/."; exit 1; } + @test "YES" = "$$TEST_PING_IDENTITY_ACCEPT_EULA" || { echo " FAILED"; echo "You must accept the EULA to use the PingFederate container. Set TEST_PING_IDENTITY_ACCEPT_EULA=YES to continue."; exit 1; } @echo " SUCCESS" --checkdocker: @@ -121,9 +132,9 @@ starttestcontainer: --checkneededpfenvvars --checkdocker --dockerrunpf --waitfor @docker run --name pingcli_test_pingfederate_container \ -d -p 9031:9031 \ -p 9999:9999 \ - --env PING_IDENTITY_DEVOPS_USER="$${PING_IDENTITY_DEVOPS_USER}" \ - --env PING_IDENTITY_DEVOPS_KEY="$${PING_IDENTITY_DEVOPS_KEY}" \ - --env PING_IDENTITY_ACCEPT_EULA="$${PING_IDENTITY_ACCEPT_EULA}" \ + --env PING_IDENTITY_DEVOPS_USER="$${TEST_PING_IDENTITY_DEVOPS_USER}" \ + --env PING_IDENTITY_DEVOPS_KEY="$${TEST_PING_IDENTITY_DEVOPS_KEY}" \ + --env PING_IDENTITY_ACCEPT_EULA="$${TEST_PING_IDENTITY_ACCEPT_EULA}" \ --env CREATE_INITIAL_ADMIN_USER="true" \ -v $$(pwd)/internal/testing/pingfederate_container_files/deploy:/opt/in/instance/server/default/deploy \ pingidentity/pingfederate:latest > /dev/null 2>&1 || { echo " FAILED"; echo "Failed to start the PingFederate container. Please check your Docker setup."; exit 1; } diff --git a/cmd/common/cobra_utils.go b/cmd/common/cobra_utils.go index 833f20d1..c06b0724 100644 --- a/cmd/common/cobra_utils.go +++ b/cmd/common/cobra_utils.go @@ -13,15 +13,17 @@ func ExactArgs(numArgs int) cobra.PositionalArgs { if len(args) != numArgs { return fmt.Errorf("failed to execute '%s': command accepts %d arg(s), received %d", cmd.CommandPath(), numArgs, len(args)) } + return nil } } -func RangeArgs(min, max int) cobra.PositionalArgs { +func RangeArgs(minArgs, maxArgs int) cobra.PositionalArgs { return func(cmd *cobra.Command, args []string) error { - if len(args) < min || len(args) > max { - return fmt.Errorf("failed to execute '%s': command accepts %d to %d arg(s), received %d", cmd.CommandPath(), min, max, len(args)) + if len(args) < minArgs || len(args) > maxArgs { + return fmt.Errorf("failed to execute '%s': command accepts %d to %d arg(s), received %d", cmd.CommandPath(), minArgs, maxArgs, len(args)) } + return nil } } diff --git a/cmd/completion/cmd.go b/cmd/completion/cmd.go index 01266a33..0be3d49b 100644 --- a/cmd/completion/cmd.go +++ b/cmd/completion/cmd.go @@ -74,5 +74,6 @@ func Command() *cobra.Command { Args: cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs), RunE: completionCmdRunE, } + return cmd } diff --git a/cmd/config/unset_test.go b/cmd/config/unset_test.go index 776e7b86..9345c81b 100644 --- a/cmd/config/unset_test.go +++ b/cmd/config/unset_test.go @@ -3,13 +3,13 @@ package config_test import ( - "os" "testing" "github.com/pingidentity/pingcli/internal/configuration/options" "github.com/pingidentity/pingcli/internal/profiles" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_cobra" + "github.com/pingidentity/pingcli/internal/testing/testutils_viper" ) // Test Config Unset Command Executes without issue @@ -41,15 +41,19 @@ func TestConfigUnsetCmd_InvalidKey(t *testing.T) { // Test Config Unset Command for key 'pingone.worker.clientId' updates viper configuration func TestConfigUnsetCmd_CheckViperConfig(t *testing.T) { + testutils_viper.InitVipers(t) + + mainViper := profiles.GetMainConfig().ViperInstance() viperKey := options.PingOneAuthenticationWorkerClientIDOption.ViperKey - viperOldValue := os.Getenv(options.PingOneAuthenticationWorkerClientIDOption.EnvVar) + profileViperKey := "default." + viperKey + + viperOldValue := mainViper.GetString(profileViperKey) err := testutils_cobra.ExecutePingcli(t, "config", "unset", viperKey) testutils.CheckExpectedError(t, err, nil) - mainViper := profiles.GetMainConfig().ViperInstance() - profileViperKey := "default." + viperKey viperNewValue := mainViper.GetString(profileViperKey) + if viperOldValue == viperNewValue { t.Errorf("Expected viper configuration value to be updated. Old: %s, New: %s", viperOldValue, viperNewValue) } diff --git a/cmd/platform/export.go b/cmd/platform/export.go index a364bec5..037097e0 100644 --- a/cmd/platform/export.go +++ b/cmd/platform/export.go @@ -114,7 +114,6 @@ func initPingOneExportFlags(cmd *cobra.Command) { options.PingOneAuthenticationWorkerClientSecretOption.CobraParamName, options.PingOneRegionCodeOption.CobraParamName, ) - } func initPingFederateGeneralFlags(cmd *cobra.Command) { diff --git a/cmd/platform/export_test.go b/cmd/platform/export_test.go index 7d315c3b..8bfe402f 100644 --- a/cmd/platform/export_test.go +++ b/cmd/platform/export_test.go @@ -141,7 +141,7 @@ func TestPlatformExportCmd_OverwriteFlag(t *testing.T) { func TestPlatformExportCmd_OverwriteFlagFalseWithExistingDirectory(t *testing.T) { outputDir := t.TempDir() - _, err := os.Create(outputDir + "/file") + _, err := os.Create(outputDir + "/file") //#nosec G304 -- this is a test if err != nil { t.Errorf("Error creating file in output directory: %v", err) } @@ -159,7 +159,7 @@ func TestPlatformExportCmd_OverwriteFlagFalseWithExistingDirectory(t *testing.T) func TestPlatformExportCmd_OverwriteFlagTrueWithExistingDirectory(t *testing.T) { outputDir := t.TempDir() - _, err := os.Create(outputDir + "/file") + _, err := os.Create(outputDir + "/file") //#nosec G304 -- this is a test if err != nil { t.Errorf("Error creating file in output directory: %v", err) } @@ -183,10 +183,10 @@ func TestPlatformExportCmd_PingOneWorkerEnvironmentIdFlag(t *testing.T) { "--"+options.PlatformExportOutputDirectoryOption.CobraParamName, outputDir, "--"+options.PlatformExportOverwriteOption.CobraParamName, "--"+options.PlatformExportServiceOption.CobraParamName, customtypes.ENUM_EXPORT_SERVICE_PINGONE_PROTECT, - "--"+options.PingOneAuthenticationWorkerEnvironmentIDOption.CobraParamName, os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar), - "--"+options.PingOneAuthenticationWorkerClientIDOption.CobraParamName, os.Getenv(options.PingOneAuthenticationWorkerClientIDOption.EnvVar), - "--"+options.PingOneAuthenticationWorkerClientSecretOption.CobraParamName, os.Getenv(options.PingOneAuthenticationWorkerClientSecretOption.EnvVar), - "--"+options.PingOneRegionCodeOption.CobraParamName, os.Getenv(options.PingOneRegionCodeOption.EnvVar)) + "--"+options.PingOneAuthenticationWorkerEnvironmentIDOption.CobraParamName, os.Getenv("TEST_PINGONE_ENVIRONMENT_ID"), + "--"+options.PingOneAuthenticationWorkerClientIDOption.CobraParamName, os.Getenv("TEST_PINGONE_WORKER_CLIENT_ID"), + "--"+options.PingOneAuthenticationWorkerClientSecretOption.CobraParamName, os.Getenv("TEST_PINGONE_WORKER_CLIENT_SECRET"), + "--"+options.PingOneRegionCodeOption.CobraParamName, os.Getenv("TEST_PINGONE_REGION_CODE")) testutils.CheckExpectedError(t, err, nil) } @@ -194,7 +194,7 @@ func TestPlatformExportCmd_PingOneWorkerEnvironmentIdFlag(t *testing.T) { func TestPlatformExportCmd_PingOneWorkerEnvironmentIdFlagRequiredTogether(t *testing.T) { expectedErrorPattern := `^if any flags in the group \[pingone-worker-environment-id pingone-worker-client-id pingone-worker-client-secret pingone-region-code] are set they must all be set; missing \[pingone-region-code pingone-worker-client-id pingone-worker-client-secret]$` err := testutils_cobra.ExecutePingcli(t, "platform", "export", - "--"+options.PingOneAuthenticationWorkerEnvironmentIDOption.CobraParamName, os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar)) + "--"+options.PingOneAuthenticationWorkerEnvironmentIDOption.CobraParamName, os.Getenv("TEST_PINGONE_ENVIRONMENT_ID")) testutils.CheckExpectedError(t, err, &expectedErrorPattern) } @@ -206,8 +206,8 @@ func TestPlatformExportCmd_PingFederateBasicAuthFlags(t *testing.T) { "--"+options.PlatformExportOutputDirectoryOption.CobraParamName, outputDir, "--"+options.PlatformExportOverwriteOption.CobraParamName, "--"+options.PlatformExportServiceOption.CobraParamName, customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE, - "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthUsernameOption.EnvVar), - "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthPasswordOption.EnvVar), + "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, "Administrator", + "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, "2FederateM0re", "--"+options.PingFederateAuthenticationTypeOption.CobraParamName, customtypes.ENUM_PINGFEDERATE_AUTHENTICATION_TYPE_BASIC, ) testutils.CheckExpectedError(t, err, nil) @@ -217,7 +217,7 @@ func TestPlatformExportCmd_PingFederateBasicAuthFlags(t *testing.T) { func TestPlatformExportCmd_PingFederateBasicAuthFlagsRequiredTogether(t *testing.T) { expectedErrorPattern := `^if any flags in the group \[pingfederate-username pingfederate-password] are set they must all be set; missing \[pingfederate-password]$` err := testutils_cobra.ExecutePingcli(t, "platform", "export", - "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthUsernameOption.EnvVar)) + "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, "Administrator") testutils.CheckExpectedError(t, err, &expectedErrorPattern) } @@ -230,10 +230,10 @@ func TestPlatformExportCmd_PingOneClientCredentialFlagsInvalid(t *testing.T) { "--"+options.PlatformExportOutputDirectoryOption.CobraParamName, outputDir, "--"+options.PlatformExportOverwriteOption.CobraParamName, "--"+options.PlatformExportServiceOption.CobraParamName, customtypes.ENUM_EXPORT_SERVICE_PINGONE_PROTECT, - "--"+options.PingOneAuthenticationWorkerEnvironmentIDOption.CobraParamName, os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar), - "--"+options.PingOneAuthenticationWorkerClientIDOption.CobraParamName, os.Getenv(options.PingOneAuthenticationWorkerClientIDOption.EnvVar), + "--"+options.PingOneAuthenticationWorkerEnvironmentIDOption.CobraParamName, os.Getenv("TEST_PINGONE_ENVIRONMENT_ID"), + "--"+options.PingOneAuthenticationWorkerClientIDOption.CobraParamName, os.Getenv("TEST_PINGONE_WORKER_CLIENT_ID"), "--"+options.PingOneAuthenticationWorkerClientSecretOption.CobraParamName, "invalid", - "--"+options.PingOneRegionCodeOption.CobraParamName, os.Getenv(options.PingOneRegionCodeOption.EnvVar), + "--"+options.PingOneRegionCodeOption.CobraParamName, os.Getenv("TEST_PINGONE_REGION_CODE"), ) testutils.CheckExpectedError(t, err, &expectedErrorPattern) } @@ -247,7 +247,7 @@ func TestPlatformExportCmd_PingFederateBasicAuthFlagsInvalid(t *testing.T) { "--"+options.PlatformExportOutputDirectoryOption.CobraParamName, outputDir, "--"+options.PlatformExportOverwriteOption.CobraParamName, "--"+options.PlatformExportServiceOption.CobraParamName, customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE, - "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthUsernameOption.EnvVar), + "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, "Administrator", "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, "invalid", "--"+options.PingFederateAuthenticationTypeOption.CobraParamName, customtypes.ENUM_PINGFEDERATE_AUTHENTICATION_TYPE_BASIC, ) @@ -258,7 +258,7 @@ func TestPlatformExportCmd_PingFederateBasicAuthFlagsInvalid(t *testing.T) { func TestPlatformExportCmd_PingFederateClientCredentialsAuthFlagsRequiredTogether(t *testing.T) { expectedErrorPattern := `^if any flags in the group \[pingfederate-client-id pingfederate-client-secret pingfederate-token-url] are set they must all be set; missing \[pingfederate-client-secret pingfederate-token-url]$` err := testutils_cobra.ExecutePingcli(t, "platform", "export", - "--"+options.PingFederateClientCredentialsAuthClientIDOption.CobraParamName, os.Getenv(options.PingFederateClientCredentialsAuthClientIDOption.EnvVar)) + "--"+options.PingFederateClientCredentialsAuthClientIDOption.CobraParamName, "test") testutils.CheckExpectedError(t, err, &expectedErrorPattern) } @@ -271,10 +271,10 @@ func TestPlatformExportCmd_PingFederateClientCredentialsAuthFlagsInvalid(t *test "--"+options.PlatformExportOutputDirectoryOption.CobraParamName, outputDir, "--"+options.PlatformExportOverwriteOption.CobraParamName, "--"+options.PlatformExportServiceOption.CobraParamName, customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE, - "--"+options.PingFederateClientCredentialsAuthClientIDOption.CobraParamName, os.Getenv(options.PingFederateClientCredentialsAuthClientIDOption.EnvVar), + "--"+options.PingFederateClientCredentialsAuthClientIDOption.CobraParamName, "test", "--"+options.PingFederateClientCredentialsAuthClientSecretOption.CobraParamName, "invalid", - "--"+options.PingFederateClientCredentialsAuthTokenURLOption.CobraParamName, os.Getenv(options.PingFederateClientCredentialsAuthTokenURLOption.EnvVar), - "--"+options.PingFederateClientCredentialsAuthScopesOption.CobraParamName, os.Getenv(options.PingFederateClientCredentialsAuthScopesOption.EnvVar), + "--"+options.PingFederateClientCredentialsAuthTokenURLOption.CobraParamName, "https://localhost:9031/as/token.oauth2", + "--"+options.PingFederateClientCredentialsAuthScopesOption.CobraParamName, "email", "--"+options.PingFederateAuthenticationTypeOption.CobraParamName, customtypes.ENUM_PINGFEDERATE_AUTHENTICATION_TYPE_CLIENT_CREDENTIALS, ) testutils.CheckExpectedError(t, err, &expectedErrorPattern) @@ -289,8 +289,8 @@ func TestPlatformExportCmd_PingFederateClientCredentialsAuthFlagsInvalidTokenURL "--"+options.PlatformExportOutputDirectoryOption.CobraParamName, outputDir, "--"+options.PlatformExportOverwriteOption.CobraParamName, "--"+options.PlatformExportServiceOption.CobraParamName, customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE, - "--"+options.PingFederateClientCredentialsAuthClientIDOption.CobraParamName, os.Getenv(options.PingFederateClientCredentialsAuthClientIDOption.EnvVar), - "--"+options.PingFederateClientCredentialsAuthClientSecretOption.CobraParamName, os.Getenv(options.PingFederateClientCredentialsAuthClientSecretOption.EnvVar), + "--"+options.PingFederateClientCredentialsAuthClientIDOption.CobraParamName, "test", + "--"+options.PingFederateClientCredentialsAuthClientSecretOption.CobraParamName, "2FederateM0re!", "--"+options.PingFederateClientCredentialsAuthTokenURLOption.CobraParamName, "https://localhost:9031/as/invalid", "--"+options.PingFederateAuthenticationTypeOption.CobraParamName, customtypes.ENUM_PINGFEDERATE_AUTHENTICATION_TYPE_CLIENT_CREDENTIALS, ) @@ -306,8 +306,8 @@ func TestPlatformExportCmd_PingFederateXBypassHeaderFlag(t *testing.T) { "--"+options.PlatformExportOverwriteOption.CobraParamName, "--"+options.PlatformExportServiceOption.CobraParamName, customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE, "--"+options.PingFederateXBypassExternalValidationHeaderOption.CobraParamName, - "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthUsernameOption.EnvVar), - "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthPasswordOption.EnvVar), + "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, "Administrator", + "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, "2FederateM0re", "--"+options.PingFederateAuthenticationTypeOption.CobraParamName, customtypes.ENUM_PINGFEDERATE_AUTHENTICATION_TYPE_BASIC, ) testutils.CheckExpectedError(t, err, nil) @@ -322,8 +322,8 @@ func TestPlatformExportCmd_PingFederateTrustAllTLSFlag(t *testing.T) { "--"+options.PlatformExportOverwriteOption.CobraParamName, "--"+options.PlatformExportServiceOption.CobraParamName, customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE, "--"+options.PingFederateInsecureTrustAllTLSOption.CobraParamName, - "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthUsernameOption.EnvVar), - "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthPasswordOption.EnvVar), + "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, "Administrator", + "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, "2FederateM0re", "--"+options.PingFederateAuthenticationTypeOption.CobraParamName, customtypes.ENUM_PINGFEDERATE_AUTHENTICATION_TYPE_BASIC, ) testutils.CheckExpectedError(t, err, nil) @@ -339,8 +339,8 @@ func TestPlatformExportCmd_PingFederateTrustAllTLSFlagFalse(t *testing.T) { "--"+options.PlatformExportOverwriteOption.CobraParamName, "--"+options.PlatformExportServiceOption.CobraParamName, customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE, "--"+options.PingFederateInsecureTrustAllTLSOption.CobraParamName+"=false", - "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthUsernameOption.EnvVar), - "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthPasswordOption.EnvVar), + "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, "Administrator", + "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, "2FederateM0re", "--"+options.PingFederateAuthenticationTypeOption.CobraParamName, customtypes.ENUM_PINGFEDERATE_AUTHENTICATION_TYPE_BASIC, ) testutils.CheckExpectedError(t, err, &expectedErrorPattern) @@ -358,8 +358,8 @@ func TestPlatformExportCmd_PingFederateCaCertificatePemFiles(t *testing.T) { "--"+options.PlatformExportServiceOption.CobraParamName, customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE, "--"+options.PingFederateInsecureTrustAllTLSOption.CobraParamName+"=true", "--"+options.PingFederateCACertificatePemFilesOption.CobraParamName, "testdata/ssl-server-crt.pem", - "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthUsernameOption.EnvVar), - "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthPasswordOption.EnvVar), + "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, "Administrator", + "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, "2FederateM0re", "--"+options.PingFederateAuthenticationTypeOption.CobraParamName, customtypes.ENUM_PINGFEDERATE_AUTHENTICATION_TYPE_BASIC, ) testutils.CheckExpectedError(t, err, nil) @@ -371,8 +371,8 @@ func TestPlatformExportCmd_PingFederateCaCertificatePemFilesInvalid(t *testing.T err := testutils_cobra.ExecutePingcli(t, "platform", "export", "--"+options.PlatformExportServiceOption.CobraParamName, customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE, "--"+options.PingFederateCACertificatePemFilesOption.CobraParamName, "invalid/crt.pem", - "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthUsernameOption.EnvVar), - "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, os.Getenv(options.PingFederateBasicAuthPasswordOption.EnvVar), + "--"+options.PingFederateBasicAuthUsernameOption.CobraParamName, "Administrator", + "--"+options.PingFederateBasicAuthPasswordOption.CobraParamName, "2FederateM0re", "--"+options.PingFederateAuthenticationTypeOption.CobraParamName, customtypes.ENUM_PINGFEDERATE_AUTHENTICATION_TYPE_BASIC, ) testutils.CheckExpectedError(t, err, &expectedErrorPattern) diff --git a/cmd/request/request_test.go b/cmd/request/request_test.go index 1b1964ac..12ad14b0 100644 --- a/cmd/request/request_test.go +++ b/cmd/request/request_test.go @@ -22,18 +22,26 @@ func TestRequestCmd_Execute(t *testing.T) { if err != nil { t.Fatalf("Failed to create pipe: %v", err) } - defer pipeReader.Close() + defer func() { + err := pipeReader.Close() + if err != nil { + t.Fatalf("Failed to close pipe: %v", err) + } + }() os.Stdout = pipeWriter err = testutils_cobra.ExecutePingcli(t, "request", "--service", "pingone", "--http-method", "GET", - fmt.Sprintf("environments/%s/populations", os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar)), + fmt.Sprintf("environments/%s/populations", os.Getenv("TEST_PINGONE_ENVIRONMENT_ID")), ) testutils.CheckExpectedError(t, err, nil) os.Stdout = originalStdout - pipeWriter.Close() + err = pipeWriter.Close() + if err != nil { + t.Fatalf("Failed to close pipe: %v", err) + } pipeReaderOut, err := io.ReadAll(pipeReader) if err != nil { diff --git a/cmd/root.go b/cmd/root.go index f919116b..c441abaa 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -99,7 +99,7 @@ func initViperProfile() { l.Debug().Msgf("Validated configuration file location at: %s", cfgFile) - //Configure the main viper instance + // Configure the main viper instance initMainViper(cfgFile) userDefinedProfile, err := profiles.GetOptionValue(options.RootProfileOption) @@ -149,7 +149,7 @@ func createConfigFile(cfgFile string) { output.Message(fmt.Sprintf("Creating new Ping CLI configuration file at: %s", cfgFile), nil) // MkdirAll does nothing if directories already exist. Create needed directories for config file location. - err := os.MkdirAll(filepath.Dir(cfgFile), os.ModePerm) + err := os.MkdirAll(filepath.Dir(cfgFile), os.FileMode(0700)) if err != nil { output.SystemError(fmt.Sprintf("Failed to make the directory for the new configuration file '%s': %v", cfgFile, err), nil) } diff --git a/go.mod b/go.mod index ae02929d..2b83edcd 100644 --- a/go.mod +++ b/go.mod @@ -17,10 +17,10 @@ require ( github.com/patrickcping/pingone-go-sdk-v2/mfa v0.23.0 github.com/patrickcping/pingone-go-sdk-v2/risk v0.19.0 github.com/pingidentity/pingfederate-go-client/v1220 v1220.0.0 - github.com/rs/zerolog v1.33.0 + github.com/rs/zerolog v1.34.0 github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.6 - github.com/spf13/viper v1.20.0 + github.com/spf13/viper v1.20.1 golang.org/x/mod v0.24.0 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index d7ece9c4..74998115 100644 --- a/go.sum +++ b/go.sum @@ -494,9 +494,9 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= -github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.3.5 h1:cShyguSwUEeC0jS7ylOiG/idnd1TpJ1LfHGpV3oJmPU= github.com/ryancurrah/gomodguard v1.3.5/go.mod h1:MXlEPQRxgfPQa62O8wzK3Ozbkv9Rkqr+wKjSxTdsNJE= @@ -540,8 +540,8 @@ github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wx github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.20.0 h1:zrxIyR3RQIOsarIrgL8+sAvALXul9jeEPa06Y0Ph6vY= -github.com/spf13/viper v1.20.0/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= +github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= diff --git a/internal/autocompletion/config_args.go b/internal/autocompletion/config_args.go index ca635cb4..44dd2eba 100644 --- a/internal/autocompletion/config_args.go +++ b/internal/autocompletion/config_args.go @@ -32,5 +32,6 @@ func ConfigReturnNonActiveProfilesFunc(cmd *cobra.Command, args []string, toComp nonActiveProfiles = append(nonActiveProfiles, p) } } + return nonActiveProfiles, cobra.ShellCompDirectiveNoFileComp } diff --git a/internal/commands/config/add_profile_internal.go b/internal/commands/config/add_profile_internal.go index 50ac01d8..baa203f4 100644 --- a/internal/commands/config/add_profile_internal.go +++ b/internal/commands/config/add_profile_internal.go @@ -17,12 +17,12 @@ import ( func RunInternalConfigAddProfile(rc io.ReadCloser) (err error) { newProfileName, newDescription, setActive, err := readConfigAddProfileOptions(rc) if err != nil { - return fmt.Errorf("failed to add profile: %v", err) + return fmt.Errorf("failed to add profile: %w", err) } err = profiles.GetMainConfig().ValidateNewProfileName(newProfileName) if err != nil { - return fmt.Errorf("failed to add profile: %v", err) + return fmt.Errorf("failed to add profile: %w", err) } output.Message(fmt.Sprintf("Adding new profile '%s'...", newProfileName), nil) @@ -31,14 +31,14 @@ func RunInternalConfigAddProfile(rc io.ReadCloser) (err error) { subViper.Set(options.ProfileDescriptionOption.ViperKey, newDescription) if err = profiles.GetMainConfig().SaveProfile(newProfileName, subViper); err != nil { - return fmt.Errorf("failed to add profile: %v", err) + return fmt.Errorf("failed to add profile: %w", err) } output.Success(fmt.Sprintf("Profile created. Update additional profile attributes via 'pingcli config set' or directly within the config file at '%s'", profiles.GetMainConfig().ViperInstance().ConfigFileUsed()), nil) if setActive { if err = profiles.GetMainConfig().ChangeActiveProfile(newProfileName); err != nil { - return fmt.Errorf("failed to set active profile: %v", err) + return fmt.Errorf("failed to set active profile: %w", err) } output.Success(fmt.Sprintf("Profile '%s' set as active.", newProfileName), nil) @@ -46,7 +46,7 @@ func RunInternalConfigAddProfile(rc io.ReadCloser) (err error) { err = profiles.GetMainConfig().DefaultMissingViperKeys() if err != nil { - return fmt.Errorf("failed to add profile: %v", err) + return fmt.Errorf("failed to add profile: %w", err) } return nil diff --git a/internal/commands/config/delete_profile_internal.go b/internal/commands/config/delete_profile_internal.go index 89a4ae5b..5fbe2703 100644 --- a/internal/commands/config/delete_profile_internal.go +++ b/internal/commands/config/delete_profile_internal.go @@ -19,17 +19,17 @@ func RunInternalConfigDeleteProfile(args []string, rc io.ReadCloser) (err error) } else { pName, err = promptUserToDeleteProfile(rc) if err != nil { - return fmt.Errorf("failed to delete profile: %v", err) + return fmt.Errorf("failed to delete profile: %w", err) } } if err = profiles.GetMainConfig().ValidateExistingProfileName(pName); err != nil { - return fmt.Errorf("failed to delete profile: %v", err) + return fmt.Errorf("failed to delete profile: %w", err) } confirmed, err := promptUserToConfirmDelete(pName, rc) if err != nil { - return fmt.Errorf("failed to delete profile: %v", err) + return fmt.Errorf("failed to delete profile: %w", err) } if !confirmed { @@ -40,7 +40,7 @@ func RunInternalConfigDeleteProfile(args []string, rc io.ReadCloser) (err error) err = deleteProfile(pName) if err != nil { - return fmt.Errorf("failed to delete profile: %v", err) + return fmt.Errorf("failed to delete profile: %w", err) } return nil diff --git a/internal/commands/config/get_internal.go b/internal/commands/config/get_internal.go index edf62ec2..2aca0583 100644 --- a/internal/commands/config/get_internal.go +++ b/internal/commands/config/get_internal.go @@ -14,12 +14,12 @@ import ( func RunInternalConfigGet(viperKey string) (err error) { if err = configuration.ValidateParentViperKey(viperKey); err != nil { - return fmt.Errorf("failed to get configuration: %v", err) + return fmt.Errorf("failed to get configuration: %w", err) } pName, err := readConfigGetOptions() if err != nil { - return fmt.Errorf("failed to get configuration: %v", err) + return fmt.Errorf("failed to get configuration: %w", err) } msgStr := fmt.Sprintf("Configuration values for profile '%s' and key '%s':\n", strings.ToLower(pName), viperKey) @@ -31,7 +31,7 @@ func RunInternalConfigGet(viperKey string) (err error) { vVal, _, err := profiles.ViperValueFromOption(opt) if err != nil { - return fmt.Errorf("failed to get configuration: %v", err) + return fmt.Errorf("failed to get configuration: %w", err) } unmaskOptionVal, err := profiles.GetOptionValue(options.ConfigUnmaskSecretValueOption) diff --git a/internal/commands/config/list_keys_internal.go b/internal/commands/config/list_keys_internal.go index 16aa0b6b..4e248a06 100644 --- a/internal/commands/config/list_keys_internal.go +++ b/internal/commands/config/list_keys_internal.go @@ -32,7 +32,10 @@ func returnKeysYamlString() (string, error) { } // Create a nested map for each yaml key - currentMap := keyMap + var ( + currentMap = keyMap + currentMapOk bool + ) yamlKeys := strings.Split(viperKey, ".") for i, k := range yamlKeys { // If it's the last yaml key, set an empty map @@ -43,7 +46,10 @@ func returnKeysYamlString() (string, error) { if _, exists := currentMap[k]; !exists { currentMap[k] = make(map[string]interface{}) } - currentMap = currentMap[k].(map[string]interface{}) + currentMap, currentMapOk = currentMap[k].(map[string]interface{}) + if !currentMapOk { + return "", fmt.Errorf("failed to get configuration keys list: error creating nested map for key %s", viperKey) + } } } } @@ -65,6 +71,7 @@ func returnKeysString() (string, error) { return "", fmt.Errorf("unable to retrieve valid keys") } else { validKeysJoined := strings.Join(validKeys, "\n- ") + return "Valid Keys:\n- " + validKeysJoined, nil } } diff --git a/internal/commands/config/list_profiles_internal.go b/internal/commands/config/list_profiles_internal.go index 854be968..99fed27f 100644 --- a/internal/commands/config/list_profiles_internal.go +++ b/internal/commands/config/list_profiles_internal.go @@ -37,6 +37,7 @@ func RunInternalConfigListProfiles() (err error) { description, err := profiles.GetMainConfig().ProfileViperValue(profileName, "description") if err != nil { l.Warn().Msgf("Cannot retrieve profile description for profile %s: %v", profileName, err) + continue } diff --git a/internal/commands/config/set_active_profile_internal.go b/internal/commands/config/set_active_profile_internal.go index 04994f27..96b4ebd3 100644 --- a/internal/commands/config/set_active_profile_internal.go +++ b/internal/commands/config/set_active_profile_internal.go @@ -18,14 +18,14 @@ func RunInternalConfigSetActiveProfile(args []string, rc io.ReadCloser) (err err } else { pName, err = promptUserToSelectActiveProfile(rc) if err != nil { - return fmt.Errorf("failed to set active profile: %v", err) + return fmt.Errorf("failed to set active profile: %w", err) } } output.Message(fmt.Sprintf("Setting active profile to '%s'...", pName), nil) if err = profiles.GetMainConfig().ChangeActiveProfile(pName); err != nil { - return fmt.Errorf("failed to set active profile: %v", err) + return fmt.Errorf("failed to set active profile: %w", err) } output.Success(fmt.Sprintf("Active profile set to '%s'", pName), nil) diff --git a/internal/commands/config/set_internal.go b/internal/commands/config/set_internal.go index e8c0af25..cb3d63f4 100644 --- a/internal/commands/config/set_internal.go +++ b/internal/commands/config/set_internal.go @@ -17,11 +17,11 @@ import ( func RunInternalConfigSet(kvPair string) (err error) { pName, vKey, vValue, err := readConfigSetOptions(kvPair) if err != nil { - return fmt.Errorf("failed to set configuration: %v", err) + return fmt.Errorf("failed to set configuration: %w", err) } if err = configuration.ValidateViperKey(vKey); err != nil { - return fmt.Errorf("failed to set configuration: %v", err) + return fmt.Errorf("failed to set configuration: %w", err) } // Make sure value is not empty, and suggest unset command if it is @@ -31,27 +31,27 @@ func RunInternalConfigSet(kvPair string) (err error) { subViper, err := profiles.GetMainConfig().GetProfileViper(pName) if err != nil { - return fmt.Errorf("failed to set configuration: %v", err) + return fmt.Errorf("failed to set configuration: %w", err) } opt, err := configuration.OptionFromViperKey(vKey) if err != nil { - return fmt.Errorf("failed to set configuration: %v", err) + return fmt.Errorf("failed to set configuration: %w", err) } if err = setValue(subViper, vKey, vValue, opt.Type); err != nil { - return fmt.Errorf("failed to set configuration: %v", err) + return fmt.Errorf("failed to set configuration: %w", err) } if err = profiles.GetMainConfig().SaveProfile(pName, subViper); err != nil { - return fmt.Errorf("failed to set configuration: %v", err) + return fmt.Errorf("failed to set configuration: %w", err) } msgStr := "Configuration set successfully:\n" vVal, _, err := profiles.ViperValueFromOption(opt) if err != nil { - return fmt.Errorf("failed to set configuration: %v", err) + return fmt.Errorf("failed to set configuration: %w", err) } unmaskOptionVal, err := profiles.GetOptionValue(options.ConfigUnmaskSecretValueOption) @@ -112,87 +112,87 @@ func parseKeyValuePair(kvPair string) (string, string, error) { func setValue(profileViper *viper.Viper, vKey, vValue string, valueType options.OptionType) (err error) { switch valueType { case options.ENUM_BOOL: - bool := new(customtypes.Bool) - if err = bool.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be a boolean. Allowed [true, false]: %v", vKey, err) + b := new(customtypes.Bool) + if err = b.Set(vValue); err != nil { + return fmt.Errorf("value for key '%s' must be a boolean. Allowed [true, false]: %w", vKey, err) } - profileViper.Set(vKey, bool) + profileViper.Set(vKey, b) case options.ENUM_EXPORT_FORMAT: exportFormat := new(customtypes.ExportFormat) if err = exportFormat.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be a valid export format. Allowed [%s]: %v", vKey, strings.Join(customtypes.ExportFormatValidValues(), ", "), err) + return fmt.Errorf("value for key '%s' must be a valid export format. Allowed [%s]: %w", vKey, strings.Join(customtypes.ExportFormatValidValues(), ", "), err) } profileViper.Set(vKey, exportFormat) case options.ENUM_EXPORT_SERVICE_GROUP: exportServiceGroup := new(customtypes.ExportServiceGroup) if err = exportServiceGroup.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be valid export service group. Allowed [%s]: %v", vKey, strings.Join(customtypes.ExportServiceGroupValidValues(), ", "), err) + return fmt.Errorf("value for key '%s' must be valid export service group. Allowed [%s]: %w", vKey, strings.Join(customtypes.ExportServiceGroupValidValues(), ", "), err) } profileViper.Set(vKey, exportServiceGroup) case options.ENUM_EXPORT_SERVICES: exportServices := new(customtypes.ExportServices) if err = exportServices.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be valid export service(s). Allowed [%s]: %v", vKey, strings.Join(customtypes.ExportServicesValidValues(), ", "), err) + return fmt.Errorf("value for key '%s' must be valid export service(s). Allowed [%s]: %w", vKey, strings.Join(customtypes.ExportServicesValidValues(), ", "), err) } profileViper.Set(vKey, exportServices) case options.ENUM_OUTPUT_FORMAT: outputFormat := new(customtypes.OutputFormat) if err = outputFormat.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be a valid output format. Allowed [%s]: %v", vKey, strings.Join(customtypes.OutputFormatValidValues(), ", "), err) + return fmt.Errorf("value for key '%s' must be a valid output format. Allowed [%s]: %w", vKey, strings.Join(customtypes.OutputFormatValidValues(), ", "), err) } profileViper.Set(vKey, outputFormat) case options.ENUM_PINGONE_REGION_CODE: region := new(customtypes.PingOneRegionCode) if err = region.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be a valid PingOne Region Code. Allowed [%s]: %v", vKey, strings.Join(customtypes.PingOneRegionCodeValidValues(), ", "), err) + return fmt.Errorf("value for key '%s' must be a valid PingOne Region Code. Allowed [%s]: %w", vKey, strings.Join(customtypes.PingOneRegionCodeValidValues(), ", "), err) } profileViper.Set(vKey, region) case options.ENUM_STRING: str := new(customtypes.String) if err = str.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be a string: %v", vKey, err) + return fmt.Errorf("value for key '%s' must be a string: %w", vKey, err) } profileViper.Set(vKey, str) case options.ENUM_STRING_SLICE: strSlice := new(customtypes.StringSlice) if err = strSlice.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be a string slice: %v", vKey, err) + return fmt.Errorf("value for key '%s' must be a string slice: %w", vKey, err) } profileViper.Set(vKey, strSlice) case options.ENUM_UUID: uuid := new(customtypes.UUID) if err = uuid.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be a valid UUID: %v", vKey, err) + return fmt.Errorf("value for key '%s' must be a valid UUID: %w", vKey, err) } profileViper.Set(vKey, uuid) case options.ENUM_PINGONE_AUTH_TYPE: authType := new(customtypes.PingOneAuthenticationType) if err = authType.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be a valid PingOne Authentication Type. Allowed [%s]: %v", vKey, strings.Join(customtypes.PingOneAuthenticationTypeValidValues(), ", "), err) + return fmt.Errorf("value for key '%s' must be a valid PingOne Authentication Type. Allowed [%s]: %w", vKey, strings.Join(customtypes.PingOneAuthenticationTypeValidValues(), ", "), err) } profileViper.Set(vKey, authType) case options.ENUM_PINGFEDERATE_AUTH_TYPE: authType := new(customtypes.PingFederateAuthenticationType) if err = authType.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be a valid PingFederate Authentication Type. Allowed [%s]: %v", vKey, strings.Join(customtypes.PingFederateAuthenticationTypeValidValues(), ", "), err) + return fmt.Errorf("value for key '%s' must be a valid PingFederate Authentication Type. Allowed [%s]: %w", vKey, strings.Join(customtypes.PingFederateAuthenticationTypeValidValues(), ", "), err) } profileViper.Set(vKey, authType) case options.ENUM_INT: intValue := new(customtypes.Int) if err = intValue.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be an integer: %v", vKey, err) + return fmt.Errorf("value for key '%s' must be an integer: %w", vKey, err) } profileViper.Set(vKey, intValue) case options.ENUM_REQUEST_HTTP_METHOD: httpMethod := new(customtypes.HTTPMethod) if err = httpMethod.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be a valid HTTP method. Allowed [%s]: %v", vKey, strings.Join(customtypes.HTTPMethodValidValues(), ", "), err) + return fmt.Errorf("value for key '%s' must be a valid HTTP method. Allowed [%s]: %w", vKey, strings.Join(customtypes.HTTPMethodValidValues(), ", "), err) } profileViper.Set(vKey, httpMethod) case options.ENUM_REQUEST_SERVICE: service := new(customtypes.RequestService) if err = service.Set(vValue); err != nil { - return fmt.Errorf("value for key '%s' must be a valid request service. Allowed [%s]: %v", vKey, strings.Join(customtypes.RequestServiceValidValues(), ", "), err) + return fmt.Errorf("value for key '%s' must be a valid request service. Allowed [%s]: %w", vKey, strings.Join(customtypes.RequestServiceValidValues(), ", "), err) } profileViper.Set(vKey, service) default: diff --git a/internal/commands/config/unset_internal.go b/internal/commands/config/unset_internal.go index 3207569f..63a651d1 100644 --- a/internal/commands/config/unset_internal.go +++ b/internal/commands/config/unset_internal.go @@ -14,35 +14,35 @@ import ( func RunInternalConfigUnset(viperKey string) (err error) { if err = configuration.ValidateViperKey(viperKey); err != nil { - return fmt.Errorf("failed to unset configuration: %v", err) + return fmt.Errorf("failed to unset configuration: %w", err) } pName, err := readConfigUnsetOptions() if err != nil { - return fmt.Errorf("failed to unset configuration: %v", err) + return fmt.Errorf("failed to unset configuration: %w", err) } subViper, err := profiles.GetMainConfig().GetProfileViper(pName) if err != nil { - return fmt.Errorf("failed to unset configuration: %v", err) + return fmt.Errorf("failed to unset configuration: %w", err) } opt, err := configuration.OptionFromViperKey(viperKey) if err != nil { - return fmt.Errorf("failed to unset configuration: %v", err) + return fmt.Errorf("failed to unset configuration: %w", err) } subViper.Set(viperKey, opt.DefaultValue) if err = profiles.GetMainConfig().SaveProfile(pName, subViper); err != nil { - return fmt.Errorf("failed to unset configuration: %v", err) + return fmt.Errorf("failed to unset configuration: %w", err) } msgStr := "Configuration unset successfully:\n" vVal, _, err := profiles.ViperValueFromOption(opt) if err != nil { - return fmt.Errorf("failed to unset configuration: %v", err) + return fmt.Errorf("failed to unset configuration: %w", err) } unmaskOptionVal, err := profiles.GetOptionValue(options.ConfigUnmaskSecretValueOption) diff --git a/internal/commands/config/view_profile_internal.go b/internal/commands/config/view_profile_internal.go index ebf2fdeb..5197d405 100644 --- a/internal/commands/config/view_profile_internal.go +++ b/internal/commands/config/view_profile_internal.go @@ -18,14 +18,14 @@ func RunInternalConfigViewProfile(args []string) (err error) { } else { pName, err = profiles.GetOptionValue(options.RootActiveProfileOption) if err != nil { - return fmt.Errorf("failed to view profile: %v", err) + return fmt.Errorf("failed to view profile: %w", err) } } // Validate the profile name err = profiles.GetMainConfig().ValidateExistingProfileName(pName) if err != nil { - return fmt.Errorf("failed to view profile: %v", err) + return fmt.Errorf("failed to view profile: %w", err) } msgStr := fmt.Sprintf("Configuration for profile '%s':\n", pName) @@ -37,7 +37,7 @@ func RunInternalConfigViewProfile(args []string) (err error) { vVal, _, err := profiles.ViperValueFromOption(opt) if err != nil { - return fmt.Errorf("failed to view profile: %v", err) + return fmt.Errorf("failed to view profile: %w", err) } unmaskOptionVal, err := profiles.GetOptionValue(options.ConfigUnmaskSecretValueOption) diff --git a/internal/commands/platform/export_internal.go b/internal/commands/platform/export_internal.go index 03fabc05..47c1db65 100644 --- a/internal/commands/platform/export_internal.go +++ b/internal/commands/platform/export_internal.go @@ -140,7 +140,7 @@ func initPingFederateServices(ctx context.Context, pingcliVersion string) (err e caCertPemFile := filepath.Clean(caCertPemFile) caCert, err := os.ReadFile(caCertPemFile) if err != nil { - return fmt.Errorf("failed to read CA certificate PEM file '%s': %v", caCertPemFile, err) + return fmt.Errorf("failed to read CA certificate PEM file '%s': %w", caCertPemFile, err) } ok := caCertPool.AppendCertsFromPEM(caCert) @@ -387,7 +387,7 @@ func createOrValidateOutputDir(outputDir string, overwriteExport bool) (resolved if !filepath.IsAbs(outputDir) { pwd, err := os.Getwd() if err != nil { - return "", fmt.Errorf("failed to get present working directory: %v", err) + return "", fmt.Errorf("failed to get present working directory: %w", err) } outputDir = filepath.Join(pwd, outputDir) @@ -400,25 +400,23 @@ func createOrValidateOutputDir(outputDir string, overwriteExport bool) (resolved if err != nil { output.Message(fmt.Sprintf("Output directory does not exist. Creating the directory at filepath '%s'", outputDir), nil) - err = os.MkdirAll(outputDir, os.ModePerm) + err = os.MkdirAll(outputDir, os.FileMode(0700)) if err != nil { return "", fmt.Errorf("failed to create output directory '%s': %s", outputDir, err.Error()) } output.Success(fmt.Sprintf("Output directory '%s' created", outputDir), nil) - } else { + } else if !overwriteExport { // Check if the output directory is empty // If not, default behavior is to exit and not overwrite. // This can be changed with the --overwrite export parameter - if !overwriteExport { - dirEntries, err := os.ReadDir(outputDir) - if err != nil { - return "", fmt.Errorf("failed to read contents of output directory '%s': %v", outputDir, err) - } - - if len(dirEntries) > 0 { - return "", fmt.Errorf("output directory '%s' is not empty. Use --overwrite to overwrite existing export data", outputDir) - } + dirEntries, err := os.ReadDir(outputDir) + if err != nil { + return "", fmt.Errorf("failed to read contents of output directory '%s': %w", outputDir, err) + } + + if len(dirEntries) > 0 { + return "", fmt.Errorf("output directory '%s' is not empty. Use --overwrite to overwrite existing export data", outputDir) } } diff --git a/internal/commands/platform/export_internal_test.go b/internal/commands/platform/export_internal_test.go index a8381ba5..8fb009b0 100644 --- a/internal/commands/platform/export_internal_test.go +++ b/internal/commands/platform/export_internal_test.go @@ -3,7 +3,6 @@ package platform_internal import ( - "context" "crypto/tls" "net/http" "os" @@ -23,7 +22,7 @@ import ( func TestRunInternalExport(t *testing.T) { testutils_viper.InitVipers(t) - err := RunInternalExport(context.Background(), "v1.2.3") + err := RunInternalExport(t.Context(), "v1.2.3") testutils.CheckExpectedError(t, err, nil) // Check if there are terraform files in the export directory @@ -66,7 +65,7 @@ func TestRunInternalExportNilContext(t *testing.T) { func TestInitPingFederateServices(t *testing.T) { testutils_viper.InitVipers(t) - err := initPingFederateServices(context.Background(), "v1.2.3") + err := initPingFederateServices(t.Context(), "v1.2.3") testutils.CheckExpectedError(t, err, nil) // make sure pf context is not nil @@ -91,7 +90,7 @@ func TestInitPingFederateServicesNilContext(t *testing.T) { func TestInitPingOneServices(t *testing.T) { testutils_viper.InitVipers(t) - err := initPingOneServices(context.Background(), "v1.2.3") + err := initPingOneServices(t.Context(), "v1.2.3") testutils.CheckExpectedError(t, err, nil) // make sure po context is not nil @@ -130,7 +129,7 @@ func TestInitPingFederateApiClientNilTransport(t *testing.T) { func TestInitPingOneApiClient(t *testing.T) { testutils_viper.InitVipers(t) - err := initPingOneApiClient(context.Background(), "v1.2.3") + err := initPingOneApiClient(t.Context(), "v1.2.3") testutils.CheckExpectedError(t, err, nil) // make sure po client is not nil @@ -173,11 +172,14 @@ func TestCreateOrValidateOutputDirExistentDirWithFile(t *testing.T) { outputDir := t.TempDir() - file, err := os.Create(outputDir + "/file") + file, err := os.Create(outputDir + "/file") //#nosec G304 -- This is a test if err != nil { t.Fatalf("os.Create() error = %v", err) } - file.Close() + err = file.Close() + if err != nil { + t.Fatalf("file.Close() error = %v", err) + } _, err = createOrValidateOutputDir(outputDir, true) testutils.CheckExpectedError(t, err, nil) @@ -190,11 +192,14 @@ func TestCreateOrValidateOutputDirExistentDirWithFileNoOverwrite(t *testing.T) { outputDir := t.TempDir() - file, err := os.Create(outputDir + "/file") + file, err := os.Create(outputDir + "/file") //#nosec G304 -- this is a test if err != nil { t.Fatalf("os.Create() error = %v", err) } - file.Close() + err = file.Close() + if err != nil { + t.Fatalf("file.Close() error = %v", err) + } expectedErrorPattern := `^output directory '.*' is not empty\. Use --overwrite to overwrite existing export data$` _, err = createOrValidateOutputDir(outputDir, false) @@ -219,7 +224,7 @@ func TestGetPingOneExportEnvID(t *testing.T) { func TestValidatePingOneExportEnvID(t *testing.T) { testutils_viper.InitVipers(t) - if err := initPingOneApiClient(context.Background(), "v1.2.3"); err != nil { + if err := initPingOneApiClient(t.Context(), "v1.2.3"); err != nil { t.Errorf("initPingOneApiClient() error = %v, want nil", err) } @@ -227,7 +232,7 @@ func TestValidatePingOneExportEnvID(t *testing.T) { t.Errorf("getPingOneExportEnvID() error = %v, want nil", err) } - err := validatePingOneExportEnvID(context.Background()) + err := validatePingOneExportEnvID(t.Context()) testutils.CheckExpectedError(t, err, nil) } @@ -274,7 +279,7 @@ func TestGetExportableConnectorsNilMultiService(t *testing.T) { func TestExportConnectors(t *testing.T) { testutils_viper.InitVipers(t) - err := initPingOneServices(context.Background(), "v1.2.3") + err := initPingOneServices(t.Context(), "v1.2.3") if err != nil { t.Fatalf("initPingOneServices() error = %v", err) } @@ -311,7 +316,7 @@ func TestExportConnectorsEmptyExportableConnectors(t *testing.T) { func TestExportConnectorsInvalidExportFormat(t *testing.T) { testutils_viper.InitVipers(t) - err := initPingOneServices(context.Background(), "v1.2.3") + err := initPingOneServices(t.Context(), "v1.2.3") if err != nil { t.Fatalf("initPingOneServices() error = %v", err) } @@ -334,7 +339,7 @@ func TestExportConnectorsInvalidExportFormat(t *testing.T) { func TestExportConnectorsInvalidOutputDir(t *testing.T) { testutils_viper.InitVipers(t) - err := initPingOneServices(context.Background(), "v1.2.3") + err := initPingOneServices(t.Context(), "v1.2.3") if err != nil { t.Fatalf("initPingOneServices() error = %v", err) } diff --git a/internal/commands/request/request_internal.go b/internal/commands/request/request_internal.go index c39a2ff8..c4998388 100644 --- a/internal/commands/request/request_internal.go +++ b/internal/commands/request/request_internal.go @@ -3,12 +3,15 @@ package request_internal import ( + "context" "encoding/base64" "encoding/json" + "errors" "fmt" "io" "net/http" "os" + "path/filepath" "strconv" "strings" "time" @@ -28,7 +31,7 @@ type PingOneAuthResponse struct { func RunInternalRequest(uri string) (err error) { service, err := profiles.GetOptionValue(options.RequestServiceOption) if err != nil { - return fmt.Errorf("failed to send custom request: %v", err) + return fmt.Errorf("failed to send custom request: %w", err) } if service == "" { @@ -39,7 +42,7 @@ func RunInternalRequest(uri string) (err error) { case customtypes.ENUM_REQUEST_SERVICE_PINGONE: err = runInternalPingOneRequest(uri) if err != nil { - return fmt.Errorf("failed to send custom request: %v", err) + return fmt.Errorf("failed to send custom request: %w", err) } default: return fmt.Errorf("failed to send custom request: unrecognized service '%s'", service) @@ -75,15 +78,22 @@ func runInternalPingOneRequest(uri string) (err error) { return fmt.Errorf("http method is required") } - data, err := getData() + data, err := getDataRaw() if err != nil { return err } + if data == "" { + data, err = getDataFile() + if err != nil { + return err + } + } + payload := strings.NewReader(data) client := &http.Client{} - req, err := http.NewRequest(httpMethod, apiURL, payload) + req, err := http.NewRequestWithContext(context.Background(), httpMethod, apiURL, payload) if err != nil { return err } @@ -96,7 +106,12 @@ func runInternalPingOneRequest(uri string) (err error) { return err } - defer res.Body.Close() + defer func() { + cErr := res.Body.Close() + if cErr != nil { + err = errors.Join(err, cErr) + } + }() body, err := io.ReadAll(res.Body) if err != nil { @@ -111,7 +126,10 @@ func runInternalPingOneRequest(uri string) (err error) { if res.StatusCode < 200 || res.StatusCode >= 300 { output.UserError("Failed Custom Request", fields) if failOption == "true" { - os.Exit(1) + // Allow response body to clean up before exiting + defer os.Exit(1) + + return nil } } else { output.Success("Custom request successful", fields) @@ -221,7 +239,7 @@ func pingoneAuth() (accessToken string, err error) { payload := strings.NewReader("grant_type=client_credentials") client := &http.Client{} - req, err := http.NewRequest(customtypes.ENUM_HTTP_METHOD_POST, authURL, payload) + req, err := http.NewRequestWithContext(context.Background(), customtypes.ENUM_HTTP_METHOD_POST, authURL, payload) if err != nil { return "", err } @@ -234,7 +252,13 @@ func pingoneAuth() (accessToken string, err error) { return "", err } - defer res.Body.Close() + defer func() { + cErr := res.Body.Close() + if cErr != nil { + err = errors.Join(err, cErr) + } + }() + responseBodyBytes, err := io.ReadAll(res.Body) if err != nil { return "", err @@ -281,22 +305,15 @@ func pingoneAuth() (accessToken string, err error) { return pingoneAuthResponse.AccessToken, nil } -func getData() (data string, err error) { - data, err = profiles.GetOptionValue(options.RequestDataRawOption) +func getDataFile() (data string, err error) { + dataFilepath, err := profiles.GetOptionValue(options.RequestDataOption) if err != nil { return "", err } - if data != "" { - return data, nil - } - // get data from file - data, err = profiles.GetOptionValue(options.RequestDataOption) - if err != nil { - return "", err - } - if data != "" { - contents, err := os.ReadFile(data) + if dataFilepath != "" { + dataFilepath = filepath.Clean(dataFilepath) + contents, err := os.ReadFile(dataFilepath) if err != nil { return "", err } @@ -304,5 +321,14 @@ func getData() (data string, err error) { return string(contents), nil } + return "", nil +} + +func getDataRaw() (data string, err error) { + data, err = profiles.GetOptionValue(options.RequestDataRawOption) + if err != nil { + return "", err + } + return data, nil } diff --git a/internal/commands/request/request_internal_test.go b/internal/commands/request/request_internal_test.go index 14397ea8..f4e633c5 100644 --- a/internal/commands/request/request_internal_test.go +++ b/internal/commands/request/request_internal_test.go @@ -3,6 +3,7 @@ package request_internal import ( + "errors" "fmt" "os" "os/exec" @@ -26,7 +27,6 @@ func Test_RunInternalRequest(t *testing.T) { // Test RunInternalRequest function with fail func Test_RunInternalRequestWithFail(t *testing.T) { - if os.Getenv("RUN_INTERNAL_FAIL_TEST") == "true" { testutils_viper.InitVipers(t) t.Setenv(options.RequestServiceOption.EnvVar, "pingone") @@ -39,12 +39,17 @@ func Test_RunInternalRequestWithFail(t *testing.T) { t.Fatal("This should never run due to internal request resulting in os.Exit(1)") } else { cmdName := os.Args[0] - cmd := exec.Command(cmdName, "-test.run=Test_RunInternalRequestWithFail") + cmd := exec.Command(cmdName, "-test.run=Test_RunInternalRequestWithFail") //#nosec G204 -- This is a test cmd.Env = append(os.Environ(), "RUN_INTERNAL_FAIL_TEST=true") err := cmd.Run() - if exitError, ok := err.(*exec.ExitError); ok && !exitError.Success() { - return + + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + if !exitErr.Success() { + return + } } + t.Fatalf("The process did not exit with a non-zero: %s", err) } } @@ -53,9 +58,12 @@ func Test_RunInternalRequestWithFail(t *testing.T) { func Test_RunInternalRequest_EmptyService(t *testing.T) { testutils_viper.InitVipers(t) - os.Unsetenv(options.RequestServiceOption.EnvVar) + err := os.Unsetenv(options.RequestServiceOption.EnvVar) + if err != nil { + t.Fatalf("failed to unset environment variable: %v", err) + } - err := RunInternalRequest("environments") + err = RunInternalRequest("environments") expectedErrorPattern := "failed to send custom request: service is required" testutils.CheckExpectedError(t, err, &expectedErrorPattern) } @@ -169,13 +177,13 @@ func Test_pingoneAuth_InvalidCredentials(t *testing.T) { } // Test getData function -func Test_getData(t *testing.T) { +func Test_getDataRaw(t *testing.T) { testutils_viper.InitVipers(t) expectedData := "{data: 'json'}" t.Setenv(options.RequestDataRawOption.EnvVar, expectedData) - data, err := getData() + data, err := getDataRaw() testutils.CheckExpectedError(t, err, nil) if data != expectedData { @@ -184,12 +192,12 @@ func Test_getData(t *testing.T) { } // Test getData function with empty data -func Test_getData_EmptyData(t *testing.T) { +func Test_getDataRaw_EmptyData(t *testing.T) { testutils_viper.InitVipers(t) t.Setenv(options.RequestDataRawOption.EnvVar, "") - data, err := getData() + data, err := getDataRaw() testutils.CheckExpectedError(t, err, nil) if data != "" { @@ -198,7 +206,7 @@ func Test_getData_EmptyData(t *testing.T) { } // Test getData function with file input -func Test_getData_FileInput(t *testing.T) { +func Test_getDataFile_FileInput(t *testing.T) { testutils_viper.InitVipers(t) expectedData := "{data: 'json from file'}" @@ -211,7 +219,7 @@ func Test_getData_FileInput(t *testing.T) { t.Setenv(options.RequestDataOption.EnvVar, testFile) - data, err := getData() + data, err := getDataFile() testutils.CheckExpectedError(t, err, nil) if data != expectedData { @@ -220,12 +228,12 @@ func Test_getData_FileInput(t *testing.T) { } // Test getData function with non-existent file input -func Test_getData_NonExistentFileInput(t *testing.T) { +func Test_getDataFile_NonExistentFileInput(t *testing.T) { testutils_viper.InitVipers(t) t.Setenv(options.RequestDataOption.EnvVar, "non_existent_file.json") - _, err := getData() + _, err := getDataFile() expectedErrorPattern := `^open .*: no such file or directory$` testutils.CheckExpectedError(t, err, &expectedErrorPattern) } diff --git a/internal/configuration/configuration.go b/internal/configuration/configuration.go index 4c13d722..c47db193 100644 --- a/internal/configuration/configuration.go +++ b/internal/configuration/configuration.go @@ -24,6 +24,7 @@ func ViperKeys() (keys []string) { } slices.Sort(keys) + return keys } @@ -46,7 +47,7 @@ func ExpandedViperKeys() (keys []string) { leafKeys := ViperKeys() for _, key := range leafKeys { keySplit := strings.Split(key, ".") - for i := 0; i < len(keySplit); i++ { + for i := range keySplit { curKey := strings.Join(keySplit[:i+1], ".") if !slices.ContainsFunc(keys, func(v string) bool { return strings.EqualFold(v, curKey) @@ -57,6 +58,7 @@ func ExpandedViperKeys() (keys []string) { } slices.Sort(keys) + return keys } @@ -77,6 +79,7 @@ func OptionFromViperKey(viperKey string) (opt options.Option, err error) { return opt, nil } } + return opt, fmt.Errorf("failed to get option: no option found for viper key: %s", viperKey) } diff --git a/internal/configuration/options/options_test.go b/internal/configuration/options/options_test.go index 9e12aae2..f6ca0d06 100644 --- a/internal/configuration/options/options_test.go +++ b/internal/configuration/options/options_test.go @@ -13,7 +13,6 @@ import ( ) func Test_outputOptionsMDInfo(t *testing.T) { - // Skip this test. Use only to generate markdown table for documentation t.SkipNow() diff --git a/internal/configuration/platform/export.go b/internal/configuration/platform/export.go index 40609728..efce00e8 100644 --- a/internal/configuration/platform/export.go +++ b/internal/configuration/platform/export.go @@ -66,7 +66,7 @@ func initServiceGroupOption() { "\nOptions are: %s."+ "\nExample: '%s'", strings.Join(customtypes.ExportServiceGroupValidValues(), ", "), - string(customtypes.ENUM_EXPORT_SERVICE_GROUP_PINGONE), + customtypes.ENUM_EXPORT_SERVICE_GROUP_PINGONE, ), Value: cobraValue, }, @@ -94,9 +94,9 @@ func initServicesOption() { "\nOptions are: %s."+ "\nExample: '%s,%s,%s'", strings.Join(customtypes.ExportServicesValidValues(), ", "), - string(customtypes.ENUM_EXPORT_SERVICE_PINGONE_SSO), - string(customtypes.ENUM_EXPORT_SERVICE_PINGONE_MFA), - string(customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE), + customtypes.ENUM_EXPORT_SERVICE_PINGONE_SSO, + customtypes.ENUM_EXPORT_SERVICE_PINGONE_MFA, + customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE, ), Value: cobraValue, }, diff --git a/internal/configuration/root/root.go b/internal/configuration/root/root.go index 6ba4632e..f59f9287 100644 --- a/internal/configuration/root/root.go +++ b/internal/configuration/root/root.go @@ -190,12 +190,14 @@ func getDefaultConfigFilepath() (defaultConfigFilepath *customtypes.String) { homeDir, err := os.UserHomeDir() if err != nil { l.Err(err).Msg("Failed to determine user's home directory") + return nil } err = defaultConfigFilepath.Set(fmt.Sprintf("%s/.pingcli/config.yaml", homeDir)) if err != nil { l.Err(err).Msg("Failed to set default config file path") + return nil } diff --git a/internal/configuration/services/pingone.go b/internal/configuration/services/pingone.go index 115cbcb6..18c46e88 100644 --- a/internal/configuration/services/pingone.go +++ b/internal/configuration/services/pingone.go @@ -17,7 +17,6 @@ func InitPingOneServiceOptions() { initAuthenticationWorkerClientSecretOption() initAuthenticationWorkerEnvironmentIDOption() initRegionCodeOption() - } func initAuthenticationWorkerClientIDOption() { diff --git a/internal/connector/common/common_utils.go b/internal/connector/common/common_utils.go index 68570da7..999748e7 100644 --- a/internal/connector/common/common_utils.go +++ b/internal/connector/common/common_utils.go @@ -3,6 +3,7 @@ package common import ( + "errors" "fmt" "os" "path/filepath" @@ -16,7 +17,7 @@ import ( "github.com/pingidentity/pingcli/internal/logger" ) -func WriteFiles(exportableResources []connector.ExportableResource, format, outputDir string, overwriteExport bool) error { +func WriteFiles(exportableResources []connector.ExportableResource, format, outputDir string, overwriteExport bool) (err error) { l := logger.Get() // Parse the HCL import block template @@ -34,6 +35,7 @@ func WriteFiles(exportableResources []connector.ExportableResource, format, outp if len(*importBlocks) == 0 { // No resources exported. Avoid creating an empty import.tf file l.Debug().Msgf("Nothing exported for resource %s. Skipping import file generation...", exportableResource.ResourceType()) + continue } @@ -46,6 +48,7 @@ func WriteFiles(exportableResources []connector.ExportableResource, format, outp outputFileName := fmt.Sprintf("%s.tf", exportableResource.ResourceType()) outputFilePath := filepath.Join(outputDir, filepath.Base(outputFileName)) + outputFilePath = filepath.Clean(outputFilePath) // Check to see if outputFile already exists. // If so, default behavior is to exit and not overwrite. @@ -59,7 +62,12 @@ func WriteFiles(exportableResources []connector.ExportableResource, format, outp if err != nil { return fmt.Errorf("failed to create export file %q. err: %s", outputFilePath, err.Error()) } - defer outputFile.Close() + defer func() { + cErr := outputFile.Close() + if cErr != nil { + err = errors.Join(err, cErr) + } + }() err = writeHeader(format, outputFilePath, outputFile) if err != nil { @@ -67,7 +75,7 @@ func WriteFiles(exportableResources []connector.ExportableResource, format, outp } for _, importBlock := range *importBlocks { - // Sanitize import block "to". Add pingcli-- prefix, hexidecimal encode special chars and spaces + // Sanitize import block "to". Add pingcli-- prefix, hexadecimal encode special chars and spaces importBlock.Sanitize() switch format { @@ -81,6 +89,7 @@ func WriteFiles(exportableResources []connector.ExportableResource, format, outp } } } + return nil } diff --git a/internal/connector/common/resources_common.go b/internal/connector/common/resources_common.go index 370024e8..f32ddc21 100644 --- a/internal/connector/common/resources_common.go +++ b/internal/connector/common/resources_common.go @@ -3,6 +3,7 @@ package common import ( + "errors" "fmt" "maps" "net/http" @@ -24,20 +25,21 @@ func CheckSingletonResource(response *http.Response, err error, apiFuncName, res return false, nil } - if response.StatusCode == 204 { + if response.StatusCode == http.StatusNoContent { output.Warn("API client 204 No Content response.", map[string]interface{}{ "API Function Name": apiFuncName, "Resource Type": resourceType, "Response Code": response.Status, "Response Body": response.Body, }) + return false, nil } return true, nil } -func HandleClientResponse(response *http.Response, err error, apiFunctionName string, resourceType string) (bool, error) { +func HandleClientResponse(response *http.Response, err error, apiFunctionName string, resourceType string) (b bool, rErr error) { if err != nil { // Only warn the user on client error and skip export of resource output.Warn("API client error.", map[string]interface{}{ @@ -52,10 +54,16 @@ func HandleClientResponse(response *http.Response, err error, apiFunctionName st if response == nil { return false, fmt.Errorf("%s Request for resource '%s' was not successful. Response is nil", apiFunctionName, resourceType) } - defer response.Body.Close() + + defer func() { + cErr := response.Body.Close() + if cErr != nil { + rErr = errors.Join(rErr, cErr) + } + }() // When the client returns forbidden, warn user and skip export of resource - if response.StatusCode == 403 { + if response.StatusCode == http.StatusForbidden { output.Warn("API client 403 forbidden response.", map[string]interface{}{ "API Function Name": apiFunctionName, "Resource Type": resourceType, diff --git a/internal/connector/exportable_resource.go b/internal/connector/exportable_resource.go index 5871eea7..8cc584f9 100644 --- a/internal/connector/exportable_resource.go +++ b/internal/connector/exportable_resource.go @@ -34,7 +34,7 @@ type ExportableResource interface { } func (b *ImportBlock) Sanitize() { - // Hexidecimal encode special characters + // Hexadecimal encode special characters b.ResourceName = regexp.MustCompile(`[^0-9A-Za-z_\-]`).ReplaceAllStringFunc(b.ResourceName, func(s string) string { return fmt.Sprintf("-%04X-", s) }) @@ -65,5 +65,6 @@ import { to = %s.%s id = "%s" }` + return fmt.Sprintf(pattern, b.CommentInformation, b.ResourceType, b.ResourceName, b.ResourceID) } diff --git a/internal/connector/pingfederate/pingfederate_connector_test.go b/internal/connector/pingfederate/pingfederate_connector_test.go index b936197d..c153a7e3 100644 --- a/internal/connector/pingfederate/pingfederate_connector_test.go +++ b/internal/connector/pingfederate/pingfederate_connector_test.go @@ -7,7 +7,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" "github.com/pingidentity/pingcli/internal/testing/testutils_terraform" ) @@ -23,378 +23,378 @@ func TestPingFederateTerraformPlan(t *testing.T) { }{ { name: "PingFederateAuthenticationApiApplication", - testableResource: pingfederate.TestableResource_PingFederateAuthenticationApiApplication(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.AuthenticationApiApplication(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateAuthenticationApiSettings", - testableResource: pingfederate.TestableResource_PingFederateAuthenticationApiSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.AuthenticationApiSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateAuthenticationPolicies", - testableResource: pingfederate.TestableResource_PingFederateAuthenticationPolicies(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.AuthenticationPolicies(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateAuthenticationPoliciesFragment", - testableResource: pingfederate.TestableResource_PingFederateAuthenticationPoliciesFragment(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.AuthenticationPoliciesFragment(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateAuthenticationPoliciesSettings", - testableResource: pingfederate.TestableResource_PingFederateAuthenticationPoliciesSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.AuthenticationPoliciesSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateAuthenticationPolicyContract", - testableResource: pingfederate.TestableResource_PingFederateAuthenticationPolicyContract(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.AuthenticationPolicyContract(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateAuthenticationSelector", - testableResource: pingfederate.TestableResource_PingFederateAuthenticationSelector(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.AuthenticationSelector(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateCaptchaProvider", - testableResource: pingfederate.TestableResource_PingFederateCaptchaProvider(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.CaptchaProvider(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateCaptchaProviderSettings", - testableResource: pingfederate.TestableResource_PingFederateCaptchaProviderSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.CaptchaProviderSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateCertificateCa", - testableResource: pingfederate.TestableResource_PingFederateCertificateCa(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.CertificateCa(t, pingFederateClientInfo), ignoredErrors: []string{ "Error: Invalid Attribute Value Length", }, }, { name: "PingFederateCertificatesRevocationOcspCertificate", - testableResource: pingfederate.TestableResource_PingFederateCertificatesRevocationOcspCertificate(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.CertificatesRevocationOcspCertificate(t, pingFederateClientInfo), ignoredErrors: []string{ "Error: Missing Configuration for Required Attribute", }, }, { name: "PingFederateCertificatesRevocationSettings", - testableResource: pingfederate.TestableResource_PingFederateCertificatesRevocationSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.CertificatesRevocationSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateClusterSettings", - testableResource: pingfederate.TestableResource_PingFederateClusterSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ClusterSettings(t, pingFederateClientInfo), ignoredErrors: []string{ "Error: PingFederate API error", }, }, { name: "PingFederateConfigurationEncryptionKeysRotate", - testableResource: pingfederate.TestableResource_PingFederateConfigurationEncryptionKeysRotate(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ConfigurationEncryptionKeysRotate(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateDataStore", - testableResource: pingfederate.TestableResource_PingFederateDataStore(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.DataStore(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateDefaultUrls", - testableResource: pingfederate.TestableResource_PingFederateDefaultUrls(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.DefaultUrls(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateExtendedProperties", - testableResource: pingfederate.TestableResource_PingFederateExtendedProperties(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ExtendedProperties(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateIdentityStoreProvisioner", - testableResource: pingfederate.TestableResource_PingFederateIdentityStoreProvisioner(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.IdentityStoreProvisioner(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateIdpAdapter", - testableResource: pingfederate.TestableResource_PingFederateIdpAdapter(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.IdpAdapter(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateIdpSpConnection", - testableResource: pingfederate.TestableResource_PingFederateIdpSpConnection(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.IdpSpConnection(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateIdpStsRequestParametersContract", - testableResource: pingfederate.TestableResource_PingFederateIdpStsRequestParametersContract(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.IdpStsRequestParametersContract(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateIdpTokenProcessor", - testableResource: pingfederate.TestableResource_PingFederateIdpTokenProcessor(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.IdpTokenProcessor(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateIdpToSpAdapterMapping", - testableResource: pingfederate.TestableResource_PingFederateIdpToSpAdapterMapping(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.IdpToSpAdapterMapping(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateIncomingProxySettings", - testableResource: pingfederate.TestableResource_PingFederateIncomingProxySettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.IncomingProxySettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateKerberosRealm", - testableResource: pingfederate.TestableResource_PingFederateKerberosRealm(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.KerberosRealm(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateKerberosRealmSettings", - testableResource: pingfederate.TestableResource_PingFederateKerberosRealmSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.KerberosRealmSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateKeypairsOauthOpenidConnect", - testableResource: pingfederate.TestableResource_PingFederateKeypairsOauthOpenidConnect(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.KeypairsOauthOpenidConnect(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateKeypairsOauthOpenidConnectAdditionalKeySet", - testableResource: pingfederate.TestableResource_PingFederateKeypairsOauthOpenidConnectAdditionalKeySet(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.KeypairsOauthOpenidConnectAdditionalKeySet(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateKeypairsSigningKeyRotationSettings", - testableResource: pingfederate.TestableResource_PingFederateKeypairsSigningKeyRotationSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.KeypairsSigningKeyRotationSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateKeypairsSslServerSettings", - testableResource: pingfederate.TestableResource_PingFederateKeypairsSslServerSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.KeypairsSslServerSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateLocalIdentityProfile", - testableResource: pingfederate.TestableResource_PingFederateLocalIdentityProfile(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.LocalIdentityProfile(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateMetadataUrl", - testableResource: pingfederate.TestableResource_PingFederateMetadataUrl(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.MetadataUrl(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateNotificationPublisher", - testableResource: pingfederate.TestableResource_PingFederateNotificationPublisher(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.NotificationPublisher(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateNotificationPublisherSettings", - testableResource: pingfederate.TestableResource_PingFederateNotificationPublisherSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.NotificationPublisherSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthAccessTokenManager", - testableResource: pingfederate.TestableResource_PingFederateOauthAccessTokenManager(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthAccessTokenManager(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthAccessTokenManagerSettings", - testableResource: pingfederate.TestableResource_PingFederateOauthAccessTokenManagerSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthAccessTokenManagerSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthAccessTokenMapping", - testableResource: pingfederate.TestableResource_PingFederateOauthAccessTokenMapping(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthAccessTokenMapping(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthAuthenticationPolicyContractMapping", - testableResource: pingfederate.TestableResource_PingFederateOauthAuthenticationPolicyContractMapping(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthAuthenticationPolicyContractMapping(t, pingFederateClientInfo), ignoredErrors: nil, }, // TODO: Re-enable this test after PingFederate OOB Plugin API is triaged // { // name: "PingFederateOauthCibaServerPolicyRequestPolicy", - // testableResource: pingfederate.TestableResource_PingFederateOauthCibaServerPolicyRequestPolicy(t, pingFederateClientInfo), + // testableResource: pingfederate_testable_resources.OauthCibaServerPolicyRequestPolicy(t, pingFederateClientInfo), // ignoredErrors: nil, // }, { name: "PingFederateOauthCibaServerPolicySettings", - testableResource: pingfederate.TestableResource_PingFederateOauthCibaServerPolicySettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthCibaServerPolicySettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthClient", - testableResource: pingfederate.TestableResource_PingFederateOauthClient(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthClient(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthClientRegistrationPolicy", - testableResource: pingfederate.TestableResource_PingFederateOauthClientRegistrationPolicy(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthClientRegistrationPolicy(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthClientSettings", - testableResource: pingfederate.TestableResource_PingFederateOauthClientSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthClientSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthIdpAdapterMapping", - testableResource: pingfederate.TestableResource_PingFederateOauthIdpAdapterMapping(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthIdpAdapterMapping(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthIssuer", - testableResource: pingfederate.TestableResource_PingFederateOauthIssuer(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthIssuer(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthServerSettings", - testableResource: pingfederate.TestableResource_PingFederateOauthServerSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthServerSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthTokenExchangeGeneratorSettings", - testableResource: pingfederate.TestableResource_PingFederateOauthTokenExchangeGeneratorSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthTokenExchangeGeneratorSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOauthTokenExchangeTokenGeneratorMapping", - testableResource: pingfederate.TestableResource_PingFederateOauthTokenExchangeTokenGeneratorMapping(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OauthTokenExchangeTokenGeneratorMapping(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOpenidConnectPolicy", - testableResource: pingfederate.TestableResource_PingFederateOpenidConnectPolicy(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OpenidConnectPolicy(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateOpenidConnectSettings", - testableResource: pingfederate.TestableResource_PingFederateOpenidConnectSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.OpenidConnectSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederatePasswordCredentialValidator", - testableResource: pingfederate.TestableResource_PingFederatePasswordCredentialValidator(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.PasswordCredentialValidator(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederatePingoneConnection", - testableResource: pingfederate.TestableResource_PingFederatePingoneConnection(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.PingoneConnection(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateProtocolMetadataLifetimeSettings", - testableResource: pingfederate.TestableResource_PingFederateProtocolMetadataLifetimeSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ProtocolMetadataLifetimeSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateProtocolMetadataSigningSettings", - testableResource: pingfederate.TestableResource_PingFederateProtocolMetadataSigningSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ProtocolMetadataSigningSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateRedirectValidation", - testableResource: pingfederate.TestableResource_PingFederateRedirectValidation(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.RedirectValidation(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateSecretManager", - testableResource: pingfederate.TestableResource_PingFederateSecretManager(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.SecretManager(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateServerSettings", - testableResource: pingfederate.TestableResource_PingFederateServerSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ServerSettings(t, pingFederateClientInfo), ignoredErrors: []string{ "Error: Invalid Attribute Value Length", }, }, { name: "PingFederateServerSettingsGeneral", - testableResource: pingfederate.TestableResource_PingFederateServerSettingsGeneral(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ServerSettingsGeneral(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateServerSettingsLogging", - testableResource: pingfederate.TestableResource_PingFederateServerSettingsLogging(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ServerSettingsLogging(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateServerSettingsSystemKeysRotate", - testableResource: pingfederate.TestableResource_PingFederateServerSettingsSystemKeysRotate(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ServerSettingsSystemKeysRotate(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateServerSettingsWsTrustStsSettings", - testableResource: pingfederate.TestableResource_PingFederateServerSettingsWsTrustStsSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ServerSettingsWsTrustStsSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateServerSettingsWsTrustStsSettingsIssuerCertificate", - testableResource: pingfederate.TestableResource_PingFederateServerSettingsWsTrustStsSettingsIssuerCertificate(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ServerSettingsWsTrustStsSettingsIssuerCertificate(t, pingFederateClientInfo), ignoredErrors: []string{ "Error: Missing Configuration for Required Attribute", }, }, { name: "PingFederateServiceAuthentication", - testableResource: pingfederate.TestableResource_PingFederateServiceAuthentication(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.ServiceAuthentication(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateSessionApplicationPolicy", - testableResource: pingfederate.TestableResource_PingFederateSessionApplicationPolicy(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.SessionApplicationPolicy(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateSessionAuthenticationPoliciesGlobal", - testableResource: pingfederate.TestableResource_PingFederateSessionAuthenticationPoliciesGlobal(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.SessionAuthenticationPoliciesGlobal(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateSessionAuthenticationPolicy", - testableResource: pingfederate.TestableResource_PingFederateSessionAuthenticationPolicy(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.SessionAuthenticationPolicy(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateSessionSettings", - testableResource: pingfederate.TestableResource_PingFederateSessionSettings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.SessionSettings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateSpAdapter", - testableResource: pingfederate.TestableResource_PingFederateSpAdapter(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.SpAdapter(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateSpAuthenticationPolicyContractMapping", - testableResource: pingfederate.TestableResource_PingFederateSpAuthenticationPolicyContractMapping(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.SpAuthenticationPolicyContractMapping(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateSpIdpConnection", - testableResource: pingfederate.TestableResource_PingFederateSpIdpConnection(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.SpIdpConnection(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateSpTargetUrlMappings", - testableResource: pingfederate.TestableResource_PingFederateSpTargetUrlMappings(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.SpTargetUrlMappings(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateTokenProcessorToTokenGeneratorMapping", - testableResource: pingfederate.TestableResource_PingFederateTokenProcessorToTokenGeneratorMapping(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.TokenProcessorToTokenGeneratorMapping(t, pingFederateClientInfo), ignoredErrors: nil, }, { name: "PingFederateVirtualHostNames", - testableResource: pingfederate.TestableResource_PingFederateVirtualHostNames(t, pingFederateClientInfo), + testableResource: pingfederate_testable_resources.VirtualHostNames(t, pingFederateClientInfo), ignoredErrors: nil, }, } diff --git a/internal/connector/pingfederate/resources/authentication_api_application.go b/internal/connector/pingfederate/resources/authentication_api_application.go index 4c166866..7157ce63 100644 --- a/internal/connector/pingfederate/resources/authentication_api_application.go +++ b/internal/connector/pingfederate/resources/authentication_api_application.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateAuthenticationApiApplicationResource) getAuthenticationApiA return nil, err } if !ok { - return nil, nil + return authenticationApiApplicationData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/authentication_api_application_test.go b/internal/connector/pingfederate/resources/authentication_api_application_test.go index ba9d8b77..ccd71ba8 100644 --- a/internal/connector/pingfederate/resources/authentication_api_application_test.go +++ b/internal/connector/pingfederate/resources/authentication_api_application_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateAuthenticationApiApplication(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateAuthenticationApiApplication(t, clientInfo) + tr := pingfederate_testable_resources.AuthenticationApiApplication(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/authentication_api_settings.go b/internal/connector/pingfederate/resources/authentication_api_settings.go index 78ae490a..9042e91f 100644 --- a/internal/connector/pingfederate/resources/authentication_api_settings.go +++ b/internal/connector/pingfederate/resources/authentication_api_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/authentication_api_settings_test.go b/internal/connector/pingfederate/resources/authentication_api_settings_test.go index eee0e207..aa0436f5 100644 --- a/internal/connector/pingfederate/resources/authentication_api_settings_test.go +++ b/internal/connector/pingfederate/resources/authentication_api_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateAuthenticationApiSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.AuthenticationApiSettings(clientInfo) + tr := pingfederate_testable_resources.AuthenticationApiSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Authentication Api Settings", ResourceID: "authentication_api_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/authentication_policies.go b/internal/connector/pingfederate/resources/authentication_policies.go index 50bb089e..edd77c1a 100644 --- a/internal/connector/pingfederate/resources/authentication_policies.go +++ b/internal/connector/pingfederate/resources/authentication_policies.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/authentication_policies_fragment.go b/internal/connector/pingfederate/resources/authentication_policies_fragment.go index bb3081be..c7d36111 100644 --- a/internal/connector/pingfederate/resources/authentication_policies_fragment.go +++ b/internal/connector/pingfederate/resources/authentication_policies_fragment.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateAuthenticationPoliciesFragmentResource) getAuthenticationPo return nil, err } if !ok { - return nil, nil + return authenticationPoliciesFragmentData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/authentication_policies_fragment_test.go b/internal/connector/pingfederate/resources/authentication_policies_fragment_test.go index 882c5178..e59246f3 100644 --- a/internal/connector/pingfederate/resources/authentication_policies_fragment_test.go +++ b/internal/connector/pingfederate/resources/authentication_policies_fragment_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateAuthenticationPoliciesFragment(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateAuthenticationPoliciesFragment(t, clientInfo) + tr := pingfederate_testable_resources.AuthenticationPoliciesFragment(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/authentication_policies_settings.go b/internal/connector/pingfederate/resources/authentication_policies_settings.go index f3723f4a..e21f7bb2 100644 --- a/internal/connector/pingfederate/resources/authentication_policies_settings.go +++ b/internal/connector/pingfederate/resources/authentication_policies_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/authentication_policies_settings_test.go b/internal/connector/pingfederate/resources/authentication_policies_settings_test.go index 461aa73c..ce5206a7 100644 --- a/internal/connector/pingfederate/resources/authentication_policies_settings_test.go +++ b/internal/connector/pingfederate/resources/authentication_policies_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateAuthenticationPoliciesSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.AuthenticationPoliciesSettings(clientInfo) + tr := pingfederate_testable_resources.AuthenticationPoliciesSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Authentication Policies Settings", ResourceID: "authentication_policies_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/authentication_policies_test.go b/internal/connector/pingfederate/resources/authentication_policies_test.go index d91dd916..54678615 100644 --- a/internal/connector/pingfederate/resources/authentication_policies_test.go +++ b/internal/connector/pingfederate/resources/authentication_policies_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateAuthenticationPolicies(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.AuthenticationPolicies(clientInfo) + tr := pingfederate_testable_resources.AuthenticationPolicies(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Authentication Policies", ResourceID: "authentication_policies_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/authentication_policy_contract.go b/internal/connector/pingfederate/resources/authentication_policy_contract.go index f09d414c..8256142d 100644 --- a/internal/connector/pingfederate/resources/authentication_policy_contract.go +++ b/internal/connector/pingfederate/resources/authentication_policy_contract.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateAuthenticationPolicyContractResource) getAuthenticationPoli return nil, err } if !ok { - return nil, nil + return authenticationPolicyContractData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/authentication_policy_contract_test.go b/internal/connector/pingfederate/resources/authentication_policy_contract_test.go index 7da4826d..b6f5cc27 100644 --- a/internal/connector/pingfederate/resources/authentication_policy_contract_test.go +++ b/internal/connector/pingfederate/resources/authentication_policy_contract_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateAuthenticationPolicyContract(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateAuthenticationPolicyContract(t, clientInfo) + tr := pingfederate_testable_resources.AuthenticationPolicyContract(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/authentication_selector.go b/internal/connector/pingfederate/resources/authentication_selector.go index e129aa55..64f4203d 100644 --- a/internal/connector/pingfederate/resources/authentication_selector.go +++ b/internal/connector/pingfederate/resources/authentication_selector.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateAuthenticationSelectorResource) getAuthenticationSelectorDa return nil, err } if !ok { - return nil, nil + return authenticationSelectorData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/authentication_selector_test.go b/internal/connector/pingfederate/resources/authentication_selector_test.go index 5481dba7..33b4007b 100644 --- a/internal/connector/pingfederate/resources/authentication_selector_test.go +++ b/internal/connector/pingfederate/resources/authentication_selector_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateAuthenticationSelector(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateAuthenticationSelector(t, clientInfo) + tr := pingfederate_testable_resources.AuthenticationSelector(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/captcha_provider.go b/internal/connector/pingfederate/resources/captcha_provider.go index 74a7719b..498b3272 100644 --- a/internal/connector/pingfederate/resources/captcha_provider.go +++ b/internal/connector/pingfederate/resources/captcha_provider.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateCaptchaProviderResource) getCaptchaProviderData() (map[stri return nil, err } if !ok { - return nil, nil + return captchaProviderData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/captcha_provider_settings.go b/internal/connector/pingfederate/resources/captcha_provider_settings.go index 092e73d4..8f1a344d 100644 --- a/internal/connector/pingfederate/resources/captcha_provider_settings.go +++ b/internal/connector/pingfederate/resources/captcha_provider_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/captcha_provider_settings_test.go b/internal/connector/pingfederate/resources/captcha_provider_settings_test.go index 87d3e646..bbf1c393 100644 --- a/internal/connector/pingfederate/resources/captcha_provider_settings_test.go +++ b/internal/connector/pingfederate/resources/captcha_provider_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateCaptchaProviderSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.CaptchaProviderSettings(clientInfo) + tr := pingfederate_testable_resources.CaptchaProviderSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Captcha Provider Settings", ResourceID: "captcha_provider_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/captcha_provider_test.go b/internal/connector/pingfederate/resources/captcha_provider_test.go index d96b2d95..c01d3183 100644 --- a/internal/connector/pingfederate/resources/captcha_provider_test.go +++ b/internal/connector/pingfederate/resources/captcha_provider_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateCaptchaProvider(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateCaptchaProvider(t, clientInfo) + tr := pingfederate_testable_resources.CaptchaProvider(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/certificate_ca.go b/internal/connector/pingfederate/resources/certificate_ca.go index d7bf0b8c..ce9c9020 100644 --- a/internal/connector/pingfederate/resources/certificate_ca.go +++ b/internal/connector/pingfederate/resources/certificate_ca.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -74,7 +75,7 @@ func (r *PingFederateCertificateCaResource) getCertificateCaData() (map[string][ return nil, err } if !ok { - return nil, nil + return certificateCaData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/certificate_ca_test.go b/internal/connector/pingfederate/resources/certificate_ca_test.go index 4ed82ce8..a23d9359 100644 --- a/internal/connector/pingfederate/resources/certificate_ca_test.go +++ b/internal/connector/pingfederate/resources/certificate_ca_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,25 +10,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateCertificateCa(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateCertificateCa(t, clientInfo) + tr := pingfederate_testable_resources.CertificateCa(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", creationInfo[testutils_resource.ENUM_ISSUER_DN], creationInfo[testutils_resource.ENUM_SERIAL_NUMBER]), - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: fmt.Sprintf("%s_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ISSUER_DN], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SERIAL_NUMBER]), + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/certificates_revocation_ocsp_certificate.go b/internal/connector/pingfederate/resources/certificates_revocation_ocsp_certificate.go index 22d9f961..430c0627 100644 --- a/internal/connector/pingfederate/resources/certificates_revocation_ocsp_certificate.go +++ b/internal/connector/pingfederate/resources/certificates_revocation_ocsp_certificate.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -74,7 +75,7 @@ func (r *PingFederateCertificatesRevocationOcspCertificateResource) getCertifica return nil, err } if !ok { - return nil, nil + return certificatesRevocationOcspCertificateData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/certificates_revocation_ocsp_certificate_test.go b/internal/connector/pingfederate/resources/certificates_revocation_ocsp_certificate_test.go index 377ca853..169910fe 100644 --- a/internal/connector/pingfederate/resources/certificates_revocation_ocsp_certificate_test.go +++ b/internal/connector/pingfederate/resources/certificates_revocation_ocsp_certificate_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,25 +10,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateCertificatesRevocationOcspCertificate(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateCertificatesRevocationOcspCertificate(t, clientInfo) + tr := pingfederate_testable_resources.CertificatesRevocationOcspCertificate(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", creationInfo[testutils_resource.ENUM_ISSUER_DN], creationInfo[testutils_resource.ENUM_SERIAL_NUMBER]), - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: fmt.Sprintf("%s_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ISSUER_DN], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SERIAL_NUMBER]), + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/certificates_revocation_settings.go b/internal/connector/pingfederate/resources/certificates_revocation_settings.go index f2d93fcd..710c6d6f 100644 --- a/internal/connector/pingfederate/resources/certificates_revocation_settings.go +++ b/internal/connector/pingfederate/resources/certificates_revocation_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/certificates_revocation_settings_test.go b/internal/connector/pingfederate/resources/certificates_revocation_settings_test.go index fb29e67e..f94852ad 100644 --- a/internal/connector/pingfederate/resources/certificates_revocation_settings_test.go +++ b/internal/connector/pingfederate/resources/certificates_revocation_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateCertificatesRevocationSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.CertificatesRevocationSettings(clientInfo) + tr := pingfederate_testable_resources.CertificatesRevocationSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Certificates Revocation Settings", ResourceID: "certificates_revocation_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/cluster_settings.go b/internal/connector/pingfederate/resources/cluster_settings.go index 11ddd0fe..b8d687c3 100644 --- a/internal/connector/pingfederate/resources/cluster_settings.go +++ b/internal/connector/pingfederate/resources/cluster_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -44,6 +45,7 @@ func (r *PingFederateClusterSettingsResource) ExportAll() (*[]connector.ImportBl } if !valid { l.Warn().Msgf("'%s' Resource is not supported in the version of PingFederate used. Skipping export.", r.ResourceType()) + return &importBlocks, nil } @@ -84,5 +86,6 @@ func (r *PingFederateClusterSettingsResource) ValidPingFederateVersion() (bool, semVer := (*version)[:strings.LastIndex(*version, ".")] compareResult := semver.Compare(fmt.Sprintf("v%s", semVer), "v12.0.0") + return compareResult >= 0, nil } diff --git a/internal/connector/pingfederate/resources/cluster_settings_test.go b/internal/connector/pingfederate/resources/cluster_settings_test.go index de380914..53a54e99 100644 --- a/internal/connector/pingfederate/resources/cluster_settings_test.go +++ b/internal/connector/pingfederate/resources/cluster_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,12 +9,17 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateClusterSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.ClusterSettings(clientInfo) + tr := pingfederate_testable_resources.ClusterSettings(t, clientInfo) + resource, ok := tr.ExportableResource.(*resources.PingFederateClusterSettingsResource) + if !ok { + t.Fatalf("Error casting resource to PingFederateClusterSettingsResource") + } valid, err := resource.ValidPingFederateVersion() if err != nil { @@ -25,12 +31,11 @@ func Test_PingFederateClusterSettings(t *testing.T) { expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Cluster Settings", ResourceID: "cluster_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/configuration_encryption_keys_rotate.go b/internal/connector/pingfederate/resources/configuration_encryption_keys_rotate.go index f444dc68..af4a3626 100644 --- a/internal/connector/pingfederate/resources/configuration_encryption_keys_rotate.go +++ b/internal/connector/pingfederate/resources/configuration_encryption_keys_rotate.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/configuration_encryption_keys_rotate_test.go b/internal/connector/pingfederate/resources/configuration_encryption_keys_rotate_test.go index 64112d88..7991c6d5 100644 --- a/internal/connector/pingfederate/resources/configuration_encryption_keys_rotate_test.go +++ b/internal/connector/pingfederate/resources/configuration_encryption_keys_rotate_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateConfigurationEncryptionKeysRotate(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.ConfigurationEncryptionKeysRotate(clientInfo) + tr := pingfederate_testable_resources.ConfigurationEncryptionKeysRotate(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Configuration Encryption Keys Rotate", ResourceID: "configuration_encryption_keys_rotate_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/data_store.go b/internal/connector/pingfederate/resources/data_store.go index f648aff8..792d72a7 100644 --- a/internal/connector/pingfederate/resources/data_store.go +++ b/internal/connector/pingfederate/resources/data_store.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -70,7 +71,7 @@ func (r *PingFederateDataStoreResource) getDataStoreData() (map[string]string, e return nil, err } if !ok { - return nil, nil + return dataStoreData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/data_store_test.go b/internal/connector/pingfederate/resources/data_store_test.go index 10361bf0..00647916 100644 --- a/internal/connector/pingfederate/resources/data_store_test.go +++ b/internal/connector/pingfederate/resources/data_store_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,24 +7,23 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateDataStore(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - // Data store resource is already created, so no need to use a testable resource - resource := resources.DataStore(clientInfo) + tr := pingfederate_testable_resources.DataStore(t, clientInfo) + // Data store resource is already created, so no need to create/delete it expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "ProvisionerDS_JDBC", ResourceID: "ProvisionerDS", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/default_urls.go b/internal/connector/pingfederate/resources/default_urls.go index 62542396..cf10dde6 100644 --- a/internal/connector/pingfederate/resources/default_urls.go +++ b/internal/connector/pingfederate/resources/default_urls.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/default_urls_test.go b/internal/connector/pingfederate/resources/default_urls_test.go index faed92e9..83fbaf50 100644 --- a/internal/connector/pingfederate/resources/default_urls_test.go +++ b/internal/connector/pingfederate/resources/default_urls_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateDefaultUrls(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.DefaultUrls(clientInfo) + tr := pingfederate_testable_resources.DefaultUrls(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Default Urls", ResourceID: "default_urls_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/extended_properties.go b/internal/connector/pingfederate/resources/extended_properties.go index 8dde27f7..5b479d72 100644 --- a/internal/connector/pingfederate/resources/extended_properties.go +++ b/internal/connector/pingfederate/resources/extended_properties.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/extended_properties_test.go b/internal/connector/pingfederate/resources/extended_properties_test.go index 38f389cf..c02a9dd0 100644 --- a/internal/connector/pingfederate/resources/extended_properties_test.go +++ b/internal/connector/pingfederate/resources/extended_properties_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateExtendedProperties(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.ExtendedProperties(clientInfo) + tr := pingfederate_testable_resources.ExtendedProperties(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Extended Properties", ResourceID: "extended_properties_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/identity_store_provisioner.go b/internal/connector/pingfederate/resources/identity_store_provisioner.go index 85169fc2..dce95ef8 100644 --- a/internal/connector/pingfederate/resources/identity_store_provisioner.go +++ b/internal/connector/pingfederate/resources/identity_store_provisioner.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateIdentityStoreProvisionerResource) getIdentityStoreProvision return nil, err } if !ok { - return nil, nil + return identityStoreProvisionerData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/identity_store_provisioner_test.go b/internal/connector/pingfederate/resources/identity_store_provisioner_test.go index 90288f72..465bad8d 100644 --- a/internal/connector/pingfederate/resources/identity_store_provisioner_test.go +++ b/internal/connector/pingfederate/resources/identity_store_provisioner_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateIdentityStoreProvisioner(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateIdentityStoreProvisioner(t, clientInfo) + tr := pingfederate_testable_resources.IdentityStoreProvisioner(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/idp_adapter.go b/internal/connector/pingfederate/resources/idp_adapter.go index ede665df..410fcabf 100644 --- a/internal/connector/pingfederate/resources/idp_adapter.go +++ b/internal/connector/pingfederate/resources/idp_adapter.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateIdpAdapterResource) getIdpAdapterData() (map[string]string, return nil, err } if !ok { - return nil, nil + return idpAdapterData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/idp_adapter_test.go b/internal/connector/pingfederate/resources/idp_adapter_test.go index b6889608..6189ceab 100644 --- a/internal/connector/pingfederate/resources/idp_adapter_test.go +++ b/internal/connector/pingfederate/resources/idp_adapter_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateIdpAdapter(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateIdpAdapter(t, clientInfo) + tr := pingfederate_testable_resources.IdpAdapter(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/idp_sp_connection.go b/internal/connector/pingfederate/resources/idp_sp_connection.go index 842fd739..b0693b67 100644 --- a/internal/connector/pingfederate/resources/idp_sp_connection.go +++ b/internal/connector/pingfederate/resources/idp_sp_connection.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateIdpSpConnectionResource) getIdpSpConnectionData() (map[stri return nil, err } if !ok { - return nil, nil + return idpSpConnectionData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/idp_sp_connection_test.go b/internal/connector/pingfederate/resources/idp_sp_connection_test.go index 50ee1498..075adfb2 100644 --- a/internal/connector/pingfederate/resources/idp_sp_connection_test.go +++ b/internal/connector/pingfederate/resources/idp_sp_connection_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateIdpSpConnection(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateIdpSpConnection(t, clientInfo) + tr := pingfederate_testable_resources.IdpSpConnection(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/idp_sts_request_parameters_contract.go b/internal/connector/pingfederate/resources/idp_sts_request_parameters_contract.go index c3f04dbf..549d63db 100644 --- a/internal/connector/pingfederate/resources/idp_sts_request_parameters_contract.go +++ b/internal/connector/pingfederate/resources/idp_sts_request_parameters_contract.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateIdpStsRequestParametersContractResource) getIdpStsRequestPa return nil, err } if !ok { - return nil, nil + return idpStsRequestParametersContractData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/idp_sts_request_parameters_contract_test.go b/internal/connector/pingfederate/resources/idp_sts_request_parameters_contract_test.go index 15a76082..860c84f5 100644 --- a/internal/connector/pingfederate/resources/idp_sts_request_parameters_contract_test.go +++ b/internal/connector/pingfederate/resources/idp_sts_request_parameters_contract_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateIdpStsRequestParametersContract(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateIdpStsRequestParametersContract(t, clientInfo) + tr := pingfederate_testable_resources.IdpStsRequestParametersContract(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/idp_to_sp_adapter_mapping.go b/internal/connector/pingfederate/resources/idp_to_sp_adapter_mapping.go index d95236e9..cefa93a4 100644 --- a/internal/connector/pingfederate/resources/idp_to_sp_adapter_mapping.go +++ b/internal/connector/pingfederate/resources/idp_to_sp_adapter_mapping.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -70,7 +71,7 @@ func (r *PingFederateIdpToSpAdapterMappingResource) getIdpToSpAdapterMappingData return nil, err } if !ok { - return nil, nil + return idpToSpAdapterMappingData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/idp_to_sp_adapter_mapping_test.go b/internal/connector/pingfederate/resources/idp_to_sp_adapter_mapping_test.go index e6969594..efcef908 100644 --- a/internal/connector/pingfederate/resources/idp_to_sp_adapter_mapping_test.go +++ b/internal/connector/pingfederate/resources/idp_to_sp_adapter_mapping_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,25 +10,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateIdpToSpAdapterMapping(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateIdpToSpAdapterMapping(t, clientInfo) + tr := pingfederate_testable_resources.IdpToSpAdapterMapping(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_to_%s", creationInfo[testutils_resource.ENUM_SOURCE_ID], creationInfo[testutils_resource.ENUM_TARGET_ID]), - ResourceID: fmt.Sprintf("%s|%s", creationInfo[testutils_resource.ENUM_SOURCE_ID], creationInfo[testutils_resource.ENUM_TARGET_ID]), + ResourceName: fmt.Sprintf("%s_to_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SOURCE_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TARGET_ID]), + ResourceID: fmt.Sprintf("%s|%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SOURCE_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TARGET_ID]), }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/idp_token_processor.go b/internal/connector/pingfederate/resources/idp_token_processor.go index 488e4fc4..eb4d6118 100644 --- a/internal/connector/pingfederate/resources/idp_token_processor.go +++ b/internal/connector/pingfederate/resources/idp_token_processor.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateIdpTokenProcessorResource) getIdpTokenProcessorData() (map[ return nil, err } if !ok { - return nil, nil + return idpTokenProcessorData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/idp_token_processor_test.go b/internal/connector/pingfederate/resources/idp_token_processor_test.go index 949312f6..22a9781a 100644 --- a/internal/connector/pingfederate/resources/idp_token_processor_test.go +++ b/internal/connector/pingfederate/resources/idp_token_processor_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateIdpTokenProcessor(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateIdpTokenProcessor(t, clientInfo) + tr := pingfederate_testable_resources.IdpTokenProcessor(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/incoming_proxy_settings.go b/internal/connector/pingfederate/resources/incoming_proxy_settings.go index b52941e6..6eee0180 100644 --- a/internal/connector/pingfederate/resources/incoming_proxy_settings.go +++ b/internal/connector/pingfederate/resources/incoming_proxy_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/incoming_proxy_settings_test.go b/internal/connector/pingfederate/resources/incoming_proxy_settings_test.go index ce199d68..d61f9d59 100644 --- a/internal/connector/pingfederate/resources/incoming_proxy_settings_test.go +++ b/internal/connector/pingfederate/resources/incoming_proxy_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateIncomingProxySettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.IncomingProxySettings(clientInfo) + tr := pingfederate_testable_resources.IncomingProxySettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Incoming Proxy Settings", ResourceID: "incoming_proxy_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/kerberos_realm.go b/internal/connector/pingfederate/resources/kerberos_realm.go index 67736906..1f9a5e1c 100644 --- a/internal/connector/pingfederate/resources/kerberos_realm.go +++ b/internal/connector/pingfederate/resources/kerberos_realm.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateKerberosRealmResource) getKerberosRealmData() (map[string]s return nil, err } if !ok { - return nil, nil + return kerberosRealmData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/kerberos_realm_settings.go b/internal/connector/pingfederate/resources/kerberos_realm_settings.go index 50835608..661f8af9 100644 --- a/internal/connector/pingfederate/resources/kerberos_realm_settings.go +++ b/internal/connector/pingfederate/resources/kerberos_realm_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/kerberos_realm_settings_test.go b/internal/connector/pingfederate/resources/kerberos_realm_settings_test.go index 5a80c963..55232c09 100644 --- a/internal/connector/pingfederate/resources/kerberos_realm_settings_test.go +++ b/internal/connector/pingfederate/resources/kerberos_realm_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateKerberosRealmSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.KerberosRealmSettings(clientInfo) + tr := pingfederate_testable_resources.KerberosRealmSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Kerberos Realm Settings", ResourceID: "kerberos_realm_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/kerberos_realm_test.go b/internal/connector/pingfederate/resources/kerberos_realm_test.go index ddde0858..403d775f 100644 --- a/internal/connector/pingfederate/resources/kerberos_realm_test.go +++ b/internal/connector/pingfederate/resources/kerberos_realm_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateKerberosRealm(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateKerberosRealm(t, clientInfo) + tr := pingfederate_testable_resources.KerberosRealm(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect.go b/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect.go index 041b38b4..a4e5dc52 100644 --- a/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect.go +++ b/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_additional_key_set.go b/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_additional_key_set.go index 1c8cd82b..577bf2ad 100644 --- a/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_additional_key_set.go +++ b/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_additional_key_set.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateKeypairsOauthOpenidConnectAdditionalKeySetResource) getKeyp return nil, err } if !ok { - return nil, nil + return keypairsOauthOpenidConnectAdditionalKeySetData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_additional_key_set_test.go b/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_additional_key_set_test.go index 845d093b..c255cd44 100644 --- a/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_additional_key_set_test.go +++ b/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_additional_key_set_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateKeypairsOauthOpenidConnectAdditionalKeySet(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateKeypairsOauthOpenidConnectAdditionalKeySet(t, clientInfo) + tr := pingfederate_testable_resources.KeypairsOauthOpenidConnectAdditionalKeySet(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_test.go b/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_test.go index 1a1f73fc..93ae0da1 100644 --- a/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_test.go +++ b/internal/connector/pingfederate/resources/keypairs_oauth_openid_connect_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateKeypairsOauthOpenidConnect(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.KeypairsOauthOpenidConnect(clientInfo) + tr := pingfederate_testable_resources.KeypairsOauthOpenidConnect(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Keypairs Oauth Openid Connect", ResourceID: "keypairs_oauth_openid_connect_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/keypairs_signing_key_rotation_settings.go b/internal/connector/pingfederate/resources/keypairs_signing_key_rotation_settings.go index e1b7f9d8..0cc9269d 100644 --- a/internal/connector/pingfederate/resources/keypairs_signing_key_rotation_settings.go +++ b/internal/connector/pingfederate/resources/keypairs_signing_key_rotation_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -82,7 +83,7 @@ func (r *PingFederateKeypairsSigningKeyRotationSettingsResource) getKeypairsSign return nil, err } if !ok { - return nil, nil + return signingKeyPairData, nil } if apiObj == nil { @@ -113,5 +114,6 @@ func (r *PingFederateKeypairsSigningKeyRotationSettingsResource) getKeypairsSign func (r *PingFederateKeypairsSigningKeyRotationSettingsResource) checkKeypairsSigningKeyRotationSettingsData(id string) (bool, error) { _, response, err := r.clientInfo.PingFederateApiClient.KeyPairsSigningAPI.GetRotationSettings(r.clientInfo.PingFederateContext, id).Execute() + return common.CheckSingletonResource(response, err, "GetRotationSettings", r.ResourceType()) } diff --git a/internal/connector/pingfederate/resources/keypairs_signing_key_rotation_settings_test.go b/internal/connector/pingfederate/resources/keypairs_signing_key_rotation_settings_test.go index f0f91b3b..8c1b5ada 100644 --- a/internal/connector/pingfederate/resources/keypairs_signing_key_rotation_settings_test.go +++ b/internal/connector/pingfederate/resources/keypairs_signing_key_rotation_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,15 +10,15 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateKeypairsSigningKeyRotationSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateKeypairsSigningKeyRotationSettings(t, clientInfo) + tr := pingfederate_testable_resources.KeypairsSigningKeyRotationSettings(t, clientInfo) - _ = tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) // Test_PingFederateKeypairsSigningKeyRotationSettings only has one dependency @@ -26,11 +27,10 @@ func Test_PingFederateKeypairsSigningKeyRotationSettings(t *testing.T) { expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s_rotation_settings", keypairTr.CreationInfo[testutils_resource.ENUM_ISSUER_DN], keypairTr.CreationInfo[testutils_resource.ENUM_SERIAL_NUMBER]), - ResourceID: keypairTr.CreationInfo[testutils_resource.ENUM_ID], + ResourceName: fmt.Sprintf("%s_%s_rotation_settings", keypairTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ISSUER_DN], keypairTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SERIAL_NUMBER]), + ResourceID: keypairTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/keypairs_ssl_server_settings.go b/internal/connector/pingfederate/resources/keypairs_ssl_server_settings.go index b5376629..f02fb7e7 100644 --- a/internal/connector/pingfederate/resources/keypairs_ssl_server_settings.go +++ b/internal/connector/pingfederate/resources/keypairs_ssl_server_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/keypairs_ssl_server_settings_test.go b/internal/connector/pingfederate/resources/keypairs_ssl_server_settings_test.go index 729ac6f9..4746131c 100644 --- a/internal/connector/pingfederate/resources/keypairs_ssl_server_settings_test.go +++ b/internal/connector/pingfederate/resources/keypairs_ssl_server_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateKeypairsSslServerSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.KeypairsSslServerSettings(clientInfo) + tr := pingfederate_testable_resources.KeypairsSslServerSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Keypairs Ssl Server Settings", ResourceID: "keypairs_ssl_server_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/local_identity_profile.go b/internal/connector/pingfederate/resources/local_identity_profile.go index bba27bdd..1ee4369e 100644 --- a/internal/connector/pingfederate/resources/local_identity_profile.go +++ b/internal/connector/pingfederate/resources/local_identity_profile.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateLocalIdentityProfileResource) getLocalIdentityProfileData() return nil, err } if !ok { - return nil, nil + return localIdentityProfileData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/local_identity_profile_test.go b/internal/connector/pingfederate/resources/local_identity_profile_test.go index 3dd257d0..d9a34a23 100644 --- a/internal/connector/pingfederate/resources/local_identity_profile_test.go +++ b/internal/connector/pingfederate/resources/local_identity_profile_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateLocalIdentityProfile(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateLocalIdentityProfile(t, clientInfo) + tr := pingfederate_testable_resources.LocalIdentityProfile(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/metadata_url.go b/internal/connector/pingfederate/resources/metadata_url.go index 5ecd0611..baf5788d 100644 --- a/internal/connector/pingfederate/resources/metadata_url.go +++ b/internal/connector/pingfederate/resources/metadata_url.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateMetadataUrlResource) getMetadataUrlData() (map[string]strin return nil, err } if !ok { - return nil, nil + return metadataUrlData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/metadata_url_test.go b/internal/connector/pingfederate/resources/metadata_url_test.go index 0b3c632c..7dff8d1e 100644 --- a/internal/connector/pingfederate/resources/metadata_url_test.go +++ b/internal/connector/pingfederate/resources/metadata_url_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateMetadataUrl(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateMetadataUrl(t, clientInfo) + tr := pingfederate_testable_resources.MetadataUrl(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/notification_publisher.go b/internal/connector/pingfederate/resources/notification_publisher.go index e1cf8b1a..48b64ca2 100644 --- a/internal/connector/pingfederate/resources/notification_publisher.go +++ b/internal/connector/pingfederate/resources/notification_publisher.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateNotificationPublisherResource) getNotificationPublisherData return nil, err } if !ok { - return nil, nil + return notificationPublisherData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/notification_publisher_settings.go b/internal/connector/pingfederate/resources/notification_publisher_settings.go index d30edb40..2b28cdc8 100644 --- a/internal/connector/pingfederate/resources/notification_publisher_settings.go +++ b/internal/connector/pingfederate/resources/notification_publisher_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/notification_publisher_settings_test.go b/internal/connector/pingfederate/resources/notification_publisher_settings_test.go index 20090da3..bb073d3a 100644 --- a/internal/connector/pingfederate/resources/notification_publisher_settings_test.go +++ b/internal/connector/pingfederate/resources/notification_publisher_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateNotificationPublisherSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.NotificationPublisherSettings(clientInfo) + tr := pingfederate_testable_resources.NotificationPublisherSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Notification Publisher Settings", ResourceID: "notification_publisher_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/notification_publisher_test.go b/internal/connector/pingfederate/resources/notification_publisher_test.go index 3dd66268..aa497ad1 100644 --- a/internal/connector/pingfederate/resources/notification_publisher_test.go +++ b/internal/connector/pingfederate/resources/notification_publisher_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateNotificationPublisher(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateNotificationPublisher(t, clientInfo) + tr := pingfederate_testable_resources.NotificationPublisher(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/oauth_access_token_manager.go b/internal/connector/pingfederate/resources/oauth_access_token_manager.go index e8ac0a0b..d0ce4fc3 100644 --- a/internal/connector/pingfederate/resources/oauth_access_token_manager.go +++ b/internal/connector/pingfederate/resources/oauth_access_token_manager.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateOauthAccessTokenManagerResource) getOauthAccessTokenManager return nil, err } if !ok { - return nil, nil + return oauthAccessTokenManagerData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/oauth_access_token_manager_settings.go b/internal/connector/pingfederate/resources/oauth_access_token_manager_settings.go index 6f475ff2..10eae03c 100644 --- a/internal/connector/pingfederate/resources/oauth_access_token_manager_settings.go +++ b/internal/connector/pingfederate/resources/oauth_access_token_manager_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/oauth_access_token_manager_settings_test.go b/internal/connector/pingfederate/resources/oauth_access_token_manager_settings_test.go index c541d5cd..4079a698 100644 --- a/internal/connector/pingfederate/resources/oauth_access_token_manager_settings_test.go +++ b/internal/connector/pingfederate/resources/oauth_access_token_manager_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthAccessTokenManagerSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.OauthAccessTokenManagerSettings(clientInfo) + tr := pingfederate_testable_resources.OauthAccessTokenManagerSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Oauth Access Token Manager Settings", ResourceID: "oauth_access_token_manager_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/oauth_access_token_manager_test.go b/internal/connector/pingfederate/resources/oauth_access_token_manager_test.go index 98fa3b78..daf1fcdf 100644 --- a/internal/connector/pingfederate/resources/oauth_access_token_manager_test.go +++ b/internal/connector/pingfederate/resources/oauth_access_token_manager_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthAccessTokenManager(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateOauthAccessTokenManager(t, clientInfo) + tr := pingfederate_testable_resources.OauthAccessTokenManager(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/oauth_access_token_mapping.go b/internal/connector/pingfederate/resources/oauth_access_token_mapping.go index f9e012d7..eff7b6cf 100644 --- a/internal/connector/pingfederate/resources/oauth_access_token_mapping.go +++ b/internal/connector/pingfederate/resources/oauth_access_token_mapping.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -70,7 +71,7 @@ func (r *PingFederateOauthAccessTokenMappingResource) getOauthAccessTokenMapping return nil, err } if !ok { - return nil, nil + return oauthAccessTokenMappingData, nil } for _, oauthAccessTokenMapping := range mappings { diff --git a/internal/connector/pingfederate/resources/oauth_access_token_mapping_test.go b/internal/connector/pingfederate/resources/oauth_access_token_mapping_test.go index 061c7ada..f39d7f95 100644 --- a/internal/connector/pingfederate/resources/oauth_access_token_mapping_test.go +++ b/internal/connector/pingfederate/resources/oauth_access_token_mapping_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,25 +10,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthAccessTokenMapping(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateOauthAccessTokenMapping(t, clientInfo) + tr := pingfederate_testable_resources.OauthAccessTokenMapping(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", creationInfo[testutils_resource.ENUM_ID], creationInfo[testutils_resource.ENUM_CONTEXT_TYPE]), - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: fmt.Sprintf("%s_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_CONTEXT_TYPE]), + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/oauth_authentication_policy_contract_mapping.go b/internal/connector/pingfederate/resources/oauth_authentication_policy_contract_mapping.go index cb1967f5..b4e98f86 100644 --- a/internal/connector/pingfederate/resources/oauth_authentication_policy_contract_mapping.go +++ b/internal/connector/pingfederate/resources/oauth_authentication_policy_contract_mapping.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/oauth_authentication_policy_contract_mapping_test.go b/internal/connector/pingfederate/resources/oauth_authentication_policy_contract_mapping_test.go index 6f42c6d6..a6144f3a 100644 --- a/internal/connector/pingfederate/resources/oauth_authentication_policy_contract_mapping_test.go +++ b/internal/connector/pingfederate/resources/oauth_authentication_policy_contract_mapping_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,25 +10,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthAuthenticationPolicyContractMapping(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateOauthAuthenticationPolicyContractMapping(t, clientInfo) + tr := pingfederate_testable_resources.OauthAuthenticationPolicyContractMapping(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_mapping", creationInfo[testutils_resource.ENUM_ID]), - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: fmt.Sprintf("%s_mapping", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/oauth_ciba_server_policy_request_policy.go b/internal/connector/pingfederate/resources/oauth_ciba_server_policy_request_policy.go index 7fa547b5..e2ec8e5f 100644 --- a/internal/connector/pingfederate/resources/oauth_ciba_server_policy_request_policy.go +++ b/internal/connector/pingfederate/resources/oauth_ciba_server_policy_request_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateOauthCibaServerPolicyRequestPolicyResource) getOauthCibaSer return nil, err } if !ok { - return nil, nil + return oauthCibaServerPolicyRequestPolicyData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/oauth_ciba_server_policy_request_policy_test.go b/internal/connector/pingfederate/resources/oauth_ciba_server_policy_request_policy_test.go index f8d59f66..fefa23b2 100644 --- a/internal/connector/pingfederate/resources/oauth_ciba_server_policy_request_policy_test.go +++ b/internal/connector/pingfederate/resources/oauth_ciba_server_policy_request_policy_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,7 +9,7 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthCibaServerPolicyRequestPolicy(t *testing.T) { @@ -17,19 +18,18 @@ func Test_PingFederateOauthCibaServerPolicyRequestPolicy(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateOauthCibaServerPolicyRequestPolicy(t, clientInfo) + tr := pingfederate_testable_resources.OauthCibaServerPolicyRequestPolicy(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/oauth_ciba_server_policy_settings.go b/internal/connector/pingfederate/resources/oauth_ciba_server_policy_settings.go index 9a62fbe8..664affc6 100644 --- a/internal/connector/pingfederate/resources/oauth_ciba_server_policy_settings.go +++ b/internal/connector/pingfederate/resources/oauth_ciba_server_policy_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/oauth_ciba_server_policy_settings_test.go b/internal/connector/pingfederate/resources/oauth_ciba_server_policy_settings_test.go index b7b2b8b4..9f0eb08b 100644 --- a/internal/connector/pingfederate/resources/oauth_ciba_server_policy_settings_test.go +++ b/internal/connector/pingfederate/resources/oauth_ciba_server_policy_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthCibaServerPolicySettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.OauthCibaServerPolicySettings(clientInfo) + tr := pingfederate_testable_resources.OauthCibaServerPolicySettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Oauth Ciba Server Policy Settings", ResourceID: "oauth_ciba_server_policy_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/oauth_client.go b/internal/connector/pingfederate/resources/oauth_client.go index 9debc034..1777dc69 100644 --- a/internal/connector/pingfederate/resources/oauth_client.go +++ b/internal/connector/pingfederate/resources/oauth_client.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateOauthClientResource) getOauthClientData() (map[string]strin return nil, err } if !ok { - return nil, nil + return oauthClientData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/oauth_client_registration_policy.go b/internal/connector/pingfederate/resources/oauth_client_registration_policy.go index 9d99bea0..4a183d84 100644 --- a/internal/connector/pingfederate/resources/oauth_client_registration_policy.go +++ b/internal/connector/pingfederate/resources/oauth_client_registration_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateOauthClientRegistrationPolicyResource) getOauthClientRegist return nil, err } if !ok { - return nil, nil + return oauthClientRegistrationPolicyData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/oauth_client_registration_policy_test.go b/internal/connector/pingfederate/resources/oauth_client_registration_policy_test.go index 50ab258f..3a5a459f 100644 --- a/internal/connector/pingfederate/resources/oauth_client_registration_policy_test.go +++ b/internal/connector/pingfederate/resources/oauth_client_registration_policy_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthClientRegistrationPolicy(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateOauthClientRegistrationPolicy(t, clientInfo) + tr := pingfederate_testable_resources.OauthClientRegistrationPolicy(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/oauth_client_settings.go b/internal/connector/pingfederate/resources/oauth_client_settings.go index 4cd1e233..11f32d22 100644 --- a/internal/connector/pingfederate/resources/oauth_client_settings.go +++ b/internal/connector/pingfederate/resources/oauth_client_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/oauth_client_settings_test.go b/internal/connector/pingfederate/resources/oauth_client_settings_test.go index 83177001..b52db7ab 100644 --- a/internal/connector/pingfederate/resources/oauth_client_settings_test.go +++ b/internal/connector/pingfederate/resources/oauth_client_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthClientSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.OauthClientSettings(clientInfo) + tr := pingfederate_testable_resources.OauthClientSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Oauth Client Settings", ResourceID: "oauth_client_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/oauth_client_test.go b/internal/connector/pingfederate/resources/oauth_client_test.go index ee19f948..2fc5fd5e 100644 --- a/internal/connector/pingfederate/resources/oauth_client_test.go +++ b/internal/connector/pingfederate/resources/oauth_client_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthClient(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateOauthClient(t, clientInfo) + tr := pingfederate_testable_resources.OauthClient(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/oauth_idp_adapter_mapping.go b/internal/connector/pingfederate/resources/oauth_idp_adapter_mapping.go index cb5e6d53..f18b4318 100644 --- a/internal/connector/pingfederate/resources/oauth_idp_adapter_mapping.go +++ b/internal/connector/pingfederate/resources/oauth_idp_adapter_mapping.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/oauth_idp_adapter_mapping_test.go b/internal/connector/pingfederate/resources/oauth_idp_adapter_mapping_test.go index 578d7f39..9dbf65ef 100644 --- a/internal/connector/pingfederate/resources/oauth_idp_adapter_mapping_test.go +++ b/internal/connector/pingfederate/resources/oauth_idp_adapter_mapping_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,25 +10,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthIdpAdapterMapping(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateOauthIdpAdapterMapping(t, clientInfo) + tr := pingfederate_testable_resources.OauthIdpAdapterMapping(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_mapping", creationInfo[testutils_resource.ENUM_ID]), - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: fmt.Sprintf("%s_mapping", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/oauth_issuer.go b/internal/connector/pingfederate/resources/oauth_issuer.go index f4b3bcf4..055c8e41 100644 --- a/internal/connector/pingfederate/resources/oauth_issuer.go +++ b/internal/connector/pingfederate/resources/oauth_issuer.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateOauthIssuerResource) getOauthIssuerData() (map[string]strin return nil, err } if !ok { - return nil, nil + return oauthIssuerData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/oauth_issuer_test.go b/internal/connector/pingfederate/resources/oauth_issuer_test.go index baa37d44..5f777cd4 100644 --- a/internal/connector/pingfederate/resources/oauth_issuer_test.go +++ b/internal/connector/pingfederate/resources/oauth_issuer_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthIssuer(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateOauthIssuer(t, clientInfo) + tr := pingfederate_testable_resources.OauthIssuer(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/oauth_server_settings.go b/internal/connector/pingfederate/resources/oauth_server_settings.go index 7204afcf..7b69407d 100644 --- a/internal/connector/pingfederate/resources/oauth_server_settings.go +++ b/internal/connector/pingfederate/resources/oauth_server_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/oauth_server_settings_test.go b/internal/connector/pingfederate/resources/oauth_server_settings_test.go index a01e3f67..3dffefff 100644 --- a/internal/connector/pingfederate/resources/oauth_server_settings_test.go +++ b/internal/connector/pingfederate/resources/oauth_server_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthServerSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.OauthServerSettings(clientInfo) + tr := pingfederate_testable_resources.OauthServerSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Oauth Server Settings", ResourceID: "oauth_server_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/oauth_token_exchange_generator_settings.go b/internal/connector/pingfederate/resources/oauth_token_exchange_generator_settings.go index 7f58ce70..2b0ce491 100644 --- a/internal/connector/pingfederate/resources/oauth_token_exchange_generator_settings.go +++ b/internal/connector/pingfederate/resources/oauth_token_exchange_generator_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/oauth_token_exchange_generator_settings_test.go b/internal/connector/pingfederate/resources/oauth_token_exchange_generator_settings_test.go index 17dfadfc..a7b0ea88 100644 --- a/internal/connector/pingfederate/resources/oauth_token_exchange_generator_settings_test.go +++ b/internal/connector/pingfederate/resources/oauth_token_exchange_generator_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthTokenExchangeGeneratorSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.OauthTokenExchangeGeneratorSettings(clientInfo) + tr := pingfederate_testable_resources.OauthTokenExchangeGeneratorSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Oauth Token Exchange Generator Settings", ResourceID: "oauth_token_exchange_generator_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/oauth_token_exchange_token_generator_mapping.go b/internal/connector/pingfederate/resources/oauth_token_exchange_token_generator_mapping.go index 88db5f0c..fc9431cd 100644 --- a/internal/connector/pingfederate/resources/oauth_token_exchange_token_generator_mapping.go +++ b/internal/connector/pingfederate/resources/oauth_token_exchange_token_generator_mapping.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -74,7 +75,7 @@ func (r *PingFederateOauthTokenExchangeTokenGeneratorMappingResource) getOauthTo return nil, err } if !ok { - return nil, nil + return oauthTokenExchangeTokenGeneratorMappingData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/oauth_token_exchange_token_generator_mapping_test.go b/internal/connector/pingfederate/resources/oauth_token_exchange_token_generator_mapping_test.go index 9d61b437..ab13874a 100644 --- a/internal/connector/pingfederate/resources/oauth_token_exchange_token_generator_mapping_test.go +++ b/internal/connector/pingfederate/resources/oauth_token_exchange_token_generator_mapping_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,25 +10,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOauthTokenExchangeTokenGeneratorMapping(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateOauthTokenExchangeTokenGeneratorMapping(t, clientInfo) + tr := pingfederate_testable_resources.OauthTokenExchangeTokenGeneratorMapping(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_to_%s", creationInfo[testutils_resource.ENUM_SOURCE_ID], creationInfo[testutils_resource.ENUM_TARGET_ID]), - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: fmt.Sprintf("%s_to_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SOURCE_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TARGET_ID]), + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/openid_connect_policy.go b/internal/connector/pingfederate/resources/openid_connect_policy.go index 280fc643..da6942a4 100644 --- a/internal/connector/pingfederate/resources/openid_connect_policy.go +++ b/internal/connector/pingfederate/resources/openid_connect_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateOpenidConnectPolicyResource) getOpenidConnectPolicyData() ( return nil, err } if !ok { - return nil, nil + return openidConnectPolicyData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/openid_connect_policy_test.go b/internal/connector/pingfederate/resources/openid_connect_policy_test.go index a8dc2c58..9d5cd55c 100644 --- a/internal/connector/pingfederate/resources/openid_connect_policy_test.go +++ b/internal/connector/pingfederate/resources/openid_connect_policy_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOpenidConnectPolicy(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateOpenidConnectPolicy(t, clientInfo) + tr := pingfederate_testable_resources.OpenidConnectPolicy(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/openid_connect_settings.go b/internal/connector/pingfederate/resources/openid_connect_settings.go index 90f2c23a..c014141c 100644 --- a/internal/connector/pingfederate/resources/openid_connect_settings.go +++ b/internal/connector/pingfederate/resources/openid_connect_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/openid_connect_settings_test.go b/internal/connector/pingfederate/resources/openid_connect_settings_test.go index 74271fd0..951f4317 100644 --- a/internal/connector/pingfederate/resources/openid_connect_settings_test.go +++ b/internal/connector/pingfederate/resources/openid_connect_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateOpenidConnectSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.OpenidConnectSettings(clientInfo) + tr := pingfederate_testable_resources.OpenidConnectSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Openid Connect Settings", ResourceID: "openid_connect_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/password_credential_validator.go b/internal/connector/pingfederate/resources/password_credential_validator.go index 858fcd38..3a1d619f 100644 --- a/internal/connector/pingfederate/resources/password_credential_validator.go +++ b/internal/connector/pingfederate/resources/password_credential_validator.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederatePasswordCredentialValidatorResource) getPasswordCredentialV return nil, err } if !ok { - return nil, nil + return passwordCredentialValidatorData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/password_credential_validator_test.go b/internal/connector/pingfederate/resources/password_credential_validator_test.go index a184b3dd..d396affc 100644 --- a/internal/connector/pingfederate/resources/password_credential_validator_test.go +++ b/internal/connector/pingfederate/resources/password_credential_validator_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederatePasswordCredentialValidator(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederatePasswordCredentialValidator(t, clientInfo) + tr := pingfederate_testable_resources.PasswordCredentialValidator(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/pingone_connection.go b/internal/connector/pingfederate/resources/pingone_connection.go index e47e6fc7..a8cd4040 100644 --- a/internal/connector/pingfederate/resources/pingone_connection.go +++ b/internal/connector/pingfederate/resources/pingone_connection.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederatePingoneConnectionResource) getPingoneConnectionData() (map[ return nil, err } if !ok { - return nil, nil + return pingoneConnectionData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/pingone_connection_test.go b/internal/connector/pingfederate/resources/pingone_connection_test.go index 8d4c3c5b..5b6f1d26 100644 --- a/internal/connector/pingfederate/resources/pingone_connection_test.go +++ b/internal/connector/pingfederate/resources/pingone_connection_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederatePingoneConnection(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederatePingoneConnection(t, clientInfo) + tr := pingfederate_testable_resources.PingoneConnection(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/protocol_metadata_lifetime_settings.go b/internal/connector/pingfederate/resources/protocol_metadata_lifetime_settings.go index e948ad7a..70f37db2 100644 --- a/internal/connector/pingfederate/resources/protocol_metadata_lifetime_settings.go +++ b/internal/connector/pingfederate/resources/protocol_metadata_lifetime_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/protocol_metadata_lifetime_settings_test.go b/internal/connector/pingfederate/resources/protocol_metadata_lifetime_settings_test.go index 5eb96b1a..623ad954 100644 --- a/internal/connector/pingfederate/resources/protocol_metadata_lifetime_settings_test.go +++ b/internal/connector/pingfederate/resources/protocol_metadata_lifetime_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateProtocolMetadataLifetimeSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.ProtocolMetadataLifetimeSettings(clientInfo) + tr := pingfederate_testable_resources.ProtocolMetadataLifetimeSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Protocol Metadata Lifetime Settings", ResourceID: "protocol_metadata_lifetime_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/protocol_metadata_signing_settings.go b/internal/connector/pingfederate/resources/protocol_metadata_signing_settings.go index addaff61..d70732cf 100644 --- a/internal/connector/pingfederate/resources/protocol_metadata_signing_settings.go +++ b/internal/connector/pingfederate/resources/protocol_metadata_signing_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/protocol_metadata_signing_settings_test.go b/internal/connector/pingfederate/resources/protocol_metadata_signing_settings_test.go index 93eeef88..876f2ae0 100644 --- a/internal/connector/pingfederate/resources/protocol_metadata_signing_settings_test.go +++ b/internal/connector/pingfederate/resources/protocol_metadata_signing_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateProtocolMetadataSigningSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.ProtocolMetadataSigningSettings(clientInfo) + tr := pingfederate_testable_resources.ProtocolMetadataSigningSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Protocol Metadata Signing Settings", ResourceID: "protocol_metadata_signing_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/redirect_validation.go b/internal/connector/pingfederate/resources/redirect_validation.go index 17acdebd..d36af645 100644 --- a/internal/connector/pingfederate/resources/redirect_validation.go +++ b/internal/connector/pingfederate/resources/redirect_validation.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/redirect_validation_test.go b/internal/connector/pingfederate/resources/redirect_validation_test.go index 9757b17c..917a0448 100644 --- a/internal/connector/pingfederate/resources/redirect_validation_test.go +++ b/internal/connector/pingfederate/resources/redirect_validation_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateRedirectValidation(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.RedirectValidation(clientInfo) + tr := pingfederate_testable_resources.RedirectValidation(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Redirect Validation", ResourceID: "redirect_validation_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/secret_manager.go b/internal/connector/pingfederate/resources/secret_manager.go index 6ecb7def..c5b36938 100644 --- a/internal/connector/pingfederate/resources/secret_manager.go +++ b/internal/connector/pingfederate/resources/secret_manager.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateSecretManagerResource) getSecretManagerData() (map[string]s return nil, err } if !ok { - return nil, nil + return secretManagerData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/secret_manager_test.go b/internal/connector/pingfederate/resources/secret_manager_test.go index 1bd2f954..13c69cd8 100644 --- a/internal/connector/pingfederate/resources/secret_manager_test.go +++ b/internal/connector/pingfederate/resources/secret_manager_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateSecretManager(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateSecretManager(t, clientInfo) + tr := pingfederate_testable_resources.SecretManager(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/server_settings.go b/internal/connector/pingfederate/resources/server_settings.go index 4bd70f50..3b808d8e 100644 --- a/internal/connector/pingfederate/resources/server_settings.go +++ b/internal/connector/pingfederate/resources/server_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/server_settings_general.go b/internal/connector/pingfederate/resources/server_settings_general.go index a2982a0f..150e6d9a 100644 --- a/internal/connector/pingfederate/resources/server_settings_general.go +++ b/internal/connector/pingfederate/resources/server_settings_general.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/server_settings_general_test.go b/internal/connector/pingfederate/resources/server_settings_general_test.go index b8892c32..894076f0 100644 --- a/internal/connector/pingfederate/resources/server_settings_general_test.go +++ b/internal/connector/pingfederate/resources/server_settings_general_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateServerSettingsGeneral(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.ServerSettingsGeneral(clientInfo) + tr := pingfederate_testable_resources.ServerSettingsGeneral(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Server Settings General", ResourceID: "server_settings_general_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/server_settings_logging.go b/internal/connector/pingfederate/resources/server_settings_logging.go index a77a709c..0a2448f0 100644 --- a/internal/connector/pingfederate/resources/server_settings_logging.go +++ b/internal/connector/pingfederate/resources/server_settings_logging.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/server_settings_logging_test.go b/internal/connector/pingfederate/resources/server_settings_logging_test.go index 8aac4a8a..ad3fcc8d 100644 --- a/internal/connector/pingfederate/resources/server_settings_logging_test.go +++ b/internal/connector/pingfederate/resources/server_settings_logging_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateServerSettingsLogging(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.ServerSettingsLogging(clientInfo) + tr := pingfederate_testable_resources.ServerSettingsLogging(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Server Settings Logging", ResourceID: "server_settings_logging_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/server_settings_system_keys_rotate.go b/internal/connector/pingfederate/resources/server_settings_system_keys_rotate.go index 10d1713a..72dfc3c7 100644 --- a/internal/connector/pingfederate/resources/server_settings_system_keys_rotate.go +++ b/internal/connector/pingfederate/resources/server_settings_system_keys_rotate.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/server_settings_system_keys_rotate_test.go b/internal/connector/pingfederate/resources/server_settings_system_keys_rotate_test.go index 4dee1a94..cf736cb9 100644 --- a/internal/connector/pingfederate/resources/server_settings_system_keys_rotate_test.go +++ b/internal/connector/pingfederate/resources/server_settings_system_keys_rotate_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateServerSettingsSystemKeysRotate(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.ServerSettingsSystemKeysRotate(clientInfo) + tr := pingfederate_testable_resources.ServerSettingsSystemKeysRotate(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Server Settings System Keys Rotate", ResourceID: "server_settings_system_keys_rotate_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/server_settings_test.go b/internal/connector/pingfederate/resources/server_settings_test.go index 26e43d37..a9569bc0 100644 --- a/internal/connector/pingfederate/resources/server_settings_test.go +++ b/internal/connector/pingfederate/resources/server_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateServerSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.ServerSettings(clientInfo) + tr := pingfederate_testable_resources.ServerSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Server Settings", ResourceID: "server_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings.go b/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings.go index 8925069b..b519c1d6 100644 --- a/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings.go +++ b/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_issuer_certificate.go b/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_issuer_certificate.go index aeafb4da..7f877f8b 100644 --- a/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_issuer_certificate.go +++ b/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_issuer_certificate.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -74,7 +75,7 @@ func (r *PingFederateServerSettingsWsTrustStsSettingsIssuerCertificateResource) return nil, err } if !ok { - return nil, nil + return serverSettingsWsTrustStsSettingsIssuerCertificateData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_issuer_certificate_test.go b/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_issuer_certificate_test.go index 3de586c6..93247cc6 100644 --- a/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_issuer_certificate_test.go +++ b/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_issuer_certificate_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,25 +10,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateServerSettingsWsTrustStsSettingsIssuerCertificate(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateServerSettingsWsTrustStsSettingsIssuerCertificate(t, clientInfo) + tr := pingfederate_testable_resources.ServerSettingsWsTrustStsSettingsIssuerCertificate(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", creationInfo[testutils_resource.ENUM_ISSUER_DN], creationInfo[testutils_resource.ENUM_SERIAL_NUMBER]), - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: fmt.Sprintf("%s_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ISSUER_DN], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SERIAL_NUMBER]), + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_test.go b/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_test.go index 57d55c69..88be0b24 100644 --- a/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_test.go +++ b/internal/connector/pingfederate/resources/server_settings_ws_trust_sts_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateServerSettingsWsTrustStsSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.ServerSettingsWsTrustStsSettings(clientInfo) + tr := pingfederate_testable_resources.ServerSettingsWsTrustStsSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Server Settings Ws Trust Sts Settings", ResourceID: "server_settings_ws_trust_sts_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/service_authentication.go b/internal/connector/pingfederate/resources/service_authentication.go index 9cfc0259..4fda53b9 100644 --- a/internal/connector/pingfederate/resources/service_authentication.go +++ b/internal/connector/pingfederate/resources/service_authentication.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/service_authentication_test.go b/internal/connector/pingfederate/resources/service_authentication_test.go index 8db5e7f0..e1750f7d 100644 --- a/internal/connector/pingfederate/resources/service_authentication_test.go +++ b/internal/connector/pingfederate/resources/service_authentication_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateServiceAuthentication(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.ServiceAuthentication(clientInfo) + tr := pingfederate_testable_resources.ServiceAuthentication(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Service Authentication", ResourceID: "service_authentication_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/session_application_policy.go b/internal/connector/pingfederate/resources/session_application_policy.go index 64759e0e..cae98c2f 100644 --- a/internal/connector/pingfederate/resources/session_application_policy.go +++ b/internal/connector/pingfederate/resources/session_application_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/session_application_policy_test.go b/internal/connector/pingfederate/resources/session_application_policy_test.go index 19736e2e..a50c8658 100644 --- a/internal/connector/pingfederate/resources/session_application_policy_test.go +++ b/internal/connector/pingfederate/resources/session_application_policy_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateSessionApplicationPolicy(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.SessionApplicationPolicy(clientInfo) + tr := pingfederate_testable_resources.SessionApplicationPolicy(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Session Application Policy", ResourceID: "session_application_policy_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/session_authentication_policies_global.go b/internal/connector/pingfederate/resources/session_authentication_policies_global.go index 148e9c40..b9cb2407 100644 --- a/internal/connector/pingfederate/resources/session_authentication_policies_global.go +++ b/internal/connector/pingfederate/resources/session_authentication_policies_global.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/session_authentication_policies_global_test.go b/internal/connector/pingfederate/resources/session_authentication_policies_global_test.go index 442dbfb4..13b53047 100644 --- a/internal/connector/pingfederate/resources/session_authentication_policies_global_test.go +++ b/internal/connector/pingfederate/resources/session_authentication_policies_global_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateSessionAuthenticationPoliciesGlobal(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.SessionAuthenticationPoliciesGlobal(clientInfo) + tr := pingfederate_testable_resources.SessionAuthenticationPoliciesGlobal(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Session Authentication Policies Global", ResourceID: "session_authentication_policies_global_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/session_authentication_policy.go b/internal/connector/pingfederate/resources/session_authentication_policy.go index bef32d71..32b2a570 100644 --- a/internal/connector/pingfederate/resources/session_authentication_policy.go +++ b/internal/connector/pingfederate/resources/session_authentication_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -74,7 +75,7 @@ func (r *PingFederateSessionAuthenticationPolicyResource) getSessionAuthenticati return nil, err } if !ok { - return nil, nil + return sessionAuthenticationPolicyData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/session_authentication_policy_test.go b/internal/connector/pingfederate/resources/session_authentication_policy_test.go index 700ab6a9..16921bf6 100644 --- a/internal/connector/pingfederate/resources/session_authentication_policy_test.go +++ b/internal/connector/pingfederate/resources/session_authentication_policy_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,25 +10,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateSessionAuthenticationPolicy(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateSessionAuthenticationPolicy(t, clientInfo) + tr := pingfederate_testable_resources.SessionAuthenticationPolicy(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s_%s", creationInfo[testutils_resource.ENUM_ID], creationInfo[testutils_resource.ENUM_TYPE], creationInfo[testutils_resource.ENUM_SOURCE_REF_ID]), - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: fmt.Sprintf("%s_%s_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TYPE], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SOURCE_REF_ID]), + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/session_settings.go b/internal/connector/pingfederate/resources/session_settings.go index 385382b9..abae7cbc 100644 --- a/internal/connector/pingfederate/resources/session_settings.go +++ b/internal/connector/pingfederate/resources/session_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/session_settings_test.go b/internal/connector/pingfederate/resources/session_settings_test.go index d3995f2c..a7b2ca75 100644 --- a/internal/connector/pingfederate/resources/session_settings_test.go +++ b/internal/connector/pingfederate/resources/session_settings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateSessionSettings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.SessionSettings(clientInfo) + tr := pingfederate_testable_resources.SessionSettings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Session Settings", ResourceID: "session_settings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/sp_adapter.go b/internal/connector/pingfederate/resources/sp_adapter.go index e0a0930f..06d86063 100644 --- a/internal/connector/pingfederate/resources/sp_adapter.go +++ b/internal/connector/pingfederate/resources/sp_adapter.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateSpAdapterResource) getSpAdapterData() (map[string]string, e return nil, err } if !ok { - return nil, nil + return spAdapterData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/sp_adapter_test.go b/internal/connector/pingfederate/resources/sp_adapter_test.go index 740b1100..03064b10 100644 --- a/internal/connector/pingfederate/resources/sp_adapter_test.go +++ b/internal/connector/pingfederate/resources/sp_adapter_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateSpAdapter(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateSpAdapter(t, clientInfo) + tr := pingfederate_testable_resources.SpAdapter(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/sp_authentication_policy_contract_mapping.go b/internal/connector/pingfederate/resources/sp_authentication_policy_contract_mapping.go index 97015169..e6a709a4 100644 --- a/internal/connector/pingfederate/resources/sp_authentication_policy_contract_mapping.go +++ b/internal/connector/pingfederate/resources/sp_authentication_policy_contract_mapping.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -74,7 +75,7 @@ func (r *PingFederateSpAuthenticationPolicyContractMappingResource) getSpAuthent return nil, err } if !ok { - return nil, nil + return spAuthenticationPolicyContractMappingData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/sp_authentication_policy_contract_mapping_test.go b/internal/connector/pingfederate/resources/sp_authentication_policy_contract_mapping_test.go index 4f90776d..0b5dbab3 100644 --- a/internal/connector/pingfederate/resources/sp_authentication_policy_contract_mapping_test.go +++ b/internal/connector/pingfederate/resources/sp_authentication_policy_contract_mapping_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,25 +10,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateSpAuthenticationPolicyContractMapping(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateSpAuthenticationPolicyContractMapping(t, clientInfo) + tr := pingfederate_testable_resources.SpAuthenticationPolicyContractMapping(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_to_%s", creationInfo[testutils_resource.ENUM_SOURCE_ID], creationInfo[testutils_resource.ENUM_TARGET_ID]), - ResourceID: fmt.Sprintf("%s|%s", creationInfo[testutils_resource.ENUM_SOURCE_ID], creationInfo[testutils_resource.ENUM_TARGET_ID]), + ResourceName: fmt.Sprintf("%s_to_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SOURCE_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TARGET_ID]), + ResourceID: fmt.Sprintf("%s|%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SOURCE_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TARGET_ID]), }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/sp_idp_connection.go b/internal/connector/pingfederate/resources/sp_idp_connection.go index b39b01fa..8c10f222 100644 --- a/internal/connector/pingfederate/resources/sp_idp_connection.go +++ b/internal/connector/pingfederate/resources/sp_idp_connection.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,7 +69,7 @@ func (r *PingFederateSpIdpConnectionResource) getSpIdpConnectionData() (map[stri return nil, err } if !ok { - return nil, nil + return spIdpConnectionData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/sp_idp_connection_test.go b/internal/connector/pingfederate/resources/sp_idp_connection_test.go index 7eb4d518..31495480 100644 --- a/internal/connector/pingfederate/resources/sp_idp_connection_test.go +++ b/internal/connector/pingfederate/resources/sp_idp_connection_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -8,25 +9,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateSpIdpConnection(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateSpIdpConnection(t, clientInfo) + tr := pingfederate_testable_resources.SpIdpConnection(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: creationInfo[testutils_resource.ENUM_NAME], - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/sp_target_url_mappings.go b/internal/connector/pingfederate/resources/sp_target_url_mappings.go index 554ac181..38ae01bb 100644 --- a/internal/connector/pingfederate/resources/sp_target_url_mappings.go +++ b/internal/connector/pingfederate/resources/sp_target_url_mappings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/sp_target_url_mappings_test.go b/internal/connector/pingfederate/resources/sp_target_url_mappings_test.go index 345681f1..028dc2b2 100644 --- a/internal/connector/pingfederate/resources/sp_target_url_mappings_test.go +++ b/internal/connector/pingfederate/resources/sp_target_url_mappings_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateSpTargetUrlMappings(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.SpTargetUrlMappings(clientInfo) + tr := pingfederate_testable_resources.SpTargetUrlMappings(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Sp Target Url Mappings", ResourceID: "sp_target_url_mappings_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingfederate/resources/token_processor_to_token_generator_mapping.go b/internal/connector/pingfederate/resources/token_processor_to_token_generator_mapping.go index 3b146668..2844acee 100644 --- a/internal/connector/pingfederate/resources/token_processor_to_token_generator_mapping.go +++ b/internal/connector/pingfederate/resources/token_processor_to_token_generator_mapping.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -74,7 +75,7 @@ func (r *PingFederateTokenProcessorToTokenGeneratorMappingResource) getTokenProc return nil, err } if !ok { - return nil, nil + return tokenProcessorToTokenGeneratorMappingData, nil } if apiObj == nil { diff --git a/internal/connector/pingfederate/resources/token_processor_to_token_generator_mapping_test.go b/internal/connector/pingfederate/resources/token_processor_to_token_generator_mapping_test.go index f48b361a..6c80f8fe 100644 --- a/internal/connector/pingfederate/resources/token_processor_to_token_generator_mapping_test.go +++ b/internal/connector/pingfederate/resources/token_processor_to_token_generator_mapping_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -9,25 +10,24 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/testing/testutils" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateTokenProcessorToTokenGeneratorMapping(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - tr := pingfederate.TestableResource_PingFederateTokenProcessorToTokenGeneratorMapping(t, clientInfo) + tr := pingfederate_testable_resources.TokenProcessorToTokenGeneratorMapping(t, clientInfo) - creationInfo := tr.CreateResource(t) + tr.CreateResource(t) defer tr.DeleteResource(t) expectedImportBlocks := []connector.ImportBlock{ { ResourceType: tr.ExportableResource.ResourceType(), - ResourceName: fmt.Sprintf("%s_to_%s", creationInfo[testutils_resource.ENUM_SOURCE_ID], creationInfo[testutils_resource.ENUM_TARGET_ID]), - ResourceID: creationInfo[testutils_resource.ENUM_ID], + ResourceName: fmt.Sprintf("%s_to_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SOURCE_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TARGET_ID]), + ResourceID: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], }, } testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) - } diff --git a/internal/connector/pingfederate/resources/virtual_host_names.go b/internal/connector/pingfederate/resources/virtual_host_names.go index 956e534d..b30635ab 100644 --- a/internal/connector/pingfederate/resources/virtual_host_names.go +++ b/internal/connector/pingfederate/resources/virtual_host_names.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources diff --git a/internal/connector/pingfederate/resources/virtual_host_names_test.go b/internal/connector/pingfederate/resources/virtual_host_names_test.go index a802ce06..1a439969 100644 --- a/internal/connector/pingfederate/resources/virtual_host_names_test.go +++ b/internal/connector/pingfederate/resources/virtual_host_names_test.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources_test @@ -6,23 +7,22 @@ import ( "testing" "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingfederate_testable_resources" ) func Test_PingFederateVirtualHostNames(t *testing.T) { clientInfo := testutils.GetClientInfo(t) - resource := resources.VirtualHostNames(clientInfo) + tr := pingfederate_testable_resources.VirtualHostNames(t, clientInfo) expectedImportBlocks := []connector.ImportBlock{ { - ResourceType: resource.ResourceType(), + ResourceType: tr.ExportableResource.ResourceType(), ResourceName: "Virtual Host Names", ResourceID: "virtual_host_names_singleton_id", }, } - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) - + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) } diff --git a/internal/connector/pingone/authorize/pingone_authorize_connector.go b/internal/connector/pingone/authorize/pingone_authorize_connector.go index bddf4d5a..1490d1b6 100644 --- a/internal/connector/pingone/authorize/pingone_authorize_connector.go +++ b/internal/connector/pingone/authorize/pingone_authorize_connector.go @@ -44,11 +44,11 @@ func (c *PingoneAuthorizeConnector) Export(format, outputDir string, overwriteEx l.Debug().Msgf("Exporting all PingOne Authorize Resources...") exportableResources := []connector.ExportableResource{ - resources.AuthorizeAPIService(&c.clientInfo), - resources.AuthorizeAPIServiceDeployment(&c.clientInfo), - resources.AuthorizeAPIServiceOperation(&c.clientInfo), + resources.AuthorizeApiService(&c.clientInfo), + resources.AuthorizeApiServiceDeployment(&c.clientInfo), + resources.AuthorizeApiServiceOperation(&c.clientInfo), resources.ApplicationResource(&c.clientInfo), - resources.AuthorizeApplicationResourcePermission(&c.clientInfo), + resources.ApplicationResourcePermission(&c.clientInfo), resources.AuthorizeApplicationRole(&c.clientInfo), resources.AuthorizeApplicationRolePermission(&c.clientInfo), resources.AuthorizeDecisionEndpoint(&c.clientInfo), diff --git a/internal/connector/pingone/authorize/pingone_authorize_connector_test.go b/internal/connector/pingone/authorize/pingone_authorize_connector_test.go index cde98b5a..0d4f3635 100644 --- a/internal/connector/pingone/authorize/pingone_authorize_connector_test.go +++ b/internal/connector/pingone/authorize/pingone_authorize_connector_test.go @@ -5,9 +5,9 @@ package authorize_test import ( "testing" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_authorize_testable_resources" "github.com/pingidentity/pingcli/internal/testing/testutils_terraform" ) @@ -17,45 +17,59 @@ func TestAuthorizeTerraformPlan(t *testing.T) { testutils_terraform.InitPingOneTerraform(t) testCases := []struct { - name string - resource connector.ExportableResource - ignoredErrors []string + name string + testableResource *testutils_resource.TestableResource + ignoredErrors []string }{ { - name: "AuthorizeAPIService", - resource: resources.AuthorizeAPIService(clientInfo), - ignoredErrors: nil, + name: "ApplicationResource", + testableResource: pingone_authorize_testable_resources.ApplicationResource(t, clientInfo), + ignoredErrors: nil, }, { - name: "AuthorizeAPIServiceDeployment", - resource: resources.AuthorizeAPIServiceDeployment(clientInfo), - ignoredErrors: nil, + name: "ApplicationResourcePermission", + testableResource: pingone_authorize_testable_resources.ApplicationResourcePermission(t, clientInfo), + ignoredErrors: nil, }, { - name: "AuthorizeAPIServiceOperation", - resource: resources.AuthorizeAPIServiceOperation(clientInfo), - ignoredErrors: nil, + name: "AuthorizeAPIService", + testableResource: pingone_authorize_testable_resources.AuthorizeApiService(t, clientInfo), + ignoredErrors: nil, }, { - name: "AuthorizeApplicationRole", - resource: resources.AuthorizeApplicationRole(clientInfo), - ignoredErrors: nil, + name: "AuthorizeAPIServiceDeployment", + testableResource: pingone_authorize_testable_resources.AuthorizeApiServiceDeployment(t, clientInfo), + ignoredErrors: nil, }, { - name: "AuthorizeApplicationRolePermission", - resource: resources.AuthorizeApplicationRolePermission(clientInfo), - ignoredErrors: nil, + name: "AuthorizeAPIServiceOperation", + testableResource: pingone_authorize_testable_resources.AuthorizeApiServiceOperation(t, clientInfo), + ignoredErrors: nil, }, { - name: "AuthorizeDecisionEndpoint", - resource: resources.AuthorizeDecisionEndpoint(clientInfo), - ignoredErrors: nil, + name: "AuthorizeApplicationRole", + testableResource: pingone_authorize_testable_resources.AuthorizeApplicationRole(t, clientInfo), + ignoredErrors: nil, }, + { + name: "AuthorizeApplicationRolePermission", + testableResource: pingone_authorize_testable_resources.AuthorizeApplicationRolePermission(t, clientInfo), + ignoredErrors: nil, + }, + // TODO: Remove after completion of TRIAGE-26607 + // { + // name: "AuthorizeDecisionEndpoint", + // testableResource: pingone_authorize_testable_resources.AuthorizeDecisionEndpoint(t, clientInfo), + // ignoredErrors: nil, + // }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - testutils_terraform.ValidateTerraformPlan(t, tc.resource, tc.ignoredErrors) + tc.testableResource.CreateResource(t) + defer tc.testableResource.DeleteResource(t) + + testutils_terraform.ValidateTerraformPlan(t, tc.testableResource.ExportableResource, tc.ignoredErrors) }) } } diff --git a/internal/connector/pingone/authorize/resources/pingone_application_resource.go b/internal/connector/pingone/authorize/resources/application_resource.go similarity index 64% rename from internal/connector/pingone/authorize/resources/pingone_application_resource.go rename to internal/connector/pingone/authorize/resources/application_resource.go index a7d6f38f..a402486b 100644 --- a/internal/connector/pingone/authorize/resources/pingone_application_resource.go +++ b/internal/connector/pingone/authorize/resources/application_resource.go @@ -32,12 +32,6 @@ func (r *PingOneApplicationResourceResource) ResourceType() string { return "pingone_application_resource" } -type applicationResourceObj struct { - applicationResourceName string - resourceId string - resourceName string -} - func (r *PingOneApplicationResourceResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) @@ -49,20 +43,32 @@ func (r *PingOneApplicationResourceResource) ExportAll() (*[]connector.ImportBlo return nil, err } - for applicationResourceId, applicationResourceObj := range applicationResourceData { + for applicationResourceId, applicationResourceInfo := range applicationResourceData { + applicationResourceName := applicationResourceInfo[0] + resourceId := applicationResourceInfo[1] + + resourceName, resourceNameOk, err := r.getResourceName(resourceId) + if err != nil { + return nil, err + } + + if !resourceNameOk { + continue + } + commentData := map[string]string{ - "PingOne Resource ID": applicationResourceObj.resourceId, - "PingOne Resource Name": applicationResourceObj.resourceName, + "PingOne Resource ID": resourceId, + "PingOne Resource Name": *resourceName, "Application Resource ID": applicationResourceId, - "Application Resource Name": applicationResourceObj.applicationResourceName, + "Application Resource Name": applicationResourceName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", applicationResourceObj.resourceName, applicationResourceObj.applicationResourceName), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationResourceObj.resourceId, applicationResourceId), + ResourceName: fmt.Sprintf("%s_%s", *resourceName, applicationResourceName), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, resourceId, applicationResourceId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -72,8 +78,8 @@ func (r *PingOneApplicationResourceResource) ExportAll() (*[]connector.ImportBlo return &importBlocks, nil } -func (r *PingOneApplicationResourceResource) getApplicationResourceData() (map[string]applicationResourceObj, error) { - applicationResourceData := make(map[string]applicationResourceObj) +func (r *PingOneApplicationResourceResource) getApplicationResourceData() (map[string][]string, error) { + applicationResourceData := make(map[string][]string) iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationResourcesApi.ReadApplicationResources(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() applicationResources, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.ApplicationResource](iter, "ReadApplicationResources", "GetResources", r.ResourceType()) @@ -87,24 +93,31 @@ func (r *PingOneApplicationResourceResource) getApplicationResourceData() (map[s resourceId, resourceIdOk := applicationResource.Parent.GetIdOk() if applicationResourceIdOk && applicationResourceNameOk && resourceIdOk { - - resourceObj, httpResponse, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadOneResource(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, *resourceId).Execute() - ok, err := common.HandleClientResponse(httpResponse, err, "ReadOneResource", r.ResourceType()) - if err != nil { - return nil, err - } - // A warning was given when handling the client response. Return nil apiObjects to skip export of resource - if !ok { - return nil, nil - } - - applicationResourceData[*applicationResourceId] = applicationResourceObj{ - applicationResourceName: *applicationResourceName, - resourceId: *resourceId, - resourceName: resourceObj.GetName(), - } + applicationResourceData[*applicationResourceId] = []string{*applicationResourceName, *resourceId} } } return applicationResourceData, nil } + +func (r *PingOneApplicationResourceResource) getResourceName(resourceId string) (*string, bool, error) { + apiObj, httpResponse, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadOneResource(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, resourceId).Execute() + ok, err := common.HandleClientResponse(httpResponse, err, "ReadOneResource", r.ResourceType()) + if err != nil { + return nil, false, err + } + if !ok { + return nil, false, nil + } + + if apiObj == nil { + return nil, false, nil + } + + resourceName, resourceNameOk := apiObj.GetNameOk() + if !resourceNameOk { + return nil, false, nil + } + + return resourceName, true, nil +} diff --git a/internal/connector/pingone/authorize/resources/application_resource_permission.go b/internal/connector/pingone/authorize/resources/application_resource_permission.go new file mode 100644 index 00000000..fd194d70 --- /dev/null +++ b/internal/connector/pingone/authorize/resources/application_resource_permission.go @@ -0,0 +1,141 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" + "github.com/pingidentity/pingcli/internal/utils" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneApplicationResourcePermissionResource{} +) + +type PingOneApplicationResourcePermissionResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneApplicationResourcePermissionResource +func ApplicationResourcePermission(clientInfo *connector.ClientInfo) *PingOneApplicationResourcePermissionResource { + return &PingOneApplicationResourcePermissionResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneApplicationResourcePermissionResource) ResourceType() string { + return "pingone_application_resource_permission" +} + +func (r *PingOneApplicationResourcePermissionResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + applicationResourceData, err := r.getApplicationResourceData() + if err != nil { + return nil, err + } + + for applicationResourceId, applicationResourceName := range applicationResourceData { + applicationResourcePermissionData, err := r.getApplicationResourcePermissionData(applicationResourceId) + if err != nil { + return nil, err + } + + for applicationResourcePermissionId, applicationResourcePermissionKey := range applicationResourcePermissionData { + commentData := map[string]string{ + "Application Resource ID": applicationResourceId, + "Application Resource Name": applicationResourceName, + "Application Resource Permission ID": applicationResourcePermissionId, + "Application Resource Permission Key": applicationResourcePermissionKey, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", applicationResourceName, applicationResourcePermissionKey), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationResourceId, applicationResourcePermissionId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + } + + return &importBlocks, nil +} + +func (r *PingOneApplicationResourcePermissionResource) getApplicationResourceData() (map[string]string, error) { + applicationResourceData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationResourcesApi.ReadApplicationResources(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.ApplicationResource](iter, "ReadApplicationResources", "GetResources", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, applicationResource := range apiObjs { + applicationResourceId, applicationResourceIdOk := applicationResource.GetIdOk() + applicationResourceName, applicationResourceNameOk := applicationResource.GetNameOk() + + if applicationResourceIdOk && applicationResourceNameOk { + applicationResourceData[*applicationResourceId] = *applicationResourceName + } + } + + return applicationResourceData, nil +} + +func (r *PingOneApplicationResourcePermissionResource) getApplicationResourcePermissionData(applicationResourceId string) (map[string]string, error) { + applicationResourcePermissionData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationResourcePermissionsApi.ReadApplicationPermissions(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, applicationResourceId).Execute() + apiObjs, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.EntityArrayEmbeddedPermissionsInner](iter, "ReadApplicationPermissions", "GetPermissions", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, innerObj := range apiObjs { + var ( + applicationResourcePermissionId *string + applicationResourcePermissionIdOk bool + + applicationResourcePermissionKey *string + applicationResourcePermissionKeyOk bool + ) + + switch { + case innerObj.ApplicationResourcePermission != nil: + applicationResourcePermissionId, applicationResourcePermissionIdOk = innerObj.ApplicationResourcePermission.GetIdOk() + applicationResourcePermissionAction, applicationResourcePermissionActionOk := innerObj.ApplicationResourcePermission.GetActionOk() + applicationResourcePermissionResource, applicationResourcePermissionResourceOk := innerObj.ApplicationResourcePermission.GetResourceOk() + + if applicationResourcePermissionIdOk && applicationResourcePermissionActionOk && applicationResourcePermissionResourceOk { + applicationResourcePermissionResourceName, applicationResourcePermissionResourceNameOk := applicationResourcePermissionResource.GetNameOk() + + if applicationResourcePermissionResourceNameOk { + applicationResourcePermissionKey, applicationResourcePermissionKeyOk = utils.Pointer(fmt.Sprintf("%s:%s", *applicationResourcePermissionResourceName, *applicationResourcePermissionAction)), true + } + } + case innerObj.ApplicationRolePermission != nil: + applicationResourcePermissionId, applicationResourcePermissionIdOk = innerObj.ApplicationRolePermission.GetIdOk() + applicationResourcePermissionKey, applicationResourcePermissionKeyOk = innerObj.ApplicationRolePermission.GetKeyOk() + } + + if applicationResourcePermissionIdOk && applicationResourcePermissionKeyOk { + applicationResourcePermissionData[*applicationResourcePermissionId] = *applicationResourcePermissionKey + } + } + + return applicationResourcePermissionData, nil +} diff --git a/internal/connector/pingone/authorize/resources/application_resource_permission_test.go b/internal/connector/pingone/authorize/resources/application_resource_permission_test.go new file mode 100644 index 00000000..11f8afbe --- /dev/null +++ b/internal/connector/pingone/authorize/resources/application_resource_permission_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_authorize_testable_resources" +) + +func Test_ApplicationResourcePermission(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_authorize_testable_resources.ApplicationResourcePermission(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + applicationResourceTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", applicationResourceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, applicationResourceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/authorize/resources/application_resource_test.go b/internal/connector/pingone/authorize/resources/application_resource_test.go new file mode 100644 index 00000000..ef859af4 --- /dev/null +++ b/internal/connector/pingone/authorize/resources/application_resource_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_authorize_testable_resources" +) + +func Test_ApplicationResource(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_authorize_testable_resources.ApplicationResource(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + resourceTr := tr.Dependencies[0] + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", resourceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, resourceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/authorize/resources/authorize_api_service.go b/internal/connector/pingone/authorize/resources/authorize_api_service.go new file mode 100644 index 00000000..f06553f5 --- /dev/null +++ b/internal/connector/pingone/authorize/resources/authorize_api_service.go @@ -0,0 +1,87 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneAuthorizeApiServiceResource{} +) + +type PingOneAuthorizeApiServiceResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneAuthorizeApiServiceResource +func AuthorizeApiService(clientInfo *connector.ClientInfo) *PingOneAuthorizeApiServiceResource { + return &PingOneAuthorizeApiServiceResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneAuthorizeApiServiceResource) ResourceType() string { + return "pingone_authorize_api_service" +} + +func (r *PingOneAuthorizeApiServiceResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + authorizeApiServiceData, err := r.getAuthorizeApiServiceData() + if err != nil { + return nil, err + } + + for authorizeApiServiceId, authorizeApiServiceName := range authorizeApiServiceData { + commentData := map[string]string{ + "Authorize Api Service ID": authorizeApiServiceId, + "Authorize Api Service Name": authorizeApiServiceName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: authorizeApiServiceName, + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, authorizeApiServiceId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingOneAuthorizeApiServiceResource) getAuthorizeApiServiceData() (map[string]string, error) { + authorizeApiServiceData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServersApi.ReadAllAPIServers(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.APIServer](iter, "ReadAllAPIServers", "GetApiServers", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, authorizeApiService := range apiObjs { + authorizeApiServiceId, authorizeApiServiceIdOk := authorizeApiService.GetIdOk() + authorizeApiServiceName, authorizeApiServiceNameOk := authorizeApiService.GetNameOk() + + if authorizeApiServiceIdOk && authorizeApiServiceNameOk { + authorizeApiServiceData[*authorizeApiServiceId] = *authorizeApiServiceName + } + } + + return authorizeApiServiceData, nil +} diff --git a/internal/connector/pingone/authorize/resources/authorize_api_service_deployment.go b/internal/connector/pingone/authorize/resources/authorize_api_service_deployment.go new file mode 100644 index 00000000..c16f1970 --- /dev/null +++ b/internal/connector/pingone/authorize/resources/authorize_api_service_deployment.go @@ -0,0 +1,116 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneAuthorizeApiServiceDeploymentResource{} +) + +type PingOneAuthorizeApiServiceDeploymentResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneAuthorizeApiServiceDeploymentResource +func AuthorizeApiServiceDeployment(clientInfo *connector.ClientInfo) *PingOneAuthorizeApiServiceDeploymentResource { + return &PingOneAuthorizeApiServiceDeploymentResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneAuthorizeApiServiceDeploymentResource) ResourceType() string { + return "pingone_authorize_api_service_deployment" +} + +func (r *PingOneAuthorizeApiServiceDeploymentResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + apiServiceData, err := r.getAPIServiceData() + if err != nil { + return nil, err + } + + for apiServiceId, apiServiceName := range apiServiceData { + ok, err := r.checkAuthorizeApiServiceDeploymentData(apiServiceId) + if err != nil { + return nil, err + } + if !ok { + continue + } + + commentData := map[string]string{ + "API Service ID": apiServiceId, + "API Service Name": apiServiceName, + "Resource Type": r.ResourceType(), + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_deployment", apiServiceName), + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, apiServiceId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingOneAuthorizeApiServiceDeploymentResource) getAPIServiceData() (map[string]string, error) { + apiServiceData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServersApi.ReadAllAPIServers(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.APIServer](iter, "ReadAllAPIServers", "GetApiServers", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, apiService := range apiObjs { + apiServiceId, apiServiceIdOk := apiService.GetIdOk() + apiServiceName, apiServiceNameOk := apiService.GetNameOk() + + if apiServiceIdOk && apiServiceNameOk { + apiServiceData[*apiServiceId] = *apiServiceName + } + } + + return apiServiceData, nil +} + +func (r *PingOneAuthorizeApiServiceDeploymentResource) checkAuthorizeApiServiceDeploymentData(apiServerId string) (bool, error) { + apiObj, response, err := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServerDeploymentApi.ReadDeploymentStatus(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, apiServerId).Execute() + ok, err := common.CheckSingletonResource(response, err, "ReadDeploymentStatus", r.ResourceType()) + if err != nil { + return false, err + } + if !ok { + return false, nil + } + + status, statusOk := apiObj.GetStatusOk() + if statusOk { + statusCode, statusCodeOk := status.GetCodeOk() + if statusCodeOk && statusCode != nil && *statusCode != "DEPLOYMENT_UNINITIALIZED" { + return true, nil + } + } + + return false, nil +} diff --git a/internal/connector/pingone/authorize/resources/authorize_api_service_deployment_test.go b/internal/connector/pingone/authorize/resources/authorize_api_service_deployment_test.go new file mode 100644 index 00000000..87eae675 --- /dev/null +++ b/internal/connector/pingone/authorize/resources/authorize_api_service_deployment_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_authorize_testable_resources" +) + +func Test_AuthorizeApiServiceDeployment(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_authorize_testable_resources.AuthorizeApiServiceDeployment(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + apiServiceTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_deployment", apiServiceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, apiServiceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/authorize/resources/authorize_api_service_operation.go b/internal/connector/pingone/authorize/resources/authorize_api_service_operation.go new file mode 100644 index 00000000..b5a3d57d --- /dev/null +++ b/internal/connector/pingone/authorize/resources/authorize_api_service_operation.go @@ -0,0 +1,117 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneAuthorizeApiServiceOperationResource{} +) + +type PingOneAuthorizeApiServiceOperationResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneAuthorizeApiServiceOperationResource +func AuthorizeApiServiceOperation(clientInfo *connector.ClientInfo) *PingOneAuthorizeApiServiceOperationResource { + return &PingOneAuthorizeApiServiceOperationResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneAuthorizeApiServiceOperationResource) ResourceType() string { + return "pingone_authorize_api_service_operation" +} + +func (r *PingOneAuthorizeApiServiceOperationResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + apiServerData, err := r.getApiServerData() + if err != nil { + return nil, err + } + + for apiServerId, apiServerName := range apiServerData { + authorizeApiServiceOperationData, err := r.getAuthorizeApiServiceOperationData(apiServerId) + if err != nil { + return nil, err + } + + for authorizeApiServiceOperationId, authorizeApiServiceOperationName := range authorizeApiServiceOperationData { + commentData := map[string]string{ + "Authorize Api Server ID": apiServerId, + "Authorize Api Server Name": apiServerName, + "Authorize Api Server Operation ID": authorizeApiServiceOperationId, + "Authorize Api Server Operation Name": authorizeApiServiceOperationName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", apiServerName, authorizeApiServiceOperationName), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, apiServerId, authorizeApiServiceOperationId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + } + + return &importBlocks, nil +} + +func (r *PingOneAuthorizeApiServiceOperationResource) getApiServerData() (map[string]string, error) { + apiServerData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServersApi.ReadAllAPIServers(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.APIServer](iter, "ReadAllAPIServers", "GetApiServers", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, apiServer := range apiObjs { + apiServerId, apiServerIdOk := apiServer.GetIdOk() + apiServerName, apiServerNameOk := apiServer.GetNameOk() + + if apiServerIdOk && apiServerNameOk { + apiServerData[*apiServerId] = *apiServerName + } + } + + return apiServerData, nil +} + +func (r *PingOneAuthorizeApiServiceOperationResource) getAuthorizeApiServiceOperationData(apiServerId string) (map[string]string, error) { + authorizeApiServiceOperationData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServerOperationsApi.ReadAllAPIServerOperations(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, apiServerId).Execute() + apiObjs, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.APIServerOperation](iter, "ReadAllAPIServerOperations", "GetOperations", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, authorizeApiServiceOperation := range apiObjs { + authorizeApiServiceOperationId, authorizeApiServiceOperationIdOk := authorizeApiServiceOperation.GetIdOk() + authorizeApiServiceOperationName, authorizeApiServiceOperationNameOk := authorizeApiServiceOperation.GetNameOk() + + if authorizeApiServiceOperationIdOk && authorizeApiServiceOperationNameOk { + authorizeApiServiceOperationData[*authorizeApiServiceOperationId] = *authorizeApiServiceOperationName + } + } + + return authorizeApiServiceOperationData, nil +} diff --git a/internal/connector/pingone/authorize/resources/authorize_api_service_operation_test.go b/internal/connector/pingone/authorize/resources/authorize_api_service_operation_test.go new file mode 100644 index 00000000..5877a98c --- /dev/null +++ b/internal/connector/pingone/authorize/resources/authorize_api_service_operation_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_authorize_testable_resources" +) + +func Test_AuthorizeApiServiceOperation(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_authorize_testable_resources.AuthorizeApiServiceOperation(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + apiServiceTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", apiServiceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, apiServiceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/authorize/resources/authorize_api_service_test.go b/internal/connector/pingone/authorize/resources/authorize_api_service_test.go new file mode 100644 index 00000000..350bbf06 --- /dev/null +++ b/internal/connector/pingone/authorize/resources/authorize_api_service_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_authorize_testable_resources" +) + +func Test_AuthorizeApiService(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_authorize_testable_resources.AuthorizeApiService(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/authorize/resources/authorize_application_role.go b/internal/connector/pingone/authorize/resources/authorize_application_role.go new file mode 100644 index 00000000..b591237b --- /dev/null +++ b/internal/connector/pingone/authorize/resources/authorize_application_role.go @@ -0,0 +1,87 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneAuthorizeApplicationRoleResource{} +) + +type PingOneAuthorizeApplicationRoleResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneAuthorizeApplicationRoleResource +func AuthorizeApplicationRole(clientInfo *connector.ClientInfo) *PingOneAuthorizeApplicationRoleResource { + return &PingOneAuthorizeApplicationRoleResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneAuthorizeApplicationRoleResource) ResourceType() string { + return "pingone_authorize_application_role" +} + +func (r *PingOneAuthorizeApplicationRoleResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + authorizeApplicationRoleData, err := r.getAuthorizeApplicationRoleData() + if err != nil { + return nil, err + } + + for authorizeApplicationRoleId, authorizeApplicationRoleName := range authorizeApplicationRoleData { + commentData := map[string]string{ + "Authorize Application Role ID": authorizeApplicationRoleId, + "Authorize Application Role Name": authorizeApplicationRoleName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: authorizeApplicationRoleName, + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, authorizeApplicationRoleId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingOneAuthorizeApplicationRoleResource) getAuthorizeApplicationRoleData() (map[string]string, error) { + authorizeApplicationRoleData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationRolesApi.ReadApplicationRoles(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.ApplicationRole](iter, "ReadApplicationRoles", "GetRoles", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, authorizeApplicationRole := range apiObjs { + authorizeApplicationRoleId, authorizeApplicationRoleIdOk := authorizeApplicationRole.GetIdOk() + authorizeApplicationRoleName, authorizeApplicationRoleNameOk := authorizeApplicationRole.GetNameOk() + + if authorizeApplicationRoleIdOk && authorizeApplicationRoleNameOk { + authorizeApplicationRoleData[*authorizeApplicationRoleId] = *authorizeApplicationRoleName + } + } + + return authorizeApplicationRoleData, nil +} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_application_role_permission.go b/internal/connector/pingone/authorize/resources/authorize_application_role_permission.go similarity index 67% rename from internal/connector/pingone/authorize/resources/pingone_authorize_application_role_permission.go rename to internal/connector/pingone/authorize/resources/authorize_application_role_permission.go index a2d1a8c9..28c982bf 100644 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_application_role_permission.go +++ b/internal/connector/pingone/authorize/resources/authorize_application_role_permission.go @@ -28,6 +28,10 @@ func AuthorizeApplicationRolePermission(clientInfo *connector.ClientInfo) *Pingo } } +func (r *PingoneAuthorizeApplicationRolePermissionResource) ResourceType() string { + return "pingone_authorize_application_role_permission" +} + func (r *PingoneAuthorizeApplicationRolePermissionResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) @@ -39,26 +43,26 @@ func (r *PingoneAuthorizeApplicationRolePermissionResource) ExportAll() (*[]conn return nil, err } - for appRoleId, appRoleName := range applicationRoleData { - appRolePermissionData, err := r.getApplicationRolePermissionData(appRoleId) + for applicationRoleId, applicationRoleName := range applicationRoleData { + appRolePermissionData, err := r.getApplicationRolePermissionData(applicationRoleId) if err != nil { return nil, err } - for appRolePermissionId, appRolePermissionKey := range appRolePermissionData { + for applicationRolePermissionId, applicationRolePermissionKey := range appRolePermissionData { commentData := map[string]string{ - "Application Role ID": appRoleId, - "Application Role Name": appRoleName, - "Application Role Permission ID": appRolePermissionId, - "Application Role Permission Key": appRolePermissionKey, + "Application Role ID": applicationRoleId, + "Application Role Name": applicationRoleName, + "Application Role Permission ID": applicationRolePermissionId, + "Application Role Permission Key": applicationRolePermissionKey, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", appRoleName, appRolePermissionKey), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, appRoleId, appRolePermissionId), + ResourceName: fmt.Sprintf("%s_%s", applicationRoleName, applicationRolePermissionKey), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationRoleId, applicationRolePermissionId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -73,12 +77,12 @@ func (r *PingoneAuthorizeApplicationRolePermissionResource) getApplicationRoleDa applicationRoleData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationRolesApi.ReadApplicationRoles(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - applicationRoles, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.ApplicationRole](iter, "ReadApplicationRoles", "GetRoles", r.ResourceType()) + apiObjs, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.ApplicationRole](iter, "ReadApplicationRoles", "GetRoles", r.ResourceType()) if err != nil { return nil, err } - for _, applicationRole := range applicationRoles { + for _, applicationRole := range apiObjs { applicationRoleId, applicationRoleIdOk := applicationRole.GetIdOk() applicationRoleName, applicationRoleNameOk := applicationRole.GetNameOk() @@ -94,36 +98,21 @@ func (r *PingoneAuthorizeApplicationRolePermissionResource) getApplicationRolePe applicationRolePermissionData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationRolePermissionsApi.ReadApplicationRolePermissions(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, appRoleId).Execute() - applicationRolePermissions, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.EntityArrayEmbeddedPermissionsInner](iter, "ReadApplicationRolePermissions", "GetPermissions", r.ResourceType()) + apiObjs, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.EntityArrayEmbeddedPermissionsInner](iter, "ReadApplicationRolePermissions", "GetPermissions", r.ResourceType()) if err != nil { return nil, err } - for _, applicationRolePermission := range applicationRolePermissions { - - var ( - applicationRolePermissionId *string - applicationRolePermissionIdOk bool - applicationRolePermissionKey *string - applicationRolePermissionKeyOk bool - ) - - switch t := applicationRolePermission.GetActualInstance().(type) { - case *authorize.ApplicationRolePermission: - applicationRolePermissionId, applicationRolePermissionIdOk = t.GetIdOk() - applicationRolePermissionKey, applicationRolePermissionKeyOk = t.GetKeyOk() - default: - continue - } + for _, innerObj := range apiObjs { + if innerObj.ApplicationRolePermission != nil { + applicationRolePermissionId, applicationRolePermissionIdOk := innerObj.ApplicationRolePermission.GetIdOk() + applicationRolePermissionKey, applicationRolePermissionKeyOk := innerObj.ApplicationRolePermission.GetKeyOk() - if applicationRolePermissionIdOk && applicationRolePermissionKeyOk { - applicationRolePermissionData[*applicationRolePermissionId] = *applicationRolePermissionKey + if applicationRolePermissionIdOk && applicationRolePermissionKeyOk { + applicationRolePermissionData[*applicationRolePermissionId] = *applicationRolePermissionKey + } } } return applicationRolePermissionData, nil } - -func (r *PingoneAuthorizeApplicationRolePermissionResource) ResourceType() string { - return "pingone_authorize_application_role_permission" -} diff --git a/internal/connector/pingone/authorize/resources/authorize_application_role_permission_test.go b/internal/connector/pingone/authorize/resources/authorize_application_role_permission_test.go new file mode 100644 index 00000000..c49d256f --- /dev/null +++ b/internal/connector/pingone/authorize/resources/authorize_application_role_permission_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_authorize_testable_resources" +) + +func Test_AuthorizeApplicationRolePermission(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_authorize_testable_resources.AuthorizeApplicationRolePermission(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + applicationRoleTr := tr.Dependencies[0] + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", applicationRoleTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, applicationRoleTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/authorize/resources/authorize_application_role_test.go b/internal/connector/pingone/authorize/resources/authorize_application_role_test.go new file mode 100644 index 00000000..5c294835 --- /dev/null +++ b/internal/connector/pingone/authorize/resources/authorize_application_role_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_authorize_testable_resources" +) + +func Test_AuthorizeApplicationRole(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_authorize_testable_resources.AuthorizeApplicationRole(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/authorize/resources/authorize_decision_endpoint.go b/internal/connector/pingone/authorize/resources/authorize_decision_endpoint.go new file mode 100644 index 00000000..697e7c0f --- /dev/null +++ b/internal/connector/pingone/authorize/resources/authorize_decision_endpoint.go @@ -0,0 +1,87 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneAuthorizeDecisionEndpointResource{} +) + +type PingOneAuthorizeDecisionEndpointResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneAuthorizeDecisionEndpointResource +func AuthorizeDecisionEndpoint(clientInfo *connector.ClientInfo) *PingOneAuthorizeDecisionEndpointResource { + return &PingOneAuthorizeDecisionEndpointResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneAuthorizeDecisionEndpointResource) ResourceType() string { + return "pingone_authorize_decision_endpoint" +} + +func (r *PingOneAuthorizeDecisionEndpointResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + authorizeDecisionEndpointData, err := r.getAuthorizeDecisionEndpointData() + if err != nil { + return nil, err + } + + for authorizeDecisionEndpointId, authorizeDecisionEndpointName := range authorizeDecisionEndpointData { + commentData := map[string]string{ + "Authorize Decision Endpoint ID": authorizeDecisionEndpointId, + "Authorize Decision Endpoint Name": authorizeDecisionEndpointName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: authorizeDecisionEndpointName, + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, authorizeDecisionEndpointId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingOneAuthorizeDecisionEndpointResource) getAuthorizeDecisionEndpointData() (map[string]string, error) { + authorizeDecisionEndpointData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.PolicyDecisionManagementApi.ReadAllDecisionEndpoints(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.DecisionEndpoint](iter, "ReadAllDecisionEndpoints", "GetDecisionEndpoints", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, authorizeDecisionEndpoint := range apiObjs { + authorizeDecisionEndpointId, authorizeDecisionEndpointIdOk := authorizeDecisionEndpoint.GetIdOk() + authorizeDecisionEndpointName, authorizeDecisionEndpointNameOk := authorizeDecisionEndpoint.GetNameOk() + + if authorizeDecisionEndpointIdOk && authorizeDecisionEndpointNameOk { + authorizeDecisionEndpointData[*authorizeDecisionEndpointId] = *authorizeDecisionEndpointName + } + } + + return authorizeDecisionEndpointData, nil +} diff --git a/internal/connector/pingone/authorize/resources/authorize_decision_endpoint_test.go b/internal/connector/pingone/authorize/resources/authorize_decision_endpoint_test.go new file mode 100644 index 00000000..481b343c --- /dev/null +++ b/internal/connector/pingone/authorize/resources/authorize_decision_endpoint_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_authorize_testable_resources" +) + +func Test_AuthorizeDecisionEndpoint(t *testing.T) { + // TODO: Remove after completion of TRIAGE-26607 + t.SkipNow() + + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_authorize_testable_resources.AuthorizeDecisionEndpoint(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/authorize/resources/pingone_application_resource_permission.go b/internal/connector/pingone/authorize/resources/pingone_application_resource_permission.go deleted file mode 100644 index cb00f4f8..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_application_resource_permission.go +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/authorize" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingoneAuthorizeApplicationResourcePermissionResource{} -) - -type PingoneAuthorizeApplicationResourcePermissionResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingoneAuthorizeApplicationResourcePermissionResource -func AuthorizeApplicationResourcePermission(clientInfo *connector.ClientInfo) *PingoneAuthorizeApplicationResourcePermissionResource { - return &PingoneAuthorizeApplicationResourcePermissionResource{ - clientInfo: clientInfo, - } -} - -func (r *PingoneAuthorizeApplicationResourcePermissionResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - applicationResourceData, err := r.getApplicationResourceData() - if err != nil { - return nil, err - } - - for appResourceId, appResourceName := range applicationResourceData { - appResourcePermissionData, err := r.getApplicationResourcePermissionData(appResourceId) - if err != nil { - return nil, err - } - - for appResourcePermissionId, appResourcePermissionKey := range appResourcePermissionData { - commentData := map[string]string{ - "Application Resource ID": appResourceId, - "Application Resource Name": appResourceName, - "Application Resource Permission ID": appResourcePermissionId, - "Application Resource Permission Key": appResourcePermissionKey, - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: appResourcePermissionKey, - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, appResourceId, appResourcePermissionId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - } - - return &importBlocks, nil -} - -func (r *PingoneAuthorizeApplicationResourcePermissionResource) getApplicationResourceData() (map[string]string, error) { - applicationResourceData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationResourcesApi.ReadApplicationResources(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - applicationResources, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.ApplicationResource](iter, "ReadApplicationResources", "GetResources", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, applicationResource := range applicationResources { - applicationResourceId, applicationResourceIdOk := applicationResource.GetIdOk() - applicationResourceName, applicationResourceNameOk := applicationResource.GetNameOk() - - if applicationResourceIdOk && applicationResourceNameOk { - applicationResourceData[*applicationResourceId] = *applicationResourceName - } - } - - return applicationResourceData, nil -} - -func (r *PingoneAuthorizeApplicationResourcePermissionResource) getApplicationResourcePermissionData(appResourceId string) (map[string]string, error) { - applicationResourcePermissionData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationResourcePermissionsApi.ReadApplicationPermissions(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, appResourceId).Execute() - applicationResourcePermissions, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.EntityArrayEmbeddedPermissionsInner](iter, "ReadApplicationPermissions", "GetPermissions", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, applicationResourcePermission := range applicationResourcePermissions { - - var ( - applicationResourcePermissionId *string - applicationResourcePermissionIdOk bool - applicationResourcePermissionKey *string - applicationResourcePermissionKeyOk bool - ) - - switch t := applicationResourcePermission.GetActualInstance().(type) { - case *authorize.ApplicationResourcePermission: - applicationResourcePermissionId, applicationResourcePermissionIdOk = t.GetIdOk() - case *authorize.ApplicationRolePermission: - applicationResourcePermissionId, applicationResourcePermissionIdOk = t.GetIdOk() - applicationResourcePermissionKey, applicationResourcePermissionKeyOk = t.GetKeyOk() - default: - continue - } - - if applicationResourcePermissionIdOk && applicationResourcePermissionKeyOk { - applicationResourcePermissionData[*applicationResourcePermissionId] = *applicationResourcePermissionKey - } - - if applicationResourcePermissionIdOk && !applicationResourcePermissionKeyOk { - applicationResourcePermissionData[*applicationResourcePermissionId] = *applicationResourcePermissionId - } - } - - return applicationResourcePermissionData, nil -} - -func (r *PingoneAuthorizeApplicationResourcePermissionResource) ResourceType() string { - return "pingone_application_resource_permission" -} diff --git a/internal/connector/pingone/authorize/resources/pingone_application_resource_permission_test.go b/internal/connector/pingone/authorize/resources/pingone_application_resource_permission_test.go deleted file mode 100644 index 50f23c40..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_application_resource_permission_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAuthorizeApplicationResourcePermissionExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AuthorizeApplicationResourcePermission(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_application_resource_permission", - ResourceName: "test-permission1:action1", - ResourceID: fmt.Sprintf("%s/62b8a221-a530-44f4-ad02-cdb0d3b1395f/080dd732-99ea-4730-a8a6-8da88a232131", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_resource_permission", - ResourceName: "test-permission1:action2", - ResourceID: fmt.Sprintf("%s/62b8a221-a530-44f4-ad02-cdb0d3b1395f/05717cf9-3ce4-443a-8154-1986fe984780", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/authorize/resources/pingone_application_resource_test.go b/internal/connector/pingone/authorize/resources/pingone_application_resource_test.go deleted file mode 100644 index b092f748..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_application_resource_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestApplicationResourceExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ApplicationResource(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_application_resource", - ResourceName: "authorize-api-service_test-permission1", - ResourceID: fmt.Sprintf("%s/3c6001a0-6110-4934-9d34-fa8c4a2894c2/62b8a221-a530-44f4-ad02-cdb0d3b1395f", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service.go b/internal/connector/pingone/authorize/resources/pingone_authorize_api_service.go deleted file mode 100644 index f1dbf6e6..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/authorize" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingoneAuthorizeAPIServiceResource{} -) - -type PingoneAuthorizeAPIServiceResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingoneAuthorizeAPIServiceResource -func AuthorizeAPIService(clientInfo *connector.ClientInfo) *PingoneAuthorizeAPIServiceResource { - return &PingoneAuthorizeAPIServiceResource{ - clientInfo: clientInfo, - } -} - -func (r *PingoneAuthorizeAPIServiceResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - APIServerData, err := r.getAPIServerData() - if err != nil { - return nil, err - } - - for apiServerId, apiServerName := range APIServerData { - commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "API Server ID": apiServerId, - "API Server Name": apiServerName, - "Resource Type": r.ResourceType(), - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: apiServerName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, apiServerId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - - return &importBlocks, nil -} - -func (r *PingoneAuthorizeAPIServiceResource) getAPIServerData() (map[string]string, error) { - apiServerData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServersApi.ReadAllAPIServers(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - apiServers, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.APIServer](iter, "ReadAllAPIServers", "GetApiServers", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, apiServer := range apiServers { - apiServerId, apiServerIdOk := apiServer.GetIdOk() - apiServerName, apiServerNameOk := apiServer.GetNameOk() - - if apiServerIdOk && apiServerNameOk { - apiServerData[*apiServerId] = *apiServerName - } - } - - return apiServerData, nil -} - -func (r *PingoneAuthorizeAPIServiceResource) ResourceType() string { - return "pingone_authorize_api_service" -} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_deployment.go b/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_deployment.go deleted file mode 100644 index 4685246b..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_deployment.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/authorize" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingoneAuthorizeAPIServiceDeploymentResource{} -) - -type PingoneAuthorizeAPIServiceDeploymentResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingoneAuthorizeAPIServiceDeploymentResource -func AuthorizeAPIServiceDeployment(clientInfo *connector.ClientInfo) *PingoneAuthorizeAPIServiceDeploymentResource { - return &PingoneAuthorizeAPIServiceDeploymentResource{ - clientInfo: clientInfo, - } -} - -func (r *PingoneAuthorizeAPIServiceDeploymentResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - apiServiceData, err := r.getAPIServiceData() - if err != nil { - return nil, err - } - - for apiServiceId, apiServiceName := range apiServiceData { - apiServiceDeployed, err := r.getAPIServiceDeployed(apiServiceId) - if err != nil { - return nil, err - } - - if apiServiceDeployed { - commentData := map[string]string{ - "API Service ID": apiServiceId, - "API Service Name": apiServiceName, - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: apiServiceName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, apiServiceId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - } - - return &importBlocks, nil -} - -func (r *PingoneAuthorizeAPIServiceDeploymentResource) getAPIServiceData() (map[string]string, error) { - apiServiceData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServersApi.ReadAllAPIServers(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - apiServices, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.APIServer](iter, "ReadAllAPIServers", "GetApiServers", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, apiService := range apiServices { - apiServiceId, apiServiceIdOk := apiService.GetIdOk() - apiServiceName, apiServiceNameOk := apiService.GetNameOk() - - if apiServiceIdOk && apiServiceNameOk { - apiServiceData[*apiServiceId] = *apiServiceName - } - } - - return apiServiceData, nil -} - -func (r *PingoneAuthorizeAPIServiceDeploymentResource) getAPIServiceDeployed(apiServiceId string) (bool, error) { - - apiServerDeployment, httpResponse, err := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServerDeploymentApi.ReadDeploymentStatus(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, apiServiceId).Execute() - ok, err := common.HandleClientResponse(httpResponse, err, "ReadDeploymentStatus", r.ResourceType()) - if err != nil { - return false, err - } - // A warning was given when handling the client response. Return nil apiObjects to skip export of resource - if !ok { - return false, nil - } - - if status, ok := apiServerDeployment.GetStatusOk(); ok { - if statusCode, ok := status.GetCodeOk(); ok && statusCode != nil && *statusCode != "DEPLOYMENT_UNINITIALIZED" { - return true, nil - } - } - - return false, nil -} - -func (r *PingoneAuthorizeAPIServiceDeploymentResource) ResourceType() string { - return "pingone_authorize_api_service_deployment" -} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_deployment_test.go b/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_deployment_test.go deleted file mode 100644 index a4e3cd14..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_deployment_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAuthorizeAPIServiceDeploymentExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AuthorizeAPIServiceDeployment(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_authorize_api_service_deployment", - ResourceName: "Test API Service", - ResourceID: fmt.Sprintf("%s/cee5d5a9-49aa-478d-816e-ec47a2b5aede", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_operation.go b/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_operation.go deleted file mode 100644 index afe40b31..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_operation.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/authorize" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingoneAuthorizeAPIServiceOperationResource{} -) - -type PingoneAuthorizeAPIServiceOperationResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingoneAuthorizeAPIServiceOperationResource -func AuthorizeAPIServiceOperation(clientInfo *connector.ClientInfo) *PingoneAuthorizeAPIServiceOperationResource { - return &PingoneAuthorizeAPIServiceOperationResource{ - clientInfo: clientInfo, - } -} - -func (r *PingoneAuthorizeAPIServiceOperationResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - apiServiceData, err := r.getAPIServiceData() - if err != nil { - return nil, err - } - - for apiServiceId, apiServiceName := range apiServiceData { - apiServiceOperationData, err := r.getAPIServiceOperationData(apiServiceId) - if err != nil { - return nil, err - } - - for apiServiceOperationId, apiServiceOperationName := range apiServiceOperationData { - commentData := map[string]string{ - "API Service ID": apiServiceId, - "API Service Name": apiServiceName, - "API Service Operation ID": apiServiceOperationId, - "API Service Operation Name": apiServiceOperationName, - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", apiServiceName, apiServiceOperationName), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, apiServiceId, apiServiceOperationId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - } - - return &importBlocks, nil -} - -func (r *PingoneAuthorizeAPIServiceOperationResource) getAPIServiceData() (map[string]string, error) { - apiServiceData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServersApi.ReadAllAPIServers(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - apiServices, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.APIServer](iter, "ReadAllAPIServers", "GetApiServers", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, apiService := range apiServices { - apiServiceId, apiServiceIdOk := apiService.GetIdOk() - apiServiceName, apiServiceNameOk := apiService.GetNameOk() - - if apiServiceIdOk && apiServiceNameOk { - apiServiceData[*apiServiceId] = *apiServiceName - } - } - - return apiServiceData, nil -} - -func (r *PingoneAuthorizeAPIServiceOperationResource) getAPIServiceOperationData(apiServiceId string) (map[string]string, error) { - apiServiceOperationData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServerOperationsApi.ReadAllAPIServerOperations(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, apiServiceId).Execute() - apiServiceOperations, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.APIServerOperation](iter, "ReadAllAPIServerOperations", "GetOperations", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, apiServiceOperation := range apiServiceOperations { - apiServiceOperationId, apiServiceOperationIdOk := apiServiceOperation.GetIdOk() - apiServiceOperationName, apiServiceOperationNameOk := apiServiceOperation.GetNameOk() - - if apiServiceOperationIdOk && apiServiceOperationNameOk { - apiServiceOperationData[*apiServiceOperationId] = *apiServiceOperationName - } - } - - return apiServiceOperationData, nil -} - -func (r *PingoneAuthorizeAPIServiceOperationResource) ResourceType() string { - return "pingone_authorize_api_service_operation" -} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_operation_test.go b/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_operation_test.go deleted file mode 100644 index 1c399a23..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_operation_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAuthorizeAPIServiceOperationExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AuthorizeAPIServiceOperation(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_authorize_api_service_operation", - ResourceName: "Test API Service_My Path", - ResourceID: fmt.Sprintf("%s/cee5d5a9-49aa-478d-816e-ec47a2b5aede/07fc42c1-d998-40bd-bb64-143911924608", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_test.go b/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_test.go deleted file mode 100644 index 12a6db5c..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_api_service_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAuthorizeAPIServiceExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AuthorizeAPIService(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_authorize_api_service", - ResourceName: "Test API Service", - ResourceID: fmt.Sprintf("%s/cee5d5a9-49aa-478d-816e-ec47a2b5aede", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_authorize_api_service", - ResourceName: "Undeployed Test API Service", - ResourceID: fmt.Sprintf("%s/5558f5ab-46b2-40ef-ac78-9a32a07e31c3", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_application_role.go b/internal/connector/pingone/authorize/resources/pingone_authorize_application_role.go deleted file mode 100644 index 34b7664b..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_application_role.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/authorize" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingoneAuthorizeApplicationRoleResource{} -) - -type PingoneAuthorizeApplicationRoleResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingoneAuthorizeApplicationRoleResource -func AuthorizeApplicationRole(clientInfo *connector.ClientInfo) *PingoneAuthorizeApplicationRoleResource { - return &PingoneAuthorizeApplicationRoleResource{ - clientInfo: clientInfo, - } -} - -func (r *PingoneAuthorizeApplicationRoleResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - ApplicationRoleData, err := r.getApplicationRoleData() - if err != nil { - return nil, err - } - - for applicationRoleId, applicationRoleName := range ApplicationRoleData { - commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Application Role ID": applicationRoleId, - "Application Role Name": applicationRoleName, - "Resource Type": r.ResourceType(), - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: applicationRoleName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationRoleId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - - return &importBlocks, nil -} - -func (r *PingoneAuthorizeApplicationRoleResource) getApplicationRoleData() (map[string]string, error) { - applicationRoleData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationRolesApi.ReadApplicationRoles(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - applicationRoles, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.ApplicationRole](iter, "ReadApplicationRoles", "GetRoles", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, applicationRole := range applicationRoles { - applicationRoleId, applicationRoleIdOk := applicationRole.GetIdOk() - applicationRoleName, applicationRoleNameOk := applicationRole.GetNameOk() - - if applicationRoleIdOk && applicationRoleNameOk { - applicationRoleData[*applicationRoleId] = *applicationRoleName - } - } - - return applicationRoleData, nil -} - -func (r *PingoneAuthorizeApplicationRoleResource) ResourceType() string { - return "pingone_authorize_application_role" -} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_application_role_permission_test.go b/internal/connector/pingone/authorize/resources/pingone_authorize_application_role_permission_test.go deleted file mode 100644 index bfeba178..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_application_role_permission_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAuthorizeApplicationRolePermissionExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AuthorizeApplicationRolePermission(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_authorize_application_role_permission", - ResourceName: "test-role_test-permission1:action1", - ResourceID: fmt.Sprintf("%s/f45cbcc7-2406-470b-93bc-ff477da0b8f7/080dd732-99ea-4730-a8a6-8da88a232131", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_authorize_application_role_permission", - ResourceName: "test-role_test-permission1:action2", - ResourceID: fmt.Sprintf("%s/f45cbcc7-2406-470b-93bc-ff477da0b8f7/05717cf9-3ce4-443a-8154-1986fe984780", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_application_role_test.go b/internal/connector/pingone/authorize/resources/pingone_authorize_application_role_test.go deleted file mode 100644 index 9013ba19..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_application_role_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAuthorizeApplicationRoleExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AuthorizeApplicationRole(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_authorize_application_role", - ResourceName: "test-role", - ResourceID: fmt.Sprintf("%s/f45cbcc7-2406-470b-93bc-ff477da0b8f7", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_decision_endpoint.go b/internal/connector/pingone/authorize/resources/pingone_authorize_decision_endpoint.go deleted file mode 100644 index 40297d2f..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_decision_endpoint.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/authorize" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingoneAuthorizeDecisionEndpointResource{} -) - -type PingoneAuthorizeDecisionEndpointResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingoneAuthorizeDecisionEndpointResource -func AuthorizeDecisionEndpoint(clientInfo *connector.ClientInfo) *PingoneAuthorizeDecisionEndpointResource { - return &PingoneAuthorizeDecisionEndpointResource{ - clientInfo: clientInfo, - } -} - -func (r *PingoneAuthorizeDecisionEndpointResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - DecisionEndpointData, err := r.getDecisionEndpointData() - if err != nil { - return nil, err - } - - for decisionEndpointId, decisionEndpointName := range DecisionEndpointData { - commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Decision Endpoint ID": decisionEndpointId, - "Decision Endpoint Name": decisionEndpointName, - "Resource Type": r.ResourceType(), - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: decisionEndpointName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, decisionEndpointId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - - return &importBlocks, nil -} - -func (r *PingoneAuthorizeDecisionEndpointResource) getDecisionEndpointData() (map[string]string, error) { - decisionEndpointData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.AuthorizeAPIClient.PolicyDecisionManagementApi.ReadAllDecisionEndpoints(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - decisionEndpoints, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.DecisionEndpoint](iter, "ReadAllDecisionEndpoints", "GetDecisionEndpoints", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, decisionEndpoint := range decisionEndpoints { - decisionEndpointId, decisionEndpointIdOk := decisionEndpoint.GetIdOk() - decisionEndpointName, decisionEndpointNameOk := decisionEndpoint.GetNameOk() - - if decisionEndpointIdOk && decisionEndpointNameOk { - decisionEndpointData[*decisionEndpointId] = *decisionEndpointName - } - } - - return decisionEndpointData, nil -} - -func (r *PingoneAuthorizeDecisionEndpointResource) ResourceType() string { - return "pingone_authorize_decision_endpoint" -} diff --git a/internal/connector/pingone/authorize/resources/pingone_authorize_decision_endpoint_test.go b/internal/connector/pingone/authorize/resources/pingone_authorize_decision_endpoint_test.go deleted file mode 100644 index f78308e0..00000000 --- a/internal/connector/pingone/authorize/resources/pingone_authorize_decision_endpoint_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAuthorizeDecisionEndpointExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AuthorizeDecisionEndpoint(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_authorize_decision_endpoint", - ResourceName: "DEV", - ResourceID: fmt.Sprintf("%s/f8660b46-b96e-457c-8d8f-8ee455e4baa3", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_authorize_decision_endpoint", - ResourceName: "PROD", - ResourceID: fmt.Sprintf("%s/07a4f450-d99f-439f-834a-46b8332a3e31", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_authorize_decision_endpoint", - ResourceName: "TEST", - ResourceID: fmt.Sprintf("%s/3368886d-7d57-4aa8-a8f6-7d24dffa4b3c", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_authorize_decision_endpoint", - ResourceName: "CLI", - ResourceID: fmt.Sprintf("%s/6f4cf36d-fdc1-445c-a1df-37c8e3305eaf", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_authorize_decision_endpoint", - ResourceName: "Test API Service", - ResourceID: fmt.Sprintf("%s/20c01743-084f-4129-b304-42ce6a5edf4f", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/mfa/pingone_mfa_connector.go b/internal/connector/pingone/mfa/pingone_mfa_connector.go index 66f2ca2c..dcabc01c 100644 --- a/internal/connector/pingone/mfa/pingone_mfa_connector.go +++ b/internal/connector/pingone/mfa/pingone_mfa_connector.go @@ -44,10 +44,10 @@ func (c *PingOneMFAConnector) Export(format, outputDir string, overwriteExport b l.Debug().Msgf("Exporting all PingOne MFA Resources...") exportableResources := []connector.ExportableResource{ - resources.MFAApplicationPushCredential(&c.clientInfo), - resources.MFAFido2Policy(&c.clientInfo), - resources.MFADevicePolicy(&c.clientInfo), - resources.MFASettings(&c.clientInfo), + resources.MfaApplicationPushCredential(&c.clientInfo), + resources.MfaDevicePolicy(&c.clientInfo), + resources.MfaFido2Policy(&c.clientInfo), + resources.MfaSettings(&c.clientInfo), } return common.WriteFiles(exportableResources, format, outputDir, overwriteExport) diff --git a/internal/connector/pingone/mfa/pingone_mfa_connector_test.go b/internal/connector/pingone/mfa/pingone_mfa_connector_test.go index 1696e2b7..88ef958d 100644 --- a/internal/connector/pingone/mfa/pingone_mfa_connector_test.go +++ b/internal/connector/pingone/mfa/pingone_mfa_connector_test.go @@ -5,9 +5,9 @@ package mfa_test import ( "testing" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/mfa/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_mfa_testable_resources" "github.com/pingidentity/pingcli/internal/testing/testutils_terraform" ) @@ -17,37 +17,40 @@ func TestMFATerraformPlan(t *testing.T) { testutils_terraform.InitPingOneTerraform(t) testCases := []struct { - name string - resource connector.ExportableResource - ignoredErrors []string + name string + testableResource *testutils_resource.TestableResource + ignoredErrors []string }{ { - name: "MFAApplicationPushCredential", - resource: resources.MFAApplicationPushCredential(clientInfo), + name: "MFAApplicationPushCredential", + testableResource: pingone_mfa_testable_resources.MfaApplicationPushCredential(t, clientInfo), ignoredErrors: []string{ "Error: Invalid Attribute Combination", }, }, { - name: "MFAFido2Policy", - resource: resources.MFAFido2Policy(clientInfo), - ignoredErrors: nil, + name: "MFAFido2Policy", + testableResource: pingone_mfa_testable_resources.MfaFido2Policy(t, clientInfo), + ignoredErrors: nil, }, { - name: "MFADevicePolicy", - resource: resources.MFADevicePolicy(clientInfo), - ignoredErrors: nil, + name: "MFADevicePolicy", + testableResource: pingone_mfa_testable_resources.MfaDevicePolicy(t, clientInfo), + ignoredErrors: nil, }, { - name: "MFASettings", - resource: resources.MFASettings(clientInfo), - ignoredErrors: nil, + name: "MFASettings", + testableResource: pingone_mfa_testable_resources.MfaSettings(t, clientInfo), + ignoredErrors: nil, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - testutils_terraform.ValidateTerraformPlan(t, tc.resource, tc.ignoredErrors) + tc.testableResource.CreateResource(t) + defer tc.testableResource.DeleteResource(t) + + testutils_terraform.ValidateTerraformPlan(t, tc.testableResource.ExportableResource, tc.ignoredErrors) }) } } diff --git a/internal/connector/pingone/mfa/resources/mfa_application_push_credential.go b/internal/connector/pingone/mfa/resources/mfa_application_push_credential.go new file mode 100644 index 00000000..602b0112 --- /dev/null +++ b/internal/connector/pingone/mfa/resources/mfa_application_push_credential.go @@ -0,0 +1,124 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/patrickcping/pingone-go-sdk-v2/mfa" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneMfaApplicationPushCredentialResource{} +) + +type PingOneMfaApplicationPushCredentialResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneMfaApplicationPushCredentialResource +func MfaApplicationPushCredential(clientInfo *connector.ClientInfo) *PingOneMfaApplicationPushCredentialResource { + return &PingOneMfaApplicationPushCredentialResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneMfaApplicationPushCredentialResource) ResourceType() string { + return "pingone_mfa_application_push_credential" +} + +func (r *PingOneMfaApplicationPushCredentialResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + applicationData, err := r.getApplicationData() + if err != nil { + return nil, err + } + + for applicationId, applicationName := range applicationData { + mfaApplicationPushCredentialData, err := r.getMfaApplicationPushCredentialData(applicationId) + if err != nil { + return nil, err + } + + for mfaApplicationPushCredentialId, mfaApplicationPushCredentialType := range mfaApplicationPushCredentialData { + commentData := map[string]string{ + "Application ID": applicationId, + "Application Name": applicationName, + "Mfa Application Push Credential ID": mfaApplicationPushCredentialId, + "Mfa Application Push Credential Type": mfaApplicationPushCredentialType, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", applicationName, mfaApplicationPushCredentialType), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationId, mfaApplicationPushCredentialId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + } + + return &importBlocks, nil +} + +func (r *PingOneMfaApplicationPushCredentialResource) getApplicationData() (map[string]string, error) { + applicationData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, innerObj := range apiObjs { + // MFa application push credentials are only for OIDC Native Apps + if innerObj.ApplicationOIDC != nil { + applicationId, applicationIdOk := innerObj.ApplicationOIDC.GetIdOk() + applicationName, applicationNameOk := innerObj.ApplicationOIDC.GetNameOk() + applicationType, applicationTypeOk := innerObj.ApplicationOIDC.GetTypeOk() + + if applicationIdOk && applicationNameOk && applicationTypeOk { + if *applicationType == management.ENUMAPPLICATIONTYPE_NATIVE_APP { + applicationData[*applicationId] = *applicationName + } + } + } + } + + return applicationData, nil +} + +func (r *PingOneMfaApplicationPushCredentialResource) getMfaApplicationPushCredentialData(applicationId string) (map[string]string, error) { + mfaApplicationPushCredentialData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.MFAAPIClient.ApplicationsApplicationMFAPushCredentialsApi.ReadAllMFAPushCredentials(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, applicationId).Execute() + apiObjs, err := pingone.GetMfaAPIObjectsFromIterator[mfa.MFAPushCredentialResponse](iter, "ReadAllMFAPushCredentials", "GetPushCredentials", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, mfaApplicationPushCredential := range apiObjs { + mfaApplicationPushCredentialId, mfaApplicationPushCredentialIdOk := mfaApplicationPushCredential.GetIdOk() + mfaApplicationPushCredentialType, mfaApplicationPushCredentialTypeOk := mfaApplicationPushCredential.GetTypeOk() + + if mfaApplicationPushCredentialIdOk && mfaApplicationPushCredentialTypeOk { + mfaApplicationPushCredentialData[*mfaApplicationPushCredentialId] = string(*mfaApplicationPushCredentialType) + } + } + + return mfaApplicationPushCredentialData, nil +} diff --git a/internal/connector/pingone/mfa/resources/mfa_application_push_credential_test.go b/internal/connector/pingone/mfa/resources/mfa_application_push_credential_test.go new file mode 100644 index 00000000..400006ba --- /dev/null +++ b/internal/connector/pingone/mfa/resources/mfa_application_push_credential_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_mfa_testable_resources" +) + +func Test_MfaApplicationPushCredential(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_mfa_testable_resources.MfaApplicationPushCredential(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + applicationTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TYPE]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/mfa/resources/pingone_mfa_device_policy.go b/internal/connector/pingone/mfa/resources/mfa_device_policy.go similarity index 50% rename from internal/connector/pingone/mfa/resources/pingone_mfa_device_policy.go rename to internal/connector/pingone/mfa/resources/mfa_device_policy.go index ef343d73..25c5a2a0 100644 --- a/internal/connector/pingone/mfa/resources/pingone_mfa_device_policy.go +++ b/internal/connector/pingone/mfa/resources/mfa_device_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -14,47 +15,47 @@ import ( // Verify that the resource satisfies the exportable resource interface var ( - _ connector.ExportableResource = &PingOneMFADevicePolicyResource{} + _ connector.ExportableResource = &PingOneMfaDevicePolicyResource{} ) -type PingOneMFADevicePolicyResource struct { +type PingOneMfaDevicePolicyResource struct { clientInfo *connector.ClientInfo } -// Utility method for creating a PingOneMFADevicePolicyResource -func MFADevicePolicy(clientInfo *connector.ClientInfo) *PingOneMFADevicePolicyResource { - return &PingOneMFADevicePolicyResource{ +// Utility method for creating a PingOneMfaDevicePolicyResource +func MfaDevicePolicy(clientInfo *connector.ClientInfo) *PingOneMfaDevicePolicyResource { + return &PingOneMfaDevicePolicyResource{ clientInfo: clientInfo, } } -func (r *PingOneMFADevicePolicyResource) ResourceType() string { +func (r *PingOneMfaDevicePolicyResource) ResourceType() string { return "pingone_mfa_device_policy" } -func (r *PingOneMFADevicePolicyResource) ExportAll() (*[]connector.ImportBlock, error) { +func (r *PingOneMfaDevicePolicyResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - deviceAuthPolicyData, err := r.getDeviceAuthPolicyData() + mfaDevicePolicyData, err := r.getMfaDevicePolicyData() if err != nil { return nil, err } - for devicePolicyId, devicePolicyName := range deviceAuthPolicyData { + for mfaDevicePolicyId, mfaDevicePolicyName := range mfaDevicePolicyData { commentData := map[string]string{ + "Mfa Device Policy ID": mfaDevicePolicyId, + "Mfa Device Policy Name": mfaDevicePolicyName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "MFA Device Policy ID": devicePolicyId, - "MFA Device Policy Name": devicePolicyName, "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: devicePolicyName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, devicePolicyId), + ResourceName: mfaDevicePolicyName, + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, mfaDevicePolicyId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -64,23 +65,23 @@ func (r *PingOneMFADevicePolicyResource) ExportAll() (*[]connector.ImportBlock, return &importBlocks, nil } -func (r *PingOneMFADevicePolicyResource) getDeviceAuthPolicyData() (map[string]string, error) { - deviceAuthPolicyData := make(map[string]string) +func (r *PingOneMfaDevicePolicyResource) getMfaDevicePolicyData() (map[string]string, error) { + mfaDevicePolicyData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.MFAAPIClient.DeviceAuthenticationPolicyApi.ReadDeviceAuthenticationPolicies(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - deviceAuthPolicies, err := pingone.GetMfaAPIObjectsFromIterator[mfa.DeviceAuthenticationPolicy](iter, "ReadDeviceAuthenticationPolicies", "GetDeviceAuthenticationPolicies", r.ResourceType()) + apiObjs, err := pingone.GetMfaAPIObjectsFromIterator[mfa.DeviceAuthenticationPolicy](iter, "ReadDeviceAuthenticationPolicies", "GetDeviceAuthenticationPolicies", r.ResourceType()) if err != nil { return nil, err } - for _, devicePolicy := range deviceAuthPolicies { - devicePolicyId, devicePolicyIdOk := devicePolicy.GetIdOk() - devicePolicyName, devicePolicyNameOk := devicePolicy.GetNameOk() + for _, mfaDevicePolicy := range apiObjs { + mfaDevicePolicyId, mfaDevicePolicyIdOk := mfaDevicePolicy.GetIdOk() + mfaDevicePolicyName, mfaDevicePolicyNameOk := mfaDevicePolicy.GetNameOk() - if devicePolicyIdOk && devicePolicyNameOk { - deviceAuthPolicyData[*devicePolicyId] = *devicePolicyName + if mfaDevicePolicyIdOk && mfaDevicePolicyNameOk { + mfaDevicePolicyData[*mfaDevicePolicyId] = *mfaDevicePolicyName } } - return deviceAuthPolicyData, nil + return mfaDevicePolicyData, nil } diff --git a/internal/connector/pingone/mfa/resources/mfa_device_policy_test.go b/internal/connector/pingone/mfa/resources/mfa_device_policy_test.go new file mode 100644 index 00000000..4f404473 --- /dev/null +++ b/internal/connector/pingone/mfa/resources/mfa_device_policy_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_mfa_testable_resources" +) + +func Test_MfaDevicePolicy(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_mfa_testable_resources.MfaDevicePolicy(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing MFA Device Policies are generated, test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/mfa/resources/pingone_mfa_fido2_policy.go b/internal/connector/pingone/mfa/resources/mfa_fido2_policy.go similarity index 51% rename from internal/connector/pingone/mfa/resources/pingone_mfa_fido2_policy.go rename to internal/connector/pingone/mfa/resources/mfa_fido2_policy.go index 8821a6c0..d2656615 100644 --- a/internal/connector/pingone/mfa/resources/pingone_mfa_fido2_policy.go +++ b/internal/connector/pingone/mfa/resources/mfa_fido2_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -14,47 +15,47 @@ import ( // Verify that the resource satisfies the exportable resource interface var ( - _ connector.ExportableResource = &PingOneMFAFido2PolicyResource{} + _ connector.ExportableResource = &PingOneMfaFido2PolicyResource{} ) -type PingOneMFAFido2PolicyResource struct { +type PingOneMfaFido2PolicyResource struct { clientInfo *connector.ClientInfo } -// Utility method for creating a PingOneMFAFido2PolicyResource -func MFAFido2Policy(clientInfo *connector.ClientInfo) *PingOneMFAFido2PolicyResource { - return &PingOneMFAFido2PolicyResource{ +// Utility method for creating a PingOneMfaFido2PolicyResource +func MfaFido2Policy(clientInfo *connector.ClientInfo) *PingOneMfaFido2PolicyResource { + return &PingOneMfaFido2PolicyResource{ clientInfo: clientInfo, } } -func (r *PingOneMFAFido2PolicyResource) ResourceType() string { +func (r *PingOneMfaFido2PolicyResource) ResourceType() string { return "pingone_mfa_fido2_policy" } -func (r *PingOneMFAFido2PolicyResource) ExportAll() (*[]connector.ImportBlock, error) { +func (r *PingOneMfaFido2PolicyResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - fido2PolicyData, err := r.getFido2PolicyData() + mfaFido2PolicyData, err := r.getMfaFido2PolicyData() if err != nil { return nil, err } - for fido2PolicyId, fido2PolicyName := range fido2PolicyData { + for mfaFido2PolicyId, mfaFido2PolicyName := range mfaFido2PolicyData { commentData := map[string]string{ + "Mfa Fido2 Policy ID": mfaFido2PolicyId, + "Mfa Fido2 Policy Name": mfaFido2PolicyName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "FIDO2 Policy ID": fido2PolicyId, - "FIDO2 Policy Name": fido2PolicyName, "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fido2PolicyName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, fido2PolicyId), + ResourceName: mfaFido2PolicyName, + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, mfaFido2PolicyId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -64,23 +65,23 @@ func (r *PingOneMFAFido2PolicyResource) ExportAll() (*[]connector.ImportBlock, e return &importBlocks, nil } -func (r *PingOneMFAFido2PolicyResource) getFido2PolicyData() (map[string]string, error) { - fido2PolicyData := make(map[string]string) +func (r *PingOneMfaFido2PolicyResource) getMfaFido2PolicyData() (map[string]string, error) { + mfaFido2PolicyData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.MFAAPIClient.FIDO2PolicyApi.ReadFIDO2Policies(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - fido2Policies, err := pingone.GetMfaAPIObjectsFromIterator[mfa.FIDO2Policy](iter, "ReadFIDO2Policies", "GetFido2Policies", r.ResourceType()) + apiObjs, err := pingone.GetMfaAPIObjectsFromIterator[mfa.FIDO2Policy](iter, "ReadFIDO2Policies", "GetFido2Policies", r.ResourceType()) if err != nil { return nil, err } - for _, fido2Policy := range fido2Policies { - fido2PolicyId, fido2PolicyIdOk := fido2Policy.GetIdOk() - fido2PolicyName, fido2PolicyNameOk := fido2Policy.GetNameOk() + for _, mfaFido2Policy := range apiObjs { + mfaFido2PolicyId, mfaFido2PolicyIdOk := mfaFido2Policy.GetIdOk() + mfaFido2PolicyName, mfaFido2PolicyNameOk := mfaFido2Policy.GetNameOk() - if fido2PolicyIdOk && fido2PolicyNameOk { - fido2PolicyData[*fido2PolicyId] = *fido2PolicyName + if mfaFido2PolicyIdOk && mfaFido2PolicyNameOk { + mfaFido2PolicyData[*mfaFido2PolicyId] = *mfaFido2PolicyName } } - return fido2PolicyData, nil + return mfaFido2PolicyData, nil } diff --git a/internal/connector/pingone/mfa/resources/mfa_fido2_policy_test.go b/internal/connector/pingone/mfa/resources/mfa_fido2_policy_test.go new file mode 100644 index 00000000..e4b49105 --- /dev/null +++ b/internal/connector/pingone/mfa/resources/mfa_fido2_policy_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_mfa_testable_resources" +) + +func Test_MfaFido2Policy(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_mfa_testable_resources.MfaFido2Policy(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing MFA FIDO2 Policies are generated, test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/mfa/resources/pingone_mfa_settings.go b/internal/connector/pingone/mfa/resources/mfa_settings.go similarity index 73% rename from internal/connector/pingone/mfa/resources/pingone_mfa_settings.go rename to internal/connector/pingone/mfa/resources/mfa_settings.go index 27ab5f31..64e08be9 100644 --- a/internal/connector/pingone/mfa/resources/pingone_mfa_settings.go +++ b/internal/connector/pingone/mfa/resources/mfa_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -10,31 +11,31 @@ import ( // Verify that the resource satisfies the exportable resource interface var ( - _ connector.ExportableResource = &PingOneMFASettingsResource{} + _ connector.ExportableResource = &PingOneMfaSettingsResource{} ) -type PingOneMFASettingsResource struct { +type PingOneMfaSettingsResource struct { clientInfo *connector.ClientInfo } -// Utility method for creating a PingOneMFASettingsResource -func MFASettings(clientInfo *connector.ClientInfo) *PingOneMFASettingsResource { - return &PingOneMFASettingsResource{ +// Utility method for creating a PingOneMfaSettingsResource +func MfaSettings(clientInfo *connector.ClientInfo) *PingOneMfaSettingsResource { + return &PingOneMfaSettingsResource{ clientInfo: clientInfo, } } -func (r *PingOneMFASettingsResource) ResourceType() string { +func (r *PingOneMfaSettingsResource) ResourceType() string { return "pingone_mfa_settings" } -func (r *PingOneMFASettingsResource) ExportAll() (*[]connector.ImportBlock, error) { +func (r *PingOneMfaSettingsResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - ok, err := r.checkMFASettingsData() + ok, err := r.checkMfaSettingsData() if err != nil { return nil, err } @@ -43,8 +44,8 @@ func (r *PingOneMFASettingsResource) ExportAll() (*[]connector.ImportBlock, erro } commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, } importBlock := connector.ImportBlock{ @@ -59,7 +60,8 @@ func (r *PingOneMFASettingsResource) ExportAll() (*[]connector.ImportBlock, erro return &importBlocks, nil } -func (r *PingOneMFASettingsResource) checkMFASettingsData() (bool, error) { +func (r *PingOneMfaSettingsResource) checkMfaSettingsData() (bool, error) { _, response, err := r.clientInfo.PingOneApiClient.MFAAPIClient.MFASettingsApi.ReadMFASettings(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + return common.CheckSingletonResource(response, err, "ReadMFASettings", r.ResourceType()) } diff --git a/internal/connector/pingone/mfa/resources/mfa_settings_test.go b/internal/connector/pingone/mfa/resources/mfa_settings_test.go new file mode 100644 index 00000000..0bd52442 --- /dev/null +++ b/internal/connector/pingone/mfa/resources/mfa_settings_test.go @@ -0,0 +1,28 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_mfa_testable_resources" +) + +func Test_MfaSettings(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_mfa_testable_resources.MfaSettings(t, clientInfo) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ExportableResource.ResourceType(), + ResourceID: clientInfo.PingOneExportEnvironmentID, + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/mfa/resources/pingone_mfa_application_push_credential.go b/internal/connector/pingone/mfa/resources/pingone_mfa_application_push_credential.go deleted file mode 100644 index 92746ce5..00000000 --- a/internal/connector/pingone/mfa/resources/pingone_mfa_application_push_credential.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/management" - "github.com/patrickcping/pingone-go-sdk-v2/mfa" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingOneMFAApplicationPushCredentialResource{} -) - -type PingOneMFAApplicationPushCredentialResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingOneMFAApplicationPushCredentialResource -func MFAApplicationPushCredential(clientInfo *connector.ClientInfo) *PingOneMFAApplicationPushCredentialResource { - return &PingOneMFAApplicationPushCredentialResource{ - clientInfo: clientInfo, - } -} - -func (r *PingOneMFAApplicationPushCredentialResource) ResourceType() string { - return "pingone_mfa_application_push_credential" -} - -func (r *PingOneMFAApplicationPushCredentialResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - applicationData, err := r.getOIDCApplicationData() - if err != nil { - return nil, err - } - - for appId, appName := range applicationData { - pushCredData, err := r.getPushCredentialData(appId) - if err != nil { - return nil, err - } - - for pushCredId, pushCredType := range pushCredData { - commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "MFA Application Push Credential ID": pushCredId, - "MFA Application Push Credential Type": pushCredType, - "Native OIDC Application ID": appId, - "Native OIDC Application Name": appName, - "Resource Type": r.ResourceType(), - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", appName, pushCredType), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, appId, pushCredId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - } - - return &importBlocks, nil -} - -func (r *PingOneMFAApplicationPushCredentialResource) getOIDCApplicationData() (map[string]string, error) { - applicationData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - applications, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, application := range applications { - // MFa application push credentials are only for OIDC Native Apps - if application.ApplicationOIDC != nil { - applicationId, applicationIdOk := application.ApplicationOIDC.GetIdOk() - applicationName, applicationNameOk := application.ApplicationOIDC.GetNameOk() - applicationType, applicationTypeOk := application.ApplicationOIDC.GetTypeOk() - - if applicationIdOk && applicationNameOk && applicationTypeOk { - if *applicationType == management.ENUMAPPLICATIONTYPE_NATIVE_APP { - applicationData[*applicationId] = *applicationName - } - } - } - } - - return applicationData, nil -} - -func (r *PingOneMFAApplicationPushCredentialResource) getPushCredentialData(applicationId string) (map[string]string, error) { - mfaPushCredentialData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.MFAAPIClient.ApplicationsApplicationMFAPushCredentialsApi.ReadAllMFAPushCredentials(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, applicationId).Execute() - mfaPushCredentials, err := pingone.GetMfaAPIObjectsFromIterator[mfa.MFAPushCredentialResponse](iter, "ReadAllMFAPushCredentials", "GetPushCredentials", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, mfaPushCredential := range mfaPushCredentials { - mfaPushCredentialId, mfaPushCredentialIdOk := mfaPushCredential.GetIdOk() - mfaPushCredentialType, mfaPushCredentialTypeOk := mfaPushCredential.GetTypeOk() - - if mfaPushCredentialIdOk && mfaPushCredentialTypeOk { - mfaPushCredentialData[*mfaPushCredentialId] = string(*mfaPushCredentialType) - } - } - - return mfaPushCredentialData, nil -} diff --git a/internal/connector/pingone/mfa/resources/pingone_mfa_application_push_credential_test.go b/internal/connector/pingone/mfa/resources/pingone_mfa_application_push_credential_test.go deleted file mode 100644 index 88b53b69..00000000 --- a/internal/connector/pingone/mfa/resources/pingone_mfa_application_push_credential_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/mfa/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestMFAApplicationPushCredentialExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.MFAApplicationPushCredential(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_mfa_application_push_credential", - ResourceName: "Test MFA_APNS", - ResourceID: fmt.Sprintf("%s/11cfc8c7-ec0c-43ff-b49a-64f5e243f932/7847f8a4-f81e-4994-a095-b4d579deaf52", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_mfa_application_push_credential", - ResourceName: "Test MFA_FCM", - ResourceID: fmt.Sprintf("%s/11cfc8c7-ec0c-43ff-b49a-64f5e243f932/e22e0f8f-ed88-4bdd-a914-5a93202083d0", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_mfa_application_push_credential", - ResourceName: "Test MFA_HMS", - ResourceID: fmt.Sprintf("%s/11cfc8c7-ec0c-43ff-b49a-64f5e243f932/e609b3a8-b112-4062-8031-e9ff0d87c9e9", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/mfa/resources/pingone_mfa_device_policy_test.go b/internal/connector/pingone/mfa/resources/pingone_mfa_device_policy_test.go deleted file mode 100644 index 51ae685f..00000000 --- a/internal/connector/pingone/mfa/resources/pingone_mfa_device_policy_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/mfa/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestMFAPolicyExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.MFADevicePolicy(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_mfa_device_policy", - ResourceName: "Default MFA Policy", - ResourceID: fmt.Sprintf("%s/6adc6dfa-d883-08ed-37c5-ea8f61029ad9", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_mfa_device_policy", - ResourceName: "Test MFA Policy", - ResourceID: fmt.Sprintf("%s/5ae2227f-cb5b-47c3-bb40-440db09a98e6", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/mfa/resources/pingone_mfa_fido2_policy_test.go b/internal/connector/pingone/mfa/resources/pingone_mfa_fido2_policy_test.go deleted file mode 100644 index 457801d6..00000000 --- a/internal/connector/pingone/mfa/resources/pingone_mfa_fido2_policy_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/mfa/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestMFAFido2PolicyExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.MFAFido2Policy(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_mfa_fido2_policy", - ResourceName: "Passkeys", - ResourceID: fmt.Sprintf("%s/0f9c510a-df48-4d56-9e44-17ac0bc78961", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_mfa_fido2_policy", - ResourceName: "Security Keys", - ResourceID: fmt.Sprintf("%s/f8dc3094-cf9f-486f-9ca9-164e0856b0d8", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/mfa/resources/pingone_mfa_settings_test.go b/internal/connector/pingone/mfa/resources/pingone_mfa_settings_test.go deleted file mode 100644 index 7d213536..00000000 --- a/internal/connector/pingone/mfa/resources/pingone_mfa_settings_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/mfa/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestMFASettingsExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.MFASettings(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_mfa_settings", - ResourceName: "pingone_mfa_settings", - ResourceID: clientInfo.PingOneExportEnvironmentID, - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/pingone_platform_connector.go b/internal/connector/pingone/platform/pingone_platform_connector.go index 8c224001..0852c42b 100644 --- a/internal/connector/pingone/platform/pingone_platform_connector.go +++ b/internal/connector/pingone/platform/pingone_platform_connector.go @@ -57,7 +57,7 @@ func (c *PingOnePlatformConnector) Export(format, outputDir string, overwriteExp resources.CustomDomain(&c.clientInfo), resources.Environment(&c.clientInfo), resources.Form(&c.clientInfo), - resources.FormRecaptchaV2(&c.clientInfo), + resources.FormsRecaptchaV2(&c.clientInfo), resources.Gateway(&c.clientInfo), resources.GatewayCredential(&c.clientInfo), resources.GatewayRoleAssignment(&c.clientInfo), diff --git a/internal/connector/pingone/platform/pingone_platform_connector_test.go b/internal/connector/pingone/platform/pingone_platform_connector_test.go index 351497b5..6ac20f18 100644 --- a/internal/connector/pingone/platform/pingone_platform_connector_test.go +++ b/internal/connector/pingone/platform/pingone_platform_connector_test.go @@ -5,9 +5,9 @@ package platform_test import ( "testing" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" "github.com/pingidentity/pingcli/internal/testing/testutils_terraform" ) @@ -17,180 +17,199 @@ func TestPlatformTerraformPlan(t *testing.T) { testutils_terraform.InitPingOneTerraform(t) testCases := []struct { - name string - resource connector.ExportableResource - ignoredErrors []string + name string + testableResource *testutils_resource.TestableResource + ignoredErrors []string }{ { - name: "Agreement", - resource: resources.Agreement(clientInfo), - ignoredErrors: nil, + name: "Agreement", + testableResource: pingone_platform_testable_resources.Agreement(t, clientInfo), + ignoredErrors: nil, }, { - name: "AgreementEnable", - resource: resources.AgreementEnable(clientInfo), - ignoredErrors: nil, + name: "AgreementEnable", + testableResource: pingone_platform_testable_resources.AgreementEnable(t, clientInfo), + ignoredErrors: nil, }, { - name: "AgreementLocalization", - resource: resources.AgreementLocalization(clientInfo), - ignoredErrors: nil, + name: "AgreementLocalization", + testableResource: pingone_platform_testable_resources.AgreementLocalization(t, clientInfo), + ignoredErrors: []string{ + "Error: Cannot find language by locale en-US", + }, }, { - name: "AgreementLocalizationEnable", - resource: resources.AgreementLocalizationEnable(clientInfo), - ignoredErrors: nil, + name: "AgreementLocalizationEnable", + testableResource: pingone_platform_testable_resources.AgreementLocalizationEnable(t, clientInfo), + ignoredErrors: nil, }, { - name: "AgreementLocalizationRevision", - resource: resources.AgreementLocalizationRevision(clientInfo), - ignoredErrors: nil, + name: "AgreementLocalizationRevision", + testableResource: pingone_platform_testable_resources.AgreementLocalizationRevision(t, clientInfo), + ignoredErrors: nil, }, { - name: "BrandingSettings", - resource: resources.BrandingSettings(clientInfo), - ignoredErrors: nil, + name: "BrandingSettings", + testableResource: pingone_platform_testable_resources.BrandingSettings(t, clientInfo), + ignoredErrors: nil, }, { - name: "BrandingTheme", - resource: resources.BrandingTheme(clientInfo), + name: "BrandingTheme", + testableResource: pingone_platform_testable_resources.BrandingTheme(t, clientInfo), ignoredErrors: []string{ "Error: Invalid Attribute Combination", }, }, { - name: "BrandingThemeDefault", - resource: resources.BrandingThemeDefault(clientInfo), - ignoredErrors: nil, + name: "BrandingThemeDefault", + testableResource: pingone_platform_testable_resources.BrandingThemeDefault(t, clientInfo), + ignoredErrors: nil, }, { - name: "Certificate", - resource: resources.Certificate(clientInfo), + name: "Certificate", + testableResource: pingone_platform_testable_resources.Certificate(t, clientInfo), ignoredErrors: []string{ "Error: Invalid combination of arguments", }, }, { - name: "CustomDomain", - resource: resources.CustomDomain(clientInfo), - ignoredErrors: nil, + name: "CustomDomain", + testableResource: pingone_platform_testable_resources.CustomDomain(t, clientInfo), + ignoredErrors: nil, }, { - name: "Environment", - resource: resources.Environment(clientInfo), - ignoredErrors: nil, + name: "Environment", + testableResource: pingone_platform_testable_resources.Environment(t, clientInfo), + ignoredErrors: nil, }, { - name: "Form", - resource: resources.Form(clientInfo), - ignoredErrors: nil, + name: "Form", + testableResource: pingone_platform_testable_resources.Form(t, clientInfo), + ignoredErrors: nil, }, { - name: "FormRecaptchaV2", - resource: resources.FormRecaptchaV2(clientInfo), + name: "FormsRecaptchaV2", + testableResource: pingone_platform_testable_resources.FormsRecaptchaV2(t, clientInfo), ignoredErrors: []string{ "Error: Missing Configuration for Required Attribute", }, }, { - name: "Gateway", - resource: resources.Gateway(clientInfo), - ignoredErrors: []string{ - "Error: Invalid Attribute Combination", - "Error: Missing required argument", - }, + name: "Gateway", + testableResource: pingone_platform_testable_resources.Gateway(t, clientInfo), + ignoredErrors: nil, }, { - name: "GatewayCredential", - resource: resources.GatewayCredential(clientInfo), - ignoredErrors: nil, + name: "GatewayCredential", + testableResource: pingone_platform_testable_resources.GatewayCredential(t, clientInfo), + ignoredErrors: nil, }, { - name: "GatewayRoleAssignment", - resource: resources.GatewayRoleAssignment(clientInfo), - ignoredErrors: nil, + name: "GatewayRoleAssignment", + testableResource: pingone_platform_testable_resources.GatewayRoleAssignment(t, clientInfo), + ignoredErrors: nil, }, { - name: "IdentityPropagationPlan", - resource: resources.IdentityPropagationPlan(clientInfo), - ignoredErrors: nil, + name: "IdentityPropagationPlan", + testableResource: pingone_platform_testable_resources.IdentityPropagationPlan(t, clientInfo), + ignoredErrors: nil, }, { - name: "Key", - resource: resources.Key(clientInfo), - ignoredErrors: nil, + name: "Key", + testableResource: pingone_platform_testable_resources.Key(t, clientInfo), + ignoredErrors: nil, }, { - name: "KeyRotationPolicy", - resource: resources.KeyRotationPolicy(clientInfo), - ignoredErrors: nil, + name: "KeyRotationPolicy", + testableResource: pingone_platform_testable_resources.KeyRotationPolicy(t, clientInfo), + ignoredErrors: nil, }, { - name: "Language", - resource: resources.Language(clientInfo), - ignoredErrors: nil, + name: "Language", + testableResource: pingone_platform_testable_resources.Language(t, clientInfo), + ignoredErrors: []string{ + "Error: The language code `pt` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `fr` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `es` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `pl` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `hu` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `cs` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `ru` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `ko` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `th` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `tr` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `fr-CA` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `de` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `it` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `ja` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `zh` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `en` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + "Error: The language code `nl` is reserved and cannot be imported into this provider. Please use `pingone_language_override` for system-defined languages instead.", + }, }, { - name: "LanguageUpdate", - resource: resources.LanguageUpdate(clientInfo), - ignoredErrors: nil, + name: "LanguageUpdate", + testableResource: pingone_platform_testable_resources.LanguageUpdate(t, clientInfo), + ignoredErrors: nil, }, { - name: "NotificationPolicy", - resource: resources.NotificationPolicy(clientInfo), - ignoredErrors: nil, + name: "NotificationPolicy", + testableResource: pingone_platform_testable_resources.NotificationPolicy(t, clientInfo), + ignoredErrors: nil, }, { - name: "NotificationSettings", - resource: resources.NotificationSettings(clientInfo), - ignoredErrors: nil, + name: "NotificationSettings", + testableResource: pingone_platform_testable_resources.NotificationSettings(t, clientInfo), + ignoredErrors: nil, }, { - name: "NotificationSettingsEmail", - resource: resources.NotificationSettingsEmail(clientInfo), + name: "NotificationSettingsEmail", + testableResource: pingone_platform_testable_resources.NotificationSettingsEmail(t, clientInfo), ignoredErrors: []string{ "Error: Missing Configuration for Required Attribute", }, }, - // TODO remove this skip dependent upon STAGING-25369 - // { - // name: "NotificationTemplateContent", - // resource: resources.NotificationTemplateContent(clientInfo), - // ignoredErrors: nil, - // }, { - name: "PhoneDeliverySettings", - resource: resources.PhoneDeliverySettings(clientInfo), + name: "NotificationTemplateContent", + testableResource: pingone_platform_testable_resources.NotificationTemplateContent(t, clientInfo), + ignoredErrors: nil, + }, + { + name: "PhoneDeliverySettings", + testableResource: pingone_platform_testable_resources.PhoneDeliverySettings(t, clientInfo), ignoredErrors: []string{ "Error: Missing required argument", - "Error: Missing Configuration for Required Attribute", }, }, { - name: "SystemApplication", - resource: resources.SystemApplication(clientInfo), - ignoredErrors: nil, - }, - { - name: "TrustedEmailAddress", - resource: resources.TrustedEmailAddress(clientInfo), - ignoredErrors: nil, + name: "SystemApplication", + testableResource: pingone_platform_testable_resources.SystemApplication(t, clientInfo), + ignoredErrors: nil, }, + // TODO: Currently unable to create a trusted email address via API due to trust email domain verification requirement + // { + // name: "TrustedEmailAddress", + // testableResource: pingone_platform_testable_resources.TrustedEmailAddress(t, clientInfo), + // ignoredErrors: nil, + // }, { - name: "TrustedEmailDomain", - resource: resources.TrustedEmailDomain(clientInfo), - ignoredErrors: nil, + name: "TrustedEmailDomain", + testableResource: pingone_platform_testable_resources.TrustedEmailDomain(t, clientInfo), + ignoredErrors: nil, }, { - name: "Webhook", - resource: resources.Webhook(clientInfo), - ignoredErrors: nil, + name: "Webhook", + testableResource: pingone_platform_testable_resources.Webhook(t, clientInfo), + ignoredErrors: nil, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - testutils_terraform.ValidateTerraformPlan(t, tc.resource, tc.ignoredErrors) + tc.testableResource.CreateResource(t) + defer tc.testableResource.DeleteResource(t) + + testutils_terraform.ValidateTerraformPlan(t, tc.testableResource.ExportableResource, tc.ignoredErrors) }) } } diff --git a/internal/connector/pingone/platform/resources/pingone_agreement.go b/internal/connector/pingone/platform/resources/agreement.go similarity index 91% rename from internal/connector/pingone/platform/resources/pingone_agreement.go rename to internal/connector/pingone/platform/resources/agreement.go index 898ac2c2..a3e2e55c 100644 --- a/internal/connector/pingone/platform/resources/pingone_agreement.go +++ b/internal/connector/pingone/platform/resources/agreement.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,12 +69,12 @@ func (r *PingOneAgreementResource) getAgreementData() (map[string]string, error) agreementData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.AgreementsResourcesApi.ReadAllAgreements(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - agreements, err := pingone.GetManagementAPIObjectsFromIterator[management.Agreement](iter, "ReadAllAgreements", "GetAgreements", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Agreement](iter, "ReadAllAgreements", "GetAgreements", r.ResourceType()) if err != nil { return nil, err } - for _, agreement := range agreements { + for _, agreement := range apiObjs { agreementId, agreementIdOk := agreement.GetIdOk() agreementName, agreementNameOk := agreement.GetNameOk() diff --git a/internal/connector/pingone/platform/resources/pingone_agreement_enable.go b/internal/connector/pingone/platform/resources/agreement_enable.go similarity index 100% rename from internal/connector/pingone/platform/resources/pingone_agreement_enable.go rename to internal/connector/pingone/platform/resources/agreement_enable.go diff --git a/internal/connector/pingone/platform/resources/agreement_enable_test.go b/internal/connector/pingone/platform/resources/agreement_enable_test.go new file mode 100644 index 00000000..66bdbd43 --- /dev/null +++ b/internal/connector/pingone/platform/resources/agreement_enable_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_AgreementEnable(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.AgreementEnable(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + agreementTr := tr.Dependencies[0] + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_enable", agreementTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, agreementTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_agreement_localization.go b/internal/connector/pingone/platform/resources/agreement_localization.go similarity index 85% rename from internal/connector/pingone/platform/resources/pingone_agreement_localization.go rename to internal/connector/pingone/platform/resources/agreement_localization.go index e45c99cd..eb0832b4 100644 --- a/internal/connector/pingone/platform/resources/pingone_agreement_localization.go +++ b/internal/connector/pingone/platform/resources/agreement_localization.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -77,12 +78,12 @@ func (r *PingOneAgreementLocalizationResource) getAgreementData() (map[string]st agreementData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.AgreementsResourcesApi.ReadAllAgreements(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - agreements, err := pingone.GetManagementAPIObjectsFromIterator[management.Agreement](iter, "ReadAllAgreements", "GetAgreements", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Agreement](iter, "ReadAllAgreements", "GetAgreements", r.ResourceType()) if err != nil { return nil, err } - for _, agreement := range agreements { + for _, agreement := range apiObjs { agreementId, agreementIdOk := agreement.GetIdOk() agreementName, agreementNameOk := agreement.GetNameOk() @@ -98,15 +99,15 @@ func (r *PingOneAgreementLocalizationResource) getAgreementLocalizationData(agre agreementLocalizationData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.AgreementLanguagesResourcesApi.ReadAllAgreementLanguages(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, agreementId).Execute() - languageInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedLanguagesInner](iter, "ReadAllAgreementLanguages", "GetLanguages", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedLanguagesInner](iter, "ReadAllAgreementLanguages", "GetLanguages", r.ResourceType()) if err != nil { return nil, err } - for _, languageInner := range languageInners { - if languageInner.AgreementLanguage != nil { - agreementLocalizationId, agreementLocalizationIdOk := languageInner.AgreementLanguage.GetIdOk() - agreementLocalizationLocale, agreementLocalizationLocaleOk := languageInner.AgreementLanguage.GetLocaleOk() + for _, innerObj := range apiObjs { + if innerObj.AgreementLanguage != nil { + agreementLocalizationId, agreementLocalizationIdOk := innerObj.AgreementLanguage.GetIdOk() + agreementLocalizationLocale, agreementLocalizationLocaleOk := innerObj.AgreementLanguage.GetLocaleOk() if agreementLocalizationIdOk && agreementLocalizationLocaleOk { agreementLocalizationData[*agreementLocalizationId] = *agreementLocalizationLocale diff --git a/internal/connector/pingone/platform/resources/pingone_agreement_localization_enable.go b/internal/connector/pingone/platform/resources/agreement_localization_enable.go similarity index 100% rename from internal/connector/pingone/platform/resources/pingone_agreement_localization_enable.go rename to internal/connector/pingone/platform/resources/agreement_localization_enable.go diff --git a/internal/connector/pingone/platform/resources/agreement_localization_enable_test.go b/internal/connector/pingone/platform/resources/agreement_localization_enable_test.go new file mode 100644 index 00000000..d69a2617 --- /dev/null +++ b/internal/connector/pingone/platform/resources/agreement_localization_enable_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_AgreementLocalizationEnable(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.AgreementLocalizationEnable(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + agreementLocalizationTr := tr.Dependencies[0] + agreementTr := agreementLocalizationTr.Dependencies[0] + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s_enable", agreementTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], agreementLocalizationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_LOCALE]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, agreementTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], agreementLocalizationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_agreement_localization_revision.go b/internal/connector/pingone/platform/resources/agreement_localization_revision.go similarity index 80% rename from internal/connector/pingone/platform/resources/pingone_agreement_localization_revision.go rename to internal/connector/pingone/platform/resources/agreement_localization_revision.go index cd28bec7..dd137f2e 100644 --- a/internal/connector/pingone/platform/resources/pingone_agreement_localization_revision.go +++ b/internal/connector/pingone/platform/resources/agreement_localization_revision.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -85,12 +86,12 @@ func (r *PingOneAgreementLocalizationRevisionResource) getAgreementData() (map[s agreementData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.AgreementsResourcesApi.ReadAllAgreements(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - agreements, err := pingone.GetManagementAPIObjectsFromIterator[management.Agreement](iter, "ReadAllAgreements", "GetAgreements", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Agreement](iter, "ReadAllAgreements", "GetAgreements", r.ResourceType()) if err != nil { return nil, err } - for _, agreement := range agreements { + for _, agreement := range apiObjs { agreementId, agreementIdOk := agreement.GetIdOk() agreementName, agreementNameOk := agreement.GetNameOk() @@ -103,38 +104,38 @@ func (r *PingOneAgreementLocalizationRevisionResource) getAgreementData() (map[s } func (r *PingOneAgreementLocalizationRevisionResource) getAgreementLanguageData(agreementId string) (map[string]string, error) { - agreementLanguageData := make(map[string]string) + agreementLocalizationData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.AgreementLanguagesResourcesApi.ReadAllAgreementLanguages(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, agreementId).Execute() - languageInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedLanguagesInner](iter, "ReadAllAgreementLanguages", "GetLanguages", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedLanguagesInner](iter, "ReadAllAgreementLanguages", "GetLanguages", r.ResourceType()) if err != nil { return nil, err } - for _, languageInner := range languageInners { - if languageInner.AgreementLanguage != nil { - agreementLanguageLocale, agreementLanguageLocaleOk := languageInner.AgreementLanguage.GetLocaleOk() - agreementLanguageId, agreementLanguageIdOk := languageInner.AgreementLanguage.GetIdOk() + for _, innerObj := range apiObjs { + if innerObj.AgreementLanguage != nil { + agreementLocalizationId, agreementLocalizationIdOk := innerObj.AgreementLanguage.GetIdOk() + agreementLocalizationLocale, agreementLocalizationLocaleOk := innerObj.AgreementLanguage.GetLocaleOk() - if agreementLanguageLocaleOk && agreementLanguageIdOk { - agreementLanguageData[*agreementLanguageId] = *agreementLanguageLocale + if agreementLocalizationIdOk && agreementLocalizationLocaleOk { + agreementLocalizationData[*agreementLocalizationId] = *agreementLocalizationLocale } } } - return agreementLanguageData, nil + return agreementLocalizationData, nil } func (r *PingOneAgreementLocalizationRevisionResource) getAgreementLocalizationRevisionData(agreementId, agreementLocalizationId string) ([]string, error) { agreementLocalizationRevisionData := []string{} iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.AgreementRevisionsResourcesApi.ReadAllAgreementLanguageRevisions(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, agreementId, agreementLocalizationId).Execute() - agreementLocalizationRevisions, err := pingone.GetManagementAPIObjectsFromIterator[management.AgreementLanguageRevision](iter, "ReadAllAgreementLanguageRevisions", "GetRevisions", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.AgreementLanguageRevision](iter, "ReadAllAgreementLanguageRevisions", "GetRevisions", r.ResourceType()) if err != nil { return nil, err } - for _, agreementLocalizationRevision := range agreementLocalizationRevisions { + for _, agreementLocalizationRevision := range apiObjs { agreementLocalizationRevisionId, agreementLocalizationRevisionIdOk := agreementLocalizationRevision.GetIdOk() if agreementLocalizationRevisionIdOk { diff --git a/internal/connector/pingone/platform/resources/agreement_localization_revision_test.go b/internal/connector/pingone/platform/resources/agreement_localization_revision_test.go new file mode 100644 index 00000000..8fdffa9f --- /dev/null +++ b/internal/connector/pingone/platform/resources/agreement_localization_revision_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_AgreementLocalizationRevision(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.AgreementLocalizationRevision(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + agreementLocalizationTr := tr.Dependencies[0] + agreementTr := agreementLocalizationTr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s_%s", agreementTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], agreementLocalizationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_LOCALE], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + ResourceID: fmt.Sprintf("%s/%s/%s/%s", clientInfo.PingOneExportEnvironmentID, agreementTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], agreementLocalizationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/agreement_localization_test.go b/internal/connector/pingone/platform/resources/agreement_localization_test.go new file mode 100644 index 00000000..64631b08 --- /dev/null +++ b/internal/connector/pingone/platform/resources/agreement_localization_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_AgreementLocalization(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.AgreementLocalization(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + agreementTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", agreementTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_LOCALE]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, agreementTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/agreement_test.go b/internal/connector/pingone/platform/resources/agreement_test.go new file mode 100644 index 00000000..13f320d7 --- /dev/null +++ b/internal/connector/pingone/platform/resources/agreement_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_Agreement(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.Agreement(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_alert_channel.go b/internal/connector/pingone/platform/resources/alert_channel.go similarity index 100% rename from internal/connector/pingone/platform/resources/pingone_alert_channel.go rename to internal/connector/pingone/platform/resources/alert_channel.go diff --git a/internal/connector/pingone/platform/resources/alert_channel_test.go b/internal/connector/pingone/platform/resources/alert_channel_test.go new file mode 100644 index 00000000..9d97be5d --- /dev/null +++ b/internal/connector/pingone/platform/resources/alert_channel_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func TestAlertChannelExport(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.AlertChannel(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_branding_settings.go b/internal/connector/pingone/platform/resources/branding_settings.go similarity index 98% rename from internal/connector/pingone/platform/resources/pingone_branding_settings.go rename to internal/connector/pingone/platform/resources/branding_settings.go index 1ae0088d..87c7b258 100644 --- a/internal/connector/pingone/platform/resources/pingone_branding_settings.go +++ b/internal/connector/pingone/platform/resources/branding_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -61,5 +62,6 @@ func (r *PingOneBrandingSettingsResource) ExportAll() (*[]connector.ImportBlock, func (r *PingOneBrandingSettingsResource) checkBrandingSettingsData() (bool, error) { _, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.BrandingSettingsApi.ReadBrandingSettings(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + return common.CheckSingletonResource(response, err, "ReadBrandingSettings", r.ResourceType()) } diff --git a/internal/connector/pingone/platform/resources/branding_settings_test.go b/internal/connector/pingone/platform/resources/branding_settings_test.go new file mode 100644 index 00000000..f6e79034 --- /dev/null +++ b/internal/connector/pingone/platform/resources/branding_settings_test.go @@ -0,0 +1,28 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_BrandingSettings(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.BrandingSettings(t, clientInfo) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ExportableResource.ResourceType(), + ResourceID: clientInfo.PingOneExportEnvironmentID, + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_branding_theme.go b/internal/connector/pingone/platform/resources/branding_theme.go similarity index 92% rename from internal/connector/pingone/platform/resources/pingone_branding_theme.go rename to internal/connector/pingone/platform/resources/branding_theme.go index f8d979dd..d6befc00 100644 --- a/internal/connector/pingone/platform/resources/pingone_branding_theme.go +++ b/internal/connector/pingone/platform/resources/branding_theme.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -68,12 +69,12 @@ func (r *PingOneBrandingThemeResource) getBrandingThemeData() (map[string]string brandingThemeData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.BrandingThemesApi.ReadBrandingThemes(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - brandingThemes, err := pingone.GetManagementAPIObjectsFromIterator[management.BrandingTheme](iter, "ReadBrandingThemes", "GetThemes", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.BrandingTheme](iter, "ReadBrandingThemes", "GetThemes", r.ResourceType()) if err != nil { return nil, err } - for _, brandingTheme := range brandingThemes { + for _, brandingTheme := range apiObjs { brandingThemeId, brandingThemeIdOk := brandingTheme.GetIdOk() brandingThemeConfiguration, brandingThemeConfigurationOk := brandingTheme.GetConfigurationOk() diff --git a/internal/connector/pingone/platform/resources/pingone_branding_theme_default.go b/internal/connector/pingone/platform/resources/branding_theme_default.go similarity index 66% rename from internal/connector/pingone/platform/resources/pingone_branding_theme_default.go rename to internal/connector/pingone/platform/resources/branding_theme_default.go index 448b9cf4..62c7cf07 100644 --- a/internal/connector/pingone/platform/resources/pingone_branding_theme_default.go +++ b/internal/connector/pingone/platform/resources/branding_theme_default.go @@ -1,10 +1,9 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources import ( - "fmt" - "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" @@ -38,23 +37,22 @@ func (r *PingOneBrandingThemeDefaultResource) ExportAll() (*[]connector.ImportBl importBlocks := []connector.ImportBlock{} - defaultBrandingThemeName, err := r.getDefaultBrandingThemeName() + ok, err := r.checkBrandingThemeDefaultData() if err != nil { return nil, err } - if defaultBrandingThemeName == nil { + if !ok { return &importBlocks, nil } commentData := map[string]string{ - "Default Branding Theme Name": *defaultBrandingThemeName, - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), + "Resource Type": r.ResourceType(), + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_default_theme", *defaultBrandingThemeName), + ResourceName: r.ResourceType(), ResourceID: r.clientInfo.PingOneExportEnvironmentID, CommentInformation: common.GenerateCommentInformation(commentData), } @@ -64,29 +62,20 @@ func (r *PingOneBrandingThemeDefaultResource) ExportAll() (*[]connector.ImportBl return &importBlocks, nil } -func (r *PingOneBrandingThemeDefaultResource) getDefaultBrandingThemeName() (*string, error) { +func (r *PingOneBrandingThemeDefaultResource) checkBrandingThemeDefaultData() (bool, error) { iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.BrandingThemesApi.ReadBrandingThemes(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() brandingThemes, err := pingone.GetManagementAPIObjectsFromIterator[management.BrandingTheme](iter, "ReadBrandingThemes", "GetThemes", r.ResourceType()) if err != nil { - return nil, err + return false, err } for _, brandingTheme := range brandingThemes { - brandingThemeDefault, brandingThemeDefaultOk := brandingTheme.GetDefaultOk() - - if brandingThemeDefaultOk && *brandingThemeDefault { - brandingThemeConfiguration, brandingThemeConfigurationOk := brandingTheme.GetConfigurationOk() - - if brandingThemeConfigurationOk { - brandingThemeName, brandingThemeNameOk := brandingThemeConfiguration.GetNameOk() - - if brandingThemeNameOk { - return brandingThemeName, nil - } - } + if brandingTheme.Default { + _, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.BrandingThemesApi.ReadBrandingThemeDefault(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, *brandingTheme.Id).Execute() + return common.CheckSingletonResource(response, err, "ReadBrandingThemeDefault", r.ResourceType()) } } - return nil, fmt.Errorf("failed to export resource '%s'. No default branding theme found", r.ResourceType()) + return false, nil } diff --git a/internal/connector/pingone/platform/resources/branding_theme_default_test.go b/internal/connector/pingone/platform/resources/branding_theme_default_test.go new file mode 100644 index 00000000..bf799a69 --- /dev/null +++ b/internal/connector/pingone/platform/resources/branding_theme_default_test.go @@ -0,0 +1,28 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_BrandingThemeDefault(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.BrandingThemeDefault(t, clientInfo) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ExportableResource.ResourceType(), + ResourceID: clientInfo.PingOneExportEnvironmentID, + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/branding_theme_test.go b/internal/connector/pingone/platform/resources/branding_theme_test.go new file mode 100644 index 00000000..c70220a0 --- /dev/null +++ b/internal/connector/pingone/platform/resources/branding_theme_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_BrandingTheme(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.BrandingTheme(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // There are pre-configured branding themes in the environment, so only validate the import blocks as a subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_certificate.go b/internal/connector/pingone/platform/resources/certificate.go similarity index 97% rename from internal/connector/pingone/platform/resources/pingone_certificate.go rename to internal/connector/pingone/platform/resources/certificate.go index 02fd6ec7..919762c2 100644 --- a/internal/connector/pingone/platform/resources/pingone_certificate.go +++ b/internal/connector/pingone/platform/resources/certificate.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -67,12 +68,13 @@ func (r *PingOneCertificateResource) getCertificateData() (map[string]string, er // TODO: Implement pagination once supported in the PingOne Go Client SDK entityArray, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.CertificateManagementApi.GetCertificates(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + ok, err := common.HandleClientResponse(response, err, "GetCertificates", r.ResourceType()) if err != nil { return nil, err } if !ok { - return nil, nil + return certificateData, nil } if entityArray == nil { diff --git a/internal/connector/pingone/platform/resources/certificate_test.go b/internal/connector/pingone/platform/resources/certificate_test.go new file mode 100644 index 00000000..aa8e925b --- /dev/null +++ b/internal/connector/pingone/platform/resources/certificate_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_Certificate(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.Certificate(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_custom_domain.go b/internal/connector/pingone/platform/resources/custom_domain.go similarity index 76% rename from internal/connector/pingone/platform/resources/pingone_custom_domain.go rename to internal/connector/pingone/platform/resources/custom_domain.go index a6a1cc3d..f8ee7b64 100644 --- a/internal/connector/pingone/platform/resources/pingone_custom_domain.go +++ b/internal/connector/pingone/platform/resources/custom_domain.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -38,23 +39,23 @@ func (r *PingOneCustomDomainResource) ExportAll() (*[]connector.ImportBlock, err importBlocks := []connector.ImportBlock{} - domainData, err := r.getCustomDomainData() + customDomainData, err := r.getCustomDomainData() if err != nil { return nil, err } - for domainId, domainName := range domainData { + for customDomainId, customDomainName := range customDomainData { commentData := map[string]string{ - "Custom Domain ID": domainId, - "Custom Domain Name": domainName, + "Custom Domain ID": customDomainId, + "Custom Domain Name": customDomainName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: domainName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, domainId), + ResourceName: customDomainName, + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, customDomainId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -65,22 +66,22 @@ func (r *PingOneCustomDomainResource) ExportAll() (*[]connector.ImportBlock, err } func (r *PingOneCustomDomainResource) getCustomDomainData() (map[string]string, error) { - domainData := make(map[string]string) + customDomainData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.CustomDomainsApi.ReadAllDomains(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - customDomains, err := pingone.GetManagementAPIObjectsFromIterator[management.CustomDomain](iter, "ReadAllDomains", "GetCustomDomains", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.CustomDomain](iter, "ReadAllDomains", "GetCustomDomains", r.ResourceType()) if err != nil { return nil, err } - for _, customDomain := range customDomains { - customDomainName, customDomainNameOk := customDomain.GetDomainNameOk() + for _, customDomain := range apiObjs { customDomainId, customDomainIdOk := customDomain.GetIdOk() + customDomainName, customDomainNameOk := customDomain.GetDomainNameOk() if customDomainIdOk && customDomainNameOk { - domainData[*customDomainId] = *customDomainName + customDomainData[*customDomainId] = *customDomainName } } - return domainData, nil + return customDomainData, nil } diff --git a/internal/connector/pingone/platform/resources/custom_domain_test.go b/internal/connector/pingone/platform/resources/custom_domain_test.go new file mode 100644 index 00000000..bc09e1ff --- /dev/null +++ b/internal/connector/pingone/platform/resources/custom_domain_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_CustomDomain(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.CustomDomain(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_environment.go b/internal/connector/pingone/platform/resources/environment.go similarity index 94% rename from internal/connector/pingone/platform/resources/pingone_environment.go rename to internal/connector/pingone/platform/resources/environment.go index 0ad8d988..355b743b 100644 --- a/internal/connector/pingone/platform/resources/pingone_environment.go +++ b/internal/connector/pingone/platform/resources/environment.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -10,7 +11,7 @@ import ( // Verify that the resource satisfies the exportable resource interface var ( - _ connector.ExportableResource = &PingOneCustomDomainResource{} + _ connector.ExportableResource = &PingOneEnvironmentResource{} ) type PingOneEnvironmentResource struct { @@ -61,5 +62,6 @@ func (r *PingOneEnvironmentResource) ExportAll() (*[]connector.ImportBlock, erro func (r *PingOneEnvironmentResource) checkEnvironmentData() (bool, error) { _, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.EnvironmentsApi.ReadOneEnvironment(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + return common.CheckSingletonResource(response, err, "ReadOneEnvironment", r.ResourceType()) } diff --git a/internal/connector/pingone/platform/resources/environment_test.go b/internal/connector/pingone/platform/resources/environment_test.go new file mode 100644 index 00000000..d7cd9d41 --- /dev/null +++ b/internal/connector/pingone/platform/resources/environment_test.go @@ -0,0 +1,28 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_Environment(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.Environment(t, clientInfo) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ExportableResource.ResourceType(), + ResourceID: clientInfo.PingOneExportEnvironmentID, + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_form.go b/internal/connector/pingone/platform/resources/form.go similarity index 91% rename from internal/connector/pingone/platform/resources/pingone_form.go rename to internal/connector/pingone/platform/resources/form.go index fafc5f0f..e9d104d8 100644 --- a/internal/connector/pingone/platform/resources/pingone_form.go +++ b/internal/connector/pingone/platform/resources/form.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -45,9 +46,9 @@ func (r *PingOneFormResource) ExportAll() (*[]connector.ImportBlock, error) { for formId, formName := range formData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Form ID": formId, "Form Name": formName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } @@ -68,12 +69,12 @@ func (r *PingOneFormResource) getFormData() (map[string]string, error) { formData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.FormManagementApi.ReadAllForms(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - forms, err := pingone.GetManagementAPIObjectsFromIterator[management.Form](iter, "ReadAllForms", "GetForms", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Form](iter, "ReadAllForms", "GetForms", r.ResourceType()) if err != nil { return nil, err } - for _, form := range forms { + for _, form := range apiObjs { formId, formIdOk := form.GetIdOk() formName, formNameOk := form.GetNameOk() diff --git a/internal/connector/pingone/platform/resources/form_test.go b/internal/connector/pingone/platform/resources/form_test.go new file mode 100644 index 00000000..547dc76d --- /dev/null +++ b/internal/connector/pingone/platform/resources/form_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_Form(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.Form(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_forms_recaptcha_v2.go b/internal/connector/pingone/platform/resources/forms_recaptcha_v2.go similarity index 69% rename from internal/connector/pingone/platform/resources/pingone_forms_recaptcha_v2.go rename to internal/connector/pingone/platform/resources/forms_recaptcha_v2.go index 53c5c8cd..77bf419c 100644 --- a/internal/connector/pingone/platform/resources/pingone_forms_recaptcha_v2.go +++ b/internal/connector/pingone/platform/resources/forms_recaptcha_v2.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -10,31 +11,31 @@ import ( // Verify that the resource satisfies the exportable resource interface var ( - _ connector.ExportableResource = &PingOneFormRecaptchaV2Resource{} + _ connector.ExportableResource = &PingOneFormsRecaptchaV2Resource{} ) -type PingOneFormRecaptchaV2Resource struct { +type PingOneFormsRecaptchaV2Resource struct { clientInfo *connector.ClientInfo } -// Utility method for creating a PingOneFormRecaptchaV2Resource -func FormRecaptchaV2(clientInfo *connector.ClientInfo) *PingOneFormRecaptchaV2Resource { - return &PingOneFormRecaptchaV2Resource{ +// Utility method for creating a PingOneFormsRecaptchaV2Resource +func FormsRecaptchaV2(clientInfo *connector.ClientInfo) *PingOneFormsRecaptchaV2Resource { + return &PingOneFormsRecaptchaV2Resource{ clientInfo: clientInfo, } } -func (r *PingOneFormRecaptchaV2Resource) ResourceType() string { +func (r *PingOneFormsRecaptchaV2Resource) ResourceType() string { return "pingone_forms_recaptcha_v2" } -func (r *PingOneFormRecaptchaV2Resource) ExportAll() (*[]connector.ImportBlock, error) { +func (r *PingOneFormsRecaptchaV2Resource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - ok, err := r.checkFormRecaptchaV2Data() + ok, err := r.checkFormsRecaptchaV2Data() if err != nil { return nil, err } @@ -43,8 +44,8 @@ func (r *PingOneFormRecaptchaV2Resource) ExportAll() (*[]connector.ImportBlock, } commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, } importBlock := connector.ImportBlock{ @@ -59,7 +60,8 @@ func (r *PingOneFormRecaptchaV2Resource) ExportAll() (*[]connector.ImportBlock, return &importBlocks, nil } -func (r *PingOneFormRecaptchaV2Resource) checkFormRecaptchaV2Data() (bool, error) { +func (r *PingOneFormsRecaptchaV2Resource) checkFormsRecaptchaV2Data() (bool, error) { _, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.RecaptchaConfigurationApi.ReadRecaptchaConfiguration(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + return common.CheckSingletonResource(response, err, "ReadRecaptchaConfiguration", r.ResourceType()) } diff --git a/internal/connector/pingone/platform/resources/forms_recaptcha_v2_test.go b/internal/connector/pingone/platform/resources/forms_recaptcha_v2_test.go new file mode 100644 index 00000000..a0c8e3d1 --- /dev/null +++ b/internal/connector/pingone/platform/resources/forms_recaptcha_v2_test.go @@ -0,0 +1,31 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_FormsRecaptchaV2(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.FormsRecaptchaV2(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ExportableResource.ResourceType(), + ResourceID: clientInfo.PingOneExportEnvironmentID, + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_gateway.go b/internal/connector/pingone/platform/resources/gateway.go similarity index 76% rename from internal/connector/pingone/platform/resources/pingone_gateway.go rename to internal/connector/pingone/platform/resources/gateway.go index 9602d7cf..12e6a97e 100644 --- a/internal/connector/pingone/platform/resources/pingone_gateway.go +++ b/internal/connector/pingone/platform/resources/gateway.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -45,9 +46,9 @@ func (r *PingOneGatewayResource) ExportAll() (*[]connector.ImportBlock, error) { for gatewayId, gatewayName := range gatewayData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Gateway ID": gatewayId, "Gateway Name": gatewayName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } @@ -68,12 +69,12 @@ func (r *PingOneGatewayResource) getGatewayData() (map[string]string, error) { gatewayData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.GatewaysApi.ReadAllGateways(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - gateways, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedGatewaysInner](iter, "ReadAllGateways", "GetGateways", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedGatewaysInner](iter, "ReadAllGateways", "GetGateways", r.ResourceType()) if err != nil { return nil, err } - for _, gatewayInner := range gateways { + for _, innerObj := range apiObjs { var ( gatewayId *string gatewayIdOk bool @@ -82,15 +83,15 @@ func (r *PingOneGatewayResource) getGatewayData() (map[string]string, error) { ) switch { - case gatewayInner.Gateway != nil: - gatewayId, gatewayIdOk = gatewayInner.Gateway.GetIdOk() - gatewayName, gatewayNameOk = gatewayInner.Gateway.GetNameOk() - case gatewayInner.GatewayTypeLDAP != nil: - gatewayId, gatewayIdOk = gatewayInner.GatewayTypeLDAP.GetIdOk() - gatewayName, gatewayNameOk = gatewayInner.GatewayTypeLDAP.GetNameOk() - case gatewayInner.GatewayTypeRADIUS != nil: - gatewayId, gatewayIdOk = gatewayInner.GatewayTypeRADIUS.GetIdOk() - gatewayName, gatewayNameOk = gatewayInner.GatewayTypeRADIUS.GetNameOk() + case innerObj.Gateway != nil: + gatewayId, gatewayIdOk = innerObj.Gateway.GetIdOk() + gatewayName, gatewayNameOk = innerObj.Gateway.GetNameOk() + case innerObj.GatewayTypeLDAP != nil: + gatewayId, gatewayIdOk = innerObj.GatewayTypeLDAP.GetIdOk() + gatewayName, gatewayNameOk = innerObj.GatewayTypeLDAP.GetNameOk() + case innerObj.GatewayTypeRADIUS != nil: + gatewayId, gatewayIdOk = innerObj.GatewayTypeRADIUS.GetIdOk() + gatewayName, gatewayNameOk = innerObj.GatewayTypeRADIUS.GetNameOk() default: continue } diff --git a/internal/connector/pingone/platform/resources/pingone_gateway_credential.go b/internal/connector/pingone/platform/resources/gateway_credential.go similarity index 77% rename from internal/connector/pingone/platform/resources/pingone_gateway_credential.go rename to internal/connector/pingone/platform/resources/gateway_credential.go index 005734f1..305d4ef2 100644 --- a/internal/connector/pingone/platform/resources/pingone_gateway_credential.go +++ b/internal/connector/pingone/platform/resources/gateway_credential.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -51,10 +52,10 @@ func (r *PingOneGatewayCredentialResource) ExportAll() (*[]connector.ImportBlock for _, gatewayCredentialId := range gatewayCredentialData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Gateway Credential ID": gatewayCredentialId, "Gateway ID": gatewayId, "Gateway Name": gatewayName, + "Gateway Credential ID": gatewayCredentialId, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } @@ -76,12 +77,12 @@ func (r *PingOneGatewayCredentialResource) getGatewayData() (map[string]string, gatewayData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.GatewaysApi.ReadAllGateways(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - gatewayInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedGatewaysInner](iter, "ReadAllGateways", "GetGateways", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedGatewaysInner](iter, "ReadAllGateways", "GetGateways", r.ResourceType()) if err != nil { return nil, err } - for _, gatewayInner := range gatewayInners { + for _, innerObj := range apiObjs { var ( gatewayId *string gatewayIdOk bool @@ -90,15 +91,15 @@ func (r *PingOneGatewayCredentialResource) getGatewayData() (map[string]string, ) switch { - case gatewayInner.Gateway != nil: - gatewayId, gatewayIdOk = gatewayInner.Gateway.GetIdOk() - gatewayName, gatewayNameOk = gatewayInner.Gateway.GetNameOk() - case gatewayInner.GatewayTypeLDAP != nil: - gatewayId, gatewayIdOk = gatewayInner.GatewayTypeLDAP.GetIdOk() - gatewayName, gatewayNameOk = gatewayInner.GatewayTypeLDAP.GetNameOk() - case gatewayInner.GatewayTypeRADIUS != nil: - gatewayId, gatewayIdOk = gatewayInner.GatewayTypeRADIUS.GetIdOk() - gatewayName, gatewayNameOk = gatewayInner.GatewayTypeRADIUS.GetNameOk() + case innerObj.Gateway != nil: + gatewayId, gatewayIdOk = innerObj.Gateway.GetIdOk() + gatewayName, gatewayNameOk = innerObj.Gateway.GetNameOk() + case innerObj.GatewayTypeLDAP != nil: + gatewayId, gatewayIdOk = innerObj.GatewayTypeLDAP.GetIdOk() + gatewayName, gatewayNameOk = innerObj.GatewayTypeLDAP.GetNameOk() + case innerObj.GatewayTypeRADIUS != nil: + gatewayId, gatewayIdOk = innerObj.GatewayTypeRADIUS.GetIdOk() + gatewayName, gatewayNameOk = innerObj.GatewayTypeRADIUS.GetNameOk() default: continue } @@ -115,12 +116,12 @@ func (r *PingOneGatewayCredentialResource) getGatewayCredentialData(gatewayId st gatewayCredentialData := []string{} iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.GatewayCredentialsApi.ReadAllGatewayCredentials(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, gatewayId).Execute() - gatewayCredentials, err := pingone.GetManagementAPIObjectsFromIterator[management.GatewayCredential](iter, "ReadAllGatewayCredentials", "GetCredentials", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.GatewayCredential](iter, "ReadAllGatewayCredentials", "GetCredentials", r.ResourceType()) if err != nil { return nil, err } - for _, gatewayCredential := range gatewayCredentials { + for _, gatewayCredential := range apiObjs { gatewayCredentialId, gatewayCredentialIdOk := gatewayCredential.GetIdOk() if gatewayCredentialIdOk { diff --git a/internal/connector/pingone/platform/resources/gateway_credential_test.go b/internal/connector/pingone/platform/resources/gateway_credential_test.go new file mode 100644 index 00000000..162a90f9 --- /dev/null +++ b/internal/connector/pingone/platform/resources/gateway_credential_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_GatewayCredential(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.GatewayCredential(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + gatewayTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_credential_%s", gatewayTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_CREDENTIAL]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, gatewayTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_CREDENTIAL]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_gateway_role_assignment.go b/internal/connector/pingone/platform/resources/gateway_role_assignment.go similarity index 61% rename from internal/connector/pingone/platform/resources/pingone_gateway_role_assignment.go rename to internal/connector/pingone/platform/resources/gateway_role_assignment.go index f94866f4..6c0307b6 100644 --- a/internal/connector/pingone/platform/resources/pingone_gateway_role_assignment.go +++ b/internal/connector/pingone/platform/resources/gateway_role_assignment.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -49,28 +50,31 @@ func (r *PingOneGatewayRoleAssignmentResource) ExportAll() (*[]connector.ImportB return nil, err } - for roleAssignmentId, roleId := range gatewayRoleAssignmentData { - roleName, err := r.getRoleAssignmentRoleName(roleId) + for gatewayRoleAssignmentId, gatewayRoleId := range gatewayRoleAssignmentData { + gatewayRoleName, gatewayRoleNameOk, err := r.getRoleAssignmentRoleName(gatewayRoleId) if err != nil { return nil, err } - if roleName == nil { + if gatewayRoleName == nil { + continue + } + if !gatewayRoleNameOk { continue } commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Gateway ID": gatewayId, - "Gateway Name": gatewayName, - "Resource Type": r.ResourceType(), - "Role Assignment ID": roleAssignmentId, - "Role Name": string(*roleName), + "Gateway ID": gatewayId, + "Gateway Name": gatewayName, + "Gateway Role Assignment ID": gatewayRoleAssignmentId, + "Gateway Role Assignment Role Name": string(*gatewayRoleName), + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s_%s", gatewayName, string(*roleName), roleAssignmentId), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, gatewayId, roleAssignmentId), + ResourceName: fmt.Sprintf("%s_%s_%s", gatewayName, string(*gatewayRoleName), gatewayRoleAssignmentId), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, gatewayId, gatewayRoleAssignmentId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -85,19 +89,19 @@ func (r *PingOneGatewayRoleAssignmentResource) getGatewayData() (map[string]stri gatewayData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.GatewaysApi.ReadAllGateways(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - gatewayInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedGatewaysInner](iter, "ReadAllGateways", "GetGateways", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedGatewaysInner](iter, "ReadAllGateways", "GetGateways", r.ResourceType()) if err != nil { return nil, err } - for _, gatewayInner := range gatewayInners { + for _, innerObj := range apiObjs { // Only PingFederate Connections have role assignments - if gatewayInner.Gateway != nil { - gatewayType, gatewayTypeOk := gatewayInner.Gateway.GetTypeOk() + if innerObj.Gateway != nil { + gatewayType, gatewayTypeOk := innerObj.Gateway.GetTypeOk() if gatewayTypeOk && *gatewayType == management.ENUMGATEWAYTYPE_PING_FEDERATE { - gatewayId, gatewayIdOk := gatewayInner.Gateway.GetIdOk() - gatewayName, gatewayNameOk := gatewayInner.Gateway.GetNameOk() + gatewayId, gatewayIdOk := innerObj.Gateway.GetIdOk() + gatewayName, gatewayNameOk := innerObj.Gateway.GetNameOk() if gatewayIdOk && gatewayNameOk { gatewayData[*gatewayId] = *gatewayName @@ -113,19 +117,20 @@ func (r *PingOneGatewayRoleAssignmentResource) getGatewayRoleAssignmentData(gate gatewayRoleAssignmentData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.GatewayRoleAssignmentsApi.ReadGatewayRoleAssignments(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, gatewayId).Execute() - gatewayRoleAssignments, err := pingone.GetManagementAPIObjectsFromIterator[management.RoleAssignment](iter, "ReadGatewayRoleAssignments", "GetRoleAssignments", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.RoleAssignment](iter, "ReadGatewayRoleAssignments", "GetRoleAssignments", r.ResourceType()) if err != nil { return nil, err } - for _, roleAssignment := range gatewayRoleAssignments { - roleAssignmentId, roleAssignmentIdOk := roleAssignment.GetIdOk() - roleAssignmentRole, roleAssignmentRoleOk := roleAssignment.GetRoleOk() + for _, gatewayRoleAssignment := range apiObjs { + gatewayRoleAssignmentId, gatewayRoleAssignmentIdOk := gatewayRoleAssignment.GetIdOk() + gatewayRoleAssignmentRole, gatewayRoleAssignmentRoleOk := gatewayRoleAssignment.GetRoleOk() - if roleAssignmentIdOk && roleAssignmentRoleOk { - roleAssignmentRoleId, roleAssignmentRoleIdOk := roleAssignmentRole.GetIdOk() - if roleAssignmentRoleIdOk { - gatewayRoleAssignmentData[*roleAssignmentId] = *roleAssignmentRoleId + if gatewayRoleAssignmentIdOk && gatewayRoleAssignmentRoleOk { + gatewayRoleAssignmentRoleId, gatewayRoleAssignmentRoleIdOk := gatewayRoleAssignmentRole.GetIdOk() + + if gatewayRoleAssignmentRoleIdOk { + gatewayRoleAssignmentData[*gatewayRoleAssignmentId] = *gatewayRoleAssignmentRoleId } } } @@ -133,22 +138,22 @@ func (r *PingOneGatewayRoleAssignmentResource) getGatewayRoleAssignmentData(gate return gatewayRoleAssignmentData, nil } -func (r *PingOneGatewayRoleAssignmentResource) getRoleAssignmentRoleName(roleId string) (*management.EnumRoleName, error) { +func (r *PingOneGatewayRoleAssignmentResource) getRoleAssignmentRoleName(roleId string) (*management.EnumRoleName, bool, error) { role, resp, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.RolesApi.ReadOneRole(r.clientInfo.PingOneContext, roleId).Execute() ok, err := common.CheckSingletonResource(resp, err, "ReadOneRole", r.ResourceType()) if err != nil { - return nil, err + return nil, false, err } if !ok { - return nil, nil + return nil, false, nil } if role != nil { roleName, roleNameOk := role.GetNameOk() if roleNameOk { - return roleName, nil + return roleName, true, nil } } - return nil, fmt.Errorf("failed to export resource '%s'. No role name found for Role ID '%s'", r.ResourceType(), roleId) + return nil, false, fmt.Errorf("failed to export resource '%s'. No role name found for Role ID '%s'", r.ResourceType(), roleId) } diff --git a/internal/connector/pingone/platform/resources/gateway_role_assignment_test.go b/internal/connector/pingone/platform/resources/gateway_role_assignment_test.go new file mode 100644 index 00000000..55ba60ed --- /dev/null +++ b/internal/connector/pingone/platform/resources/gateway_role_assignment_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_GatewayRoleAssignment(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.GatewayRoleAssignment(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + gatewayTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s_%s", gatewayTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, gatewayTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/gateway_test.go b/internal/connector/pingone/platform/resources/gateway_test.go new file mode 100644 index 00000000..ebd9eee5 --- /dev/null +++ b/internal/connector/pingone/platform/resources/gateway_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_Gateway(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.Gateway(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_identity_propagation_plan.go b/internal/connector/pingone/platform/resources/identity_propagation_plan.go similarity index 79% rename from internal/connector/pingone/platform/resources/pingone_identity_propagation_plan.go rename to internal/connector/pingone/platform/resources/identity_propagation_plan.go index e3092d03..523a2ee3 100644 --- a/internal/connector/pingone/platform/resources/pingone_identity_propagation_plan.go +++ b/internal/connector/pingone/platform/resources/identity_propagation_plan.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -38,23 +39,23 @@ func (r *PingOneIdentityPropagationPlanResource) ExportAll() (*[]connector.Impor importBlocks := []connector.ImportBlock{} - planData, err := r.getIdentityPropagationPlanData() + identityPropagationPlanData, err := r.getIdentityPropagationPlanData() if err != nil { return nil, err } - for planId, planName := range planData { + for identityPropagationPlanId, identityPropagationPlanName := range identityPropagationPlanData { commentData := map[string]string{ + "Identity Propagation Plan ID": identityPropagationPlanId, + "Identity Propagation Plan Name": identityPropagationPlanName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Identity Propagation Plan ID": planId, - "Identity Propagation Plan Name": planName, "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: planName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, planId), + ResourceName: identityPropagationPlanName, + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, identityPropagationPlanId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -68,12 +69,12 @@ func (r *PingOneIdentityPropagationPlanResource) getIdentityPropagationPlanData( identityPropagationPlanData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.IdentityPropagationPlansApi.ReadAllPlans(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - identityPropagationPlans, err := pingone.GetManagementAPIObjectsFromIterator[management.IdentityPropagationPlan](iter, "ReadAllPlans", "GetPlans", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.IdentityPropagationPlan](iter, "ReadAllPlans", "GetPlans", r.ResourceType()) if err != nil { return nil, err } - for _, identityPropagationPlan := range identityPropagationPlans { + for _, identityPropagationPlan := range apiObjs { identityPropagationPlanId, identityPropagationPlanIdOk := identityPropagationPlan.GetIdOk() identityPropagationPlanName, identityPropagationPlanNameOk := identityPropagationPlan.GetNameOk() diff --git a/internal/connector/pingone/platform/resources/identity_propagation_plan_test.go b/internal/connector/pingone/platform/resources/identity_propagation_plan_test.go new file mode 100644 index 00000000..22b11136 --- /dev/null +++ b/internal/connector/pingone/platform/resources/identity_propagation_plan_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_IdentityPropagationPlan(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.IdentityPropagationPlan(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_key.go b/internal/connector/pingone/platform/resources/key.go similarity index 94% rename from internal/connector/pingone/platform/resources/pingone_key.go rename to internal/connector/pingone/platform/resources/key.go index 7548e41d..b86c156e 100644 --- a/internal/connector/pingone/platform/resources/pingone_key.go +++ b/internal/connector/pingone/platform/resources/key.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -41,15 +42,15 @@ func (r *PingOneKeyResource) ExportAll() (*[]connector.ImportBlock, error) { return nil, err } - for keyId, keyNameAndType := range keyData { - keyName := keyNameAndType[0] - keyType := keyNameAndType[1] + for keyId, keyInfo := range keyData { + keyName := keyInfo[0] + keyType := keyInfo[1] commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Key ID": keyId, "Key Name": keyName, "Key Type": keyType, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } @@ -77,7 +78,7 @@ func (r *PingOneKeyResource) getKeyData() (map[string][]string, error) { return nil, err } if !ok { - return nil, nil + return keyData, nil } if entityArray == nil { diff --git a/internal/connector/pingone/platform/resources/pingone_key_rotation_policy.go b/internal/connector/pingone/platform/resources/key_rotation_policy.go similarity index 91% rename from internal/connector/pingone/platform/resources/pingone_key_rotation_policy.go rename to internal/connector/pingone/platform/resources/key_rotation_policy.go index a9137692..309befcb 100644 --- a/internal/connector/pingone/platform/resources/pingone_key_rotation_policy.go +++ b/internal/connector/pingone/platform/resources/key_rotation_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -45,9 +46,9 @@ func (r *PingOneKeyRotationPolicyResource) ExportAll() (*[]connector.ImportBlock for keyRotationPolicyId, keyRotationPolicyName := range keyRotationPolicyData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Key Rotation Policy ID": keyRotationPolicyId, "Key Rotation Policy Name": keyRotationPolicyName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } @@ -68,12 +69,12 @@ func (r *PingOneKeyRotationPolicyResource) getKeyRotationPolicyData() (map[strin keyRotationPolicyData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.KeyRotationPoliciesApi.GetKeyRotationPolicies(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - keyRotationPolicies, err := pingone.GetManagementAPIObjectsFromIterator[management.KeyRotationPolicy](iter, "GetKeyRotationPolicies", "GetKeyRotationPolicies", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.KeyRotationPolicy](iter, "GetKeyRotationPolicies", "GetKeyRotationPolicies", r.ResourceType()) if err != nil { return nil, err } - for _, keyRotationPolicy := range keyRotationPolicies { + for _, keyRotationPolicy := range apiObjs { keyRotationPolicyId, keyRotationPolicyIdOk := keyRotationPolicy.GetIdOk() keyRotationPolicyName, keyRotationPolicyNameOk := keyRotationPolicy.GetNameOk() diff --git a/internal/connector/pingone/platform/resources/key_rotation_policy_test.go b/internal/connector/pingone/platform/resources/key_rotation_policy_test.go new file mode 100644 index 00000000..94a90864 --- /dev/null +++ b/internal/connector/pingone/platform/resources/key_rotation_policy_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_KeyRotationPolicy(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.KeyRotationPolicy(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // There are pre-configured key rotation policies in the environment, so only validate the import blocks as a subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/key_test.go b/internal/connector/pingone/platform/resources/key_test.go new file mode 100644 index 00000000..b53e76d9 --- /dev/null +++ b/internal/connector/pingone/platform/resources/key_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_Key(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.Key(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TYPE]), + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // There are pre-configured keys in the environment, so only validate the import blocks as a subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_language.go b/internal/connector/pingone/platform/resources/language.go similarity index 78% rename from internal/connector/pingone/platform/resources/pingone_language.go rename to internal/connector/pingone/platform/resources/language.go index 8949e829..dd7c68fc 100644 --- a/internal/connector/pingone/platform/resources/pingone_language.go +++ b/internal/connector/pingone/platform/resources/language.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -45,9 +46,9 @@ func (r *PingOneLanguageResource) ExportAll() (*[]connector.ImportBlock, error) for languageId, languageName := range languageData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Language ID": languageId, "Language Name": languageName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } @@ -68,21 +69,15 @@ func (r *PingOneLanguageResource) getLanguageData() (map[string]string, error) { languageData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.LanguagesApi.ReadLanguages(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - languageInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedLanguagesInner](iter, "ReadLanguages", "GetLanguages", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedLanguagesInner](iter, "ReadLanguages", "GetLanguages", r.ResourceType()) if err != nil { return nil, err } - for _, languageInner := range languageInners { - if languageInner.Language != nil { - // If language is not customer added, skip it - languageCustomerAdded, languageCustomerAddedOk := languageInner.Language.GetCustomerAddedOk() - if !languageCustomerAddedOk || !*languageCustomerAdded { - continue - } - - languageId, languageIdOk := languageInner.Language.GetIdOk() - languageName, languageNameOk := languageInner.Language.GetNameOk() + for _, innerObj := range apiObjs { + if innerObj.Language != nil { + languageId, languageIdOk := innerObj.Language.GetIdOk() + languageName, languageNameOk := innerObj.Language.GetNameOk() if languageIdOk && languageNameOk { languageData[*languageId] = *languageName diff --git a/internal/connector/pingone/platform/resources/language_test.go b/internal/connector/pingone/platform/resources/language_test.go new file mode 100644 index 00000000..a6d5d677 --- /dev/null +++ b/internal/connector/pingone/platform/resources/language_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_Language(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.Language(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // There are pre-configured languages in the environment, so only validate the import blocks as a subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_language_update.go b/internal/connector/pingone/platform/resources/language_update.go similarity index 81% rename from internal/connector/pingone/platform/resources/pingone_language_update.go rename to internal/connector/pingone/platform/resources/language_update.go index fedf73c9..3395c008 100644 --- a/internal/connector/pingone/platform/resources/pingone_language_update.go +++ b/internal/connector/pingone/platform/resources/language_update.go @@ -68,16 +68,16 @@ func (r *PingOneLanguageUpdateResource) getLanguageUpdateData() (map[string]stri languageUpdateData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.LanguagesApi.ReadLanguages(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - languageInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedLanguagesInner](iter, "ReadLanguages", "GetLanguages", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedLanguagesInner](iter, "ReadLanguages", "GetLanguages", r.ResourceType()) if err != nil { return nil, err } - for _, languageInner := range languageInners { - if languageInner.Language != nil { - languageEnabled, languageEnabledOk := languageInner.Language.GetEnabledOk() - languageLocale, languageLocaleOk := languageInner.Language.GetLocaleOk() - languageDefault, languageDefaultOk := languageInner.Language.GetDefaultOk() + for _, innerObj := range apiObjs { + if innerObj.Language != nil { + languageEnabled, languageEnabledOk := innerObj.Language.GetEnabledOk() + languageLocale, languageLocaleOk := innerObj.Language.GetLocaleOk() + languageDefault, languageDefaultOk := innerObj.Language.GetDefaultOk() if languageEnabledOk && languageLocaleOk && languageDefaultOk { // Export the language if it meets any of the criteria of the following 3 conditions: @@ -86,8 +86,8 @@ func (r *PingOneLanguageUpdateResource) getLanguageUpdateData() (map[string]stri // 3) If any language other than 'en' is the default if *languageEnabled || (*languageLocale == "en" && !*languageEnabled) || (*languageLocale != "en" && *languageDefault) { - languageId, languageIdOk := languageInner.Language.GetIdOk() - languageName, languageNameOk := languageInner.Language.GetNameOk() + languageId, languageIdOk := innerObj.Language.GetIdOk() + languageName, languageNameOk := innerObj.Language.GetNameOk() if languageIdOk && languageNameOk { languageUpdateData[*languageId] = *languageName diff --git a/internal/connector/pingone/platform/resources/language_update_test.go b/internal/connector/pingone/platform/resources/language_update_test.go new file mode 100644 index 00000000..dd125ad6 --- /dev/null +++ b/internal/connector/pingone/platform/resources/language_update_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func TestLanguageUpdateExport(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.LanguageUpdate(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + languageTr := tr.Dependencies[0] + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_update", languageTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, languageTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // There are pre-configured languages in the environment, so only validate the import blocks as a subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_notification_policy.go b/internal/connector/pingone/platform/resources/notification_policy.go similarity index 91% rename from internal/connector/pingone/platform/resources/pingone_notification_policy.go rename to internal/connector/pingone/platform/resources/notification_policy.go index 03d509d8..52127a63 100644 --- a/internal/connector/pingone/platform/resources/pingone_notification_policy.go +++ b/internal/connector/pingone/platform/resources/notification_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -45,9 +46,9 @@ func (r *PingOneNotificationPolicyResource) ExportAll() (*[]connector.ImportBloc for notificationPolicyId, notificationPolicyName := range notificationPolicyData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Notification Policy ID": notificationPolicyId, "Notification Policy Name": notificationPolicyName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } @@ -68,12 +69,12 @@ func (r *PingOneNotificationPolicyResource) getNotificationPolicyData() (map[str notificationPolicyData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.NotificationsPoliciesApi.ReadAllNotificationsPolicies(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - notificationPolicies, err := pingone.GetManagementAPIObjectsFromIterator[management.NotificationsPolicy](iter, "ReadAllNotificationsPolicies", "GetNotificationsPolicies", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.NotificationsPolicy](iter, "ReadAllNotificationsPolicies", "GetNotificationsPolicies", r.ResourceType()) if err != nil { return nil, err } - for _, notificationPolicy := range notificationPolicies { + for _, notificationPolicy := range apiObjs { notificationPolicyId, notificationPolicyIdOk := notificationPolicy.GetIdOk() notificationPolicyName, notificationPolicyNameOk := notificationPolicy.GetNameOk() diff --git a/internal/connector/pingone/platform/resources/notification_policy_test.go b/internal/connector/pingone/platform/resources/notification_policy_test.go new file mode 100644 index 00000000..ba390ecc --- /dev/null +++ b/internal/connector/pingone/platform/resources/notification_policy_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_NotificationPolicy(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.NotificationPolicy(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // There are pre-configured notification policies in the environment, so only validate the import blocks as a subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_notification_settings.go b/internal/connector/pingone/platform/resources/notification_settings.go similarity index 98% rename from internal/connector/pingone/platform/resources/pingone_notification_settings.go rename to internal/connector/pingone/platform/resources/notification_settings.go index 1169438a..f82b73a0 100644 --- a/internal/connector/pingone/platform/resources/pingone_notification_settings.go +++ b/internal/connector/pingone/platform/resources/notification_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -43,8 +44,8 @@ func (r *PingOneNotificationSettingsResource) ExportAll() (*[]connector.ImportBl } commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, } importBlock := connector.ImportBlock{ @@ -61,5 +62,6 @@ func (r *PingOneNotificationSettingsResource) ExportAll() (*[]connector.ImportBl func (r *PingOneNotificationSettingsResource) checkNotificationSettingsData() (bool, error) { _, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.NotificationsSettingsApi.ReadNotificationsSettings(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + return common.CheckSingletonResource(response, err, "ReadNotificationsSettings", r.ResourceType()) } diff --git a/internal/connector/pingone/platform/resources/pingone_notification_settings_email.go b/internal/connector/pingone/platform/resources/notification_settings_email.go similarity index 98% rename from internal/connector/pingone/platform/resources/pingone_notification_settings_email.go rename to internal/connector/pingone/platform/resources/notification_settings_email.go index 48e0bb4a..006b5fff 100644 --- a/internal/connector/pingone/platform/resources/pingone_notification_settings_email.go +++ b/internal/connector/pingone/platform/resources/notification_settings_email.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -43,8 +44,8 @@ func (r *PingOneNotificationSettingsEmailResource) ExportAll() (*[]connector.Imp } commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, } importBlock := connector.ImportBlock{ @@ -61,5 +62,6 @@ func (r *PingOneNotificationSettingsEmailResource) ExportAll() (*[]connector.Imp func (r *PingOneNotificationSettingsEmailResource) checkNotificationSettingsEmailData() (bool, error) { _, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.NotificationsSettingsSMTPApi.ReadEmailNotificationsSettings(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + return common.CheckSingletonResource(response, err, "ReadEmailNotificationsSettings", r.ResourceType()) } diff --git a/internal/connector/pingone/platform/resources/notification_settings_email_test.go b/internal/connector/pingone/platform/resources/notification_settings_email_test.go new file mode 100644 index 00000000..4354228c --- /dev/null +++ b/internal/connector/pingone/platform/resources/notification_settings_email_test.go @@ -0,0 +1,28 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_NotificationSettingsEmail(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.NotificationSettingsEmail(t, clientInfo) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ExportableResource.ResourceType(), + ResourceID: clientInfo.PingOneExportEnvironmentID, + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/notification_settings_test.go b/internal/connector/pingone/platform/resources/notification_settings_test.go new file mode 100644 index 00000000..d7d4a3d5 --- /dev/null +++ b/internal/connector/pingone/platform/resources/notification_settings_test.go @@ -0,0 +1,28 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_NotificationSettings(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.NotificationSettings(t, clientInfo) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ExportableResource.ResourceType(), + ResourceID: clientInfo.PingOneExportEnvironmentID, + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_notification_template_content.go b/internal/connector/pingone/platform/resources/notification_template_content.go similarity index 51% rename from internal/connector/pingone/platform/resources/pingone_notification_template_content.go rename to internal/connector/pingone/platform/resources/notification_template_content.go index 75812923..2e953f86 100644 --- a/internal/connector/pingone/platform/resources/pingone_notification_template_content.go +++ b/internal/connector/pingone/platform/resources/notification_template_content.go @@ -1,10 +1,13 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources import ( + "errors" "fmt" "io" + "net/http" "strings" "github.com/patrickcping/pingone-go-sdk-v2/management" @@ -59,7 +62,7 @@ func (r *PingOneNotificationTemplateContentResource) ExportAll() (*[]connector.I } for _, templateName := range templateNames { - templateContentData, err := r.getTemplateContentData(templateName) + templateContentData, err := r.getNotificationTemplateContentData(templateName) if err != nil { return nil, err } @@ -88,7 +91,7 @@ func (r *PingOneNotificationTemplateContentResource) ExportAll() (*[]connector.I importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s_%s%s", string(templateName), templateContentDeliveryMethod, templateContentLocale, templateContentVariant), + ResourceName: fmt.Sprintf("%s_%s_%s%s_%s", string(templateName), templateContentDeliveryMethod, templateContentLocale, templateContentVariant, templateContentId), ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, string(templateName), templateContentId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -105,15 +108,15 @@ func (r *PingOneNotificationTemplateContentResource) getEnabledLocales() (map[st enabledLocales := make(map[string]bool) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.LanguagesApi.ReadLanguages(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - languageInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedLanguagesInner](iter, "ReadLanguages", "GetLanguages", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedLanguagesInner](iter, "ReadLanguages", "GetLanguages", r.ResourceType()) if err != nil { return nil, err } - for _, languageInner := range languageInners { - if languageInner.Language != nil { - languageLocale, languageLocaleOk := languageInner.Language.GetLocaleOk() - languageEnabled, languageEnabledOk := languageInner.Language.GetEnabledOk() + for _, innerObj := range apiObjs { + if innerObj.Language != nil { + languageLocale, languageLocaleOk := innerObj.Language.GetLocaleOk() + languageEnabled, languageEnabledOk := innerObj.Language.GetEnabledOk() if languageLocaleOk && languageEnabledOk && *languageEnabled { enabledLocales[*languageLocale] = true @@ -124,7 +127,7 @@ func (r *PingOneNotificationTemplateContentResource) getEnabledLocales() (map[st return enabledLocales, nil } -func (r *PingOneNotificationTemplateContentResource) getTemplateNames() ([]management.EnumTemplateName, error) { +func (r *PingOneNotificationTemplateContentResource) getTemplateNames() (arr []management.EnumTemplateName, err error) { templateNames := []management.EnumTemplateName{} for _, templateName := range management.AllowedEnumTemplateNameEnumValues { @@ -132,8 +135,14 @@ func (r *PingOneNotificationTemplateContentResource) getTemplateNames() ([]manag // When PingOne services are not enabled in an environment, // the response code for the templates related to that service is // 400 Bad Request - "CONSTRAINT_VIOLATION" - if err != nil && response.StatusCode == 400 && response.Status == "400 Bad Request" { - defer response.Body.Close() + if err != nil && response.StatusCode == http.StatusBadRequest && response.Status == "400 Bad Request" { + defer func() { + cErr := response.Body.Close() + if cErr != nil { + err = errors.Join(err, cErr) + } + }() + body, err := io.ReadAll(response.Body) if err != nil { return nil, err @@ -141,7 +150,7 @@ func (r *PingOneNotificationTemplateContentResource) getTemplateNames() ([]manag if strings.Contains(string(body), "CONSTRAINT_VIOLATION") { continue - } + } // else fall through to handle other errors } // Handle all other errors or bad responses @@ -150,7 +159,7 @@ func (r *PingOneNotificationTemplateContentResource) getTemplateNames() ([]manag return nil, err } if !ok { - return nil, nil + continue } templateNames = append(templateNames, templateName) @@ -159,61 +168,62 @@ func (r *PingOneNotificationTemplateContentResource) getTemplateNames() ([]manag return templateNames, nil } -func (r *PingOneNotificationTemplateContentResource) getTemplateContentData(templateName management.EnumTemplateName) ([]NotificationTemplateContentData, error) { - templateContentData := []NotificationTemplateContentData{} +func (r *PingOneNotificationTemplateContentResource) getNotificationTemplateContentData(templateName management.EnumTemplateName) ([]NotificationTemplateContentData, error) { + notificationTemplateContentData := []NotificationTemplateContentData{} iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.NotificationsTemplatesApi.ReadAllTemplateContents(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, templateName).Execute() - templateContents, err := pingone.GetManagementAPIObjectsFromIterator[management.TemplateContent](iter, "ReadAllTemplateContents", "GetContents", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.TemplateContent](iter, "ReadAllTemplateContents", "GetContents", r.ResourceType()) if err != nil { return nil, err } - for _, templateContent := range templateContents { + for _, notificationTemplateContent := range apiObjs { var ( - templateContentId *string - templateContentIdOk bool - templateContentDeliveryMethod *management.EnumTemplateContentDeliveryMethod - templateContentDeliveryMethodOk bool - templateContentLocale *string - templateContentLocaleOk bool - templateContentVariant string + notificationTemplateContentId *string + notificationTemplateContentIdOk bool + notificationTemplateContentDeliveryMethod *management.EnumTemplateContentDeliveryMethod + notificationTemplateContentDeliveryMethodOk bool + notificationTemplateContentLocale *string + notificationTemplateContentLocaleOk bool + notificationTemplateContentVariant string ) switch { - case templateContent.TemplateContentPush != nil: - templateContentId, templateContentIdOk = templateContent.TemplateContentPush.GetIdOk() - templateContentDeliveryMethod, templateContentDeliveryMethodOk = templateContent.TemplateContentPush.GetDeliveryMethodOk() - templateContentLocale, templateContentLocaleOk = templateContent.TemplateContentPush.GetLocaleOk() - templateContentVariant = templateContent.TemplateContentPush.GetVariant() - case templateContent.TemplateContentSMS != nil: - templateContentId, templateContentIdOk = templateContent.TemplateContentSMS.GetIdOk() - templateContentDeliveryMethod, templateContentDeliveryMethodOk = templateContent.TemplateContentSMS.GetDeliveryMethodOk() - templateContentLocale, templateContentLocaleOk = templateContent.TemplateContentSMS.GetLocaleOk() - templateContentVariant = templateContent.TemplateContentSMS.GetVariant() - case templateContent.TemplateContentEmail != nil: - templateContentId, templateContentIdOk = templateContent.TemplateContentEmail.GetIdOk() - templateContentDeliveryMethod, templateContentDeliveryMethodOk = templateContent.TemplateContentEmail.GetDeliveryMethodOk() - templateContentLocale, templateContentLocaleOk = templateContent.TemplateContentEmail.GetLocaleOk() - templateContentVariant = templateContent.TemplateContentEmail.GetVariant() - case templateContent.TemplateContentVoice != nil: - templateContentId, templateContentIdOk = templateContent.TemplateContentVoice.GetIdOk() - templateContentDeliveryMethod, templateContentDeliveryMethodOk = templateContent.TemplateContentVoice.GetDeliveryMethodOk() - templateContentLocale, templateContentLocaleOk = templateContent.TemplateContentVoice.GetLocaleOk() - templateContentVariant = templateContent.TemplateContentVoice.GetVariant() + case notificationTemplateContent.TemplateContentPush != nil: + notificationTemplateContentId, notificationTemplateContentIdOk = notificationTemplateContent.TemplateContentPush.GetIdOk() + notificationTemplateContentDeliveryMethod, notificationTemplateContentDeliveryMethodOk = notificationTemplateContent.TemplateContentPush.GetDeliveryMethodOk() + notificationTemplateContentLocale, notificationTemplateContentLocaleOk = notificationTemplateContent.TemplateContentPush.GetLocaleOk() + notificationTemplateContentVariant = notificationTemplateContent.TemplateContentPush.GetVariant() + case notificationTemplateContent.TemplateContentSMS != nil: + notificationTemplateContentId, notificationTemplateContentIdOk = notificationTemplateContent.TemplateContentSMS.GetIdOk() + notificationTemplateContentDeliveryMethod, notificationTemplateContentDeliveryMethodOk = notificationTemplateContent.TemplateContentSMS.GetDeliveryMethodOk() + notificationTemplateContentLocale, notificationTemplateContentLocaleOk = notificationTemplateContent.TemplateContentSMS.GetLocaleOk() + notificationTemplateContentVariant = notificationTemplateContent.TemplateContentSMS.GetVariant() + case notificationTemplateContent.TemplateContentEmail != nil: + notificationTemplateContentId, notificationTemplateContentIdOk = notificationTemplateContent.TemplateContentEmail.GetIdOk() + notificationTemplateContentDeliveryMethod, notificationTemplateContentDeliveryMethodOk = notificationTemplateContent.TemplateContentEmail.GetDeliveryMethodOk() + notificationTemplateContentLocale, notificationTemplateContentLocaleOk = notificationTemplateContent.TemplateContentEmail.GetLocaleOk() + notificationTemplateContentVariant = notificationTemplateContent.TemplateContentEmail.GetVariant() + case notificationTemplateContent.TemplateContentVoice != nil: + notificationTemplateContentId, notificationTemplateContentIdOk = notificationTemplateContent.TemplateContentVoice.GetIdOk() + notificationTemplateContentDeliveryMethod, notificationTemplateContentDeliveryMethodOk = notificationTemplateContent.TemplateContentVoice.GetDeliveryMethodOk() + notificationTemplateContentLocale, notificationTemplateContentLocaleOk = notificationTemplateContent.TemplateContentVoice.GetLocaleOk() + notificationTemplateContentVariant = notificationTemplateContent.TemplateContentVoice.GetVariant() default: - output.Warn(fmt.Sprintf("Template content '%v' for template '%s' is not one of: Push, SMS, Email, or Voice. Skipping export.", templateContent, templateName), nil) + output.Warn(fmt.Sprintf("Template content '%v' for template '%s' is not one of: Push, SMS, Email, or Voice. Skipping export.", notificationTemplateContent, templateName), nil) + continue } - if templateContentIdOk && templateContentDeliveryMethodOk && templateContentLocaleOk { - templateContentData = append(templateContentData, NotificationTemplateContentData{ - TemplateContentId: *templateContentId, - TemplateContentDeliveryMethod: string(*templateContentDeliveryMethod), - TemplateContentLocale: *templateContentLocale, - TemplateContentVariant: templateContentVariant, + if notificationTemplateContentIdOk && notificationTemplateContentDeliveryMethodOk && notificationTemplateContentLocaleOk { + notificationTemplateContentData = append(notificationTemplateContentData, NotificationTemplateContentData{ + TemplateContentId: *notificationTemplateContentId, + TemplateContentDeliveryMethod: string(*notificationTemplateContentDeliveryMethod), + TemplateContentLocale: *notificationTemplateContentLocale, + TemplateContentVariant: notificationTemplateContentVariant, }) } } - return templateContentData, nil + return notificationTemplateContentData, nil } diff --git a/internal/connector/pingone/platform/resources/notification_template_content_test.go b/internal/connector/pingone/platform/resources/notification_template_content_test.go new file mode 100644 index 00000000..cc859a2f --- /dev/null +++ b/internal/connector/pingone/platform/resources/notification_template_content_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_NotificationTemplateContent(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.NotificationTemplateContent(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s_%s_%s_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TEMPLATE_DELIVERY_METHOD], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_LOCALE], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TEMPLATE_VARIANT], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // There are pre-configured notification template contents in the environment, so only validate the import blocks as a subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_phone_delivery_settings.go b/internal/connector/pingone/platform/resources/phone_delivery_settings.go similarity index 67% rename from internal/connector/pingone/platform/resources/pingone_phone_delivery_settings.go rename to internal/connector/pingone/platform/resources/phone_delivery_settings.go index d2b3b9cd..9b645b63 100644 --- a/internal/connector/pingone/platform/resources/pingone_phone_delivery_settings.go +++ b/internal/connector/pingone/platform/resources/phone_delivery_settings.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -10,6 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/connector/pingone" "github.com/pingidentity/pingcli/internal/logger" + "github.com/pingidentity/pingcli/internal/utils" ) // Verify that the resource satisfies the exportable resource interface @@ -45,9 +47,9 @@ func (r *PingOnePhoneDeliverySettingsResource) ExportAll() (*[]connector.ImportB for phoneDeliverySettingsId, phoneDeliverySettingsName := range phoneDeliverySettingsData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Phone Delivery Settings ID": phoneDeliverySettingsId, "Phone Delivery Settings Name": phoneDeliverySettingsName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } @@ -68,34 +70,35 @@ func (r *PingOnePhoneDeliverySettingsResource) getPhoneDeliverySettingsData() (m phoneDeliverySettingsData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.PhoneDeliverySettingsApi.ReadAllPhoneDeliverySettings(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - phoneDeliverySettings, err := pingone.GetManagementAPIObjectsFromIterator[management.NotificationsSettingsPhoneDeliverySettings](iter, "ReadAllPhoneDeliverySettings", "GetPhoneDeliverySettings", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.NotificationsSettingsPhoneDeliverySettings](iter, "ReadAllPhoneDeliverySettings", "GetPhoneDeliverySettings", r.ResourceType()) if err != nil { return nil, err } - for _, phoneDeliverySettings := range phoneDeliverySettings { + for _, innerObj := range apiObjs { var ( phoneDeliverySettingsId *string phoneDeliverySettingsIdOk bool - phoneDeliverySettingsName string + phoneDeliverySettingsName *string phoneDeliverySettingsNameOk bool ) switch { - case phoneDeliverySettings.NotificationsSettingsPhoneDeliverySettingsCustom != nil: - phoneDeliverySettingsId, phoneDeliverySettingsIdOk = phoneDeliverySettings.NotificationsSettingsPhoneDeliverySettingsCustom.GetIdOk() - if phoneDeliverySettingsIdOk { - phoneDeliverySettingsName, phoneDeliverySettingsNameOk = fmt.Sprintf("provider_custom_%s", *phoneDeliverySettingsId), true + case innerObj.NotificationsSettingsPhoneDeliverySettingsCustom != nil: + phoneDeliverySettingsId, phoneDeliverySettingsIdOk = innerObj.NotificationsSettingsPhoneDeliverySettingsCustom.GetIdOk() + phoneDeliverySettingsName, phoneDeliverySettingsNameOk = innerObj.NotificationsSettingsPhoneDeliverySettingsCustom.GetNameOk() + if phoneDeliverySettingsNameOk { + *phoneDeliverySettingsName = fmt.Sprintf("provider_custom_%s", *phoneDeliverySettingsName) } - case phoneDeliverySettings.NotificationsSettingsPhoneDeliverySettingsTwilioSyniverse != nil: - phoneDeliverySettingsId, phoneDeliverySettingsIdOk = phoneDeliverySettings.NotificationsSettingsPhoneDeliverySettingsTwilioSyniverse.GetIdOk() - phoneDeliverySettingsProvider, phoneDeliverySettingProviderOk := phoneDeliverySettings.NotificationsSettingsPhoneDeliverySettingsTwilioSyniverse.GetProviderOk() + case innerObj.NotificationsSettingsPhoneDeliverySettingsTwilioSyniverse != nil: + phoneDeliverySettingsId, phoneDeliverySettingsIdOk = innerObj.NotificationsSettingsPhoneDeliverySettingsTwilioSyniverse.GetIdOk() + phoneDeliverySettingsProvider, phoneDeliverySettingProviderOk := innerObj.NotificationsSettingsPhoneDeliverySettingsTwilioSyniverse.GetProviderOk() if phoneDeliverySettingsIdOk && phoneDeliverySettingProviderOk { switch *phoneDeliverySettingsProvider { case management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSPROVIDER_TWILIO: - phoneDeliverySettingsName, phoneDeliverySettingsNameOk = fmt.Sprintf("provider_twilio_%s", *phoneDeliverySettingsId), true + phoneDeliverySettingsName, phoneDeliverySettingsNameOk = utils.Pointer(fmt.Sprintf("provider_twilio_%s", *phoneDeliverySettingsId)), true case management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSPROVIDER_SYNIVERSE: - phoneDeliverySettingsName, phoneDeliverySettingsNameOk = fmt.Sprintf("provider_syniverse_%s", *phoneDeliverySettingsId), true + phoneDeliverySettingsName, phoneDeliverySettingsNameOk = utils.Pointer(fmt.Sprintf("provider_syniverse_%s", *phoneDeliverySettingsId)), true default: continue } @@ -105,7 +108,7 @@ func (r *PingOnePhoneDeliverySettingsResource) getPhoneDeliverySettingsData() (m } if phoneDeliverySettingsIdOk && phoneDeliverySettingsNameOk { - phoneDeliverySettingsData[*phoneDeliverySettingsId] = phoneDeliverySettingsName + phoneDeliverySettingsData[*phoneDeliverySettingsId] = *phoneDeliverySettingsName } } diff --git a/internal/connector/pingone/platform/resources/phone_delivery_settings_test.go b/internal/connector/pingone/platform/resources/phone_delivery_settings_test.go new file mode 100644 index 00000000..064a4869 --- /dev/null +++ b/internal/connector/pingone/platform/resources/phone_delivery_settings_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_PhoneDeliverySettings(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.PhoneDeliverySettings(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("provider_custom_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_agreement_enable_test.go b/internal/connector/pingone/platform/resources/pingone_agreement_enable_test.go deleted file mode 100644 index 74b00540..00000000 --- a/internal/connector/pingone/platform/resources/pingone_agreement_enable_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAgreementEnableExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AgreementEnable(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_agreement_enable", - ResourceName: "Test_enable", - ResourceID: fmt.Sprintf("%s/37ab76b8-8eff-43ae-b499-a7dce9fe0e75", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_agreement_enable", - ResourceName: "Test2_enable", - ResourceID: fmt.Sprintf("%s/38c0c463-b13d-4d22-8da5-f9fd8093d594", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_agreement_localization_enable_test.go b/internal/connector/pingone/platform/resources/pingone_agreement_localization_enable_test.go deleted file mode 100644 index d49843be..00000000 --- a/internal/connector/pingone/platform/resources/pingone_agreement_localization_enable_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAgreementLocalizationEnableExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AgreementLocalizationEnable(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_agreement_localization_enable", - ResourceName: "Test_fr_enable", - ResourceID: fmt.Sprintf("%s/37ab76b8-8eff-43ae-b499-a7dce9fe0e75/03cd7e69-2836-4bad-b69f-249684c42fd9", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_agreement_localization_enable", - ResourceName: "Test_en_enable", - ResourceID: fmt.Sprintf("%s/37ab76b8-8eff-43ae-b499-a7dce9fe0e75/b5ceb6b5-025c-4896-951d-dd676c96d3c6", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_agreement_localization_revision_test.go b/internal/connector/pingone/platform/resources/pingone_agreement_localization_revision_test.go deleted file mode 100644 index e2c0ea42..00000000 --- a/internal/connector/pingone/platform/resources/pingone_agreement_localization_revision_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAgreementLocalizationRevisionExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AgreementLocalizationRevision(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_agreement_localization_revision", - ResourceName: "Test_fr_08c49433-b84b-4aeb-860b-02d58336e309", - ResourceID: fmt.Sprintf("%s/37ab76b8-8eff-43ae-b499-a7dce9fe0e75/03cd7e69-2836-4bad-b69f-249684c42fd9/08c49433-b84b-4aeb-860b-02d58336e309", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_agreement_localization_revision", - ResourceName: "Test_en_2c2a98d7-8c11-4887-b35b-7f5358f75ec1", - ResourceID: fmt.Sprintf("%s/37ab76b8-8eff-43ae-b499-a7dce9fe0e75/b5ceb6b5-025c-4896-951d-dd676c96d3c6/2c2a98d7-8c11-4887-b35b-7f5358f75ec1", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_agreement_localization_revision", - ResourceName: "Test_en_82cff258-1af7-4f2d-94f0-a0ebbbc84a5e", - ResourceID: fmt.Sprintf("%s/37ab76b8-8eff-43ae-b499-a7dce9fe0e75/b5ceb6b5-025c-4896-951d-dd676c96d3c6/82cff258-1af7-4f2d-94f0-a0ebbbc84a5e", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_agreement_localization_test.go b/internal/connector/pingone/platform/resources/pingone_agreement_localization_test.go deleted file mode 100644 index 7d39ff97..00000000 --- a/internal/connector/pingone/platform/resources/pingone_agreement_localization_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAgreementLocalizationExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AgreementLocalization(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_agreement_localization", - ResourceName: "Test_fr", - ResourceID: fmt.Sprintf("%s/37ab76b8-8eff-43ae-b499-a7dce9fe0e75/03cd7e69-2836-4bad-b69f-249684c42fd9", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_agreement_localization", - ResourceName: "Test_en", - ResourceID: fmt.Sprintf("%s/37ab76b8-8eff-43ae-b499-a7dce9fe0e75/b5ceb6b5-025c-4896-951d-dd676c96d3c6", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_agreement_test.go b/internal/connector/pingone/platform/resources/pingone_agreement_test.go deleted file mode 100644 index dec276b8..00000000 --- a/internal/connector/pingone/platform/resources/pingone_agreement_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAgreementExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Agreement(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_agreement", - ResourceName: "Test", - ResourceID: fmt.Sprintf("%s/37ab76b8-8eff-43ae-b499-a7dce9fe0e75", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_agreement", - ResourceName: "Test2", - ResourceID: fmt.Sprintf("%s/38c0c463-b13d-4d22-8da5-f9fd8093d594", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_alert_channel_test.go b/internal/connector/pingone/platform/resources/pingone_alert_channel_test.go deleted file mode 100644 index 0b6d3570..00000000 --- a/internal/connector/pingone/platform/resources/pingone_alert_channel_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestAlertChannelExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.AlertChannel(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_alert_channel", - ResourceName: "Test Alert Channel", - ResourceID: fmt.Sprintf("%s/6035f516-b474-4941-945a-76514913a74d", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_branding_settings_test.go b/internal/connector/pingone/platform/resources/pingone_branding_settings_test.go deleted file mode 100644 index 4cd2ae58..00000000 --- a/internal/connector/pingone/platform/resources/pingone_branding_settings_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestBrandingSettingsExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.BrandingSettings(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_branding_settings", - ResourceName: "pingone_branding_settings", - ResourceID: clientInfo.PingOneExportEnvironmentID, - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_branding_theme_default_test.go b/internal/connector/pingone/platform/resources/pingone_branding_theme_default_test.go deleted file mode 100644 index 91e8e5e5..00000000 --- a/internal/connector/pingone/platform/resources/pingone_branding_theme_default_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestBrandingThemeDefaultExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.BrandingThemeDefault(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_branding_theme_default", - ResourceName: "test_slate_2_default_theme", - ResourceID: clientInfo.PingOneExportEnvironmentID, - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_branding_theme_test.go b/internal/connector/pingone/platform/resources/pingone_branding_theme_test.go deleted file mode 100644 index 6c6ea79b..00000000 --- a/internal/connector/pingone/platform/resources/pingone_branding_theme_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestBrandingThemeExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.BrandingTheme(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_branding_theme", - ResourceName: "test_slate_2", - ResourceID: fmt.Sprintf("%s/a3e0fc98-a7bf-4750-9778-2397fc0a3586", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_branding_theme", - ResourceName: "Ping Default", - ResourceID: fmt.Sprintf("%s/b02d49a3-c468-462a-9fd0-659e0f3dde96", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_branding_theme", - ResourceName: "Slate", - ResourceID: fmt.Sprintf("%s/fbf0886a-fb1f-41c2-ad42-e7dc601dabb3", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_certificate_test.go b/internal/connector/pingone/platform/resources/pingone_certificate_test.go deleted file mode 100644 index b0d56f3c..00000000 --- a/internal/connector/pingone/platform/resources/pingone_certificate_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestCertificateExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Certificate(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_certificate", - ResourceName: "common name", - ResourceID: fmt.Sprintf("%s/b9eb2b6e-381e-4b1c-86d3-096d951787f4", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_certificate", - ResourceName: "terraform", - ResourceID: fmt.Sprintf("%s/fa8f15d6-1c62-4db1-920e-d22f6dd68ba8", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_custom_domain_test.go b/internal/connector/pingone/platform/resources/pingone_custom_domain_test.go deleted file mode 100644 index 3cef8e43..00000000 --- a/internal/connector/pingone/platform/resources/pingone_custom_domain_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestCustomDomainExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.CustomDomain(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_custom_domain", - ResourceName: "mycustomdomain.com", - ResourceID: fmt.Sprintf("%s/2f478666-ce6d-48b8-aef8-043ad3093109", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_environment_test.go b/internal/connector/pingone/platform/resources/pingone_environment_test.go deleted file mode 100644 index a7d80862..00000000 --- a/internal/connector/pingone/platform/resources/pingone_environment_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestEnvironmentExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Environment(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_environment", - ResourceName: "pingone_environment", - ResourceID: clientInfo.PingOneExportEnvironmentID, - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_form_test.go b/internal/connector/pingone/platform/resources/pingone_form_test.go deleted file mode 100644 index 72ccaac7..00000000 --- a/internal/connector/pingone/platform/resources/pingone_form_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestFormExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Form(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_form", - ResourceName: "Test Form", - ResourceID: fmt.Sprintf("%s/837c2f09-f8dc-41e9-b2f2-5f7bf1efded1", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_forms_recaptcha_v2_test.go b/internal/connector/pingone/platform/resources/pingone_forms_recaptcha_v2_test.go deleted file mode 100644 index 365710f2..00000000 --- a/internal/connector/pingone/platform/resources/pingone_forms_recaptcha_v2_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestFormRecaptchaV2Export(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.FormRecaptchaV2(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_forms_recaptcha_v2", - ResourceName: "pingone_forms_recaptcha_v2", - ResourceID: clientInfo.PingOneExportEnvironmentID, - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_gateway_credential_test.go b/internal/connector/pingone/platform/resources/pingone_gateway_credential_test.go deleted file mode 100644 index 8a6bd325..00000000 --- a/internal/connector/pingone/platform/resources/pingone_gateway_credential_test.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestGatewayCredentialExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.GatewayCredential(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_gateway_credential", - ResourceName: "random_credential_932c1ca6-da29-4a0e-b19c-d012f5b6014f", - ResourceID: fmt.Sprintf("%s/0b1d882c-5c71-4600-a9fb-befdad921df2/932c1ca6-da29-4a0e-b19c-d012f5b6014f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_credential", - ResourceName: "PingFederate LDAP Gateway_credential_fa809636-4796-4a25-8693-2b786eed4f71", - ResourceID: fmt.Sprintf("%s/3b7b5d9d-1820-4b21-bb29-a5336af65352/fa809636-4796-4a25-8693-2b786eed4f71", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_credential", - ResourceName: "PF TF Provider_credential_971b5d20-0955-4030-b49b-7e349b3b9b1e", - ResourceID: fmt.Sprintf("%s/554257ac-76ca-447a-a210-722343328312/971b5d20-0955-4030-b49b-7e349b3b9b1e", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_credential", - ResourceName: "Local Test_credential_bd2307d8-2a5e-4c11-a397-cfb991179f3f", - ResourceID: fmt.Sprintf("%s/5cd3f6b7-35f0-4873-ac64-f32118bf3102/bd2307d8-2a5e-4c11-a397-cfb991179f3f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_credential", - ResourceName: "TestGateway_credential_2e2ab72c-6dcf-4ec2-96be-1a5ba2e66f4a", - ResourceID: fmt.Sprintf("%s/bc37814f-b3a9-4149-b880-0ed457bbb5c5/2e2ab72c-6dcf-4ec2-96be-1a5ba2e66f4a", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_credential", - ResourceName: "TestGateway_credential_5aa73594-66a3-4175-ad69-67fa38b5e307", - ResourceID: fmt.Sprintf("%s/bc37814f-b3a9-4149-b880-0ed457bbb5c5/5aa73594-66a3-4175-ad69-67fa38b5e307", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_credential", - ResourceName: "TestGateway_credential_ed648842-d109-4a40-97ba-ef4f8ce8eabe", - ResourceID: fmt.Sprintf("%s/bc37814f-b3a9-4149-b880-0ed457bbb5c5/ed648842-d109-4a40-97ba-ef4f8ce8eabe", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_credential", - ResourceName: "another connection for testing_credential_98f9946c-3a78-4b4b-8645-a425f89c7ab5", - ResourceID: fmt.Sprintf("%s/8773b833-ade0-4883-9cad-05fe82b23135/98f9946c-3a78-4b4b-8645-a425f89c7ab5", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_gateway_role_assignment_test.go b/internal/connector/pingone/platform/resources/pingone_gateway_role_assignment_test.go deleted file mode 100644 index 3e9ed468..00000000 --- a/internal/connector/pingone/platform/resources/pingone_gateway_role_assignment_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestGatewayRoleAssignmentExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.GatewayRoleAssignment(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_gateway_role_assignment", - ResourceName: "PF TF Provider_Identity Data Admin_1c5549f9-95f5-4380-b975-d0165aadd9d2", - ResourceID: fmt.Sprintf("%s/554257ac-76ca-447a-a210-722343328312/1c5549f9-95f5-4380-b975-d0165aadd9d2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_role_assignment", - ResourceName: "PF TF Provider_Environment Admin_1cf8fca5-f14f-4a64-a521-60efc7891e7e", - ResourceID: fmt.Sprintf("%s/554257ac-76ca-447a-a210-722343328312/1cf8fca5-f14f-4a64-a521-60efc7891e7e", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_role_assignment", - ResourceName: "Local Test_Identity Data Admin_e424fff4-a8ca-4a75-a169-3376dd2aad96", - ResourceID: fmt.Sprintf("%s/5cd3f6b7-35f0-4873-ac64-f32118bf3102/e424fff4-a8ca-4a75-a169-3376dd2aad96", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_role_assignment", - ResourceName: "Local Test_Environment Admin_393d4c4e-6642-432d-bc11-1638948d6dd2", - ResourceID: fmt.Sprintf("%s/5cd3f6b7-35f0-4873-ac64-f32118bf3102/393d4c4e-6642-432d-bc11-1638948d6dd2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_role_assignment", - ResourceName: "another connection for testing_Identity Data Admin_239579d0-fc0b-4b50-ba03-dfe80e2bb6d0", - ResourceID: fmt.Sprintf("%s/8773b833-ade0-4883-9cad-05fe82b23135/239579d0-fc0b-4b50-ba03-dfe80e2bb6d0", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway_role_assignment", - ResourceName: "another connection for testing_Environment Admin_07ed5801-4d44-4578-9d2f-c6ef6d537e83", - ResourceID: fmt.Sprintf("%s/8773b833-ade0-4883-9cad-05fe82b23135/07ed5801-4d44-4578-9d2f-c6ef6d537e83", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_gateway_test.go b/internal/connector/pingone/platform/resources/pingone_gateway_test.go deleted file mode 100644 index da8141b2..00000000 --- a/internal/connector/pingone/platform/resources/pingone_gateway_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestGatewayExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Gateway(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_gateway", - ResourceName: "random", - ResourceID: fmt.Sprintf("%s/0b1d882c-5c71-4600-a9fb-befdad921df2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway", - ResourceName: "PingFederate LDAP Gateway", - ResourceID: fmt.Sprintf("%s/3b7b5d9d-1820-4b21-bb29-a5336af65352", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway", - ResourceName: "PF TF Provider", - ResourceID: fmt.Sprintf("%s/554257ac-76ca-447a-a210-722343328312", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway", - ResourceName: "Local Test", - ResourceID: fmt.Sprintf("%s/5cd3f6b7-35f0-4873-ac64-f32118bf3102", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway", - ResourceName: "TestGateway", - ResourceID: fmt.Sprintf("%s/bc37814f-b3a9-4149-b880-0ed457bbb5c5", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_gateway", - ResourceName: "another connection for testing", - ResourceID: fmt.Sprintf("%s/8773b833-ade0-4883-9cad-05fe82b23135", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_identity_propagation_plan_test.go b/internal/connector/pingone/platform/resources/pingone_identity_propagation_plan_test.go deleted file mode 100644 index ce4bed43..00000000 --- a/internal/connector/pingone/platform/resources/pingone_identity_propagation_plan_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestIdentityPropagationPlanExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.IdentityPropagationPlan(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_identity_propagation_plan", - ResourceName: "Default", - ResourceID: fmt.Sprintf("%s/ffc23586-01a8-498a-9745-af0b9f0e9c74", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_key_rotation_policy_test.go b/internal/connector/pingone/platform/resources/pingone_key_rotation_policy_test.go deleted file mode 100644 index c9f0a6d0..00000000 --- a/internal/connector/pingone/platform/resources/pingone_key_rotation_policy_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestKeyRotationPolicyExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.KeyRotationPolicy(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_key_rotation_policy", - ResourceName: "PingOne Key Rotation Policy for PingFederate Terraform Provider environment", - ResourceID: fmt.Sprintf("%s/9ad5e4a1-b414-40cc-84d1-8255272e4a30", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_key_test.go b/internal/connector/pingone/platform/resources/pingone_key_test.go deleted file mode 100644 index 6b86b83e..00000000 --- a/internal/connector/pingone/platform/resources/pingone_key_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestKeyExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Key(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_key", - ResourceName: "PingOne SSO Certificate for PingFederate Terraform Provider environment_ENCRYPTION", - ResourceID: fmt.Sprintf("%s/46a2d7ad-27ee-4743-92ce-aac279a4358a", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_key", - ResourceName: "test_SIGNING", - ResourceID: fmt.Sprintf("%s/619bad1d-c884-47c5-99d7-a998bc317791", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_key", - ResourceName: "PingOne SSO Certificate for PingFederate Terraform Provider environment_SIGNING", - ResourceID: fmt.Sprintf("%s/702d1a27-10e9-40cc-ba73-d0274a2c97d2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_key", - ResourceName: "common name_SIGNING", - ResourceID: fmt.Sprintf("%s/7d16daa9-f7eb-405f-b130-6567fe9d918f", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_language_test.go b/internal/connector/pingone/platform/resources/pingone_language_test.go deleted file mode 100644 index f5fc4a0b..00000000 --- a/internal/connector/pingone/platform/resources/pingone_language_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestLanguageExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Language(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_language", - ResourceName: "Afar", - ResourceID: fmt.Sprintf("%s/c5f97303-c5c1-459a-b8ee-3fcb183eb52a", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_language_update_test.go b/internal/connector/pingone/platform/resources/pingone_language_update_test.go deleted file mode 100644 index 89aded38..00000000 --- a/internal/connector/pingone/platform/resources/pingone_language_update_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestLanguageUpdateExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.LanguageUpdate(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_language_update", - ResourceName: "French_update", - ResourceID: fmt.Sprintf("%s/3f8a2e14-0ace-41db-a92d-74b3b7913ffe", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_language_update", - ResourceName: "English_update", - ResourceID: fmt.Sprintf("%s/88c78fb2-9d74-41e3-a1d8-a9f729a2b463", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_notification_policy_test.go b/internal/connector/pingone/platform/resources/pingone_notification_policy_test.go deleted file mode 100644 index daf1863e..00000000 --- a/internal/connector/pingone/platform/resources/pingone_notification_policy_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestNotificationPolicyExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.NotificationPolicy(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_notification_policy", - ResourceName: "Test", - ResourceID: fmt.Sprintf("%s/32cc413d-0ec8-4be9-823c-a9e06f5a5830", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_policy", - ResourceName: "Default Notification Policy", - ResourceID: fmt.Sprintf("%s/54606af4-72a6-4b38-bfb8-75034097af9a", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_notification_settings_email_test.go b/internal/connector/pingone/platform/resources/pingone_notification_settings_email_test.go deleted file mode 100644 index de076481..00000000 --- a/internal/connector/pingone/platform/resources/pingone_notification_settings_email_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestNotificationSettingsEmailExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.NotificationSettingsEmail(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_notification_settings_email", - ResourceName: "pingone_notification_settings_email", - ResourceID: clientInfo.PingOneExportEnvironmentID, - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_notification_settings_test.go b/internal/connector/pingone/platform/resources/pingone_notification_settings_test.go deleted file mode 100644 index e1985829..00000000 --- a/internal/connector/pingone/platform/resources/pingone_notification_settings_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestNotificationSettingsExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.NotificationSettings(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_notification_settings", - ResourceName: "pingone_notification_settings", - ResourceID: clientInfo.PingOneExportEnvironmentID, - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_notification_template_content_test.go b/internal/connector/pingone/platform/resources/pingone_notification_template_content_test.go deleted file mode 100644 index 80f4083c..00000000 --- a/internal/connector/pingone/platform/resources/pingone_notification_template_content_test.go +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestNotificationTemplateContentExport(t *testing.T) { - // TODO remove this skip dependent upon STAGING-25369 - t.SkipNow() - - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.NotificationTemplateContent(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_email_en_625d98de_9f2d_4e1b_8417_d0ba139d36b2", - ResourceID: fmt.Sprintf("%s/device_pairing/625d98de-9f2d-4e1b-8417-d0ba139d36b2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_sms_en_d4ca6154_bf87_4201_825b_6a1fecbd66ac", - ResourceID: fmt.Sprintf("%s/device_pairing/d4ca6154-bf87-4201-825b-6a1fecbd66ac", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_voice_en_d4ed6d8d_1b54_4903_970f_1c9896eed55d", - ResourceID: fmt.Sprintf("%s/device_pairing/d4ed6d8d-1b54-4903-970f-1c9896eed55d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_email_en_2acfe36d_065c_465e_be21_cb95e46cee45", - ResourceID: fmt.Sprintf("%s/device_pairing/2acfe36d-065c-465e-be21-cb95e46cee45", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_voice_fr_f50e80bc_e84d_7124_0db5_4fd4cf72d7c9", - ResourceID: fmt.Sprintf("%s/device_pairing/f50e80bc-e84d-7124-0db5-4fd4cf72d7c9", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_email_fr_a0a13d00_a249_7ad1_3f7e_b6ba77a55955", - ResourceID: fmt.Sprintf("%s/device_pairing/a0a13d00-a249-7ad1-3f7e-b6ba77a55955", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_sms_fr_c21bda2c_64b4_7025_2c83_d04d0f72077f", - ResourceID: fmt.Sprintf("%s/device_pairing/c21bda2c-64b4-7025-2c83-d04d0f72077f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_email_en_14651a6a_945b_725b_321f_e13cbe0fd9c6", - ResourceID: fmt.Sprintf("%s/device_pairing/14651a6a-945b-725b-321f-e13cbe0fd9c6", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_sms_en_f67b076d_bb78_4cbd_b945_f721be9c88f6", - ResourceID: fmt.Sprintf("%s/device_pairing/f67b076d-bb78-4cbd-b945-f721be9c88f6", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_voice_en_56b27d33_0110_7670_2c16_f0fca48b6340", - ResourceID: fmt.Sprintf("%s/device_pairing/56b27d33-0110-7670-2c16-f0fca48b6340", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_voice_en_d02693ae_8809_4a7f_a7f9_da9f272c8096", - ResourceID: fmt.Sprintf("%s/device_pairing/d02693ae-8809-4a7f-a7f9-da9f272c8096", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "device_pairing_sms_en_2512b56d_e14d_7cbd_3667_e1663d44fa41", - ResourceID: fmt.Sprintf("%s/device_pairing/2512b56d-e14d-7cbd-3667-e1663d44fa41", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "email_verification_admin_email_en_b130f9a6_a422_72c0_3afa_105d5f8fbb88", - ResourceID: fmt.Sprintf("%s/email_verification_admin/b130f9a6-a422-72c0-3afa-105d5f8fbb88", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "email_verification_user_email_en_5eda6f7b_59c6_7c22_3348_9821179c2b37", - ResourceID: fmt.Sprintf("%s/email_verification_user/5eda6f7b-59c6-7c22-3348-9821179c2b37", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "general_sms_fr_63501c32_723c_7d4c_1f93_4e3c8c0cb292", - ResourceID: fmt.Sprintf("%s/general/63501c32-723c-7d4c-1f93-4e3c8c0cb292", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "general_email_en_92adace7_5056_7d40_1c7e_adc71e57cc3f", - ResourceID: fmt.Sprintf("%s/general/92adace7-5056-7d40-1c7e-adc71e57cc3f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "general_sms_en_1dd4c1a3_802b_70c0_3d10_5524eb9defc7", - ResourceID: fmt.Sprintf("%s/general/1dd4c1a3-802b-70c0-3d10-5524eb9defc7", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "general_voice_en_72618f82_18ed_7b7c_19ac_0b5899d92f0c", - ResourceID: fmt.Sprintf("%s/general/72618f82-18ed-7b7c-19ac-0b5899d92f0c", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "general_email_fr_28524b17_b60b_7fa2_131d_59816ac19864", - ResourceID: fmt.Sprintf("%s/general/28524b17-b60b-7fa2-131d-59816ac19864", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "general_voice_fr_831e9b77_5a05_7ed1_0fa6_c8cb637b5904", - ResourceID: fmt.Sprintf("%s/general/831e9b77-5a05-7ed1-0fa6-c8cb637b5904", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "new_device_paired_email_fr_a7c11013_ca70_7071_3955_d647568f95d2", - ResourceID: fmt.Sprintf("%s/new_device_paired/a7c11013-ca70-7071-3955-d647568f95d2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "new_device_paired_email_en_995558d3_39a9_72bf_32a6_e3c1e395aa1f", - ResourceID: fmt.Sprintf("%s/new_device_paired/995558d3-39a9-72bf-32a6-e3c1e395aa1f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "new_device_paired_sms_fr_a5dacd1c_c395_74ab_216f_a17037b22cf6", - ResourceID: fmt.Sprintf("%s/new_device_paired/a5dacd1c-c395-74ab-216f-a17037b22cf6", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "new_device_paired_sms_en_daef917c_3695_7347_1ed0_bb03d80198c2", - ResourceID: fmt.Sprintf("%s/new_device_paired/daef917c-3695-7347-1ed0-bb03d80198c2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "recovery_code_template_email_fr_c558cd3c_eb16_7158_38c3_d87fb2e320f0", - ResourceID: fmt.Sprintf("%s/recovery_code_template/c558cd3c-eb16-7158-38c3-d87fb2e320f0", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "recovery_code_template_email_en_dc6755cd_123b_71f6_2fe0_5b74d3789001", - ResourceID: fmt.Sprintf("%s/recovery_code_template/dc6755cd-123b-71f6-2fe0-5b74d3789001", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "strong_authentication_push_en_c6b2f1e9_fcde_4b64_b473_f5370219da76", - ResourceID: fmt.Sprintf("%s/strong_authentication/c6b2f1e9-fcde-4b64-b473-f5370219da76", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "strong_authentication_voice_fr_c6de3d50_d766_7533_25cf_bd28f72e2f86", - ResourceID: fmt.Sprintf("%s/strong_authentication/c6de3d50-d766-7533-25cf-bd28f72e2f86", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "strong_authentication_sms_en_5d2b94bc_d264_7f79_048f_a0f062f66d98", - ResourceID: fmt.Sprintf("%s/strong_authentication/5d2b94bc-d264-7f79-048f-a0f062f66d98", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "strong_authentication_push_en_b368bc5e_0815_7d16_178c_2631a620e00c", - ResourceID: fmt.Sprintf("%s/strong_authentication/b368bc5e-0815-7d16-178c-2631a620e00c", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "strong_authentication_email_fr_2e103d6d_af8e_70fa_282f_91821ed778fd", - ResourceID: fmt.Sprintf("%s/strong_authentication/2e103d6d-af8e-70fa-282f-91821ed778fd", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "strong_authentication_push_fr_d3d66f1b_b748_7afc_2d4b_a1daffd50a77", - ResourceID: fmt.Sprintf("%s/strong_authentication/d3d66f1b-b748-7afc-2d4b-a1daffd50a77", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "strong_authentication_voice_en_8a888c96_4cb9_7941_0c07_0a4e99a54a04", - ResourceID: fmt.Sprintf("%s/strong_authentication/8a888c96-4cb9-7941-0c07-0a4e99a54a04", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "strong_authentication_sms_en_41054e31_dacd_4591_a8c8_f44cbec6313f", - ResourceID: fmt.Sprintf("%s/strong_authentication/41054e31-dacd-4591-a8c8-f44cbec6313f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "strong_authentication_sms_fr_807cd1a1_f3f8_7440_10f5_5f9cf944abb3", - ResourceID: fmt.Sprintf("%s/strong_authentication/807cd1a1-f3f8-7440-10f5-5f9cf944abb3", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "strong_authentication_email_en_e8539132_48c6_7061_1309_f33e99599a3e", - ResourceID: fmt.Sprintf("%s/strong_authentication/e8539132-48c6-7061-1309-f33e99599a3e", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "strong_authentication_email_en_d1235c66_48c6_46ae_ae6d_599513ab26d7", - ResourceID: fmt.Sprintf("%s/strong_authentication/d1235c66-48c6-46ae-ae6d-599513ab26d7", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "transaction_push_fr_453937a6_e95b_78b9_0d13_be9e17cdda89", - ResourceID: fmt.Sprintf("%s/transaction/453937a6-e95b-78b9-0d13-be9e17cdda89", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "transaction_sms_fr_10458132_7361_7d6b_3e42_04128ae31625", - ResourceID: fmt.Sprintf("%s/transaction/10458132-7361-7d6b-3e42-04128ae31625", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "transaction_voice_en_b2509f63_c86c_7f76_0fea_52472af67df2", - ResourceID: fmt.Sprintf("%s/transaction/b2509f63-c86c-7f76-0fea-52472af67df2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "transaction_email_fr_1953c10e_53a9_7c44_13eb_560823acacf6", - ResourceID: fmt.Sprintf("%s/transaction/1953c10e-53a9-7c44-13eb-560823acacf6", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "transaction_push_en_926802db_4abb_7369_249a_ff3c63c6a7d1", - ResourceID: fmt.Sprintf("%s/transaction/926802db-4abb-7369-249a-ff3c63c6a7d1", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "transaction_email_en_996806a7_0c4e_744c_117b_6312e08225d3", - ResourceID: fmt.Sprintf("%s/transaction/996806a7-0c4e-744c-117b-6312e08225d3", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "transaction_sms_en_d9751d12_2f37_7d6e_3cc4_33368770f6da", - ResourceID: fmt.Sprintf("%s/transaction/d9751d12-2f37-7d6e-3cc4-33368770f6da", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "transaction_voice_fr_0db4c9f4_c1d6_7adf_1870_22f70f5e95a1", - ResourceID: fmt.Sprintf("%s/transaction/0db4c9f4-c1d6-7adf-1870-22f70f5e95a1", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "verification_code_template_email_fr_03bdf108_c71d_74fb_28e8_143f22b98125", - ResourceID: fmt.Sprintf("%s/verification_code_template/03bdf108-c71d-74fb-28e8-143f22b98125", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_notification_template_content", - ResourceName: "verification_code_template_email_en_93688f61_e554_736d_227d_ac8ee610c254", - ResourceID: fmt.Sprintf("%s/verification_code_template/93688f61-e554-736d-227d-ac8ee610c254", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_phone_delivery_settings_test.go b/internal/connector/pingone/platform/resources/pingone_phone_delivery_settings_test.go deleted file mode 100644 index 45aeb8a9..00000000 --- a/internal/connector/pingone/platform/resources/pingone_phone_delivery_settings_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestPhoneDeliverySettingsExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.PhoneDeliverySettings(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_phone_delivery_settings", - ResourceName: "provider_custom_eb90b2a5-a801-45b3-8bf4-7d06cb6a5374", - ResourceID: fmt.Sprintf("%s/eb90b2a5-a801-45b3-8bf4-7d06cb6a5374", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_system_application_test.go b/internal/connector/pingone/platform/resources/pingone_system_application_test.go deleted file mode 100644 index 0a1bee3b..00000000 --- a/internal/connector/pingone/platform/resources/pingone_system_application_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestSystemApplicationExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.SystemApplication(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_system_application", - ResourceName: "PingOne Application Portal", - ResourceID: fmt.Sprintf("%s/92a3765c-e135-4afa-8b12-4469672ac8a9", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_system_application", - ResourceName: "PingOne Self-Service - MyAccount", - ResourceID: fmt.Sprintf("%s/4ce54d01-5138-4c56-8175-4f02f69278f5", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_trusted_email_address_test.go b/internal/connector/pingone/platform/resources/pingone_trusted_email_address_test.go deleted file mode 100644 index 79895f6d..00000000 --- a/internal/connector/pingone/platform/resources/pingone_trusted_email_address_test.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestTrustedEmailAddressExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.TrustedEmailAddress(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{} - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_trusted_email_domain_test.go b/internal/connector/pingone/platform/resources/pingone_trusted_email_domain_test.go deleted file mode 100644 index 7585d479..00000000 --- a/internal/connector/pingone/platform/resources/pingone_trusted_email_domain_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestTrustedEmailDomainExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.TrustedEmailDomain(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_trusted_email_domain", - ResourceName: "test.customdomain.com", - ResourceID: fmt.Sprintf("%s/47efb375-e9e8-40dc-b1ce-8598bf7b4aea", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_trusted_email_domain", - ResourceName: "test.pingidentity.com", - ResourceID: fmt.Sprintf("%s/ff26c5c9-2e87-46d4-9cb0-077d162c7bcb", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_trusted_email_domain", - ResourceName: "demo.bxretail.org", - ResourceID: fmt.Sprintf("%s/49f94864-f9c7-4778-ae37-839c2c546d1c", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_webhook_test.go b/internal/connector/pingone/platform/resources/pingone_webhook_test.go deleted file mode 100644 index 5f6668f1..00000000 --- a/internal/connector/pingone/platform/resources/pingone_webhook_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestWebhookExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Webhook(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_webhook", - ResourceName: "Test Webhook", - ResourceID: fmt.Sprintf("%s/e50056fe-6571-46bc-aee1-e70f702c8b74", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/platform/resources/pingone_system_application.go b/internal/connector/pingone/platform/resources/system_application.go similarity index 93% rename from internal/connector/pingone/platform/resources/pingone_system_application.go rename to internal/connector/pingone/platform/resources/system_application.go index 58b628af..f185f761 100644 --- a/internal/connector/pingone/platform/resources/pingone_system_application.go +++ b/internal/connector/pingone/platform/resources/system_application.go @@ -68,11 +68,11 @@ func (r *PingOneSystemApplicationResource) getSystemApplicationData() (map[strin applicationData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - applications, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) if err != nil { return nil, err } - for _, application := range applications { + for _, application := range apiObjs { var ( applicationId *string applicationIdOk bool diff --git a/internal/connector/pingone/platform/resources/system_application_test.go b/internal/connector/pingone/platform/resources/system_application_test.go new file mode 100644 index 00000000..f3989b03 --- /dev/null +++ b/internal/connector/pingone/platform/resources/system_application_test.go @@ -0,0 +1,58 @@ +// Copyright © 2025 Ping Identity Corporation + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func TestSystemApplicationExport(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.SystemApplication(t, clientInfo) + + expectedImportBlocks := []connector.ImportBlock{} + + // Every environment has pre-configured system applications, so we need to get them all. + iter := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", tr.ExportableResource.ResourceType()) + if err != nil { + t.Fatalf("Failed to get system applications: %v", err) + } + for _, application := range apiObjs { + var ( + applicationId *string + applicationIdOk bool + applicationName *string + applicationNameOk bool + ) + + switch { + case application.ApplicationPingOnePortal != nil: + applicationId, applicationIdOk = application.ApplicationPingOnePortal.GetIdOk() + applicationName, applicationNameOk = application.ApplicationPingOnePortal.GetNameOk() + case application.ApplicationPingOneSelfService != nil: + applicationId, applicationIdOk = application.ApplicationPingOneSelfService.GetIdOk() + applicationName, applicationNameOk = application.ApplicationPingOneSelfService.GetNameOk() + default: + continue + } + + if applicationIdOk && applicationNameOk { + expectedImportBlocks = append(expectedImportBlocks, connector.ImportBlock{ + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: *applicationName, + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, *applicationId), + }) + } + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_trusted_email_address.go b/internal/connector/pingone/platform/resources/trusted_email_address.go similarity index 74% rename from internal/connector/pingone/platform/resources/pingone_trusted_email_address.go rename to internal/connector/pingone/platform/resources/trusted_email_address.go index a4e35305..a80fb31b 100644 --- a/internal/connector/pingone/platform/resources/pingone_trusted_email_address.go +++ b/internal/connector/pingone/platform/resources/trusted_email_address.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -38,7 +39,7 @@ func (r *PingOneTrustedEmailAddressResource) ExportAll() (*[]connector.ImportBlo importBlocks := []connector.ImportBlock{} - trustedEmailDomainData, err := r.getTrustedEmailDomainData() + trustedEmailDomainData, err := r.getEmailDomainData() if err != nil { return nil, err } @@ -49,20 +50,20 @@ func (r *PingOneTrustedEmailAddressResource) ExportAll() (*[]connector.ImportBlo return nil, err } - for trustedEmailId, trustedEmailAddress := range trustedEmailAddressData { + for trustedEmailAddressId, trustedEmailAddress := range trustedEmailAddressData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), - "Trusted Email Address": trustedEmailAddress, - "Trusted Email Address ID": trustedEmailId, "Trusted Email Domain ID": trustedEmailDomainId, "Trusted Email Domain Name": trustedEmailDomainName, + "Trusted Email Address ID": trustedEmailAddressId, + "Trusted Email Address": trustedEmailAddress, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: fmt.Sprintf("%s_%s", trustedEmailDomainName, trustedEmailAddress), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, trustedEmailDomainId, trustedEmailId), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, trustedEmailDomainId, trustedEmailAddressId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -73,16 +74,16 @@ func (r *PingOneTrustedEmailAddressResource) ExportAll() (*[]connector.ImportBlo return &importBlocks, nil } -func (r *PingOneTrustedEmailAddressResource) getTrustedEmailDomainData() (map[string]string, error) { +func (r *PingOneTrustedEmailAddressResource) getEmailDomainData() (map[string]string, error) { trustedEmailDomainData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.TrustedEmailDomainsApi.ReadAllTrustedEmailDomains(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - trustedEmailDomains, err := pingone.GetManagementAPIObjectsFromIterator[management.EmailDomain](iter, "ReadAllTrustedEmailDomains", "GetEmailDomains", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EmailDomain](iter, "ReadAllTrustedEmailDomains", "GetEmailDomains", r.ResourceType()) if err != nil { return nil, err } - for _, trustedEmailDomain := range trustedEmailDomains { + for _, trustedEmailDomain := range apiObjs { trustedEmailDomainId, trustedEmailDomainIdOk := trustedEmailDomain.GetIdOk() trustedEmailDomainName, trustedEmailDomainNameOk := trustedEmailDomain.GetDomainNameOk() @@ -98,17 +99,17 @@ func (r *PingOneTrustedEmailAddressResource) getTrustedEmailAddressData(trustedE trustedEmailAddressData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.TrustedEmailAddressesApi.ReadAllTrustedEmailAddresses(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, trustedEmailDomainId).Execute() - trustedEmailAddresses, err := pingone.GetManagementAPIObjectsFromIterator[management.EmailDomainTrustedEmail](iter, "ReadAllTrustedEmailAddresses", "GetTrustedEmails", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EmailDomainTrustedEmail](iter, "ReadAllTrustedEmailAddresses", "GetTrustedEmails", r.ResourceType()) if err != nil { return nil, err } - for _, trustedEmail := range trustedEmailAddresses { - trustedEmailAddress, trustedEmailAddressOk := trustedEmail.GetEmailAddressOk() - trustedEmailId, trustedEmailIdOk := trustedEmail.GetIdOk() + for _, trustedEmailAddress := range apiObjs { + trustedEmailAddressId, trustedEmailAddressIdOk := trustedEmailAddress.GetIdOk() + trustedEmailAddress, trustedEmailAddressOk := trustedEmailAddress.GetEmailAddressOk() - if trustedEmailAddressOk && trustedEmailIdOk { - trustedEmailAddressData[*trustedEmailId] = *trustedEmailAddress + if trustedEmailAddressIdOk && trustedEmailAddressOk { + trustedEmailAddressData[*trustedEmailAddressId] = *trustedEmailAddress } } diff --git a/internal/connector/pingone/platform/resources/trusted_email_address_test.go b/internal/connector/pingone/platform/resources/trusted_email_address_test.go new file mode 100644 index 00000000..dddc15ac --- /dev/null +++ b/internal/connector/pingone/platform/resources/trusted_email_address_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_TrustedEmailAddress(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.TrustedEmailAddress(t, clientInfo) + + // TODO: Currently unable to create a trusted email address via API due to trust email domain verification requirement + // trustedEmailDomainTr := tr.Dependencies[0] + + // tr.CreateResource(t) + // defer tr.DeleteResource(t) + + // expectedImportBlocks := []connector.ImportBlock{ + // { + // ResourceType: tr.ExportableResource.ResourceType(), + // ResourceName: fmt.Sprintf("%s_%s", trustedEmailDomainTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + // ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, trustedEmailDomainTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + // }, + // } + + expectedImportBlocks := []connector.ImportBlock{} + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_trusted_email_domain.go b/internal/connector/pingone/platform/resources/trusted_email_domain.go similarity index 89% rename from internal/connector/pingone/platform/resources/pingone_trusted_email_domain.go rename to internal/connector/pingone/platform/resources/trusted_email_domain.go index 82f07cda..d2657d17 100644 --- a/internal/connector/pingone/platform/resources/pingone_trusted_email_domain.go +++ b/internal/connector/pingone/platform/resources/trusted_email_domain.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -21,7 +22,7 @@ type PingOneTrustedEmailDomainResource struct { clientInfo *connector.ClientInfo } -// Utility method for creating a PingOne Trusted Email Domain Resource +// Utility method for creating a PingOneTrustedEmailDomainResource func TrustedEmailDomain(clientInfo *connector.ClientInfo) *PingOneTrustedEmailDomainResource { return &PingOneTrustedEmailDomainResource{ clientInfo: clientInfo, @@ -45,10 +46,10 @@ func (r *PingOneTrustedEmailDomainResource) ExportAll() (*[]connector.ImportBloc for trustedEmailDomainId, trustedEmailDomainName := range trustedEmailDomainData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), "Trusted Email Domain ID": trustedEmailDomainId, "Trusted Email Domain Name": trustedEmailDomainName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ @@ -68,12 +69,12 @@ func (r *PingOneTrustedEmailDomainResource) getTrustedEmailDomainData() (map[str trustedEmailDomainData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.TrustedEmailDomainsApi.ReadAllTrustedEmailDomains(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - trustedEmailDomains, err := pingone.GetManagementAPIObjectsFromIterator[management.EmailDomain](iter, "ReadAllTrustedEmailDomains", "GetEmailDomains", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EmailDomain](iter, "ReadAllTrustedEmailDomains", "GetEmailDomains", r.ResourceType()) if err != nil { return nil, err } - for _, trustedEmailDomain := range trustedEmailDomains { + for _, trustedEmailDomain := range apiObjs { trustedEmailDomainId, trustedEmailDomainIdOk := trustedEmailDomain.GetIdOk() trustedEmailDomainName, trustedEmailDomainNameOk := trustedEmailDomain.GetDomainNameOk() diff --git a/internal/connector/pingone/platform/resources/trusted_email_domain_test.go b/internal/connector/pingone/platform/resources/trusted_email_domain_test.go new file mode 100644 index 00000000..25fb3348 --- /dev/null +++ b/internal/connector/pingone/platform/resources/trusted_email_domain_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_TrustedEmailDomain(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.TrustedEmailDomain(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/platform/resources/pingone_webhook.go b/internal/connector/pingone/platform/resources/webhook.go similarity index 67% rename from internal/connector/pingone/platform/resources/pingone_webhook.go rename to internal/connector/pingone/platform/resources/webhook.go index d171d1d1..89bbd086 100644 --- a/internal/connector/pingone/platform/resources/pingone_webhook.go +++ b/internal/connector/pingone/platform/resources/webhook.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -38,23 +39,23 @@ func (r *PingOneWebhookResource) ExportAll() (*[]connector.ImportBlock, error) { importBlocks := []connector.ImportBlock{} - subscriptionData, err := r.getSubscriptionData() + webhookData, err := r.getWebhookData() if err != nil { return nil, err } - for subscriptionId, subscriptionName := range subscriptionData { + for webhookId, webhookName := range webhookData { commentData := map[string]string{ + "Webhook ID": webhookId, + "Webhook Name": webhookName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), - "Webhook ID": subscriptionId, - "Webhook Name": subscriptionName, } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: subscriptionName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, subscriptionId), + ResourceName: webhookName, + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, webhookId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -64,23 +65,23 @@ func (r *PingOneWebhookResource) ExportAll() (*[]connector.ImportBlock, error) { return &importBlocks, nil } -func (r *PingOneWebhookResource) getSubscriptionData() (map[string]string, error) { - subscriptionData := make(map[string]string) +func (r *PingOneWebhookResource) getWebhookData() (map[string]string, error) { + webhookData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.SubscriptionsWebhooksApi.ReadAllSubscriptions(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - subscriptions, err := pingone.GetManagementAPIObjectsFromIterator[management.Subscription](iter, "ReadAllSubscriptions", "GetSubscriptions", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Subscription](iter, "ReadAllSubscriptions", "GetSubscriptions", r.ResourceType()) if err != nil { return nil, err } - for _, subscription := range subscriptions { - subscriptionId, subscriptionIdOk := subscription.GetIdOk() - subscriptionName, subscriptionNameOk := subscription.GetNameOk() + for _, webhook := range apiObjs { + webhookId, webhookIdOk := webhook.GetIdOk() + webhookName, webhookNameOk := webhook.GetNameOk() - if subscriptionIdOk && subscriptionNameOk { - subscriptionData[*subscriptionId] = *subscriptionName + if webhookIdOk && webhookNameOk { + webhookData[*webhookId] = *webhookName } } - return subscriptionData, nil + return webhookData, nil } diff --git a/internal/connector/pingone/platform/resources/webhook_test.go b/internal/connector/pingone/platform/resources/webhook_test.go new file mode 100644 index 00000000..5ed3e95e --- /dev/null +++ b/internal/connector/pingone/platform/resources/webhook_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" +) + +func Test_Webhook(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_platform_testable_resources.Webhook(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/protect/pingone_protect_connector_test.go b/internal/connector/pingone/protect/pingone_protect_connector_test.go index 30e5f907..42c82369 100644 --- a/internal/connector/pingone/protect/pingone_protect_connector_test.go +++ b/internal/connector/pingone/protect/pingone_protect_connector_test.go @@ -5,9 +5,9 @@ package protect_test import ( "testing" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/protect/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_protect_testable_resources" "github.com/pingidentity/pingcli/internal/testing/testutils_terraform" ) @@ -17,25 +17,30 @@ func TestProtectTerraformPlan(t *testing.T) { testutils_terraform.InitPingOneTerraform(t) testCases := []struct { - name string - resource connector.ExportableResource - ignoredErrors []string + name string + testableResource *testutils_resource.TestableResource + ignoredErrors []string }{ { - name: "RiskPolicy", - resource: resources.RiskPolicy(clientInfo), - ignoredErrors: nil, + name: "RiskPolicy", + testableResource: pingone_protect_testable_resources.RiskPolicy(t, clientInfo), + ignoredErrors: []string{ + "Error: Invalid Attribute Combination", + }, }, { - name: "RiskPredictor", - resource: resources.RiskPredictor(clientInfo), - ignoredErrors: nil, + name: "RiskPredictor", + testableResource: pingone_protect_testable_resources.RiskPredictor(t, clientInfo), + ignoredErrors: nil, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - testutils_terraform.ValidateTerraformPlan(t, tc.resource, tc.ignoredErrors) + tc.testableResource.CreateResource(t) + defer tc.testableResource.DeleteResource(t) + + testutils_terraform.ValidateTerraformPlan(t, tc.testableResource.ExportableResource, tc.ignoredErrors) }) } } diff --git a/internal/connector/pingone/protect/resources/pingone_risk_policy_test.go b/internal/connector/pingone/protect/resources/pingone_risk_policy_test.go deleted file mode 100644 index b91779c4..00000000 --- a/internal/connector/pingone/protect/resources/pingone_risk_policy_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/protect/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestRiskPolicyExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.RiskPolicy(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_risk_policy", - ResourceName: "Default Risk Policy", - ResourceID: fmt.Sprintf("%s/f277d6e2-e073-018c-1b78-8be4cd16d898", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_policy", - ResourceName: "Test Risk Polict", - ResourceID: fmt.Sprintf("%s/9964b80b-3140-4d70-9ed5-ff29baf8438f", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/protect/resources/pingone_risk_predictor.go b/internal/connector/pingone/protect/resources/pingone_risk_predictor.go deleted file mode 100644 index e184c976..00000000 --- a/internal/connector/pingone/protect/resources/pingone_risk_predictor.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/risk" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingOneRiskPredictorResource{} -) - -type PingOneRiskPredictorResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingOneRiskPredictorResource -func RiskPredictor(clientInfo *connector.ClientInfo) *PingOneRiskPredictorResource { - return &PingOneRiskPredictorResource{ - clientInfo: clientInfo, - } -} - -func (r *PingOneRiskPredictorResource) ResourceType() string { - return "pingone_risk_predictor" -} - -func (r *PingOneRiskPredictorResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - riskPredictorData, err := r.getRiskPredictorData() - if err != nil { - return nil, err - } - - for riskPredictorId, riskPredictorInfo := range riskPredictorData { - riskPredictorName := riskPredictorInfo[0] - riskPredictorType := riskPredictorInfo[1] - - commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), - "Risk Predictor ID": riskPredictorId, - "Risk Predictor Name": riskPredictorName, - "Risk Predictor Type": riskPredictorType, - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", riskPredictorType, riskPredictorName), - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, riskPredictorId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - - return &importBlocks, nil -} - -func (r *PingOneRiskPredictorResource) getRiskPredictorData() (map[string][]string, error) { - riskPredictorData := make(map[string][]string) - - iter := r.clientInfo.PingOneApiClient.RiskAPIClient.RiskAdvancedPredictorsApi.ReadAllRiskPredictors(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - riskPredictors, err := pingone.GetRiskAPIObjectsFromIterator[risk.RiskPredictor](iter, "ReadAllRiskPredictors", "GetRiskPredictors", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, riskPredictor := range riskPredictors { - var ( - riskPredictorId *string - riskPredictorIdOk bool - riskPredictorName *string - riskPredictorNameOk bool - riskPredictorType *risk.EnumPredictorType - riskPredictorTypeOk bool - ) - - switch { - case riskPredictor.RiskPredictorAdversaryInTheMiddle != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorAdversaryInTheMiddle.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorAdversaryInTheMiddle.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorAdversaryInTheMiddle.GetTypeOk() - case riskPredictor.RiskPredictorAnonymousNetwork != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorAnonymousNetwork.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorAnonymousNetwork.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorAnonymousNetwork.GetTypeOk() - case riskPredictor.RiskPredictorBotDetection != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorBotDetection.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorBotDetection.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorBotDetection.GetTypeOk() - case riskPredictor.RiskPredictorCommon != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorCommon.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorCommon.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorCommon.GetTypeOk() - case riskPredictor.RiskPredictorComposite != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorComposite.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorComposite.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorComposite.GetTypeOk() - case riskPredictor.RiskPredictorCustom != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorCustom.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorCustom.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorCustom.GetTypeOk() - case riskPredictor.RiskPredictorDevice != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorDevice.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorDevice.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorDevice.GetTypeOk() - case riskPredictor.RiskPredictorEmailReputation != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorEmailReputation.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorEmailReputation.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorEmailReputation.GetTypeOk() - case riskPredictor.RiskPredictorGeovelocity != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorGeovelocity.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorGeovelocity.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorGeovelocity.GetTypeOk() - case riskPredictor.RiskPredictorIPReputation != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorIPReputation.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorIPReputation.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorIPReputation.GetTypeOk() - case riskPredictor.RiskPredictorUserLocationAnomaly != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorUserLocationAnomaly.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorUserLocationAnomaly.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorUserLocationAnomaly.GetTypeOk() - case riskPredictor.RiskPredictorUserRiskBehavior != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorUserRiskBehavior.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorUserRiskBehavior.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorUserRiskBehavior.GetTypeOk() - case riskPredictor.RiskPredictorVelocity != nil: - riskPredictorId, riskPredictorIdOk = riskPredictor.RiskPredictorVelocity.GetIdOk() - riskPredictorName, riskPredictorNameOk = riskPredictor.RiskPredictorVelocity.GetNameOk() - riskPredictorType, riskPredictorTypeOk = riskPredictor.RiskPredictorVelocity.GetTypeOk() - default: - continue - } - - if riskPredictorIdOk && riskPredictorNameOk && riskPredictorTypeOk { - riskPredictorData[*riskPredictorId] = []string{*riskPredictorName, string(*riskPredictorType)} - } - } - - return riskPredictorData, nil -} diff --git a/internal/connector/pingone/protect/resources/pingone_risk_predictor_test.go b/internal/connector/pingone/protect/resources/pingone_risk_predictor_test.go deleted file mode 100644 index ddbfea14..00000000 --- a/internal/connector/pingone/protect/resources/pingone_risk_predictor_test.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/protect/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestRiskPredictorExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.RiskPredictor(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_risk_predictor", - ResourceName: "USER_RISK_BEHAVIOR_User Risk Behavior", - ResourceID: fmt.Sprintf("%s/b7a259a3-f762-03df-1c0c-4c558a94e783", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "VELOCITY_IP Velocity", - ResourceID: fmt.Sprintf("%s/eaf75445-0fa4-07f9-31f6-806a6b513b59", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "VELOCITY_User Velocity", - ResourceID: fmt.Sprintf("%s/ab6c4119-90c4-0f07-0708-bf7802182a70", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "USER_RISK_BEHAVIOR_User-Based Risk Behavior", - ResourceID: fmt.Sprintf("%s/f6e64983-2ae1-0b02-2af4-73389ce879fa", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "DEVICE_New Device", - ResourceID: fmt.Sprintf("%s/b5339087-4e8c-08da-0c51-c826d67ca317", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "ANONYMOUS_NETWORK_Anonymous Network Detection", - ResourceID: fmt.Sprintf("%s/1bb86739-b74d-0882-1fbb-4da12fc3afc9", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "IP_REPUTATION_IP Reputation", - ResourceID: fmt.Sprintf("%s/c2753cc6-21b0-0490-3526-de9082c47fac", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "GEO_VELOCITY_Geovelocity Anomaly", - ResourceID: fmt.Sprintf("%s/13c1f49f-0f98-0870-2b3c-cf68549e9a4a", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "USER_LOCATION_ANOMALY_User Location Anomaly", - ResourceID: fmt.Sprintf("%s/6c2a6e1f-f345-07a3-348e-8d820577338f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "BOT_Bot Detection", - ResourceID: fmt.Sprintf("%s/818db5ee-209f-0371-18cf-f440ecbe3982", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "DEVICE_Suspicious Device", - ResourceID: fmt.Sprintf("%s/dd53d209-c3eb-0980-3acb-0d1d4ecc10d1", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "ADVERSARY_IN_THE_MIDDLE_Adversary In The Middle", - ResourceID: fmt.Sprintf("%s/8e9a0b6f-61a8-06a1-2bdb-fc168000a55d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_risk_predictor", - ResourceName: "EMAIL_REPUTATION_Email Reputation", - ResourceID: fmt.Sprintf("%s/0a59b68e-e772-0eed-213a-a351f275f418", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/protect/resources/pingone_risk_policy.go b/internal/connector/pingone/protect/resources/risk_policy.go similarity index 66% rename from internal/connector/pingone/protect/resources/pingone_risk_policy.go rename to internal/connector/pingone/protect/resources/risk_policy.go index 8c4b724e..61d47119 100644 --- a/internal/connector/pingone/protect/resources/pingone_risk_policy.go +++ b/internal/connector/pingone/protect/resources/risk_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -38,23 +39,23 @@ func (r *PingOneRiskPolicyResource) ExportAll() (*[]connector.ImportBlock, error importBlocks := []connector.ImportBlock{} - riskPolicySetData, err := r.getRiskPolicySetData() + riskPolicyData, err := r.getRiskPolicyData() if err != nil { return nil, err } - for riskPolicySetId, riskPolicySetName := range riskPolicySetData { + for riskPolicyId, riskPolicyName := range riskPolicyData { commentData := map[string]string{ + "Risk Policy ID": riskPolicyId, + "Risk Policy Name": riskPolicyName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), - "Risk Policy ID": riskPolicySetId, - "Risk Policy Name": riskPolicySetName, } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: riskPolicySetName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, riskPolicySetId), + ResourceName: riskPolicyName, + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, riskPolicyId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -64,23 +65,23 @@ func (r *PingOneRiskPolicyResource) ExportAll() (*[]connector.ImportBlock, error return &importBlocks, nil } -func (r *PingOneRiskPolicyResource) getRiskPolicySetData() (map[string]string, error) { - riskPolicySetData := make(map[string]string) +func (r *PingOneRiskPolicyResource) getRiskPolicyData() (map[string]string, error) { + riskPolicyData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.RiskAPIClient.RiskPoliciesApi.ReadRiskPolicySets(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - riskPolicySets, err := pingone.GetRiskAPIObjectsFromIterator[risk.RiskPolicySet](iter, "ReadRiskPolicySets", "GetRiskPolicySets", r.ResourceType()) + apiObjs, err := pingone.GetRiskAPIObjectsFromIterator[risk.RiskPolicySet](iter, "ReadRiskPolicySets", "GetRiskPolicySets", r.ResourceType()) if err != nil { return nil, err } - for _, riskPolicySet := range riskPolicySets { - riskPolicySetName, riskPolicySetNameOk := riskPolicySet.GetNameOk() - riskPolicySetId, riskPolicySetIdOk := riskPolicySet.GetIdOk() + for _, riskPolicy := range apiObjs { + riskPolicyId, riskPolicyIdOk := riskPolicy.GetIdOk() + riskPolicyName, riskPolicyNameOk := riskPolicy.GetNameOk() - if riskPolicySetIdOk && riskPolicySetNameOk { - riskPolicySetData[*riskPolicySetId] = *riskPolicySetName + if riskPolicyIdOk && riskPolicyNameOk { + riskPolicyData[*riskPolicyId] = *riskPolicyName } } - return riskPolicySetData, nil + return riskPolicyData, nil } diff --git a/internal/connector/pingone/protect/resources/risk_policy_test.go b/internal/connector/pingone/protect/resources/risk_policy_test.go new file mode 100644 index 00000000..486b88bf --- /dev/null +++ b/internal/connector/pingone/protect/resources/risk_policy_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_protect_testable_resources" +) + +func Test_RiskPolicy(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_protect_testable_resources.RiskPolicy(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing risk policies are generated. test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/protect/resources/risk_predictor.go b/internal/connector/pingone/protect/resources/risk_predictor.go new file mode 100644 index 00000000..3906e7cc --- /dev/null +++ b/internal/connector/pingone/protect/resources/risk_predictor.go @@ -0,0 +1,154 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/risk" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneRiskPredictorResource{} +) + +type PingOneRiskPredictorResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneRiskPredictorResource +func RiskPredictor(clientInfo *connector.ClientInfo) *PingOneRiskPredictorResource { + return &PingOneRiskPredictorResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneRiskPredictorResource) ResourceType() string { + return "pingone_risk_predictor" +} + +func (r *PingOneRiskPredictorResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + riskPredictorData, err := r.getRiskPredictorData() + if err != nil { + return nil, err + } + + for riskPredictorId, riskPredictorInfo := range riskPredictorData { + riskPredictorName := riskPredictorInfo[0] + riskPredictorType := riskPredictorInfo[1] + + commentData := map[string]string{ + "Risk Predictor ID": riskPredictorId, + "Risk Predictor Name": riskPredictorName, + "Risk Predictor Type": riskPredictorType, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", riskPredictorType, riskPredictorName), + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, riskPredictorId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingOneRiskPredictorResource) getRiskPredictorData() (map[string][]string, error) { + riskPredictorData := make(map[string][]string) + + iter := r.clientInfo.PingOneApiClient.RiskAPIClient.RiskAdvancedPredictorsApi.ReadAllRiskPredictors(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetRiskAPIObjectsFromIterator[risk.RiskPredictor](iter, "ReadAllRiskPredictors", "GetRiskPredictors", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, innerObj := range apiObjs { + var ( + riskPredictorId *string + riskPredictorIdOk bool + riskPredictorName *string + riskPredictorNameOk bool + riskPredictorType *risk.EnumPredictorType + riskPredictorTypeOk bool + ) + + switch { + case innerObj.RiskPredictorAdversaryInTheMiddle != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorAdversaryInTheMiddle.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorAdversaryInTheMiddle.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorAdversaryInTheMiddle.GetTypeOk() + case innerObj.RiskPredictorAnonymousNetwork != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorAnonymousNetwork.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorAnonymousNetwork.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorAnonymousNetwork.GetTypeOk() + case innerObj.RiskPredictorBotDetection != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorBotDetection.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorBotDetection.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorBotDetection.GetTypeOk() + case innerObj.RiskPredictorCommon != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorCommon.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorCommon.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorCommon.GetTypeOk() + case innerObj.RiskPredictorComposite != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorComposite.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorComposite.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorComposite.GetTypeOk() + case innerObj.RiskPredictorCustom != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorCustom.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorCustom.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorCustom.GetTypeOk() + case innerObj.RiskPredictorDevice != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorDevice.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorDevice.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorDevice.GetTypeOk() + case innerObj.RiskPredictorEmailReputation != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorEmailReputation.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorEmailReputation.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorEmailReputation.GetTypeOk() + case innerObj.RiskPredictorGeovelocity != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorGeovelocity.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorGeovelocity.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorGeovelocity.GetTypeOk() + case innerObj.RiskPredictorIPReputation != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorIPReputation.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorIPReputation.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorIPReputation.GetTypeOk() + case innerObj.RiskPredictorUserLocationAnomaly != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorUserLocationAnomaly.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorUserLocationAnomaly.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorUserLocationAnomaly.GetTypeOk() + case innerObj.RiskPredictorUserRiskBehavior != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorUserRiskBehavior.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorUserRiskBehavior.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorUserRiskBehavior.GetTypeOk() + case innerObj.RiskPredictorVelocity != nil: + riskPredictorId, riskPredictorIdOk = innerObj.RiskPredictorVelocity.GetIdOk() + riskPredictorName, riskPredictorNameOk = innerObj.RiskPredictorVelocity.GetNameOk() + riskPredictorType, riskPredictorTypeOk = innerObj.RiskPredictorVelocity.GetTypeOk() + default: + continue + } + + if riskPredictorIdOk && riskPredictorNameOk && riskPredictorTypeOk { + riskPredictorData[*riskPredictorId] = []string{*riskPredictorName, string(*riskPredictorType)} + } + } + + return riskPredictorData, nil +} diff --git a/internal/connector/pingone/protect/resources/risk_predictor_test.go b/internal/connector/pingone/protect/resources/risk_predictor_test.go new file mode 100644 index 00000000..25ad5521 --- /dev/null +++ b/internal/connector/pingone/protect/resources/risk_predictor_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_protect_testable_resources" +) + +func Test_RiskPredictor(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_protect_testable_resources.RiskPredictor(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TYPE], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing risk predictors are generated. test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/pingone_sso_connector.go b/internal/connector/pingone/sso/pingone_sso_connector.go index 670377da..eac1fdc4 100644 --- a/internal/connector/pingone/sso/pingone_sso_connector.go +++ b/internal/connector/pingone/sso/pingone_sso_connector.go @@ -59,7 +59,7 @@ func (c *PingOneSSOConnector) Export(format, outputDir string, overwriteExport b resources.PasswordPolicy(&c.clientInfo), resources.Population(&c.clientInfo), resources.PopulationDefault(&c.clientInfo), - resources.PopulationDefaultIdp(&c.clientInfo), + resources.PopulationDefaultIdentityProvider(&c.clientInfo), resources.Resource(&c.clientInfo), resources.ResourceAttribute(&c.clientInfo), resources.ResourceSecret(&c.clientInfo), diff --git a/internal/connector/pingone/sso/pingone_sso_connector_test.go b/internal/connector/pingone/sso/pingone_sso_connector_test.go index 7bd31faa..f95b440c 100644 --- a/internal/connector/pingone/sso/pingone_sso_connector_test.go +++ b/internal/connector/pingone/sso/pingone_sso_connector_test.go @@ -5,9 +5,9 @@ package sso_test import ( "testing" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" "github.com/pingidentity/pingcli/internal/testing/testutils_terraform" ) @@ -17,144 +17,153 @@ func TestSSOTerraformPlan(t *testing.T) { testutils_terraform.InitPingOneTerraform(t) testCases := []struct { - name string - resource connector.ExportableResource - ignoredErrors []string + name string + testableResource *testutils_resource.TestableResource + ignoredErrors []string }{ { - name: "Application", - resource: resources.Application(clientInfo), - ignoredErrors: nil, + name: "Application", + testableResource: pingone_sso_testable_resources.ApplicationDeviceAuthorization(t, clientInfo), + ignoredErrors: nil, }, { - name: "ApplicationAttributeMapping", - resource: resources.ApplicationAttributeMapping(clientInfo), - ignoredErrors: nil, + name: "ApplicationAttributeMapping", + testableResource: pingone_sso_testable_resources.ApplicationAttributeMapping(t, clientInfo), + ignoredErrors: nil, }, { - name: "ApplicationFlowPolicyAssignment", - resource: resources.ApplicationFlowPolicyAssignment(clientInfo), - ignoredErrors: nil, + name: "ApplicationFlowPolicyAssignment", + testableResource: pingone_sso_testable_resources.ApplicationFlowPolicyAssignment(t, clientInfo), + ignoredErrors: nil, }, { - name: "ApplicationResourceGrant", - resource: resources.ApplicationResourceGrant(clientInfo), - ignoredErrors: nil, + name: "ApplicationResourceGrant", + testableResource: pingone_sso_testable_resources.ApplicationResourceGrant(t, clientInfo), + ignoredErrors: nil, }, { - name: "ApplicationRoleAssignment", - resource: resources.ApplicationRoleAssignment(clientInfo), - ignoredErrors: nil, + name: "ApplicationRoleAssignment", + testableResource: pingone_sso_testable_resources.ApplicationRoleAssignment(t, clientInfo), + ignoredErrors: nil, }, { - name: "ApplicationSecret", - resource: resources.ApplicationSecret(clientInfo), - ignoredErrors: nil, + name: "ApplicationSecret", + testableResource: pingone_sso_testable_resources.ApplicationSecret(t, clientInfo), + ignoredErrors: nil, }, { - name: "ApplicationSignOnPolicyAssignment", - resource: resources.ApplicationSignOnPolicyAssignment(clientInfo), - ignoredErrors: nil, + name: "ApplicationSignOnPolicyAssignment", + testableResource: pingone_sso_testable_resources.ApplicationSignOnPolicyAssignment(t, clientInfo), + ignoredErrors: nil, }, { - name: "Group", - resource: resources.Group(clientInfo), - ignoredErrors: nil, + name: "Group", + testableResource: pingone_sso_testable_resources.Group(t, clientInfo), + ignoredErrors: nil, }, { - name: "GroupNesting", - resource: resources.GroupNesting(clientInfo), - ignoredErrors: nil, + name: "GroupNesting", + testableResource: pingone_sso_testable_resources.GroupNesting(t, clientInfo), + ignoredErrors: nil, }, { - name: "GroupRoleAssignment", - resource: resources.GroupRoleAssignment(clientInfo), - ignoredErrors: nil, + name: "GroupRoleAssignment", + testableResource: pingone_sso_testable_resources.GroupRoleAssignment(t, clientInfo), + ignoredErrors: nil, }, { - name: "IdentityProvider", - resource: resources.IdentityProvider(clientInfo), - ignoredErrors: nil, - }, - { - name: "IdentityProviderAttribute", - resource: resources.IdentityProviderAttribute(clientInfo), - ignoredErrors: nil, - }, - { - name: "PasswordPolicy", - resource: resources.PasswordPolicy(clientInfo), - ignoredErrors: nil, + name: "IdentityProvider", + testableResource: pingone_sso_testable_resources.IdentityProvider(t, clientInfo), + ignoredErrors: []string{ + "Error: Missing Configuration for Required Attribute", + }, }, { - name: "Population", - resource: resources.Population(clientInfo), - ignoredErrors: nil, + name: "IdentityProviderAttribute", + testableResource: pingone_sso_testable_resources.IdentityProviderAttribute(t, clientInfo), + ignoredErrors: nil, }, { - name: "PopulationDefault", - resource: resources.PopulationDefault(clientInfo), - ignoredErrors: nil, + name: "PasswordPolicy", + testableResource: pingone_sso_testable_resources.PasswordPolicy(t, clientInfo), + ignoredErrors: nil, }, { - name: "PopulationDefaultIdp", - resource: resources.PopulationDefaultIdp(clientInfo), - ignoredErrors: nil, + name: "Population", + testableResource: pingone_sso_testable_resources.Population(t, clientInfo), + ignoredErrors: nil, }, { - name: "Resource", - resource: resources.Resource(clientInfo), - ignoredErrors: nil, + name: "PopulationDefault", + testableResource: pingone_sso_testable_resources.PopulationDefault(t, clientInfo), + ignoredErrors: nil, }, { - name: "ResourceAttribute", - resource: resources.ResourceAttribute(clientInfo), - ignoredErrors: nil, + name: "PopulationDefaultIdp", + testableResource: pingone_sso_testable_resources.PopulationDefaultIdentityProvider(t, clientInfo), + ignoredErrors: nil, }, { - name: "ResourceScope", - resource: resources.ResourceScope(clientInfo), - ignoredErrors: nil, + name: "Resource", + testableResource: pingone_sso_testable_resources.Resource(t, clientInfo), + ignoredErrors: nil, }, { - name: "ResourceScopeOpenId", - resource: resources.ResourceScopeOpenId(clientInfo), - ignoredErrors: nil, + name: "ResourceAttribute", + testableResource: pingone_sso_testable_resources.ResourceAttribute(t, clientInfo), + ignoredErrors: nil, }, { - name: "ResourceScopePingOneApi", - resource: resources.ResourceScopePingOneApi(clientInfo), - ignoredErrors: nil, + name: "ResourceScope", + testableResource: pingone_sso_testable_resources.ResourceScope(t, clientInfo), + ignoredErrors: nil, }, { - name: "ResourceSecret", - resource: resources.ResourceSecret(clientInfo), - ignoredErrors: nil, + name: "ResourceScopeOpenId", + testableResource: pingone_sso_testable_resources.ResourceScopeOpenId(t, clientInfo), + ignoredErrors: nil, }, { - name: "SchemaAttribute", - resource: resources.SchemaAttribute(clientInfo), + name: "ResourceScopePingOneApi", + testableResource: pingone_sso_testable_resources.ResourceScopePingOneApi(t, clientInfo), ignoredErrors: []string{ - "Error: Data Loss Protection", + "Error: Invalid Attribute Value Match", }, }, { - name: "SignOnPolicy", - resource: resources.SignOnPolicy(clientInfo), - ignoredErrors: nil, + name: "ResourceSecret", + testableResource: pingone_sso_testable_resources.ResourceSecret(t, clientInfo), + ignoredErrors: nil, }, { - name: "SignOnPolicyAction", - resource: resources.SignOnPolicyAction(clientInfo), + name: "SchemaAttribute", + testableResource: pingone_sso_testable_resources.SchemaAttribute(t, clientInfo), ignoredErrors: []string{ - "Error: Conflicting configuration arguments", + "Error: Data Loss Protection", }, }, + // TODO: Re-enable test after compleition of TRIAGE-26632 + // { + // name: "SignOnPolicy", + // testableResource: pingone_sso_testable_resources.SignOnPolicy(t, clientInfo), + // ignoredErrors: nil, + // }, + // TODO: Re-enable test after compleition of TRIAGE-26632 + // { + // name: "SignOnPolicyAction", + // testableResource: pingone_sso_testable_resources.SignOnPolicyAction(t, clientInfo), + // ignoredErrors: []string{ + // "Error: Conflicting configuration arguments", + // }, + // }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - testutils_terraform.ValidateTerraformPlan(t, tc.resource, tc.ignoredErrors) + tc.testableResource.CreateResource(t) + defer tc.testableResource.DeleteResource(t) + + testutils_terraform.ValidateTerraformPlan(t, tc.testableResource.ExportableResource, tc.ignoredErrors) }) } } diff --git a/internal/connector/pingone/sso/resources/pingone_application.go b/internal/connector/pingone/sso/resources/application.go similarity index 62% rename from internal/connector/pingone/sso/resources/pingone_application.go rename to internal/connector/pingone/sso/resources/application.go index b69830c1..ffb43b85 100644 --- a/internal/connector/pingone/sso/resources/pingone_application.go +++ b/internal/connector/pingone/sso/resources/application.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -43,18 +44,18 @@ func (r *PingOneApplicationResource) ExportAll() (*[]connector.ImportBlock, erro return nil, err } - for appId, appName := range applicationData { + for applicationId, applicationName := range applicationData { commentData := map[string]string{ - "Application ID": appId, - "Application Name": appName, + "Application ID": applicationId, + "Application Name": applicationName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: appName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, appId), + ResourceName: applicationName, + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -68,35 +69,35 @@ func (r *PingOneApplicationResource) getApplicationData() (map[string]string, er applicationData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - applications, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) if err != nil { return nil, err } - for _, app := range applications { + for _, innerObj := range apiObjs { var ( - appId *string - appIdOk bool - appName *string - appNameOk bool + applicationId *string + applicationIdOk bool + applicationName *string + applicationNameOk bool ) switch { - case app.ApplicationOIDC != nil: - appId, appIdOk = app.ApplicationOIDC.GetIdOk() - appName, appNameOk = app.ApplicationOIDC.GetNameOk() - case app.ApplicationSAML != nil: - appId, appIdOk = app.ApplicationSAML.GetIdOk() - appName, appNameOk = app.ApplicationSAML.GetNameOk() - case app.ApplicationExternalLink != nil: - appId, appIdOk = app.ApplicationExternalLink.GetIdOk() - appName, appNameOk = app.ApplicationExternalLink.GetNameOk() + case innerObj.ApplicationOIDC != nil: + applicationId, applicationIdOk = innerObj.ApplicationOIDC.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationOIDC.GetNameOk() + case innerObj.ApplicationSAML != nil: + applicationId, applicationIdOk = innerObj.ApplicationSAML.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationSAML.GetNameOk() + case innerObj.ApplicationExternalLink != nil: + applicationId, applicationIdOk = innerObj.ApplicationExternalLink.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationExternalLink.GetNameOk() default: continue } - if appIdOk && appNameOk { - applicationData[*appId] = *appName + if applicationIdOk && applicationNameOk { + applicationData[*applicationId] = *applicationName } } diff --git a/internal/connector/pingone/sso/resources/pingone_application_attribute_mapping.go b/internal/connector/pingone/sso/resources/application_attribute_mapping.go similarity index 52% rename from internal/connector/pingone/sso/resources/pingone_application_attribute_mapping.go rename to internal/connector/pingone/sso/resources/application_attribute_mapping.go index ef6c7b2d..336bfdda 100644 --- a/internal/connector/pingone/sso/resources/pingone_application_attribute_mapping.go +++ b/internal/connector/pingone/sso/resources/application_attribute_mapping.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -43,26 +44,26 @@ func (r *PingOneApplicationAttributeMappingResource) ExportAll() (*[]connector.I return nil, err } - for appId, appName := range applicationData { - applicationAttributeMappingData, err := r.getApplicationAttributeMappingData(appId) + for applicationId, applicationName := range applicationData { + applicationAttributeMappingData, err := r.getApplicationAttributeMappingData(applicationId) if err != nil { return nil, err } - for attributeMappingId, attributeMappingName := range applicationAttributeMappingData { + for applicationAttributeMappingId, applicationAttributeMappingName := range applicationAttributeMappingData { commentData := map[string]string{ - "Application ID": appId, - "Application Name": appName, - "Attribute Mapping ID": attributeMappingId, - "Attribute Mapping Name": attributeMappingName, - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), + "Application ID": applicationId, + "Application Name": applicationName, + "Application Attribute Mapping ID": applicationAttributeMappingId, + "Application Attribute Mapping Name": applicationAttributeMappingName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", appName, attributeMappingName), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, appId, attributeMappingId), + ResourceName: fmt.Sprintf("%s_%s", applicationName, applicationAttributeMappingName), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationId, applicationAttributeMappingId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -77,54 +78,54 @@ func (r *PingOneApplicationAttributeMappingResource) getApplicationData() (map[s applicationData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - applications, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) if err != nil { return nil, err } - for _, app := range applications { + for _, innerObj := range apiObjs { var ( - appId *string - appIdOk bool - appName *string - appNameOk bool + applicationId *string + applicationIdOk bool + applicationName *string + applicationNameOk bool ) switch { - case app.ApplicationOIDC != nil: - appId, appIdOk = app.ApplicationOIDC.GetIdOk() - appName, appNameOk = app.ApplicationOIDC.GetNameOk() - case app.ApplicationSAML != nil: - appId, appIdOk = app.ApplicationSAML.GetIdOk() - appName, appNameOk = app.ApplicationSAML.GetNameOk() + case innerObj.ApplicationOIDC != nil: + applicationId, applicationIdOk = innerObj.ApplicationOIDC.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationOIDC.GetNameOk() + case innerObj.ApplicationSAML != nil: + applicationId, applicationIdOk = innerObj.ApplicationSAML.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationSAML.GetNameOk() default: continue } - if appIdOk && appNameOk { - applicationData[*appId] = *appName + if applicationIdOk && applicationNameOk { + applicationData[*applicationId] = *applicationName } } return applicationData, nil } -func (r *PingOneApplicationAttributeMappingResource) getApplicationAttributeMappingData(appId string) (map[string]string, error) { +func (r *PingOneApplicationAttributeMappingResource) getApplicationAttributeMappingData(applicationId string) (map[string]string, error) { applicationAttributeMappingData := make(map[string]string) - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationAttributeMappingApi.ReadAllApplicationAttributeMappings(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, appId).Execute() - attributeMappingInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedAttributesInner](iter, "ReadAllApplicationAttributeMappings", "GetAttributes", r.ResourceType()) + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationAttributeMappingApi.ReadAllApplicationAttributeMappings(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, applicationId).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedAttributesInner](iter, "ReadAllApplicationAttributeMappings", "GetAttributes", r.ResourceType()) if err != nil { return nil, err } - for _, attributeMappingInner := range attributeMappingInners { - if attributeMappingInner.ApplicationAttributeMapping != nil { - attributeMappingId, attributeMappingIdOk := attributeMappingInner.ApplicationAttributeMapping.GetIdOk() - attributeMappingName, attributeMappingNameOk := attributeMappingInner.ApplicationAttributeMapping.GetNameOk() + for _, innerObj := range apiObjs { + if innerObj.ApplicationAttributeMapping != nil { + applicationAttributeMappingId, applicationAttributeMappingIdOk := innerObj.ApplicationAttributeMapping.GetIdOk() + applicationAttributeMappingName, applicationAttributeMappingNameOk := innerObj.ApplicationAttributeMapping.GetNameOk() - if attributeMappingIdOk && attributeMappingNameOk { - applicationAttributeMappingData[*attributeMappingId] = *attributeMappingName + if applicationAttributeMappingIdOk && applicationAttributeMappingNameOk { + applicationAttributeMappingData[*applicationAttributeMappingId] = *applicationAttributeMappingName } } } diff --git a/internal/connector/pingone/sso/resources/application_attribute_mapping_test.go b/internal/connector/pingone/sso/resources/application_attribute_mapping_test.go new file mode 100644 index 00000000..7467aea3 --- /dev/null +++ b/internal/connector/pingone/sso/resources/application_attribute_mapping_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_ApplicationAttributeMapping(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ApplicationAttributeMapping(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + applicationTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing application attribute mappings are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_application_flow_policy_assignment.go b/internal/connector/pingone/sso/resources/application_flow_policy_assignment.go similarity index 51% rename from internal/connector/pingone/sso/resources/pingone_application_flow_policy_assignment.go rename to internal/connector/pingone/sso/resources/application_flow_policy_assignment.go index 75b39d6a..bb257cd3 100644 --- a/internal/connector/pingone/sso/resources/pingone_application_flow_policy_assignment.go +++ b/internal/connector/pingone/sso/resources/application_flow_policy_assignment.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -43,34 +44,35 @@ func (r *PingOneApplicationFlowPolicyAssignmentResource) ExportAll() (*[]connect return nil, err } - for appId, appName := range applicationData { - flowPolicyAssignmentData, err := r.getFlowPolicyAssignmentData(appId) + for applicationId, applicationName := range applicationData { + applicationFlowPolicyAssignmentData, err := r.getApplicationFlowPolicyAssignmentData(applicationId) if err != nil { return nil, err } - for flowPolicyAssignmentId, flowPolicyId := range flowPolicyAssignmentData { - flowPolicyName, flowPolicyNameOk, err := r.getFlowPolicyName(flowPolicyId) + for applicationFlowPolicyAssignmentId, applicationFlowPolicyAssignmentFlowPolicyId := range applicationFlowPolicyAssignmentData { + flowPolicyName, flowPolicyNameOk, err := r.getFlowPolicyName(applicationFlowPolicyAssignmentFlowPolicyId) if err != nil { return nil, err } + if !flowPolicyNameOk { continue } commentData := map[string]string{ - "Application ID": appId, - "Application Name": appName, - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Flow Policy Assignment ID": flowPolicyAssignmentId, - "Flow Policy Name": flowPolicyName, - "Resource Type": r.ResourceType(), + "Application ID": applicationId, + "Application Name": applicationName, + "Application Flow Policy Assignment ID": applicationFlowPolicyAssignmentId, + "Application Flow Policy Assignment Flow Policy Name": flowPolicyName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", appName, flowPolicyName), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, appId, flowPolicyAssignmentId), + ResourceName: fmt.Sprintf("%s_%s", applicationName, flowPolicyName), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationId, applicationFlowPolicyAssignmentId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -85,64 +87,64 @@ func (r *PingOneApplicationFlowPolicyAssignmentResource) getApplicationData() (m applicationData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - applications, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) if err != nil { return nil, err } - for _, app := range applications { + for _, innerObj := range apiObjs { var ( - appId *string - appIdOk bool - appName *string - appNameOk bool + applicationId *string + applicationIdOk bool + applicationName *string + applicationNameOk bool ) switch { - case app.ApplicationOIDC != nil: - appId, appIdOk = app.ApplicationOIDC.GetIdOk() - appName, appNameOk = app.ApplicationOIDC.GetNameOk() - case app.ApplicationSAML != nil: - appId, appIdOk = app.ApplicationSAML.GetIdOk() - appName, appNameOk = app.ApplicationSAML.GetNameOk() - case app.ApplicationExternalLink != nil: - appId, appIdOk = app.ApplicationExternalLink.GetIdOk() - appName, appNameOk = app.ApplicationExternalLink.GetNameOk() + case innerObj.ApplicationOIDC != nil: + applicationId, applicationIdOk = innerObj.ApplicationOIDC.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationOIDC.GetNameOk() + case innerObj.ApplicationSAML != nil: + applicationId, applicationIdOk = innerObj.ApplicationSAML.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationSAML.GetNameOk() + case innerObj.ApplicationExternalLink != nil: + applicationId, applicationIdOk = innerObj.ApplicationExternalLink.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationExternalLink.GetNameOk() default: continue } - if appIdOk && appNameOk { - applicationData[*appId] = *appName + if applicationIdOk && applicationNameOk { + applicationData[*applicationId] = *applicationName } } return applicationData, nil } -func (r *PingOneApplicationFlowPolicyAssignmentResource) getFlowPolicyAssignmentData(appId string) (map[string]string, error) { - flowPolicyAssignmentData := make(map[string]string) +func (r *PingOneApplicationFlowPolicyAssignmentResource) getApplicationFlowPolicyAssignmentData(applicationId string) (map[string]string, error) { + applicationFlowPolicyAssignmentData := make(map[string]string) - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationFlowPolicyAssignmentsApi.ReadAllFlowPolicyAssignments(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, appId).Execute() - flowPolicyAssignments, err := pingone.GetManagementAPIObjectsFromIterator[management.FlowPolicyAssignment](iter, "ReadAllFlowPolicyAssignments", "GetFlowPolicyAssignments", r.ResourceType()) + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationFlowPolicyAssignmentsApi.ReadAllFlowPolicyAssignments(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, applicationId).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.FlowPolicyAssignment](iter, "ReadAllFlowPolicyAssignments", "GetFlowPolicyAssignments", r.ResourceType()) if err != nil { return nil, err } - for _, flowPolicyAssignment := range flowPolicyAssignments { - flowPolicyAssignmentId, flowPolicyAssignmentIdOk := flowPolicyAssignment.GetIdOk() - flowPolicyAssignmentFlowPolicy, flowPolicyAssignmentFlowPolicyOk := flowPolicyAssignment.GetFlowPolicyOk() + for _, applicationFlowPolicyAssignment := range apiObjs { + applicationFlowPolicyAssignmentId, applicationFlowPolicyAssignmentIdOk := applicationFlowPolicyAssignment.GetIdOk() + applicationFlowPolicyAssignmentFlowPolicy, applicationFlowPolicyAssignmentFlowPolicyOk := applicationFlowPolicyAssignment.GetFlowPolicyOk() - if flowPolicyAssignmentIdOk && flowPolicyAssignmentFlowPolicyOk { - flowPolicyId, flowPolicyIdOk := flowPolicyAssignmentFlowPolicy.GetIdOk() + if applicationFlowPolicyAssignmentIdOk && applicationFlowPolicyAssignmentFlowPolicyOk { + applicationFlowPolicyAssignmentFlowPolicyId, applicationFlowPolicyAssignmentFlowPolicyIdOk := applicationFlowPolicyAssignmentFlowPolicy.GetIdOk() - if flowPolicyIdOk { - flowPolicyAssignmentData[*flowPolicyAssignmentId] = *flowPolicyId + if applicationFlowPolicyAssignmentFlowPolicyIdOk { + applicationFlowPolicyAssignmentData[*applicationFlowPolicyAssignmentId] = *applicationFlowPolicyAssignmentFlowPolicyId } } } - return flowPolicyAssignmentData, nil + return applicationFlowPolicyAssignmentData, nil } func (r *PingOneApplicationFlowPolicyAssignmentResource) getFlowPolicyName(flowPolicyId string) (string, bool, error) { diff --git a/internal/connector/pingone/sso/resources/application_flow_policy_assignment_test.go b/internal/connector/pingone/sso/resources/application_flow_policy_assignment_test.go new file mode 100644 index 00000000..2621257b --- /dev/null +++ b/internal/connector/pingone/sso/resources/application_flow_policy_assignment_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_ApplicationFlowPolicyAssignment(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ApplicationFlowPolicyAssignment(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + applicationTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing application flow policy assignments are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/application_resource_grant.go b/internal/connector/pingone/sso/resources/application_resource_grant.go new file mode 100644 index 00000000..7a6d605a --- /dev/null +++ b/internal/connector/pingone/sso/resources/application_resource_grant.go @@ -0,0 +1,174 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneApplicationResourceGrantResource{} +) + +type PingOneApplicationResourceGrantResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneApplicationResourceGrantResource +func ApplicationResourceGrant(clientInfo *connector.ClientInfo) *PingOneApplicationResourceGrantResource { + return &PingOneApplicationResourceGrantResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneApplicationResourceGrantResource) ResourceType() string { + return "pingone_application_resource_grant" +} + +func (r *PingOneApplicationResourceGrantResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + applicationData, err := r.getApplicationData() + if err != nil { + return nil, err + } + + for applicationId, applicationName := range applicationData { + applicationResourceGrantData, err := r.getApplicationResourceGrantData(applicationId) + if err != nil { + return nil, err + } + + for applicationResourceGrantId, applicationResourceGrantResourceId := range applicationResourceGrantData { + resourceName, resourceNameOk, err := r.getGrantResourceName(applicationResourceGrantResourceId) + if err != nil { + return nil, err + } + + if !resourceNameOk { + continue + } + + commentData := map[string]string{ + "Application ID": applicationId, + "Application Name": applicationName, + "Application Resource Grant ID": applicationResourceGrantId, + "Application Resource Grant Resource Name": resourceName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", applicationName, resourceName), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationId, applicationResourceGrantId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + } + + return &importBlocks, nil +} + +func (r *PingOneApplicationResourceGrantResource) getApplicationData() (map[string]string, error) { + applicationData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, innerObj := range apiObjs { + var ( + applicationId *string + applicationIdOk bool + applicationName *string + applicationNameOk bool + ) + + switch { + case innerObj.ApplicationPingOnePortal != nil: + applicationId, applicationIdOk = innerObj.ApplicationPingOnePortal.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationPingOnePortal.GetNameOk() + case innerObj.ApplicationPingOneSelfService != nil: + applicationId, applicationIdOk = innerObj.ApplicationPingOneSelfService.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationPingOneSelfService.GetNameOk() + case innerObj.ApplicationExternalLink != nil: + applicationId, applicationIdOk = innerObj.ApplicationExternalLink.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationExternalLink.GetNameOk() + case innerObj.ApplicationOIDC != nil: + applicationId, applicationIdOk = innerObj.ApplicationOIDC.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationOIDC.GetNameOk() + case innerObj.ApplicationSAML != nil: + applicationId, applicationIdOk = innerObj.ApplicationSAML.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationSAML.GetNameOk() + default: + continue + } + + if applicationIdOk && applicationNameOk { + applicationData[*applicationId] = *applicationName + } + } + + return applicationData, nil +} + +func (r *PingOneApplicationResourceGrantResource) getApplicationResourceGrantData(applicationId string) (map[string]string, error) { + applicationResourceGrantData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationResourceGrantsApi.ReadAllApplicationGrants(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, applicationId).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ApplicationResourceGrant](iter, "ReadAllApplicationGrants", "GetGrants", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, applicationResourceGrant := range apiObjs { + applicationResourceGrantId, applicationResourceGrantIdOk := applicationResourceGrant.GetIdOk() + applicationResourceGrantResource, applicationResourceGrantResourceOk := applicationResourceGrant.GetResourceOk() + + if applicationResourceGrantIdOk && applicationResourceGrantResourceOk { + applicationResourceGrantResourceId, applicationResourceGrantResourceIdOk := applicationResourceGrantResource.GetIdOk() + + if applicationResourceGrantResourceIdOk { + applicationResourceGrantData[*applicationResourceGrantId] = *applicationResourceGrantResourceId + } + } + } + + return applicationResourceGrantData, nil +} + +func (r *PingOneApplicationResourceGrantResource) getGrantResourceName(grantResourceId string) (string, bool, error) { + resource, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadOneResource(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, grantResourceId).Execute() + ok, err := common.HandleClientResponse(response, err, "ReadOneResource", r.ResourceType()) + if err != nil { + return "", false, err + } + if !ok { + return "", false, nil + } + + if resource != nil { + resourceName, resourceNameOk := resource.GetNameOk() + if resourceNameOk { + return *resourceName, true, nil + } + } + + return "", false, fmt.Errorf("unable to get resource name for grant resource ID: %s", grantResourceId) +} diff --git a/internal/connector/pingone/sso/resources/application_resource_grant_test.go b/internal/connector/pingone/sso/resources/application_resource_grant_test.go new file mode 100644 index 00000000..5e26bbdc --- /dev/null +++ b/internal/connector/pingone/sso/resources/application_resource_grant_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_ApplicationResourceGrant(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ApplicationResourceGrant(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + applicationTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing application grants are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/application_role_assignment.go b/internal/connector/pingone/sso/resources/application_role_assignment.go new file mode 100644 index 00000000..fe22ee9b --- /dev/null +++ b/internal/connector/pingone/sso/resources/application_role_assignment.go @@ -0,0 +1,183 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneApplicationRoleAssignmentResource{} +) + +type PingOneApplicationRoleAssignmentResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneApplicationRoleAssignmentResource +func ApplicationRoleAssignment(clientInfo *connector.ClientInfo) *PingOneApplicationRoleAssignmentResource { + return &PingOneApplicationRoleAssignmentResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneApplicationRoleAssignmentResource) ResourceType() string { + return "pingone_application_role_assignment" +} + +func (r *PingOneApplicationRoleAssignmentResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + applicationData, err := r.getApplicationData() + if err != nil { + return nil, err + } + + for applicationId, applicationName := range applicationData { + applicationRoleAssignmentData, err := r.getApplicationRoleAssignmentData(applicationId) + if err != nil { + return nil, err + } + + for applicationRoleAssignmentId, applicationRoleAssignmentRoleId := range applicationRoleAssignmentData { + applicationRoleAssignmentRoleName, applicationRoleAssignmentRoleNameOk, err := r.getRoleName(applicationRoleAssignmentRoleId) + if err != nil { + return nil, err + } + + if !applicationRoleAssignmentRoleNameOk { + continue + } + + commentData := map[string]string{ + "Application ID": applicationId, + "Application Name": applicationName, + "Application Role Assignment ID": applicationRoleAssignmentId, + "Application Role Assignment Role Name": applicationRoleAssignmentRoleId, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s_%s", applicationName, string(applicationRoleAssignmentRoleName), applicationRoleAssignmentId), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationId, applicationRoleAssignmentId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + } + + return &importBlocks, nil +} + +func (r *PingOneApplicationRoleAssignmentResource) getApplicationData() (map[string]string, error) { + applicationData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, innerObj := range apiObjs { + var ( + applicationId *string + applicationIdOk bool + applicationName *string + applicationNameOk bool + applicationAccessControlRole *management.ApplicationAccessControlRole + applicationAccessControlRoleOk bool + ) + + switch { + case innerObj.ApplicationOIDC != nil: + applicationId, applicationIdOk = innerObj.ApplicationOIDC.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationOIDC.GetNameOk() + if innerObj.ApplicationOIDC.AccessControl != nil { + applicationAccessControlRole, applicationAccessControlRoleOk = innerObj.ApplicationOIDC.AccessControl.GetRoleOk() + } + case innerObj.ApplicationSAML != nil: + applicationId, applicationIdOk = innerObj.ApplicationSAML.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationSAML.GetNameOk() + if innerObj.ApplicationSAML.AccessControl != nil { + applicationAccessControlRole, applicationAccessControlRoleOk = innerObj.ApplicationSAML.AccessControl.GetRoleOk() + } + case innerObj.ApplicationExternalLink != nil: + applicationId, applicationIdOk = innerObj.ApplicationExternalLink.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationExternalLink.GetNameOk() + if innerObj.ApplicationExternalLink.AccessControl != nil { + applicationAccessControlRole, applicationAccessControlRoleOk = innerObj.ApplicationExternalLink.AccessControl.GetRoleOk() + } + default: + continue + } + + if applicationIdOk && applicationNameOk && applicationAccessControlRoleOk { + if applicationAccessControlRole.GetType() != management.ENUMAPPLICATIONACCESSCONTROLTYPE_ADMIN_USERS_ONLY { + continue + } + + applicationData[*applicationId] = *applicationName + } + } + + return applicationData, nil +} + +func (r *PingOneApplicationRoleAssignmentResource) getApplicationRoleAssignmentData(applicationId string) (map[string]string, error) { + applicationRoleAssignmentData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationRoleAssignmentsApi.ReadApplicationRoleAssignments(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, applicationId).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.RoleAssignment](iter, "ReadApplicationRoleAssignments", "GetRoleAssignments", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, applicationRoleAssignment := range apiObjs { + applicationRoleAssignmentId, applicationRoleAssignmentIdOk := applicationRoleAssignment.GetIdOk() + applicationRoleAssignmentRole, applicationRoleAssignmentRoleOk := applicationRoleAssignment.GetRoleOk() + + if applicationRoleAssignmentIdOk && applicationRoleAssignmentRoleOk { + applicationRoleAssignmentRoleId, applicationRoleAssignmentRoleIdOk := applicationRoleAssignmentRole.GetIdOk() + + if applicationRoleAssignmentRoleIdOk { + applicationRoleAssignmentData[*applicationRoleAssignmentId] = *applicationRoleAssignmentRoleId + } + } + } + + return applicationRoleAssignmentData, nil +} + +func (r *PingOneApplicationRoleAssignmentResource) getRoleName(roleId string) (management.EnumRoleName, bool, error) { + apiRole, resp, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.RolesApi.ReadOneRole(r.clientInfo.PingOneContext, roleId).Execute() + ok, err := common.HandleClientResponse(resp, err, "ReadOneRole", r.ResourceType()) + if err != nil { + return "", false, err + } + if !ok { + return "", false, nil + } + + if apiRole != nil { + apiRoleName, apiRoleNameOk := apiRole.GetNameOk() + if apiRoleNameOk { + return *apiRoleName, true, nil + } + } + + return "", false, fmt.Errorf("unable to get role name for role ID: %s", roleId) +} diff --git a/internal/connector/pingone/sso/resources/application_role_assignment_test.go b/internal/connector/pingone/sso/resources/application_role_assignment_test.go new file mode 100644 index 00000000..2efec77c --- /dev/null +++ b/internal/connector/pingone/sso/resources/application_role_assignment_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_ApplicationRoleAssignment(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ApplicationRoleAssignment(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + applicationTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s_%s", applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Worker App used for SDK auth has additional role assignments. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_application_secret.go b/internal/connector/pingone/sso/resources/application_secret.go similarity index 85% rename from internal/connector/pingone/sso/resources/pingone_application_secret.go rename to internal/connector/pingone/sso/resources/application_secret.go index 3a8be944..51454977 100644 --- a/internal/connector/pingone/sso/resources/pingone_application_secret.go +++ b/internal/connector/pingone/sso/resources/application_secret.go @@ -1,9 +1,12 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources import ( + "errors" "fmt" + "net/http" "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/pingidentity/pingcli/internal/connector" @@ -44,8 +47,8 @@ func (r *PingOneApplicationSecretResource) ExportAll() (*[]connector.ImportBlock return nil, err } - for appId, appName := range applicationData { - ok, err := r.checkApplicationSecretData(appId) + for applicationId, applicationName := range applicationData { + ok, err := r.checkApplicationSecretData(applicationId) if err != nil { return nil, err } @@ -55,16 +58,16 @@ func (r *PingOneApplicationSecretResource) ExportAll() (*[]connector.ImportBlock } commentData := map[string]string{ - "Application ID": appId, - "Application Name": appName, - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Application ID": applicationId, + "Application Name": applicationName, "Resource Type": r.ResourceType(), + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_secret", appName), - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, appId), + ResourceName: fmt.Sprintf("%s_secret", applicationName), + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -113,15 +116,20 @@ func (r *PingOneApplicationSecretResource) getApplicationData() (map[string]stri return applicationData, nil } -func (r *PingOneApplicationSecretResource) checkApplicationSecretData(appId string) (bool, error) { +func (r *PingOneApplicationSecretResource) checkApplicationSecretData(applicationId string) (b bool, err error) { // The platform enforces that worker apps cannot read their own secret // Make sure we can read the secret before adding it to the import blocks - _, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationSecretApi.ReadApplicationSecret(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, appId).Execute() - defer response.Body.Close() + _, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationSecretApi.ReadApplicationSecret(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, applicationId).Execute() + defer func() { + cErr := response.Body.Close() + if cErr != nil { + err = errors.Join(err, cErr) + } + }() // If the appId is the same as the worker ID, make sure the API response is a 403 and ignore the error - if appId == r.clientInfo.PingOneApiClientId { - if response.StatusCode == 403 { + if applicationId == r.clientInfo.PingOneApiClientId { + if response.StatusCode == http.StatusForbidden { return false, nil } else { return false, fmt.Errorf("error: Expected 403 Forbidden response - worker apps cannot read their own secret\n%s Response Code: %s\nResponse Body: %s", "ReadApplicationSecret", response.Status, response.Body) @@ -132,11 +140,12 @@ func (r *PingOneApplicationSecretResource) checkApplicationSecretData(appId stri // Expected behavior in this case is to skip the resource, and continue exporting the other resources if err != nil || response.StatusCode >= 300 || response.StatusCode < 200 { output.Warn("Failed to read secret for application", map[string]interface{}{ - "Application ID": appId, + "Application ID": applicationId, "API Function Name": "ReadApplicationSecret", "Response Code": response.Status, "Response Body": response.Body, }) + return false, nil } diff --git a/internal/connector/pingone/sso/resources/application_secret_test.go b/internal/connector/pingone/sso/resources/application_secret_test.go new file mode 100644 index 00000000..30ef16c3 --- /dev/null +++ b/internal/connector/pingone/sso/resources/application_secret_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_ApplicationSecret(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ApplicationSecret(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + applicationTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_secret", applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing application secrets are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_application_sign_on_policy_assignment.go b/internal/connector/pingone/sso/resources/application_sign_on_policy_assignment.go similarity index 50% rename from internal/connector/pingone/sso/resources/pingone_application_sign_on_policy_assignment.go rename to internal/connector/pingone/sso/resources/application_sign_on_policy_assignment.go index c1ef1827..0c8085ea 100644 --- a/internal/connector/pingone/sso/resources/pingone_application_sign_on_policy_assignment.go +++ b/internal/connector/pingone/sso/resources/application_sign_on_policy_assignment.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -43,34 +44,35 @@ func (r *PingOneApplicationSignOnPolicyAssignmentResource) ExportAll() (*[]conne return nil, err } - for appId, appName := range applicationData { - signOnPolicyAssignmentData, err := r.getApplicationSignOnPolicyAssignmentData(appId) + for applicationId, applicationName := range applicationData { + applicationSignOnPolicyAssignmentData, err := r.getApplicationSignOnPolicyAssignmentData(applicationId) if err != nil { return nil, err } - for signOnPolicyAssignmentId, signOnPolicyId := range signOnPolicyAssignmentData { - signOnPolicyName, signOnPolicyNameOk, err := r.getSignOnPolicyName(signOnPolicyId) + for applicationSignOnPolicyAssignmentId, applicationSignOnPolicyAssignmentSignOnPolicyId := range applicationSignOnPolicyAssignmentData { + applicationSignOnPolicyAssignmentName, applicationSignOnPolicyAssignmentNameOk, err := r.getSignOnPolicyName(applicationSignOnPolicyAssignmentSignOnPolicyId) if err != nil { return nil, err } - if !signOnPolicyNameOk { + + if !applicationSignOnPolicyAssignmentNameOk { continue } commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "Application ID": appId, - "Application Name": appName, - "Application Sign-On Policy Assignment ID": signOnPolicyAssignmentId, - "Application Sign-On Policy Name": signOnPolicyName, - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Application ID": applicationId, + "Application Name": applicationName, + "Application Sign On Policy Assignment ID": applicationSignOnPolicyAssignmentId, + "Application Sign On Policy Assignment Sign On Policy Name": applicationSignOnPolicyAssignmentName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", appName, signOnPolicyName), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, appId, signOnPolicyAssignmentId), + ResourceName: fmt.Sprintf("%s_%s", applicationName, applicationSignOnPolicyAssignmentName), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, applicationId, applicationSignOnPolicyAssignmentId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -85,64 +87,64 @@ func (r *PingOneApplicationSignOnPolicyAssignmentResource) getApplicationData() applicationData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - applications, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) if err != nil { return nil, err } - for _, app := range applications { + for _, innerObj := range apiObjs { var ( - appId *string - appIdOk bool - appName *string - appNameOk bool + applicationId *string + applicationIdOk bool + applicationName *string + applicationNameOk bool ) switch { - case app.ApplicationOIDC != nil: - appId, appIdOk = app.ApplicationOIDC.GetIdOk() - appName, appNameOk = app.ApplicationOIDC.GetNameOk() - case app.ApplicationSAML != nil: - appId, appIdOk = app.ApplicationSAML.GetIdOk() - appName, appNameOk = app.ApplicationSAML.GetNameOk() - case app.ApplicationExternalLink != nil: - appId, appIdOk = app.ApplicationExternalLink.GetIdOk() - appName, appNameOk = app.ApplicationExternalLink.GetNameOk() + case innerObj.ApplicationOIDC != nil: + applicationId, applicationIdOk = innerObj.ApplicationOIDC.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationOIDC.GetNameOk() + case innerObj.ApplicationSAML != nil: + applicationId, applicationIdOk = innerObj.ApplicationSAML.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationSAML.GetNameOk() + case innerObj.ApplicationExternalLink != nil: + applicationId, applicationIdOk = innerObj.ApplicationExternalLink.GetIdOk() + applicationName, applicationNameOk = innerObj.ApplicationExternalLink.GetNameOk() default: continue } - if appIdOk && appNameOk { - applicationData[*appId] = *appName + if applicationIdOk && applicationNameOk { + applicationData[*applicationId] = *applicationName } } return applicationData, nil } -func (r *PingOneApplicationSignOnPolicyAssignmentResource) getApplicationSignOnPolicyAssignmentData(appId string) (map[string]string, error) { - signOnPolicyAssignmentData := make(map[string]string) +func (r *PingOneApplicationSignOnPolicyAssignmentResource) getApplicationSignOnPolicyAssignmentData(applicationId string) (map[string]string, error) { + applicationSignOnPolicyAssignmentData := make(map[string]string) - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationSignOnPolicyAssignmentsApi.ReadAllSignOnPolicyAssignments(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, appId).Execute() - signOnPolicyAssignments, err := pingone.GetManagementAPIObjectsFromIterator[management.SignOnPolicyAssignment](iter, "ReadAllSignOnPolicyAssignments", "GetSignOnPolicyAssignments", r.ResourceType()) + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationSignOnPolicyAssignmentsApi.ReadAllSignOnPolicyAssignments(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, applicationId).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.SignOnPolicyAssignment](iter, "ReadAllSignOnPolicyAssignments", "GetSignOnPolicyAssignments", r.ResourceType()) if err != nil { return nil, err } - for _, signOnPolicyAssignment := range signOnPolicyAssignments { - signOnPolicyAssignmentId, signOnPolicyAssignmentIdOk := signOnPolicyAssignment.GetIdOk() - signOnPolicyAssignmentSignOnPolicy, signOnPolicyAssignmentSignOnPolicyOk := signOnPolicyAssignment.GetSignOnPolicyOk() + for _, applicationSignOnPolicyAssignment := range apiObjs { + applicationSignOnPolicyAssignmentId, applicationSignOnPolicyAssignmentIdOk := applicationSignOnPolicyAssignment.GetIdOk() + applicationSignOnPolicyAssignmentSignOnPolicy, applicationSignOnPolicyAssignmentSignOnPolicyOk := applicationSignOnPolicyAssignment.GetSignOnPolicyOk() - if signOnPolicyAssignmentIdOk && signOnPolicyAssignmentSignOnPolicyOk { - signOnPolicyAssignmentSignOnPolicyId, signOnPolicyAssignmentSignOnPolicyIdOk := signOnPolicyAssignmentSignOnPolicy.GetIdOk() + if applicationSignOnPolicyAssignmentIdOk && applicationSignOnPolicyAssignmentSignOnPolicyOk { + applicationSignOnPolicyAssignmentSignOnPolicyId, applicationSignOnPolicyAssignmentSignOnPolicyIdOk := applicationSignOnPolicyAssignmentSignOnPolicy.GetIdOk() - if signOnPolicyAssignmentSignOnPolicyIdOk { - signOnPolicyAssignmentData[*signOnPolicyAssignmentId] = *signOnPolicyAssignmentSignOnPolicyId + if applicationSignOnPolicyAssignmentSignOnPolicyIdOk { + applicationSignOnPolicyAssignmentData[*applicationSignOnPolicyAssignmentId] = *applicationSignOnPolicyAssignmentSignOnPolicyId } } } - return signOnPolicyAssignmentData, nil + return applicationSignOnPolicyAssignmentData, nil } func (r *PingOneApplicationSignOnPolicyAssignmentResource) getSignOnPolicyName(signOnPolicyId string) (string, bool, error) { diff --git a/internal/connector/pingone/sso/resources/application_sign_on_policy_assignment_test.go b/internal/connector/pingone/sso/resources/application_sign_on_policy_assignment_test.go new file mode 100644 index 00000000..e7d0f9aa --- /dev/null +++ b/internal/connector/pingone/sso/resources/application_sign_on_policy_assignment_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_ApplicationSignOnPolicyAssignment(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ApplicationSignOnPolicyAssignment(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + applicationTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, applicationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/application_test.go b/internal/connector/pingone/sso/resources/application_test.go new file mode 100644 index 00000000..fb084e71 --- /dev/null +++ b/internal/connector/pingone/sso/resources/application_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_Application(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ApplicationDeviceAuthorization(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing applications are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_group.go b/internal/connector/pingone/sso/resources/group.go similarity index 91% rename from internal/connector/pingone/sso/resources/pingone_group.go rename to internal/connector/pingone/sso/resources/group.go index f67363c4..7fb0b51a 100644 --- a/internal/connector/pingone/sso/resources/pingone_group.go +++ b/internal/connector/pingone/sso/resources/group.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -45,9 +46,9 @@ func (r *PingOneGroupResource) ExportAll() (*[]connector.ImportBlock, error) { for groupId, groupName := range groupData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Group ID": groupId, "Group Name": groupName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } @@ -68,12 +69,12 @@ func (r *PingOneGroupResource) getGroupData() (map[string]string, error) { groupData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.GroupsApi.ReadAllGroups(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - groups, err := pingone.GetManagementAPIObjectsFromIterator[management.Group](iter, "ReadAllGroups", "GetGroups", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Group](iter, "ReadAllGroups", "GetGroups", r.ResourceType()) if err != nil { return nil, err } - for _, group := range groups { + for _, group := range apiObjs { groupId, groupIdOk := group.GetIdOk() groupName, groupNameOk := group.GetNameOk() diff --git a/internal/connector/pingone/sso/resources/pingone_group_nesting.go b/internal/connector/pingone/sso/resources/group_nesting.go similarity index 71% rename from internal/connector/pingone/sso/resources/pingone_group_nesting.go rename to internal/connector/pingone/sso/resources/group_nesting.go index 23c1a0dc..03709d2d 100644 --- a/internal/connector/pingone/sso/resources/pingone_group_nesting.go +++ b/internal/connector/pingone/sso/resources/group_nesting.go @@ -43,8 +43,8 @@ func (r *PingOneGroupNestingResource) ExportAll() (*[]connector.ImportBlock, err return nil, err } - for parentGroupId, parentGroupName := range groupData { - groupNestingData, err := r.getGroupNestingData(parentGroupId) + for groupId, groupName := range groupData { + groupNestingData, err := r.getGroupNestingData(groupId) if err != nil { return nil, err } @@ -54,15 +54,15 @@ func (r *PingOneGroupNestingResource) ExportAll() (*[]connector.ImportBlock, err "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Nested Group ID": nestedGroupId, "Nested Group Name": nestedGroupName, - "Parent Group ID": parentGroupId, - "Parent Group Name": parentGroupName, + "Parent Group ID": groupId, + "Parent Group Name": groupName, "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", parentGroupName, nestedGroupName), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, parentGroupId, nestedGroupId), + ResourceName: fmt.Sprintf("%s_%s", groupName, nestedGroupName), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, groupId, nestedGroupId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -77,33 +77,33 @@ func (r *PingOneGroupNestingResource) getGroupData() (map[string]string, error) groupData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.GroupsApi.ReadAllGroups(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - groups, err := pingone.GetManagementAPIObjectsFromIterator[management.Group](iter, "ReadAllGroups", "GetGroups", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Group](iter, "ReadAllGroups", "GetGroups", r.ResourceType()) if err != nil { return nil, err } - for _, parentGroup := range groups { - parentGroupId, parentGroupIdOk := parentGroup.GetIdOk() - parentGroupName, parentGroupNameOk := parentGroup.GetNameOk() + for _, group := range apiObjs { + groupId, groupIdOk := group.GetIdOk() + groupName, groupNameOk := group.GetNameOk() - if parentGroupIdOk && parentGroupNameOk { - groupData[*parentGroupId] = *parentGroupName + if groupIdOk && groupNameOk { + groupData[*groupId] = *groupName } } return groupData, nil } -func (r *PingOneGroupNestingResource) getGroupNestingData(parentGroupId string) (map[string]string, error) { +func (r *PingOneGroupNestingResource) getGroupNestingData(groupId string) (map[string]string, error) { groupNestingData := make(map[string]string) - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.GroupsApi.ReadGroupNesting(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, parentGroupId).Execute() - groupNestings, err := pingone.GetManagementAPIObjectsFromIterator[management.GroupMembership](iter, "ReadGroupNesting", "GetGroupMemberships", r.ResourceType()) + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.GroupsApi.ReadGroupNesting(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, groupId).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.GroupMembership](iter, "ReadGroupNesting", "GetGroupMemberships", r.ResourceType()) if err != nil { return nil, err } - for _, nestedGroup := range groupNestings { + for _, nestedGroup := range apiObjs { nestedGroupId, nestedGroupIdOk := nestedGroup.GetIdOk() nestedGroupName, nestedGroupNameOk := nestedGroup.GetNameOk() diff --git a/internal/connector/pingone/sso/resources/group_nesting_test.go b/internal/connector/pingone/sso/resources/group_nesting_test.go new file mode 100644 index 00000000..a9b45043 --- /dev/null +++ b/internal/connector/pingone/sso/resources/group_nesting_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_GroupNesting(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.GroupNesting(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + groupTr := tr.Dependencies[0] + nestedGroupTr := tr.Dependencies[1] + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", groupTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], nestedGroupTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, groupTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_group_role_assignment.go b/internal/connector/pingone/sso/resources/group_role_assignment.go similarity index 74% rename from internal/connector/pingone/sso/resources/pingone_group_role_assignment.go rename to internal/connector/pingone/sso/resources/group_role_assignment.go index cc5413b2..a2f519ea 100644 --- a/internal/connector/pingone/sso/resources/pingone_group_role_assignment.go +++ b/internal/connector/pingone/sso/resources/group_role_assignment.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -49,27 +50,28 @@ func (r *PingOneGroupRoleAssignmentResource) ExportAll() (*[]connector.ImportBlo return nil, err } - for groupRoleAssignmentId, roleId := range groupRoleAssignmentData { - roleName, err := r.getRoleName(roleId) + for groupRoleAssignmentId, groupRoleAssignmentRoleId := range groupRoleAssignmentData { + groupRoleAssignmentRoleName, groupRoleAssignmentRoleNameOk, err := r.getRoleName(groupRoleAssignmentRoleId) if err != nil { return nil, err } - if roleName == nil { + + if !groupRoleAssignmentRoleNameOk { continue } commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Group ID": groupId, - "Group Name": groupName, - "Group Role Assignment ID": groupRoleAssignmentId, - "Group Role Name": string(*roleName), - "Resource Type": r.ResourceType(), + "Group ID": groupId, + "Group Name": groupName, + "Group Role Assignment ID": groupRoleAssignmentId, + "Group Role Assignment Role Name": string(*groupRoleAssignmentRoleName), + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s_%s", groupName, string(*roleName), groupRoleAssignmentId), + ResourceName: fmt.Sprintf("%s_%s_%s", groupName, string(*groupRoleAssignmentRoleName), groupRoleAssignmentId), ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, groupId, groupRoleAssignmentId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -85,12 +87,12 @@ func (r *PingOneGroupRoleAssignmentResource) getGroupData() (map[string]string, groupData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.GroupsApi.ReadAllGroups(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - groups, err := pingone.GetManagementAPIObjectsFromIterator[management.Group](iter, "ReadAllGroups", "GetGroups", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Group](iter, "ReadAllGroups", "GetGroups", r.ResourceType()) if err != nil { return nil, err } - for _, group := range groups { + for _, group := range apiObjs { groupId, groupIdOk := group.GetIdOk() groupName, groupNameOk := group.GetNameOk() @@ -106,12 +108,12 @@ func (r *PingOneGroupRoleAssignmentResource) getGroupRoleAssignmentData(groupId groupRoleAssignmentData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.GroupRoleAssignmentsApi.ReadGroupRoleAssignments(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, groupId).Execute() - roleAssignments, err := pingone.GetManagementAPIObjectsFromIterator[management.RoleAssignment](iter, "ReadGroupRoleAssignments", "GetRoleAssignments", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.RoleAssignment](iter, "ReadGroupRoleAssignments", "GetRoleAssignments", r.ResourceType()) if err != nil { return nil, err } - for _, groupRoleAssignment := range roleAssignments { + for _, groupRoleAssignment := range apiObjs { groupRoleAssignmentId, groupRoleAssignmentIdOk := groupRoleAssignment.GetIdOk() groupRoleAssignmentRole, groupRoleAssignmentRoleOk := groupRoleAssignment.GetRoleOk() @@ -127,22 +129,22 @@ func (r *PingOneGroupRoleAssignmentResource) getGroupRoleAssignmentData(groupId return groupRoleAssignmentData, nil } -func (r *PingOneGroupRoleAssignmentResource) getRoleName(roleId string) (*management.EnumRoleName, error) { +func (r *PingOneGroupRoleAssignmentResource) getRoleName(roleId string) (*management.EnumRoleName, bool, error) { apiRole, resp, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.RolesApi.ReadOneRole(r.clientInfo.PingOneContext, roleId).Execute() ok, err := common.HandleClientResponse(resp, err, "ReadOneRole", r.ResourceType()) if err != nil { - return nil, err + return nil, false, err } if !ok { - return nil, nil + return nil, false, nil } if apiRole != nil { apiRoleName, apiRoleNameOk := apiRole.GetNameOk() if apiRoleNameOk { - return apiRoleName, nil + return apiRoleName, true, nil } } - return nil, fmt.Errorf("unable to get role name for role ID: %s", roleId) + return nil, false, fmt.Errorf("unable to get role name for role ID: %s", roleId) } diff --git a/internal/connector/pingone/sso/resources/group_role_assignment_test.go b/internal/connector/pingone/sso/resources/group_role_assignment_test.go new file mode 100644 index 00000000..418fb565 --- /dev/null +++ b/internal/connector/pingone/sso/resources/group_role_assignment_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_GroupRoleAssignment(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.GroupRoleAssignment(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + groupTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s_%s", groupTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, groupTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/group_test.go b/internal/connector/pingone/sso/resources/group_test.go new file mode 100644 index 00000000..eaae4596 --- /dev/null +++ b/internal/connector/pingone/sso/resources/group_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_Group(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.Group(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_identity_provider.go b/internal/connector/pingone/sso/resources/identity_provider.go similarity index 50% rename from internal/connector/pingone/sso/resources/pingone_identity_provider.go rename to internal/connector/pingone/sso/resources/identity_provider.go index 83d888b2..80e99e6c 100644 --- a/internal/connector/pingone/sso/resources/pingone_identity_provider.go +++ b/internal/connector/pingone/sso/resources/identity_provider.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -43,18 +44,18 @@ func (r *PingOneIdentityProviderResource) ExportAll() (*[]connector.ImportBlock, return nil, err } - for idpId, idpName := range identityProviderData { + for identityProviderId, identityProviderName := range identityProviderData { commentData := map[string]string{ + "Identity Provider ID": identityProviderId, + "Identity Provider Name": identityProviderName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Identity Provider ID": idpId, - "Identity Provider Name": idpName, "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), - ResourceName: idpName, - ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, idpId), + ResourceName: identityProviderName, + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.PingOneExportEnvironmentID, identityProviderId), CommentInformation: common.GenerateCommentInformation(commentData), } @@ -68,44 +69,44 @@ func (r *PingOneIdentityProviderResource) getIdentityProviderData() (map[string] identityProviderData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.IdentityProvidersApi.ReadAllIdentityProviders(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - identityProviders, err := pingone.GetManagementAPIObjectsFromIterator[management.IdentityProvider](iter, "ReadAllIdentityProviders", "GetIdentityProviders", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.IdentityProvider](iter, "ReadAllIdentityProviders", "GetIdentityProviders", r.ResourceType()) if err != nil { return nil, err } - for _, idp := range identityProviders { + for _, innerObj := range apiObjs { var ( - idpId *string - idpIdOk bool - idpName *string - idpNameOk bool + identityProviderId *string + identityProviderIdOk bool + identityProviderName *string + identityProviderNameOk bool ) switch { - case idp.IdentityProviderApple != nil: - idpId, idpIdOk = idp.IdentityProviderApple.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderApple.GetNameOk() - case idp.IdentityProviderClientIDClientSecret != nil: - idpId, idpIdOk = idp.IdentityProviderClientIDClientSecret.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderClientIDClientSecret.GetNameOk() - case idp.IdentityProviderFacebook != nil: - idpId, idpIdOk = idp.IdentityProviderFacebook.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderFacebook.GetNameOk() - case idp.IdentityProviderOIDC != nil: - idpId, idpIdOk = idp.IdentityProviderOIDC.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderOIDC.GetNameOk() - case idp.IdentityProviderPaypal != nil: - idpId, idpIdOk = idp.IdentityProviderPaypal.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderPaypal.GetNameOk() - case idp.IdentityProviderSAML != nil: - idpId, idpIdOk = idp.IdentityProviderSAML.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderSAML.GetNameOk() + case innerObj.IdentityProviderApple != nil: + identityProviderId, identityProviderIdOk = innerObj.IdentityProviderApple.GetIdOk() + identityProviderName, identityProviderNameOk = innerObj.IdentityProviderApple.GetNameOk() + case innerObj.IdentityProviderClientIDClientSecret != nil: + identityProviderId, identityProviderIdOk = innerObj.IdentityProviderClientIDClientSecret.GetIdOk() + identityProviderName, identityProviderNameOk = innerObj.IdentityProviderClientIDClientSecret.GetNameOk() + case innerObj.IdentityProviderFacebook != nil: + identityProviderId, identityProviderIdOk = innerObj.IdentityProviderFacebook.GetIdOk() + identityProviderName, identityProviderNameOk = innerObj.IdentityProviderFacebook.GetNameOk() + case innerObj.IdentityProviderOIDC != nil: + identityProviderId, identityProviderIdOk = innerObj.IdentityProviderOIDC.GetIdOk() + identityProviderName, identityProviderNameOk = innerObj.IdentityProviderOIDC.GetNameOk() + case innerObj.IdentityProviderPaypal != nil: + identityProviderId, identityProviderIdOk = innerObj.IdentityProviderPaypal.GetIdOk() + identityProviderName, identityProviderNameOk = innerObj.IdentityProviderPaypal.GetNameOk() + case innerObj.IdentityProviderSAML != nil: + identityProviderId, identityProviderIdOk = innerObj.IdentityProviderSAML.GetIdOk() + identityProviderName, identityProviderNameOk = innerObj.IdentityProviderSAML.GetNameOk() default: continue } - if idpIdOk && idpNameOk { - identityProviderData[*idpId] = *idpName + if identityProviderIdOk && identityProviderNameOk { + identityProviderData[*identityProviderId] = *identityProviderName } } diff --git a/internal/connector/pingone/sso/resources/identity_provider_attribute.go b/internal/connector/pingone/sso/resources/identity_provider_attribute.go new file mode 100644 index 00000000..b9604e29 --- /dev/null +++ b/internal/connector/pingone/sso/resources/identity_provider_attribute.go @@ -0,0 +1,146 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneIdentityProviderAttributeResource{} +) + +type PingOneIdentityProviderAttributeResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneIdentityProviderAttributeResource +func IdentityProviderAttribute(clientInfo *connector.ClientInfo) *PingOneIdentityProviderAttributeResource { + return &PingOneIdentityProviderAttributeResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneIdentityProviderAttributeResource) ResourceType() string { + return "pingone_identity_provider_attribute" +} + +func (r *PingOneIdentityProviderAttributeResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + providerData, err := r.getProviderData() + if err != nil { + return nil, err + } + + for providerId, providerName := range providerData { + identityProviderAttributeData, err := r.getIdentityProviderAttributeData(providerId) + if err != nil { + return nil, err + } + + for identityProviderAttributeId, identityProviderAttributeName := range identityProviderAttributeData { + commentData := map[string]string{ + "Identity Provider ID": providerId, + "Identity Provider Name": providerName, + "Identity Provider Attribute ID": identityProviderAttributeId, + "Identity Provider Attribute Name": identityProviderAttributeName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", providerName, identityProviderAttributeName), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, providerId, identityProviderAttributeId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + } + + return &importBlocks, nil +} + +func (r *PingOneIdentityProviderAttributeResource) getProviderData() (map[string]string, error) { + providerData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.IdentityProvidersApi.ReadAllIdentityProviders(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.IdentityProvider](iter, "ReadAllIdentityProviders", "GetIdentityProviders", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, innerObj := range apiObjs { + var ( + providerId *string + providerIdOk bool + providerName *string + providerNameOk bool + ) + + switch { + case innerObj.IdentityProviderApple != nil: + providerId, providerIdOk = innerObj.IdentityProviderApple.GetIdOk() + providerName, providerNameOk = innerObj.IdentityProviderApple.GetNameOk() + case innerObj.IdentityProviderClientIDClientSecret != nil: + providerId, providerIdOk = innerObj.IdentityProviderClientIDClientSecret.GetIdOk() + providerName, providerNameOk = innerObj.IdentityProviderClientIDClientSecret.GetNameOk() + case innerObj.IdentityProviderFacebook != nil: + providerId, providerIdOk = innerObj.IdentityProviderFacebook.GetIdOk() + providerName, providerNameOk = innerObj.IdentityProviderFacebook.GetNameOk() + case innerObj.IdentityProviderOIDC != nil: + providerId, providerIdOk = innerObj.IdentityProviderOIDC.GetIdOk() + providerName, providerNameOk = innerObj.IdentityProviderOIDC.GetNameOk() + case innerObj.IdentityProviderPaypal != nil: + providerId, providerIdOk = innerObj.IdentityProviderPaypal.GetIdOk() + providerName, providerNameOk = innerObj.IdentityProviderPaypal.GetNameOk() + case innerObj.IdentityProviderSAML != nil: + providerId, providerIdOk = innerObj.IdentityProviderSAML.GetIdOk() + providerName, providerNameOk = innerObj.IdentityProviderSAML.GetNameOk() + default: + continue + } + + if providerIdOk && providerNameOk { + providerData[*providerId] = *providerName + } + } + + return providerData, nil +} + +func (r *PingOneIdentityProviderAttributeResource) getIdentityProviderAttributeData(providerId string) (map[string]string, error) { + identityProviderAttributeData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.IdentityProviderAttributesApi.ReadAllIdentityProviderAttributes(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, providerId).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedAttributesInner](iter, "ReadAllIdentityProviderAttributes", "GetAttributes", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, innerObj := range apiObjs { + if innerObj.IdentityProviderAttribute != nil { + identityProviderAttributeId, identityProviderAttributeIdOk := innerObj.IdentityProviderAttribute.GetIdOk() + identityProviderAttributeName, identityProviderAttributeNameOk := innerObj.IdentityProviderAttribute.GetNameOk() + + if identityProviderAttributeIdOk && identityProviderAttributeNameOk { + identityProviderAttributeData[*identityProviderAttributeId] = *identityProviderAttributeName + } + } + } + + return identityProviderAttributeData, nil +} diff --git a/internal/connector/pingone/sso/resources/identity_provider_attribute_test.go b/internal/connector/pingone/sso/resources/identity_provider_attribute_test.go new file mode 100644 index 00000000..653bcc6f --- /dev/null +++ b/internal/connector/pingone/sso/resources/identity_provider_attribute_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_IdentityProviderAttribute(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.IdentityProviderAttribute(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + providerTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", providerTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, providerTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing attributes are generated, test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/identity_provider_test.go b/internal/connector/pingone/sso/resources/identity_provider_test.go new file mode 100644 index 00000000..5709f673 --- /dev/null +++ b/internal/connector/pingone/sso/resources/identity_provider_test.go @@ -0,0 +1,33 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_IdentityProvider(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.IdentityProvider(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_password_policy.go b/internal/connector/pingone/sso/resources/password_policy.go similarity index 91% rename from internal/connector/pingone/sso/resources/pingone_password_policy.go rename to internal/connector/pingone/sso/resources/password_policy.go index 78a8885c..cd65da2d 100644 --- a/internal/connector/pingone/sso/resources/pingone_password_policy.go +++ b/internal/connector/pingone/sso/resources/password_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -45,9 +46,9 @@ func (r *PingOnePasswordPolicyResource) ExportAll() (*[]connector.ImportBlock, e for passwordPolicyId, passwordPolicyName := range passwordPolicyData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Password Policy ID": passwordPolicyId, "Password Policy Name": passwordPolicyName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } @@ -68,12 +69,12 @@ func (r *PingOnePasswordPolicyResource) getPasswordPolicyData() (map[string]stri passwordPolicyData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.PasswordPoliciesApi.ReadAllPasswordPolicies(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - passwordPolicies, err := pingone.GetManagementAPIObjectsFromIterator[management.PasswordPolicy](iter, "ReadAllPasswordPolicies", "GetPasswordPolicies", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.PasswordPolicy](iter, "ReadAllPasswordPolicies", "GetPasswordPolicies", r.ResourceType()) if err != nil { return nil, err } - for _, passwordPolicy := range passwordPolicies { + for _, passwordPolicy := range apiObjs { passwordPolicyId, passwordPolicyIdOk := passwordPolicy.GetIdOk() passwordPolicyName, passwordPolicyNameOk := passwordPolicy.GetNameOk() diff --git a/internal/connector/pingone/sso/resources/password_policy_test.go b/internal/connector/pingone/sso/resources/password_policy_test.go new file mode 100644 index 00000000..d534594f --- /dev/null +++ b/internal/connector/pingone/sso/resources/password_policy_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_PasswordPolicy(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.PasswordPolicy(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing password policies are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_application_attribute_mapping_test.go b/internal/connector/pingone/sso/resources/pingone_application_attribute_mapping_test.go deleted file mode 100644 index 82738a26..00000000 --- a/internal/connector/pingone/sso/resources/pingone_application_attribute_mapping_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestApplicationAttributeMappingExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ApplicationAttributeMapping(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_application_attribute_mapping", - ResourceName: "Example OAuth App_sub", - ResourceID: fmt.Sprintf("%s/2a7c1b5d-415b-4fb5-a6c0-1e290f776785/f6d41400-e571-432e-9151-4ff06e0b51ce", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_attribute_mapping", - ResourceName: "Getting Started Application_sub", - ResourceID: fmt.Sprintf("%s/3da7aae6-92e5-4295-a37c-8515d1f2cd86/f6d41400-e571-432e-9151-4ff06e0b51ce", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_attribute_mapping", - ResourceName: "OAuth Worker App_sub", - ResourceID: fmt.Sprintf("%s/9d6c443b-6329-4d3c-949e-880eda3b9599/f6d41400-e571-432e-9151-4ff06e0b51ce", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_attribute_mapping", - ResourceName: "PingOne DaVinci Connection_sub", - ResourceID: fmt.Sprintf("%s/7b621870-7124-4426-b432-6c675642afcb/f6d41400-e571-432e-9151-4ff06e0b51ce", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_attribute_mapping", - ResourceName: "test app_sub", - ResourceID: fmt.Sprintf("%s/a4cbf57e-fa2c-452f-bbc8-f40b551da0e2/f6d41400-e571-432e-9151-4ff06e0b51ce", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_attribute_mapping", - ResourceName: "Worker App_sub", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/f6d41400-e571-432e-9151-4ff06e0b51ce", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_attribute_mapping", - ResourceName: "Test MFA_sub", - ResourceID: fmt.Sprintf("%s/11cfc8c7-ec0c-43ff-b49a-64f5e243f932/f6d41400-e571-432e-9151-4ff06e0b51ce", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_application_flow_policy_assignment_test.go b/internal/connector/pingone/sso/resources/pingone_application_flow_policy_assignment_test.go deleted file mode 100644 index e6f2558a..00000000 --- a/internal/connector/pingone/sso/resources/pingone_application_flow_policy_assignment_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestApplicationFlowPolicyAssignmentExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ApplicationFlowPolicyAssignment(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_application_flow_policy_assignment", - ResourceName: "Getting Started Application_PingOne - Sign On and Registration", - ResourceID: fmt.Sprintf("%s/3da7aae6-92e5-4295-a37c-8515d1f2cd86/0b08c0c3-db40-4be2-aa5b-eb0e17396a75", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_flow_policy_assignment", - ResourceName: "test app_PingOne - Sign On and Registration", - ResourceID: fmt.Sprintf("%s/a4cbf57e-fa2c-452f-bbc8-f40b551da0e2/87a6045e-fa59-41fd-9a06-867ef8cc7a0c", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_application_resource_grant.go b/internal/connector/pingone/sso/resources/pingone_application_resource_grant.go deleted file mode 100644 index 572ec74b..00000000 --- a/internal/connector/pingone/sso/resources/pingone_application_resource_grant.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/management" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingOneApplicationResourceGrantResource{} -) - -type PingOneApplicationResourceGrantResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingOneApplicationResourceGrantResource -func ApplicationResourceGrant(clientInfo *connector.ClientInfo) *PingOneApplicationResourceGrantResource { - return &PingOneApplicationResourceGrantResource{ - clientInfo: clientInfo, - } -} - -func (r *PingOneApplicationResourceGrantResource) ResourceType() string { - return "pingone_application_resource_grant" -} - -func (r *PingOneApplicationResourceGrantResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - applicationData, err := r.getApplicationData() - if err != nil { - return nil, err - } - - for appId, appName := range applicationData { - applicationGrantData, err := r.getApplicationGrantData(appId) - if err != nil { - return nil, err - } - - for grantId, grantResourceId := range applicationGrantData { - resourceName, resourceNameOk, err := r.getGrantResourceName(grantResourceId) - if err != nil { - return nil, err - } - if !resourceNameOk { - continue - } - - commentData := map[string]string{ - "Application ID": appId, - "Application Name": appName, - "Application Resource Grant ID": grantId, - "Application Resource Name": resourceName, - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", appName, resourceName), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, appId, grantId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - } - - return &importBlocks, nil -} - -func (r *PingOneApplicationResourceGrantResource) getApplicationData() (map[string]string, error) { - applicationData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - applications, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, app := range applications { - var ( - appId *string - appIdOk bool - appName *string - appNameOk bool - ) - - switch { - case app.ApplicationPingOnePortal != nil: - appId, appIdOk = app.ApplicationPingOnePortal.GetIdOk() - appName, appNameOk = app.ApplicationPingOnePortal.GetNameOk() - case app.ApplicationPingOneSelfService != nil: - appId, appIdOk = app.ApplicationPingOneSelfService.GetIdOk() - appName, appNameOk = app.ApplicationPingOneSelfService.GetNameOk() - case app.ApplicationExternalLink != nil: - appId, appIdOk = app.ApplicationExternalLink.GetIdOk() - appName, appNameOk = app.ApplicationExternalLink.GetNameOk() - default: - continue - } - - if appIdOk && appNameOk { - applicationData[*appId] = *appName - } - } - - return applicationData, nil -} - -func (r *PingOneApplicationResourceGrantResource) getApplicationGrantData(appId string) (map[string]string, error) { - applicationGrantData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationResourceGrantsApi.ReadAllApplicationGrants(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, appId).Execute() - applicationGrants, err := pingone.GetManagementAPIObjectsFromIterator[management.ApplicationResourceGrant](iter, "ReadAllApplicationGrants", "GetGrants", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, grant := range applicationGrants { - grantId, grantIdOk := grant.GetIdOk() - grantResource, grantResourceOk := grant.GetResourceOk() - - if grantIdOk && grantResourceOk { - grantResourceId, grantResourceIdOk := grantResource.GetIdOk() - - if grantResourceIdOk { - applicationGrantData[*grantId] = *grantResourceId - } - } - } - - return applicationGrantData, nil -} - -func (r *PingOneApplicationResourceGrantResource) getGrantResourceName(grantResourceId string) (string, bool, error) { - resource, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadOneResource(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, grantResourceId).Execute() - ok, err := common.HandleClientResponse(response, err, "ReadOneResource", r.ResourceType()) - if err != nil { - return "", false, err - } - if !ok { - return "", false, nil - } - - if resource != nil { - resourceName, resourceNameOk := resource.GetNameOk() - if resourceNameOk { - return *resourceName, true, nil - } - } - - return "", false, fmt.Errorf("unable to get resource name for grant resource ID: %s", grantResourceId) -} diff --git a/internal/connector/pingone/sso/resources/pingone_application_resource_grant_test.go b/internal/connector/pingone/sso/resources/pingone_application_resource_grant_test.go deleted file mode 100644 index 70c88366..00000000 --- a/internal/connector/pingone/sso/resources/pingone_application_resource_grant_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestApplicationResourceGrantExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ApplicationResourceGrant(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_application_resource_grant", - ResourceName: "PingOne Application Portal_openid", - ResourceID: fmt.Sprintf("%s/92a3765c-e135-4afa-8b12-4469672ac8a9/7e1e25cd-a29e-43b3-bf4a-317ffaabb49c", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_resource_grant", - ResourceName: "PingOne Application Portal_PingOne API", - ResourceID: fmt.Sprintf("%s/92a3765c-e135-4afa-8b12-4469672ac8a9/cf7c2b8e-718c-4ccc-ad1e-1612724baf8e", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_resource_grant", - ResourceName: "PingOne Self-Service - MyAccount_PingOne API", - ResourceID: fmt.Sprintf("%s/4ce54d01-5138-4c56-8175-4f02f69278f5/78d28a77-127d-434b-ae30-71bc18c97902", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_resource_grant", - ResourceName: "PingOne Self-Service - MyAccount_openid", - ResourceID: fmt.Sprintf("%s/4ce54d01-5138-4c56-8175-4f02f69278f5/88063562-7b01-4dbc-b638-119435f74860", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_application_role_assignment.go b/internal/connector/pingone/sso/resources/pingone_application_role_assignment.go deleted file mode 100644 index ab27b2fc..00000000 --- a/internal/connector/pingone/sso/resources/pingone_application_role_assignment.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/management" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingOneApplicationRoleAssignmentResource{} -) - -type PingOneApplicationRoleAssignmentResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingOneApplicationRoleAssignmentResource -func ApplicationRoleAssignment(clientInfo *connector.ClientInfo) *PingOneApplicationRoleAssignmentResource { - return &PingOneApplicationRoleAssignmentResource{ - clientInfo: clientInfo, - } -} - -func (r *PingOneApplicationRoleAssignmentResource) ResourceType() string { - return "pingone_application_role_assignment" -} - -func (r *PingOneApplicationRoleAssignmentResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - applicationData, err := r.getApplicationData() - if err != nil { - return nil, err - } - - for appId, appName := range applicationData { - applicationRoleAssignmentData, err := r.getApplicationRoleAssignmentData(appId) - if err != nil { - return nil, err - } - - for roleAssignmentId, roleId := range applicationRoleAssignmentData { - roleName, roleNameOk, err := r.getRoleName(roleId) - if err != nil { - return nil, err - } - if !roleNameOk { - continue - } - - commentData := map[string]string{ - "Application ID": appId, - "Application Name": appName, - "Application Role Assignment ID": roleAssignmentId, - "Application Role Name": string(roleName), - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s_%s", appName, string(roleName), roleAssignmentId), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, appId, roleAssignmentId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - } - - return &importBlocks, nil -} - -func (r *PingOneApplicationRoleAssignmentResource) getApplicationData() (map[string]string, error) { - applicationData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.ReadAllApplications(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - applications, err := pingone.GetManagementAPIObjectsFromIterator[management.ReadOneApplication200Response](iter, "ReadAllApplications", "GetApplications", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, app := range applications { - var ( - appId *string - appIdOk bool - appName *string - appNameOk bool - appAccessControlRole *management.ApplicationAccessControlRole - appAccessControlRoleOk bool - ) - - switch { - case app.ApplicationOIDC != nil: - appId, appIdOk = app.ApplicationOIDC.GetIdOk() - appName, appNameOk = app.ApplicationOIDC.GetNameOk() - if app.ApplicationOIDC.AccessControl != nil { - appAccessControlRole, appAccessControlRoleOk = app.ApplicationOIDC.AccessControl.GetRoleOk() - } - case app.ApplicationSAML != nil: - appId, appIdOk = app.ApplicationSAML.GetIdOk() - appName, appNameOk = app.ApplicationSAML.GetNameOk() - if app.ApplicationSAML.AccessControl != nil { - appAccessControlRole, appAccessControlRoleOk = app.ApplicationSAML.AccessControl.GetRoleOk() - } - case app.ApplicationExternalLink != nil: - appId, appIdOk = app.ApplicationExternalLink.GetIdOk() - appName, appNameOk = app.ApplicationExternalLink.GetNameOk() - if app.ApplicationExternalLink.AccessControl != nil { - appAccessControlRole, appAccessControlRoleOk = app.ApplicationExternalLink.AccessControl.GetRoleOk() - } - default: - continue - } - - if appIdOk && appNameOk && appAccessControlRoleOk { - if appAccessControlRole.GetType() != management.ENUMAPPLICATIONACCESSCONTROLTYPE_ADMIN_USERS_ONLY { - continue - } - - applicationData[*appId] = *appName - } - } - - return applicationData, nil -} - -func (r *PingOneApplicationRoleAssignmentResource) getApplicationRoleAssignmentData(appId string) (map[string]string, error) { - applicationRoleAssignmentData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationRoleAssignmentsApi.ReadApplicationRoleAssignments(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, appId).Execute() - applicationRoleAssignments, err := pingone.GetManagementAPIObjectsFromIterator[management.RoleAssignment](iter, "ReadApplicationRoleAssignments", "GetRoleAssignments", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, roleAssignment := range applicationRoleAssignments { - roleAssignmentId, roleAssignmentIdOk := roleAssignment.GetIdOk() - roleAssignmentRole, roleAssignmentRoleOk := roleAssignment.GetRoleOk() - - if roleAssignmentIdOk && roleAssignmentRoleOk { - roleAssignmentRoleId, roleAssignmentRoleIdOk := roleAssignmentRole.GetIdOk() - - if roleAssignmentRoleIdOk { - applicationRoleAssignmentData[*roleAssignmentId] = *roleAssignmentRoleId - } - } - } - - return applicationRoleAssignmentData, nil -} - -func (r *PingOneApplicationRoleAssignmentResource) getRoleName(roleId string) (management.EnumRoleName, bool, error) { - apiRole, resp, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.RolesApi.ReadOneRole(r.clientInfo.PingOneContext, roleId).Execute() - ok, err := common.HandleClientResponse(resp, err, "ReadOneRole", r.ResourceType()) - if err != nil { - return "", false, err - } - if !ok { - return "", false, nil - } - - if apiRole != nil { - apiRoleName, apiRoleNameOk := apiRole.GetNameOk() - if apiRoleNameOk { - return *apiRoleName, true, nil - } - } - - return "", false, fmt.Errorf("unable to get role name for role ID: %s", roleId) -} diff --git a/internal/connector/pingone/sso/resources/pingone_application_role_assignment_test.go b/internal/connector/pingone/sso/resources/pingone_application_role_assignment_test.go deleted file mode 100644 index f33f3cb9..00000000 --- a/internal/connector/pingone/sso/resources/pingone_application_role_assignment_test.go +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestApplicationRoleAssignmentExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ApplicationRoleAssignment(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "OAuth Worker App_PingFederate Crypto Administrator_d4aa4aec-c521-4538-ab76-8776355d2b22", - ResourceID: fmt.Sprintf("%s/9d6c443b-6329-4d3c-949e-880eda3b9599/d4aa4aec-c521-4538-ab76-8776355d2b22", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "OAuth Worker App_PingFederate User Administrator_9f431f95-8df7-43cb-8419-e2b3898ca8c4", - ResourceID: fmt.Sprintf("%s/9d6c443b-6329-4d3c-949e-880eda3b9599/9f431f95-8df7-43cb-8419-e2b3898ca8c4", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "OAuth Worker App_PingFederate Administrator_28607a1f-b0b3-4c43-8807-4bf8a93c8d07", - ResourceID: fmt.Sprintf("%s/9d6c443b-6329-4d3c-949e-880eda3b9599/28607a1f-b0b3-4c43-8807-4bf8a93c8d07", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "OAuth Worker App_PingFederate Expression Administrator_cbd5b6a0-1748-4ca6-b252-e02fd843897e", - ResourceID: fmt.Sprintf("%s/9d6c443b-6329-4d3c-949e-880eda3b9599/cbd5b6a0-1748-4ca6-b252-e02fd843897e", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "PingOne DaVinci Connection_Identity Data Admin_4331fc1a-434c-4cee-ba2a-ceb57974550c", - ResourceID: fmt.Sprintf("%s/7b621870-7124-4426-b432-6c675642afcb/4331fc1a-434c-4cee-ba2a-ceb57974550c", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "PingOne DaVinci Connection_DaVinci Admin_ebcdd4c7-0014-4eb5-9aa9-15af45795c15", - ResourceID: fmt.Sprintf("%s/7b621870-7124-4426-b432-6c675642afcb/ebcdd4c7-0014-4eb5-9aa9-15af45795c15", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "PingOne DaVinci Connection_Environment Admin_9e1d7f96-c4a9-49d3-bb2d-d2b1fef197dd", - ResourceID: fmt.Sprintf("%s/7b621870-7124-4426-b432-6c675642afcb/9e1d7f96-c4a9-49d3-bb2d-d2b1fef197dd", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Identity Data Admin_9225c10f-b902-4107-8aba-b15b219d6c0e", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/9225c10f-b902-4107-8aba-b15b219d6c0e", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Client Application Developer_0081f0ab-d02c-4718-b10c-35fd48b82f47", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/0081f0ab-d02c-4718-b10c-35fd48b82f47", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Identity Data Read Only_a0f34409-4d1b-4b22-911a-7b4a61ac68b1", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/a0f34409-4d1b-4b22-911a-7b4a61ac68b1", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Identity Data Admin_970667f1-26d5-4021-809f-e5d17fe44a7d", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/970667f1-26d5-4021-809f-e5d17fe44a7d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Client Application Developer_785b582f-eaf2-4a0b-ac8e-b7c7f9665762", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/785b582f-eaf2-4a0b-ac8e-b7c7f9665762", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Identity Data Read Only_91562725-239b-4854-8cef-c4efe35ea77f", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/91562725-239b-4854-8cef-c4efe35ea77f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Identity Data Admin_ed54c262-38ab-4874-a206-2d13e34f21fd", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/ed54c262-38ab-4874-a206-2d13e34f21fd", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Client Application Developer_3f112aa9-b712-4388-821d-8f37a429b071", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/3f112aa9-b712-4388-821d-8f37a429b071", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Identity Data Read Only_1395d969-6527-45f4-b356-4ef36a5d6349", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/1395d969-6527-45f4-b356-4ef36a5d6349", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_PingFederate Crypto Administrator_c01ef5c4-74c4-4074-8929-b0836aa9a783", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/c01ef5c4-74c4-4074-8929-b0836aa9a783", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_DaVinci Admin_9bdbe295-e199-4952-8717-3405112eccad", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/9bdbe295-e199-4952-8717-3405112eccad", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Organization Admin_b57756a8-d9c6-4fbc-95d4-9d2aabf801e0", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/b57756a8-d9c6-4fbc-95d4-9d2aabf801e0", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Environment Admin_3e77cca6-8820-4eb6-bcfd-761cf4e74ad1", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/3e77cca6-8820-4eb6-bcfd-761cf4e74ad1", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_PingFederate User Administrator_6600fad1-82c4-412f-aa2c-22e8668d8c3a", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/6600fad1-82c4-412f-aa2c-22e8668d8c3a", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_Configuration Read Only_6f01ea75-5e04-45a5-8614-186b58f9eb4e", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/6f01ea75-5e04-45a5-8614-186b58f9eb4e", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_PingFederate Auditor_cf1edf79-fd13-4d72-a049-7bdc4377ee0c", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/cf1edf79-fd13-4d72-a049-7bdc4377ee0c", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_PingFederate Administrator_530824c1-675f-4282-8a61-6567fc3afee6", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/530824c1-675f-4282-8a61-6567fc3afee6", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_DaVinci Admin Read Only_e82d85ed-8687-4724-87ad-7f138cdbe673", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/e82d85ed-8687-4724-87ad-7f138cdbe673", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_role_assignment", - ResourceName: "Worker App_PingFederate Expression Administrator_c090f7c9-4419-447b-8316-baf3e70030bc", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57/c090f7c9-4419-447b-8316-baf3e70030bc", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_application_secret_test.go b/internal/connector/pingone/sso/resources/pingone_application_secret_test.go deleted file mode 100644 index b25018a1..00000000 --- a/internal/connector/pingone/sso/resources/pingone_application_secret_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestApplicationSecretExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ApplicationSecret(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_application_secret", - ResourceName: "Example OAuth App_secret", - ResourceID: fmt.Sprintf("%s/2a7c1b5d-415b-4fb5-a6c0-1e290f776785", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_secret", - ResourceName: "Getting Started Application_secret", - ResourceID: fmt.Sprintf("%s/3da7aae6-92e5-4295-a37c-8515d1f2cd86", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_secret", - ResourceName: "OAuth Worker App_secret", - ResourceID: fmt.Sprintf("%s/9d6c443b-6329-4d3c-949e-880eda3b9599", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_secret", - ResourceName: "PingOne DaVinci Connection_secret", - ResourceID: fmt.Sprintf("%s/7b621870-7124-4426-b432-6c675642afcb", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_secret", - ResourceName: "test app_secret", - ResourceID: fmt.Sprintf("%s/a4cbf57e-fa2c-452f-bbc8-f40b551da0e2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application_secret", - ResourceName: "Test MFA_secret", - ResourceID: fmt.Sprintf("%s/11cfc8c7-ec0c-43ff-b49a-64f5e243f932", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_application_sign_on_policy_assignment_test.go b/internal/connector/pingone/sso/resources/pingone_application_sign_on_policy_assignment_test.go deleted file mode 100644 index 65a78476..00000000 --- a/internal/connector/pingone/sso/resources/pingone_application_sign_on_policy_assignment_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestApplicationSignOnPolicyAssignmentExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ApplicationSignOnPolicyAssignment(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_application_sign_on_policy_assignment", - ResourceName: "Example OAuth App_Single_Factor", - ResourceID: fmt.Sprintf("%s/2a7c1b5d-415b-4fb5-a6c0-1e290f776785/056ed696-f2e9-44b1-8d2c-68e690cd1f24", clientInfo.PingOneExportEnvironmentID), - }, - - { - ResourceType: "pingone_application_sign_on_policy_assignment", - ResourceName: "Test MFA_multi_factor", - ResourceID: fmt.Sprintf("%s/11cfc8c7-ec0c-43ff-b49a-64f5e243f932/b0ecdaab-9d7c-4c1f-ab0d-891cfdbc73b2", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_application_test.go b/internal/connector/pingone/sso/resources/pingone_application_test.go deleted file mode 100644 index 6d9091cc..00000000 --- a/internal/connector/pingone/sso/resources/pingone_application_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestApplicationExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Application(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_application", - ResourceName: "Example OAuth App", - ResourceID: fmt.Sprintf("%s/2a7c1b5d-415b-4fb5-a6c0-1e290f776785", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application", - ResourceName: "Getting Started Application", - ResourceID: fmt.Sprintf("%s/3da7aae6-92e5-4295-a37c-8515d1f2cd86", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application", - ResourceName: "OAuth Worker App", - ResourceID: fmt.Sprintf("%s/9d6c443b-6329-4d3c-949e-880eda3b9599", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application", - ResourceName: "PingOne DaVinci Connection", - ResourceID: fmt.Sprintf("%s/7b621870-7124-4426-b432-6c675642afcb", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application", - ResourceName: "test app", - ResourceID: fmt.Sprintf("%s/a4cbf57e-fa2c-452f-bbc8-f40b551da0e2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application", - ResourceName: "Worker App", - ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_application", - ResourceName: "Test MFA", - ResourceID: fmt.Sprintf("%s/11cfc8c7-ec0c-43ff-b49a-64f5e243f932", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_group_nesting_test.go b/internal/connector/pingone/sso/resources/pingone_group_nesting_test.go deleted file mode 100644 index a110b9ed..00000000 --- a/internal/connector/pingone/sso/resources/pingone_group_nesting_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestGroupNestingExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.GroupNesting(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_group_nesting", - ResourceName: "My parent group_My nested group", - ResourceID: fmt.Sprintf("%s/298cf355-6806-4058-b87e-1ae92c7fb13b/d12ae346-c596-438c-95e3-3d76f364d527", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_group_role_assignment_test.go b/internal/connector/pingone/sso/resources/pingone_group_role_assignment_test.go deleted file mode 100644 index 7c1bf8cf..00000000 --- a/internal/connector/pingone/sso/resources/pingone_group_role_assignment_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestGroupRoleAssignmentExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.GroupRoleAssignment(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_group_role_assignment", - ResourceName: "testing_Client Application Developer_1db1accc-f63f-4f03-ab62-c767398fa730", - ResourceID: fmt.Sprintf("%s/b6924f30-73ca-4d3c-964b-90c77adce6a7/1db1accc-f63f-4f03-ab62-c767398fa730", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_group_role_assignment", - ResourceName: "testing_Identity Data Read Only_53a88921-2a9f-44f1-958e-3db9be3f8c69", - ResourceID: fmt.Sprintf("%s/b6924f30-73ca-4d3c-964b-90c77adce6a7/53a88921-2a9f-44f1-958e-3db9be3f8c69", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_group_test.go b/internal/connector/pingone/sso/resources/pingone_group_test.go deleted file mode 100644 index b6bd0e6b..00000000 --- a/internal/connector/pingone/sso/resources/pingone_group_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestGroupExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Group(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_group", - ResourceName: "test group", - ResourceID: fmt.Sprintf("%s/ebdf1771-4f43-4fa6-bb9a-ec17333e5ca7", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_group", - ResourceName: "testing", - ResourceID: fmt.Sprintf("%s/b6924f30-73ca-4d3c-964b-90c77adce6a7", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_group", - ResourceName: "My parent group", - ResourceID: fmt.Sprintf("%s/298cf355-6806-4058-b87e-1ae92c7fb13b", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_group", - ResourceName: "My nested group", - ResourceID: fmt.Sprintf("%s/d12ae346-c596-438c-95e3-3d76f364d527", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_identity_provider_attribute.go b/internal/connector/pingone/sso/resources/pingone_identity_provider_attribute.go deleted file mode 100644 index c748eb84..00000000 --- a/internal/connector/pingone/sso/resources/pingone_identity_provider_attribute.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/management" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingOneIdentityProviderAttributeResource{} -) - -type PingOneIdentityProviderAttributeResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingOneIdentityProviderAttributeResource -func IdentityProviderAttribute(clientInfo *connector.ClientInfo) *PingOneIdentityProviderAttributeResource { - return &PingOneIdentityProviderAttributeResource{ - clientInfo: clientInfo, - } -} - -func (r *PingOneIdentityProviderAttributeResource) ResourceType() string { - return "pingone_identity_provider_attribute" -} - -func (r *PingOneIdentityProviderAttributeResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - identityProviderData, err := r.getIdentityProviderData() - if err != nil { - return nil, err - } - - for idpId, idpName := range identityProviderData { - identityProviderAttributeData, err := r.getIdentityProviderAttributeData(idpId) - if err != nil { - return nil, err - } - - for idpAttributeId, idpAttributeName := range identityProviderAttributeData { - commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Identity Provider Attribute ID": idpAttributeId, - "Identity Provider Attribute Name": idpAttributeName, - "Identity Provider ID": idpId, - "Identity Provider Name": idpName, - "Resource Type": r.ResourceType(), - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", idpName, idpAttributeName), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, idpId, idpAttributeId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - } - - return &importBlocks, nil -} - -func (r *PingOneIdentityProviderAttributeResource) getIdentityProviderData() (map[string]string, error) { - identityProviderData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.IdentityProvidersApi.ReadAllIdentityProviders(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - identityProviders, err := pingone.GetManagementAPIObjectsFromIterator[management.IdentityProvider](iter, "ReadAllIdentityProviders", "GetIdentityProviders", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, idp := range identityProviders { - var ( - idpId *string - idpIdOk bool - idpName *string - idpNameOk bool - ) - - switch { - case idp.IdentityProviderApple != nil: - idpId, idpIdOk = idp.IdentityProviderApple.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderApple.GetNameOk() - case idp.IdentityProviderClientIDClientSecret != nil: - idpId, idpIdOk = idp.IdentityProviderClientIDClientSecret.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderClientIDClientSecret.GetNameOk() - case idp.IdentityProviderFacebook != nil: - idpId, idpIdOk = idp.IdentityProviderFacebook.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderFacebook.GetNameOk() - case idp.IdentityProviderOIDC != nil: - idpId, idpIdOk = idp.IdentityProviderOIDC.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderOIDC.GetNameOk() - case idp.IdentityProviderPaypal != nil: - idpId, idpIdOk = idp.IdentityProviderPaypal.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderPaypal.GetNameOk() - case idp.IdentityProviderSAML != nil: - idpId, idpIdOk = idp.IdentityProviderSAML.GetIdOk() - idpName, idpNameOk = idp.IdentityProviderSAML.GetNameOk() - default: - continue - } - - if idpIdOk && idpNameOk { - identityProviderData[*idpId] = *idpName - } - } - - return identityProviderData, nil -} - -func (r *PingOneIdentityProviderAttributeResource) getIdentityProviderAttributeData(idpId string) (map[string]string, error) { - identityProviderAttributeData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.IdentityProviderAttributesApi.ReadAllIdentityProviderAttributes(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, idpId).Execute() - attributeInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedAttributesInner](iter, "ReadAllIdentityProviderAttributes", "GetAttributes", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, attributeInners := range attributeInners { - if attributeInners.IdentityProviderAttribute != nil { - idpAttributeId, idpAttributeIdOk := attributeInners.IdentityProviderAttribute.GetIdOk() - idpAttributeName, idpAttributeNameOk := attributeInners.IdentityProviderAttribute.GetNameOk() - - if idpAttributeIdOk && idpAttributeNameOk { - identityProviderAttributeData[*idpAttributeId] = *idpAttributeName - } - } - } - - return identityProviderAttributeData, nil -} diff --git a/internal/connector/pingone/sso/resources/pingone_identity_provider_attribute_test.go b/internal/connector/pingone/sso/resources/pingone_identity_provider_attribute_test.go deleted file mode 100644 index 9ceaa345..00000000 --- a/internal/connector/pingone/sso/resources/pingone_identity_provider_attribute_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestIdentityProviderAttributeExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.IdentityProviderAttribute(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_identity_provider_attribute", - ResourceName: "Default Idp Test_username", - ResourceID: fmt.Sprintf("%s/a99df558-7090-4303-8f35-860ac660e371/51a036c6-41ed-44f7-bd1d-eacaa2a1feab", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_identity_provider_test.go b/internal/connector/pingone/sso/resources/pingone_identity_provider_test.go deleted file mode 100644 index 3fb1c680..00000000 --- a/internal/connector/pingone/sso/resources/pingone_identity_provider_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestIdentityProviderExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.IdentityProvider(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_identity_provider", - ResourceName: "Default Idp Test", - ResourceID: fmt.Sprintf("%s/a99df558-7090-4303-8f35-860ac660e371", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_password_policy_test.go b/internal/connector/pingone/sso/resources/pingone_password_policy_test.go deleted file mode 100644 index a7a7cab3..00000000 --- a/internal/connector/pingone/sso/resources/pingone_password_policy_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestPasswordPolicyExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.PasswordPolicy(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_password_policy", - ResourceName: "Standard", - ResourceID: fmt.Sprintf("%s/10c1f1bc-3dff-49ca-9abb-cf034b728793", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_password_policy", - ResourceName: "Basic", - ResourceID: fmt.Sprintf("%s/48641620-f51d-4675-86e1-e45d378ac0b2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_password_policy", - ResourceName: "Passphrase", - ResourceID: fmt.Sprintf("%s/686e2710-d59f-484a-8ba5-47959753012c", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_password_policy", - ResourceName: "LDAP Gateway Policy", - ResourceID: fmt.Sprintf("%s/c79032d2-b156-46a5-a9c9-7d18e93095b7", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_population_default_identity_provider_test.go b/internal/connector/pingone/sso/resources/pingone_population_default_identity_provider_test.go deleted file mode 100644 index 9fb92551..00000000 --- a/internal/connector/pingone/sso/resources/pingone_population_default_identity_provider_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestPopulationDefaultIdpExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.PopulationDefaultIdp(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_population_default_identity_provider", - ResourceName: "Default_default_identity_provider", - ResourceID: fmt.Sprintf("%s/720da2ce-4dd0-48d9-af75-aeadbda1860d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_population_default_identity_provider", - ResourceName: "LDAP Gateway Population_default_identity_provider", - ResourceID: fmt.Sprintf("%s/374fdb3c-4e94-4547-838a-0c200b9a7c70", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_population_default_identity_provider", - ResourceName: "Test Default Idp Population_default_identity_provider", - ResourceID: fmt.Sprintf("%s/2814912d-4a0f-4104-a779-80c13b2a6dcd", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_population_default_test.go b/internal/connector/pingone/sso/resources/pingone_population_default_test.go deleted file mode 100644 index 5ec58269..00000000 --- a/internal/connector/pingone/sso/resources/pingone_population_default_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestPopulationDefaultExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.PopulationDefault(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_population_default", - ResourceName: "Default_population_default", - ResourceID: clientInfo.PingOneExportEnvironmentID, - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_population_test.go b/internal/connector/pingone/sso/resources/pingone_population_test.go deleted file mode 100644 index 430cdf63..00000000 --- a/internal/connector/pingone/sso/resources/pingone_population_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestPopulationExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Population(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_population", - ResourceName: "Default", - ResourceID: fmt.Sprintf("%s/720da2ce-4dd0-48d9-af75-aeadbda1860d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_population", - ResourceName: "LDAP Gateway Population", - ResourceID: fmt.Sprintf("%s/374fdb3c-4e94-4547-838a-0c200b9a7c70", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_population", - ResourceName: "Test Default Idp Population", - ResourceID: fmt.Sprintf("%s/2814912d-4a0f-4104-a779-80c13b2a6dcd", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_resource_attribute_test.go b/internal/connector/pingone/sso/resources/pingone_resource_attribute_test.go deleted file mode 100644 index 79318b32..00000000 --- a/internal/connector/pingone/sso/resources/pingone_resource_attribute_test.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestResourceAttributeExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ResourceAttribute(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_resource_attribute", - ResourceName: "authorize-api-service_sub", - ResourceID: fmt.Sprintf("%s/3c6001a0-6110-4934-9d34-fa8c4a2894c2/3f79ad4f-588a-4652-bad8-d64d405bef8a", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "test_sub", - ResourceID: fmt.Sprintf("%s/4b9ef858-62ce-4bd0-9186-997b8527529d/c82b24b9-7ea3-4de4-8840-50b6c3cb1387", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "testing_sub", - ResourceID: fmt.Sprintf("%s/52afd89f-f3c0-4c78-b896-432c0a07329b/a7cf0daf-0e30-4ae5-bf88-7c5dc629d7cf", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_locale", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/0122f755-ac5d-4bc1-a755-0f56b6f582ec", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_preferred_username", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/09c1e110-7b3b-4f2d-a1ab-7d3054df8aa6", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_email", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/0b230ac5-25a4-4012-a393-e2529d91d4df", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_email_verified", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/1754e8e0-97b5-4477-b76e-a97d6d4fcb8d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_phone_number", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/1b6c9496-a281-4379-a8ef-dc5b60cb1bf4", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_nickname", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/1c822a3c-52fb-4cb2-b8c7-99800d32221a", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_address.postal_code", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/1fdeb8af-3f4d-4979-a4eb-2344694f9ec2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_name", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/28ce7067-77cb-460c-ad61-c7300b6b2ceb", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_updated_at", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/310677e7-2ece-4740-a17a-ec5cd9412b5c", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_family_name", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/37c492db-521d-4ef5-9fb2-dec64bb1de1e", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_profile", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/3c3f3bfe-d096-4f0e-9f9e-1ce9633cac5d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_address.formatted", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/3dc6971b-d7e8-4019-8502-d43dc0ced872", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_address.region", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/4dab2957-276b-4132-886f-fd217d21c01d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_phone_number_verified", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/791968e4-08bb-4aa8-bfc3-a28287fe0070", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_website", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/8447184f-1d5c-43cd-951b-a15c924b5bae", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_given_name", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/8bf9debc-5f13-45e4-81ba-cae3bc1c0d77", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_birthdate", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/91234ec7-61e8-4c5b-83f3-a08388e1a5f7", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_address.locality", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/b1f8538f-2b55-43ff-9b78-238fcad14b9d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_zoneinfo", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/b298df9c-75c8-4b5a-b1a9-97b71bce415f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_gender", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/c24c29ad-14d9-407e-a7c9-acb22a4792ce", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_address.street_address", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/d1c9d1eb-f988-4983-93e1-97ed6f0d835f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_address.country", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/d2964153-b987-4688-a5dc-09b7a1d52667", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_exampleAttribute", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/dc35abb7-79bc-4449-8fcc-265fbb39345f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_picture", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/dc9cd3f2-2076-44d2-b760-100a2beb49db", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "openid_middle_name", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80/fd6180af-b339-47bb-a9e3-6e02b69fb7ad", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_attribute", - ResourceName: "Undeployed Test API Service_sub", - ResourceID: fmt.Sprintf("%s/a35fe5ea-084c-4245-80f1-85f9eaf4f063/be2a2418-127a-4d60-9c04-88a5a568e25c", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_resource_scope_openid_test.go b/internal/connector/pingone/sso/resources/pingone_resource_scope_openid_test.go deleted file mode 100644 index 7e621b19..00000000 --- a/internal/connector/pingone/sso/resources/pingone_resource_scope_openid_test.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestResourceScopeOpenIdExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ResourceScopeOpenId(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_resource_scope_openid", - ResourceName: "openid_profile", - ResourceID: fmt.Sprintf("%s/5a2881ba-affc-4556-a9ff-ad662ea84e89", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope_openid", - ResourceName: "openid_newscope2", - ResourceID: fmt.Sprintf("%s/5f07b021-5f0e-47d0-a62b-1e983bdff753", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope_openid", - ResourceName: "openid_openid", - ResourceID: fmt.Sprintf("%s/6f095311-2cb9-4414-b30f-af8ee5e11e34", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope_openid", - ResourceName: "openid_newscope", - ResourceID: fmt.Sprintf("%s/792fa804-8aae-43c8-bea7-ea2dbbb1ca88", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope_openid", - ResourceName: "openid_email", - ResourceID: fmt.Sprintf("%s/a95eb903-b691-4aa9-91df-8b02d69816df", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope_openid", - ResourceName: "openid_test", - ResourceID: fmt.Sprintf("%s/d4213f0d-e1fc-42db-bcc6-dfad730f7be7", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope_openid", - ResourceName: "openid_phone", - ResourceID: fmt.Sprintf("%s/dad64f0c-187e-4991-a5b3-c4e53a4167e5", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope_openid", - ResourceName: "openid_testing", - ResourceID: fmt.Sprintf("%s/eb7e9feb-6076-4a2e-9e9e-5c9c0a503606", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope_openid", - ResourceName: "openid_address", - ResourceID: fmt.Sprintf("%s/fcd04665-fb97-4943-9c88-427331ebe930", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope_openid", - ResourceName: "openid_offline_access", - ResourceID: fmt.Sprintf("%s/4ac3e5ac-7baf-4c05-80a5-01a40c813d1a", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_resource_scope_pingone_api_test.go b/internal/connector/pingone/sso/resources/pingone_resource_scope_pingone_api_test.go deleted file mode 100644 index a75ae481..00000000 --- a/internal/connector/pingone/sso/resources/pingone_resource_scope_pingone_api_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestResourceScopePingOneApiExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ResourceScopePingOneApi(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_resource_scope_pingone_api", - ResourceName: "PingOne API_p1:read:user", - ResourceID: fmt.Sprintf("%s/089adcde-be64-4e7e-9a5a-dda60ce38a9f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope_pingone_api", - ResourceName: "PingOne API_p1:read:user:2", - ResourceID: fmt.Sprintf("%s/83d8ee1d-938f-4287-9792-aa808dc0cad9", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope_pingone_api", - ResourceName: "PingOne API_p1:update:user", - ResourceID: fmt.Sprintf("%s/d5bd66de-8044-41c5-aed2-278b6cf47dad", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_resource_scope_test.go b/internal/connector/pingone/sso/resources/pingone_resource_scope_test.go deleted file mode 100644 index 49ab8446..00000000 --- a/internal/connector/pingone/sso/resources/pingone_resource_scope_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestResourceScopeExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ResourceScope(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_resource_scope", - ResourceName: "authorize-api-service_apiscope", - ResourceID: fmt.Sprintf("%s/3c6001a0-6110-4934-9d34-fa8c4a2894c2/97b9c81c-56a3-4727-8626-9c55826f98c0", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope", - ResourceName: "authorize-api-service_testing", - ResourceID: fmt.Sprintf("%s/3c6001a0-6110-4934-9d34-fa8c4a2894c2/6aa03c9d-7003-4ddb-9395-b176d4bde6d6", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope", - ResourceName: "test_testing", - ResourceID: fmt.Sprintf("%s/4b9ef858-62ce-4bd0-9186-997b8527529d/99bda6e7-f34b-4218-8fb0-221f5414e0db", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope", - ResourceName: "test_oidc", - ResourceID: fmt.Sprintf("%s/4b9ef858-62ce-4bd0-9186-997b8527529d/9f2c9b87-a190-446e-bf6b-d97b7f8b1a70", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_scope", - ResourceName: "testing_test", - ResourceID: fmt.Sprintf("%s/52afd89f-f3c0-4c78-b896-432c0a07329b/d9935d01-5baa-4843-970a-9df33b60439f", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_resource_secret_test.go b/internal/connector/pingone/sso/resources/pingone_resource_secret_test.go deleted file mode 100644 index 5d4ef3c9..00000000 --- a/internal/connector/pingone/sso/resources/pingone_resource_secret_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestResourceSecretExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.ResourceSecret(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_resource_secret", - ResourceName: "Undeployed Test API Service_secret", - ResourceID: fmt.Sprintf("%s/a35fe5ea-084c-4245-80f1-85f9eaf4f063", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_secret", - ResourceName: "authorize-api-service_secret", - ResourceID: fmt.Sprintf("%s/3c6001a0-6110-4934-9d34-fa8c4a2894c2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_secret", - ResourceName: "test_secret", - ResourceID: fmt.Sprintf("%s/4b9ef858-62ce-4bd0-9186-997b8527529d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource_secret", - ResourceName: "testing_secret", - ResourceID: fmt.Sprintf("%s/52afd89f-f3c0-4c78-b896-432c0a07329b", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_resource_test.go b/internal/connector/pingone/sso/resources/pingone_resource_test.go deleted file mode 100644 index f5dac940..00000000 --- a/internal/connector/pingone/sso/resources/pingone_resource_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestResourceExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.Resource(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_resource", - ResourceName: "authorize-api-service", - ResourceID: fmt.Sprintf("%s/3c6001a0-6110-4934-9d34-fa8c4a2894c2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource", - ResourceName: "test", - ResourceID: fmt.Sprintf("%s/4b9ef858-62ce-4bd0-9186-997b8527529d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource", - ResourceName: "testing", - ResourceID: fmt.Sprintf("%s/52afd89f-f3c0-4c78-b896-432c0a07329b", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource", - ResourceName: "PingOne API", - ResourceID: fmt.Sprintf("%s/95ed3610-7668-4a17-8334-b3db5ff9a875", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource", - ResourceName: "openid", - ResourceID: fmt.Sprintf("%s/8c428665-3e68-4f3c-997d-16a97f8cbe80", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_resource", - ResourceName: "Undeployed Test API Service", - ResourceID: fmt.Sprintf("%s/a35fe5ea-084c-4245-80f1-85f9eaf4f063", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_schema_attribute_test.go b/internal/connector/pingone/sso/resources/pingone_schema_attribute_test.go deleted file mode 100644 index 142ca413..00000000 --- a/internal/connector/pingone/sso/resources/pingone_schema_attribute_test.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestSchemaAttributeExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.SchemaAttribute(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_preferredLanguage", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/364bc187-e88f-4853-87f3-64aa13d9a099", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_timezone", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/4d3de681-a822-4633-bc42-8c67f9052fd3", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_lastSignOn", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/6b6992f5-78f6-4a22-97a1-69ba30c591d0", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_title", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/47cdeaa0-5cf0-4964-83b5-b3fe125c092e", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_type", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/acce5383-16ff-4973-8ded-2b19fd9146ed", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_locale", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/b9ff90eb-188e-40b1-9725-92b55e40f1eb", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_enabled", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/022607db-04b7-4d37-a034-798342d32060", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_identityProvider", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/b77ef54a-54c1-4636-83d2-b410ed23aeee", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_lifecycle", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/e3541156-0fe1-4177-aa69-dce02420d8cc", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_createdAt", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/d3221cc9-fb62-42e9-a14c-971a7c7a1e74", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_verifyStatus", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/23a02ffd-9250-401e-8aa5-f8eb71b72c6c", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_nickname", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/87efff27-cdb5-4829-9976-a80ebb4f8ee5", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_mfaEnabled", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/a49c17e2-ce8f-45e5-8e71-d51c8c4d140a", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_id", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/e4bb0b09-3f8d-485e-94ca-20e312471633", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_email", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/0473af5a-1294-4462-8a19-8567e5dccd9c", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_updatedAt", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/8fe405d2-c620-4267-805d-371c2092eb59", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_memberOfGroupIDs", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/d85f4528-54a8-49c7-a643-c098ad28b860", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_address", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/bc10ef33-b7cf-4efd-afc2-44bbd8f572a9", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_externalId", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/985359b0-a6a7-49e3-9079-be770e49b37f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_photo", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/d991bc82-002d-4872-b544-9f2562452269", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_memberOfGroupNames", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/6a2aa3a6-9926-4070-8827-3bf84f7033fb", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_population", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/fb572f33-8944-4a35-846c-e548dbdeb49f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_primaryPhone", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/f48f844b-3ba2-45ad-ba3c-de473a12ca4d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_accountId", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/3658a298-8ce8-446d-ada5-cebb24678506", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_emailVerified", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/c4034a55-f6ae-406e-b3ad-5da3c66d77a2", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_mobilePhone", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/b4a939bf-f60a-41c3-9aad-1482ddf31d32", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_name", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/c8cac0ca-31c6-43d4-a2e6-63b07c936a43", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_account", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/eeed302f-8ca8-4993-aeb0-5d8d08587d8d", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_username", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/77d3f22e-00ca-49d1-98a1-fc0ee48d2542", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_schema_attribute", - ResourceName: "User_bypassMFA", - ResourceID: fmt.Sprintf("%s/ff3cb03d-4896-4d20-8612-f014c4048d01/355c50dc-0eb6-4c5b-ab36-2b3152e0534c", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_sign_on_policy_action.go b/internal/connector/pingone/sso/resources/pingone_sign_on_policy_action.go deleted file mode 100644 index e09ac19b..00000000 --- a/internal/connector/pingone/sso/resources/pingone_sign_on_policy_action.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources - -import ( - "fmt" - - "github.com/patrickcping/pingone-go-sdk-v2/management" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/connector/pingone" - "github.com/pingidentity/pingcli/internal/logger" -) - -// Verify that the resource satisfies the exportable resource interface -var ( - _ connector.ExportableResource = &PingOneSignOnPolicyActionResource{} -) - -type PingOneSignOnPolicyActionResource struct { - clientInfo *connector.ClientInfo -} - -// Utility method for creating a PingOneSignOnPolicyActionResource -func SignOnPolicyAction(clientInfo *connector.ClientInfo) *PingOneSignOnPolicyActionResource { - return &PingOneSignOnPolicyActionResource{ - clientInfo: clientInfo, - } -} - -func (r *PingOneSignOnPolicyActionResource) ResourceType() string { - return "pingone_sign_on_policy_action" -} - -func (r *PingOneSignOnPolicyActionResource) ExportAll() (*[]connector.ImportBlock, error) { - l := logger.Get() - l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - - importBlocks := []connector.ImportBlock{} - - signOnPolicyData, err := r.getSignOnPolicyData() - if err != nil { - return nil, err - } - - for signOnPolicyId, signOnPolicyName := range signOnPolicyData { - signOnPolicyActionData, err := r.getSignOnPolicyActionData(signOnPolicyId) - if err != nil { - return nil, err - } - - for actionId, actionType := range signOnPolicyActionData { - commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), - "Sign-On Policy Action ID": actionId, - "Sign-On Policy Action Type": actionType, - "Sign-On Policy ID": signOnPolicyId, - "Sign-On Policy Name": signOnPolicyName, - } - - importBlock := connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", signOnPolicyName, actionType), - ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, signOnPolicyId, actionId), - CommentInformation: common.GenerateCommentInformation(commentData), - } - - importBlocks = append(importBlocks, importBlock) - } - } - - return &importBlocks, nil -} - -func (r *PingOneSignOnPolicyActionResource) getSignOnPolicyData() (map[string]string, error) { - signOnPolicyData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.SignOnPoliciesApi.ReadAllSignOnPolicies(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - signOnPolicies, err := pingone.GetManagementAPIObjectsFromIterator[management.SignOnPolicy](iter, "ReadAllSignOnPolicies", "GetSignOnPolicies", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, signOnPolicy := range signOnPolicies { - signOnPolicyId, signOnPolicyIdOk := signOnPolicy.GetIdOk() - signOnPolicyName, signOnPolicyNameOk := signOnPolicy.GetNameOk() - - if signOnPolicyIdOk && signOnPolicyNameOk { - signOnPolicyData[*signOnPolicyId] = *signOnPolicyName - } - } - - return signOnPolicyData, nil -} - -func (r *PingOneSignOnPolicyActionResource) getSignOnPolicyActionData(signOnPolicyId string) (map[string]string, error) { - signOnPolicyActionData := make(map[string]string) - - iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.SignOnPolicyActionsApi.ReadAllSignOnPolicyActions(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, signOnPolicyId).Execute() - signOnPolicyActions, err := pingone.GetManagementAPIObjectsFromIterator[management.SignOnPolicyAction](iter, "ReadAllSignOnPolicyActions", "GetActions", r.ResourceType()) - if err != nil { - return nil, err - } - - for _, action := range signOnPolicyActions { - var ( - actionId *string - actionIdOk bool - actionType *management.EnumSignOnPolicyType - actionTypeOk bool - ) - - switch { - case action.SignOnPolicyActionAgreement != nil: - actionId, actionIdOk = action.SignOnPolicyActionAgreement.GetIdOk() - actionType, actionTypeOk = action.SignOnPolicyActionAgreement.GetTypeOk() - case action.SignOnPolicyActionCommon != nil: - actionId, actionIdOk = action.SignOnPolicyActionCommon.GetIdOk() - actionType, actionTypeOk = action.SignOnPolicyActionCommon.GetTypeOk() - case action.SignOnPolicyActionIDFirst != nil: - actionId, actionIdOk = action.SignOnPolicyActionIDFirst.GetIdOk() - actionType, actionTypeOk = action.SignOnPolicyActionIDFirst.GetTypeOk() - case action.SignOnPolicyActionIDP != nil: - actionId, actionIdOk = action.SignOnPolicyActionIDP.GetIdOk() - actionType, actionTypeOk = action.SignOnPolicyActionIDP.GetTypeOk() - case action.SignOnPolicyActionLogin != nil: - actionId, actionIdOk = action.SignOnPolicyActionLogin.GetIdOk() - actionType, actionTypeOk = action.SignOnPolicyActionLogin.GetTypeOk() - case action.SignOnPolicyActionMFA != nil: - actionId, actionIdOk = action.SignOnPolicyActionMFA.GetIdOk() - actionType, actionTypeOk = action.SignOnPolicyActionMFA.GetTypeOk() - case action.SignOnPolicyActionPingIDWinLoginPasswordless != nil: - actionId, actionIdOk = action.SignOnPolicyActionPingIDWinLoginPasswordless.GetIdOk() - actionType, actionTypeOk = action.SignOnPolicyActionPingIDWinLoginPasswordless.GetTypeOk() - default: - continue - } - - if actionIdOk && actionTypeOk { - signOnPolicyActionData[*actionId] = string(*actionType) - } - } - - return signOnPolicyActionData, nil -} diff --git a/internal/connector/pingone/sso/resources/pingone_sign_on_policy_action_test.go b/internal/connector/pingone/sso/resources/pingone_sign_on_policy_action_test.go deleted file mode 100644 index dd6abfbf..00000000 --- a/internal/connector/pingone/sso/resources/pingone_sign_on_policy_action_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestSignOnPolicyActionExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.SignOnPolicyAction(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_sign_on_policy_action", - ResourceName: "testing_LOGIN", - ResourceID: fmt.Sprintf("%s/0667e65d-fcdf-4049-b1b4-9d59392ee8bc/8d6fbf89-6913-403d-ab16-1470af9be22f", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_sign_on_policy_action", - ResourceName: "testing_AGREEMENT", - ResourceID: fmt.Sprintf("%s/0667e65d-fcdf-4049-b1b4-9d59392ee8bc/23a73045-e9a7-4557-83c7-8aa3b7c7fb2e", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_sign_on_policy_action", - ResourceName: "testing_IDENTITY_PROVIDER", - ResourceID: fmt.Sprintf("%s/0667e65d-fcdf-4049-b1b4-9d59392ee8bc/e975d90d-8355-45a2-94ba-3757734cc64b", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_sign_on_policy_action", - ResourceName: "test_LOGIN", - ResourceID: fmt.Sprintf("%s/50cff7e5-7c95-4d1d-9fce-c9cdc7d6f6a3/8114540e-8deb-408b-9307-fa74f00d2683", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_sign_on_policy_action", - ResourceName: "Single_Factor_LOGIN", - ResourceID: fmt.Sprintf("%s/b1fdc38d-ea0c-47b1-9d83-c48105bd6806/6cc634a8-a89f-4632-8e84-45b976a18473", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_sign_on_policy_action", - ResourceName: "multi_factor_MULTI_FACTOR_AUTHENTICATION", - ResourceID: fmt.Sprintf("%s/7c857f42-12ef-4ff0-96e8-4dfe6d84c425/f370ed1c-09b6-4f84-8a5e-8afd5aa63687", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_sign_on_policy_test.go b/internal/connector/pingone/sso/resources/pingone_sign_on_policy_test.go deleted file mode 100644 index dd4f0afe..00000000 --- a/internal/connector/pingone/sso/resources/pingone_sign_on_policy_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package resources_test - -import ( - "fmt" - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" - "github.com/pingidentity/pingcli/internal/testing/testutils" -) - -func TestSignOnPolicyExport(t *testing.T) { - // Get initialized apiClient and resource - clientInfo := testutils.GetClientInfo(t) - resource := resources.SignOnPolicy(clientInfo) - - // Defined the expected ImportBlocks for the resource - expectedImportBlocks := []connector.ImportBlock{ - { - ResourceType: "pingone_sign_on_policy", - ResourceName: "testing", - ResourceID: fmt.Sprintf("%s/0667e65d-fcdf-4049-b1b4-9d59392ee8bc", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_sign_on_policy", - ResourceName: "test", - ResourceID: fmt.Sprintf("%s/50cff7e5-7c95-4d1d-9fce-c9cdc7d6f6a3", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_sign_on_policy", - ResourceName: "Single_Factor", - ResourceID: fmt.Sprintf("%s/b1fdc38d-ea0c-47b1-9d83-c48105bd6806", clientInfo.PingOneExportEnvironmentID), - }, - { - ResourceType: "pingone_sign_on_policy", - ResourceName: "multi_factor", - ResourceID: fmt.Sprintf("%s/7c857f42-12ef-4ff0-96e8-4dfe6d84c425", clientInfo.PingOneExportEnvironmentID), - }, - } - - testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) -} diff --git a/internal/connector/pingone/sso/resources/pingone_population.go b/internal/connector/pingone/sso/resources/population.go similarity index 91% rename from internal/connector/pingone/sso/resources/pingone_population.go rename to internal/connector/pingone/sso/resources/population.go index b07c3216..0101f529 100644 --- a/internal/connector/pingone/sso/resources/pingone_population.go +++ b/internal/connector/pingone/sso/resources/population.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -45,9 +46,9 @@ func (r *PingOnePopulationResource) ExportAll() (*[]connector.ImportBlock, error for populationId, populationName := range populationData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Population ID": populationId, "Population Name": populationName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), } @@ -68,12 +69,12 @@ func (r *PingOnePopulationResource) getPopulationData() (map[string]string, erro populationData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.PopulationsApi.ReadAllPopulations(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - populations, err := pingone.GetManagementAPIObjectsFromIterator[management.Population](iter, "ReadAllPopulations", "GetPopulations", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Population](iter, "ReadAllPopulations", "GetPopulations", r.ResourceType()) if err != nil { return nil, err } - for _, population := range populations { + for _, population := range apiObjs { populationId, populationIdOk := population.GetIdOk() populationName, populationNameOk := population.GetNameOk() diff --git a/internal/connector/pingone/sso/resources/pingone_population_default.go b/internal/connector/pingone/sso/resources/population_default.go similarity index 79% rename from internal/connector/pingone/sso/resources/pingone_population_default.go rename to internal/connector/pingone/sso/resources/population_default.go index abefe263..1bf85d65 100644 --- a/internal/connector/pingone/sso/resources/pingone_population_default.go +++ b/internal/connector/pingone/sso/resources/population_default.go @@ -10,6 +10,7 @@ import ( "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/connector/pingone" "github.com/pingidentity/pingcli/internal/logger" + "github.com/pingidentity/pingcli/internal/output" ) // Verify that the resource satisfies the exportable resource interface @@ -38,11 +39,15 @@ func (r *PingOnePopulationDefaultResource) ExportAll() (*[]connector.ImportBlock importBlocks := []connector.ImportBlock{} - defaultPopulationName, err := r.getDefaultPopulationName() + defaultPopulationName, defaultPopulationNameOk, err := r.getDefaultPopulationName() if err != nil { return nil, err } + if !defaultPopulationNameOk { + return &importBlocks, nil + } + commentData := map[string]string{ "Default Population Name": *defaultPopulationName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, @@ -61,24 +66,26 @@ func (r *PingOnePopulationDefaultResource) ExportAll() (*[]connector.ImportBlock return &importBlocks, nil } -func (r *PingOnePopulationDefaultResource) getDefaultPopulationName() (*string, error) { +func (r *PingOnePopulationDefaultResource) getDefaultPopulationName() (*string, bool, error) { iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.PopulationsApi.ReadAllPopulations(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - populations, err := pingone.GetManagementAPIObjectsFromIterator[management.Population](iter, "ReadAllPopulations", "GetPopulations", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Population](iter, "ReadAllPopulations", "GetPopulations", r.ResourceType()) if err != nil { - return nil, err + return nil, false, err } - for _, population := range populations { + for _, population := range apiObjs { populationDefault, populationDefaultOk := population.GetDefaultOk() if populationDefaultOk && *populationDefault { populationName, populationNameOk := population.GetNameOk() if populationNameOk { - return populationName, nil + return populationName, true, nil } } } - return nil, fmt.Errorf("unable to find the name of the default population") + output.Warn("Unable to export the default population. No default population found.", nil) + + return nil, false, nil } diff --git a/internal/connector/pingone/sso/resources/pingone_population_default_identity_provider.go b/internal/connector/pingone/sso/resources/population_default_identity_provider.go similarity index 58% rename from internal/connector/pingone/sso/resources/pingone_population_default_identity_provider.go rename to internal/connector/pingone/sso/resources/population_default_identity_provider.go index de7de74d..a1067442 100644 --- a/internal/connector/pingone/sso/resources/pingone_population_default_identity_provider.go +++ b/internal/connector/pingone/sso/resources/population_default_identity_provider.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -14,25 +15,25 @@ import ( // Verify that the resource satisfies the exportable resource interface var ( - _ connector.ExportableResource = &PingOnePopulationDefaultIdpResource{} + _ connector.ExportableResource = &PingOnePopulationDefaultIdentityProviderResource{} ) -type PingOnePopulationDefaultIdpResource struct { +type PingOnePopulationDefaultIdentityProviderResource struct { clientInfo *connector.ClientInfo } -// Utility method for creating a PingOnePopulationDefaultIdpResource -func PopulationDefaultIdp(clientInfo *connector.ClientInfo) *PingOnePopulationDefaultIdpResource { - return &PingOnePopulationDefaultIdpResource{ +// Utility method for creating a PingOnePopulationDefaultIdentityProviderResource +func PopulationDefaultIdentityProvider(clientInfo *connector.ClientInfo) *PingOnePopulationDefaultIdentityProviderResource { + return &PingOnePopulationDefaultIdentityProviderResource{ clientInfo: clientInfo, } } -func (r *PingOnePopulationDefaultIdpResource) ResourceType() string { +func (r *PingOnePopulationDefaultIdentityProviderResource) ResourceType() string { return "pingone_population_default_identity_provider" } -func (r *PingOnePopulationDefaultIdpResource) ExportAll() (*[]connector.ImportBlock, error) { +func (r *PingOnePopulationDefaultIdentityProviderResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) @@ -44,7 +45,7 @@ func (r *PingOnePopulationDefaultIdpResource) ExportAll() (*[]connector.ImportBl } for populationId, populationName := range populationData { - ok, err := r.checkPopulationDefaultIdp(populationId) + ok, err := r.checkPopulationDefaultIdentityProviderData(populationId) if err != nil { return nil, err } @@ -53,10 +54,10 @@ func (r *PingOnePopulationDefaultIdpResource) ExportAll() (*[]connector.ImportBl } commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Population ID": populationId, "Population Name": populationName, "Resource Type": r.ResourceType(), + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, } importBlock := connector.ImportBlock{ @@ -72,16 +73,16 @@ func (r *PingOnePopulationDefaultIdpResource) ExportAll() (*[]connector.ImportBl return &importBlocks, nil } -func (r *PingOnePopulationDefaultIdpResource) getPopulationData() (map[string]string, error) { +func (r *PingOnePopulationDefaultIdentityProviderResource) getPopulationData() (map[string]string, error) { populationData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.PopulationsApi.ReadAllPopulations(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - populations, err := pingone.GetManagementAPIObjectsFromIterator[management.Population](iter, "ReadAllPopulations", "GetPopulations", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Population](iter, "ReadAllPopulations", "GetPopulations", r.ResourceType()) if err != nil { return nil, err } - for _, population := range populations { + for _, population := range apiObjs { populationId, populationIdOk := population.GetIdOk() populationName, populationNameOk := population.GetNameOk() @@ -93,7 +94,8 @@ func (r *PingOnePopulationDefaultIdpResource) getPopulationData() (map[string]st return populationData, nil } -func (r *PingOnePopulationDefaultIdpResource) checkPopulationDefaultIdp(populationId string) (bool, error) { - _, resp, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.PopulationsApi.ReadOnePopulationDefaultIdp(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, populationId).Execute() - return common.CheckSingletonResource(resp, err, "ReadOnePopulationDefaultIdp", r.ResourceType()) +func (r *PingOnePopulationDefaultIdentityProviderResource) checkPopulationDefaultIdentityProviderData(populationId string) (bool, error) { + _, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.PopulationsApi.ReadOnePopulationDefaultIdp(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, populationId).Execute() + + return common.CheckSingletonResource(response, err, "ReadOnePopulationDefaultIdp", r.ResourceType()) } diff --git a/internal/connector/pingone/sso/resources/population_default_identity_provider_test.go b/internal/connector/pingone/sso/resources/population_default_identity_provider_test.go new file mode 100644 index 00000000..b8325bc9 --- /dev/null +++ b/internal/connector/pingone/sso/resources/population_default_identity_provider_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_PopulationDefaultIdentityProvider(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.PopulationDefaultIdentityProvider(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + populationTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_default_identity_provider", populationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, populationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing populations are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/population_default_test.go b/internal/connector/pingone/sso/resources/population_default_test.go new file mode 100644 index 00000000..606662c7 --- /dev/null +++ b/internal/connector/pingone/sso/resources/population_default_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_PopulationDefault(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.PopulationDefault(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + populationTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_population_default", populationTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: clientInfo.PingOneExportEnvironmentID, + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/population_test.go b/internal/connector/pingone/sso/resources/population_test.go new file mode 100644 index 00000000..e9203090 --- /dev/null +++ b/internal/connector/pingone/sso/resources/population_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_Population(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.Population(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing populations are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_resource.go b/internal/connector/pingone/sso/resources/resource.go similarity index 82% rename from internal/connector/pingone/sso/resources/pingone_resource.go rename to internal/connector/pingone/sso/resources/resource.go index 37a088bd..8978e403 100644 --- a/internal/connector/pingone/sso/resources/pingone_resource.go +++ b/internal/connector/pingone/sso/resources/resource.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -45,9 +46,9 @@ func (r *PingOneResourceResource) ExportAll() (*[]connector.ImportBlock, error) for resourceId, resourceName := range resourceData { commentData := map[string]string{ + "Resource ID": resourceId, + "Resource Name": resourceName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "PingOne Resource ID": resourceId, - "PingOne Resource Name": resourceName, "Resource Type": r.ResourceType(), } @@ -68,15 +69,15 @@ func (r *PingOneResourceResource) getResourceData() (map[string]string, error) { resourceData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadAllResources(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - resourceInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) if err != nil { return nil, err } - for _, resourceInner := range resourceInners { - if resourceInner.Resource != nil { - resourceId, resourceIdOk := resourceInner.Resource.GetIdOk() - resourceName, resourceNameOk := resourceInner.Resource.GetNameOk() + for _, innerObj := range apiObjs { + if innerObj.Resource != nil { + resourceId, resourceIdOk := innerObj.Resource.GetIdOk() + resourceName, resourceNameOk := innerObj.Resource.GetNameOk() if resourceIdOk && resourceNameOk { resourceData[*resourceId] = *resourceName diff --git a/internal/connector/pingone/sso/resources/pingone_resource_attribute.go b/internal/connector/pingone/sso/resources/resource_attribute.go similarity index 69% rename from internal/connector/pingone/sso/resources/pingone_resource_attribute.go rename to internal/connector/pingone/sso/resources/resource_attribute.go index d4a12e61..ba7b2cf5 100644 --- a/internal/connector/pingone/sso/resources/pingone_resource_attribute.go +++ b/internal/connector/pingone/sso/resources/resource_attribute.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -43,9 +44,9 @@ func (r *PingOneResourceAttributeResource) ExportAll() (*[]connector.ImportBlock return nil, err } - for resourceId, resourceNameAndType := range resourceData { - resourceName := resourceNameAndType[0] - resourceType := resourceNameAndType[1] + for resourceId, resourceInfo := range resourceData { + resourceName := resourceInfo[0] + resourceType := resourceInfo[1] resourceAttributeData, err := r.getResourceAttributeData(resourceId, resourceType) if err != nil { @@ -54,12 +55,12 @@ func (r *PingOneResourceAttributeResource) ExportAll() (*[]connector.ImportBlock for resourceAttributeId, resourceAttributeName := range resourceAttributeData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "PingOne Resource Attribute ID": resourceAttributeId, - "PingOne Resource Attribute Name": resourceAttributeName, - "PingOne Resource ID": resourceId, - "PingOne Resource Name": resourceName, - "Resource Type": r.ResourceType(), + "Resource ID": resourceId, + "Resource Name": resourceName, + "Resource Attribute ID": resourceAttributeId, + "Resource Attribute Name": resourceAttributeName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ @@ -80,16 +81,16 @@ func (r *PingOneResourceAttributeResource) getResourceData() (map[string][]strin resourceData := make(map[string][]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadAllResources(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - resourceInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) if err != nil { return nil, err } - for _, resourceInner := range resourceInners { - if resourceInner.Resource != nil { - resourceId, resourceIdOk := resourceInner.Resource.GetIdOk() - resourceName, resourceNameOk := resourceInner.Resource.GetNameOk() - resourceType, resourceTypeOk := resourceInner.Resource.GetTypeOk() + for _, innerObj := range apiObjs { + if innerObj.Resource != nil { + resourceId, resourceIdOk := innerObj.Resource.GetIdOk() + resourceName, resourceNameOk := innerObj.Resource.GetNameOk() + resourceType, resourceTypeOk := innerObj.Resource.GetTypeOk() if resourceIdOk && resourceNameOk && resourceTypeOk { resourceData[*resourceId] = []string{*resourceName, string(*resourceType)} @@ -100,20 +101,20 @@ func (r *PingOneResourceAttributeResource) getResourceData() (map[string][]strin return resourceData, nil } -func (r *PingOneResourceAttributeResource) getResourceAttributeData(resourceId string, resourceType string) (map[string]string, error) { +func (r *PingOneResourceAttributeResource) getResourceAttributeData(resourceId, resourceType string) (map[string]string, error) { resourceAttributeData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourceAttributesApi.ReadAllResourceAttributes(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, resourceId).Execute() - attributeInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedAttributesInner](iter, "ReadAllResourceAttributes", "GetAttributes", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedAttributesInner](iter, "ReadAllResourceAttributes", "GetAttributes", r.ResourceType()) if err != nil { return nil, err } - for _, attributeInner := range attributeInners { - if attributeInner.ResourceAttribute != nil { - resourceAttributeId, resourceAttributeIdOk := attributeInner.ResourceAttribute.GetIdOk() - resourceAttributeName, resourceAttributeNameOk := attributeInner.ResourceAttribute.GetNameOk() - resourceAttributeType, resourceAttributeTypeOk := attributeInner.ResourceAttribute.GetTypeOk() + for _, innerObj := range apiObjs { + if innerObj.ResourceAttribute != nil { + resourceAttributeId, resourceAttributeIdOk := innerObj.ResourceAttribute.GetIdOk() + resourceAttributeName, resourceAttributeNameOk := innerObj.ResourceAttribute.GetNameOk() + resourceAttributeType, resourceAttributeTypeOk := innerObj.ResourceAttribute.GetTypeOk() if resourceAttributeIdOk && resourceAttributeNameOk && resourceAttributeTypeOk { // Any CORE attribute is required and cannot be overridden diff --git a/internal/connector/pingone/sso/resources/resource_attribute_test.go b/internal/connector/pingone/sso/resources/resource_attribute_test.go new file mode 100644 index 00000000..6f442af0 --- /dev/null +++ b/internal/connector/pingone/sso/resources/resource_attribute_test.go @@ -0,0 +1,36 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_ResourceAttribute(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ResourceAttribute(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + resourceTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", resourceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, resourceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing attributes are generated, test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_resource_scope.go b/internal/connector/pingone/sso/resources/resource_scope.go similarity index 71% rename from internal/connector/pingone/sso/resources/pingone_resource_scope.go rename to internal/connector/pingone/sso/resources/resource_scope.go index d1218cd0..5c3cc213 100644 --- a/internal/connector/pingone/sso/resources/pingone_resource_scope.go +++ b/internal/connector/pingone/sso/resources/resource_scope.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -51,12 +52,12 @@ func (r *PingOneResourceScopeResource) ExportAll() (*[]connector.ImportBlock, er for resourceScopeId, resourceScopeName := range resourceScopeData { commentData := map[string]string{ - "Custom Resource ID": resourceId, - "Custom Resource Name": resourceName, - "Custom Resource Scope ID": resourceScopeId, - "Custom Resource Scope Name": resourceScopeName, - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), + "Resource ID": resourceId, + "Resource Name": resourceName, + "Resource Scope ID": resourceScopeId, + "Resource Scope Name": resourceScopeName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ @@ -77,16 +78,16 @@ func (r *PingOneResourceScopeResource) getResourceData() (map[string]string, err resourceData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadAllResources(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - resourceInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) if err != nil { return nil, err } - for _, resourceInner := range resourceInners { - if resourceInner.Resource != nil { - resourceId, resourceIdOk := resourceInner.Resource.GetIdOk() - resourceName, resourceNameOk := resourceInner.Resource.GetNameOk() - resourceType, resourceTypeOk := resourceInner.Resource.GetTypeOk() + for _, innerObj := range apiObjs { + if innerObj.Resource != nil { + resourceId, resourceIdOk := innerObj.Resource.GetIdOk() + resourceName, resourceNameOk := innerObj.Resource.GetNameOk() + resourceType, resourceTypeOk := innerObj.Resource.GetTypeOk() if resourceIdOk && resourceNameOk && resourceTypeOk && *resourceType == management.ENUMRESOURCETYPE_CUSTOM { resourceData[*resourceId] = *resourceName @@ -101,16 +102,17 @@ func (r *PingOneResourceScopeResource) getResourceScopeData(resourceId string) ( resourceScopeData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourceScopesApi.ReadAllResourceScopes(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, resourceId).Execute() - resourceScopes, err := pingone.GetManagementAPIObjectsFromIterator[management.ResourceScope](iter, "ReadAllResourceScopes", "GetScopes", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ResourceScope](iter, "ReadAllResourceScopes", "GetScopes", r.ResourceType()) if err != nil { return nil, err } - for _, scope := range resourceScopes { - scopeId, scopeIdOk := scope.GetIdOk() - scopeName, scopeNameOk := scope.GetNameOk() - if scopeIdOk && scopeNameOk { - resourceScopeData[*scopeId] = *scopeName + for _, resourceScope := range apiObjs { + resourceScopeId, resourceScopeIdOk := resourceScope.GetIdOk() + resourceScopeName, resourceScopeNameOk := resourceScope.GetNameOk() + + if resourceScopeIdOk && resourceScopeNameOk { + resourceScopeData[*resourceScopeId] = *resourceScopeName } } diff --git a/internal/connector/pingone/sso/resources/pingone_resource_scope_openid.go b/internal/connector/pingone/sso/resources/resource_scope_openid.go similarity index 78% rename from internal/connector/pingone/sso/resources/pingone_resource_scope_openid.go rename to internal/connector/pingone/sso/resources/resource_scope_openid.go index 4ec6cf56..042f3cd5 100644 --- a/internal/connector/pingone/sso/resources/pingone_resource_scope_openid.go +++ b/internal/connector/pingone/sso/resources/resource_scope_openid.go @@ -76,16 +76,16 @@ func (r *PingOneResourceScopeOpenIdResource) getResourceData() (map[string]strin resourceData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadAllResources(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - resourceInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) if err != nil { return nil, err } - for _, resourceInner := range resourceInners { - if resourceInner.Resource != nil { - resourceId, resourceIdOk := resourceInner.Resource.GetIdOk() - resourceName, resourceNameOk := resourceInner.Resource.GetNameOk() - resourceType, resourceTypeOk := resourceInner.Resource.GetTypeOk() + for _, innerObj := range apiObjs { + if innerObj.Resource != nil { + resourceId, resourceIdOk := innerObj.Resource.GetIdOk() + resourceName, resourceNameOk := innerObj.Resource.GetNameOk() + resourceType, resourceTypeOk := innerObj.Resource.GetTypeOk() if resourceIdOk && resourceNameOk && resourceTypeOk && *resourceType == management.ENUMRESOURCETYPE_OPENID_CONNECT { resourceData[*resourceId] = *resourceName @@ -100,17 +100,17 @@ func (r *PingOneResourceScopeOpenIdResource) getResourceScopeData(resourceId str resourceScopeData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourceScopesApi.ReadAllResourceScopes(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, resourceId).Execute() - resourceScopes, err := pingone.GetManagementAPIObjectsFromIterator[management.ResourceScope](iter, "ReadAllResourceScopes", "GetScopes", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ResourceScope](iter, "ReadAllResourceScopes", "GetScopes", r.ResourceType()) if err != nil { return nil, err } - for _, scopeOpenId := range resourceScopes { - scopeOpenIdId, scopeOpenIdIdOk := scopeOpenId.GetIdOk() - scopeOpenIdName, scopeOpenIdNameOk := scopeOpenId.GetNameOk() + for _, scope := range apiObjs { + scopeId, scopeIdOk := scope.GetIdOk() + scopeName, scopeNameOk := scope.GetNameOk() - if scopeOpenIdIdOk && scopeOpenIdNameOk { - resourceScopeData[*scopeOpenIdId] = *scopeOpenIdName + if scopeIdOk && scopeNameOk { + resourceScopeData[*scopeId] = *scopeName } } diff --git a/internal/connector/pingone/sso/resources/resource_scope_openid_test.go b/internal/connector/pingone/sso/resources/resource_scope_openid_test.go new file mode 100644 index 00000000..b9d72aa4 --- /dev/null +++ b/internal/connector/pingone/sso/resources/resource_scope_openid_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_ResourceScopeOpenId(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ResourceScopeOpenId(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", "openid", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing scopes on the openid resource are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_resource_scope_pingone_api.go b/internal/connector/pingone/sso/resources/resource_scope_pingone_api.go similarity index 79% rename from internal/connector/pingone/sso/resources/pingone_resource_scope_pingone_api.go rename to internal/connector/pingone/sso/resources/resource_scope_pingone_api.go index 2882c031..72efc594 100644 --- a/internal/connector/pingone/sso/resources/pingone_resource_scope_pingone_api.go +++ b/internal/connector/pingone/sso/resources/resource_scope_pingone_api.go @@ -77,16 +77,16 @@ func (r *PingOneResourceScopePingOneApiResource) getResourceData() (map[string]s resourceData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadAllResources(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - resourceInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) if err != nil { return nil, err } - for _, resourceInner := range resourceInners { - if resourceInner.Resource != nil { - resourceId, resourceIdOk := resourceInner.Resource.GetIdOk() - resourceName, resourceNameOk := resourceInner.Resource.GetNameOk() - resourceType, resourceTypeOk := resourceInner.Resource.GetTypeOk() + for _, innerObj := range apiObjs { + if innerObj.Resource != nil { + resourceId, resourceIdOk := innerObj.Resource.GetIdOk() + resourceName, resourceNameOk := innerObj.Resource.GetNameOk() + resourceType, resourceTypeOk := innerObj.Resource.GetTypeOk() if resourceIdOk && resourceNameOk && resourceTypeOk && *resourceType == management.ENUMRESOURCETYPE_PINGONE_API { resourceData[*resourceId] = *resourceName @@ -101,23 +101,23 @@ func (r *PingOneResourceScopePingOneApiResource) getResourceScopeData(resourceId resourceScopeData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourceScopesApi.ReadAllResourceScopes(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, resourceId).Execute() - resourceScopes, err := pingone.GetManagementAPIObjectsFromIterator[management.ResourceScope](iter, "ReadAllResourceScopes", "GetScopes", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.ResourceScope](iter, "ReadAllResourceScopes", "GetScopes", r.ResourceType()) if err != nil { return nil, err } - for _, scopePingOneApi := range resourceScopes { - scopePingOneApiId, scopePingOneApiIdOk := scopePingOneApi.GetIdOk() - scopePingOneApiName, scopePingOneApiNameOk := scopePingOneApi.GetNameOk() + for _, scope := range apiObjs { + scopeId, scopeIdOk := scope.GetIdOk() + scopeName, scopeNameOk := scope.GetNameOk() - if scopePingOneApiIdOk && scopePingOneApiNameOk { + if scopeIdOk && scopeNameOk { // Make sure the scope name is in the form of one of the following four patterns // p1:read:user, p1:update:user, p1:read:user:{suffix}, or p1:update:user:{suffix} // as supported by https://registry.terraform.io/providers/pingidentity/pingone/latest/docs/resources/resource_scope_pingone_api re := regexp.MustCompile(`^p1:(read|update):user(|:.+)$`) - if re.MatchString(*scopePingOneApiName) { - resourceScopeData[*scopePingOneApiId] = *scopePingOneApiName + if re.MatchString(*scopeName) { + resourceScopeData[*scopeId] = *scopeName } } } diff --git a/internal/connector/pingone/sso/resources/resource_scope_pingone_api_test.go b/internal/connector/pingone/sso/resources/resource_scope_pingone_api_test.go new file mode 100644 index 00000000..0a2975ee --- /dev/null +++ b/internal/connector/pingone/sso/resources/resource_scope_pingone_api_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_ResourceScopePingOneApi(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ResourceScopePingOneApi(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", "PingOne API", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing scopes on the pingone api resource are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/resource_scope_test.go b/internal/connector/pingone/sso/resources/resource_scope_test.go new file mode 100644 index 00000000..bf98dd0a --- /dev/null +++ b/internal/connector/pingone/sso/resources/resource_scope_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_ResourceScope(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ResourceScope(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + resourceTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", resourceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, resourceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_resource_secret.go b/internal/connector/pingone/sso/resources/resource_secret.go similarity index 78% rename from internal/connector/pingone/sso/resources/pingone_resource_secret.go rename to internal/connector/pingone/sso/resources/resource_secret.go index f71a8421..49a5e617 100644 --- a/internal/connector/pingone/sso/resources/pingone_resource_secret.go +++ b/internal/connector/pingone/sso/resources/resource_secret.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -44,20 +45,19 @@ func (r *PingOneResourceSecretResource) ExportAll() (*[]connector.ImportBlock, e } for resourceId, resourceName := range resourceData { - resourceSecretOk, err := r.getResourceSecret(resourceId) + ok, err := r.checkResourceSecretData(resourceId) if err != nil { return nil, err } - - if !resourceSecretOk { + if !ok { continue } commentData := map[string]string{ "Resource ID": resourceId, "Resource Name": resourceName, - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, } importBlock := connector.ImportBlock{ @@ -77,16 +77,16 @@ func (r *PingOneResourceSecretResource) getResourceData() (map[string]string, er resourceData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadAllResources(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - resourceInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", r.ResourceType()) if err != nil { return nil, err } - for _, resourceInner := range resourceInners { - if resourceInner.Resource != nil { - resourceId, resourceIdOk := resourceInner.Resource.GetIdOk() - resourceName, resourceNameOk := resourceInner.Resource.GetNameOk() - resourceType, resourceTypeOk := resourceInner.Resource.GetTypeOk() + for _, innerObj := range apiObjs { + if innerObj.Resource != nil { + resourceId, resourceIdOk := innerObj.Resource.GetIdOk() + resourceName, resourceNameOk := innerObj.Resource.GetNameOk() + resourceType, resourceTypeOk := innerObj.Resource.GetTypeOk() if resourceIdOk && resourceNameOk && resourceTypeOk && *resourceType == management.ENUMRESOURCETYPE_CUSTOM { resourceData[*resourceId] = *resourceName @@ -97,7 +97,8 @@ func (r *PingOneResourceSecretResource) getResourceData() (map[string]string, er return resourceData, nil } -func (r *PingOneResourceSecretResource) getResourceSecret(resourceId string) (bool, error) { +func (r *PingOneResourceSecretResource) checkResourceSecretData(resourceId string) (bool, error) { _, response, err := r.clientInfo.PingOneApiClient.ManagementAPIClient.ResourceClientSecretApi.ReadResourceSecret(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, resourceId).Execute() - return common.HandleClientResponse(response, err, "ReadResourceSecret", r.ResourceType()) + + return common.CheckSingletonResource(response, err, "ReadResourceSecret", r.ResourceType()) } diff --git a/internal/connector/pingone/sso/resources/resource_secret_test.go b/internal/connector/pingone/sso/resources/resource_secret_test.go new file mode 100644 index 00000000..00be8040 --- /dev/null +++ b/internal/connector/pingone/sso/resources/resource_secret_test.go @@ -0,0 +1,35 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_ResourceSecret(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.ResourceSecret(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + resourceTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_secret", resourceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, resourceTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + testutils.ValidateImportBlocks(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/resource_test.go b/internal/connector/pingone/sso/resources/resource_test.go new file mode 100644 index 00000000..52df7cc4 --- /dev/null +++ b/internal/connector/pingone/sso/resources/resource_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_Resource(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.Resource(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing resources are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_schema_attribute.go b/internal/connector/pingone/sso/resources/schema_attribute.go similarity index 85% rename from internal/connector/pingone/sso/resources/pingone_schema_attribute.go rename to internal/connector/pingone/sso/resources/schema_attribute.go index 7a89aa76..60ad9794 100644 --- a/internal/connector/pingone/sso/resources/pingone_schema_attribute.go +++ b/internal/connector/pingone/sso/resources/schema_attribute.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -51,12 +52,12 @@ func (r *PingOneSchemaAttributeResource) ExportAll() (*[]connector.ImportBlock, for schemaAttributeId, schemaAttributeName := range schemaAttributeData { commentData := map[string]string{ - "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, - "Resource Type": r.ResourceType(), - "Schema Attribute ID": schemaAttributeId, - "Schema Attribute Name": schemaAttributeName, "Schema ID": schemaId, "Schema Name": schemaName, + "Schema Attribute ID": schemaAttributeId, + "Schema Attribute Name": schemaAttributeName, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), } importBlock := connector.ImportBlock{ @@ -77,12 +78,12 @@ func (r *PingOneSchemaAttributeResource) getSchemaData() (map[string]string, err schemaData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.SchemasApi.ReadAllSchemas(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - schemas, err := pingone.GetManagementAPIObjectsFromIterator[management.Schema](iter, "ReadAllSchemas", "GetSchemas", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Schema](iter, "ReadAllSchemas", "GetSchemas", r.ResourceType()) if err != nil { return nil, err } - for _, schema := range schemas { + for _, schema := range apiObjs { schemaId, schemaIdOk := schema.GetIdOk() schemaName, schemaNameOk := schema.GetNameOk() if schemaIdOk && schemaNameOk { @@ -97,15 +98,16 @@ func (r *PingOneSchemaAttributeResource) getSchemaAttributeData(schemaId string) schemaAttributeData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.SchemasApi.ReadAllSchemaAttributes(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, schemaId).Execute() - attributeInners, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedAttributesInner](iter, "ReadAllSchemaAttributes", "GetAttributes", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedAttributesInner](iter, "ReadAllSchemaAttributes", "GetAttributes", r.ResourceType()) if err != nil { return nil, err } - for _, attributeInner := range attributeInners { - if attributeInner.SchemaAttribute != nil { - schemaAttributeId, schemaAttributeIdOk := attributeInner.SchemaAttribute.GetIdOk() - schemaAttributeName, schemaAttributeNameOk := attributeInner.SchemaAttribute.GetNameOk() + for _, innerObj := range apiObjs { + if innerObj.SchemaAttribute != nil { + schemaAttributeId, schemaAttributeIdOk := innerObj.SchemaAttribute.GetIdOk() + schemaAttributeName, schemaAttributeNameOk := innerObj.SchemaAttribute.GetNameOk() + if schemaAttributeIdOk && schemaAttributeNameOk { schemaAttributeData[*schemaAttributeId] = *schemaAttributeName } diff --git a/internal/connector/pingone/sso/resources/schema_attribute_test.go b/internal/connector/pingone/sso/resources/schema_attribute_test.go new file mode 100644 index 00000000..ddf049c9 --- /dev/null +++ b/internal/connector/pingone/sso/resources/schema_attribute_test.go @@ -0,0 +1,34 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_SchemaAttribute(t *testing.T) { + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.SchemaAttribute(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SCHEMA_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_SCHEMA_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing attributes are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_sign_on_policy.go b/internal/connector/pingone/sso/resources/sign_on_policy.go similarity index 88% rename from internal/connector/pingone/sso/resources/pingone_sign_on_policy.go rename to internal/connector/pingone/sso/resources/sign_on_policy.go index 64878250..115039bd 100644 --- a/internal/connector/pingone/sso/resources/pingone_sign_on_policy.go +++ b/internal/connector/pingone/sso/resources/sign_on_policy.go @@ -1,4 +1,5 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator package resources @@ -45,10 +46,10 @@ func (r *PingOneSignOnPolicyResource) ExportAll() (*[]connector.ImportBlock, err for signOnPolicyId, signOnPolicyName := range signOnPolicyData { commentData := map[string]string{ + "Sign On Policy ID": signOnPolicyId, + "Sign On Policy Name": signOnPolicyName, "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, "Resource Type": r.ResourceType(), - "Sign-On Policy ID": signOnPolicyId, - "Sign-On Policy Name": signOnPolicyName, } importBlock := connector.ImportBlock{ @@ -68,12 +69,12 @@ func (r *PingOneSignOnPolicyResource) getSignOnPolicyData() (map[string]string, signOnPolicyData := make(map[string]string) iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.SignOnPoliciesApi.ReadAllSignOnPolicies(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() - signOnPolicies, err := pingone.GetManagementAPIObjectsFromIterator[management.SignOnPolicy](iter, "ReadAllSignOnPolicies", "GetSignOnPolicies", r.ResourceType()) + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.SignOnPolicy](iter, "ReadAllSignOnPolicies", "GetSignOnPolicies", r.ResourceType()) if err != nil { return nil, err } - for _, signOnPolicy := range signOnPolicies { + for _, signOnPolicy := range apiObjs { signOnPolicyId, signOnPolicyIdOk := signOnPolicy.GetIdOk() signOnPolicyName, signOnPolicyNameOk := signOnPolicy.GetNameOk() diff --git a/internal/connector/pingone/sso/resources/sign_on_policy_action.go b/internal/connector/pingone/sso/resources/sign_on_policy_action.go new file mode 100644 index 00000000..90d9b959 --- /dev/null +++ b/internal/connector/pingone/sso/resources/sign_on_policy_action.go @@ -0,0 +1,150 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOneSignOnPolicyActionResource{} +) + +type PingOneSignOnPolicyActionResource struct { + clientInfo *connector.ClientInfo +} + +// Utility method for creating a PingOneSignOnPolicyActionResource +func SignOnPolicyAction(clientInfo *connector.ClientInfo) *PingOneSignOnPolicyActionResource { + return &PingOneSignOnPolicyActionResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOneSignOnPolicyActionResource) ResourceType() string { + return "pingone_sign_on_policy_action" +} + +func (r *PingOneSignOnPolicyActionResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + signOnPolicyData, err := r.getPolicyData() + if err != nil { + return nil, err + } + + for signOnPolicyId, signOnPolicyName := range signOnPolicyData { + signOnPolicyActionData, err := r.getSignOnPolicyActionData(signOnPolicyId) + if err != nil { + return nil, err + } + + for signOnPolicysignOnPolicyActionId, signOnPolicyActionType := range signOnPolicyActionData { + commentData := map[string]string{ + "Sign On Policy ID": signOnPolicyId, + "Sign On Policy Name": signOnPolicyName, + "Sign On Policy Action ID": signOnPolicysignOnPolicyActionId, + "Sign On Policy Action Type": signOnPolicyActionType, + "Export Environment ID": r.clientInfo.PingOneExportEnvironmentID, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", signOnPolicyName, signOnPolicyActionType), + ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.PingOneExportEnvironmentID, signOnPolicyId, signOnPolicysignOnPolicyActionId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + } + + return &importBlocks, nil +} + +func (r *PingOneSignOnPolicyActionResource) getPolicyData() (map[string]string, error) { + signOnPolicyData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.SignOnPoliciesApi.ReadAllSignOnPolicies(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.SignOnPolicy](iter, "ReadAllSignOnPolicies", "GetSignOnPolicies", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, signOnPolicy := range apiObjs { + signOnPolicyId, signOnPolicyIdOk := signOnPolicy.GetIdOk() + signOnPolicyName, signOnPolicyNameOk := signOnPolicy.GetNameOk() + + if signOnPolicyIdOk && signOnPolicyNameOk { + signOnPolicyData[*signOnPolicyId] = *signOnPolicyName + } + } + + return signOnPolicyData, nil +} + +func (r *PingOneSignOnPolicyActionResource) getSignOnPolicyActionData(signOnPolicyId string) (map[string]string, error) { + signOnPolicyActionData := make(map[string]string) + + iter := r.clientInfo.PingOneApiClient.ManagementAPIClient.SignOnPolicyActionsApi.ReadAllSignOnPolicyActions(r.clientInfo.PingOneContext, r.clientInfo.PingOneExportEnvironmentID, signOnPolicyId).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.SignOnPolicyAction](iter, "ReadAllSignOnPolicyActions", "GetActions", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, innerObj := range apiObjs { + var ( + signOnPolicyActionId *string + signOnPolicyActionIdOk bool + signOnPolicyActionType *management.EnumSignOnPolicyType + signOnPolicyActionTypeOk bool + ) + + switch { + case innerObj.SignOnPolicyActionAgreement != nil: + signOnPolicyActionId, signOnPolicyActionIdOk = innerObj.SignOnPolicyActionAgreement.GetIdOk() + signOnPolicyActionType, signOnPolicyActionTypeOk = innerObj.SignOnPolicyActionAgreement.GetTypeOk() + case innerObj.SignOnPolicyActionCommon != nil: + signOnPolicyActionId, signOnPolicyActionIdOk = innerObj.SignOnPolicyActionCommon.GetIdOk() + signOnPolicyActionType, signOnPolicyActionTypeOk = innerObj.SignOnPolicyActionCommon.GetTypeOk() + case innerObj.SignOnPolicyActionIDFirst != nil: + signOnPolicyActionId, signOnPolicyActionIdOk = innerObj.SignOnPolicyActionIDFirst.GetIdOk() + signOnPolicyActionType, signOnPolicyActionTypeOk = innerObj.SignOnPolicyActionIDFirst.GetTypeOk() + case innerObj.SignOnPolicyActionIDP != nil: + signOnPolicyActionId, signOnPolicyActionIdOk = innerObj.SignOnPolicyActionIDP.GetIdOk() + signOnPolicyActionType, signOnPolicyActionTypeOk = innerObj.SignOnPolicyActionIDP.GetTypeOk() + case innerObj.SignOnPolicyActionLogin != nil: + signOnPolicyActionId, signOnPolicyActionIdOk = innerObj.SignOnPolicyActionLogin.GetIdOk() + signOnPolicyActionType, signOnPolicyActionTypeOk = innerObj.SignOnPolicyActionLogin.GetTypeOk() + case innerObj.SignOnPolicyActionMFA != nil: + signOnPolicyActionId, signOnPolicyActionIdOk = innerObj.SignOnPolicyActionMFA.GetIdOk() + signOnPolicyActionType, signOnPolicyActionTypeOk = innerObj.SignOnPolicyActionMFA.GetTypeOk() + case innerObj.SignOnPolicyActionPingIDWinLoginPasswordless != nil: + signOnPolicyActionId, signOnPolicyActionIdOk = innerObj.SignOnPolicyActionPingIDWinLoginPasswordless.GetIdOk() + signOnPolicyActionType, signOnPolicyActionTypeOk = innerObj.SignOnPolicyActionPingIDWinLoginPasswordless.GetTypeOk() + case innerObj.SignOnPolicyActionProgressiveProfiling != nil: + signOnPolicyActionId, signOnPolicyActionIdOk = innerObj.SignOnPolicyActionProgressiveProfiling.GetIdOk() + signOnPolicyActionType, signOnPolicyActionTypeOk = innerObj.SignOnPolicyActionProgressiveProfiling.GetTypeOk() + default: + continue + } + + if signOnPolicyActionIdOk && signOnPolicyActionTypeOk { + signOnPolicyActionData[*signOnPolicyActionId] = string(*signOnPolicyActionType) + } + } + + return signOnPolicyActionData, nil +} diff --git a/internal/connector/pingone/sso/resources/sign_on_policy_action_test.go b/internal/connector/pingone/sso/resources/sign_on_policy_action_test.go new file mode 100644 index 00000000..3ae33bb1 --- /dev/null +++ b/internal/connector/pingone/sso/resources/sign_on_policy_action_test.go @@ -0,0 +1,39 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_SignOnPolicyAction(t *testing.T) { + // TODO: Re-enable test after compleition of TRIAGE-26632 + t.SkipNow() + + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.SignOnPolicyAction(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + signOnPolicyTr := tr.Dependencies[0] + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", signOnPolicyTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_TYPE]), + ResourceID: fmt.Sprintf("%s/%s/%s", clientInfo.PingOneExportEnvironmentID, signOnPolicyTr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID], tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing actions are generated, test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/sign_on_policy_test.go b/internal/connector/pingone/sso/resources/sign_on_policy_test.go new file mode 100644 index 00000000..74f77b3f --- /dev/null +++ b/internal/connector/pingone/sso/resources/sign_on_policy_test.go @@ -0,0 +1,37 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func Test_SignOnPolicy(t *testing.T) { + // TODO: Re-enable test after compleition of TRIAGE-26632 + t.SkipNow() + + clientInfo := testutils.GetClientInfo(t) + + tr := pingone_sso_testable_resources.SignOnPolicy(t, clientInfo) + + tr.CreateResource(t) + defer tr.DeleteResource(t) + + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: tr.ExportableResource.ResourceType(), + ResourceName: tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_NAME], + ResourceID: fmt.Sprintf("%s/%s", clientInfo.PingOneExportEnvironmentID, tr.ResourceInfo.CreationInfo[testutils_resource.ENUM_ID]), + }, + } + + // Existing sign-on policies are generated. Test subset. + testutils.ValidateImportBlockSubset(t, tr.ExportableResource, &expectedImportBlocks) +} diff --git a/internal/customtypes/export_format.go b/internal/customtypes/export_format.go index e5919791..856768b1 100644 --- a/internal/customtypes/export_format.go +++ b/internal/customtypes/export_format.go @@ -34,6 +34,7 @@ func (ef *ExportFormat) Set(format string) error { default: return fmt.Errorf("unrecognized export format '%s'. Must be one of: %s", format, strings.Join(ExportFormatValidValues(), ", ")) } + return nil } diff --git a/internal/customtypes/export_service_group.go b/internal/customtypes/export_service_group.go index 3cb79b00..3aa0184a 100644 --- a/internal/customtypes/export_service_group.go +++ b/internal/customtypes/export_service_group.go @@ -32,6 +32,7 @@ func (esg *ExportServiceGroup) Set(serviceGroup string) error { default: return fmt.Errorf("unrecognized service group '%s'. Must be one of: %s", serviceGroup, strings.Join(ExportServiceGroupValidValues(), ", ")) } + return nil } diff --git a/internal/customtypes/export_services.go b/internal/customtypes/export_services.go index 09d5623d..b7e65666 100644 --- a/internal/customtypes/export_services.go +++ b/internal/customtypes/export_services.go @@ -36,6 +36,7 @@ func (es *ExportServices) Set(services string) error { if services == "" || services == "[]" { *es = ExportServices([]string{}) + return nil } @@ -49,8 +50,10 @@ func (es *ExportServices) Set(services string) error { if !slices.Contains(returnServiceList, validService) { returnServiceList = append(returnServiceList, validService) } + return true } + return false }) { return fmt.Errorf("failed to set ExportServices: Invalid service: %s. Allowed services: %s", service, strings.Join(validServices, ", ")) @@ -60,6 +63,7 @@ func (es *ExportServices) Set(services string) error { slices.Sort(returnServiceList) *es = ExportServices(returnServiceList) + return nil } @@ -153,5 +157,6 @@ func (es *ExportServices) Merge(es2 ExportServices) error { } slices.Sort(mergedServices) + return es.Set(strings.Join(mergedServices, ",")) } diff --git a/internal/customtypes/http_method.go b/internal/customtypes/http_method.go index df2f976e..6d379448 100644 --- a/internal/customtypes/http_method.go +++ b/internal/customtypes/http_method.go @@ -46,6 +46,7 @@ func (hm *HTTPMethod) Set(httpMethod string) error { default: return fmt.Errorf("unrecognized HTTP Method: '%s'. Must be one of: %s", httpMethod, strings.Join(HTTPMethodValidValues(), ", ")) } + return nil } diff --git a/internal/customtypes/output_format.go b/internal/customtypes/output_format.go index d6c3dc1d..0c4e3467 100644 --- a/internal/customtypes/output_format.go +++ b/internal/customtypes/output_format.go @@ -37,6 +37,7 @@ func (o *OutputFormat) Set(outputFormat string) error { default: return fmt.Errorf("unrecognized Output Format: '%s'. Must be one of: %s", outputFormat, strings.Join(OutputFormatValidValues(), ", ")) } + return nil } diff --git a/internal/customtypes/pingfederate_auth_type.go b/internal/customtypes/pingfederate_auth_type.go index 82227fef..c61b32f2 100644 --- a/internal/customtypes/pingfederate_auth_type.go +++ b/internal/customtypes/pingfederate_auth_type.go @@ -39,6 +39,7 @@ func (pat *PingFederateAuthenticationType) Set(authType string) error { default: return fmt.Errorf("unrecognized PingFederate Authentication Type: '%s'. Must be one of: %s", authType, strings.Join(PingFederateAuthenticationTypeValidValues(), ", ")) } + return nil } diff --git a/internal/customtypes/pingone_auth_type.go b/internal/customtypes/pingone_auth_type.go index 1e35ba80..63f71bfb 100644 --- a/internal/customtypes/pingone_auth_type.go +++ b/internal/customtypes/pingone_auth_type.go @@ -33,6 +33,7 @@ func (pat *PingOneAuthenticationType) Set(authType string) error { default: return fmt.Errorf("unrecognized PingOne Authentication Type: '%s'. Must be one of: %s", authType, strings.Join(PingOneAuthenticationTypeValidValues(), ", ")) } + return nil } diff --git a/internal/customtypes/pingone_region_code.go b/internal/customtypes/pingone_region_code.go index 642fad70..eeba73da 100644 --- a/internal/customtypes/pingone_region_code.go +++ b/internal/customtypes/pingone_region_code.go @@ -51,6 +51,7 @@ func (prc *PingOneRegionCode) Set(regionCode string) error { default: return fmt.Errorf("unrecognized PingOne Region Code: '%s'. Must be one of: %s", regionCode, strings.Join(PingOneRegionCodeValidValues(), ", ")) } + return nil } diff --git a/internal/customtypes/request_services.go b/internal/customtypes/request_services.go index 094c9a1e..38a13453 100644 --- a/internal/customtypes/request_services.go +++ b/internal/customtypes/request_services.go @@ -33,6 +33,7 @@ func (rs *RequestService) Set(service string) error { default: return fmt.Errorf("unrecognized Request Service: '%s'. Must be one of: %s", service, strings.Join(RequestServiceValidValues(), ", ")) } + return nil } diff --git a/internal/customtypes/uuid.go b/internal/customtypes/uuid.go index f58a7734..8aae001b 100644 --- a/internal/customtypes/uuid.go +++ b/internal/customtypes/uuid.go @@ -21,6 +21,7 @@ func (u *UUID) Set(val string) error { if val == "" { *u = UUID(val) + return nil } diff --git a/internal/input/input.go b/internal/input/input.go index 2128040a..1b3116ec 100644 --- a/internal/input/input.go +++ b/internal/input/input.go @@ -33,6 +33,7 @@ func RunPromptConfirm(message string, rc io.ReadCloser) (bool, error) { if errors.Is(err, promptui.ErrAbort) { return false, nil } + return false, err } @@ -48,5 +49,6 @@ func RunPromptSelect(message string, items []string, rc io.ReadCloser) (selectio } _, selection, err = p.Run() + return selection, err } diff --git a/internal/input/input_test.go b/internal/input/input_test.go index 03855c4b..e1b90821 100644 --- a/internal/input/input_test.go +++ b/internal/input/input_test.go @@ -1,11 +1,12 @@ // Copyright © 2025 Ping Identity Corporation -package input +package input_test import ( "fmt" "testing" + "github.com/pingidentity/pingcli/internal/input" "github.com/pingidentity/pingcli/internal/testing/testutils" ) @@ -13,14 +14,15 @@ func mockValidateFunc(input string) error { if input == "invalid" { return fmt.Errorf("invalid input") } + return nil } // Test RunPrompt function func TestRunPrompt(t *testing.T) { testInput := "test-input" - reader := testutils.WriteStringToPipe(fmt.Sprintf("%s\n", testInput), t) - parsedInput, err := RunPrompt("test", nil, reader) + reader := testutils.WriteStringToPipe(t, fmt.Sprintf("%s\n", testInput)) + parsedInput, err := input.RunPrompt("test", nil, reader) if err != nil { t.Errorf("Error running RunPrompt: %v", err) } @@ -33,8 +35,8 @@ func TestRunPrompt(t *testing.T) { // Test RunPrompt function with validation func TestRunPromptWithValidation(t *testing.T) { testInput := "test-input" - reader := testutils.WriteStringToPipe(fmt.Sprintf("%s\n", testInput), t) - parsedInput, err := RunPrompt("test", mockValidateFunc, reader) + reader := testutils.WriteStringToPipe(t, fmt.Sprintf("%s\n", testInput)) + parsedInput, err := input.RunPrompt("test", mockValidateFunc, reader) if err != nil { t.Errorf("Error running RunPrompt: %v", err) } @@ -47,8 +49,8 @@ func TestRunPromptWithValidation(t *testing.T) { // Test RunPrompt function with validation error func TestRunPromptWithValidationError(t *testing.T) { testInput := "invalid" - reader := testutils.WriteStringToPipe(fmt.Sprintf("%s\n", testInput), t) - _, err := RunPrompt("test", mockValidateFunc, reader) + reader := testutils.WriteStringToPipe(t, fmt.Sprintf("%s\n", testInput)) + _, err := input.RunPrompt("test", mockValidateFunc, reader) if err == nil { t.Errorf("Expected error, but got nil") } @@ -56,8 +58,8 @@ func TestRunPromptWithValidationError(t *testing.T) { // Test RunPromptConfirm function func TestRunPromptConfirm(t *testing.T) { - reader := testutils.WriteStringToPipe("y\n", t) - parsedInput, err := RunPromptConfirm("test", reader) + reader := testutils.WriteStringToPipe(t, "y\n") + parsedInput, err := input.RunPromptConfirm("test", reader) if err != nil { t.Errorf("Error running RunPromptConfirm: %v", err) } @@ -69,8 +71,8 @@ func TestRunPromptConfirm(t *testing.T) { // Test RunPromptConfirm function with no input func TestRunPromptConfirmNoInput(t *testing.T) { - reader := testutils.WriteStringToPipe("\n", t) - parsedInput, err := RunPromptConfirm("test", reader) + reader := testutils.WriteStringToPipe(t, "\n") + parsedInput, err := input.RunPromptConfirm("test", reader) if err != nil { t.Errorf("Error running RunPromptConfirm: %v", err) } @@ -82,8 +84,8 @@ func TestRunPromptConfirmNoInput(t *testing.T) { // Test RunPromptConfirm function with "n" input func TestRunPromptConfirmNoInputN(t *testing.T) { - reader := testutils.WriteStringToPipe("n\n", t) - parsedInput, err := RunPromptConfirm("test", reader) + reader := testutils.WriteStringToPipe(t, "n\n") + parsedInput, err := input.RunPromptConfirm("test", reader) if err != nil { t.Errorf("Error running RunPromptConfirm: %v", err) } @@ -95,8 +97,8 @@ func TestRunPromptConfirmNoInputN(t *testing.T) { // Test RunPromptConfirm function with junk input func TestRunPromptConfirmJunkInput(t *testing.T) { - reader := testutils.WriteStringToPipe("junk\n", t) - parsedInput, err := RunPromptConfirm("test", reader) + reader := testutils.WriteStringToPipe(t, "junk\n") + parsedInput, err := input.RunPromptConfirm("test", reader) if err != nil { t.Errorf("Error running RunPromptConfirm: %v", err) } @@ -109,8 +111,8 @@ func TestRunPromptConfirmJunkInput(t *testing.T) { // Test RunPromptSelect function func TestRunPromptSelect(t *testing.T) { testInput := "test-input" - reader := testutils.WriteStringToPipe(fmt.Sprintf("%s\n", testInput), t) - parsedInput, err := RunPromptSelect("test", []string{testInput}, reader) + reader := testutils.WriteStringToPipe(t, fmt.Sprintf("%s\n", testInput)) + parsedInput, err := input.RunPromptSelect("test", []string{testInput}, reader) if err != nil { t.Errorf("Error running RunPromptSelect: %v", err) } diff --git a/internal/logger/logger.go b/internal/logger/logger.go index 27d2c77d..a8ae755b 100644 --- a/internal/logger/logger.go +++ b/internal/logger/logger.go @@ -5,6 +5,7 @@ package logger import ( "io" "os" + "path/filepath" "sync" "time" @@ -20,7 +21,6 @@ var ( // Create a get function for a standardized zerolog logger func Get() zerolog.Logger { once.Do(func() { - // Viper config is not initialized yet, so read environment variables directly logLevelEnv := os.Getenv("PINGCLI_LOG_LEVEL") logPathEnv := os.Getenv("PINGCLI_LOG_PATH") @@ -52,14 +52,13 @@ func Get() zerolog.Logger { // Handle log file creation when PINGCLI_LOG_PATH is defined if logPathEnv != "" && logLevel != zerolog.Disabled { - var err error + logPathEnv = filepath.Clean(logPathEnv) output, err = os.Create(logPathEnv) if err != nil { // Most likely the directory specified for the log path does not exist log.Fatal().Err(err).Msgf("Unable to create log file at: %s", logPathEnv) } - } else { output = zerolog.ConsoleWriter{ Out: os.Stdout, @@ -73,5 +72,6 @@ func Get() zerolog.Logger { Timestamp(). Logger() }) + return logger } diff --git a/internal/output/output.go b/internal/output/output.go index cbf3be01..6319885a 100644 --- a/internal/output/output.go +++ b/internal/output/output.go @@ -44,14 +44,14 @@ func SetColorize() { func Message(message string, fields map[string]interface{}) { l := logger.Get() - print(message, fields, white, l.Info) + printOutput(message, fields, white, l.Info) } // This function outputs green text to inform the user of success func Success(message string, fields map[string]interface{}) { l := logger.Get() - print(fmt.Sprintf("SUCCESS: %s", message), fields, green, l.Info) + printOutput(fmt.Sprintf("SUCCESS: %s", message), fields, green, l.Info) } // This function outputs yellow text to inform the user of a warning @@ -59,7 +59,7 @@ func Warn(message string, fields map[string]interface{}) { l := logger.Get() detailedExitCodeWarnLogged = true - print(fmt.Sprintf("WARNING: %s", message), fields, yellow, l.Warn) + printOutput(fmt.Sprintf("WARNING: %s", message), fields, yellow, l.Warn) } func DetailedExitCodeWarnLogged() (bool, error) { @@ -71,6 +71,7 @@ func DetailedExitCodeWarnLogged() (bool, error) { if detailedExitCodeEnabled == "true" { return detailedExitCodeWarnLogged, nil } + return false, nil } @@ -78,14 +79,14 @@ func DetailedExitCodeWarnLogged() (bool, error) { // or input to pingcli has caused an error. func UserError(message string, fields map[string]interface{}) { l := logger.Get() - print(fmt.Sprintf("ERROR: %s", message), fields, red, l.Error) + printOutput(fmt.Sprintf("ERROR: %s", message), fields, red, l.Error) } // This functions is used to inform the user their configuration // or input to pingcli has caused an fatal error that exits the program immediately. func UserFatal(message string, fields map[string]interface{}) { l := logger.Get() - print(fmt.Sprintf("FATAL: %s", message), fields, boldRed, l.Fatal) + printOutput(fmt.Sprintf("FATAL: %s", message), fields, boldRed, l.Fatal) } // This function is used to inform the user a system-level error @@ -102,10 +103,10 @@ Please raise an issue at https://github.com/pingidentity/pingcli`, // l.Fatal() exits the program prematurely before the message is printed // pass nil to print the message before exiting - print(systemMsg, fields, boldRed, l.Fatal) + printOutput(systemMsg, fields, boldRed, l.Fatal) } -func print(message string, fields map[string]interface{}, colorFunc func(format string, a ...interface{}) string, +func printOutput(message string, fields map[string]interface{}, colorFunc func(format string, a ...interface{}) string, logEventFunc func() *zerolog.Event) { SetColorize() @@ -116,18 +117,17 @@ func print(message string, fields map[string]interface{}, colorFunc func(format switch outputFormat { case customtypes.ENUM_OUTPUT_FORMAT_TEXT: - printText(message, fields, colorFunc, logEventFunc) + printTextOutput(message, fields, colorFunc, logEventFunc) case customtypes.ENUM_OUTPUT_FORMAT_JSON: - printJson(message, fields, logEventFunc) + printJsonOutput(message, fields, logEventFunc) default: l := logger.Get() - printText(fmt.Sprintf("Output format %q is not recognized. Defaulting to \"text\" output", outputFormat), nil, yellow, l.Warn) - printText(message, fields, colorFunc, logEventFunc) + printTextOutput(fmt.Sprintf("Output format %q is not recognized. Defaulting to \"text\" output", outputFormat), nil, yellow, l.Warn) + printTextOutput(message, fields, colorFunc, logEventFunc) } - } -func printText(message string, fields map[string]interface{}, colorFunc func(format string, a ...interface{}) string, +func printTextOutput(message string, fields map[string]interface{}, colorFunc func(format string, a ...interface{}) string, logEventFunc func() *zerolog.Event) { l := logger.Get() @@ -147,7 +147,7 @@ func printText(message string, fields map[string]interface{}, colorFunc func(for logEventFunc().Msg(colorFunc(message)) } -func printJson(message string, fields map[string]interface{}, logEventFunc func() *zerolog.Event) { +func printJsonOutput(message string, fields map[string]interface{}, logEventFunc func() *zerolog.Event) { l := logger.Get() if fields == nil { @@ -164,6 +164,7 @@ func printJson(message string, fields map[string]interface{}, logEventFunc func( jsonOut, err := json.MarshalIndent(fields, "", " ") if err != nil { l.Error().Err(err).Msgf("Failed to serialize output as JSON") + return } diff --git a/internal/profiles/validate.go b/internal/profiles/validate.go index 8f2ec38d..7366c31f 100644 --- a/internal/profiles/validate.go +++ b/internal/profiles/validate.go @@ -31,7 +31,7 @@ func Validate() (err error) { activeProfileName, err := GetOptionValue(options.RootActiveProfileOption) activeProfileName = strings.ToLower(activeProfileName) if err != nil { - return fmt.Errorf("failed to validate Ping CLI configuration: %v", err) + return fmt.Errorf("failed to validate Ping CLI configuration: %w", err) } if !slices.Contains(profileNames, activeProfileName) { return fmt.Errorf("failed to validate Ping CLI configuration: active profile '%s' not found in configuration "+ @@ -42,15 +42,15 @@ func Validate() (err error) { for _, pName := range profileNames { subViper, err := GetMainConfig().GetProfileViper(pName) if err != nil { - return fmt.Errorf("failed to validate Ping CLI configuration: %v", err) + return fmt.Errorf("failed to validate Ping CLI configuration: %w", err) } if err := validateProfileKeys(pName, subViper); err != nil { - return fmt.Errorf("failed to validate Ping CLI configuration: %v", err) + return fmt.Errorf("failed to validate Ping CLI configuration: %w", err) } if err := validateProfileValues(pName, subViper); err != nil { - return fmt.Errorf("failed to validate Ping CLI configuration: %v", err) + return fmt.Errorf("failed to validate Ping CLI configuration: %w", err) } } @@ -63,6 +63,7 @@ func validateProfileNames(profileNames []string) error { return err } } + return nil } @@ -84,8 +85,10 @@ func validateProfileKeys(profileName string, profileViper *viper.Viper) error { if len(invalidKeys) > 0 { invalidKeysStr := strings.Join(invalidKeys, ", ") validKeysStr := strings.Join(validProfileKeys, ", ") + return fmt.Errorf("invalid configuration key(s) found in profile %s: %s\nMust use one of: %s", profileName, invalidKeysStr, validKeysStr) } + return nil } @@ -106,7 +109,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: b := new(customtypes.Bool) if err = b.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a boolean value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a boolean value: %w", pName, typedValue, key, err) } case bool: continue @@ -120,7 +123,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: u := new(customtypes.UUID) if err = u.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a UUID value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a UUID value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not a UUID value", pName, typedValue, key) @@ -132,7 +135,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: o := new(customtypes.OutputFormat) if err = o.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not an output format value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not an output format value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not an output format value", pName, typedValue, key) @@ -144,7 +147,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: prc := new(customtypes.PingOneRegionCode) if err = prc.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a PingOne Region Code value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a PingOne Region Code value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not a PingOne Region Code value", pName, typedValue, key) @@ -156,7 +159,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: s := new(customtypes.String) if err = s.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a string value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a string value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not a string value", pName, typedValue, key) @@ -168,7 +171,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: ss := new(customtypes.StringSlice) if err = ss.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a string slice value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a string slice value: %w", pName, typedValue, key, err) } case []any: ss := new(customtypes.StringSlice) @@ -176,7 +179,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) switch innerTypedValue := v.(type) { case string: if err = ss.Set(innerTypedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a string slice value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a string slice value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not a string slice value", pName, typedValue, key) @@ -192,7 +195,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: esg := new(customtypes.ExportServiceGroup) if err = esg.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a export service group value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a export service group value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not a export service group value", pName, typedValue, key) @@ -204,7 +207,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: es := new(customtypes.ExportServices) if err = es.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a export service value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a export service value: %w", pName, typedValue, key, err) } case []any: es := new(customtypes.ExportServices) @@ -212,12 +215,11 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) switch innerTypedValue := v.(type) { case string: if err = es.Set(innerTypedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a export service value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a export service value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not a export service value", pName, typedValue, key) } - } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not a export service value", pName, typedValue, key) @@ -229,7 +231,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: ef := new(customtypes.ExportFormat) if err = ef.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not an export format value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not an export format value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not an export format value", pName, typedValue, key) @@ -241,7 +243,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: hm := new(customtypes.HTTPMethod) if err = hm.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not an HTTP method value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not an HTTP method value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not an HTTP method value", pName, typedValue, key) @@ -253,7 +255,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: rs := new(customtypes.RequestService) if err = rs.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a request service value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a request service value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not a request service value", pName, typedValue, key) @@ -269,7 +271,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: i := new(customtypes.Int) if err = i.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not an int value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not an int value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not an int value", pName, typedValue, key) @@ -281,7 +283,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: pfa := new(customtypes.PingFederateAuthenticationType) if err = pfa.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a PingFederate Authentication Type value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a PingFederate Authentication Type value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not a PingFederate Authentication Type value", pName, typedValue, key) @@ -293,7 +295,7 @@ func validateProfileValues(pName string, profileViper *viper.Viper) (err error) case string: pat := new(customtypes.PingOneAuthenticationType) if err = pat.Set(typedValue); err != nil { - return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a PingOne Authentication Type value: %v", pName, typedValue, key, err) + return fmt.Errorf("profile '%s': variable type '%T' for key '%s' is not a PingOne Authentication Type value: %w", pName, typedValue, key, err) } default: return fmt.Errorf("profile '%s': variable type %T for key '%s' is not a PingOne Authentication Type value", pName, typedValue, key) diff --git a/internal/profiles/viper.go b/internal/profiles/viper.go index f2cecc7d..1f99cbac 100644 --- a/internal/profiles/viper.go +++ b/internal/profiles/viper.go @@ -50,7 +50,7 @@ func (m MainConfig) ViperInstance() *viper.Viper { return m.viperInstance } -func (m *MainConfig) ChangeActiveProfile(pName string) (err error) { +func (m MainConfig) ChangeActiveProfile(pName string) (err error) { if err = m.ValidateExistingProfileName(pName); err != nil { return err } @@ -180,7 +180,7 @@ func (m MainConfig) ProfileNames() (profileNames []string) { keySet := make(map[string]struct{}) mainViperKeys := m.ViperInstance().AllKeys() for _, key := range mainViperKeys { - //Do not add Active profile viper key to profileNames + // Do not add Active profile viper key to profileNames if strings.EqualFold(key, options.RootActiveProfileOption.ViperKey) { continue } @@ -296,7 +296,7 @@ func (m MainConfig) ProfileToString(pName string) (yamlStr string, err error) { yaml, err := yaml.Marshal(subViper.AllSettings()) if err != nil { - return "", fmt.Errorf("failed to yaml marshal active profile: %v", err) + return "", fmt.Errorf("failed to yaml marshal active profile: %w", err) } return string(yaml), nil @@ -318,7 +318,7 @@ func (m MainConfig) ProfileViperValue(pName, viperKey string) (yamlStr string, e yaml, err := yaml.Marshal(subViper.Get(viperKey)) if err != nil { - return "", fmt.Errorf("failed to yaml marshal configuration value from key '%s': %v", viperKey, err) + return "", fmt.Errorf("failed to yaml marshal configuration value from key '%s': %w", viperKey, err) } return string(yaml), nil @@ -342,7 +342,7 @@ func (m MainConfig) DefaultMissingViperKeys() (err error) { } err = m.SaveProfile(pName, subViper) if err != nil { - return fmt.Errorf("Failed to save profile '%s': %v", pName, err) + return fmt.Errorf("failed to save profile '%s': %w", pName, err) } } @@ -374,6 +374,7 @@ func GetOptionValue(opt options.Option) (pFlagValue string, err error) { // 4th priority: default value if opt.DefaultValue != nil { pFlagValue = opt.DefaultValue.String() + return pFlagValue, nil } @@ -446,6 +447,7 @@ func ViperValueFromOption(opt options.Option) (value string, ok bool, err error) for _, v := range typedValue { strSlice = append(strSlice, fmt.Sprintf("%v", v)) } + return strings.Join(strSlice, ","), true, nil default: return fmt.Sprintf("%v", typedValue), true, nil diff --git a/internal/testing/testutils/utils.go b/internal/testing/testutils/utils.go index 5e725d32..3e3ab110 100644 --- a/internal/testing/testutils/utils.go +++ b/internal/testing/testutils/utils.go @@ -11,6 +11,7 @@ import ( "crypto/x509" "crypto/x509/pkix" "encoding/pem" + "errors" "fmt" "math/big" "net/http" @@ -23,7 +24,6 @@ import ( "github.com/patrickcping/pingone-go-sdk-v2/management" "github.com/patrickcping/pingone-go-sdk-v2/pingone" "github.com/pingidentity/pingcli/internal/configuration" - "github.com/pingidentity/pingcli/internal/configuration/options" "github.com/pingidentity/pingcli/internal/connector" pingfederateGoClient "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) @@ -50,14 +50,10 @@ func GetClientInfo(t *testing.T) *connector.ClientInfo { func initPingFederateClientInfo(t *testing.T, clientInfo *connector.ClientInfo) { t.Helper() - httpsHost := os.Getenv(options.PingFederateHTTPSHostOption.EnvVar) - adminApiPath := os.Getenv(options.PingFederateAdminAPIPathOption.EnvVar) - pfUsername := os.Getenv(options.PingFederateBasicAuthUsernameOption.EnvVar) - pfPassword := os.Getenv(options.PingFederateBasicAuthPasswordOption.EnvVar) - - if httpsHost == "" || adminApiPath == "" || pfUsername == "" || pfPassword == "" { - t.Fatalf("Unable to retrieve env var value for one or more of httpsHost, adminApiPath, pfUsername, pfPassword.") - } + httpsHost := "https://localhost:9999" + adminApiPath := "/pf-admin-api/v1" + pfUsername := "Administrator" + pfPassword := "2FederateM0re" pfClientConfig := pingfederateGoClient.NewConfiguration() pfClientConfig.DefaultHeader["X-Xsrf-Header"] = "PingFederate" @@ -73,7 +69,7 @@ func initPingFederateClientInfo(t *testing.T, clientInfo *connector.ClientInfo) pfClientConfig.HTTPClient = httpClient clientInfo.PingFederateApiClient = pingfederateGoClient.NewAPIClient(pfClientConfig) - clientInfo.PingFederateContext = context.WithValue(context.Background(), pingfederateGoClient.ContextBasicAuth, pingfederateGoClient.BasicAuth{ + clientInfo.PingFederateContext = context.WithValue(context.WithoutCancel(t.Context()), pingfederateGoClient.ContextBasicAuth, pingfederateGoClient.BasicAuth{ UserName: pfUsername, Password: pfPassword, }) @@ -84,10 +80,10 @@ func initPingOneClientInfo(t *testing.T, clientInfo *connector.ClientInfo) { // Grab environment vars for initializing the API client. // These are set in GitHub Actions. - clientID := os.Getenv(options.PingOneAuthenticationWorkerClientIDOption.EnvVar) - clientSecret := os.Getenv(options.PingOneAuthenticationWorkerClientSecretOption.EnvVar) - environmentId := os.Getenv(options.PlatformExportPingOneEnvironmentIDOption.EnvVar) - regionCode := os.Getenv(options.PingOneRegionCodeOption.EnvVar) + clientID := os.Getenv("TEST_PINGONE_WORKER_CLIENT_ID") + clientSecret := os.Getenv("TEST_PINGONE_WORKER_CLIENT_SECRET") + environmentId := os.Getenv("TEST_PINGONE_ENVIRONMENT_ID") + regionCode := os.Getenv("TEST_PINGONE_REGION_CODE") sdkRegionCode := management.EnumRegionCode(regionCode) if clientID == "" || clientSecret == "" || environmentId == "" || regionCode == "" { @@ -102,7 +98,7 @@ func initPingOneClientInfo(t *testing.T, clientInfo *connector.ClientInfo) { } // Make empty context for testing - ctx := context.Background() + ctx := context.WithoutCancel(t.Context()) // Initialize the API client client, err := apiConfig.APIClient(ctx) @@ -116,12 +112,14 @@ func initPingOneClientInfo(t *testing.T, clientInfo *connector.ClientInfo) { clientInfo.PingOneExportEnvironmentID = environmentId } -func ValidateImportBlocks(t *testing.T, resource connector.ExportableResource, expectedImportBlocks *[]connector.ImportBlock) { +func getValidatedActualImportBlocks(t *testing.T, resource connector.ExportableResource) *[]connector.ImportBlock { t.Helper() importBlocks, err := resource.ExportAll() if err != nil { - t.Fatalf("Failed to export %s: %s", resource.ResourceType(), err.Error()) + t.Errorf("Failed to export %s: %s", resource.ResourceType(), err.Error()) + + return nil } // Make sure the resource name and id in each import block is unique across all import blocks @@ -130,43 +128,123 @@ func ValidateImportBlocks(t *testing.T, resource connector.ExportableResource, e for _, importBlock := range *importBlocks { if resourceNames[importBlock.ResourceName] { t.Errorf("Resource name %s is not unique", importBlock.ResourceName) + + return nil } resourceNames[importBlock.ResourceName] = true if resourceIDs[importBlock.ResourceID] { t.Errorf("Resource ID %s is not unique", importBlock.ResourceID) + + return nil } resourceIDs[importBlock.ResourceID] = true } + return importBlocks +} + +func getValidatedExpectedImportBlocks(t *testing.T, expectedImportBlocks *[]connector.ImportBlock) *[]connector.ImportBlock { + t.Helper() + // Check if provided pointer to expected import blocks is nil, and created an empty slice if so. if expectedImportBlocks == nil { expectedImportBlocks = &[]connector.ImportBlock{} } + // Make sure the resource name and id in each import block is unique across all import blocks + resourceNames := map[string]bool{} + resourceIDs := map[string]bool{} + for _, importBlock := range *expectedImportBlocks { + if resourceNames[importBlock.ResourceName] { + t.Errorf("Resource name %s is not unique", importBlock.ResourceName) + } + resourceNames[importBlock.ResourceName] = true + + if resourceIDs[importBlock.ResourceID] { + t.Errorf("Resource ID %s is not unique", importBlock.ResourceID) + } + resourceIDs[importBlock.ResourceID] = true + } + + return expectedImportBlocks +} + +func ValidateImportBlocks(t *testing.T, resource connector.ExportableResource, expectedImportBlocks *[]connector.ImportBlock) { + t.Helper() + + actualImportBlocks := getValidatedActualImportBlocks(t, resource) + expectedImportBlocks = getValidatedExpectedImportBlocks(t, expectedImportBlocks) + expectedImportBlocksMap := map[string]connector.ImportBlock{} for _, importBlock := range *expectedImportBlocks { expectedImportBlocksMap[importBlock.ResourceName] = importBlock } // Check number of export blocks - expectedNumberOfBlocks := len(expectedImportBlocksMap) - actualNumberOfBlocks := len(*importBlocks) + expectedNumberOfBlocks := len(*expectedImportBlocks) + actualNumberOfBlocks := len(*actualImportBlocks) if actualNumberOfBlocks != expectedNumberOfBlocks { - t.Fatalf("Expected %d import blocks, got %d", expectedNumberOfBlocks, actualNumberOfBlocks) + t.Errorf("Expected %d import blocks, got %d", expectedNumberOfBlocks, actualNumberOfBlocks) + + return } // Make sure the import blocks match the expected import blocks - for _, importBlock := range *importBlocks { - expectedImportBlock, ok := expectedImportBlocksMap[importBlock.ResourceName] + for _, actualImportBlock := range *actualImportBlocks { + expectedImportBlock, ok := expectedImportBlocksMap[actualImportBlock.ResourceName] if !ok { - t.Errorf("No matching expected import block for generated import block:\n%s", importBlock.String()) + t.Errorf("No matching expected import block for generated import block:\n%s", actualImportBlock.String()) + continue } - if !importBlock.Equals(expectedImportBlock) { - t.Errorf("Expected import block \n%s\n Got import block \n%s", expectedImportBlock.String(), importBlock.String()) + if !actualImportBlock.Equals(expectedImportBlock) { + t.Errorf("Expected import block \n%s\n Got import block \n%s", expectedImportBlock.String(), actualImportBlock.String()) + } + } +} + +// Similar to ValidateImportBlocks, but only checks if the expectedImportBlocks are a subset of the actual import blocks. +// This is useful for resources that have pre-configured resources that are not created by the test. +func ValidateImportBlockSubset(t *testing.T, resource connector.ExportableResource, expectedImportBlocks *[]connector.ImportBlock) { + t.Helper() + + actualImportBlocks := getValidatedActualImportBlocks(t, resource) + expectedImportBlocks = getValidatedExpectedImportBlocks(t, expectedImportBlocks) + + actualImportBlocksMap := map[string]connector.ImportBlock{} + for _, importBlock := range *actualImportBlocks { + actualImportBlocksMap[importBlock.ResourceName] = importBlock + } + + // Check number of export blocks + expectedNumberOfBlocks := len(*expectedImportBlocks) + actualNumberOfBlocks := len(*actualImportBlocks) + if actualNumberOfBlocks < expectedNumberOfBlocks { + t.Errorf("Expected import blocks count (%d) is greater than Actual import blocks count (%d)", expectedNumberOfBlocks, actualNumberOfBlocks) + + return + } + if expectedNumberOfBlocks == 0 { + t.Errorf("Expected import blocks count is 0") + + return + } + + // For each expected import block, make sure it matches an actual import block + for _, expectedImportBlock := range *expectedImportBlocks { + actualImportBlock, ok := actualImportBlocksMap[expectedImportBlock.ResourceName] + + if !ok { + t.Errorf("No matching actual import block for expected import block:\n%s", expectedImportBlock.String()) + + continue + } + + if !actualImportBlock.Equals(expectedImportBlock) { + t.Errorf("Expected import block \n%s\n Got import block \n%s", expectedImportBlock.String(), actualImportBlock.String()) } } } @@ -176,11 +254,13 @@ func CheckExpectedError(t *testing.T, err error, errMessagePattern *string) { if err == nil && errMessagePattern != nil { t.Errorf("Error message did not match expected regex\n\nerror message: '%v'\n\nregex pattern %s", err, *errMessagePattern) + return } if err != nil && errMessagePattern == nil { t.Errorf("Expected no error, but got error: %v", err) + return } @@ -194,7 +274,7 @@ func CheckExpectedError(t *testing.T, err error, errMessagePattern *string) { // Get os.File with string written to it. // The caller is responsible for closing the file. -func WriteStringToPipe(str string, t *testing.T) (reader *os.File) { +func WriteStringToPipe(t *testing.T, str string) (reader *os.File) { t.Helper() reader, writer, err := os.Pipe() @@ -202,17 +282,16 @@ func WriteStringToPipe(str string, t *testing.T) (reader *os.File) { t.Fatal(err) } - defer writer.Close() - if _, err := writer.WriteString(str); err != nil { - reader.Close() - t.Fatal(err) + rcErr := reader.Close() + wcErr := writer.Close() + t.Fatal(errors.Join(err, rcErr, wcErr)) } // Close the writer to simulate EOF if err = writer.Close(); err != nil { - reader.Close() - t.Fatal(err) + cErr := reader.Close() + t.Fatal(errors.Join(err, cErr)) } return reader @@ -222,7 +301,7 @@ func CreateX509Certificate() (string, error) { serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) if err != nil { - return "", fmt.Errorf("failed to generate serial number: %v", err) + return "", fmt.Errorf("failed to generate serial number: %w", err) } certificateCA := &x509.Certificate{ @@ -246,12 +325,12 @@ func CreateX509Certificate() (string, error) { caPrivKey, err := rsa.GenerateKey(rand.Reader, 4096) if err != nil { - return "", fmt.Errorf("failed to generate private key: %v", err) + return "", fmt.Errorf("failed to generate private key: %w", err) } caBytes, err := x509.CreateCertificate(rand.Reader, certificateCA, certificateCA, &caPrivKey.PublicKey, caPrivKey) if err != nil { - return "", fmt.Errorf("failed to create certificate: %v", err) + return "", fmt.Errorf("failed to create certificate: %w", err) } caPEM := new(bytes.Buffer) @@ -260,7 +339,7 @@ func CreateX509Certificate() (string, error) { Bytes: caBytes, }) if err != nil { - return "", fmt.Errorf("failed to encode certificate: %v", err) + return "", fmt.Errorf("failed to encode certificate: %w", err) } return caPEM.String(), nil diff --git a/internal/testing/testutils_resource/pingfederate/authentication_api_application.go b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_api_application.go similarity index 59% rename from internal/testing/testutils_resource/pingfederate/authentication_api_application.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/authentication_api_application.go index 1e644c9a..015cf1ac 100644 --- a/internal/testing/testutils_resource/pingfederate/authentication_api_application.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_api_application.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -12,7 +13,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateAuthenticationApiApplication(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func AuthenticationApiApplication(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -24,13 +25,14 @@ func TestableResource_PingFederateAuthenticationApiApplication(t *testing.T, cli } } -func createAuthenticationApiApplication(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createAuthenticationApiApplication(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createAuthenticationApiApplication(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createAuthenticationApiApplication(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.AuthenticationApiAPI.CreateApplication(clientInfo.PingFederateContext) clientStruct := client.AuthnApiApplication{ @@ -44,29 +46,48 @@ func createAuthenticationApiApplication(t *testing.T, clientInfo *connector.Clie resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateApplication", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteAuthenticationApiApplication(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteAuthenticationApiApplication(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.AuthenticationApiAPI.DeleteApplication(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteAuthenticationApiApplication(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.AuthenticationApiAPI.DeleteApplication(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteApplication", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/authentication_api_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_api_settings.go similarity index 62% rename from internal/testing/testutils_resource/pingfederate/authentication_api_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/authentication_api_settings.go index 9346d19d..01f203e9 100644 --- a/internal/testing/testutils_resource/pingfederate/authentication_api_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_api_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateAuthenticationApiSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func AuthenticationApiSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -18,6 +19,6 @@ func TestableResource_PingFederateAuthenticationApiSettings(t *testing.T, client CreateFunc: nil, DeleteFunc: nil, Dependencies: nil, - ExportableResource: resources.AuthenticationApiApplication(clientInfo), + ExportableResource: resources.AuthenticationApiSettings(clientInfo), } } diff --git a/internal/testing/testutils_resource/pingfederate/authentication_policies.go b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policies.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/authentication_policies.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policies.go index 71fd9b8d..a7ba4471 100644 --- a/internal/testing/testutils_resource/pingfederate/authentication_policies.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policies.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateAuthenticationPolicies(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func AuthenticationPolicies(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/authentication_policies_fragment.go b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policies_fragment.go similarity index 68% rename from internal/testing/testutils_resource/pingfederate/authentication_policies_fragment.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policies_fragment.go index c1a2f168..f452e98e 100644 --- a/internal/testing/testutils_resource/pingfederate/authentication_policies_fragment.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policies_fragment.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateAuthenticationPoliciesFragment(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func AuthenticationPoliciesFragment(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,19 +22,20 @@ func TestableResource_PingFederateAuthenticationPoliciesFragment(t *testing.T, c CreateFunc: createAuthenticationPoliciesFragment, DeleteFunc: deleteAuthenticationPoliciesFragment, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateIdpAdapter(t, clientInfo), + IdpAdapter(t, clientInfo), }, ExportableResource: resources.AuthenticationPoliciesFragment(clientInfo), } } -func createAuthenticationPoliciesFragment(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createAuthenticationPoliciesFragment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createAuthenticationPoliciesFragment(): %v", strArgs) + t.Errorf("Unexpected number of arguments provided to createAuthenticationPoliciesFragment(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] idpAdapterId := strArgs[1] request := clientInfo.PingFederateApiClient.AuthenticationPoliciesAPI.CreateFragment(clientInfo.PingFederateContext) @@ -84,29 +86,48 @@ func createAuthenticationPoliciesFragment(t *testing.T, clientInfo *connector.Cl resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateFragment", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_NAME: *resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: *resource.Name, + }, } } -func deleteAuthenticationPoliciesFragment(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteAuthenticationPoliciesFragment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.AuthenticationPoliciesAPI.DeleteFragment(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteAuthenticationPoliciesFragment(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.AuthenticationPoliciesAPI.DeleteFragment(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteFragment", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/authentication_policies_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policies_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/authentication_policies_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policies_settings.go index 413bb1a6..1fe70ef7 100644 --- a/internal/testing/testutils_resource/pingfederate/authentication_policies_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policies_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateAuthenticationPoliciesSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func AuthenticationPoliciesSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/authentication_policy_contract.go b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policy_contract.go similarity index 62% rename from internal/testing/testutils_resource/pingfederate/authentication_policy_contract.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policy_contract.go index 9b0fe4ac..05562055 100644 --- a/internal/testing/testutils_resource/pingfederate/authentication_policy_contract.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_policy_contract.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateAuthenticationPolicyContract(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func AuthenticationPolicyContract(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -25,13 +26,14 @@ func TestableResource_PingFederateAuthenticationPolicyContract(t *testing.T, cli } } -func createAuthenticationPolicyContract(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createAuthenticationPolicyContract(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createAuthenticationPolicyContract(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createAuthenticationPolicyContract(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.AuthenticationPolicyContractsAPI.CreateAuthenticationPolicyContract(clientInfo.PingFederateContext) clientStruct := client.AuthenticationPolicyContract{ @@ -49,29 +51,48 @@ func createAuthenticationPolicyContract(t *testing.T, clientInfo *connector.Clie resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateAuthenticationPolicyContract", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_NAME: *resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: *resource.Name, + }, } } -func deleteAuthenticationPolicyContract(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteAuthenticationPolicyContract(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.AuthenticationPolicyContractsAPI.DeleteAuthenticationPolicyContract(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteAuthenticationPolicyContract(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.AuthenticationPolicyContractsAPI.DeleteAuthenticationPolicyContract(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteAuthenticationPolicyContract", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/authentication_selector.go b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_selector.go similarity index 67% rename from internal/testing/testutils_resource/pingfederate/authentication_selector.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/authentication_selector.go index 06029769..771810a4 100644 --- a/internal/testing/testutils_resource/pingfederate/authentication_selector.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/authentication_selector.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateAuthenticationSelector(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func AuthenticationSelector(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -25,13 +26,14 @@ func TestableResource_PingFederateAuthenticationSelector(t *testing.T, clientInf } } -func createAuthenticationSelector(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createAuthenticationSelector(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createAuthenticationSelector(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createAuthenticationSelector(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.AuthenticationSelectorsAPI.CreateAuthenticationSelector(clientInfo.PingFederateContext) clientStruct := client.AuthenticationSelector{ @@ -71,29 +73,48 @@ func createAuthenticationSelector(t *testing.T, clientInfo *connector.ClientInfo resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateAuthenticationSelector", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteAuthenticationSelector(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteAuthenticationSelector(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.AuthenticationSelectorsAPI.DeleteAuthenticationSelector(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteAuthenticationSelector(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.AuthenticationSelectorsAPI.DeleteAuthenticationSelector(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteAuthenticationSelector", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/captcha_provider.go b/internal/testing/testutils_resource/pingfederate_testable_resources/captcha_provider.go similarity index 64% rename from internal/testing/testutils_resource/pingfederate/captcha_provider.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/captcha_provider.go index 3d3b3291..a762f0a4 100644 --- a/internal/testing/testutils_resource/pingfederate/captcha_provider.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/captcha_provider.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateCaptchaProvider(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func CaptchaProvider(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -25,13 +26,14 @@ func TestableResource_PingFederateCaptchaProvider(t *testing.T, clientInfo *conn } } -func createCaptchaProvider(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createCaptchaProvider(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createCaptchaProvider(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createCaptchaProvider(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.CaptchaProvidersAPI.CreateCaptchaProvider(clientInfo.PingFederateContext) clientStruct := client.CaptchaProvider{ @@ -63,29 +65,48 @@ func createCaptchaProvider(t *testing.T, clientInfo *connector.ClientInfo, strAr resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateCaptchaProvider", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteCaptchaProvider(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteCaptchaProvider(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.CaptchaProvidersAPI.DeleteCaptchaProvider(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteCaptchaProvider(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.CaptchaProvidersAPI.DeleteCaptchaProvider(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteCaptchaProvider", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/captcha_provider_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/captcha_provider_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/captcha_provider_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/captcha_provider_settings.go index 6cf3cce2..6dec7cac 100644 --- a/internal/testing/testutils_resource/pingfederate/captcha_provider_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/captcha_provider_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateCaptchaProviderSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func CaptchaProviderSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/certificate_ca.go b/internal/testing/testutils_resource/pingfederate_testable_resources/certificate_ca.go similarity index 60% rename from internal/testing/testutils_resource/pingfederate/certificate_ca.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/certificate_ca.go index af640d10..4f72a860 100644 --- a/internal/testing/testutils_resource/pingfederate/certificate_ca.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/certificate_ca.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -14,7 +15,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateCertificateCa(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func CertificateCa(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -26,17 +27,18 @@ func TestableResource_PingFederateCertificateCa(t *testing.T, clientInfo *connec } } -func createCertificateCa(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createCertificateCa(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { + if len(strArgs) != 0 { t.Fatalf("Unexpected number of arguments provided to createCertificateCa(): %v", strArgs) } - resourceType := strArgs[0] filedata, err := testutils.CreateX509Certificate() if err != nil { - t.Fatalf("Failed to create test pem certificate %s: %v", resourceType, err) + t.Errorf("Failed to create test pem certificate %s: %v", resourceType, err) + + return testutils_resource.ResourceInfo{} } request := clientInfo.PingFederateApiClient.CertificatesCaAPI.ImportTrustedCA(clientInfo.PingFederateContext) @@ -50,30 +52,49 @@ func createCertificateCa(t *testing.T, clientInfo *connector.ClientInfo, strArgs resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "ImportTrustedCA", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_ISSUER_DN: *resource.IssuerDN, - testutils_resource.ENUM_SERIAL_NUMBER: *resource.SerialNumber, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_ISSUER_DN: *resource.IssuerDN, + testutils_resource.ENUM_SERIAL_NUMBER: *resource.SerialNumber, + }, } } -func deleteCertificateCa(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteCertificateCa(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.CertificatesCaAPI.DeleteTrustedCA(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteCertificateCa(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.CertificatesCaAPI.DeleteTrustedCA(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteTrustedCA", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/certificates_revocation_ocsp_certificate.go b/internal/testing/testutils_resource/pingfederate_testable_resources/certificates_revocation_ocsp_certificate.go similarity index 61% rename from internal/testing/testutils_resource/pingfederate/certificates_revocation_ocsp_certificate.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/certificates_revocation_ocsp_certificate.go index 02de9033..1baea5e5 100644 --- a/internal/testing/testutils_resource/pingfederate/certificates_revocation_ocsp_certificate.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/certificates_revocation_ocsp_certificate.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -14,7 +15,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateCertificatesRevocationOcspCertificate(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func CertificatesRevocationOcspCertificate(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -26,17 +27,18 @@ func TestableResource_PingFederateCertificatesRevocationOcspCertificate(t *testi } } -func createCertificatesRevocationOcspCertificate(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createCertificatesRevocationOcspCertificate(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { + if len(strArgs) != 0 { t.Fatalf("Unexpected number of arguments provided to createCertificatesRevocationOcspCertificate(): %v", strArgs) } - resourceType := strArgs[0] filedata, err := testutils.CreateX509Certificate() if err != nil { - t.Fatalf("Failed to create test pem certificate %s: %v", resourceType, err) + t.Errorf("Failed to create test pem certificate %s: %v", resourceType, err) + + return testutils_resource.ResourceInfo{} } request := clientInfo.PingFederateApiClient.CertificatesRevocationAPI.ImportOcspCertificate(clientInfo.PingFederateContext) @@ -50,30 +52,49 @@ func createCertificatesRevocationOcspCertificate(t *testing.T, clientInfo *conne resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "ImportOcspCertificate", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_ISSUER_DN: *resource.IssuerDN, - testutils_resource.ENUM_SERIAL_NUMBER: *resource.SerialNumber, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_ISSUER_DN: *resource.IssuerDN, + testutils_resource.ENUM_SERIAL_NUMBER: *resource.SerialNumber, + }, } } -func deleteCertificatesRevocationOcspCertificate(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteCertificatesRevocationOcspCertificate(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.CertificatesRevocationAPI.DeleteOcspCertificateById(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteCertificatesRevocationOcspCertificate(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.CertificatesRevocationAPI.DeleteOcspCertificateById(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteOcspCertificateById", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/certificates_revocation_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/certificates_revocation_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/certificates_revocation_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/certificates_revocation_settings.go index ff1d2edc..bb5130aa 100644 --- a/internal/testing/testutils_resource/pingfederate/certificates_revocation_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/certificates_revocation_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateCertificatesRevocationSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func CertificatesRevocationSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/cluster_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/cluster_settings.go similarity index 73% rename from internal/testing/testutils_resource/pingfederate/cluster_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/cluster_settings.go index 1a9eec23..3ed1b54f 100644 --- a/internal/testing/testutils_resource/pingfederate/cluster_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/cluster_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateClusterSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ClusterSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/configuration_encryption_keys_rotate.go b/internal/testing/testutils_resource/pingfederate_testable_resources/configuration_encryption_keys_rotate.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/configuration_encryption_keys_rotate.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/configuration_encryption_keys_rotate.go index 900360fa..c1b1df94 100644 --- a/internal/testing/testutils_resource/pingfederate/configuration_encryption_keys_rotate.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/configuration_encryption_keys_rotate.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateConfigurationEncryptionKeysRotate(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ConfigurationEncryptionKeysRotate(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/data_store.go b/internal/testing/testutils_resource/pingfederate_testable_resources/data_store.go similarity index 73% rename from internal/testing/testutils_resource/pingfederate/data_store.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/data_store.go index 3ac21d60..4472d3dd 100644 --- a/internal/testing/testutils_resource/pingfederate/data_store.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/data_store.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateDataStore(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func DataStore(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/default_urls.go b/internal/testing/testutils_resource/pingfederate_testable_resources/default_urls.go similarity index 73% rename from internal/testing/testutils_resource/pingfederate/default_urls.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/default_urls.go index 7782da1e..3e935cea 100644 --- a/internal/testing/testutils_resource/pingfederate/default_urls.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/default_urls.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateDefaultUrls(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func DefaultUrls(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/extended_properties.go b/internal/testing/testutils_resource/pingfederate_testable_resources/extended_properties.go similarity index 73% rename from internal/testing/testutils_resource/pingfederate/extended_properties.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/extended_properties.go index 0257ec01..e1d58e0b 100644 --- a/internal/testing/testutils_resource/pingfederate/extended_properties.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/extended_properties.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateExtendedProperties(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ExtendedProperties(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/identity_store_provisioner.go b/internal/testing/testutils_resource/pingfederate_testable_resources/identity_store_provisioner.go similarity index 65% rename from internal/testing/testutils_resource/pingfederate/identity_store_provisioner.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/identity_store_provisioner.go index 1917d7df..291fef71 100644 --- a/internal/testing/testutils_resource/pingfederate/identity_store_provisioner.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/identity_store_provisioner.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -12,7 +13,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateIdentityStoreProvisioner(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func IdentityStoreProvisioner(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -24,13 +25,14 @@ func TestableResource_PingFederateIdentityStoreProvisioner(t *testing.T, clientI } } -func createIdentityStoreProvisioner(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createIdentityStoreProvisioner(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createIdentityStoreProvisioner(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createIdentityStoreProvisioner(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.IdentityStoreProvisionersAPI.CreateIdentityStoreProvisioner(clientInfo.PingFederateContext) clientStruct := client.IdentityStoreProvisioner{ @@ -60,29 +62,48 @@ func createIdentityStoreProvisioner(t *testing.T, clientInfo *connector.ClientIn resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateIdentityStoreProvisioner", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteIdentityStoreProvisioner(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteIdentityStoreProvisioner(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.IdentityStoreProvisionersAPI.DeleteIdentityStoreProvisioner(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteIdentityStoreProvisioner(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.IdentityStoreProvisionersAPI.DeleteIdentityStoreProvisioner(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteIdentityStoreProvisioner", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/idp_adapter.go b/internal/testing/testutils_resource/pingfederate_testable_resources/idp_adapter.go similarity index 69% rename from internal/testing/testutils_resource/pingfederate/idp_adapter.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/idp_adapter.go index ce8aa9cc..34881c97 100644 --- a/internal/testing/testutils_resource/pingfederate/idp_adapter.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/idp_adapter.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateIdpAdapter(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func IdpAdapter(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,20 +22,21 @@ func TestableResource_PingFederateIdpAdapter(t *testing.T, clientInfo *connector CreateFunc: createIdpAdapter, DeleteFunc: deleteIdpAdapter, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederatePasswordCredentialValidator(t, clientInfo), + PasswordCredentialValidator(t, clientInfo), }, ExportableResource: resources.IdpAdapter(clientInfo), } } -func createIdpAdapter(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createIdpAdapter(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createIdpAdapter(): %v", strArgs) + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createIdpAdapter(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - pcvId := strArgs[1] + pcvId := strArgs[0] request := clientInfo.PingFederateApiClient.IdpAdaptersAPI.CreateIdpAdapter(clientInfo.PingFederateContext) clientStruct := client.IdpAdapter{ @@ -93,29 +95,48 @@ func createIdpAdapter(t *testing.T, clientInfo *connector.ClientInfo, strArgs .. resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateIdpAdapter", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteIdpAdapter(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteIdpAdapter(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.IdpAdaptersAPI.DeleteIdpAdapter(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteIdpAdapter(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.IdpAdaptersAPI.DeleteIdpAdapter(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteIdpAdapter", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/idp_sp_connection.go b/internal/testing/testutils_resource/pingfederate_testable_resources/idp_sp_connection.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/idp_sp_connection.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/idp_sp_connection.go index 33d73f54..ab375296 100644 --- a/internal/testing/testutils_resource/pingfederate/idp_sp_connection.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/idp_sp_connection.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateIdpSpConnection(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func IdpSpConnection(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,21 +22,22 @@ func TestableResource_PingFederateIdpSpConnection(t *testing.T, clientInfo *conn CreateFunc: createIdpSpConnection, DeleteFunc: deleteIdpSpConnection, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateKeypairsSigningKey(t, clientInfo), - TestableResource_PingFederateIdpTokenProcessor(t, clientInfo), + KeypairsSigningKey(t, clientInfo), + IdpTokenProcessor(t, clientInfo), }, ExportableResource: resources.IdpSpConnection(clientInfo), } } -func createIdpSpConnection(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createIdpSpConnection(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() if len(strArgs) != 3 { - t.Fatalf("Unexpected number of arguments provided to createIdpSpConnection(): %v", strArgs) + t.Errorf("Unexpected number of arguments provided to createIdpSpConnection(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - signingKeyPairId := strArgs[1] + signingKeyPairId := strArgs[0] idpTokenProcessorId := strArgs[2] request := clientInfo.PingFederateApiClient.IdpSpConnectionsAPI.CreateSpConnection(clientInfo.PingFederateContext) @@ -98,29 +100,48 @@ func createIdpSpConnection(t *testing.T, clientInfo *connector.ClientInfo, strAr resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateSpConnection", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteIdpSpConnection(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteIdpSpConnection(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.IdpSpConnectionsAPI.DeleteSpConnection(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteIdpSpConnection(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.IdpSpConnectionsAPI.DeleteSpConnection(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteSpConnection", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/idp_sts_request_parameters_contract.go b/internal/testing/testutils_resource/pingfederate_testable_resources/idp_sts_request_parameters_contract.go similarity index 61% rename from internal/testing/testutils_resource/pingfederate/idp_sts_request_parameters_contract.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/idp_sts_request_parameters_contract.go index daf912cd..0a212d68 100644 --- a/internal/testing/testutils_resource/pingfederate/idp_sts_request_parameters_contract.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/idp_sts_request_parameters_contract.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -12,7 +13,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateIdpStsRequestParametersContract(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func IdpStsRequestParametersContract(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -24,13 +25,14 @@ func TestableResource_PingFederateIdpStsRequestParametersContract(t *testing.T, } } -func createIdpStsRequestParametersContract(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createIdpStsRequestParametersContract(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createIdpStsRequestParametersContract(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createIdpStsRequestParametersContract(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.IdpStsRequestParametersContractsAPI.CreateStsRequestParamContract(clientInfo.PingFederateContext) clientStruct := client.StsRequestParametersContract{ @@ -46,29 +48,48 @@ func createIdpStsRequestParametersContract(t *testing.T, clientInfo *connector.C resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateStsRequestParamContract", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteIdpStsRequestParametersContract(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteIdpStsRequestParametersContract(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.IdpStsRequestParametersContractsAPI.DeleteStsRequestParamContractById(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteIdpStsRequestParametersContract(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.IdpStsRequestParametersContractsAPI.DeleteStsRequestParamContractById(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteStsRequestParamContractById", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/idp_to_sp_adapter_mapping.go b/internal/testing/testutils_resource/pingfederate_testable_resources/idp_to_sp_adapter_mapping.go similarity index 63% rename from internal/testing/testutils_resource/pingfederate/idp_to_sp_adapter_mapping.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/idp_to_sp_adapter_mapping.go index d82fe7b5..c23dd8a7 100644 --- a/internal/testing/testutils_resource/pingfederate/idp_to_sp_adapter_mapping.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/idp_to_sp_adapter_mapping.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateIdpToSpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func IdpToSpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,20 +22,21 @@ func TestableResource_PingFederateIdpToSpAdapterMapping(t *testing.T, clientInfo CreateFunc: createIdpToSpAdapterMapping, DeleteFunc: deleteIdpToSpAdapterMapping, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateIdpAdapter(t, clientInfo), - TestableResource_PingFederateSpAdapter(t, clientInfo), + IdpAdapter(t, clientInfo), + SpAdapter(t, clientInfo), }, ExportableResource: resources.IdpToSpAdapterMapping(clientInfo), } } -func createIdpToSpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createIdpToSpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() if len(strArgs) != 3 { - t.Fatalf("Unexpected number of arguments provided to createIdpToSpAdapterMapping(): %v", strArgs) + t.Errorf("Unexpected number of arguments provided to createIdpToSpAdapterMapping(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] testIdpAdapterId := strArgs[1] testSpAdapterId := strArgs[2] @@ -57,30 +59,49 @@ func createIdpToSpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo, resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateIdpToSpAdapterMapping", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_SOURCE_ID: resource.SourceId, - testutils_resource.ENUM_TARGET_ID: resource.TargetId, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_SOURCE_ID: resource.SourceId, + testutils_resource.ENUM_TARGET_ID: resource.TargetId, + }, } } -func deleteIdpToSpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteIdpToSpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.IdpToSpAdapterMappingAPI.DeleteIdpToSpAdapterMappingsById(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteIdpToSpAdapterMapping(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.IdpToSpAdapterMappingAPI.DeleteIdpToSpAdapterMappingsById(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteIdpToSpAdapterMappingsById", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/idp_token_processor.go b/internal/testing/testutils_resource/pingfederate_testable_resources/idp_token_processor.go similarity index 66% rename from internal/testing/testutils_resource/pingfederate/idp_token_processor.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/idp_token_processor.go index b2d285df..c94ce771 100644 --- a/internal/testing/testutils_resource/pingfederate/idp_token_processor.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/idp_token_processor.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateIdpTokenProcessor(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func IdpTokenProcessor(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,20 +22,21 @@ func TestableResource_PingFederateIdpTokenProcessor(t *testing.T, clientInfo *co CreateFunc: createIdpTokenProcessor, DeleteFunc: deleteIdpTokenProcessor, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederatePasswordCredentialValidator(t, clientInfo), + PasswordCredentialValidator(t, clientInfo), }, ExportableResource: resources.IdpTokenProcessor(clientInfo), } } -func createIdpTokenProcessor(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createIdpTokenProcessor(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createIdpTokenProcessor(): %v", strArgs) + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createIdpTokenProcessor(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - testPCVId := strArgs[1] + testPCVId := strArgs[0] request := clientInfo.PingFederateApiClient.IdpTokenProcessorsAPI.CreateTokenProcessor(clientInfo.PingFederateContext) clientStruct := client.TokenProcessor{ @@ -77,29 +79,48 @@ func createIdpTokenProcessor(t *testing.T, clientInfo *connector.ClientInfo, str resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateTokenProcessor", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteIdpTokenProcessor(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteIdpTokenProcessor(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.IdpTokenProcessorsAPI.DeleteTokenProcessor(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteIdpTokenProcessor(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.IdpTokenProcessorsAPI.DeleteTokenProcessor(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteTokenProcessor", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/incoming_proxy_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/incoming_proxy_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/incoming_proxy_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/incoming_proxy_settings.go index 079d6541..214889b9 100644 --- a/internal/testing/testutils_resource/pingfederate/incoming_proxy_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/incoming_proxy_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateIncomingProxySettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func IncomingProxySettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/kerberos_realm.go b/internal/testing/testutils_resource/pingfederate_testable_resources/kerberos_realm.go similarity index 63% rename from internal/testing/testutils_resource/pingfederate/kerberos_realm.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/kerberos_realm.go index 620e1785..86a49c4b 100644 --- a/internal/testing/testutils_resource/pingfederate/kerberos_realm.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/kerberos_realm.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateKerberosRealm(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func KerberosRealm(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -25,13 +26,14 @@ func TestableResource_PingFederateKerberosRealm(t *testing.T, clientInfo *connec } } -func createKerberosRealm(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createKerberosRealm(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createKerberosRealm(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createKerberosRealm(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.KerberosRealmsAPI.CreateKerberosRealm(clientInfo.PingFederateContext) clientStruct := client.KerberosRealm{ @@ -48,29 +50,48 @@ func createKerberosRealm(t *testing.T, clientInfo *connector.ClientInfo, strArgs resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateKerberosRealm", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_NAME: resource.KerberosRealmName, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.KerberosRealmName, + }, } } -func deleteKerberosRealm(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteKerberosRealm(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.KerberosRealmsAPI.DeleteKerberosRealm(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteKerberosRealm(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.KerberosRealmsAPI.DeleteKerberosRealm(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteKerberosRealm", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/kerberos_realm_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/kerberos_realm_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/kerberos_realm_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/kerberos_realm_settings.go index d0c4a9fc..df3e6a60 100644 --- a/internal/testing/testutils_resource/pingfederate/kerberos_realm_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/kerberos_realm_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateKerberosRealmSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func KerberosRealmSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/keypairs_oauth_openid_connect.go b/internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_oauth_openid_connect.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/keypairs_oauth_openid_connect.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_oauth_openid_connect.go index ecc928d5..460c0ead 100644 --- a/internal/testing/testutils_resource/pingfederate/keypairs_oauth_openid_connect.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_oauth_openid_connect.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateKeypairsOauthOpenidConnect(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func KeypairsOauthOpenidConnect(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/keypairs_oauth_openid_connect_additional_key_set.go b/internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_oauth_openid_connect_additional_key_set.go similarity index 59% rename from internal/testing/testutils_resource/pingfederate/keypairs_oauth_openid_connect_additional_key_set.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_oauth_openid_connect_additional_key_set.go index bd19ccb1..d15f7519 100644 --- a/internal/testing/testutils_resource/pingfederate/keypairs_oauth_openid_connect_additional_key_set.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_oauth_openid_connect_additional_key_set.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateKeypairsOauthOpenidConnectAdditionalKeySet(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func KeypairsOauthOpenidConnectAdditionalKeySet(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,22 +22,23 @@ func TestableResource_PingFederateKeypairsOauthOpenidConnectAdditionalKeySet(t * CreateFunc: createKeypairsOauthOpenidConnectAdditionalKeySet, DeleteFunc: deleteKeypairsOauthOpenidConnectAdditionalKeySet, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateOauthIssuer(t, clientInfo), - TestableResource_PingFederateKeypairsSigningKey(t, clientInfo), + OauthIssuer(t, clientInfo), + KeypairsSigningKey(t, clientInfo), }, ExportableResource: resources.KeypairsOauthOpenidConnectAdditionalKeySet(clientInfo), } } -func createKeypairsOauthOpenidConnectAdditionalKeySet(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createKeypairsOauthOpenidConnectAdditionalKeySet(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 3 { - t.Fatalf("Unexpected number of arguments provided to createKeypairsOauthOpenidConnectAdditionalKeySet(): %v", strArgs) + if len(strArgs) != 2 { + t.Errorf("Unexpected number of arguments provided to createKeypairsOauthOpenidConnectAdditionalKeySet(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - testOauthIssuerId := strArgs[1] - testKeyPairId := strArgs[2] + testOauthIssuerId := strArgs[0] + testKeyPairId := strArgs[1] request := clientInfo.PingFederateApiClient.KeyPairsOauthOpenIdConnectAPI.CreateKeySet(clientInfo.PingFederateContext) clientStruct := client.AdditionalKeySet{ @@ -59,29 +61,48 @@ func createKeypairsOauthOpenidConnectAdditionalKeySet(t *testing.T, clientInfo * resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateKeySet", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteKeypairsOauthOpenidConnectAdditionalKeySet(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteKeypairsOauthOpenidConnectAdditionalKeySet(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.KeyPairsOauthOpenIdConnectAPI.DeleteKeySet(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteKeypairsOauthOpenidConnectAdditionalKeySet(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.KeyPairsOauthOpenIdConnectAPI.DeleteKeySet(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteKeySet", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/keypairs_signing_key.go b/internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_signing_key.go similarity index 61% rename from internal/testing/testutils_resource/pingfederate/keypairs_signing_key.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_signing_key.go index 70f559f6..748d8cc7 100644 --- a/internal/testing/testutils_resource/pingfederate/keypairs_signing_key.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_signing_key.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateKeypairsSigningKey(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func KeypairsSigningKey(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -25,13 +26,14 @@ func TestableResource_PingFederateKeypairsSigningKey(t *testing.T, clientInfo *c } } -func createKeypairsSigningKey(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createKeypairsSigningKey(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createIdpAdapter(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createIdpAdapter(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.KeyPairsSigningAPI.CreateSigningKeyPair(clientInfo.PingFederateContext) result := client.NewKeyPairSettings{ @@ -52,30 +54,49 @@ func createKeypairsSigningKey(t *testing.T, clientInfo *connector.ClientInfo, st resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateKeyPair", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_ISSUER_DN: *resource.IssuerDN, - testutils_resource.ENUM_SERIAL_NUMBER: *resource.SerialNumber, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_ISSUER_DN: *resource.IssuerDN, + testutils_resource.ENUM_SERIAL_NUMBER: *resource.SerialNumber, + }, } } -func deleteKeypairsSigningKey(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteKeypairsSigningKey(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.KeyPairsSigningAPI.DeleteSigningKeyPair(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteKeypairsSigningKey(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.KeyPairsSigningAPI.DeleteSigningKeyPair(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteSigningKeyPair", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/keypairs_signing_key_rotation_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_signing_key_rotation_settings.go similarity index 62% rename from internal/testing/testutils_resource/pingfederate/keypairs_signing_key_rotation_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_signing_key_rotation_settings.go index e5850006..7b3c3a8d 100644 --- a/internal/testing/testutils_resource/pingfederate/keypairs_signing_key_rotation_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_signing_key_rotation_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateKeypairsSigningKeyRotationSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func KeypairsSigningKeyRotationSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,20 +22,21 @@ func TestableResource_PingFederateKeypairsSigningKeyRotationSettings(t *testing. CreateFunc: createKeypairsSigningKeyRotationSettings, DeleteFunc: deleteKeypairsSigningKeyRotationSettings, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateKeypairsSigningKey(t, clientInfo), + KeypairsSigningKey(t, clientInfo), }, ExportableResource: resources.KeypairsSigningKeyRotationSettings(clientInfo), } } -func createKeypairsSigningKeyRotationSettings(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createKeypairsSigningKeyRotationSettings(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createKeypairsSigningKeyRotationSettings(): %v", strArgs) + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createKeypairsSigningKeyRotationSettings(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - keyPairId := strArgs[1] + keyPairId := strArgs[0] request := clientInfo.PingFederateApiClient.KeyPairsSigningAPI.UpdateRotationSettings(clientInfo.PingFederateContext, keyPairId) clientStruct := client.KeyPairRotationSettings{ @@ -48,29 +50,48 @@ func createKeypairsSigningKeyRotationSettings(t *testing.T, clientInfo *connecto _, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "UpdateRotationSettings", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } // Deletion of this resource is referenced by the keyPairId - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: keyPairId, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + keyPairId, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: keyPairId, + }, } } -func deleteKeypairsSigningKeyRotationSettings(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteKeypairsSigningKeyRotationSettings(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.KeyPairsSigningAPI.DeleteKeyPairRotationSettings(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteKeypairsSigningKeyRotationSettings(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.KeyPairsSigningAPI.DeleteKeyPairRotationSettings(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteKeyPairRotationSettings", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/keypairs_ssl_server_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_ssl_server_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/keypairs_ssl_server_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_ssl_server_settings.go index 09bb043e..a3bdd048 100644 --- a/internal/testing/testutils_resource/pingfederate/keypairs_ssl_server_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/keypairs_ssl_server_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateKeypairsSslServerSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func KeypairsSslServerSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/local_identity_profile.go b/internal/testing/testutils_resource/pingfederate_testable_resources/local_identity_profile.go similarity index 61% rename from internal/testing/testutils_resource/pingfederate/local_identity_profile.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/local_identity_profile.go index 0bb6aef1..32c7649f 100644 --- a/internal/testing/testutils_resource/pingfederate/local_identity_profile.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/local_identity_profile.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateLocalIdentityProfile(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func LocalIdentityProfile(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,20 +22,21 @@ func TestableResource_PingFederateLocalIdentityProfile(t *testing.T, clientInfo CreateFunc: createLocalIdentityProfile, DeleteFunc: deleteLocalIdentityProfile, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateAuthenticationPolicyContract(t, clientInfo), + AuthenticationPolicyContract(t, clientInfo), }, ExportableResource: resources.LocalIdentityProfile(clientInfo), } } -func createLocalIdentityProfile(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createLocalIdentityProfile(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createLocalIdentityProfile(): %v", strArgs) + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createLocalIdentityProfile(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - testApcId := strArgs[1] + testApcId := strArgs[0] request := clientInfo.PingFederateApiClient.LocalIdentityIdentityProfilesAPI.CreateIdentityProfile(clientInfo.PingFederateContext) clientStruct := client.LocalIdentityProfile{ @@ -50,29 +52,48 @@ func createLocalIdentityProfile(t *testing.T, clientInfo *connector.ClientInfo, resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateIdentityProfile", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteLocalIdentityProfile(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteLocalIdentityProfile(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.LocalIdentityIdentityProfilesAPI.DeleteIdentityProfile(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteLocalIdentityProfile(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.LocalIdentityIdentityProfilesAPI.DeleteIdentityProfile(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteIdentityProfile", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/metadata_url.go b/internal/testing/testutils_resource/pingfederate_testable_resources/metadata_url.go similarity index 60% rename from internal/testing/testutils_resource/pingfederate/metadata_url.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/metadata_url.go index d5639725..39f34ab3 100644 --- a/internal/testing/testutils_resource/pingfederate/metadata_url.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/metadata_url.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateMetadataUrl(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func MetadataUrl(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -25,13 +26,14 @@ func TestableResource_PingFederateMetadataUrl(t *testing.T, clientInfo *connecto } } -func createMetadataUrl(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createMetadataUrl(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createMetadataUrl(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createMetadataUrl(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.MetadataUrlsAPI.AddMetadataUrl(clientInfo.PingFederateContext) clientStruct := client.MetadataUrl{ @@ -45,29 +47,48 @@ func createMetadataUrl(t *testing.T, clientInfo *connector.ClientInfo, strArgs . resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "AddMetadataUrl", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteMetadataUrl(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteMetadataUrl(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.MetadataUrlsAPI.DeleteMetadataUrl(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteMetadataUrl(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.MetadataUrlsAPI.DeleteMetadataUrl(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteMetadataUrl", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/notification_publisher.go b/internal/testing/testutils_resource/pingfederate_testable_resources/notification_publisher.go similarity index 65% rename from internal/testing/testutils_resource/pingfederate/notification_publisher.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/notification_publisher.go index 21b7803f..8478712d 100644 --- a/internal/testing/testutils_resource/pingfederate/notification_publisher.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/notification_publisher.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateNotificationPublisher(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func NotificationPublisher(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -25,13 +26,14 @@ func TestableResource_PingFederateNotificationPublisher(t *testing.T, clientInfo } } -func createNotificationPublisher(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createNotificationPublisher(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createNotificationPublisher(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createNotificationPublisher(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.NotificationPublishersAPI.CreateNotificationPublisher(clientInfo.PingFederateContext) clientStruct := client.NotificationPublisher{ @@ -59,29 +61,48 @@ func createNotificationPublisher(t *testing.T, clientInfo *connector.ClientInfo, resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateNotificationPublisher", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteNotificationPublisher(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteNotificationPublisher(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.NotificationPublishersAPI.DeleteNotificationPublisher(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteNotificationPublisher(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.NotificationPublishersAPI.DeleteNotificationPublisher(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteNotificationPublisher", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/notification_publisher_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/notification_publisher_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/notification_publisher_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/notification_publisher_settings.go index 90bdb088..8b9540b6 100644 --- a/internal/testing/testutils_resource/pingfederate/notification_publisher_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/notification_publisher_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateNotificationPublisherSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func NotificationPublisherSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/oauth_access_token_manager.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_access_token_manager.go similarity index 68% rename from internal/testing/testutils_resource/pingfederate/oauth_access_token_manager.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_access_token_manager.go index 6c05477b..8286e0e0 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_access_token_manager.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_access_token_manager.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOauthAccessTokenManager(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthAccessTokenManager(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,20 +22,21 @@ func TestableResource_PingFederateOauthAccessTokenManager(t *testing.T, clientIn CreateFunc: createOauthAccessTokenManager, DeleteFunc: deleteOauthAccessTokenManager, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateKeypairsSigningKey(t, clientInfo), + KeypairsSigningKey(t, clientInfo), }, ExportableResource: resources.OauthAccessTokenManager(clientInfo), } } -func createOauthAccessTokenManager(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOauthAccessTokenManager(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createOauthAccessTokenManager(): %v", strArgs) + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createOauthAccessTokenManager(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - testKeyPairId := strArgs[1] + testKeyPairId := strArgs[0] request := clientInfo.PingFederateApiClient.OauthAccessTokenManagersAPI.CreateTokenManager(clientInfo.PingFederateContext) clientStruct := client.AccessTokenManager{ @@ -90,29 +92,48 @@ func createOauthAccessTokenManager(t *testing.T, clientInfo *connector.ClientInf resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateTokenManager", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteOauthAccessTokenManager(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOauthAccessTokenManager(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthAccessTokenManagersAPI.DeleteTokenManager(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOauthAccessTokenManager(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthAccessTokenManagersAPI.DeleteTokenManager(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteTokenManager", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/oauth_access_token_manager_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_access_token_manager_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/oauth_access_token_manager_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_access_token_manager_settings.go index cafec40e..ba406b82 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_access_token_manager_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_access_token_manager_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateOauthAccessTokenManagerSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthAccessTokenManagerSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/oauth_access_token_mapping.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_access_token_mapping.go similarity index 62% rename from internal/testing/testutils_resource/pingfederate/oauth_access_token_mapping.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_access_token_mapping.go index b0377f19..438dc896 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_access_token_mapping.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_access_token_mapping.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOauthAccessTokenMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthAccessTokenMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,19 +22,20 @@ func TestableResource_PingFederateOauthAccessTokenMapping(t *testing.T, clientIn CreateFunc: createOauthAccessTokenMapping, DeleteFunc: deleteOauthAccessTokenMapping, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateOauthAccessTokenManager(t, clientInfo), + OauthAccessTokenManager(t, clientInfo), }, ExportableResource: resources.OauthAccessTokenMapping(clientInfo), } } -func createOauthAccessTokenMapping(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOauthAccessTokenMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createOauthAccessTokenMapping(): %v", strArgs) + t.Errorf("Unexpected number of arguments provided to createOauthAccessTokenMapping(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] testTokenManagerId := strArgs[1] request := clientInfo.PingFederateApiClient.OauthAccessTokenMappingsAPI.CreateMapping(clientInfo.PingFederateContext) @@ -59,29 +61,48 @@ func createOauthAccessTokenMapping(t *testing.T, clientInfo *connector.ClientInf resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateMapping", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_CONTEXT_TYPE: resource.Context.Type, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_CONTEXT_TYPE: resource.Context.Type, + }, } } -func deleteOauthAccessTokenMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOauthAccessTokenMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthAccessTokenMappingsAPI.DeleteMapping(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOauthAccessTokenMapping(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthAccessTokenMappingsAPI.DeleteMapping(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteMapping", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/oauth_authentication_policy_contract_mapping.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_authentication_policy_contract_mapping.go similarity index 63% rename from internal/testing/testutils_resource/pingfederate/oauth_authentication_policy_contract_mapping.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_authentication_policy_contract_mapping.go index 2eeeeb11..136a6267 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_authentication_policy_contract_mapping.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_authentication_policy_contract_mapping.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -12,7 +13,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOauthAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -20,20 +21,21 @@ func TestableResource_PingFederateOauthAuthenticationPolicyContractMapping(t *te CreateFunc: createOauthAuthenticationPolicyContractMapping, DeleteFunc: deleteOauthAuthenticationPolicyContractMapping, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateAuthenticationPolicyContract(t, clientInfo), + AuthenticationPolicyContract(t, clientInfo), }, ExportableResource: resources.OauthAuthenticationPolicyContractMapping(clientInfo), } } -func createOauthAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOauthAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createOauthAuthenticationPolicyContractMapping(): %v", strArgs) + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createOauthAuthenticationPolicyContractMapping(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - testApcId := strArgs[1] + testApcId := strArgs[0] request := clientInfo.PingFederateApiClient.OauthAuthenticationPolicyContractMappingsAPI.CreateApcMapping(clientInfo.PingFederateContext) clientStruct := client.ApcToPersistentGrantMapping{ @@ -60,28 +62,47 @@ func createOauthAuthenticationPolicyContractMapping(t *testing.T, clientInfo *co resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateApcMapping", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + }, } } -func deleteOauthAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOauthAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthAuthenticationPolicyContractMappingsAPI.DeleteApcMapping(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOauthAuthenticationPolicyContractMapping(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthAuthenticationPolicyContractMappingsAPI.DeleteApcMapping(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteApcMapping", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/oauth_ciba_server_policy_request_policy.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_ciba_server_policy_request_policy.go similarity index 67% rename from internal/testing/testutils_resource/pingfederate/oauth_ciba_server_policy_request_policy.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_ciba_server_policy_request_policy.go index 8cff850f..d46dfba7 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_ciba_server_policy_request_policy.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_ciba_server_policy_request_policy.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOauthCibaServerPolicyRequestPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthCibaServerPolicyRequestPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,20 +22,21 @@ func TestableResource_PingFederateOauthCibaServerPolicyRequestPolicy(t *testing. CreateFunc: createOauthCibaServerPolicyRequestPolicy, DeleteFunc: deleteOauthCibaServerPolicyRequestPolicy, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateOutOfBandAuthPlugins(t, clientInfo), + OutOfBandAuthPlugins(t, clientInfo), }, ExportableResource: resources.OauthCibaServerPolicyRequestPolicy(clientInfo), } } -func createOauthCibaServerPolicyRequestPolicy(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOauthCibaServerPolicyRequestPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createOauthCibaServerPolicyRequestPolicy(): %v", strArgs) + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createOauthCibaServerPolicyRequestPolicy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - testAuthenticatorId := strArgs[1] + testAuthenticatorId := strArgs[0] request := clientInfo.PingFederateApiClient.OauthCibaServerPolicyAPI.CreateCibaServerPolicy(clientInfo.PingFederateContext) clientStruct := client.RequestPolicy{ @@ -84,29 +86,48 @@ func createOauthCibaServerPolicyRequestPolicy(t *testing.T, clientInfo *connecto resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateCibaServerPolicy", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteOauthCibaServerPolicyRequestPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOauthCibaServerPolicyRequestPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthCibaServerPolicyAPI.DeleteCibaServerPolicy(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOauthCibaServerPolicyRequestPolicy(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthCibaServerPolicyAPI.DeleteCibaServerPolicy(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteCibaServerPolicy", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/oauth_ciba_server_policy_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_ciba_server_policy_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/oauth_ciba_server_policy_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_ciba_server_policy_settings.go index b0039802..4fef800f 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_ciba_server_policy_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_ciba_server_policy_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateOauthCibaServerPolicySettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthCibaServerPolicySettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/oauth_client.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_client.go similarity index 60% rename from internal/testing/testutils_resource/pingfederate/oauth_client.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_client.go index a06cf214..27caaa86 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_client.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_client.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -12,7 +13,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOauthClient(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthClient(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -24,13 +25,14 @@ func TestableResource_PingFederateOauthClient(t *testing.T, clientInfo *connecto } } -func createOauthClient(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOauthClient(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createOauthClient(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createOauthClient(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.OauthClientsAPI.CreateOauthClient(clientInfo.PingFederateContext) clientStruct := client.Client{ @@ -49,29 +51,48 @@ func createOauthClient(t *testing.T, clientInfo *connector.ClientInfo, strArgs . resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateOauthClient", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.ClientId, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.ClientId, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.ClientId, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteOauthClient(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOauthClient(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthClientsAPI.DeleteOauthClient(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOauthClient(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthClientsAPI.DeleteOauthClient(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteOauthClient", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/oauth_client_registration_policy.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_client_registration_policy.go similarity index 62% rename from internal/testing/testutils_resource/pingfederate/oauth_client_registration_policy.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_client_registration_policy.go index 0ccbc6f4..d2406346 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_client_registration_policy.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_client_registration_policy.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -12,7 +13,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOauthClientRegistrationPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthClientRegistrationPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -24,13 +25,14 @@ func TestableResource_PingFederateOauthClientRegistrationPolicy(t *testing.T, cl } } -func createOauthClientRegistrationPolicy(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOauthClientRegistrationPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createOauthClientRegistrationPolicy(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createOauthClientRegistrationPolicy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.OauthClientRegistrationPoliciesAPI.CreateDynamicClientRegistrationPolicy(clientInfo.PingFederateContext) clientStruct := client.ClientRegistrationPolicy{ @@ -46,29 +48,48 @@ func createOauthClientRegistrationPolicy(t *testing.T, clientInfo *connector.Cli resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateDynamicClientRegistrationPolicy", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteOauthClientRegistrationPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOauthClientRegistrationPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthClientRegistrationPoliciesAPI.DeleteDynamicClientRegistrationPolicy(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOauthClientRegistrationPolicy(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthClientRegistrationPoliciesAPI.DeleteDynamicClientRegistrationPolicy(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteDynamicClientRegistrationPolicy", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/oauth_client_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_client_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/oauth_client_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_client_settings.go index 57ba8d9b..4969a13c 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_client_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_client_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateOauthClientSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthClientSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/oauth_idp_adapter_mapping.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_idp_adapter_mapping.go similarity index 65% rename from internal/testing/testutils_resource/pingfederate/oauth_idp_adapter_mapping.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_idp_adapter_mapping.go index c63c3a2b..a1648359 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_idp_adapter_mapping.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_idp_adapter_mapping.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -12,7 +13,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOauthIdpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthIdpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -20,19 +21,20 @@ func TestableResource_PingFederateOauthIdpAdapterMapping(t *testing.T, clientInf CreateFunc: createOauthIdpAdapterMapping, DeleteFunc: deleteOauthIdpAdapterMapping, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateIdpAdapter(t, clientInfo), + IdpAdapter(t, clientInfo), }, ExportableResource: resources.OauthIdpAdapterMapping(clientInfo), } } -func createOauthIdpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOauthIdpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createOauthIdpAdapterMapping(): %v", strArgs) + t.Errorf("Unexpected number of arguments provided to createOauthIdpAdapterMapping(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] testIdpAdapterId := strArgs[1] request := clientInfo.PingFederateApiClient.OauthIdpAdapterMappingsAPI.CreateIdpAdapterMapping(clientInfo.PingFederateContext) @@ -60,28 +62,47 @@ func createOauthIdpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateIdpAdapterMapping", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + }, } } -func deleteOauthIdpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOauthIdpAdapterMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthIdpAdapterMappingsAPI.DeleteIdpAdapterMapping(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOauthIdpAdapterMapping(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthIdpAdapterMappingsAPI.DeleteIdpAdapterMapping(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteIdpAdapterMapping", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/oauth_issuer.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_issuer.go similarity index 59% rename from internal/testing/testutils_resource/pingfederate/oauth_issuer.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_issuer.go index c23468cb..1e8cdb7c 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_issuer.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_issuer.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOauthIssuer(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthIssuer(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -25,13 +26,14 @@ func TestableResource_PingFederateOauthIssuer(t *testing.T, clientInfo *connecto } } -func createOauthIssuer(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOauthIssuer(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createOauthIssuer(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createOauthIssuer(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.OauthIssuersAPI.AddOauthIssuer(clientInfo.PingFederateContext) clientStruct := client.Issuer{ @@ -45,29 +47,48 @@ func createOauthIssuer(t *testing.T, clientInfo *connector.ClientInfo, strArgs . resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "AddOauthIssuer", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteOauthIssuer(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOauthIssuer(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthIssuersAPI.DeleteOauthIssuer(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOauthIssuer(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthIssuersAPI.DeleteOauthIssuer(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteOauthIssuer", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/oauth_server_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_server_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/oauth_server_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_server_settings.go index 839f7fc1..cf34aa22 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_server_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_server_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateOauthServerSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthServerSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/oauth_token_exchange_generator_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_token_exchange_generator_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/oauth_token_exchange_generator_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_token_exchange_generator_settings.go index 57959887..a1ef5d3e 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_token_exchange_generator_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_token_exchange_generator_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateOauthTokenExchangeGeneratorSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthTokenExchangeGeneratorSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/oauth_token_exchange_processor_policy.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_token_exchange_processor_policy.go similarity index 67% rename from internal/testing/testutils_resource/pingfederate/oauth_token_exchange_processor_policy.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_token_exchange_processor_policy.go index da2c1173..4fa524c1 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_token_exchange_processor_policy.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_token_exchange_processor_policy.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -12,7 +13,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOauthTokenExchangeProcessorPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthTokenExchangeProcessorPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -20,19 +21,20 @@ func TestableResource_PingFederateOauthTokenExchangeProcessorPolicy(t *testing.T CreateFunc: createOauthTokenExchangeProcessorPolicy, DeleteFunc: deleteOauthTokenExchangeProcessorPolicy, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateIdpTokenProcessor(t, clientInfo), + IdpTokenProcessor(t, clientInfo), }, ExportableResource: nil, } } -func createOauthTokenExchangeProcessorPolicy(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOauthTokenExchangeProcessorPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createOauthTokenExchangeProcessorPolicy(): %v", strArgs) + t.Errorf("Unexpected number of arguments provided to createOauthTokenExchangeProcessorPolicy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] testTokenProcessorId := strArgs[1] request := clientInfo.PingFederateApiClient.OauthTokenExchangeProcessorAPI.CreateOauthTokenExchangeProcessorPolicy(clientInfo.PingFederateContext) @@ -69,28 +71,47 @@ func createOauthTokenExchangeProcessorPolicy(t *testing.T, clientInfo *connector resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateOauthTokenExchangeProcessorPolicy", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + }, } } -func deleteOauthTokenExchangeProcessorPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOauthTokenExchangeProcessorPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthTokenExchangeProcessorAPI.DeleteOauthTokenExchangeProcessorPolicyy(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOauthTokenExchangeProcessorPolicy(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthTokenExchangeProcessorAPI.DeleteOauthTokenExchangeProcessorPolicyy(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteOauthTokenExchangeProcessorPolicy", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/oauth_token_exchange_token_generator_mapping.go b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_token_exchange_token_generator_mapping.go similarity index 60% rename from internal/testing/testutils_resource/pingfederate/oauth_token_exchange_token_generator_mapping.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/oauth_token_exchange_token_generator_mapping.go index 0d4c3733..ac91142f 100644 --- a/internal/testing/testutils_resource/pingfederate/oauth_token_exchange_token_generator_mapping.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/oauth_token_exchange_token_generator_mapping.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOauthTokenExchangeTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OauthTokenExchangeTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,22 +22,23 @@ func TestableResource_PingFederateOauthTokenExchangeTokenGeneratorMapping(t *tes CreateFunc: createOauthTokenExchangeTokenGeneratorMapping, DeleteFunc: deleteOauthTokenExchangeTokenGeneratorMapping, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateOauthTokenExchangeProcessorPolicy(t, clientInfo), - TestableResource_PingFederateSpTokenGenerator(t, clientInfo), + OauthTokenExchangeProcessorPolicy(t, clientInfo), + SpTokenGenerator(t, clientInfo), }, ExportableResource: resources.OauthTokenExchangeTokenGeneratorMapping(clientInfo), } } -func createOauthTokenExchangeTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOauthTokenExchangeTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 3 { - t.Fatalf("Unexpected number of arguments provided to createOauthTokenExchangeTokenGeneratorMapping(): %v", strArgs) + if len(strArgs) != 5 { + t.Errorf("Unexpected number of arguments provided to createOauthTokenExchangeTokenGeneratorMapping(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - testProcessorPolicyId := strArgs[1] - testTokenGeneratorId := strArgs[2] + testProcessorPolicyId := strArgs[2] + testTokenGeneratorId := strArgs[4] request := clientInfo.PingFederateApiClient.OauthTokenExchangeTokenGeneratorMappingsAPI.CreateTokenGeneratorMapping(clientInfo.PingFederateContext) clientStruct := client.ProcessorPolicyToGeneratorMapping{ @@ -57,30 +59,49 @@ func createOauthTokenExchangeTokenGeneratorMapping(t *testing.T, clientInfo *con resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateTokenGeneratorMapping", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_SOURCE_ID: testProcessorPolicyId, - testutils_resource.ENUM_TARGET_ID: testTokenGeneratorId, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_SOURCE_ID: testProcessorPolicyId, + testutils_resource.ENUM_TARGET_ID: testTokenGeneratorId, + }, } } -func deleteOauthTokenExchangeTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOauthTokenExchangeTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthTokenExchangeTokenGeneratorMappingsAPI.DeleteTokenGeneratorMappingById(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOauthTokenExchangeTokenGeneratorMapping(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthTokenExchangeTokenGeneratorMappingsAPI.DeleteTokenGeneratorMappingById(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteTokenGeneratorMappingById", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/openid_connect_policy.go b/internal/testing/testutils_resource/pingfederate_testable_resources/openid_connect_policy.go similarity index 65% rename from internal/testing/testutils_resource/pingfederate/openid_connect_policy.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/openid_connect_policy.go index 5c66acb7..7ec31ea6 100644 --- a/internal/testing/testutils_resource/pingfederate/openid_connect_policy.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/openid_connect_policy.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOpenidConnectPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OpenidConnectPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,19 +22,20 @@ func TestableResource_PingFederateOpenidConnectPolicy(t *testing.T, clientInfo * CreateFunc: createOpenidConnectPolicy, DeleteFunc: deleteOpenidConnectPolicy, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateOauthAccessTokenManager(t, clientInfo), + OauthAccessTokenManager(t, clientInfo), }, ExportableResource: resources.OpenidConnectPolicy(clientInfo), } } -func createOpenidConnectPolicy(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOpenidConnectPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createOpenidConnectPolicy(): %v", strArgs) + t.Errorf("Unexpected number of arguments provided to createOpenidConnectPolicy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] testAccessTokenManagerId := strArgs[1] request := clientInfo.PingFederateApiClient.OauthOpenIdConnectAPI.CreateOIDCPolicy(clientInfo.PingFederateContext) @@ -67,29 +69,48 @@ func createOpenidConnectPolicy(t *testing.T, clientInfo *connector.ClientInfo, s resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateOIDCPolicy", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteOpenidConnectPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOpenidConnectPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthOpenIdConnectAPI.DeleteOIDCPolicy(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOpenidConnectPolicy(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthOpenIdConnectAPI.DeleteOIDCPolicy(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteOIDCPolicy", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/openid_connect_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/openid_connect_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/openid_connect_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/openid_connect_settings.go index 69e2dc43..b2b2a221 100644 --- a/internal/testing/testutils_resource/pingfederate/openid_connect_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/openid_connect_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateOpenidConnectSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OpenidConnectSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/out_of_band_auth_plugins.go b/internal/testing/testutils_resource/pingfederate_testable_resources/out_of_band_auth_plugins.go similarity index 64% rename from internal/testing/testutils_resource/pingfederate/out_of_band_auth_plugins.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/out_of_band_auth_plugins.go index 0f77574f..6c5e54a7 100644 --- a/internal/testing/testutils_resource/pingfederate/out_of_band_auth_plugins.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/out_of_band_auth_plugins.go @@ -1,6 +1,6 @@ // Copyright © 2025 Ping Identity Corporation -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -8,12 +8,12 @@ import ( "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" "github.com/pingidentity/pingcli/internal/utils" client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateOutOfBandAuthPlugins(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func OutOfBandAuthPlugins(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,22 +21,23 @@ func TestableResource_PingFederateOutOfBandAuthPlugins(t *testing.T, clientInfo CreateFunc: createOutOfBandAuthPlugins, DeleteFunc: deleteOutOfBandAuthPlugins, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederatePingoneConnection(t, clientInfo), - pingone.TestableResource_PingOneDeviceAuthApplication(t, clientInfo), + PingoneConnection(t, clientInfo), + pingone_sso_testable_resources.ApplicationDeviceAuthorization(t, clientInfo), }, ExportableResource: nil, } } -func createOutOfBandAuthPlugins(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createOutOfBandAuthPlugins(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 3 { - t.Fatalf("Unexpected number of arguments provided to createOutOfBandAuthPlugins(): %v", strArgs) + if len(strArgs) != 2 { + t.Errorf("Unexpected number of arguments provided to createOutOfBandAuthPlugins(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - testPingOneConnectionId := strArgs[1] - testDeviceAuthApplicationId := strArgs[2] + testPingOneConnectionId := strArgs[0] + testDeviceAuthApplicationId := strArgs[1] request := clientInfo.PingFederateApiClient.OauthOutOfBandAuthPluginsAPI.CreateOOBAuthenticator(clientInfo.PingFederateContext) result := client.OutOfBandAuthenticator{ @@ -71,28 +72,47 @@ func createOutOfBandAuthPlugins(t *testing.T, clientInfo *connector.ClientInfo, resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateOOBAuthenticator", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + }, } } -func deleteOutOfBandAuthPlugins(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteOutOfBandAuthPlugins(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.OauthOutOfBandAuthPluginsAPI.DeleteOOBAuthenticator(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteOutOfBandAuthPlugins(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.OauthOutOfBandAuthPluginsAPI.DeleteOOBAuthenticator(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteOOBAuthenticator", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/password_credential_validator.go b/internal/testing/testutils_resource/pingfederate_testable_resources/password_credential_validator.go similarity index 66% rename from internal/testing/testutils_resource/pingfederate/password_credential_validator.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/password_credential_validator.go index a1a5bca0..67f20dbc 100644 --- a/internal/testing/testutils_resource/pingfederate/password_credential_validator.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/password_credential_validator.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederatePasswordCredentialValidator(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func PasswordCredentialValidator(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -25,13 +26,14 @@ func TestableResource_PingFederatePasswordCredentialValidator(t *testing.T, clie } } -func createPasswordCredentialValidator(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createPasswordCredentialValidator(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createPasswordCredentialValidator(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createPasswordCredentialValidator(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.PasswordCredentialValidatorsAPI.CreatePasswordCredentialValidator(clientInfo.PingFederateContext) clientStruct := client.PasswordCredentialValidator{ @@ -77,29 +79,52 @@ func createPasswordCredentialValidator(t *testing.T, clientInfo *connector.Clien resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreatePasswordCredentialValidator", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + if response != nil { + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + } else { + t.Errorf("Failed to execute client function") + } + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deletePasswordCredentialValidator(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deletePasswordCredentialValidator(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.PasswordCredentialValidatorsAPI.DeletePasswordCredentialValidator(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deletePasswordCredentialValidator(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.PasswordCredentialValidatorsAPI.DeletePasswordCredentialValidator(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeletePasswordCredentialValidator", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/pingone_connection.go b/internal/testing/testutils_resource/pingfederate_testable_resources/pingone_connection.go similarity index 60% rename from internal/testing/testutils_resource/pingfederate/pingone_connection.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/pingone_connection.go index 4397b1ec..d8459609 100644 --- a/internal/testing/testutils_resource/pingfederate/pingone_connection.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/pingone_connection.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -9,12 +10,12 @@ import ( "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" "github.com/pingidentity/pingcli/internal/testing/testutils_resource" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_platform_testable_resources" "github.com/pingidentity/pingcli/internal/utils" client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederatePingoneConnection(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func PingoneConnection(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -22,19 +23,20 @@ func TestableResource_PingFederatePingoneConnection(t *testing.T, clientInfo *co CreateFunc: createPingoneConnection, DeleteFunc: deletePingoneConnection, Dependencies: []*testutils_resource.TestableResource{ - pingone.TestableResource_PingOnePingFederateGatewayCredential(t, clientInfo), + pingone_platform_testable_resources.GatewayCredential(t, clientInfo), }, ExportableResource: resources.PingoneConnection(clientInfo), } } -func createPingoneConnection(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createPingoneConnection(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createPingoneConnection(): %v", strArgs) + t.Errorf("Unexpected number of arguments provided to createPingoneConnection(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] credential := strArgs[1] request := clientInfo.PingFederateApiClient.PingOneConnectionsAPI.CreatePingOneConnection(clientInfo.PingFederateContext) @@ -49,29 +51,48 @@ func createPingoneConnection(t *testing.T, clientInfo *connector.ClientInfo, str resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreatePingOneConnection", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deletePingoneConnection(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deletePingoneConnection(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.PingOneConnectionsAPI.DeletePingOneConnection(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deletePingoneConnection(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.PingOneConnectionsAPI.DeletePingOneConnection(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeletePingOneConnection", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/protocol_metadata_lifetime_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/protocol_metadata_lifetime_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/protocol_metadata_lifetime_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/protocol_metadata_lifetime_settings.go index eafe9b54..368237b9 100644 --- a/internal/testing/testutils_resource/pingfederate/protocol_metadata_lifetime_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/protocol_metadata_lifetime_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateProtocolMetadataLifetimeSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ProtocolMetadataLifetimeSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/protocol_metadata_signing_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/protocol_metadata_signing_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/protocol_metadata_signing_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/protocol_metadata_signing_settings.go index 86496265..6d877998 100644 --- a/internal/testing/testutils_resource/pingfederate/protocol_metadata_signing_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/protocol_metadata_signing_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateProtocolMetadataSigningSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ProtocolMetadataSigningSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/redirect_validation.go b/internal/testing/testutils_resource/pingfederate_testable_resources/redirect_validation.go similarity index 73% rename from internal/testing/testutils_resource/pingfederate/redirect_validation.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/redirect_validation.go index 8f8b85c8..e475f09d 100644 --- a/internal/testing/testutils_resource/pingfederate/redirect_validation.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/redirect_validation.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateRedirectValidation(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func RedirectValidation(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/secret_manager.go b/internal/testing/testutils_resource/pingfederate_testable_resources/secret_manager.go similarity index 63% rename from internal/testing/testutils_resource/pingfederate/secret_manager.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/secret_manager.go index 8a089663..dbcdc801 100644 --- a/internal/testing/testutils_resource/pingfederate/secret_manager.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/secret_manager.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateSecretManager(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func SecretManager(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -25,13 +26,14 @@ func TestableResource_PingFederateSecretManager(t *testing.T, clientInfo *connec } } -func createSecretManager(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createSecretManager(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createSecretManager(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createSecretManager(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.SecretManagersAPI.CreateSecretManager(clientInfo.PingFederateContext) clientStruct := client.SecretManager{ @@ -55,29 +57,48 @@ func createSecretManager(t *testing.T, clientInfo *connector.ClientInfo, strArgs resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateSecretManager", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteSecretManager(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteSecretManager(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.SecretManagersAPI.DeleteSecretManager(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteSecretManager(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.SecretManagersAPI.DeleteSecretManager(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteSecretManager", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/server_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings.go similarity index 73% rename from internal/testing/testutils_resource/pingfederate/server_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/server_settings.go index 52c4ccdf..f10408ea 100644 --- a/internal/testing/testutils_resource/pingfederate/server_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateServerSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ServerSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/server_settings_general.go b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_general.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/server_settings_general.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_general.go index a9678561..d3f40866 100644 --- a/internal/testing/testutils_resource/pingfederate/server_settings_general.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_general.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateServerSettingsGeneral(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ServerSettingsGeneral(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/server_settings_logging.go b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_logging.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/server_settings_logging.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_logging.go index d5f9b341..675d682c 100644 --- a/internal/testing/testutils_resource/pingfederate/server_settings_logging.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_logging.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateServerSettingsLogging(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ServerSettingsLogging(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/server_settings_system_keys_rotate.go b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_system_keys_rotate.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/server_settings_system_keys_rotate.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_system_keys_rotate.go index 8909c78f..598d7dcf 100644 --- a/internal/testing/testutils_resource/pingfederate/server_settings_system_keys_rotate.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_system_keys_rotate.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateServerSettingsSystemKeysRotate(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ServerSettingsSystemKeysRotate(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/server_settings_ws_trust_sts_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_ws_trust_sts_settings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/server_settings_ws_trust_sts_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_ws_trust_sts_settings.go index b20e11bb..cca1b68e 100644 --- a/internal/testing/testutils_resource/pingfederate/server_settings_ws_trust_sts_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_ws_trust_sts_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateServerSettingsWsTrustStsSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ServerSettingsWsTrustStsSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/server_settings_ws_trust_sts_settings_issuer_certificate.go b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_ws_trust_sts_settings_issuer_certificate.go similarity index 58% rename from internal/testing/testutils_resource/pingfederate/server_settings_ws_trust_sts_settings_issuer_certificate.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_ws_trust_sts_settings_issuer_certificate.go index 27b4b59a..e10a5429 100644 --- a/internal/testing/testutils_resource/pingfederate/server_settings_ws_trust_sts_settings_issuer_certificate.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/server_settings_ws_trust_sts_settings_issuer_certificate.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -14,7 +15,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateServerSettingsWsTrustStsSettingsIssuerCertificate(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ServerSettingsWsTrustStsSettingsIssuerCertificate(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -26,17 +27,18 @@ func TestableResource_PingFederateServerSettingsWsTrustStsSettingsIssuerCertific } } -func createServerSettingsWsTrustStsSettingsIssuerCertificate(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createServerSettingsWsTrustStsSettingsIssuerCertificate(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { + if len(strArgs) != 0 { t.Fatalf("Unexpected number of arguments provided to createServerSettingsWsTrustStsSettingsIssuerCertificate(): %v", strArgs) } - resourceType := strArgs[0] fileData, err := testutils.CreateX509Certificate() if err != nil { - t.Fatalf("Failed to create test %s: %v", resourceType, err) + t.Errorf("Failed to create test %s: %v", resourceType, err) + + return testutils_resource.ResourceInfo{} } request := clientInfo.PingFederateApiClient.ServerSettingsAPI.ImportCertificate(clientInfo.PingFederateContext) @@ -50,30 +52,49 @@ func createServerSettingsWsTrustStsSettingsIssuerCertificate(t *testing.T, clien resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "ImportCertificate", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.CertView.Id, - testutils_resource.ENUM_ISSUER_DN: *resource.CertView.IssuerDN, - testutils_resource.ENUM_SERIAL_NUMBER: *resource.CertView.SerialNumber, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.CertView.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.CertView.Id, + testutils_resource.ENUM_ISSUER_DN: *resource.CertView.IssuerDN, + testutils_resource.ENUM_SERIAL_NUMBER: *resource.CertView.SerialNumber, + }, } } -func deleteServerSettingsWsTrustStsSettingsIssuerCertificate(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteServerSettingsWsTrustStsSettingsIssuerCertificate(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.ServerSettingsAPI.DeleteCertificate(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteServerSettingsWsTrustStsSettingsIssuerCertificate(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.ServerSettingsAPI.DeleteCertificate(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteCertificate", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/service_authentication.go b/internal/testing/testutils_resource/pingfederate_testable_resources/service_authentication.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/service_authentication.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/service_authentication.go index a7022bca..9bb71f50 100644 --- a/internal/testing/testutils_resource/pingfederate/service_authentication.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/service_authentication.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateServiceAuthentication(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func ServiceAuthentication(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/session_application_policy.go b/internal/testing/testutils_resource/pingfederate_testable_resources/session_application_policy.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/session_application_policy.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/session_application_policy.go index d4885bdb..f66a22b0 100644 --- a/internal/testing/testutils_resource/pingfederate/session_application_policy.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/session_application_policy.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateSessionApplicationPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func SessionApplicationPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/session_authentication_policies_global.go b/internal/testing/testutils_resource/pingfederate_testable_resources/session_authentication_policies_global.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/session_authentication_policies_global.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/session_authentication_policies_global.go index d62fcc13..47651d22 100644 --- a/internal/testing/testutils_resource/pingfederate/session_authentication_policies_global.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/session_authentication_policies_global.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateSessionAuthenticationPoliciesGlobal(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func SessionAuthenticationPoliciesGlobal(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/session_authentication_policy.go b/internal/testing/testutils_resource/pingfederate_testable_resources/session_authentication_policy.go similarity index 59% rename from internal/testing/testutils_resource/pingfederate/session_authentication_policy.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/session_authentication_policy.go index 40155588..ca5531dc 100644 --- a/internal/testing/testutils_resource/pingfederate/session_authentication_policy.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/session_authentication_policy.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateSessionAuthenticationPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func SessionAuthenticationPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,19 +22,20 @@ func TestableResource_PingFederateSessionAuthenticationPolicy(t *testing.T, clie CreateFunc: createSessionAuthenticationPolicy, DeleteFunc: deleteSessionAuthenticationPolicy, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateIdpAdapter(t, clientInfo), + IdpAdapter(t, clientInfo), }, ExportableResource: resources.SessionAuthenticationPolicy(clientInfo), } } -func createSessionAuthenticationPolicy(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createSessionAuthenticationPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createSessionAuthenticationPolicy(): %v", strArgs) + t.Errorf("Unexpected number of arguments provided to createSessionAuthenticationPolicy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] testIdpAdapterId := strArgs[1] request := clientInfo.PingFederateApiClient.SessionAPI.CreateSourcePolicy(clientInfo.PingFederateContext) @@ -52,30 +54,49 @@ func createSessionAuthenticationPolicy(t *testing.T, clientInfo *connector.Clien resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateSourcePolicy", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_TYPE: resource.AuthenticationSource.Type, - testutils_resource.ENUM_SOURCE_REF_ID: resource.AuthenticationSource.SourceRef.Id, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_TYPE: resource.AuthenticationSource.Type, + testutils_resource.ENUM_SOURCE_REF_ID: resource.AuthenticationSource.SourceRef.Id, + }, } } -func deleteSessionAuthenticationPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteSessionAuthenticationPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.SessionAPI.DeleteSourcePolicy(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteSessionAuthenticationPolicy(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.SessionAPI.DeleteSourcePolicy(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteSourcePolicy", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/session_settings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/session_settings.go similarity index 73% rename from internal/testing/testutils_resource/pingfederate/session_settings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/session_settings.go index 038eebbf..a8f19fb2 100644 --- a/internal/testing/testutils_resource/pingfederate/session_settings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/session_settings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateSessionSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func SessionSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/sp_adapter.go b/internal/testing/testutils_resource/pingfederate_testable_resources/sp_adapter.go similarity index 63% rename from internal/testing/testutils_resource/pingfederate/sp_adapter.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/sp_adapter.go index 9726ad0e..a3f23fd3 100644 --- a/internal/testing/testutils_resource/pingfederate/sp_adapter.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/sp_adapter.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateSpAdapter(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func SpAdapter(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -25,13 +26,14 @@ func TestableResource_PingFederateSpAdapter(t *testing.T, clientInfo *connector. } } -func createSpAdapter(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createSpAdapter(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createSpAdapter(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createSpAdapter(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] request := clientInfo.PingFederateApiClient.SpAdaptersAPI.CreateSpAdapter(clientInfo.PingFederateContext) clientStruct := client.SpAdapter{ @@ -59,29 +61,48 @@ func createSpAdapter(t *testing.T, clientInfo *connector.ClientInfo, strArgs ... resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateSpAdapter", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteSpAdapter(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteSpAdapter(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.SpAdaptersAPI.DeleteSpAdapter(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteSpAdapter(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.SpAdaptersAPI.DeleteSpAdapter(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteSpAdapter", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/sp_authentication_policy_contract_mapping.go b/internal/testing/testutils_resource/pingfederate_testable_resources/sp_authentication_policy_contract_mapping.go similarity index 60% rename from internal/testing/testutils_resource/pingfederate/sp_authentication_policy_contract_mapping.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/sp_authentication_policy_contract_mapping.go index 11f57286..b80c971f 100644 --- a/internal/testing/testutils_resource/pingfederate/sp_authentication_policy_contract_mapping.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/sp_authentication_policy_contract_mapping.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateSpAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func SpAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,22 +22,23 @@ func TestableResource_PingFederateSpAuthenticationPolicyContractMapping(t *testi CreateFunc: createSpAuthenticationPolicyContractMapping, DeleteFunc: deleteSpAuthenticationPolicyContractMapping, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateAuthenticationPolicyContract(t, clientInfo), - TestableResource_PingFederateSpAdapter(t, clientInfo), + AuthenticationPolicyContract(t, clientInfo), + SpAdapter(t, clientInfo), }, ExportableResource: resources.SpAuthenticationPolicyContractMapping(clientInfo), } } -func createSpAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createSpAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 3 { - t.Fatalf("Unexpected number of arguments provided to createSpAuthenticationPolicyContractMapping(): %v", strArgs) + if len(strArgs) != 2 { + t.Errorf("Unexpected number of arguments provided to createSpAuthenticationPolicyContractMapping(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - testAPCId := strArgs[1] - testSPAdapterId := strArgs[2] + testAPCId := strArgs[0] + testSPAdapterId := strArgs[1] request := clientInfo.PingFederateApiClient.SpAuthenticationPolicyContractMappingsAPI.CreateApcToSpAdapterMapping(clientInfo.PingFederateContext) clientStruct := client.ApcToSpAdapterMapping{ @@ -57,30 +59,49 @@ func createSpAuthenticationPolicyContractMapping(t *testing.T, clientInfo *conne resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateApcToSpAdapterMapping", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_SOURCE_ID: resource.SourceId, - testutils_resource.ENUM_TARGET_ID: resource.TargetId, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_SOURCE_ID: resource.SourceId, + testutils_resource.ENUM_TARGET_ID: resource.TargetId, + }, } } -func deleteSpAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteSpAuthenticationPolicyContractMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.SpAuthenticationPolicyContractMappingsAPI.DeleteApcToSpAdapterMappingById(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteSpAuthenticationPolicyContractMapping(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.SpAuthenticationPolicyContractMappingsAPI.DeleteApcToSpAdapterMappingById(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteApcToSpAdapterMappingById", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/sp_idp_connection.go b/internal/testing/testutils_resource/pingfederate_testable_resources/sp_idp_connection.go similarity index 69% rename from internal/testing/testutils_resource/pingfederate/sp_idp_connection.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/sp_idp_connection.go index 2ef04e95..b9ebff8c 100644 --- a/internal/testing/testutils_resource/pingfederate/sp_idp_connection.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/sp_idp_connection.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -14,7 +15,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateSpIdpConnection(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func SpIdpConnection(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -26,17 +27,18 @@ func TestableResource_PingFederateSpIdpConnection(t *testing.T, clientInfo *conn } } -func createSpIdpConnection(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createSpIdpConnection(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { + if len(strArgs) != 0 { t.Fatalf("Unexpected number of arguments provided to createSpIdpConnection(): %v", strArgs) } - resourceType := strArgs[0] filedata, err := testutils.CreateX509Certificate() if err != nil { - t.Fatalf("Failed to create test %s: %v", resourceType, err) + t.Errorf("Failed to create test %s: %v", resourceType, err) + + return testutils_resource.ResourceInfo{} } request := clientInfo.PingFederateApiClient.SpIdpConnectionsAPI.CreateConnection(clientInfo.PingFederateContext) @@ -78,29 +80,48 @@ func createSpIdpConnection(t *testing.T, clientInfo *connector.ClientInfo, strAr resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateConnection", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_NAME: resource.Name, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, } } -func deleteSpIdpConnection(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteSpIdpConnection(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.SpIdpConnectionsAPI.DeleteConnection(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteSpIdpConnection(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.SpIdpConnectionsAPI.DeleteConnection(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteConnection", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/sp_target_url_mappings.go b/internal/testing/testutils_resource/pingfederate_testable_resources/sp_target_url_mappings.go similarity index 72% rename from internal/testing/testutils_resource/pingfederate/sp_target_url_mappings.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/sp_target_url_mappings.go index 5a390fd6..f76f92fa 100644 --- a/internal/testing/testutils_resource/pingfederate/sp_target_url_mappings.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/sp_target_url_mappings.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateSpTargetUrlMappings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func SpTargetUrlMappings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingfederate/sp_token_generator.go b/internal/testing/testutils_resource/pingfederate_testable_resources/sp_token_generator.go similarity index 66% rename from internal/testing/testutils_resource/pingfederate/sp_token_generator.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/sp_token_generator.go index 304c8b35..41283938 100644 --- a/internal/testing/testutils_resource/pingfederate/sp_token_generator.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/sp_token_generator.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -12,7 +13,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateSpTokenGenerator(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func SpTokenGenerator(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -20,20 +21,21 @@ func TestableResource_PingFederateSpTokenGenerator(t *testing.T, clientInfo *con CreateFunc: createSpTokenGenerator, DeleteFunc: deleteSpTokenGenerator, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateKeypairsSigningKey(t, clientInfo), + KeypairsSigningKey(t, clientInfo), }, ExportableResource: nil, } } -func createSpTokenGenerator(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createSpTokenGenerator(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createSpTokenGenerator(): %v", strArgs) + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createSpTokenGenerator(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] - testSigningKeyPairId := strArgs[1] + testSigningKeyPairId := strArgs[0] request := clientInfo.PingFederateApiClient.SpTokenGeneratorsAPI.CreateTokenGenerator(clientInfo.PingFederateContext) result := client.TokenGenerator{ @@ -84,28 +86,47 @@ func createSpTokenGenerator(t *testing.T, clientInfo *connector.ClientInfo, strA resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateTokenGenerator", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: resource.Id, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + }, } } -func deleteSpTokenGenerator(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteSpTokenGenerator(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.SpTokenGeneratorsAPI.DeleteTokenGenerator(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteSpTokenGenerator(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.SpTokenGeneratorsAPI.DeleteTokenGenerator(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteTokenGenerator", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/token_processor_to_token_generator_mapping.go b/internal/testing/testutils_resource/pingfederate_testable_resources/token_processor_to_token_generator_mapping.go similarity index 61% rename from internal/testing/testutils_resource/pingfederate/token_processor_to_token_generator_mapping.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/token_processor_to_token_generator_mapping.go index 5c232512..006664c0 100644 --- a/internal/testing/testutils_resource/pingfederate/token_processor_to_token_generator_mapping.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/token_processor_to_token_generator_mapping.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -13,7 +14,7 @@ import ( client "github.com/pingidentity/pingfederate-go-client/v1220/configurationapi" ) -func TestableResource_PingFederateTokenProcessorToTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func TokenProcessorToTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -21,22 +22,23 @@ func TestableResource_PingFederateTokenProcessorToTokenGeneratorMapping(t *testi CreateFunc: createTokenProcessorToTokenGeneratorMapping, DeleteFunc: deleteTokenProcessorToTokenGeneratorMapping, Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingFederateIdpTokenProcessor(t, clientInfo), - TestableResource_PingFederateSpTokenGenerator(t, clientInfo), + IdpTokenProcessor(t, clientInfo), + SpTokenGenerator(t, clientInfo), }, ExportableResource: resources.TokenProcessorToTokenGeneratorMapping(clientInfo), } } -func createTokenProcessorToTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createTokenProcessorToTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 3 { - t.Fatalf("Unexpected number of arguments provided to createTokenProcessorToTokenGeneratorMapping(): %v", strArgs) + if len(strArgs) != 4 { + t.Errorf("Unexpected number of arguments provided to createTokenProcessorToTokenGeneratorMapping(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] testTokenProcessorId := strArgs[1] - testTokenGeneratorId := strArgs[2] + testTokenGeneratorId := strArgs[3] request := clientInfo.PingFederateApiClient.TokenProcessorToTokenGeneratorMappingsAPI.CreateTokenToTokenMapping(clientInfo.PingFederateContext) clientStruct := client.TokenToTokenMapping{ @@ -57,30 +59,49 @@ func createTokenProcessorToTokenGeneratorMapping(t *testing.T, clientInfo *conne resource, response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "CreateTokenToTokenMapping", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *resource.Id, - testutils_resource.ENUM_SOURCE_ID: resource.SourceId, - testutils_resource.ENUM_TARGET_ID: resource.TargetId, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_SOURCE_ID: resource.SourceId, + testutils_resource.ENUM_TARGET_ID: resource.TargetId, + }, } } -func deleteTokenProcessorToTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteTokenProcessorToTokenGeneratorMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - request := clientInfo.PingFederateApiClient.TokenProcessorToTokenGeneratorMappingsAPI.DeleteTokenToTokenMappingById(clientInfo.PingFederateContext, id) + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteTokenProcessorToTokenGeneratorMapping(): %v", ids) + + return + } + + request := clientInfo.PingFederateApiClient.TokenProcessorToTokenGeneratorMappingsAPI.DeleteTokenToTokenMappingById(clientInfo.PingFederateContext, ids[0]) response, err := request.Execute() ok, err := common.HandleClientResponse(response, err, "DeleteTokenToTokenMappingById", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingfederate/virtual_host_names.go b/internal/testing/testutils_resource/pingfederate_testable_resources/virtual_host_names.go similarity index 73% rename from internal/testing/testutils_resource/pingfederate/virtual_host_names.go rename to internal/testing/testutils_resource/pingfederate_testable_resources/virtual_host_names.go index f7d08a05..65582248 100644 --- a/internal/testing/testutils_resource/pingfederate/virtual_host_names.go +++ b/internal/testing/testutils_resource/pingfederate_testable_resources/virtual_host_names.go @@ -1,6 +1,7 @@ // Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator -package pingfederate +package pingfederate_testable_resources import ( "testing" @@ -10,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingFederateVirtualHostNames(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func VirtualHostNames(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ diff --git a/internal/testing/testutils_resource/pingone/pingfederate_gateway.go b/internal/testing/testutils_resource/pingone/pingfederate_gateway.go deleted file mode 100644 index b3c4f039..00000000 --- a/internal/testing/testutils_resource/pingone/pingfederate_gateway.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package pingone - -import ( - "testing" - - "github.com/patrickcping/pingone-go-sdk-v2/management" - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource" -) - -func TestableResource_PingOnePingFederateGateway(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { - t.Helper() - - return &testutils_resource.TestableResource{ - ClientInfo: clientInfo, - CreateFunc: createPingFederateGateway, - DeleteFunc: deletePingFederateGateway, - Dependencies: nil, - ExportableResource: nil, - } -} - -func createPingFederateGateway(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { - t.Helper() - - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createPingFederateGateway(): %v", strArgs) - } - resourceType := strArgs[0] - - result := management.CreateGatewayRequest{ - Gateway: &management.Gateway{ - Enabled: true, - Name: "TestPingFederateGateway", - Type: management.ENUMGATEWAYTYPE_PING_FEDERATE, - }, - } - - api_request := clientInfo.PingOneApiClient.ManagementAPIClient.GatewaysApi.CreateGateway(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) - api_request = api_request.CreateGatewayRequest(result) - - createGateway201Response, response, err := api_request.Execute() - ok, err := common.HandleClientResponse(response, err, "CreateGateway", resourceType) - if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) - } - if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) - } - - if createGateway201Response == nil || createGateway201Response.Gateway == nil { - t.Fatalf("Failed to create test %s: %v", resourceType, err) - } - - gatewayId, gatewayIdOk := createGateway201Response.Gateway.GetIdOk() - if !gatewayIdOk { - t.Fatalf("Failed to create test %s: %v", resourceType, err) - } - - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *gatewayId, - } -} - -func deletePingFederateGateway(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { - t.Helper() - - response, err := clientInfo.PingOneApiClient.ManagementAPIClient.GatewaysApi.DeleteGateway(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, id).Execute() - ok, err := common.HandleClientResponse(response, err, "DeleteGateway", resourceType) - if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) - } - if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) - } -} diff --git a/internal/testing/testutils_resource/pingone/pingfederate_gateway_credential.go b/internal/testing/testutils_resource/pingone/pingfederate_gateway_credential.go deleted file mode 100644 index 59baf340..00000000 --- a/internal/testing/testutils_resource/pingone/pingfederate_gateway_credential.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright © 2025 Ping Identity Corporation - -package pingone - -import ( - "testing" - - "github.com/pingidentity/pingcli/internal/connector" - "github.com/pingidentity/pingcli/internal/connector/common" - "github.com/pingidentity/pingcli/internal/testing/testutils_resource" -) - -func TestableResource_PingOnePingFederateGatewayCredential(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { - t.Helper() - - return &testutils_resource.TestableResource{ - ClientInfo: clientInfo, - CreateFunc: createPingFederateGatewayCredential, - DeleteFunc: nil, - Dependencies: []*testutils_resource.TestableResource{ - TestableResource_PingOnePingFederateGateway(t, clientInfo), - }, - ExportableResource: nil, - } -} - -func createPingFederateGatewayCredential(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { - t.Helper() - - if len(strArgs) != 2 { - t.Fatalf("Unexpected number of arguments provided to createPingoneConnection(): %v", strArgs) - } - resourceType := strArgs[0] - gatewayId := strArgs[1] - - gatewayCredential, response, err := clientInfo.PingOneApiClient.ManagementAPIClient.GatewayCredentialsApi.CreateGatewayCredential(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, gatewayId).Execute() - ok, err := common.HandleClientResponse(response, err, "CreateGatewayCredential", resourceType) - if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) - } - if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) - } - - if gatewayCredential == nil { - t.Fatalf("Failed to create test %s: %v", resourceType, err) - } - - credential, credentialOk := gatewayCredential.GetCredentialOk() - if !credentialOk { - t.Fatalf("Failed to create test %s: %v", resourceType, err) - } - - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *credential, // the pingone_connection resource needs the credential instead of the id of the credential - testutils_resource.ENUM_CREDENTIAL: *credential, - } -} diff --git a/internal/testing/testutils_resource/pingone_authorize_testable_resources/application_resource.go b/internal/testing/testutils_resource/pingone_authorize_testable_resources/application_resource.go new file mode 100644 index 00000000..67726a77 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_authorize_testable_resources/application_resource.go @@ -0,0 +1,96 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_authorize_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func ApplicationResource(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createApplicationResource, + DeleteFunc: deleteApplicationResource, + Dependencies: []*testutils_resource.TestableResource{ + pingone_sso_testable_resources.Resource(t, clientInfo), + }, + ExportableResource: resources.ApplicationResource(clientInfo), + } +} + +func createApplicationResource(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createApplicationResource(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + resourceId := strArgs[0] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationResourcesApi.CreateApplicationResource(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, resourceId) + clientStruct := management.ResourceApplicationResource{ + Name: "Accounts", + } + + request = request.ResourceApplicationResource(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateApplicationResource", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resourceId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteApplicationResource(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteApplicationResource(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationResourcesApi.DeleteApplicationResource(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteApplicationResource", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_authorize_testable_resources/application_resource_permission.go b/internal/testing/testutils_resource/pingone_authorize_testable_resources/application_resource_permission.go new file mode 100644 index 00000000..b7d0002c --- /dev/null +++ b/internal/testing/testutils_resource/pingone_authorize_testable_resources/application_resource_permission.go @@ -0,0 +1,98 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_authorize_testable_resources + +import ( + "fmt" + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func ApplicationResourcePermission(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createApplicationResourcePermission, + DeleteFunc: deleteApplicationResourcePermission, + Dependencies: []*testutils_resource.TestableResource{ + ApplicationResource(t, clientInfo), + }, + ExportableResource: resources.ApplicationResourcePermission(clientInfo), + } +} + +func createApplicationResourcePermission(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 2 { + t.Errorf("Unexpected number of arguments provided to createApplicationResourcePermission(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + applicationResourceId := strArgs[1] + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationResourcePermissionsApi.CreateApplicationPermission(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, applicationResourceId) + clientStruct := authorize.ApplicationResourcePermission{ + Action: "write", + Description: utils.Pointer("Update documents"), + } + + request = request.ApplicationResourcePermission(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateApplicationPermission", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + applicationResourceId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: fmt.Sprintf("%s:%s", *resource.Resource.Name, resource.Action), + }, + } +} + +func deleteApplicationResourcePermission(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteApplicationResourcePermission(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationResourcePermissionsApi.DeleteApplicationPermission(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteApplicationPermission", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service.go b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service.go new file mode 100644 index 00000000..2a28c33c --- /dev/null +++ b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service.go @@ -0,0 +1,105 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_authorize_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func AuthorizeApiService(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createAuthorizeApiService, + DeleteFunc: deleteAuthorizeApiService, + Dependencies: []*testutils_resource.TestableResource{ + pingone_sso_testable_resources.Resource(t, clientInfo), + }, + ExportableResource: resources.AuthorizeApiService(clientInfo), + } +} + +func createAuthorizeApiService(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createAuthorizeApiService(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + resourceId := strArgs[0] + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServersApi.CreateAPIServer(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := authorize.APIServer{ + Name: "Banking API-Advanced", + BaseUrls: []string{ + "https://api.example.com/advbanking/v1", + "https://example-api.cdn/advbanking/v1", + }, + AuthorizationServer: authorize.APIServerAuthorizationServer{ + Resource: &authorize.APIServerAuthorizationServerResource{ + Id: resourceId, + }, + Type: authorize.ENUMAPISERVERAUTHORIZATIONSERVERTYPE_PINGONE_SSO, + }, + } + + request = request.APIServer(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateAPIServer", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteAuthorizeApiService(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteAuthorizeApiService(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServersApi.DeleteAPIServer(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteAPIServer", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service_deployment.go b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service_deployment.go new file mode 100644 index 00000000..d9707e2e --- /dev/null +++ b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service_deployment.go @@ -0,0 +1,60 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_authorize_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func AuthorizeApiServiceDeployment(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createAuthorizeApiServiceDeployment, + DeleteFunc: nil, + Dependencies: []*testutils_resource.TestableResource{ + AuthorizeApiService(t, clientInfo), + }, + ExportableResource: resources.AuthorizeApiServiceDeployment(clientInfo), + } +} + +func createAuthorizeApiServiceDeployment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 2 { + t.Errorf("Unexpected number of arguments provided to createAuthorizeApiServiceDeployment(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + authorizeApiServiceId := strArgs[1] + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServerDeploymentApi.DeployAPIServer(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, authorizeApiServiceId) + request = request.ContentType("application/vnd.pingidentity.apiserver.deploy+json") + + _, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateApplicationPermission", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + if response != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + } else { + t.Errorf("Failed to execute PingOne client function") + } + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{} +} diff --git a/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service_operation.go b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service_operation.go new file mode 100644 index 00000000..d0167775 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service_operation.go @@ -0,0 +1,105 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_authorize_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func AuthorizeApiServiceOperation(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createAuthorizeApiServiceOperation, + DeleteFunc: deleteAuthorizeApiServiceOperation, + Dependencies: []*testutils_resource.TestableResource{ + AuthorizeApiService(t, clientInfo), + }, + ExportableResource: resources.AuthorizeApiServiceOperation(clientInfo), + } +} + +func createAuthorizeApiServiceOperation(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 2 { + t.Errorf("Unexpected number of arguments provided to createAuthorizeApiServiceOperation(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + apiServerId := strArgs[1] + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServerOperationsApi.CreateAPIServerOperation(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, apiServerId) + clientStruct := authorize.APIServerOperation{ + Name: "AccountsPayable", + Paths: []authorize.APIServerOperationPathsInner{ + { + Type: authorize.ENUMAPISERVEROPERATIONPATHPATTERNTYPE_EXACT, + Pattern: "/accountsPayable", + }, + }, + Methods: []authorize.EnumAPIServerOperationMethod{ + authorize.ENUMAPISERVEROPERATIONMETHOD_POST, + authorize.ENUMAPISERVEROPERATIONMETHOD_PUT, + }, + } + + request = request.APIServerOperation(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateAPIServerOperation", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + apiServerId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteAuthorizeApiServiceOperation(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteAuthorizeApiServiceOperation(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.APIServerOperationsApi.DeleteAPIServerOperation(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteAPIServerOperation", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_application_role.go b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_application_role.go new file mode 100644 index 00000000..7aa8256b --- /dev/null +++ b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_application_role.go @@ -0,0 +1,93 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_authorize_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func AuthorizeApplicationRole(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createAuthorizeApplicationRole, + DeleteFunc: deleteAuthorizeApplicationRole, + Dependencies: nil, + ExportableResource: resources.AuthorizeApplicationRole(clientInfo), + } +} + +func createAuthorizeApplicationRole(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createAuthorizeApplicationRole(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationRolesApi.CreateApplicationRoles(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := authorize.ApplicationRole{ + Name: "CEO", + Description: utils.Pointer("The CEO"), + } + + request = request.ApplicationRole(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateApplicationRoles", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteAuthorizeApplicationRole(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteAuthorizeApplicationRole(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationRolesApi.DeleteApplicationRole(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteApplicationRole", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_application_role_permission.go b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_application_role_permission.go new file mode 100644 index 00000000..4bacd2da --- /dev/null +++ b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_application_role_permission.go @@ -0,0 +1,97 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_authorize_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func AuthorizeApplicationRolePermission(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createAuthorizeApplicationRolePermission, + DeleteFunc: deleteAuthorizeApplicationRolePermission, + Dependencies: []*testutils_resource.TestableResource{ + AuthorizeApplicationRole(t, clientInfo), + ApplicationResourcePermission(t, clientInfo), + }, + ExportableResource: resources.AuthorizeApplicationRolePermission(clientInfo), + } +} + +func createAuthorizeApplicationRolePermission(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 4 { + t.Errorf("Unexpected number of arguments provided to createAuthorizeApplicationRolePermission(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + applicationRoleId := strArgs[0] + applicationResourcePermissionId := strArgs[3] + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationRolePermissionsApi.CreateApplicationRolePermission(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, applicationRoleId) + clientStruct := authorize.ApplicationRolePermission{ + Id: applicationResourcePermissionId, + } + + request = request.ApplicationRolePermission(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateApplicationRolePermission", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + applicationRoleId, + resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: *resource.Key, + }, + } +} + +func deleteAuthorizeApplicationRolePermission(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteAuthorizeApplicationRolePermission(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.ApplicationRolePermissionsApi.DeleteApplicationRolePermission(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteApplicationRolePermission", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_decision_endpoint.go b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_decision_endpoint.go new file mode 100644 index 00000000..946b3326 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_decision_endpoint.go @@ -0,0 +1,93 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_authorize_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/authorize" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func AuthorizeDecisionEndpoint(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createAuthorizeDecisionEndpoint, + DeleteFunc: deleteAuthorizeDecisionEndpoint, + Dependencies: nil, + ExportableResource: resources.AuthorizeDecisionEndpoint(clientInfo), + } +} + +func createAuthorizeDecisionEndpoint(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createAuthorizeDecisionEndpoint(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.PolicyDecisionManagementApi.CreateDecisionEndpoint(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := authorize.DecisionEndpoint{ + Name: "Test Endpoint", + Description: "Endpoint for use in tests", + RecordRecentRequests: true, + } + + request = request.DecisionEndpoint(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateDecisionEndpoint", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteAuthorizeDecisionEndpoint(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteAuthorizeDecisionEndpoint(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.AuthorizeAPIClient.PolicyDecisionManagementApi.DeleteDecisionEndpoint(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteDecisionEndpoint", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_application_push_credential.go b/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_application_push_credential.go new file mode 100644 index 00000000..bc0bc714 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_application_push_credential.go @@ -0,0 +1,100 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_mfa_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/mfa" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/mfa/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource/pingone_sso_testable_resources" +) + +func MfaApplicationPushCredential(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createMfaApplicationPushCredential, + DeleteFunc: deleteMfaApplicationPushCredential, + Dependencies: []*testutils_resource.TestableResource{ + pingone_sso_testable_resources.ApplicationNative(t, clientInfo), + }, + ExportableResource: resources.MfaApplicationPushCredential(clientInfo), + } +} + +func createMfaApplicationPushCredential(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createMfaApplicationPushCredential(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + applicationId := strArgs[0] + + request := clientInfo.PingOneApiClient.MFAAPIClient.ApplicationsApplicationMFAPushCredentialsApi.CreateMFAPushCredential(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, applicationId) + clientStruct := mfa.MFAPushCredentialRequest{ + MFAPushCredentialHMS: &mfa.MFAPushCredentialHMS{ + Type: mfa.ENUMMFAPUSHCREDENTIALATTRTYPE_HMS, + ClientId: "897389789432", + ClientSecret: "B23897498", + }, + } + + request = request.MFAPushCredentialRequest(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateMFAPushCredential", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + applicationId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_TYPE: string(*resource.Type), + }, + } +} + +func deleteMfaApplicationPushCredential(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteMfaApplicationPushCredential(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.MFAAPIClient.ApplicationsApplicationMFAPushCredentialsApi.DeleteMFAPushCredential(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteMFAPushCredential", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_device_policy.go b/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_device_policy.go new file mode 100644 index 00000000..cc5aad28 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_device_policy.go @@ -0,0 +1,173 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_mfa_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/mfa" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/mfa/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func MfaDevicePolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createMfaDevicePolicy, + DeleteFunc: deleteMfaDevicePolicy, + Dependencies: nil, + ExportableResource: resources.MfaDevicePolicy(clientInfo), + } +} + +func createMfaDevicePolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createMfaDevicePolicy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.MFAAPIClient.DeviceAuthenticationPolicyApi.CreateDeviceAuthenticationPolicies(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := mfa.DeviceAuthenticationPolicyPost{ + DeviceAuthenticationPolicy: &mfa.DeviceAuthenticationPolicy{ + Name: "TestDeviceAuthPolicy", + Sms: mfa.DeviceAuthenticationPolicyOfflineDevice{ + Enabled: true, + Otp: mfa.DeviceAuthenticationPolicyOfflineDeviceOtp{ + Failure: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpFailure{ + Count: 3, + CoolDown: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpFailureCoolDown{ + Duration: 0, + TimeUnit: mfa.ENUMTIMEUNIT_MINUTES, + }, + }, + LifeTime: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpLifeTime{ + Duration: 30, + TimeUnit: mfa.ENUMTIMEUNIT_MINUTES, + }, + OtpLength: utils.Pointer(int32(6)), + }, + }, + Email: mfa.DeviceAuthenticationPolicyOfflineDevice{ + Enabled: true, + Otp: mfa.DeviceAuthenticationPolicyOfflineDeviceOtp{ + Failure: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpFailure{ + Count: 3, + CoolDown: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpFailureCoolDown{ + Duration: 0, + TimeUnit: mfa.ENUMTIMEUNIT_MINUTES, + }, + }, + LifeTime: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpLifeTime{ + Duration: 30, + TimeUnit: mfa.ENUMTIMEUNIT_MINUTES, + }, + OtpLength: utils.Pointer(int32(8)), + }, + }, + Mobile: mfa.DeviceAuthenticationPolicyMobile{ + Enabled: true, + Otp: mfa.DeviceAuthenticationPolicyMobileOtp{ + Failure: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpFailure{ + Count: 3, + CoolDown: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpFailureCoolDown{ + Duration: 2, + TimeUnit: mfa.ENUMTIMEUNIT_MINUTES, + }, + }, + }, + Applications: []mfa.DeviceAuthenticationPolicyMobileApplicationsInner{}, + }, + Totp: mfa.DeviceAuthenticationPolicyTotp{ + Enabled: true, + Otp: mfa.DeviceAuthenticationPolicyTotpOtp{ + Failure: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpFailure{ + Count: 3, + CoolDown: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpFailureCoolDown{ + Duration: 2, + TimeUnit: mfa.ENUMTIMEUNIT_MINUTES, + }, + }, + }, + }, + Voice: mfa.DeviceAuthenticationPolicyOfflineDevice{ + Enabled: true, + Otp: mfa.DeviceAuthenticationPolicyOfflineDeviceOtp{ + Failure: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpFailure{ + Count: 3, + CoolDown: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpFailureCoolDown{ + Duration: 0, + TimeUnit: mfa.ENUMTIMEUNIT_MINUTES, + }, + }, + LifeTime: mfa.DeviceAuthenticationPolicyOfflineDeviceOtpLifeTime{ + Duration: 30, + TimeUnit: mfa.ENUMTIMEUNIT_MINUTES, + }, + OtpLength: utils.Pointer(int32(6)), + }, + }, + NewDeviceNotification: utils.Pointer(mfa.ENUMMFADEVICEPOLICYNEWDEVICENOTIFICATION_SMS_THEN_EMAIL), + ForSignOnPolicy: false, + Default: false, + }, + } + + request = request.DeviceAuthenticationPolicyPost(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateDeviceAuthenticationPolicies", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.DeviceAuthenticationPolicy.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.DeviceAuthenticationPolicy.Id, + testutils_resource.ENUM_NAME: resource.DeviceAuthenticationPolicy.Name, + }, + } +} + +func deleteMfaDevicePolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteMfaDevicePolicy(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.MFAAPIClient.DeviceAuthenticationPolicyApi.DeleteDeviceAuthenticationPolicy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteDeviceAuthenticationPolicy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_fido2_policy.go b/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_fido2_policy.go new file mode 100644 index 00000000..853f2c59 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_fido2_policy.go @@ -0,0 +1,131 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_mfa_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/mfa" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/mfa/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func MfaFido2Policy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createMfaFido2Policy, + DeleteFunc: deleteMfaFido2Policy, + Dependencies: nil, + ExportableResource: resources.MfaFido2Policy(clientInfo), + } +} + +func createMfaFido2Policy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createMfaFido2Policy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.MFAAPIClient.FIDO2PolicyApi.CreateFIDO2Policy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := mfa.FIDO2Policy{ + Name: "TestFido2Policy", + Description: utils.Pointer("Test FIDO2 Policy"), + DeviceDisplayName: "Fido2 device", + DiscoverableCredentials: mfa.ENUMFIDO2POLICYDISCOVERABLECREDENTIALS_REQUIRED, + AuthenticatorAttachment: mfa.ENUMFIDO2POLICYAUTHENTICATORATTACHMENT_BOTH, + UserVerification: mfa.FIDO2PolicyUserVerification{ + EnforceDuringAuthentication: true, + Option: mfa.ENUMFIDO2POLICYUSERVERIFICATIONOPTION_REQUIRED, + }, + UserPresenceTimeout: &mfa.FIDO2PolicyUserPresenceTimeout{ + Duration: utils.Pointer(int32(4)), + TimeUnit: utils.Pointer(mfa.ENUMTIMEUNIT_MINUTES), + }, + BackupEligibility: mfa.FIDO2PolicyBackupEligibility{ + EnforceDuringAuthentication: true, + Allow: true, + }, + UserDisplayNameAttributes: mfa.FIDO2PolicyUserDisplayNameAttributes{ + Attributes: []mfa.FIDO2PolicyUserDisplayNameAttributesAttributesInner{ + { + Name: "username", + }, + { + Name: "email", + }, + }, + }, + AttestationRequirements: mfa.ENUMFIDO2POLICYATTESTATIONREQUIREMENTS_DIRECT, + MdsAuthenticatorsRequirements: mfa.FIDO2PolicyMdsAuthenticatorsRequirements{ + AllowedAuthenticators: nil, + Option: mfa.ENUMFIDO2POLICYMDSAUTHENTICATOROPTION_CERTIFIED, + EnforceDuringAuthentication: true, + }, + PublicKeyCredentialHints: []mfa.EnumFIDO2PublicKeyCredentialHint{ + mfa.ENUMFIDO2PUBLICKEYCREDENTIALHINT_SECURITY_KEY, + mfa.ENUMFIDO2PUBLICKEYCREDENTIALHINT_CLIENT_DEVICE, + mfa.ENUMFIDO2PUBLICKEYCREDENTIALHINT_HYBRID, + }, + RelyingPartyId: "relyingpartydomain.example.com", + Default: utils.Pointer(false), + } + + request = request.FIDO2Policy(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateFIDO2Policy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteMfaFido2Policy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteMfaFido2Policy(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.MFAAPIClient.FIDO2PolicyApi.DeleteFIDO2Policy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteFIDO2Policy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_settings.go b/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_settings.go new file mode 100644 index 00000000..6b0475ac --- /dev/null +++ b/internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_settings.go @@ -0,0 +1,24 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_mfa_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/mfa/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func MfaSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: nil, + ExportableResource: resources.MfaSettings(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement.go new file mode 100644 index 00000000..e5fc2ed4 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement.go @@ -0,0 +1,95 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func Agreement(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createAgreement, + DeleteFunc: deleteAgreement, + Dependencies: nil, + ExportableResource: resources.Agreement(clientInfo), + } +} + +func createAgreement(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createAgreement(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.AgreementsResourcesApi.CreateAgreement(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.Agreement{ + Name: "Agreement_2", + Description: utils.Pointer("Terms of service agreement"), + ReconsentPeriodDays: utils.Pointer(float32(180)), + Enabled: false, + } + + request = request.Agreement(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateAgreement", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteAgreement(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteAgreement(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.AgreementsResourcesApi.DeleteAgreement(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteAgreement", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_enable.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_enable.go new file mode 100644 index 00000000..6105fba7 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_enable.go @@ -0,0 +1,26 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func AgreementEnable(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: []*testutils_resource.TestableResource{ + Agreement(t, clientInfo), + }, + ExportableResource: resources.AgreementEnable(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization.go new file mode 100644 index 00000000..bce2000a --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization.go @@ -0,0 +1,97 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func AgreementLocalization(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createAgreementLocalization, + DeleteFunc: deleteAgreementLocalization, + Dependencies: []*testutils_resource.TestableResource{ + Agreement(t, clientInfo), + }, + ExportableResource: resources.AgreementLocalization(clientInfo), + } +} + +func createAgreementLocalization(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createAgreementLocalization(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + agreementId := strArgs[0] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.AgreementLanguagesResourcesApi.CreateAgreementLanguage(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, agreementId) + clientStruct := management.AgreementLanguage{ + Locale: "en-US", + DisplayName: "Language_1", + Enabled: true, + } + + request = request.AgreementLanguage(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateAgreementLanguage", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + agreementId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_LOCALE: resource.Locale, + }, + } +} + +func deleteAgreementLocalization(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteAgreementLocalization(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.AgreementLanguagesResourcesApi.DeleteAgreementLanguage(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteAgreementLanguage", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization_enable.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization_enable.go new file mode 100644 index 00000000..14669e83 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization_enable.go @@ -0,0 +1,26 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func AgreementLocalizationEnable(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: []*testutils_resource.TestableResource{ + AgreementLocalization(t, clientInfo), + }, + ExportableResource: resources.AgreementLocalizationEnable(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization_revision.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization_revision.go new file mode 100644 index 00000000..b086e752 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization_revision.go @@ -0,0 +1,107 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + "time" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func AgreementLocalizationRevision(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createAgreementLocalizationRevision, + DeleteFunc: deleteAgreementLocalizationRevision, + Dependencies: []*testutils_resource.TestableResource{ + AgreementLocalization(t, clientInfo), + }, + ExportableResource: resources.AgreementLocalizationRevision(clientInfo), + } +} + +func createAgreementLocalizationRevision(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 2 { + t.Errorf("Unexpected number of arguments provided to createAgreementLocalizationRevision(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + agreementId := strArgs[0] + agreementLocalizationId := strArgs[1] + + parsedTime, err := time.Parse(time.RFC3339, "2098-08-01T22:45:44.497Z") + if err != nil { + t.Errorf("Failed to parse time: %v", err) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.AgreementRevisionsResourcesApi.CreateAgreementLanguageRevision(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, agreementId, agreementLocalizationId) + clientStruct := management.AgreementLanguageRevision{ + EffectiveAt: parsedTime, + RequireReconsent: false, + Text: "Test, test, test", + ContentType: "text/plain", + } + + request = request.AgreementLanguageRevision(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateAgreementLanguageRevision", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + agreementId, + agreementLocalizationId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + }, + } +} + +func deleteAgreementLocalizationRevision(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 3 { + t.Errorf("Unexpected number of arguments provided to deleteAgreementLocalizationRevision(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.AgreementRevisionsResourcesApi.DeleteAgreementLanguageRevision(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1], ids[2]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteAgreementLanguageRevision", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/alert_channel.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/alert_channel.go new file mode 100644 index 00000000..94214a8f --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/alert_channel.go @@ -0,0 +1,102 @@ +// Copyright © 2025 Ping Identity Corporation + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func AlertChannel(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createAlertChannel, + DeleteFunc: deleteAlertChannel, + Dependencies: nil, + ExportableResource: resources.AlertChannel(clientInfo), + } +} + +func createAlertChannel(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createAlertChannel(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.AlertingApi.CreateAlertChannel(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.AlertChannel{ + ChannelType: management.ENUMALERTCHANNELTYPE_EMAIL, + AlertName: utils.Pointer("Cert Expired Alert"), + IncludeSeverities: []management.EnumAlertChannelSeverity{ + management.ENUMALERTCHANNELSEVERITY_ERROR, + }, + IncludeAlertTypes: []management.EnumAlertChannelAlertType{ + management.ENUMALERTCHANNELALERTTYPE_CERTIFICATE_EXPIRED, + }, + ExcludeAlertTypes: []management.EnumAlertChannelAlertType{}, + Addresses: []string{ + "example@example.com", + }, + } + + request = request.AlertChannel(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateAlertChannel", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: *resource.AlertName, + }, + } +} + +func deleteAlertChannel(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteAlertChannel(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.AlertingApi.DeleteAlertChannel(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteAlertChannel", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/branding_settings.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/branding_settings.go new file mode 100644 index 00000000..74360c6f --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/branding_settings.go @@ -0,0 +1,24 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func BrandingSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: nil, + ExportableResource: resources.BrandingSettings(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/branding_theme.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/branding_theme.go new file mode 100644 index 00000000..6f3b1daa --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/branding_theme.go @@ -0,0 +1,129 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/hashicorp/go-uuid" + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func BrandingTheme(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createBrandingTheme, + DeleteFunc: deleteBrandingTheme, + Dependencies: nil, + ExportableResource: resources.BrandingTheme(clientInfo), + } +} + +func createBrandingTheme(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createBrandingTheme(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.BrandingThemesApi.CreateBrandingTheme(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + + newLogoId, err := uuid.GenerateUUID() + if err != nil { + t.Errorf("Failed to generate UUID: %v", err) + + return testutils_resource.ResourceInfo{} + } + + newImageId, err := uuid.GenerateUUID() + if err != nil { + t.Errorf("Failed to generate UUID: %v", err) + + return testutils_resource.ResourceInfo{} + } + + clientStruct := management.BrandingTheme{ + Template: "default", + Configuration: management.BrandingThemeConfiguration{ + LogoType: "IMAGE", + Logo: &management.BrandingThemeConfigurationLogo{ + Href: "https://www.pingidentity.com/content/dam/picr/nav/Ping-Logo-2.svg", + Id: newLogoId, + }, + BackgroundColor: utils.Pointer("#333333"), + BackgroundType: "COLOR", + BackgroundImage: &management.BrandingThemeConfigurationBackgroundImage{ + Href: "https://www.pingidentity.com/content/dam/picr/nav/Ping-Logo-2.svg", + Id: newImageId, + }, + CardColor: "#333333", + HeadingTextColor: "#333333", + LinkTextColor: "#333333", + BodyTextColor: "#444444", + ButtonTextColor: "#333333", + ButtonColor: "#333333", + Name: utils.Pointer("ACME test theme"), + Footer: utils.Pointer("some footer"), + }, + } + + request = request.BrandingTheme(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateBrandingTheme", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: *resource.Configuration.Name, + }, + } +} + +func deleteBrandingTheme(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteBrandingTheme(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.BrandingThemesApi.DeleteBrandingTheme(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteBrandingTheme", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/branding_theme_default.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/branding_theme_default.go new file mode 100644 index 00000000..62373c05 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/branding_theme_default.go @@ -0,0 +1,24 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func BrandingThemeDefault(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: nil, + ExportableResource: resources.BrandingThemeDefault(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/certificate.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/certificate.go new file mode 100644 index 00000000..4f244686 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/certificate.go @@ -0,0 +1,97 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func Certificate(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createCertificate, + DeleteFunc: deleteCertificate, + Dependencies: nil, + ExportableResource: resources.Certificate(clientInfo), + } +} + +func createCertificate(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createCertificate(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.CertificateManagementApi.CreateCertificateFromFile(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + + fileData, err := testutils.CreateX509Certificate() + if err != nil { + t.Errorf("Failed to create X509 certificate: %v", err) + + return testutils_resource.ResourceInfo{} + } + + request = request.File(utils.Pointer([]byte(fileData))) + request = request.UsageType("SIGNING") + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateCertificateFromFile", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteCertificate(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteCertificate(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.CertificateManagementApi.DeleteCertificate(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteCertificate", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/custom_domain.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/custom_domain.go new file mode 100644 index 00000000..23395d94 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/custom_domain.go @@ -0,0 +1,91 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func CustomDomain(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createCustomDomain, + DeleteFunc: deleteCustomDomain, + Dependencies: nil, + ExportableResource: resources.CustomDomain(clientInfo), + } +} + +func createCustomDomain(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createCustomDomain(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.CustomDomainsApi.CreateDomain(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.CustomDomain{ + DomainName: "custom-domain.example.com", + } + + request = request.CustomDomain(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateDomain", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.DomainName, + }, + } +} + +func deleteCustomDomain(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteCustomDomain(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.CustomDomainsApi.DeleteDomain(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteDomain", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone/device_auth_application.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/device_auth_application.go similarity index 63% rename from internal/testing/testutils_resource/pingone/device_auth_application.go rename to internal/testing/testutils_resource/pingone_platform_testable_resources/device_auth_application.go index 42901199..74629901 100644 --- a/internal/testing/testutils_resource/pingone/device_auth_application.go +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/device_auth_application.go @@ -1,6 +1,6 @@ // Copyright © 2025 Ping Identity Corporation -package pingone +package pingone_platform_testable_resources import ( "testing" @@ -11,7 +11,7 @@ import ( "github.com/pingidentity/pingcli/internal/testing/testutils_resource" ) -func TestableResource_PingOneDeviceAuthApplication(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { +func DeviceAuthApplication(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { t.Helper() return &testutils_resource.TestableResource{ @@ -23,13 +23,14 @@ func TestableResource_PingOneDeviceAuthApplication(t *testing.T, clientInfo *con } } -func createDeviceAuthApplication(t *testing.T, clientInfo *connector.ClientInfo, strArgs ...string) testutils_resource.ResourceCreationInfo { +func createDeviceAuthApplication(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { t.Helper() - if len(strArgs) != 1 { - t.Fatalf("Unexpected number of arguments provided to createPingOneDeviceAuthApplication(): %v", strArgs) + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createPingOneDeviceAuthApplication(): %v", strArgs) + + return testutils_resource.ResourceInfo{} } - resourceType := strArgs[0] result := management.CreateApplicationRequest{ ApplicationOIDC: &management.ApplicationOIDC{ @@ -48,35 +49,58 @@ func createDeviceAuthApplication(t *testing.T, clientInfo *connector.ClientInfo, createApplication201Response, response, err := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.CreateApplication(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID).CreateApplicationRequest(result).Execute() ok, err := common.HandleClientResponse(response, err, "CreateApplication", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} } if createApplication201Response == nil || createApplication201Response.ApplicationOIDC == nil { - t.Fatalf("Failed to create test %s: %v", resourceType, err) + t.Errorf("Failed to create test %s: %v", resourceType, err) + + return testutils_resource.ResourceInfo{} } appId, appIdOk := createApplication201Response.ApplicationOIDC.GetIdOk() if !appIdOk { - t.Fatalf("Failed to create test %s: %v", resourceType, err) + t.Errorf("Failed to create test %s: %v", resourceType, err) + + return testutils_resource.ResourceInfo{} } - return testutils_resource.ResourceCreationInfo{ - testutils_resource.ENUM_ID: *appId, + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *appId, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *appId, + }, } } -func deleteDeviceAuthApplication(t *testing.T, clientInfo *connector.ClientInfo, resourceType, id string) { +func deleteDeviceAuthApplication(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { t.Helper() - response, err := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.DeleteApplication(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, id).Execute() + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteDeviceAuthApplication(): %v", ids) + + return + } + + response, err := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.DeleteApplication(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]).Execute() ok, err := common.HandleClientResponse(response, err, "DeleteApplication", resourceType) if err != nil { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return } if !ok { - t.Fatalf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + t.Errorf("Failed to execute client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return } } diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/environment.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/environment.go new file mode 100644 index 00000000..ced1f17d --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/environment.go @@ -0,0 +1,24 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func Environment(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: nil, + ExportableResource: resources.Environment(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/form.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/form.go new file mode 100644 index 00000000..eaee8e76 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/form.go @@ -0,0 +1,106 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func Form(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createForm, + DeleteFunc: deleteForm, + Dependencies: nil, + ExportableResource: resources.Form(clientInfo), + } +} + +func createForm(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createForm(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.FormManagementApi.CreateForm(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.Form{ + Name: "TestFormName", + Description: utils.Pointer("TestFormDescription"), + Category: management.ENUMFORMCATEGORY_CUSTOM, + Cols: utils.Pointer(int32(4)), + MarkOptional: true, + MarkRequired: false, + TranslationMethod: utils.Pointer(management.ENUMFORMTRANSLATIONMETHOD_TRANSLATE), + FieldTypes: []management.EnumFormFieldType{ + management.ENUMFORMFIELDTYPE_ERROR_DISPLAY, + management.ENUMFORMFIELDTYPE_TEXT, + management.ENUMFORMFIELDTYPE_SUBMIT_BUTTON, + }, + LanguageBundle: &map[string]string{ + "button.text": "Submit", + }, + } + + request = request.Form(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateForm", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteForm(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteForm(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.FormManagementApi.DeleteForm(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteForm", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/forms_recaptcha_v2.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/forms_recaptcha_v2.go new file mode 100644 index 00000000..5f40b4df --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/forms_recaptcha_v2.go @@ -0,0 +1,81 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func FormsRecaptchaV2(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createFormsRecaptchaV2, + DeleteFunc: deleteFormsRecaptchaV2, + Dependencies: nil, + ExportableResource: resources.FormsRecaptchaV2(clientInfo), + } +} + +func createFormsRecaptchaV2(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createFormsRecaptchaV2(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.RecaptchaConfigurationApi.UpdateRecaptchaConfiguration(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.RecaptchaConfiguration{ + SiteKey: "siteKey", + SecretKey: "secretKey", + } + + request = request.RecaptchaConfiguration(clientStruct) + + _, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "UpdateRecaptchaConfiguration", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{}, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{}, + } +} + +func deleteFormsRecaptchaV2(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + request := clientInfo.PingOneApiClient.ManagementAPIClient.RecaptchaConfigurationApi.DeleteRecaptchaConfiguration(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteRecaptchaConfiguration", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/gateway.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/gateway.go new file mode 100644 index 00000000..fe2087a7 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/gateway.go @@ -0,0 +1,97 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func Gateway(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createGateway, + DeleteFunc: deleteGateway, + Dependencies: nil, + ExportableResource: resources.Gateway(clientInfo), + } +} + +func createGateway(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createGateway(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GatewaysApi.CreateGateway(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.CreateGatewayRequest{ + Gateway: &management.Gateway{ + Name: "TestPingFederateConnection", + Description: utils.Pointer("Test Description - created via CREATE PingFed Connection request"), + Type: management.ENUMGATEWAYTYPE_PING_FEDERATE, + Enabled: true, + }, + } + + request = request.CreateGatewayRequest(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateGateway", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Gateway.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Gateway.Id, + testutils_resource.ENUM_NAME: resource.Gateway.Name, + }, + } +} + +func deleteGateway(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteGateway(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GatewaysApi.DeleteGateway(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteGateway", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/gateway_credential.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/gateway_credential.go new file mode 100644 index 00000000..93e97223 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/gateway_credential.go @@ -0,0 +1,89 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func GatewayCredential(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createGatewayCredential, + DeleteFunc: deleteGatewayCredential, + Dependencies: []*testutils_resource.TestableResource{ + Gateway(t, clientInfo), + }, + ExportableResource: resources.GatewayCredential(clientInfo), + } +} + +func createGatewayCredential(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createGatewayCredential(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + gatewayId := strArgs[0] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GatewayCredentialsApi.CreateGatewayCredential(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, gatewayId) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateGatewayCredential", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + gatewayId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Credential, + testutils_resource.ENUM_CREDENTIAL: *resource.Id, + }, + } +} + +func deleteGatewayCredential(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteGatewayCredential(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GatewayCredentialsApi.DeleteGatewayCredential(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteGatewayCredential", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/gateway_role_assignment.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/gateway_role_assignment.go new file mode 100644 index 00000000..e3f6f847 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/gateway_role_assignment.go @@ -0,0 +1,129 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func GatewayRoleAssignment(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createGatewayRoleAssignment, + DeleteFunc: deleteGatewayRoleAssignment, + Dependencies: []*testutils_resource.TestableResource{ + Gateway(t, clientInfo), + }, + ExportableResource: resources.GatewayRoleAssignment(clientInfo), + } +} + +func createGatewayRoleAssignment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createGatewayRoleAssignment(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + gatewayId := strArgs[0] + + iter := clientInfo.PingOneApiClient.ManagementAPIClient.RolesApi.ReadAllRoles(clientInfo.PingOneContext).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedRolesInner](iter, "ReadAllRoles", "GetRoles", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nError: %v", err) + + return testutils_resource.ResourceInfo{} + } + if len(apiObjs) == 0 { + t.Fatal("Failed to execute PingOne client function\n No built-in roles returned from ReadAllRoles()") + } + + var ( + roleId string + roleName string + ) + + for _, role := range apiObjs { + if role.Role != nil { + if role.Role.Name != nil && *role.Role.Name == management.ENUMROLENAME_APPLICATION_OWNER { + roleId = *role.Role.Id + roleName = string(*role.Role.Name) + + break + } + } + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GatewayRoleAssignmentsApi.CreateGatewayRoleAssignment(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, gatewayId) + clientStruct := management.RoleAssignment{ + Role: management.RoleAssignmentRole{ + Id: roleId, + }, + Scope: management.RoleAssignmentScope{ + Id: clientInfo.PingOneExportEnvironmentID, + Type: "ENVIRONMENT", + }, + } + + request = request.RoleAssignment(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateGatewayRoleAssignment", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + gatewayId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: roleName, + }, + } +} + +func deleteGatewayRoleAssignment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteGatewayRoleAssignment(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GatewayRoleAssignmentsApi.DeleteGatewayRoleAssignment(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteGatewayRoleAssignment", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/identity_propagation_plan.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/identity_propagation_plan.go new file mode 100644 index 00000000..9e4ac0c3 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/identity_propagation_plan.go @@ -0,0 +1,91 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func IdentityPropagationPlan(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createIdentityPropagationPlan, + DeleteFunc: deleteIdentityPropagationPlan, + Dependencies: nil, + ExportableResource: resources.IdentityPropagationPlan(clientInfo), + } +} + +func createIdentityPropagationPlan(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createIdentityPropagationPlan(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.IdentityPropagationPlansApi.CreatePlan(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.IdentityPropagationPlan{ + Name: "Test Propagation Plan", + } + + request = request.IdentityPropagationPlan(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreatePlan", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteIdentityPropagationPlan(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteIdentityPropagationPlan(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.IdentityPropagationPlansApi.DeletePlan(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeletePlan", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/key.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/key.go new file mode 100644 index 00000000..56d93ebd --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/key.go @@ -0,0 +1,103 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "math/big" + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func Key(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createKey, + DeleteFunc: deleteKey, + Dependencies: nil, + ExportableResource: resources.Key(clientInfo), + } +} + +func createKey(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createKey(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.CertificateManagementApi.CreateKey(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.Certificate{ + Name: "Doc test cert", + SerialNumber: big.NewInt(1575483893597), + SubjectDN: "CN=Doc test cert, OU=Ping Identity, O=Ping Identity, L=, ST=, C=US", + Algorithm: "RSA", + KeyLength: 2048, + ValidityPeriod: 365, + SignatureAlgorithm: "SHA256withRSA", + UsageType: "SIGNING", + Status: utils.Pointer(management.ENUMCERTIFICATEKEYSTATUS_VALID), + Default: utils.Pointer(false), + } + + request = request.Certificate(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateKey", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + testutils_resource.ENUM_TYPE: string(resource.UsageType), + }, + } +} + +func deleteKey(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteKey(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.CertificateManagementApi.DeleteKey(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteKey", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/key_rotation_policy.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/key_rotation_policy.go new file mode 100644 index 00000000..f11848cd --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/key_rotation_policy.go @@ -0,0 +1,99 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func KeyRotationPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createKeyRotationPolicy, + DeleteFunc: deleteKeyRotationPolicy, + Dependencies: nil, + ExportableResource: resources.KeyRotationPolicy(clientInfo), + } +} + +func createKeyRotationPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createKeyRotationPolicy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.KeyRotationPoliciesApi.CreateKeyRotationPolicy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.KeyRotationPolicy{ + Name: "Test Key Rotation Policy", + Dn: "CN=Test Key Rotation Policy, OU=Ping Identity, O=Ping Identity, L=, ST=, C=US", + Algorithm: "RSA", + KeyLength: 2048, + ValidityPeriod: utils.Pointer(int32(365)), + SignatureAlgorithm: "SHA256withRSA", + UsageType: "SIGNING", + RotationPeriod: utils.Pointer(int32(180)), + } + + request = request.KeyRotationPolicy(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateKeyRotationPolicy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteKeyRotationPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteKeyRotationPolicy(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.KeyRotationPoliciesApi.DeleteKeyRotationPolicy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteKeyRotationPolicy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/language.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/language.go new file mode 100644 index 00000000..e73f8350 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/language.go @@ -0,0 +1,113 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func Language(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createLanguage, + DeleteFunc: deleteLanguage, + Dependencies: nil, + ExportableResource: resources.Language(clientInfo), + } +} + +func createLanguage(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createLanguage(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.LanguagesApi.CreateLanguage(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.Language{ + Locale: "fi", + } + + request = request.Language(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateLanguage", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + // Enable the language + enableRequest := clientInfo.PingOneApiClient.ManagementAPIClient.LanguagesApi.UpdateLanguage(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, *resource.Id) + enabledClientStruct := management.Language{ + Enabled: true, + Locale: "fi", + } + + enableRequest = enableRequest.Language(enabledClientStruct) + + _, response, err = enableRequest.Execute() + ok, err = common.HandleClientResponse(response, err, "UpdateLanguage", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: *resource.Name, + }, + } +} + +func deleteLanguage(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteLanguage(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.LanguagesApi.DeleteLanguage(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteLanguage", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/language_update.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/language_update.go new file mode 100644 index 00000000..fd803501 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/language_update.go @@ -0,0 +1,26 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func LanguageUpdate(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: []*testutils_resource.TestableResource{ + Language(t, clientInfo), + }, + ExportableResource: resources.LanguageUpdate(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_policy.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_policy.go new file mode 100644 index 00000000..77056de7 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_policy.go @@ -0,0 +1,114 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func NotificationPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createNotificationPolicy, + DeleteFunc: deleteNotificationPolicy, + Dependencies: nil, + ExportableResource: resources.NotificationPolicy(clientInfo), + } +} + +func createNotificationPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createNotificationPolicy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.NotificationsPoliciesApi.CreateNotificationsPolicy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.NotificationsPolicy{ + Name: "Notification policy with environment limit and country limitation", + Quotas: []management.NotificationsPolicyQuotasInner{ + { + Type: management.ENUMNOTIFICATIONSPOLICYQUOTAITEMTYPE_ENVIRONMENT, + DeliveryMethods: []management.EnumNotificationsPolicyQuotaDeliveryMethods{ + management.ENUMNOTIFICATIONSPOLICYQUOTADELIVERYMETHODS_SMS, + management.ENUMNOTIFICATIONSPOLICYQUOTADELIVERYMETHODS_VOICE, + }, + Total: utils.Pointer(int32(1000)), + }, + }, + CountryLimit: &management.NotificationsPolicyCountryLimit{ + Type: management.ENUMNOTIFICATIONSPOLICYCOUNTRYLIMITTYPE_ALLOWED, + DeliveryMethods: []management.EnumNotificationsPolicyCountryLimitDeliveryMethod{ + management.ENUMNOTIFICATIONSPOLICYCOUNTRYLIMITDELIVERYMETHOD_SMS, + management.ENUMNOTIFICATIONSPOLICYCOUNTRYLIMITDELIVERYMETHOD_VOICE, + }, + Countries: []string{ + "US", + "CA", + }, + }, + Default: utils.Pointer(false), + } + + request = request.NotificationsPolicy(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateNotificationsPolicy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteNotificationPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteNotificationPolicy(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.NotificationsPoliciesApi.DeleteNotificationsPolicy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteNotificationsPolicy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_settings.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_settings.go new file mode 100644 index 00000000..c2b31187 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_settings.go @@ -0,0 +1,24 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func NotificationSettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: nil, + ExportableResource: resources.NotificationSettings(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_settings_email.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_settings_email.go new file mode 100644 index 00000000..9f9e6031 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_settings_email.go @@ -0,0 +1,24 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func NotificationSettingsEmail(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: nil, + ExportableResource: resources.NotificationSettingsEmail(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_template_content.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_template_content.go new file mode 100644 index 00000000..ae6ba871 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/notification_template_content.go @@ -0,0 +1,101 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func NotificationTemplateContent(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createNotificationTemplateContent, + DeleteFunc: deleteNotificationTemplateContent, + Dependencies: nil, + ExportableResource: resources.NotificationTemplateContent(clientInfo), + } +} + +func createNotificationTemplateContent(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createNotificationTemplateContent(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.NotificationsTemplatesApi.CreateContent(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, management.ENUMTEMPLATENAME_STRONG_AUTHENTICATION) + clientStruct := management.TemplateContent{ + TemplateContentSMS: &management.TemplateContentSMS{ + Locale: "en", + Variant: utils.Pointer("variant_C"), + Content: "${user.username} your one time password is ${otp}.", + DeliveryMethod: "SMS", + Default: utils.Pointer(false), + }, + } + + request = request.TemplateContent(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateContent", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.TemplateContentSMS.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.TemplateContentSMS.Id, + testutils_resource.ENUM_NAME: string(management.ENUMTEMPLATENAME_STRONG_AUTHENTICATION), + testutils_resource.ENUM_LOCALE: resource.TemplateContentSMS.Locale, + testutils_resource.ENUM_TEMPLATE_VARIANT: *resource.TemplateContentSMS.Variant, + testutils_resource.ENUM_TEMPLATE_DELIVERY_METHOD: string(resource.TemplateContentSMS.DeliveryMethod), + }, + } +} + +func deleteNotificationTemplateContent(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteNotificationTemplateContent(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.NotificationsTemplatesApi.DeleteContent(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, management.ENUMTEMPLATENAME_STRONG_AUTHENTICATION, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteContent", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/phone_delivery_settings.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/phone_delivery_settings.go new file mode 100644 index 00000000..8c1d8910 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/phone_delivery_settings.go @@ -0,0 +1,148 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func PhoneDeliverySettings(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createPhoneDeliverySettings, + DeleteFunc: deletePhoneDeliverySettings, + Dependencies: nil, + ExportableResource: resources.PhoneDeliverySettings(clientInfo), + } +} + +func createPhoneDeliverySettings(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createPhoneDeliverySettings(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.PhoneDeliverySettingsApi.CreatePhoneDeliverySettings(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.NotificationsSettingsPhoneDeliverySettings{ + NotificationsSettingsPhoneDeliverySettingsCustom: &management.NotificationsSettingsPhoneDeliverySettingsCustom{ + Provider: management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSPROVIDER_PROVIDER, + Name: "CustomProviderName1", + Authentication: management.NotificationsSettingsPhoneDeliverySettingsCustomAllOfAuthentication{ + Method: management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMAUTHMETHOD_BASIC, + Username: utils.Pointer("testUsername"), + Password: utils.Pointer("testPassword1"), + }, + Requests: []management.NotificationsSettingsPhoneDeliverySettingsCustomRequest{ + { + DeliveryMethod: management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMDELIVERYMETHOD_SMS, + Url: "https://example.com/message", + Method: management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMREQUESTMETHOD_POST, + Body: utils.Pointer("messageType=ARN&message=${message}&phoneNumber=${to}&sender=${from}"), + Headers: &map[string]string{ + "content-type": "application/json", + }, + PhoneNumberFormat: management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMNUMBERFORMAT_FULL, + }, + { + DeliveryMethod: management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMDELIVERYMETHOD_VOICE, + Url: "https://example.com/voice", + Method: management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMREQUESTMETHOD_POST, + Body: utils.Pointer("messageType=ARN&message=${message}&phoneNumber=${to}&sender=${from}"), + Headers: &map[string]string{ + "content-type": "application/json", + }, + PhoneNumberFormat: management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMNUMBERFORMAT_FULL, + }, + }, + Numbers: []management.NotificationsSettingsPhoneDeliverySettingsCustomNumbers{ + { + Type: management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMNUMBERSTYPE_PHONE_NUMBER, + Number: "12164081234", + Selected: utils.Pointer(false), + Available: utils.Pointer(false), + Capabilities: []management.EnumNotificationsSettingsPhoneDeliverySettingsCustomNumbersCapability{ + management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMNUMBERSCAPABILITY_SMS, + management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMNUMBERSCAPABILITY_VOICE, + }, + }, + { + Type: management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMNUMBERSTYPE_TOLL_FREE, + Number: "18661234567", + Selected: utils.Pointer(false), + Available: utils.Pointer(false), + Capabilities: []management.EnumNotificationsSettingsPhoneDeliverySettingsCustomNumbersCapability{ + management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMNUMBERSCAPABILITY_SMS, + management.ENUMNOTIFICATIONSSETTINGSPHONEDELIVERYSETTINGSCUSTOMNUMBERSCAPABILITY_VOICE, + }, + SupportedCountries: []string{ + "US", + "CA", + }, + }, + }, + }, + } + + request = request.NotificationsSettingsPhoneDeliverySettings(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreatePhoneDeliverySettings", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.NotificationsSettingsPhoneDeliverySettingsCustom.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.NotificationsSettingsPhoneDeliverySettingsCustom.Id, + testutils_resource.ENUM_NAME: resource.NotificationsSettingsPhoneDeliverySettingsCustom.Name, + }, + } +} + +func deletePhoneDeliverySettings(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deletePhoneDeliverySettings(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.PhoneDeliverySettingsApi.DeletePhoneDeliverySettings(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeletePhoneDeliverySettings", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/system_application.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/system_application.go new file mode 100644 index 00000000..95c7d99c --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/system_application.go @@ -0,0 +1,24 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func SystemApplication(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: nil, + ExportableResource: resources.SystemApplication(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/trusted_email_address.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/trusted_email_address.go new file mode 100644 index 00000000..397a4e04 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/trusted_email_address.go @@ -0,0 +1,95 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func TrustedEmailAddress(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createTrustedEmailAddress, + DeleteFunc: deleteTrustedEmailAddress, + Dependencies: []*testutils_resource.TestableResource{ + TrustedEmailDomain(t, clientInfo), + }, + ExportableResource: resources.TrustedEmailAddress(clientInfo), + } +} + +func createTrustedEmailAddress(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createTrustedEmailAddress(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + trustedEmailDomainId := strArgs[0] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.TrustedEmailAddressesApi.CreateTrustedEmailAddress(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, trustedEmailDomainId) + clientStruct := management.EmailDomainTrustedEmail{ + EmailAddress: "example@example.com", + } + + request = request.EmailDomainTrustedEmail(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateTrustedEmailAddress", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + trustedEmailDomainId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.EmailAddress, + }, + } +} + +func deleteTrustedEmailAddress(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteTrustedEmailAddress(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.TrustedEmailAddressesApi.DeleteTrustedEmailAddress(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteTrustedEmailAddress", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/trusted_email_domain.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/trusted_email_domain.go new file mode 100644 index 00000000..dfad4ab7 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/trusted_email_domain.go @@ -0,0 +1,91 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func TrustedEmailDomain(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createTrustedEmailDomain, + DeleteFunc: deleteTrustedEmailDomain, + Dependencies: nil, + ExportableResource: resources.TrustedEmailDomain(clientInfo), + } +} + +func createTrustedEmailDomain(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createTrustedEmailDomain(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.TrustedEmailDomainsApi.CreateTrustedEmailDomain(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.EmailDomain{ + DomainName: "example.com", + } + + request = request.EmailDomain(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateTrustedEmailDomain", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.DomainName, + }, + } +} + +func deleteTrustedEmailDomain(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteTrustedEmailDomain(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.TrustedEmailDomainsApi.DeleteTrustedEmailDomain(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteTrustedEmailDomain", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_platform_testable_resources/webhook.go b/internal/testing/testutils_resource/pingone_platform_testable_resources/webhook.go new file mode 100644 index 00000000..05af511c --- /dev/null +++ b/internal/testing/testutils_resource/pingone_platform_testable_resources/webhook.go @@ -0,0 +1,106 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_platform_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/platform/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func Webhook(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createWebhook, + DeleteFunc: deleteWebhook, + Dependencies: nil, + ExportableResource: resources.Webhook(clientInfo), + } +} + +func createWebhook(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createWebhook(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.SubscriptionsWebhooksApi.CreateSubscription(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.Subscription{ + Name: "SubscriptionName1", + FilterOptions: management.SubscriptionFilterOptions{ + IncludedActionTypes: []string{ + "USER.CREATED", + "USER.UPDATED", + }, + }, + HttpEndpoint: management.SubscriptionHttpEndpoint{ + Url: "https://subscriptionendpoint.com", + Headers: &map[string]string{ + "some-header": "some-value", + }, + }, + Format: management.ENUMSUBSCRIPTIONFORMAT_ACTIVITY, + VerifyTlsCertificates: false, + Enabled: true, + } + + request = request.Subscription(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateSubscription", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteWebhook(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteWebhook(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.SubscriptionsWebhooksApi.DeleteSubscription(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteSubscription", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_protect_testable_resources/risk_policy.go b/internal/testing/testutils_resource/pingone_protect_testable_resources/risk_policy.go new file mode 100644 index 00000000..3d58b3c7 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_protect_testable_resources/risk_policy.go @@ -0,0 +1,122 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_protect_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/risk" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/protect/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func RiskPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createRiskPolicy, + DeleteFunc: deleteRiskPolicy, + Dependencies: nil, + ExportableResource: resources.RiskPolicy(clientInfo), + } +} + +func createRiskPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createRiskPolicy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.RiskAPIClient.RiskPoliciesApi.CreateRiskPolicySet(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := risk.RiskPolicySet{ + Name: "Score-based policy", + Default: utils.Pointer(false), + DefaultResult: &risk.RiskPolicySetDefaultResult{ + Level: risk.ENUMRISKPOLICYRESULTLEVEL_LOW, + }, + RiskPolicies: []risk.RiskPolicy{ + { + Name: "ANONYMOUS_NETWORK_DETECTION", + Result: risk.RiskPolicyResult{ + Level: risk.ENUMRISKLEVEL_HIGH, + }, + Condition: risk.RiskPolicyCondition{ + Value: utils.Pointer("${details.anonymousNetworkDetected}"), + Equals: &risk.RiskPolicyConditionEquals{ + Bool: utils.Pointer(true), + }, + }, + }, + { + Name: "GEOVELOCITY_ANOMALY", + Result: risk.RiskPolicyResult{ + Level: risk.ENUMRISKLEVEL_MEDIUM, + }, + Condition: risk.RiskPolicyCondition{ + Value: utils.Pointer("${details.impossibleTravel}"), + Equals: &risk.RiskPolicyConditionEquals{ + Bool: utils.Pointer(true), + }, + }, + }, + }, + } + + request = request.RiskPolicySet(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateRiskPolicySet", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteRiskPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteRiskPolicy(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.RiskAPIClient.RiskPoliciesApi.DeleteRiskPolicySet(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteRiskPolicySet", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_protect_testable_resources/risk_predictor.go b/internal/testing/testutils_resource/pingone_protect_testable_resources/risk_predictor.go new file mode 100644 index 00000000..699082f3 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_protect_testable_resources/risk_predictor.go @@ -0,0 +1,122 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_protect_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/risk" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/protect/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func RiskPredictor(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createRiskPredictor, + DeleteFunc: deleteRiskPredictor, + Dependencies: nil, + ExportableResource: resources.RiskPredictor(clientInfo), + } +} + +func createRiskPredictor(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createRiskPredictor(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.RiskAPIClient.RiskAdvancedPredictorsApi.CreateRiskPredictor(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := risk.RiskPredictor{ + RiskPredictorCustom: &risk.RiskPredictorCustom{ + Name: "Device country - custom", + CompactName: "deviceCountryCustom", + Map: risk.RiskPredictorCustomAllOfMap{ + High: &risk.RiskPredictorCustomItem{ + RiskPredictorCustomItemList: &risk.RiskPredictorCustomItemList{ + List: []string{ + "Iran", + "Syria", + }, + Contains: "${details.country}", + }, + }, + Medium: &risk.RiskPredictorCustomItem{ + RiskPredictorCustomItemList: &risk.RiskPredictorCustomItemList{ + List: []string{ + "Ethiopia", + "Russia", + }, + Contains: "${details.country}", + }, + }, + }, + Type: risk.ENUMPREDICTORTYPE_MAP, + Default: &risk.RiskPredictorCommonDefault{ + Result: &risk.RiskPredictorCommonDefaultResult{ + Level: utils.Pointer(risk.ENUMRISKLEVEL_MEDIUM), + }, + }, + }, + } + + request = request.RiskPredictor(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateRiskPredictor", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.RiskPredictorCustom.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.RiskPredictorCustom.Id, + testutils_resource.ENUM_NAME: resource.RiskPredictorCustom.Name, + testutils_resource.ENUM_TYPE: string(resource.RiskPredictorCustom.Type), + }, + } +} + +func deleteRiskPredictor(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteRiskPredictor(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.RiskAPIClient.RiskAdvancedPredictorsApi.DeleteRiskAdvancedPredictor(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteRiskAdvancedPredictor", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/application_attribute_mapping.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_attribute_mapping.go new file mode 100644 index 00000000..0637dd18 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_attribute_mapping.go @@ -0,0 +1,97 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func ApplicationAttributeMapping(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createApplicationAttributeMapping, + DeleteFunc: deleteApplicationAttributeMapping, + Dependencies: []*testutils_resource.TestableResource{ + ApplicationDeviceAuthorization(t, clientInfo), + }, + ExportableResource: resources.ApplicationAttributeMapping(clientInfo), + } +} + +func createApplicationAttributeMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createApplicationAttributeMapping(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + applicationId := strArgs[0] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationAttributeMappingApi.CreateApplicationAttributeMapping(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, applicationId) + clientStruct := management.ApplicationAttributeMapping{ + Name: "email", + Value: "${user.email}", + Required: false, + } + + request = request.ApplicationAttributeMapping(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateApplicationAttributeMapping", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + applicationId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteApplicationAttributeMapping(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteApplicationAttributeMapping(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationAttributeMappingApi.DeleteApplicationAttributeMapping(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteApplicationAttributeMapping", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/application_device_authorization.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_device_authorization.go new file mode 100644 index 00000000..3e631585 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_device_authorization.go @@ -0,0 +1,110 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/hashicorp/go-uuid" + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func ApplicationDeviceAuthorization(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createApplicationDeviceAuthorization, + DeleteFunc: deleteApplicationDeviceAuthorization, + Dependencies: nil, + ExportableResource: resources.Application(clientInfo), + } +} + +func createApplicationDeviceAuthorization(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createApplicationDeviceAuthorization(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + // Give unique name to application to avoid collisions in dependency creations + applicationName, err := uuid.GenerateUUID() + if err != nil { + t.Errorf("Failed to generate UUID for application name: %v", err) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.CreateApplication(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.CreateApplicationRequest{ + ApplicationOIDC: &management.ApplicationOIDC{ + Enabled: true, + GrantTypes: []management.EnumApplicationOIDCGrantType{ + management.ENUMAPPLICATIONOIDCGRANTTYPE_DEVICE_CODE, + management.ENUMAPPLICATIONOIDCGRANTTYPE_REFRESH_TOKEN, + }, + Name: applicationName, + Protocol: management.ENUMAPPLICATIONPROTOCOL_OPENID_CONNECT, + TokenEndpointAuthMethod: management.ENUMAPPLICATIONOIDCTOKENAUTHMETHOD_NONE, + Type: management.ENUMAPPLICATIONTYPE_CUSTOM_APP, + }, + } + + request = request.CreateApplicationRequest(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateApplication", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.ApplicationOIDC.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.ApplicationOIDC.Id, + testutils_resource.ENUM_NAME: resource.ApplicationOIDC.Name, + }, + } +} + +func deleteApplicationDeviceAuthorization(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteApplicationDeviceAuthorization(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.DeleteApplication(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteApplication", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/application_flow_policy_assignment.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_flow_policy_assignment.go new file mode 100644 index 00000000..de25132c --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_flow_policy_assignment.go @@ -0,0 +1,127 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func ApplicationFlowPolicyAssignment(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createApplicationFlowPolicyAssignment, + DeleteFunc: deleteApplicationFlowPolicyAssignment, + Dependencies: []*testutils_resource.TestableResource{ + ApplicationDeviceAuthorization(t, clientInfo), + }, + ExportableResource: resources.ApplicationFlowPolicyAssignment(clientInfo), + } +} + +func createApplicationFlowPolicyAssignment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createApplicationFlowPolicyAssignment(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + applicationId := strArgs[0] + + iter := clientInfo.PingOneApiClient.ManagementAPIClient.FlowPoliciesApi.ReadAllFlowPolicies(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID).Execute() + flowPolicies, err := pingone.GetManagementAPIObjectsFromIterator[management.FlowPolicy](iter, "ReadAllFlowPolicies", "GetFlowPolicies", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nError: %v", err) + + return testutils_resource.ResourceInfo{} + } + + if len(flowPolicies) == 0 { + t.Errorf("No flow policies found") + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationFlowPolicyAssignmentsApi.CreateFlowPolicyAssignment(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, applicationId) + clientStruct := management.FlowPolicyAssignment{ + Priority: 1, + FlowPolicy: management.FlowPolicyAssignmentFlowPolicy{ + Id: *flowPolicies[0].Id, + }, + } + + request = request.FlowPolicyAssignment(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateFlowPolicyAssignment", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + flowPolicy, response, err := clientInfo.PingOneApiClient.ManagementAPIClient.FlowPoliciesApi.ReadOneFlowPolicy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, resource.FlowPolicy.Id).Execute() + + ok, err = common.HandleClientResponse(response, err, "ReadOneFlowPolicy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + applicationId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: *flowPolicy.Name, + }, + } +} + +func deleteApplicationFlowPolicyAssignment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteApplicationFlowPolicyAssignment(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationFlowPolicyAssignmentsApi.DeleteFlowPolicyAssignment(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteFlowPolicyAssignment", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/application_native.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_native.go new file mode 100644 index 00000000..769317fa --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_native.go @@ -0,0 +1,128 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/hashicorp/go-uuid" + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func ApplicationNative(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createApplicationNative, + DeleteFunc: deleteApplicationNative, + Dependencies: nil, + ExportableResource: resources.Application(clientInfo), + } +} + +func createApplicationNative(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createApplicationNative(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + // Give unique name to application to avoid collisions in dependency creations + applicationName, err := uuid.GenerateUUID() + if err != nil { + t.Errorf("Failed to generate UUID for application name: %v", err) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.CreateApplication(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.CreateApplicationRequest{ + ApplicationOIDC: &management.ApplicationOIDC{ + Enabled: true, + Name: applicationName, + Description: utils.Pointer("Test Native OIDC Application"), + Type: management.ENUMAPPLICATIONTYPE_NATIVE_APP, + Protocol: management.ENUMAPPLICATIONPROTOCOL_OPENID_CONNECT, + HomePageUrl: utils.Pointer("https://example.com/homePage"), + LoginPageUrl: utils.Pointer("https://example.com/loginPage"), + GrantTypes: []management.EnumApplicationOIDCGrantType{ + management.ENUMAPPLICATIONOIDCGRANTTYPE_AUTHORIZATION_CODE, + management.ENUMAPPLICATIONOIDCGRANTTYPE_IMPLICIT, + }, + PostLogoutRedirectUris: []string{ + "https://example.com/logout", + }, + RedirectUris: []string{ + "https://example.com", + }, + ResponseTypes: []management.EnumApplicationOIDCResponseType{ + management.ENUMAPPLICATIONOIDCRESPONSETYPE_CODE, + management.ENUMAPPLICATIONOIDCRESPONSETYPE_TOKEN, + management.ENUMAPPLICATIONOIDCRESPONSETYPE_ID_TOKEN, + }, + TokenEndpointAuthMethod: management.ENUMAPPLICATIONOIDCTOKENAUTHMETHOD_NONE, + PkceEnforcement: utils.Pointer(management.ENUMAPPLICATIONOIDCPKCEOPTION_REQUIRED), + RefreshTokenDuration: utils.Pointer(int32(86400)), + RefreshTokenRollingDuration: utils.Pointer(int32(86400)), + }, + } + + request = request.CreateApplicationRequest(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateApplication", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.ApplicationOIDC.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.ApplicationOIDC.Id, + testutils_resource.ENUM_NAME: resource.ApplicationOIDC.Name, + }, + } +} + +func deleteApplicationNative(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteApplicationNative(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.DeleteApplication(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteApplication", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/application_resource_grant.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_resource_grant.go new file mode 100644 index 00000000..21fdcde1 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_resource_grant.go @@ -0,0 +1,136 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func ApplicationResourceGrant(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createApplicationResourceGrant, + DeleteFunc: deleteApplicationResourceGrant, + Dependencies: []*testutils_resource.TestableResource{ + ApplicationDeviceAuthorization(t, clientInfo), + Resource(t, clientInfo), + }, + ExportableResource: resources.ApplicationResourceGrant(clientInfo), + } +} + +func createApplicationResourceGrant(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 2 { + t.Errorf("Unexpected number of arguments provided to createApplicationResourceGrant(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + applicationId := strArgs[0] + resourceId := strArgs[1] + + resReq := clientInfo.PingOneApiClient.ManagementAPIClient.ResourceScopesApi.CreateResourceScope(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, resourceId) + + resClientStruct := management.ResourceScope{ + Name: "testCustomScope", + } + resReq = resReq.ResourceScope(resClientStruct) + scope, response, err := resReq.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateResourceScope", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationResourceGrantsApi.CreateApplicationGrant(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, applicationId) + clientStruct := management.ApplicationResourceGrant{ + Resource: management.ApplicationResourceGrantResource{ + Id: resourceId, + }, + Scopes: []management.ApplicationResourceGrantScopesInner{ + { + Id: *scope.Id, + }, + }, + } + + request = request.ApplicationResourceGrant(clientStruct) + + resource, response, err := request.Execute() + ok, err = common.HandleClientResponse(response, err, "CreateApplicationGrant", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + resObj, resResponse, resErr := clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadOneResource(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, resourceId).Execute() + ok, err = common.HandleClientResponse(resResponse, resErr, "ReadOneResource", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", resResponse.Status, resResponse.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", resResponse.Status, resResponse.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + applicationId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resObj.Name, + }, + } +} + +func deleteApplicationResourceGrant(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteApplicationResourceGrant(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationResourceGrantsApi.DeleteApplicationGrant(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteApplicationGrant", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/application_role_assignment.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_role_assignment.go new file mode 100644 index 00000000..3863e6e4 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_role_assignment.go @@ -0,0 +1,129 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func ApplicationRoleAssignment(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createApplicationRoleAssignment, + DeleteFunc: deleteApplicationRoleAssignment, + Dependencies: []*testutils_resource.TestableResource{ + ApplicationWorker(t, clientInfo), + }, + ExportableResource: resources.ApplicationRoleAssignment(clientInfo), + } +} + +func createApplicationRoleAssignment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createApplicationRoleAssignment(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + applicationId := strArgs[0] + + iter := clientInfo.PingOneApiClient.ManagementAPIClient.RolesApi.ReadAllRoles(clientInfo.PingOneContext).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedRolesInner](iter, "ReadAllRoles", "GetRoles", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nError: %v", err) + + return testutils_resource.ResourceInfo{} + } + if len(apiObjs) == 0 { + t.Fatal("Failed to execute PingOne client function\n No built-in roles returned from ReadAllRoles()") + } + + var ( + roleId string + roleName string + ) + + for _, role := range apiObjs { + if role.Role != nil { + if role.Role.Name != nil && *role.Role.Name == management.ENUMROLENAME_APPLICATION_OWNER { + roleId = *role.Role.Id + roleName = string(*role.Role.Name) + + break + } + } + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationRoleAssignmentsApi.CreateApplicationRoleAssignment(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, applicationId) + clientStruct := management.RoleAssignment{ + Role: management.RoleAssignmentRole{ + Id: roleId, + }, + Scope: management.RoleAssignmentScope{ + Id: clientInfo.PingOneExportEnvironmentID, + Type: management.ENUMROLEASSIGNMENTSCOPETYPE_ENVIRONMENT, + }, + } + + request = request.RoleAssignment(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateApplicationRoleAssignment", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + applicationId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: roleName, + }, + } +} + +func deleteApplicationRoleAssignment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteApplicationRoleAssignment(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationRoleAssignmentsApi.DeleteApplicationRoleAssignment(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteApplicationRoleAssignment", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/application_secret.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_secret.go new file mode 100644 index 00000000..865b9f86 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_secret.go @@ -0,0 +1,26 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func ApplicationSecret(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: []*testutils_resource.TestableResource{ + ApplicationDeviceAuthorization(t, clientInfo), + }, + ExportableResource: resources.ApplicationSecret(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/application_sign_on_policy_assignment.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_sign_on_policy_assignment.go new file mode 100644 index 00000000..0217c6e9 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_sign_on_policy_assignment.go @@ -0,0 +1,113 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func ApplicationSignOnPolicyAssignment(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createApplicationSignOnPolicyAssignment, + DeleteFunc: deleteApplicationSignOnPolicyAssignment, + Dependencies: []*testutils_resource.TestableResource{ + ApplicationDeviceAuthorization(t, clientInfo), + SignOnPolicy(t, clientInfo), + }, + ExportableResource: resources.ApplicationSignOnPolicyAssignment(clientInfo), + } +} + +func createApplicationSignOnPolicyAssignment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 2 { + t.Errorf("Unexpected number of arguments provided to createApplicationSignOnPolicyAssignment(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + applicationId := strArgs[0] + policyId := strArgs[1] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationSignOnPolicyAssignmentsApi.CreateSignOnPolicyAssignment(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, applicationId) + clientStruct := management.SignOnPolicyAssignment{ + Priority: 1, + SignOnPolicy: management.SignOnPolicyActionCommonSignOnPolicy{ + Id: policyId, + }, + } + + request = request.SignOnPolicyAssignment(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateSignOnPolicyAssignment", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + signOnPolicy, response, err := clientInfo.PingOneApiClient.ManagementAPIClient.SignOnPoliciesApi.ReadOneSignOnPolicy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, resource.SignOnPolicy.Id).Execute() + ok, err = common.HandleClientResponse(response, err, "ReadOneSignOnPolicy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + applicationId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: signOnPolicy.Name, + }, + } +} + +func deleteApplicationSignOnPolicyAssignment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteApplicationSignOnPolicyAssignment(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationSignOnPolicyAssignmentsApi.DeleteSignOnPolicyAssignment(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteSignOnPolicyAssignment", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/application_worker.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_worker.go new file mode 100644 index 00000000..a3fc58fc --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/application_worker.go @@ -0,0 +1,112 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/hashicorp/go-uuid" + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func ApplicationWorker(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createApplicationWorker, + DeleteFunc: deleteApplicationWorker, + Dependencies: nil, + ExportableResource: resources.Application(clientInfo), + } +} + +func createApplicationWorker(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createApplicationWorker(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + // Give unique name to application to avoid collisions in dependency creations + applicationName, err := uuid.GenerateUUID() + if err != nil { + t.Errorf("Failed to generate UUID for application name: %v", err) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.CreateApplication(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.CreateApplicationRequest{ + ApplicationOIDC: &management.ApplicationOIDC{ + Enabled: true, + Name: applicationName, + Description: utils.Pointer("Test Worker Application"), + Type: management.ENUMAPPLICATIONTYPE_WORKER, + Protocol: management.ENUMAPPLICATIONPROTOCOL_OPENID_CONNECT, + GrantTypes: []management.EnumApplicationOIDCGrantType{ + management.ENUMAPPLICATIONOIDCGRANTTYPE_CLIENT_CREDENTIALS, + }, + AssignActorRoles: utils.Pointer(false), + TokenEndpointAuthMethod: management.ENUMAPPLICATIONOIDCTOKENAUTHMETHOD_CLIENT_SECRET_BASIC, + }, + } + + request = request.CreateApplicationRequest(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateApplication", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.ApplicationOIDC.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.ApplicationOIDC.Id, + testutils_resource.ENUM_NAME: resource.ApplicationOIDC.Name, + }, + } +} + +func deleteApplicationWorker(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteApplicationWorker(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ApplicationsApi.DeleteApplication(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteApplication", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/group.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/group.go new file mode 100644 index 00000000..c10d19aa --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/group.go @@ -0,0 +1,106 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/hashicorp/go-uuid" + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func Group(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createGroup, + DeleteFunc: deleteGroup, + Dependencies: nil, + ExportableResource: resources.Group(clientInfo), + } +} + +func createGroup(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createGroup(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + // Make sure the group name is unique + groupName, err := uuid.GenerateUUID() + if err != nil { + t.Errorf("Failed to generate UUID for group name: %v", err) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GroupsApi.CreateGroup(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.Group{ + Name: groupName, + Description: utils.Pointer("This is a test group"), + CustomData: map[string]interface{}{ + "groupOwner": "Tom Jones", + "securityGroup": true, + }, + } + + request = request.Group(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateGroup", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteGroup(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteGroup(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GroupsApi.DeleteGroup(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteGroup", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/group_nesting.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/group_nesting.go new file mode 100644 index 00000000..88c058dc --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/group_nesting.go @@ -0,0 +1,110 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func GroupNesting(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createGroupNesting, + DeleteFunc: deleteGroupNesting, + Dependencies: []*testutils_resource.TestableResource{ + Group(t, clientInfo), + Group(t, clientInfo), + }, + ExportableResource: resources.GroupNesting(clientInfo), + } +} + +func createGroupNesting(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 2 { + t.Errorf("Unexpected number of arguments provided to createGroupNesting(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + groupId := strArgs[0] + nestedGroupId := strArgs[1] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GroupsApi.CreateGroupNesting(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, groupId) + clientStruct := management.GroupNesting{ + Id: nestedGroupId, + } + + request = request.GroupNesting(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateGroupNesting", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + group, response, err := clientInfo.PingOneApiClient.ManagementAPIClient.GroupsApi.ReadOneGroup(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, groupId).Execute() + ok, err = common.HandleClientResponse(response, err, "ReadOneGroup", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + groupId, + nestedGroupId, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: resource.Id, + testutils_resource.ENUM_NAME: group.Name, + }, + } +} + +func deleteGroupNesting(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteGroupNesting(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GroupsApi.DeleteGroupNesting(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteGroupNesting", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/group_role_assignment.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/group_role_assignment.go new file mode 100644 index 00000000..09519302 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/group_role_assignment.go @@ -0,0 +1,129 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func GroupRoleAssignment(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createGroupRoleAssignment, + DeleteFunc: deleteGroupRoleAssignment, + Dependencies: []*testutils_resource.TestableResource{ + Group(t, clientInfo), + }, + ExportableResource: resources.GroupRoleAssignment(clientInfo), + } +} + +func createGroupRoleAssignment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createGroupRoleAssignment(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + groupId := strArgs[0] + + iter := clientInfo.PingOneApiClient.ManagementAPIClient.RolesApi.ReadAllRoles(clientInfo.PingOneContext).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedRolesInner](iter, "ReadAllRoles", "GetRoles", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nError: %v", err) + + return testutils_resource.ResourceInfo{} + } + if len(apiObjs) == 0 { + t.Fatal("Failed to execute PingOne client function\n No built-in roles returned from ReadAllRoles()") + } + + var ( + roleId string + roleName string + ) + + for _, role := range apiObjs { + if role.Role != nil { + if role.Role.Name != nil && *role.Role.Name == management.ENUMROLENAME_APPLICATION_OWNER { + roleId = *role.Role.Id + roleName = string(*role.Role.Name) + + break + } + } + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GroupRoleAssignmentsApi.CreateGroupRoleAssignment(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, groupId) + clientStruct := management.RoleAssignment{ + Role: management.RoleAssignmentRole{ + Id: roleId, + }, + Scope: management.RoleAssignmentScope{ + Id: clientInfo.PingOneExportEnvironmentID, + Type: management.ENUMROLEASSIGNMENTSCOPETYPE_ENVIRONMENT, + }, + } + + request = request.RoleAssignment(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateGroupRoleAssignment", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + groupId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: roleName, + }, + } +} + +func deleteGroupRoleAssignment(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteGroupRoleAssignment(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.GroupRoleAssignmentsApi.DeleteGroupRoleAssignment(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteGroupRoleAssignment", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/identity_provider.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/identity_provider.go new file mode 100644 index 00000000..17f638a5 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/identity_provider.go @@ -0,0 +1,107 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func IdentityProvider(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createIdentityProvider, + DeleteFunc: deleteIdentityProvider, + Dependencies: nil, + ExportableResource: resources.IdentityProvider(clientInfo), + } +} + +func createIdentityProvider(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createIdentityProvider(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.IdentityProvidersApi.CreateIdentityProvider(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.IdentityProvider{ + IdentityProviderOIDC: &management.IdentityProviderOIDC{ + AuthorizationEndpoint: "https://example.com/auth", + ClientId: "clientId", + ClientSecret: "clientSecret", + Description: utils.Pointer("Custom OpenID Connect Provider"), + DiscoveryEndpoint: utils.Pointer("https://example.com/.well-known/openid-configuration"), + Enabled: true, + Issuer: "https://example.com", + JwksEndpoint: "https://example.com/jwks", + Name: "OpenIDConnectIdP", + Scopes: []string{"openid", "email"}, + TokenEndpoint: "https://example.com/token", + TokenEndpointAuthMethod: management.ENUMIDENTITYPROVIDEROIDCTOKENAUTHMETHOD_CLIENT_SECRET_BASIC, + Type: management.ENUMIDENTITYPROVIDEREXT_OPENID_CONNECT, + UserInfoEndpoint: utils.Pointer("https://example.com/userinfo"), + }, + } + + request = request.IdentityProvider(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateIdentityProvider", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.IdentityProviderOIDC.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.IdentityProviderOIDC.Id, + testutils_resource.ENUM_NAME: resource.IdentityProviderOIDC.Name, + }, + } +} + +func deleteIdentityProvider(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteIdentityProvider(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.IdentityProvidersApi.DeleteIdentityProvider(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteIdentityProvider", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/identity_provider_attribute.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/identity_provider_attribute.go new file mode 100644 index 00000000..ac3eeecb --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/identity_provider_attribute.go @@ -0,0 +1,98 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func IdentityProviderAttribute(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createIdentityProviderAttribute, + DeleteFunc: deleteIdentityProviderAttribute, + Dependencies: []*testutils_resource.TestableResource{ + IdentityProvider(t, clientInfo), + }, + ExportableResource: resources.IdentityProviderAttribute(clientInfo), + } +} + +func createIdentityProviderAttribute(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createIdentityProviderAttribute(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + providerId := strArgs[0] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.IdentityProviderAttributesApi.CreateIdentityProviderAttribute(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, providerId) + clientStruct := management.IdentityProviderAttribute{ + Name: "email", + Update: management.ENUMIDENTITYPROVIDERATTRIBUTEMAPPINGUPDATE_EMPTY_ONLY, + Value: "${providerAttributes.user.emailAddress}", + } + + request = request.IdentityProviderAttribute(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateIdentityProviderAttribute", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + providerId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteIdentityProviderAttribute(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteIdentityProviderAttribute(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.IdentityProviderAttributesApi.DeleteIdentityProviderAttribute(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteIdentityProviderAttribute", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/password_policy.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/password_policy.go new file mode 100644 index 00000000..451609ec --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/password_policy.go @@ -0,0 +1,108 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func PasswordPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createPasswordPolicy, + DeleteFunc: deletePasswordPolicy, + Dependencies: nil, + ExportableResource: resources.PasswordPolicy(clientInfo), + } +} + +func createPasswordPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createPasswordPolicy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.PasswordPoliciesApi.CreatePasswordPolicy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.PasswordPolicy{ + Name: "PassphraseCustom1", + Description: utils.Pointer("A policy that encourages the use of passphrases"), + ExcludesProfileData: true, + NotSimilarToCurrent: true, + ExcludesCommonlyUsed: true, + MinComplexity: utils.Pointer(int32(7)), + MaxAgeDays: utils.Pointer(int32(182)), + MinAgeDays: utils.Pointer(int32(1)), + History: &management.PasswordPolicyHistory{ + Count: utils.Pointer(int32(8)), + RetentionDays: utils.Pointer(int32(365)), + }, + Lockout: &management.PasswordPolicyLockout{ + FailureCount: utils.Pointer(int32(3)), + DurationSeconds: utils.Pointer(int32(900)), + }, + Default: utils.Pointer(false), + } + + request = request.PasswordPolicy(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreatePasswordPolicy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deletePasswordPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deletePasswordPolicy(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.PasswordPoliciesApi.DeletePasswordPolicy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeletePasswordPolicy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/population.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/population.go new file mode 100644 index 00000000..487a3ee2 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/population.go @@ -0,0 +1,131 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func Population(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createPopulation, + DeleteFunc: deletePopulation, + Dependencies: []*testutils_resource.TestableResource{ + PasswordPolicy(t, clientInfo), + }, + ExportableResource: resources.Population(clientInfo), + } +} + +func createPopulation(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createPopulation(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + passwordPolicyId := strArgs[0] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.PopulationsApi.CreatePopulation(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.Population{ + Name: "Test Population", + Description: utils.Pointer("This is a test population"), + Default: utils.Pointer(true), + PasswordPolicy: &management.PopulationPasswordPolicy{ + Id: passwordPolicyId, + }, + } + + request = request.Population(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreatePopulation", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deletePopulation(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deletePopulation(): %v", ids) + + return + } + + getRequest := clientInfo.PingOneApiClient.ManagementAPIClient.PopulationsApi.ReadOnePopulation(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + populationClientStruct, response, err := getRequest.Execute() + ok, err := common.HandleClientResponse(response, err, "ReadOnePopulation", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } + + updateRequest := clientInfo.PingOneApiClient.ManagementAPIClient.PopulationsApi.UpdatePopulation(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + populationClientStruct.Default = utils.Pointer(false) + + updateRequest = updateRequest.Population(*populationClientStruct) + _, response, err = updateRequest.Execute() + ok, err = common.HandleClientResponse(response, err, "UpdatePopulation", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } + + deleteRequest := clientInfo.PingOneApiClient.ManagementAPIClient.PopulationsApi.DeletePopulation(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err = deleteRequest.Execute() + ok, err = common.HandleClientResponse(response, err, "DeletePopulation", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/population_default.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/population_default.go new file mode 100644 index 00000000..bdf283ea --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/population_default.go @@ -0,0 +1,26 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func PopulationDefault(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: []*testutils_resource.TestableResource{ + Population(t, clientInfo), + }, + ExportableResource: resources.PopulationDefault(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/population_default_identity_provider.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/population_default_identity_provider.go new file mode 100644 index 00000000..65d94d20 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/population_default_identity_provider.go @@ -0,0 +1,26 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func PopulationDefaultIdentityProvider(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: []*testutils_resource.TestableResource{ + Population(t, clientInfo), + }, + ExportableResource: resources.PopulationDefaultIdentityProvider(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/resource.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource.go new file mode 100644 index 00000000..51cf883b --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource.go @@ -0,0 +1,98 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func Resource(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createResource, + DeleteFunc: deleteResource, + Dependencies: nil, + ExportableResource: resources.Resource(clientInfo), + } +} + +func createResource(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createResource(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.CreateResource(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.Resource{ + Name: "Test Resource", + Description: utils.Pointer("This is a test resource"), + Audience: utils.Pointer("https://www.example.com"), + AccessTokenValiditySeconds: utils.Pointer(int32(7200)), + ApplicationPermissionsSettings: &management.ResourceApplicationPermissionsSettings{ + ClaimEnabled: utils.Pointer(true), + }, + } + + request = request.Resource(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateResource", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteResource(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteResource(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.DeleteResource(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteResource", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_attribute.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_attribute.go new file mode 100644 index 00000000..52f4061e --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_attribute.go @@ -0,0 +1,96 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func ResourceAttribute(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createResourceAttribute, + DeleteFunc: deleteResourceAttribute, + Dependencies: []*testutils_resource.TestableResource{ + Resource(t, clientInfo), + }, + ExportableResource: resources.ResourceAttribute(clientInfo), + } +} + +func createResourceAttribute(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createResourceAttribute(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + resourceId := strArgs[0] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ResourceAttributesApi.CreateResourceAttribute(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, resourceId) + clientStruct := management.ResourceAttribute{ + Name: "firstName", + Value: "${user.name.given}", + } + + request = request.ResourceAttribute(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateResourceAttribute", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resourceId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteResourceAttribute(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteResourceAttribute(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ResourceAttributesApi.DeleteResourceAttribute(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteResourceAttribute", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope.go new file mode 100644 index 00000000..f9219732 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope.go @@ -0,0 +1,97 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func ResourceScope(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createResourceScope, + DeleteFunc: deleteResourceScope, + Dependencies: []*testutils_resource.TestableResource{ + Resource(t, clientInfo), + }, + ExportableResource: resources.ResourceScope(clientInfo), + } +} + +func createResourceScope(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createResourceScope(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + resourceId := strArgs[0] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ResourceScopesApi.CreateResourceScope(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, resourceId) + clientStruct := management.ResourceScope{ + Name: "CustomScope", + Description: utils.Pointer("This is a custom scope"), + } + + request = request.ResourceScope(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateResourceScope", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resourceId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteResourceScope(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteResourceScope(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ResourceScopesApi.DeleteResourceScope(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteResourceScope", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope_openid.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope_openid.go new file mode 100644 index 00000000..917b020a --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope_openid.go @@ -0,0 +1,110 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func ResourceScopeOpenId(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createResourceScopeOpenid, + DeleteFunc: deleteResourceScopeOpenid, + Dependencies: nil, + ExportableResource: resources.ResourceScopeOpenId(clientInfo), + } +} + +func createResourceScopeOpenid(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createResourceScopeOpenid(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + iter := clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadAllResources(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID).Execute() + generatedResources, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nError: %v", err) + + return testutils_resource.ResourceInfo{} + } + + var resourceId string + for _, generatedResource := range generatedResources { + if generatedResource.Resource != nil && generatedResource.Resource.Name == "openid" && *generatedResource.Resource.Type == management.ENUMRESOURCETYPE_OPENID_CONNECT { + resourceId = *generatedResource.Resource.Id + + break + } + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ResourceScopesApi.CreateResourceScope(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, resourceId) + clientStruct := management.ResourceScope{ + Name: "OpenIDScope", + } + + request = request.ResourceScope(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateResourceScope", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resourceId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteResourceScopeOpenid(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteResourceScopeOpenid(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ResourceScopesApi.DeleteResourceScope(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteResourceScope", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope_pingone_api.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope_pingone_api.go new file mode 100644 index 00000000..27b438ec --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope_pingone_api.go @@ -0,0 +1,116 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func ResourceScopePingOneApi(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createResourceScopePingoneApi, + DeleteFunc: deleteResourceScopePingoneApi, + Dependencies: nil, + ExportableResource: resources.ResourceScopePingOneApi(clientInfo), + } +} + +func createResourceScopePingoneApi(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createResourceScopePingoneApi(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + iter := clientInfo.PingOneApiClient.ManagementAPIClient.ResourcesApi.ReadAllResources(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID).Execute() + generatedResources, err := pingone.GetManagementAPIObjectsFromIterator[management.EntityArrayEmbeddedResourcesInner](iter, "ReadAllResources", "GetResources", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nError: %v", err) + + return testutils_resource.ResourceInfo{} + } + + var resourceId string + for _, generatedResource := range generatedResources { + if generatedResource.Resource != nil && generatedResource.Resource.Name == "PingOne API" && *generatedResource.Resource.Type == management.ENUMRESOURCETYPE_PINGONE_API { + resourceId = *generatedResource.Resource.Id + + break + } + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ResourceScopesApi.CreateResourceScope(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, resourceId) + clientStruct := management.ResourceScope{ + Name: "p1:update:user:email-only", + Description: utils.Pointer("Access control scope to limit update to email only"), + SchemaAttributes: []string{ + "name.family", + "name.given", + }, + } + + request = request.ResourceScope(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateResourceScope", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + resourceId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteResourceScopePingoneApi(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteResourceScopePingoneApi(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.ResourceScopesApi.DeleteResourceScope(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteResourceScope", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_secret.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_secret.go new file mode 100644 index 00000000..371d72fe --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/resource_secret.go @@ -0,0 +1,26 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func ResourceSecret(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: nil, + DeleteFunc: nil, + Dependencies: []*testutils_resource.TestableResource{ + Resource(t, clientInfo), + }, + ExportableResource: resources.ResourceSecret(clientInfo), + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/schema_attribute.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/schema_attribute.go new file mode 100644 index 00000000..75c45eb8 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/schema_attribute.go @@ -0,0 +1,128 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func SchemaAttribute(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createSchemaAttribute, + DeleteFunc: deleteSchemaAttribute, + Dependencies: nil, + ExportableResource: resources.SchemaAttribute(clientInfo), + } +} + +func createSchemaAttribute(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createSchemaAttribute(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + iter := clientInfo.PingOneApiClient.ManagementAPIClient.SchemasApi.ReadAllSchemas(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID).Execute() + apiObjs, err := pingone.GetManagementAPIObjectsFromIterator[management.Schema](iter, "ReadAllSchemas", "GetSchemas", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nError: %v", err) + + return testutils_resource.ResourceInfo{} + } + + if len(apiObjs) == 0 { + t.Fatal("Failed to execute PingOne client function\n No built-in schemas returned from ReadAllSchemas()") + } + + schemaId := apiObjs[0].Id + schemaName := apiObjs[0].Name + + request := clientInfo.PingOneApiClient.ManagementAPIClient.SchemasApi.CreateAttribute(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, *schemaId) + clientStruct := management.SchemaAttribute{ + Name: "TestSchemaAttribute", + SchemaType: utils.Pointer(management.ENUMSCHEMAATTRIBUTESCHEMATYPE_CUSTOM), + Type: management.ENUMSCHEMAATTRIBUTETYPE_STRING, + Unique: utils.Pointer(false), + Enabled: false, + MultiValued: utils.Pointer(false), + RegexValidation: &management.SchemaAttributeRegexValidation{ + Pattern: "xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL", + Requirements: "Must be a T-shirt size from XS to XXL", + ValuesPatternShouldMatch: []string{ + "xs", + "XXL", + }, + ValuesPatternShouldNotMatch: []string{ + "xL", + "x", + }, + }, + } + + request = request.SchemaAttribute(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateAttribute", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *schemaId, + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + testutils_resource.ENUM_SCHEMA_ID: *schemaId, + testutils_resource.ENUM_SCHEMA_NAME: *schemaName, + }, + } +} + +func deleteSchemaAttribute(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 2 { + t.Errorf("Unexpected number of arguments provided to deleteSchemaAttribute(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.SchemasApi.DeleteAttribute(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0], ids[1]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteAttribute", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/sign_on_policy.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/sign_on_policy.go new file mode 100644 index 00000000..9d4e0e3c --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/sign_on_policy.go @@ -0,0 +1,94 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" + "github.com/pingidentity/pingcli/internal/utils" +) + +func SignOnPolicy(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createSignOnPolicy, + DeleteFunc: deleteSignOnPolicy, + Dependencies: nil, + ExportableResource: resources.SignOnPolicy(clientInfo), + } +} + +func createSignOnPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 0 { + t.Errorf("Unexpected number of arguments provided to createSignOnPolicy(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.SignOnPoliciesApi.CreateSignOnPolicy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID) + clientStruct := management.SignOnPolicy{ + Name: "Simple_Login", + Default: utils.Pointer(false), + Description: utils.Pointer("A new basic sign-on policy."), + } + + request = request.SignOnPolicy(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateSignOnPolicy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + *resource.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.Id, + testutils_resource.ENUM_NAME: resource.Name, + }, + } +} + +func deleteSignOnPolicy(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, ids ...string) { + t.Helper() + + if len(ids) != 1 { + t.Errorf("Unexpected number of arguments provided to deleteSignOnPolicy(): %v", ids) + + return + } + + request := clientInfo.PingOneApiClient.ManagementAPIClient.SignOnPoliciesApi.DeleteSignOnPolicy(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, ids[0]) + + response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "DeleteSignOnPolicy", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return + } +} diff --git a/internal/testing/testutils_resource/pingone_sso_testable_resources/sign_on_policy_action.go b/internal/testing/testutils_resource/pingone_sso_testable_resources/sign_on_policy_action.go new file mode 100644 index 00000000..6ddff0d3 --- /dev/null +++ b/internal/testing/testutils_resource/pingone_sso_testable_resources/sign_on_policy_action.go @@ -0,0 +1,90 @@ +// Copyright © 2025 Ping Identity Corporation +// Code generated by ping-cli-generator + +package pingone_sso_testable_resources + +import ( + "testing" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils_resource" +) + +func SignOnPolicyAction(t *testing.T, clientInfo *connector.ClientInfo) *testutils_resource.TestableResource { + t.Helper() + + return &testutils_resource.TestableResource{ + ClientInfo: clientInfo, + CreateFunc: createSignOnPolicyAction, + DeleteFunc: nil, // The deletion of this resource is handled by the deletion of the SignOnPolicy resource + Dependencies: []*testutils_resource.TestableResource{ + SignOnPolicy(t, clientInfo), + }, + ExportableResource: resources.SignOnPolicyAction(clientInfo), + } +} + +func createSignOnPolicyAction(t *testing.T, clientInfo *connector.ClientInfo, resourceType string, strArgs ...string) testutils_resource.ResourceInfo { + t.Helper() + + if len(strArgs) != 1 { + t.Errorf("Unexpected number of arguments provided to createSignOnPolicyAction(): %v", strArgs) + + return testutils_resource.ResourceInfo{} + } + + policyId := strArgs[0] + + request := clientInfo.PingOneApiClient.ManagementAPIClient.SignOnPolicyActionsApi.CreateSignOnPolicyAction(clientInfo.PingOneContext, clientInfo.PingOneExportEnvironmentID, policyId) + clientStruct := management.SignOnPolicyAction{ + SignOnPolicyActionLogin: &management.SignOnPolicyActionLogin{ + Priority: 10, + Type: management.ENUMSIGNONPOLICYTYPE_LOGIN, + Condition: &management.SignOnPolicyActionCommonConditionOrOrInner{ + SignOnPolicyActionCommonConditionNot: &management.SignOnPolicyActionCommonConditionNot{ + Not: &management.SignOnPolicyActionCommonConditionAggregate{ + SignOnPolicyActionCommonConditionIPRange: &management.SignOnPolicyActionCommonConditionIPRange{ + IpRange: []string{ + "10.1.1.1/8", + "10.0.0.0/8", + }, + Contains: "${flow.request.http.remoteIp}", + }, + }, + }, + }, + Recovery: &management.SignOnPolicyActionLoginAllOfRecovery{ + Enabled: true, + }, + }, + } + + request = request.SignOnPolicyAction(clientStruct) + + resource, response, err := request.Execute() + ok, err := common.HandleClientResponse(response, err, "CreateSignOnPolicyAction", resourceType) + if err != nil { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s\nError: %v", response.Status, response.Body, err) + + return testutils_resource.ResourceInfo{} + } + if !ok { + t.Errorf("Failed to execute PingOne client function\nResponse Status: %s\nResponse Body: %s", response.Status, response.Body) + + return testutils_resource.ResourceInfo{} + } + + return testutils_resource.ResourceInfo{ + DeletionIds: []string{ + policyId, + *resource.SignOnPolicyActionLogin.Id, + }, + CreationInfo: map[testutils_resource.ResourceCreationInfoType]string{ + testutils_resource.ENUM_ID: *resource.SignOnPolicyActionLogin.Id, + testutils_resource.ENUM_TYPE: string(resource.SignOnPolicyActionLogin.Type), + }, + } +} diff --git a/internal/testing/testutils_resource/testutils_resource.go b/internal/testing/testutils_resource/testutils_resource.go index 0895fe0a..1d646e9a 100644 --- a/internal/testing/testutils_resource/testutils_resource.go +++ b/internal/testing/testutils_resource/testutils_resource.go @@ -23,6 +23,17 @@ const ( ENUM_ISSUER_DN ResourceCreationInfoType = "ENUM_ISSUER_DN" ENUM_SERIAL_NUMBER ResourceCreationInfoType = "ENUM_SERIAL_NUMBER" + // Language Info for Language resources + ENUM_LOCALE ResourceCreationInfoType = "ENUM_LOCALE" + + // Template Info for Template resources + ENUM_TEMPLATE_VARIANT ResourceCreationInfoType = "ENUM_TEMPLATE_VARIANT" + ENUM_TEMPLATE_DELIVERY_METHOD ResourceCreationInfoType = "ENUM_TEMPLATE_DELIVERY_METHOD" + + // Schema Info for Schema Attribute resources + ENUM_SCHEMA_ID ResourceCreationInfoType = "ENUM_SCHEMA_ID" + ENUM_SCHEMA_NAME ResourceCreationInfoType = "ENUM_SCHEMA_NAME" + // Miscellaneous Info for resources that don't fit the above ENUM_TYPE ResourceCreationInfoType = "ENUM_TYPE" ENUM_CONTEXT_TYPE ResourceCreationInfoType = "ENUM_CONTEXT_TYPE" @@ -30,7 +41,10 @@ const ( ENUM_SOURCE_REF_ID ResourceCreationInfoType = "ENUM_SOURCE_REF_ID" ) -type ResourceCreationInfo map[ResourceCreationInfoType]string +type ResourceInfo struct { + CreationInfo map[ResourceCreationInfoType]string + DeletionIds []string +} // The TestableResource struct is used to create and delete resources in a test, without prior configuration needed // on a service. This allows different developers and contributors to provide their own test service credentials, @@ -49,13 +63,13 @@ type TestableResource struct { ClientInfo *connector.ClientInfo // Creation function for this TestableResources - CreateFunc func(*testing.T, *connector.ClientInfo, ...string) ResourceCreationInfo + CreateFunc func(*testing.T, *connector.ClientInfo, string, ...string) ResourceInfo // TestableResource information like ID, Name, etc. - CreationInfo ResourceCreationInfo + ResourceInfo ResourceInfo // Deletion function for this TestableResources - DeleteFunc func(*testing.T, *connector.ClientInfo, string, string) + DeleteFunc func(*testing.T, *connector.ClientInfo, string, ...string) // TestableResources required to be created before this TestableResource can be created Dependencies []*TestableResource @@ -64,34 +78,29 @@ type TestableResource struct { ExportableResource connector.ExportableResource } -func (tr *TestableResource) CreateResource(t *testing.T) ResourceCreationInfo { +func (tr *TestableResource) CreateResource(t *testing.T) { t.Helper() - // Each TestableResource CreateFunc takes in the resource type and a variadic list of dependency IDs needed for creation - createdDepIds := []string{} - if tr.ExportableResource == nil { - // Some resources like out_of_band_auth_plugins do not implement ExportableResource - createdDepIds = append(createdDepIds, "") - } else { - createdDepIds = append(createdDepIds, tr.ExportableResource.ResourceType()) + // Some resources like out_of_band_auth_plugins do not implement ExportableResource + resourceType := "" + if tr.ExportableResource != nil { + resourceType = tr.ExportableResource.ResourceType() } for _, dependency := range tr.Dependencies { // Recursively create dependencies - dependency.CreationInfo = dependency.CreateResource(t) - depId, ok := dependency.CreationInfo[ENUM_ID] - if !ok { - t.Fatalf("Failed to get ID from dependency: %v", dependency) - } + dependency.CreateResource(t) + } + depIds, ok := tr.getDepIds() + if !ok { + t.Errorf("Failed to get dependency IDs for resource %s", resourceType) - createdDepIds = append(createdDepIds, depId) + return } if tr.CreateFunc != nil { - tr.CreationInfo = tr.CreateFunc(t, tr.ClientInfo, createdDepIds...) + tr.ResourceInfo = tr.CreateFunc(t, tr.ClientInfo, resourceType, depIds...) } - - return tr.CreationInfo } func (tr *TestableResource) DeleteResource(t *testing.T) { @@ -103,10 +112,31 @@ func (tr *TestableResource) DeleteResource(t *testing.T) { } if tr.DeleteFunc != nil { - tr.DeleteFunc(t, tr.ClientInfo, resourceType, tr.CreationInfo[ENUM_ID]) + tr.DeleteFunc(t, tr.ClientInfo, resourceType, tr.ResourceInfo.DeletionIds...) } for _, dependency := range tr.Dependencies { dependency.DeleteResource(t) } } + +func (tr *TestableResource) getDepIds() ([]string, bool) { + depIds := []string{} + for _, dependency := range tr.Dependencies { + if len(dependency.Dependencies) > 0 { + nestedDepIds, ok := dependency.getDepIds() + if !ok { + return []string{}, false + } + depIds = append(depIds, nestedDepIds...) + } + + depId, ok := dependency.ResourceInfo.CreationInfo[ENUM_ID] + if !ok { + return []string{}, false + } + depIds = append(depIds, depId) + } + + return depIds, true +} diff --git a/internal/testing/testutils_terraform/terraform_utils.go b/internal/testing/testutils_terraform/terraform_utils.go index 6c3ca05c..32578a3a 100644 --- a/internal/testing/testutils_terraform/terraform_utils.go +++ b/internal/testing/testutils_terraform/terraform_utils.go @@ -4,6 +4,7 @@ package testutils_terraform import ( "encoding/json" + "errors" "fmt" "io" "os" @@ -13,7 +14,6 @@ import ( "strings" "testing" - "github.com/pingidentity/pingcli/internal/configuration/options" "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/customtypes" @@ -43,6 +43,7 @@ func ValidateTerraformPlan(t *testing.T, resource connector.ExportableResource, if output["@message"] == ignoredError { usedIgnoreErrors[ignoredError] = true ignore = true + break } } @@ -108,6 +109,8 @@ func singleResourceTerraformPlanGenerateConfigOut(t *testing.T, resource connect // Helper function to run terraform plan --generate-config-out func runTerraformPlanGenerateConfigOut(t *testing.T, terraformExecutableFilepath, exportDir string) string { + t.Helper() + // Create the os.exec Command terraformPlanCmd := exec.Command(terraformExecutableFilepath) // Add the arguments to the command @@ -134,8 +137,10 @@ func runTerraformPlanGenerateConfigOut(t *testing.T, terraformExecutableFilepath // Wait for the command to finish if err := terraformPlanCmd.Wait(); err != nil { + var exitErr *exec.ExitError + // If err is of type *exec.ExitError, ignore the error - if _, ok := err.(*exec.ExitError); !ok { + if !errors.As(err, &exitErr) { t.Fatalf("Failed to run terraform plan: %v", err) } } @@ -157,13 +162,23 @@ func InitPingOneTerraform(t *testing.T) { required_providers { pingone = { source = "pingidentity/pingone" - version = "%s" + version = "1.6.0" } } } -provider "pingone" {} -`, os.Getenv("PINGCLI_PINGONE_PROVIDER_VERSION")) +provider "pingone" { + client_id = "%s" + client_secret = "%s" + environment_id = "%s" + region_code = "%s" +} +`, + os.Getenv("TEST_PINGONE_WORKER_CLIENT_ID"), + os.Getenv("TEST_PINGONE_WORKER_CLIENT_SECRET"), + os.Getenv("TEST_PINGONE_ENVIRONMENT_ID"), + os.Getenv("TEST_PINGONE_REGION_CODE"), + ) // Write main.tf to testing directory mainTFFilepath := filepath.Join(exportDir, "main.tf") @@ -172,7 +187,7 @@ provider "pingone" {} } // Run terraform init in testing directory - initCmd := exec.Command(terraformExecutableFilepath) + initCmd := exec.Command(terraformExecutableFilepath) //#nosec G204 -- This is a test initCmd.Args = append(initCmd.Args, "init") initCmd.Dir = exportDir @@ -192,30 +207,25 @@ func InitPingFederateTerraform(t *testing.T) { // Check if terraform is installed checkTerraformInstallPath(t) - mainTFFileContents := fmt.Sprintf(`terraform { + mainTFFileContents := `terraform { required_providers { pingfederate = { source = "pingidentity/pingfederate" - version = "%s" + version = "1.4.3" } } } provider "pingfederate" { - username = "%s" - password = "%s" - https_host = "%s" - admin_api_path = "%s" + username = "Administrator" + password = "2FederateM0re" + https_host = "https://localhost:9999" + admin_api_path = "/pf-admin-api/v1" product_version = "12.2" insecure_trust_all_tls = true x_bypass_external_validation_header = true } -`, - os.Getenv("PINGCLI_PINGFEDERATE_PROVIDER_VERSION"), - os.Getenv(options.PingFederateBasicAuthUsernameOption.EnvVar), - os.Getenv(options.PingFederateBasicAuthPasswordOption.EnvVar), - os.Getenv(options.PingFederateHTTPSHostOption.EnvVar), - os.Getenv(options.PingFederateAdminAPIPathOption.EnvVar)) +` // Write main.tf to testing directory mainTFFilepath := filepath.Join(exportDir, "main.tf") @@ -224,7 +234,7 @@ provider "pingfederate" { } // Run terraform init in testing directory - initCmd := exec.Command(terraformExecutableFilepath) + initCmd := exec.Command(terraformExecutableFilepath) //#nosec G204 -- This is a test initCmd.Args = append(initCmd.Args, "init") initCmd.Dir = exportDir diff --git a/internal/testing/testutils_viper/viper_utils.go b/internal/testing/testutils_viper/viper_utils.go index 3ab6e60a..fe9f9aae 100644 --- a/internal/testing/testutils_viper/viper_utils.go +++ b/internal/testing/testutils_viper/viper_utils.go @@ -39,13 +39,13 @@ default: clientsecret: %s environmentid: %s pingfederate: - adminapipath: %s + adminapipath: /pf-admin-api/v1 authentication: type: basicauth basicauth: - username: %s - password: %s - httpshost: %s + username: Administrator + password: 2FederateM0re + httpshost: https://localhost:9999 insecureTrustAllTLS: true xBypassExternalValidationHeader: true production: @@ -115,12 +115,9 @@ func getDefaultConfigFileContents() string { outputDirectoryReplacement, customtypes.ENUM_EXPORT_SERVICE_GROUP_PINGONE, customtypes.ENUM_EXPORT_SERVICE_PINGFEDERATE, - os.Getenv(options.PingOneRegionCodeOption.EnvVar), - os.Getenv(options.PingOneAuthenticationWorkerClientIDOption.EnvVar), - os.Getenv(options.PingOneAuthenticationWorkerClientSecretOption.EnvVar), - os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar), - os.Getenv(options.PingFederateAdminAPIPathOption.EnvVar), - os.Getenv(options.PingFederateBasicAuthUsernameOption.EnvVar), - os.Getenv(options.PingFederateBasicAuthPasswordOption.EnvVar), - os.Getenv(options.PingFederateHTTPSHostOption.EnvVar)) + os.Getenv("TEST_PINGONE_REGION_CODE"), + os.Getenv("TEST_PINGONE_WORKER_CLIENT_ID"), + os.Getenv("TEST_PINGONE_WORKER_CLIENT_SECRET"), + os.Getenv("TEST_PINGONE_ENVIRONMENT_ID"), + ) } diff --git a/main.go b/main.go index 3e5d2b68..11fe1e9c 100644 --- a/main.go +++ b/main.go @@ -25,6 +25,7 @@ func main() { for _, setting := range info.Settings { if setting.Key == "vcs.revision" { commit = setting.Value + break } }