From 8dd09bc4286dc7d99ac322fd0676f3eaf63dc870 Mon Sep 17 00:00:00 2001 From: wesleymccollam Date: Mon, 31 Mar 2025 13:28:28 -0400 Subject: [PATCH 1/7] CDI-9: Support Custom Headers Feature: - Add --header, -H flag to request subcommand for custom headers Fixes: - Fix invalid profile error when using help or version flags with no subcommand - Fix issue where specifying multiple flags of the same type does not add values to the slice --- cmd/request/request.go | 6 ++ cmd/request/request_test.go | 34 +++++-- internal/commands/request/request_internal.go | 26 +++++- internal/configuration/options/options.go | 3 + internal/configuration/request/request.go | 27 ++++++ internal/customtypes/export_services.go | 3 +- internal/customtypes/headers.go | 92 +++++++++++++++++++ internal/customtypes/headers_test.go | 41 +++++++++ internal/customtypes/string_slice.go | 4 +- main.go | 25 +++-- 10 files changed, 240 insertions(+), 21 deletions(-) create mode 100644 internal/customtypes/headers.go create mode 100644 internal/customtypes/headers_test.go diff --git a/cmd/request/request.go b/cmd/request/request.go index 74e86a35..6868fe0c 100644 --- a/cmd/request/request.go +++ b/cmd/request/request.go @@ -24,6 +24,9 @@ const ( Send a custom API request to the configured PingOne tenant, making a POST request to create a new environment with JSON data sourced from a file. pingcli request --service pingone --http-method POST --data ./my-environment.json environments + Send a custom API request to the configured PingOne tenant, making a POST request using a custom header to create users with JSON data sourced from a file. + pingcli request --service pingone --http-method POST --header "Content-Type: application/vnd.pingidentity.user.import+json" --data ./users.json environments/$MY_ENVIRONMENT_ID/users + Send a custom API request to the configured PingOne tenant, making a POST request to create a new environment using raw JSON data. pingcli request --service pingone --http-method POST --data-raw '{"name": "My environment"}' environments @@ -54,6 +57,9 @@ The command offers a cURL-like experience to interact with the Ping platform ser // --fail, -f cmd.Flags().AddFlag(options.RequestFailOption.Flag) + // --header, -H + cmd.Flags().AddFlag(options.RequestHeaderOption.Flag) + // --http-method, -m cmd.Flags().AddFlag(options.RequestHTTPMethodOption.Flag) // auto-completion diff --git a/cmd/request/request_test.go b/cmd/request/request_test.go index 1b1964ac..836c6f65 100644 --- a/cmd/request/request_test.go +++ b/cmd/request/request_test.go @@ -26,8 +26,8 @@ func TestRequestCmd_Execute(t *testing.T) { os.Stdout = pipeWriter err = testutils_cobra.ExecutePingcli(t, "request", - "--service", "pingone", - "--http-method", "GET", + "--"+options.RequestServiceOption.CobraParamName, "pingone", + "--"+options.RequestHTTPMethodOption.CobraParamName, "GET", fmt.Sprintf("environments/%s/populations", os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar)), ) testutils.CheckExpectedError(t, err, nil) @@ -87,8 +87,8 @@ func TestRequestCmd_Execute_Help(t *testing.T) { func TestRequestCmd_Execute_InvalidService(t *testing.T) { expectedErrorPattern := `^invalid argument ".*" for "-s, --service" flag: unrecognized Request Service: '.*'. Must be one of: .*$` err := testutils_cobra.ExecutePingcli(t, "request", - "--service", "invalid-service", - "--http-method", "GET", + "--"+options.RequestServiceOption.CobraParamName, "invalid-service", + "--"+options.RequestHTTPMethodOption.CobraParamName, "GET", fmt.Sprintf("environments/%s/populations", os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar)), ) testutils.CheckExpectedError(t, err, &expectedErrorPattern) @@ -98,8 +98,8 @@ func TestRequestCmd_Execute_InvalidService(t *testing.T) { func TestRequestCmd_Execute_InvalidHTTPMethod(t *testing.T) { expectedErrorPattern := `^invalid argument ".*" for "-m, --http-method" flag: unrecognized HTTP Method: '.*'. Must be one of: .*$` err := testutils_cobra.ExecutePingcli(t, "request", - "--service", "pingone", - "--http-method", "INVALID", + "--"+options.RequestServiceOption.CobraParamName, "pingone", + "--"+options.RequestHTTPMethodOption.CobraParamName, "INVALID", fmt.Sprintf("environments/%s/populations", os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar)), ) testutils.CheckExpectedError(t, err, &expectedErrorPattern) @@ -111,3 +111,25 @@ func TestRequestCmd_Execute_MissingRequiredServiceFlag(t *testing.T) { err := testutils_cobra.ExecutePingcli(t, "request", fmt.Sprintf("environments/%s/populations", os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar))) testutils.CheckExpectedError(t, err, &expectedErrorPattern) } + +// Test Request Command with Header Flag +func TestRequestCmd_Execute_HeaderFlag(t *testing.T) { + err := testutils_cobra.ExecutePingcli(t, "request", + "--"+options.RequestServiceOption.CobraParamName, "pingone", + "--"+options.RequestHTTPMethodOption.CobraParamName, "GET", + "--"+options.RequestHeaderOption.CobraParamName, "Content-Type: application/vnd.pingidentity.user.import+json", + fmt.Sprintf("environments/%s/users", os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar)), + ) + testutils.CheckExpectedError(t, err, nil) +} + +// Test Request Command with invalid Header Flag +func TestRequestCmd_Execute_InvalidHeaderFlag(t *testing.T) { + expectedErrorPattern := `^invalid argument ".*" for "-H, --header" flag: failed to set Headers: Invalid header: invalid=header. Headers must be in the proper format$` + err := testutils_cobra.ExecutePingcli(t, "request", + "--"+options.RequestServiceOption.CobraParamName, "pingone", + "--"+options.RequestHeaderOption.CobraParamName, "invalid=header", + fmt.Sprintf("environments/%s/populations", os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar)), + ) + testutils.CheckExpectedError(t, err, &expectedErrorPattern) +} diff --git a/internal/commands/request/request_internal.go b/internal/commands/request/request_internal.go index c39a2ff8..fa1fb0e7 100644 --- a/internal/commands/request/request_internal.go +++ b/internal/commands/request/request_internal.go @@ -88,8 +88,30 @@ func runInternalPingOneRequest(uri string) (err error) { return err } - req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", accessToken)) - req.Header.Add("Content-Type", "application/json") + headers, err := profiles.GetOptionValue(options.RequestHeaderOption) + if err != nil { + return err + } + + requestHeaders := new(customtypes.HeaderSlice) + err = requestHeaders.Set(headers) + if err != nil { + return err + } + + requestHeaders.SetHttpRequestHeaders(req) + + // Set default content type if not provided + if req.Header.Get("Content-Type") == "" { + req.Header.Add("Content-Type", "application/json") + } + + // Set default authorization header if not provided + if req.Header.Get("Authorization") != "" { + output.Warn(fmt.Sprintf("'Authorization' header has been supplied via --%s flag. Default 'Authorization' header will not be used.", options.RequestHeaderOption.CobraParamName), nil) + } else { + req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", accessToken)) + } res, err := client.Do(req) if err != nil { diff --git a/internal/configuration/options/options.go b/internal/configuration/options/options.go index f81edb32..0c994d9b 100644 --- a/internal/configuration/options/options.go +++ b/internal/configuration/options/options.go @@ -15,6 +15,7 @@ type OptionType string const ( ENUM_BOOL OptionType = "ENUM_BOOL" ENUM_EXPORT_FORMAT OptionType = "ENUM_EXPORT_FORMAT" + ENUM_HEADER OptionType = "ENUM_HEADER" ENUM_INT OptionType = "ENUM_INT" ENUM_EXPORT_SERVICE_GROUP OptionType = "ENUM_EXPORT_SERVICE_GROUP" ENUM_EXPORT_SERVICES OptionType = "ENUM_EXPORT_SERVICES" @@ -87,6 +88,7 @@ func Options() []Option { RequestDataOption, RequestDataRawOption, + RequestHeaderOption, RequestHTTPMethodOption, RequestServiceOption, RequestAccessTokenOption, @@ -170,6 +172,7 @@ var ( var ( RequestDataOption Option RequestDataRawOption Option + RequestHeaderOption Option RequestHTTPMethodOption Option RequestServiceOption Option RequestAccessTokenOption Option diff --git a/internal/configuration/request/request.go b/internal/configuration/request/request.go index 982e758d..c6b6f4e8 100644 --- a/internal/configuration/request/request.go +++ b/internal/configuration/request/request.go @@ -14,6 +14,7 @@ import ( func InitRequestOptions() { initDataOption() initDataRawOption() + initHeaderOption() initHTTPMethodOption() initServiceOption() initAccessTokenOption() @@ -67,6 +68,32 @@ func initDataRawOption() { } } +func initHeaderOption() { + cobraParamName := "header" + cobraValue := new(customtypes.HeaderSlice) + defaultValue := customtypes.StringSlice([]string{}) + envVar := "PINGCLI_REQUEST_HEADER" + + options.RequestHeaderOption = options.Option{ + CobraParamName: cobraParamName, + CobraParamValue: cobraValue, + DefaultValue: &defaultValue, + EnvVar: envVar, + Flag: &pflag.Flag{ + Name: cobraParamName, + Shorthand: "H", + Usage: fmt.Sprintf( + "A custom header to send in the request." + + "\nExample: --header \"Content-Type: application/vnd.pingidentity.user.import+json\"", + ), + Value: cobraValue, + }, + Sensitive: false, + Type: options.ENUM_HEADER, + ViperKey: "", // No viper key + } +} + func initHTTPMethodOption() { cobraParamName := "http-method" cobraValue := new(customtypes.HTTPMethod) diff --git a/internal/customtypes/export_services.go b/internal/customtypes/export_services.go index 09d5623d..e0a6bcc9 100644 --- a/internal/customtypes/export_services.go +++ b/internal/customtypes/export_services.go @@ -35,13 +35,12 @@ func (es *ExportServices) Set(services string) error { } if services == "" || services == "[]" { - *es = ExportServices([]string{}) return nil } validServices := ExportServicesValidValues() serviceList := strings.Split(services, ",") - returnServiceList := []string{} + returnServiceList := *es for _, service := range serviceList { if !slices.ContainsFunc(validServices, func(validService string) bool { diff --git a/internal/customtypes/headers.go b/internal/customtypes/headers.go new file mode 100644 index 00000000..8419bb61 --- /dev/null +++ b/internal/customtypes/headers.go @@ -0,0 +1,92 @@ +// Copyright © 2025 Ping Identity Corporation + +package customtypes + +import ( + "fmt" + "net/http" + "regexp" + "strings" + + "github.com/spf13/pflag" +) + +type Header struct { + Key string + Value string +} + +type HeaderSlice []Header + +// Verify that the custom type satisfies the pflag.Value interface +var _ pflag.Value = (*HeaderSlice)(nil) + +func IsValidHeader(header string) (Header, bool) { + headerNameRegex := regexp.MustCompile(`(^[^\s]+):[\t ]{0,1}(.*)$`) + matches := headerNameRegex.FindStringSubmatch(header) + if len(matches) != 3 { + return Header{}, false + } + + return Header{ + Key: matches[1], + Value: matches[2], + }, true +} + +func (h *HeaderSlice) Set(val string) error { + if h == nil { + return fmt.Errorf("failed to set Headers value: %s. Headers is nil", val) + } + + if val == "" || val == "[]" { + return nil + } else { + valH := strings.SplitSeq(val, ",") + for header := range valH { + headerVal, isValid := IsValidHeader(header) + if !isValid { + return fmt.Errorf("failed to set Headers: Invalid header: %s. Headers must be in the proper format", header) + } + *h = append(*h, headerVal) + } + } + + return nil +} + +func (h HeaderSlice) SetHttpRequestHeaders(request *http.Request) { + for _, header := range h { + request.Header.Add(header.Key, header.Value) + } +} + +func (h HeaderSlice) Type() string { + return "[]string" +} + +func (h HeaderSlice) String() string { + if h == nil { + return "" + } + + var headers []string + for _, header := range h { + headers = append(headers, fmt.Sprintf("%s:%s", header.Key, header.Value)) + } + + return strings.Join(headers, ",") +} + +func (h HeaderSlice) StringSlice() []string { + if h == nil { + return []string{} + } + + var headers []string + for _, header := range h { + headers = append(headers, fmt.Sprintf("%s:%s", header.Key, header.Value)) + } + + return headers +} diff --git a/internal/customtypes/headers_test.go b/internal/customtypes/headers_test.go new file mode 100644 index 00000000..a58c5ed6 --- /dev/null +++ b/internal/customtypes/headers_test.go @@ -0,0 +1,41 @@ +// Copyright © 2025 Ping Identity Corporation + +package customtypes_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/customtypes" + "github.com/pingidentity/pingcli/internal/testing/testutils" +) + +// Test Headers Set function +func Test_Headers_Set(t *testing.T) { + hs := new(customtypes.HeaderSlice) + + service := "key: value" + err := hs.Set(service) + if err != nil { + t.Errorf("Set returned error: %v", err) + } +} + +// Test Headers Set function with invalid value +func Test_Headers_Set_InvalidValue(t *testing.T) { + hs := new(customtypes.HeaderSlice) + + invalidValue := "invalid=value" + expectedErrorPattern := `^failed to set Headers: Invalid header: .*\. Headers must be in the proper format$` + err := hs.Set(invalidValue) + testutils.CheckExpectedError(t, err, &expectedErrorPattern) +} + +// Test Headers Set function with nil +func Test_Headers_Set_Nil(t *testing.T) { + var hs *customtypes.HeaderSlice + + service := customtypes.ENUM_EXPORT_SERVICE_PINGONE_MFA + expectedErrorPattern := `^failed to set Headers value: .* Headers is nil$` + err := hs.Set(service) + testutils.CheckExpectedError(t, err, &expectedErrorPattern) +} diff --git a/internal/customtypes/string_slice.go b/internal/customtypes/string_slice.go index 18c43083..cb05097b 100644 --- a/internal/customtypes/string_slice.go +++ b/internal/customtypes/string_slice.go @@ -20,10 +20,10 @@ func (ss *StringSlice) Set(val string) error { } if val == "" || val == "[]" { - *ss = StringSlice([]string{}) + return nil } else { valSs := strings.Split(val, ",") - *ss = StringSlice(valSs) + *ss = append(*ss, valSs...) } return nil diff --git a/main.go b/main.go index 3e5d2b68..64d54413 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "runtime/debug" + "slices" "github.com/pingidentity/pingcli/cmd" "github.com/pingidentity/pingcli/internal/output" @@ -39,14 +40,20 @@ func main() { os.Exit(1) } - detailedExitCodeWarnLogged, err := output.DetailedExitCodeWarnLogged() - if err != nil { - output.UserError(fmt.Sprintf("Failed to execute pingcli: %v", err), nil) - os.Exit(1) - } - if detailedExitCodeWarnLogged { - os.Exit(2) - } else { - os.Exit(0) + if !slices.Contains(os.Args, "--version") && + !slices.Contains(os.Args, "-v") && + !slices.Contains(os.Args, "--help") && + !slices.Contains(os.Args, "-h") { + detailedExitCodeWarnLogged, err := output.DetailedExitCodeWarnLogged() + if err != nil { + output.UserError(fmt.Sprintf("Failed to execute pingcli: %v", err), nil) + os.Exit(1) + } + if detailedExitCodeWarnLogged { + os.Exit(2) + } } + + os.Exit(0) + } From 693f431ba198e3cbf0974c8f3db78a12d21adb3a Mon Sep 17 00:00:00 2001 From: wesleymccollam Date: Mon, 31 Mar 2025 13:59:09 -0400 Subject: [PATCH 2/7] Merge branch 'main' into request-custom-header-support, remove unnecessary conversion in export services --- .../workflows/code-analysis-lint-test.yaml | 32 +-- .golangci.yml | 70 ++++- Makefile | 47 ++-- cmd/common/cobra_utils.go | 8 +- cmd/completion/cmd.go | 1 + cmd/config/unset_test.go | 12 +- cmd/platform/export.go | 23 +- cmd/platform/export_test.go | 60 ++-- cmd/request/request_test.go | 14 +- cmd/root.go | 4 +- .../hcl-export-compatibility.md | 3 +- .../native-export-compatibility.md | 3 +- .../terraform-provider-compatibility.md | 3 +- docs/tool-configuration/configuration-key.md | 4 +- go.mod | 4 +- go.sum | 10 +- internal/autocompletion/config_args.go | 1 + .../commands/config/add_profile_internal.go | 10 +- .../config/delete_profile_internal.go | 8 +- internal/commands/config/get_internal.go | 6 +- .../commands/config/list_keys_internal.go | 11 +- .../commands/config/list_profiles_internal.go | 1 + .../config/set_active_profile_internal.go | 4 +- internal/commands/config/set_internal.go | 48 ++-- internal/commands/config/unset_internal.go | 12 +- .../commands/config/view_profile_internal.go | 6 +- internal/commands/platform/export_internal.go | 24 +- .../commands/platform/export_internal_test.go | 33 ++- internal/commands/request/request_internal.go | 66 +++-- .../commands/request/request_internal_test.go | 36 ++- internal/configuration/configuration.go | 5 +- .../configuration/options/options_test.go | 1 - internal/configuration/platform/export.go | 10 +- internal/configuration/root/root.go | 2 + .../configuration/services/pingfederate.go | 2 +- internal/configuration/services/pingone.go | 1 - internal/connector/common/common_utils.go | 15 +- internal/connector/common/resources_common.go | 16 +- internal/connector/exportable_resource.go | 7 +- .../connector/exportable_resource_test.go | 2 +- .../pingfederate_connector_test.go | 148 +++++----- .../authentication_api_application.go | 3 +- .../authentication_api_application_test.go | 12 +- .../resources/authentication_api_settings.go | 1 + .../authentication_api_settings_test.go | 10 +- .../resources/authentication_policies.go | 1 + .../authentication_policies_fragment.go | 3 +- .../authentication_policies_fragment_test.go | 12 +- .../authentication_policies_settings.go | 1 + .../authentication_policies_settings_test.go | 10 +- .../resources/authentication_policies_test.go | 10 +- .../authentication_policy_contract.go | 3 +- .../authentication_policy_contract_test.go | 12 +- .../resources/authentication_selector.go | 3 +- .../resources/authentication_selector_test.go | 12 +- .../resources/captcha_provider.go | 3 +- .../resources/captcha_provider_settings.go | 1 + .../captcha_provider_settings_test.go | 10 +- .../resources/captcha_provider_test.go | 12 +- .../pingfederate/resources/certificate_ca.go | 3 +- .../resources/certificate_ca_test.go | 12 +- ...ertificates_revocation_ocsp_certificate.go | 3 +- ...icates_revocation_ocsp_certificate_test.go | 12 +- .../certificates_revocation_settings.go | 1 + .../certificates_revocation_settings_test.go | 10 +- .../resources/cluster_settings.go | 3 + .../resources/cluster_settings_test.go | 13 +- .../configuration_encryption_keys_rotate.go | 1 + ...nfiguration_encryption_keys_rotate_test.go | 10 +- .../pingfederate/resources/data_store.go | 3 +- .../pingfederate/resources/data_store_test.go | 12 +- .../pingfederate/resources/default_urls.go | 1 + .../resources/default_urls_test.go | 10 +- .../resources/extended_properties.go | 1 + .../resources/extended_properties_test.go | 10 +- .../resources/identity_store_provisioner.go | 3 +- .../identity_store_provisioner_test.go | 12 +- .../pingfederate/resources/idp_adapter.go | 3 +- .../resources/idp_adapter_test.go | 12 +- .../resources/idp_sp_connection.go | 3 +- .../resources/idp_sp_connection_test.go | 12 +- .../idp_sts_request_parameters_contract.go | 3 +- ...dp_sts_request_parameters_contract_test.go | 12 +- .../resources/idp_to_sp_adapter_mapping.go | 3 +- .../idp_to_sp_adapter_mapping_test.go | 12 +- .../resources/idp_token_processor.go | 3 +- .../resources/idp_token_processor_test.go | 12 +- .../resources/incoming_proxy_settings.go | 1 + .../resources/incoming_proxy_settings_test.go | 10 +- .../pingfederate/resources/kerberos_realm.go | 3 +- .../resources/kerberos_realm_settings.go | 1 + .../resources/kerberos_realm_settings_test.go | 10 +- .../resources/kerberos_realm_test.go | 12 +- .../keypairs_oauth_openid_connect.go | 1 + ...oauth_openid_connect_additional_key_set.go | 3 +- ..._openid_connect_additional_key_set_test.go | 12 +- .../keypairs_oauth_openid_connect_test.go | 10 +- .../keypairs_signing_key_rotation_settings.go | 4 +- ...airs_signing_key_rotation_settings_test.go | 12 +- .../resources/keypairs_ssl_server_settings.go | 1 + .../keypairs_ssl_server_settings_test.go | 10 +- .../resources/local_identity_profile.go | 3 +- .../resources/local_identity_profile_test.go | 12 +- .../pingfederate/resources/metadata_url.go | 3 +- .../resources/metadata_url_test.go | 12 +- .../resources/notification_publisher.go | 3 +- .../notification_publisher_settings.go | 1 + .../notification_publisher_settings_test.go | 10 +- .../resources/notification_publisher_test.go | 12 +- .../resources/oauth_access_token_manager.go | 3 +- .../oauth_access_token_manager_settings.go | 1 + ...auth_access_token_manager_settings_test.go | 10 +- .../oauth_access_token_manager_test.go | 12 +- .../resources/oauth_access_token_mapping.go | 3 +- .../oauth_access_token_mapping_test.go | 12 +- ..._authentication_policy_contract_mapping.go | 1 + ...entication_policy_contract_mapping_test.go | 12 +- ...oauth_ciba_server_policy_request_policy.go | 3 +- ..._ciba_server_policy_request_policy_test.go | 12 +- .../oauth_ciba_server_policy_settings.go | 1 + .../oauth_ciba_server_policy_settings_test.go | 10 +- .../pingfederate/resources/oauth_client.go | 3 +- .../oauth_client_registration_policy.go | 3 +- .../oauth_client_registration_policy_test.go | 12 +- .../resources/oauth_client_settings.go | 1 + .../resources/oauth_client_settings_test.go | 10 +- .../resources/oauth_client_test.go | 12 +- .../resources/oauth_idp_adapter_mapping.go | 1 + .../oauth_idp_adapter_mapping_test.go | 12 +- .../pingfederate/resources/oauth_issuer.go | 3 +- .../resources/oauth_issuer_test.go | 12 +- .../resources/oauth_server_settings.go | 1 + .../resources/oauth_server_settings_test.go | 10 +- ...oauth_token_exchange_generator_settings.go | 1 + ..._token_exchange_generator_settings_test.go | 10 +- ..._token_exchange_token_generator_mapping.go | 3 +- ...n_exchange_token_generator_mapping_test.go | 12 +- .../resources/openid_connect_policy.go | 3 +- .../resources/openid_connect_policy_test.go | 12 +- .../resources/openid_connect_settings.go | 1 + .../resources/openid_connect_settings_test.go | 10 +- .../password_credential_validator.go | 3 +- .../password_credential_validator_test.go | 12 +- .../resources/pingone_connection.go | 3 +- .../resources/pingone_connection_test.go | 12 +- .../protocol_metadata_lifetime_settings.go | 1 + ...rotocol_metadata_lifetime_settings_test.go | 10 +- .../protocol_metadata_signing_settings.go | 1 + ...protocol_metadata_signing_settings_test.go | 10 +- .../resources/redirect_validation.go | 1 + .../resources/redirect_validation_test.go | 10 +- .../pingfederate/resources/secret_manager.go | 3 +- .../resources/secret_manager_test.go | 12 +- .../pingfederate/resources/server_settings.go | 1 + .../resources/server_settings_general.go | 1 + .../resources/server_settings_general_test.go | 10 +- .../resources/server_settings_logging.go | 1 + .../resources/server_settings_logging_test.go | 10 +- .../server_settings_system_keys_rotate.go | 1 + ...server_settings_system_keys_rotate_test.go | 10 +- .../resources/server_settings_test.go | 10 +- .../server_settings_ws_trust_sts_settings.go | 1 + ...s_trust_sts_settings_issuer_certificate.go | 3 +- ...st_sts_settings_issuer_certificate_test.go | 12 +- ...ver_settings_ws_trust_sts_settings_test.go | 10 +- .../resources/service_authentication.go | 1 + .../resources/service_authentication_test.go | 10 +- .../resources/session_application_policy.go | 1 + .../session_application_policy_test.go | 10 +- .../session_authentication_policies_global.go | 1 + ...ion_authentication_policies_global_test.go | 10 +- .../session_authentication_policy.go | 3 +- .../session_authentication_policy_test.go | 12 +- .../resources/session_settings.go | 1 + .../resources/session_settings_test.go | 10 +- .../pingfederate/resources/sp_adapter.go | 3 +- .../pingfederate/resources/sp_adapter_test.go | 12 +- ..._authentication_policy_contract_mapping.go | 3 +- ...entication_policy_contract_mapping_test.go | 12 +- .../resources/sp_idp_connection.go | 3 +- .../resources/sp_idp_connection_test.go | 12 +- .../resources/sp_target_url_mappings.go | 1 + .../resources/sp_target_url_mappings_test.go | 10 +- ...en_processor_to_token_generator_mapping.go | 3 +- ...ocessor_to_token_generator_mapping_test.go | 12 +- .../resources/virtual_host_names.go | 1 + .../resources/virtual_host_names_test.go | 10 +- .../authorize/pingone_authorize_connector.go | 8 +- .../pingone_authorize_connector_test.go | 62 +++-- ...on_resource.go => application_resource.go} | 73 +++-- .../application_resource_permission.go | 141 ++++++++++ .../application_resource_permission_test.go | 35 +++ .../resources/application_resource_test.go | 35 +++ .../resources/authorize_api_service.go | 87 ++++++ .../authorize_api_service_deployment.go | 116 ++++++++ .../authorize_api_service_deployment_test.go | 35 +++ .../authorize_api_service_operation.go | 117 ++++++++ .../authorize_api_service_operation_test.go | 35 +++ .../resources/authorize_api_service_test.go | 33 +++ .../resources/authorize_application_role.go | 87 ++++++ ... authorize_application_role_permission.go} | 57 ++-- ...horize_application_role_permission_test.go | 35 +++ .../authorize_application_role_test.go | 33 +++ .../resources/authorize_decision_endpoint.go | 87 ++++++ .../authorize_decision_endpoint_test.go | 36 +++ ...pingone_application_resource_permission.go | 135 --------- ...ne_application_resource_permission_test.go | 34 --- .../pingone_application_resource_test.go | 29 -- .../pingone_authorize_api_service.go | 86 ------ ...ingone_authorize_api_service_deployment.go | 114 -------- ...e_authorize_api_service_deployment_test.go | 29 -- ...pingone_authorize_api_service_operation.go | 116 -------- ...ne_authorize_api_service_operation_test.go | 29 -- .../pingone_authorize_api_service_test.go | 34 --- .../pingone_authorize_application_role.go | 86 ------ ...horize_application_role_permission_test.go | 34 --- ...pingone_authorize_application_role_test.go | 29 -- .../pingone_authorize_decision_endpoint.go | 86 ------ ...ingone_authorize_decision_endpoint_test.go | 49 ---- .../pingone/mfa/pingone_mfa_connector.go | 8 +- .../pingone/mfa/pingone_mfa_connector_test.go | 37 +-- .../mfa_application_push_credential.go | 124 +++++++++ .../mfa_application_push_credential_test.go | 35 +++ ..._device_policy.go => mfa_device_policy.go} | 45 +-- .../mfa/resources/mfa_device_policy_test.go | 34 +++ ...fa_fido2_policy.go => mfa_fido2_policy.go} | 45 +-- .../mfa/resources/mfa_fido2_policy_test.go | 34 +++ ...ingone_mfa_settings.go => mfa_settings.go} | 22 +- .../mfa/resources/mfa_settings_test.go | 28 ++ ...pingone_mfa_application_push_credential.go | 123 -------- ...ne_mfa_application_push_credential_test.go | 39 --- .../pingone_mfa_device_policy_test.go | 34 --- .../pingone_mfa_fido2_policy_test.go | 34 --- .../resources/pingone_mfa_settings_test.go | 28 -- .../platform/pingone_platform_connector.go | 2 +- .../pingone_platform_connector_test.go | 219 ++++++++------- .../{pingone_agreement.go => agreement.go} | 5 +- ...greement_enable.go => agreement_enable.go} | 0 .../resources/agreement_enable_test.go | 35 +++ ...alization.go => agreement_localization.go} | 15 +- ...le.go => agreement_localization_enable.go} | 0 .../agreement_localization_enable_test.go | 36 +++ ....go => agreement_localization_revision.go} | 27 +- .../agreement_localization_revision_test.go | 36 +++ .../resources/agreement_localization_test.go | 35 +++ .../platform/resources/agreement_test.go | 33 +++ ...gone_alert_channel.go => alert_channel.go} | 0 .../platform/resources/alert_channel_test.go | 33 +++ ...nding_settings.go => branding_settings.go} | 2 + .../resources/branding_settings_test.go | 28 ++ ...ne_branding_theme.go => branding_theme.go} | 5 +- ...e_default.go => branding_theme_default.go} | 35 +-- .../resources/branding_theme_default_test.go | 28 ++ .../platform/resources/branding_theme_test.go | 34 +++ ...{pingone_certificate.go => certificate.go} | 4 +- .../platform/resources/certificate_test.go | 33 +++ ...gone_custom_domain.go => custom_domain.go} | 25 +- .../platform/resources/custom_domain_test.go | 33 +++ ...{pingone_environment.go => environment.go} | 4 +- .../platform/resources/environment_test.go | 28 ++ .../resources/{pingone_form.go => form.go} | 7 +- .../pingone/platform/resources/form_test.go | 33 +++ ..._recaptcha_v2.go => forms_recaptcha_v2.go} | 22 +- .../resources/forms_recaptcha_v2_test.go | 31 +++ .../{pingone_gateway.go => gateway.go} | 25 +- ...ay_credential.go => gateway_credential.go} | 31 ++- .../resources/gateway_credential_test.go | 35 +++ ...signment.go => gateway_role_assignment.go} | 65 +++-- .../resources/gateway_role_assignment_test.go | 35 +++ .../platform/resources/gateway_test.go | 33 +++ ...n_plan.go => identity_propagation_plan.go} | 17 +- .../identity_propagation_plan_test.go | 33 +++ .../resources/{pingone_key.go => key.go} | 11 +- ...ation_policy.go => key_rotation_policy.go} | 7 +- .../resources/key_rotation_policy_test.go | 34 +++ .../pingone/platform/resources/key_test.go | 34 +++ .../{pingone_language.go => language.go} | 19 +- .../platform/resources/language_test.go | 34 +++ ..._language_update.go => language_update.go} | 16 +- .../resources/language_update_test.go | 36 +++ ...ation_policy.go => notification_policy.go} | 7 +- .../resources/notification_policy_test.go | 34 +++ ...n_settings.go => notification_settings.go} | 4 +- ...mail.go => notification_settings_email.go} | 4 +- .../notification_settings_email_test.go | 28 ++ .../resources/notification_settings_test.go | 28 ++ ...nt.go => notification_template_content.go} | 112 ++++---- .../notification_template_content_test.go | 34 +++ ...settings.go => phone_delivery_settings.go} | 31 ++- .../resources/phone_delivery_settings_test.go | 33 +++ .../pingone_agreement_enable_test.go | 34 --- ...gone_agreement_localization_enable_test.go | 34 --- ...ne_agreement_localization_revision_test.go | 39 --- .../pingone_agreement_localization_test.go | 34 --- .../resources/pingone_agreement_test.go | 34 --- .../resources/pingone_alert_channel_test.go | 29 -- .../pingone_branding_settings_test.go | 28 -- .../pingone_branding_theme_default_test.go | 28 -- .../resources/pingone_branding_theme_test.go | 39 --- .../resources/pingone_certificate_test.go | 34 --- .../resources/pingone_custom_domain_test.go | 29 -- .../resources/pingone_environment_test.go | 28 -- .../platform/resources/pingone_form_test.go | 29 -- .../pingone_forms_recaptcha_v2_test.go | 28 -- .../pingone_gateway_credential_test.go | 64 ----- .../pingone_gateway_role_assignment_test.go | 54 ---- .../resources/pingone_gateway_test.go | 54 ---- .../pingone_identity_propagation_plan_test.go | 29 -- .../pingone_key_rotation_policy_test.go | 29 -- .../platform/resources/pingone_key_test.go | 44 --- .../resources/pingone_language_test.go | 29 -- .../resources/pingone_language_update_test.go | 34 --- .../pingone_notification_policy_test.go | 34 --- ...ingone_notification_settings_email_test.go | 28 -- .../pingone_notification_settings_test.go | 28 -- ...gone_notification_template_content_test.go | 262 ------------------ .../pingone_phone_delivery_settings_test.go | 29 -- .../pingone_system_application_test.go | 34 --- .../pingone_trusted_email_address_test.go | 22 -- .../pingone_trusted_email_domain_test.go | 39 --- .../resources/pingone_webhook_test.go | 29 -- ...m_application.go => system_application.go} | 4 +- .../resources/system_application_test.go | 58 ++++ ...il_address.go => trusted_email_address.go} | 33 +-- .../resources/trusted_email_address_test.go | 36 +++ ...mail_domain.go => trusted_email_domain.go} | 11 +- .../resources/trusted_email_domain_test.go | 33 +++ .../{pingone_webhook.go => webhook.go} | 31 ++- .../platform/resources/webhook_test.go | 33 +++ .../protect/pingone_protect_connector_test.go | 29 +- .../resources/pingone_risk_policy_test.go | 34 --- .../resources/pingone_risk_predictor.go | 153 ---------- .../resources/pingone_risk_predictor_test.go | 89 ------ ...{pingone_risk_policy.go => risk_policy.go} | 31 ++- .../protect/resources/risk_policy_test.go | 34 +++ .../protect/resources/risk_predictor.go | 154 ++++++++++ .../protect/resources/risk_predictor_test.go | 34 +++ .../pingone/sso/pingone_sso_connector.go | 2 +- .../pingone/sso/pingone_sso_connector_test.go | 179 ++++++------ ...{pingone_application.go => application.go} | 45 +-- ...ng.go => application_attribute_mapping.go} | 69 ++--- .../application_attribute_mapping_test.go | 36 +++ ... => application_flow_policy_assignment.go} | 84 +++--- ...application_flow_policy_assignment_test.go | 36 +++ .../resources/application_resource_grant.go | 174 ++++++++++++ .../application_resource_grant_test.go | 36 +++ .../resources/application_role_assignment.go | 183 ++++++++++++ .../application_role_assignment_test.go | 36 +++ ...cation_secret.go => application_secret.go} | 35 ++- .../sso/resources/application_secret_test.go | 36 +++ ... application_sign_on_policy_assignment.go} | 86 +++--- ...lication_sign_on_policy_assignment_test.go | 35 +++ .../pingone/sso/resources/application_test.go | 34 +++ .../resources/{pingone_group.go => group.go} | 7 +- ...gone_group_nesting.go => group_nesting.go} | 32 +-- .../sso/resources/group_nesting_test.go | 36 +++ ...assignment.go => group_role_assignment.go} | 40 +-- .../resources/group_role_assignment_test.go | 35 +++ .../pingone/sso/resources/group_test.go | 33 +++ ...ntity_provider.go => identity_provider.go} | 63 ++--- .../resources/identity_provider_attribute.go | 146 ++++++++++ .../identity_provider_attribute_test.go | 36 +++ .../sso/resources/identity_provider_test.go | 33 +++ ..._password_policy.go => password_policy.go} | 7 +- .../sso/resources/password_policy_test.go | 34 +++ ...gone_application_attribute_mapping_test.go | 59 ---- ...application_flow_policy_assignment_test.go | 34 --- .../pingone_application_resource_grant.go | 166 ----------- ...pingone_application_resource_grant_test.go | 44 --- .../pingone_application_role_assignment.go | 181 ------------ ...ingone_application_role_assignment_test.go | 154 ---------- .../pingone_application_secret_test.go | 54 ---- ...lication_sign_on_policy_assignment_test.go | 35 --- .../sso/resources/pingone_application_test.go | 59 ---- .../resources/pingone_group_nesting_test.go | 29 -- .../pingone_group_role_assignment_test.go | 34 --- .../sso/resources/pingone_group_test.go | 44 --- .../pingone_identity_provider_attribute.go | 145 ---------- ...ingone_identity_provider_attribute_test.go | 29 -- .../pingone_identity_provider_test.go | 29 -- .../resources/pingone_password_policy_test.go | 44 --- ...pulation_default_identity_provider_test.go | 39 --- .../pingone_population_default_test.go | 28 -- .../sso/resources/pingone_population_test.go | 39 --- .../pingone_resource_attribute_test.go | 169 ----------- .../pingone_resource_scope_openid_test.go | 74 ----- ...pingone_resource_scope_pingone_api_test.go | 39 --- .../resources/pingone_resource_scope_test.go | 49 ---- .../resources/pingone_resource_secret_test.go | 44 --- .../sso/resources/pingone_resource_test.go | 54 ---- .../pingone_schema_attribute_test.go | 174 ------------ .../pingone_sign_on_policy_action.go | 146 ---------- .../pingone_sign_on_policy_action_test.go | 54 ---- .../resources/pingone_sign_on_policy_test.go | 44 --- .../{pingone_population.go => population.go} | 7 +- ...ation_default.go => population_default.go} | 21 +- ...> population_default_identity_provider.go} | 32 ++- ...pulation_default_identity_provider_test.go | 36 +++ .../sso/resources/population_default_test.go | 34 +++ .../pingone/sso/resources/population_test.go | 34 +++ .../{pingone_resource.go => resource.go} | 15 +- ...rce_attribute.go => resource_attribute.go} | 45 +-- .../sso/resources/resource_attribute_test.go | 36 +++ ...ne_resource_scope.go => resource_scope.go} | 38 +-- ...ope_openid.go => resource_scope_openid.go} | 24 +- .../resources/resource_scope_openid_test.go | 34 +++ ...e_api.go => resource_scope_pingone_api.go} | 26 +- .../resource_scope_pingone_api_test.go | 34 +++ .../sso/resources/resource_scope_test.go | 35 +++ ..._resource_secret.go => resource_secret.go} | 25 +- .../sso/resources/resource_secret_test.go | 35 +++ .../pingone/sso/resources/resource_test.go | 34 +++ ...chema_attribute.go => schema_attribute.go} | 24 +- .../sso/resources/schema_attribute_test.go | 34 +++ ...ne_sign_on_policy.go => sign_on_policy.go} | 9 +- .../sso/resources/sign_on_policy_action.go | 150 ++++++++++ .../resources/sign_on_policy_action_test.go | 39 +++ .../sso/resources/sign_on_policy_test.go | 37 +++ internal/customtypes/export_format.go | 1 + internal/customtypes/export_service_group.go | 1 + internal/customtypes/export_services.go | 6 +- internal/customtypes/headers.go | 4 +- internal/customtypes/http_method.go | 1 + internal/customtypes/output_format.go | 1 + .../customtypes/pingfederate_auth_type.go | 1 + internal/customtypes/pingone_auth_type.go | 1 + internal/customtypes/pingone_region_code.go | 1 + internal/customtypes/request_services.go | 1 + internal/customtypes/uuid.go | 1 + internal/input/input.go | 2 + internal/input/input_test.go | 36 +-- internal/logger/logger.go | 6 +- internal/output/output.go | 29 +- internal/profiles/validate.go | 44 +-- internal/profiles/viper.go | 12 +- internal/testing/testutils/utils.go | 151 +++++++--- .../authentication_api_application.go | 51 +++- .../authentication_api_settings.go | 7 +- .../authentication_policies.go | 5 +- .../authentication_policies_fragment.go | 51 +++- .../authentication_policies_settings.go | 5 +- .../authentication_policy_contract.go | 51 +++- .../authentication_selector.go | 51 +++- .../captcha_provider.go | 51 +++- .../captcha_provider_settings.go | 5 +- .../certificate_ca.go | 53 ++-- ...ertificates_revocation_ocsp_certificate.go | 53 ++-- .../certificates_revocation_settings.go | 5 +- .../cluster_settings.go | 5 +- .../configuration_encryption_keys_rotate.go | 5 +- .../data_store.go | 5 +- .../default_urls.go | 5 +- .../extended_properties.go | 5 +- .../identity_store_provisioner.go | 51 +++- .../idp_adapter.go | 55 ++-- .../idp_sp_connection.go | 55 ++-- .../idp_sts_request_parameters_contract.go | 51 +++- .../idp_to_sp_adapter_mapping.go | 55 ++-- .../idp_token_processor.go | 55 ++-- .../incoming_proxy_settings.go | 5 +- .../kerberos_realm.go | 51 +++- .../kerberos_realm_settings.go | 5 +- .../keypairs_oauth_openid_connect.go | 5 +- ...oauth_openid_connect_additional_key_set.go | 59 ++-- .../keypairs_signing_key.go | 53 ++-- .../keypairs_signing_key_rotation_settings.go | 53 ++-- .../keypairs_ssl_server_settings.go | 5 +- .../local_identity_profile.go | 55 ++-- .../metadata_url.go | 51 +++- .../notification_publisher.go | 51 +++- .../notification_publisher_settings.go | 5 +- .../oauth_access_token_manager.go | 55 ++-- .../oauth_access_token_manager_settings.go | 5 +- .../oauth_access_token_mapping.go | 51 +++- ..._authentication_policy_contract_mapping.go | 53 ++-- ...oauth_ciba_server_policy_request_policy.go | 55 ++-- .../oauth_ciba_server_policy_settings.go | 5 +- .../oauth_client.go | 51 +++- .../oauth_client_registration_policy.go | 51 +++- .../oauth_client_settings.go | 5 +- .../oauth_idp_adapter_mapping.go | 49 +++- .../oauth_issuer.go | 51 +++- .../oauth_server_settings.go | 5 +- ...oauth_token_exchange_generator_settings.go | 5 +- .../oauth_token_exchange_processor_policy.go | 49 +++- ..._token_exchange_token_generator_mapping.go | 61 ++-- .../openid_connect_policy.go | 51 +++- .../openid_connect_settings.go | 5 +- .../out_of_band_auth_plugins.go | 58 ++-- .../password_credential_validator.go | 55 +++- .../pingone_connection.go | 53 ++-- .../protocol_metadata_lifetime_settings.go | 5 +- .../protocol_metadata_signing_settings.go | 5 +- .../redirect_validation.go | 5 +- .../secret_manager.go | 51 +++- .../server_settings.go | 5 +- .../server_settings_general.go | 5 +- .../server_settings_logging.go | 5 +- .../server_settings_system_keys_rotate.go | 5 +- .../server_settings_ws_trust_sts_settings.go | 5 +- ...s_trust_sts_settings_issuer_certificate.go | 53 ++-- .../service_authentication.go | 5 +- .../session_application_policy.go | 5 +- .../session_authentication_policies_global.go | 5 +- .../session_authentication_policy.go | 53 ++-- .../session_settings.go | 5 +- .../sp_adapter.go | 51 +++- ..._authentication_policy_contract_mapping.go | 61 ++-- .../sp_idp_connection.go | 51 +++- .../sp_target_url_mappings.go | 5 +- .../sp_token_generator.go | 53 ++-- ...en_processor_to_token_generator_mapping.go | 59 ++-- .../virtual_host_names.go | 5 +- .../pingone/pingfederate_gateway.go | 79 ------ .../pingfederate_gateway_credential.go | 58 ---- .../application_resource.go | 96 +++++++ .../application_resource_permission.go | 98 +++++++ .../authorize_api_service.go | 105 +++++++ .../authorize_api_service_deployment.go | 60 ++++ .../authorize_api_service_operation.go | 105 +++++++ .../authorize_application_role.go | 93 +++++++ .../authorize_application_role_permission.go | 97 +++++++ .../authorize_decision_endpoint.go | 93 +++++++ .../mfa_application_push_credential.go | 100 +++++++ .../mfa_device_policy.go | 173 ++++++++++++ .../mfa_fido2_policy.go | 131 +++++++++ .../mfa_settings.go | 24 ++ .../agreement.go | 95 +++++++ .../agreement_enable.go | 26 ++ .../agreement_localization.go | 97 +++++++ .../agreement_localization_enable.go | 26 ++ .../agreement_localization_revision.go | 107 +++++++ .../alert_channel.go | 102 +++++++ .../branding_settings.go | 24 ++ .../branding_theme.go | 129 +++++++++ .../branding_theme_default.go | 24 ++ .../certificate.go | 97 +++++++ .../custom_domain.go | 91 ++++++ .../device_auth_application.go | 56 ++-- .../environment.go | 24 ++ .../form.go | 106 +++++++ .../forms_recaptcha_v2.go | 81 ++++++ .../gateway.go | 97 +++++++ .../gateway_credential.go | 89 ++++++ .../gateway_role_assignment.go | 129 +++++++++ .../identity_propagation_plan.go | 91 ++++++ .../key.go | 103 +++++++ .../key_rotation_policy.go | 99 +++++++ .../language.go | 113 ++++++++ .../language_update.go | 26 ++ .../notification_policy.go | 114 ++++++++ .../notification_settings.go | 24 ++ .../notification_settings_email.go | 24 ++ .../notification_template_content.go | 101 +++++++ .../phone_delivery_settings.go | 148 ++++++++++ .../system_application.go | 24 ++ .../trusted_email_address.go | 95 +++++++ .../trusted_email_domain.go | 91 ++++++ .../webhook.go | 106 +++++++ .../risk_policy.go | 122 ++++++++ .../risk_predictor.go | 122 ++++++++ .../application_attribute_mapping.go | 97 +++++++ .../application_device_authorization.go | 110 ++++++++ .../application_flow_policy_assignment.go | 127 +++++++++ .../application_native.go | 128 +++++++++ .../application_resource_grant.go | 136 +++++++++ .../application_role_assignment.go | 129 +++++++++ .../application_secret.go | 26 ++ .../application_sign_on_policy_assignment.go | 113 ++++++++ .../application_worker.go | 112 ++++++++ .../pingone_sso_testable_resources/group.go | 106 +++++++ .../group_nesting.go | 110 ++++++++ .../group_role_assignment.go | 129 +++++++++ .../identity_provider.go | 107 +++++++ .../identity_provider_attribute.go | 98 +++++++ .../password_policy.go | 108 ++++++++ .../population.go | 131 +++++++++ .../population_default.go | 26 ++ .../population_default_identity_provider.go | 26 ++ .../resource.go | 98 +++++++ .../resource_attribute.go | 96 +++++++ .../resource_scope.go | 97 +++++++ .../resource_scope_openid.go | 110 ++++++++ .../resource_scope_pingone_api.go | 116 ++++++++ .../resource_secret.go | 26 ++ .../schema_attribute.go | 128 +++++++++ .../sign_on_policy.go | 94 +++++++ .../sign_on_policy_action.go | 90 ++++++ .../testutils_resource/testutils_resource.go | 74 +++-- .../testutils_terraform/terraform_utils.go | 48 ++-- .../testing/testutils_viper/viper_utils.go | 21 +- main.go | 2 +- 592 files changed, 14661 insertions(+), 7619 deletions(-) rename internal/connector/pingone/authorize/resources/{pingone_application_resource.go => application_resource.go} (64%) create mode 100644 internal/connector/pingone/authorize/resources/application_resource_permission.go create mode 100644 internal/connector/pingone/authorize/resources/application_resource_permission_test.go create mode 100644 internal/connector/pingone/authorize/resources/application_resource_test.go create mode 100644 internal/connector/pingone/authorize/resources/authorize_api_service.go create mode 100644 internal/connector/pingone/authorize/resources/authorize_api_service_deployment.go create mode 100644 internal/connector/pingone/authorize/resources/authorize_api_service_deployment_test.go create mode 100644 internal/connector/pingone/authorize/resources/authorize_api_service_operation.go create mode 100644 internal/connector/pingone/authorize/resources/authorize_api_service_operation_test.go create mode 100644 internal/connector/pingone/authorize/resources/authorize_api_service_test.go create mode 100644 internal/connector/pingone/authorize/resources/authorize_application_role.go rename internal/connector/pingone/authorize/resources/{pingone_authorize_application_role_permission.go => authorize_application_role_permission.go} (67%) create mode 100644 internal/connector/pingone/authorize/resources/authorize_application_role_permission_test.go create mode 100644 internal/connector/pingone/authorize/resources/authorize_application_role_test.go create mode 100644 internal/connector/pingone/authorize/resources/authorize_decision_endpoint.go create mode 100644 internal/connector/pingone/authorize/resources/authorize_decision_endpoint_test.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_application_resource_permission.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_application_resource_permission_test.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_application_resource_test.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_authorize_api_service.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_authorize_api_service_deployment.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_authorize_api_service_deployment_test.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_authorize_api_service_operation.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_authorize_api_service_operation_test.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_authorize_api_service_test.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_authorize_application_role.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_authorize_application_role_permission_test.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_authorize_application_role_test.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_authorize_decision_endpoint.go delete mode 100644 internal/connector/pingone/authorize/resources/pingone_authorize_decision_endpoint_test.go create mode 100644 internal/connector/pingone/mfa/resources/mfa_application_push_credential.go create mode 100644 internal/connector/pingone/mfa/resources/mfa_application_push_credential_test.go rename internal/connector/pingone/mfa/resources/{pingone_mfa_device_policy.go => mfa_device_policy.go} (50%) create mode 100644 internal/connector/pingone/mfa/resources/mfa_device_policy_test.go rename internal/connector/pingone/mfa/resources/{pingone_mfa_fido2_policy.go => mfa_fido2_policy.go} (51%) create mode 100644 internal/connector/pingone/mfa/resources/mfa_fido2_policy_test.go rename internal/connector/pingone/mfa/resources/{pingone_mfa_settings.go => mfa_settings.go} (73%) create mode 100644 internal/connector/pingone/mfa/resources/mfa_settings_test.go delete mode 100644 internal/connector/pingone/mfa/resources/pingone_mfa_application_push_credential.go delete mode 100644 internal/connector/pingone/mfa/resources/pingone_mfa_application_push_credential_test.go delete mode 100644 internal/connector/pingone/mfa/resources/pingone_mfa_device_policy_test.go delete mode 100644 internal/connector/pingone/mfa/resources/pingone_mfa_fido2_policy_test.go delete mode 100644 internal/connector/pingone/mfa/resources/pingone_mfa_settings_test.go rename internal/connector/pingone/platform/resources/{pingone_agreement.go => agreement.go} (91%) rename internal/connector/pingone/platform/resources/{pingone_agreement_enable.go => agreement_enable.go} (100%) create mode 100644 internal/connector/pingone/platform/resources/agreement_enable_test.go rename internal/connector/pingone/platform/resources/{pingone_agreement_localization.go => agreement_localization.go} (85%) rename internal/connector/pingone/platform/resources/{pingone_agreement_localization_enable.go => agreement_localization_enable.go} (100%) create mode 100644 internal/connector/pingone/platform/resources/agreement_localization_enable_test.go rename internal/connector/pingone/platform/resources/{pingone_agreement_localization_revision.go => agreement_localization_revision.go} (80%) create mode 100644 internal/connector/pingone/platform/resources/agreement_localization_revision_test.go create mode 100644 internal/connector/pingone/platform/resources/agreement_localization_test.go create mode 100644 internal/connector/pingone/platform/resources/agreement_test.go rename internal/connector/pingone/platform/resources/{pingone_alert_channel.go => alert_channel.go} (100%) create mode 100644 internal/connector/pingone/platform/resources/alert_channel_test.go rename internal/connector/pingone/platform/resources/{pingone_branding_settings.go => branding_settings.go} (98%) create mode 100644 internal/connector/pingone/platform/resources/branding_settings_test.go rename internal/connector/pingone/platform/resources/{pingone_branding_theme.go => branding_theme.go} (92%) rename internal/connector/pingone/platform/resources/{pingone_branding_theme_default.go => branding_theme_default.go} (66%) create mode 100644 internal/connector/pingone/platform/resources/branding_theme_default_test.go create mode 100644 internal/connector/pingone/platform/resources/branding_theme_test.go rename internal/connector/pingone/platform/resources/{pingone_certificate.go => certificate.go} (97%) create mode 100644 internal/connector/pingone/platform/resources/certificate_test.go rename internal/connector/pingone/platform/resources/{pingone_custom_domain.go => custom_domain.go} (76%) create mode 100644 internal/connector/pingone/platform/resources/custom_domain_test.go rename internal/connector/pingone/platform/resources/{pingone_environment.go => environment.go} (94%) create mode 100644 internal/connector/pingone/platform/resources/environment_test.go rename internal/connector/pingone/platform/resources/{pingone_form.go => form.go} (91%) create mode 100644 internal/connector/pingone/platform/resources/form_test.go rename internal/connector/pingone/platform/resources/{pingone_forms_recaptcha_v2.go => forms_recaptcha_v2.go} (69%) create mode 100644 internal/connector/pingone/platform/resources/forms_recaptcha_v2_test.go rename internal/connector/pingone/platform/resources/{pingone_gateway.go => gateway.go} (76%) rename internal/connector/pingone/platform/resources/{pingone_gateway_credential.go => gateway_credential.go} (77%) create mode 100644 internal/connector/pingone/platform/resources/gateway_credential_test.go rename internal/connector/pingone/platform/resources/{pingone_gateway_role_assignment.go => gateway_role_assignment.go} (61%) create mode 100644 internal/connector/pingone/platform/resources/gateway_role_assignment_test.go create mode 100644 internal/connector/pingone/platform/resources/gateway_test.go rename internal/connector/pingone/platform/resources/{pingone_identity_propagation_plan.go => identity_propagation_plan.go} (79%) create mode 100644 internal/connector/pingone/platform/resources/identity_propagation_plan_test.go rename internal/connector/pingone/platform/resources/{pingone_key.go => key.go} (94%) rename internal/connector/pingone/platform/resources/{pingone_key_rotation_policy.go => key_rotation_policy.go} (91%) create mode 100644 internal/connector/pingone/platform/resources/key_rotation_policy_test.go create mode 100644 internal/connector/pingone/platform/resources/key_test.go rename internal/connector/pingone/platform/resources/{pingone_language.go => language.go} (78%) create mode 100644 internal/connector/pingone/platform/resources/language_test.go rename internal/connector/pingone/platform/resources/{pingone_language_update.go => language_update.go} (81%) create mode 100644 internal/connector/pingone/platform/resources/language_update_test.go rename internal/connector/pingone/platform/resources/{pingone_notification_policy.go => notification_policy.go} (91%) create mode 100644 internal/connector/pingone/platform/resources/notification_policy_test.go rename internal/connector/pingone/platform/resources/{pingone_notification_settings.go => notification_settings.go} (98%) rename internal/connector/pingone/platform/resources/{pingone_notification_settings_email.go => notification_settings_email.go} (98%) create mode 100644 internal/connector/pingone/platform/resources/notification_settings_email_test.go create mode 100644 internal/connector/pingone/platform/resources/notification_settings_test.go rename internal/connector/pingone/platform/resources/{pingone_notification_template_content.go => notification_template_content.go} (51%) create mode 100644 internal/connector/pingone/platform/resources/notification_template_content_test.go rename internal/connector/pingone/platform/resources/{pingone_phone_delivery_settings.go => phone_delivery_settings.go} (67%) create mode 100644 internal/connector/pingone/platform/resources/phone_delivery_settings_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_agreement_enable_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_agreement_localization_enable_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_agreement_localization_revision_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_agreement_localization_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_agreement_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_alert_channel_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_branding_settings_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_branding_theme_default_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_branding_theme_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_certificate_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_custom_domain_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_environment_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_form_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_forms_recaptcha_v2_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_gateway_credential_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_gateway_role_assignment_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_gateway_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_identity_propagation_plan_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_key_rotation_policy_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_key_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_language_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_language_update_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_notification_policy_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_notification_settings_email_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_notification_settings_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_notification_template_content_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_phone_delivery_settings_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_system_application_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_trusted_email_address_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_trusted_email_domain_test.go delete mode 100644 internal/connector/pingone/platform/resources/pingone_webhook_test.go rename internal/connector/pingone/platform/resources/{pingone_system_application.go => system_application.go} (93%) create mode 100644 internal/connector/pingone/platform/resources/system_application_test.go rename internal/connector/pingone/platform/resources/{pingone_trusted_email_address.go => trusted_email_address.go} (74%) create mode 100644 internal/connector/pingone/platform/resources/trusted_email_address_test.go rename internal/connector/pingone/platform/resources/{pingone_trusted_email_domain.go => trusted_email_domain.go} (89%) create mode 100644 internal/connector/pingone/platform/resources/trusted_email_domain_test.go rename internal/connector/pingone/platform/resources/{pingone_webhook.go => webhook.go} (67%) create mode 100644 internal/connector/pingone/platform/resources/webhook_test.go delete mode 100644 internal/connector/pingone/protect/resources/pingone_risk_policy_test.go delete mode 100644 internal/connector/pingone/protect/resources/pingone_risk_predictor.go delete mode 100644 internal/connector/pingone/protect/resources/pingone_risk_predictor_test.go rename internal/connector/pingone/protect/resources/{pingone_risk_policy.go => risk_policy.go} (66%) create mode 100644 internal/connector/pingone/protect/resources/risk_policy_test.go create mode 100644 internal/connector/pingone/protect/resources/risk_predictor.go create mode 100644 internal/connector/pingone/protect/resources/risk_predictor_test.go rename internal/connector/pingone/sso/resources/{pingone_application.go => application.go} (62%) rename internal/connector/pingone/sso/resources/{pingone_application_attribute_mapping.go => application_attribute_mapping.go} (52%) create mode 100644 internal/connector/pingone/sso/resources/application_attribute_mapping_test.go rename internal/connector/pingone/sso/resources/{pingone_application_flow_policy_assignment.go => application_flow_policy_assignment.go} (51%) create mode 100644 internal/connector/pingone/sso/resources/application_flow_policy_assignment_test.go create mode 100644 internal/connector/pingone/sso/resources/application_resource_grant.go create mode 100644 internal/connector/pingone/sso/resources/application_resource_grant_test.go create mode 100644 internal/connector/pingone/sso/resources/application_role_assignment.go create mode 100644 internal/connector/pingone/sso/resources/application_role_assignment_test.go rename internal/connector/pingone/sso/resources/{pingone_application_secret.go => application_secret.go} (85%) create mode 100644 internal/connector/pingone/sso/resources/application_secret_test.go rename internal/connector/pingone/sso/resources/{pingone_application_sign_on_policy_assignment.go => application_sign_on_policy_assignment.go} (50%) create mode 100644 internal/connector/pingone/sso/resources/application_sign_on_policy_assignment_test.go create mode 100644 internal/connector/pingone/sso/resources/application_test.go rename internal/connector/pingone/sso/resources/{pingone_group.go => group.go} (91%) rename internal/connector/pingone/sso/resources/{pingone_group_nesting.go => group_nesting.go} (71%) create mode 100644 internal/connector/pingone/sso/resources/group_nesting_test.go rename internal/connector/pingone/sso/resources/{pingone_group_role_assignment.go => group_role_assignment.go} (74%) create mode 100644 internal/connector/pingone/sso/resources/group_role_assignment_test.go create mode 100644 internal/connector/pingone/sso/resources/group_test.go rename internal/connector/pingone/sso/resources/{pingone_identity_provider.go => identity_provider.go} (50%) create mode 100644 internal/connector/pingone/sso/resources/identity_provider_attribute.go create mode 100644 internal/connector/pingone/sso/resources/identity_provider_attribute_test.go create mode 100644 internal/connector/pingone/sso/resources/identity_provider_test.go rename internal/connector/pingone/sso/resources/{pingone_password_policy.go => password_policy.go} (91%) create mode 100644 internal/connector/pingone/sso/resources/password_policy_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_application_attribute_mapping_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_application_flow_policy_assignment_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_application_resource_grant.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_application_resource_grant_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_application_role_assignment.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_application_role_assignment_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_application_secret_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_application_sign_on_policy_assignment_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_application_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_group_nesting_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_group_role_assignment_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_group_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_identity_provider_attribute.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_identity_provider_attribute_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_identity_provider_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_password_policy_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_population_default_identity_provider_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_population_default_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_population_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_resource_attribute_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_resource_scope_openid_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_resource_scope_pingone_api_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_resource_scope_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_resource_secret_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_resource_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_schema_attribute_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_sign_on_policy_action.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_sign_on_policy_action_test.go delete mode 100644 internal/connector/pingone/sso/resources/pingone_sign_on_policy_test.go rename internal/connector/pingone/sso/resources/{pingone_population.go => population.go} (91%) rename internal/connector/pingone/sso/resources/{pingone_population_default.go => population_default.go} (79%) rename internal/connector/pingone/sso/resources/{pingone_population_default_identity_provider.go => population_default_identity_provider.go} (58%) create mode 100644 internal/connector/pingone/sso/resources/population_default_identity_provider_test.go create mode 100644 internal/connector/pingone/sso/resources/population_default_test.go create mode 100644 internal/connector/pingone/sso/resources/population_test.go rename internal/connector/pingone/sso/resources/{pingone_resource.go => resource.go} (82%) rename internal/connector/pingone/sso/resources/{pingone_resource_attribute.go => resource_attribute.go} (69%) create mode 100644 internal/connector/pingone/sso/resources/resource_attribute_test.go rename internal/connector/pingone/sso/resources/{pingone_resource_scope.go => resource_scope.go} (71%) rename internal/connector/pingone/sso/resources/{pingone_resource_scope_openid.go => resource_scope_openid.go} (78%) create mode 100644 internal/connector/pingone/sso/resources/resource_scope_openid_test.go rename internal/connector/pingone/sso/resources/{pingone_resource_scope_pingone_api.go => resource_scope_pingone_api.go} (79%) create mode 100644 internal/connector/pingone/sso/resources/resource_scope_pingone_api_test.go create mode 100644 internal/connector/pingone/sso/resources/resource_scope_test.go rename internal/connector/pingone/sso/resources/{pingone_resource_secret.go => resource_secret.go} (78%) create mode 100644 internal/connector/pingone/sso/resources/resource_secret_test.go create mode 100644 internal/connector/pingone/sso/resources/resource_test.go rename internal/connector/pingone/sso/resources/{pingone_schema_attribute.go => schema_attribute.go} (85%) create mode 100644 internal/connector/pingone/sso/resources/schema_attribute_test.go rename internal/connector/pingone/sso/resources/{pingone_sign_on_policy.go => sign_on_policy.go} (88%) create mode 100644 internal/connector/pingone/sso/resources/sign_on_policy_action.go create mode 100644 internal/connector/pingone/sso/resources/sign_on_policy_action_test.go create mode 100644 internal/connector/pingone/sso/resources/sign_on_policy_test.go rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/authentication_api_application.go (59%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/authentication_api_settings.go (62%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/authentication_policies.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/authentication_policies_fragment.go (68%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/authentication_policies_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/authentication_policy_contract.go (62%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/authentication_selector.go (67%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/captcha_provider.go (64%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/captcha_provider_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/certificate_ca.go (60%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/certificates_revocation_ocsp_certificate.go (61%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/certificates_revocation_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/cluster_settings.go (73%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/configuration_encryption_keys_rotate.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/data_store.go (73%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/default_urls.go (73%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/extended_properties.go (73%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/identity_store_provisioner.go (65%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/idp_adapter.go (69%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/idp_sp_connection.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/idp_sts_request_parameters_contract.go (61%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/idp_to_sp_adapter_mapping.go (63%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/idp_token_processor.go (66%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/incoming_proxy_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/kerberos_realm.go (63%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/kerberos_realm_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/keypairs_oauth_openid_connect.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/keypairs_oauth_openid_connect_additional_key_set.go (59%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/keypairs_signing_key.go (61%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/keypairs_signing_key_rotation_settings.go (62%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/keypairs_ssl_server_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/local_identity_profile.go (61%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/metadata_url.go (60%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/notification_publisher.go (65%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/notification_publisher_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_access_token_manager.go (68%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_access_token_manager_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_access_token_mapping.go (62%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_authentication_policy_contract_mapping.go (63%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_ciba_server_policy_request_policy.go (67%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_ciba_server_policy_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_client.go (60%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_client_registration_policy.go (62%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_client_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_idp_adapter_mapping.go (65%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_issuer.go (59%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_server_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_token_exchange_generator_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_token_exchange_processor_policy.go (67%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/oauth_token_exchange_token_generator_mapping.go (60%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/openid_connect_policy.go (65%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/openid_connect_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/out_of_band_auth_plugins.go (64%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/password_credential_validator.go (66%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/pingone_connection.go (60%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/protocol_metadata_lifetime_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/protocol_metadata_signing_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/redirect_validation.go (73%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/secret_manager.go (63%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/server_settings.go (73%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/server_settings_general.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/server_settings_logging.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/server_settings_system_keys_rotate.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/server_settings_ws_trust_sts_settings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/server_settings_ws_trust_sts_settings_issuer_certificate.go (58%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/service_authentication.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/session_application_policy.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/session_authentication_policies_global.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/session_authentication_policy.go (59%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/session_settings.go (73%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/sp_adapter.go (63%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/sp_authentication_policy_contract_mapping.go (60%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/sp_idp_connection.go (69%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/sp_target_url_mappings.go (72%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/sp_token_generator.go (66%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/token_processor_to_token_generator_mapping.go (61%) rename internal/testing/testutils_resource/{pingfederate => pingfederate_testable_resources}/virtual_host_names.go (73%) delete mode 100644 internal/testing/testutils_resource/pingone/pingfederate_gateway.go delete mode 100644 internal/testing/testutils_resource/pingone/pingfederate_gateway_credential.go create mode 100644 internal/testing/testutils_resource/pingone_authorize_testable_resources/application_resource.go create mode 100644 internal/testing/testutils_resource/pingone_authorize_testable_resources/application_resource_permission.go create mode 100644 internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service.go create mode 100644 internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service_deployment.go create mode 100644 internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_api_service_operation.go create mode 100644 internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_application_role.go create mode 100644 internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_application_role_permission.go create mode 100644 internal/testing/testutils_resource/pingone_authorize_testable_resources/authorize_decision_endpoint.go create mode 100644 internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_application_push_credential.go create mode 100644 internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_device_policy.go create mode 100644 internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_fido2_policy.go create mode 100644 internal/testing/testutils_resource/pingone_mfa_testable_resources/mfa_settings.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/agreement.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_enable.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization_enable.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/agreement_localization_revision.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/alert_channel.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/branding_settings.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/branding_theme.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/branding_theme_default.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/certificate.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/custom_domain.go rename internal/testing/testutils_resource/{pingone => pingone_platform_testable_resources}/device_auth_application.go (63%) create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/environment.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/form.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/forms_recaptcha_v2.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/gateway.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/gateway_credential.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/gateway_role_assignment.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/identity_propagation_plan.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/key.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/key_rotation_policy.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/language.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/language_update.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/notification_policy.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/notification_settings.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/notification_settings_email.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/notification_template_content.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/phone_delivery_settings.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/system_application.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/trusted_email_address.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/trusted_email_domain.go create mode 100644 internal/testing/testutils_resource/pingone_platform_testable_resources/webhook.go create mode 100644 internal/testing/testutils_resource/pingone_protect_testable_resources/risk_policy.go create mode 100644 internal/testing/testutils_resource/pingone_protect_testable_resources/risk_predictor.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/application_attribute_mapping.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/application_device_authorization.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/application_flow_policy_assignment.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/application_native.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/application_resource_grant.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/application_role_assignment.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/application_secret.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/application_sign_on_policy_assignment.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/application_worker.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/group.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/group_nesting.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/group_role_assignment.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/identity_provider.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/identity_provider_attribute.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/password_policy.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/population.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/population_default.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/population_default_identity_provider.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/resource.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/resource_attribute.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope_openid.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/resource_scope_pingone_api.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/resource_secret.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/schema_attribute.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/sign_on_policy.go create mode 100644 internal/testing/testutils_resource/pingone_sso_testable_resources/sign_on_policy_action.go 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..ae696486 100644 --- a/cmd/platform/export.go +++ b/cmd/platform/export.go @@ -15,31 +15,31 @@ import ( ) const ( - commandExamples = ` Export configuration-as-code for all products configured in the configuration file, applying default options. + commandExamples = ` Export Configuration as Code for all products configured in the configuration file, applying default options. pingcli platform export - Export configuration-as-code packages for all configured products to a specific directory, overwriting any previous export. + Export Configuration as Code packages for all configured products to a specific directory, overwriting any previous export. pingcli platform export --output-directory /path/to/my/directory --overwrite - Export configuration-as-code packages for all configured products, specifying the export format as Terraform HCL. + Export Configuration as Code packages for all configured products, specifying the export format as Terraform HCL. pingcli platform export --format HCL - Export configuration-as-code packages for PingOne (core platform and SSO services). + Export Configuration as Code packages for PingOne (core platform and SSO services). pingcli platform export --services pingone-platform,pingone-sso - Export all configuration-as-code packages for PingOne. The --service-group flag can be used instead of listing all pingone-* packages in --services flag. + Export all Configuration as Code packages for PingOne. The --service-group flag can be used instead of listing all pingone-* packages in --services flag. pingcli platform export --service-group pingone - Export configuration-as-code packages for PingOne (core platform), specifying the PingOne environment connection details. + Export Configuration as Code packages for PingOne (core platform), specifying the PingOne environment connection details. pingcli platform export --services pingone-platform --pingone-client-environment-id 3cf2... --pingone-worker-client-id a719... --pingone-worker-client-secret ey..... --pingone-region-code EU - Export configuration-as-code packages for PingFederate, specifying the PingFederate connection details using basic authentication. + Export Configuration as Code packages for PingFederate, specifying the PingFederate connection details using basic authentication. pingcli platform export --services pingfederate --pingfederate-authentication-type basicAuth --pingfederate-username administrator --pingfederate-password 2FederateM0re --pingfederate-https-host https://pingfederate-admin.bxretail.org - Export configuration-as-code packages for PingFederate, specifying the PingFederate connection details using OAuth 2.0 client credentials. + Export Configuration as Code packages for PingFederate, specifying the PingFederate connection details using OAuth 2.0 client credentials. pingcli platform export --services pingfederate --pingfederate-authentication-type clientCredentialsAuth --pingfederate-client-id clientID --pingfederate-client-secret clientSecret --pingfederate-token-url https://pingfederate-admin.bxretail.org/as/token.oauth2 - Export configuration-as-code packages for PingFederate, specifying optional connection properties + Export Configuration as Code packages for PingFederate, specifying optional connection properties pingcli platform export --services pingfederate --x-bypass-external-validation=false --ca-certificate-pem-files "/path/to/cert.pem,/path/to/cert2.pem" --insecure-trust-all-tls=false` ) @@ -48,12 +48,12 @@ func NewExportCommand() *cobra.Command { Args: common.ExactArgs(0), DisableFlagsInUseLine: true, // We write our own flags in @Use attribute Example: commandExamples, - Long: "Export configuration-as-code packages for the Ping Platform.\n\n" + + Long: "Export Configuration as Code packages for the Ping Platform.\n\n" + "The CLI can export Terraform HCL to use with released Terraform providers.\n" + "The Terraform HCL option generates `import {}` block statements for resources in the target environment.\n" + "Using Terraform `import {}` blocks, the platform's configuration can be generated and imported into state management.\n" + "More information can be found at https://developer.hashicorp.com/terraform/language/import", - Short: "Export configuration-as-code packages for the Ping Platform.", + Short: "Export Configuration as Code packages for the Ping Platform.", RunE: exportRunE, Use: "export [flags]", } @@ -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 836c6f65..1840781c 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", "--"+options.RequestServiceOption.CobraParamName, "pingone", "--"+options.RequestHTTPMethodOption.CobraParamName, "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/docs/exporting-configuration/hcl-export-compatibility.md b/docs/exporting-configuration/hcl-export-compatibility.md index b99eabb5..5adff050 100644 --- a/docs/exporting-configuration/hcl-export-compatibility.md +++ b/docs/exporting-configuration/hcl-export-compatibility.md @@ -1,7 +1,6 @@ # Ping CLI HCL Export Services Support -The platform export command exports configuration-as-code packages for the Ping Platform. The CLI can export -Terraform HCL to use with released Terraform providers. +The platform export command exports Configuration as Code packages for the Ping Platform. The CLI can export Terraform HCL to use with released Terraform providers. The following describes the CLI's support of each of these Ping platform services for HCL export. diff --git a/docs/exporting-configuration/native-export-compatibility.md b/docs/exporting-configuration/native-export-compatibility.md index 9488acb5..f1a6ef2e 100644 --- a/docs/exporting-configuration/native-export-compatibility.md +++ b/docs/exporting-configuration/native-export-compatibility.md @@ -1,7 +1,6 @@ # Ping CLI Native Export Services Support -The platform export command exports configuration-as-code packages for the Ping Platform. The CLI plans to export -natively from Ping platform services. +The platform export command exports Configuration as Code packages for the Ping Platform. The CLI plans to export natively from Ping platform services. The following describes the CLI's support of each of these Ping platform services for native export. diff --git a/docs/exporting-configuration/terraform-provider-compatibility.md b/docs/exporting-configuration/terraform-provider-compatibility.md index 707024de..7cbc20fc 100644 --- a/docs/exporting-configuration/terraform-provider-compatibility.md +++ b/docs/exporting-configuration/terraform-provider-compatibility.md @@ -1,7 +1,6 @@ # Ping CLI Platform Export Terraform Provider Support -The platform export command exports configuration-as-code packages for the Ping Platform. The CLI can export -Terraform HCL to use with released Terraform providers. +The platform export command exports Configuration as Code packages for the Ping Platform. The CLI can export Terraform HCL to use with released Terraform providers. See [HCL Export Compatibility](./hcl-export-compatibility.md) to learn more about which Ping platform services are supported in export. diff --git a/docs/tool-configuration/configuration-key.md b/docs/tool-configuration/configuration-key.md index a9bfd442..39dc8af5 100644 --- a/docs/tool-configuration/configuration-key.md +++ b/docs/tool-configuration/configuration-key.md @@ -26,7 +26,7 @@ The following parameters can be configured in Ping CLI's static configuration fi | service.pingfederate.authentication.type | ENUM_PINGFEDERATE_AUTH_TYPE | --pingfederate-authentication-type | The authentication type to use when connecting to the PingFederate admin API.

Options are: accessTokenAuth, basicAuth, clientCredentialsAuth.

Example: `basicAuth` | | service.pingfederate.caCertificatePemFiles | ENUM_STRING_SLICE | --pingfederate-ca-certificate-pem-files | Relative or full paths to PEM-encoded certificate files to be trusted as root CAs when connecting to the PingFederate server over HTTPS.

Accepts a comma-separated string to delimit multiple PEM files. | | service.pingfederate.httpsHost | ENUM_STRING | --pingfederate-https-host | The PingFederate HTTPS host used to communicate with PingFederate's admin API.

Example: `https://pingfederate-admin.bxretail.org` | -| service.pingfederate.insecureTrustAllTLS | ENUM_BOOL | --pingfederate-insecure-trust-all-tls | Trust any certificate when connecting to the PingFederate server admin API.

This is insecure and should not be enabled outside of testing. | +| service.pingfederate.insecureTrustAllTLS | ENUM_BOOL | --pingfederate-insecure-trust-all-tls | Trust any certificate when connecting to the PingFederate server admin API.

This is insecure and shouldn't be enabled outside of testing. | | service.pingfederate.xBypassExternalValidationHeader | ENUM_BOOL | --pingfederate-x-bypass-external-validation-header | Bypass connection tests when configuring PingFederate (the X-BypassExternalValidation header when using PingFederate's admin API). | | service.pingone.authentication.type | ENUM_PINGONE_AUTH_TYPE | --pingone-authentication-type | The authentication type to use to authenticate to the PingOne management API.

Options are: worker.

Example: `worker` | | service.pingone.authentication.worker.clientID | ENUM_UUID | --pingone-worker-client-id | The worker client ID used to authenticate to the PingOne management API. | @@ -40,7 +40,7 @@ The following parameters can be configured in Ping CLI's static configuration fi |---|---|---|---| | export.format | ENUM_STRING | --format / -f | Specifies the export format.

Options are: HCL.

Example: `HCL` | | export.outputDirectory | ENUM_STRING | --output-directory / -d | Specifies the output directory for export. Example: `$HOME/pingcli-export` | -| export.overwrite | ENUM_BOOL | --overwrite / -o | Overwrite the existing generated exports in output directory. | +| export.overwrite | ENUM_BOOL | --overwrite / -o | Overwrites the existing generated exports in output directory. | | export.pingone.environmentID | ENUM_UUID | --pingone-export-environment-id | The ID of the PingOne environment to export. Must be a valid PingOne UUID. | | export.serviceGroup | ENUM_EXPORT_SERVICE_GROUP | --service-group / -g | Specifies the service group to export.

Options are: pingone.

Example: `pingone` | | export.services | ENUM_EXPORT_SERVICES | --services / -s | Specifies the service(s) to export. Accepts a comma-separated string to delimit multiple services.

Options are: pingfederate, pingone-mfa, pingone-platform, pingone-protect, pingone-sso.

Example: `pingone-sso,pingone-mfa,pingfederate` | 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 fa1fb0e7..1cc51b3c 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 } @@ -118,7 +128,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 { @@ -133,7 +148,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) @@ -243,7 +261,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 } @@ -256,7 +274,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 @@ -303,22 +327,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 } @@ -326,5 +343,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..886654af 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, }, @@ -145,7 +145,7 @@ func initOverwriteOption() { Flag: &pflag.Flag{ Name: cobraParamName, Shorthand: "o", - Usage: "Overwrite the existing generated exports in output directory. " + + Usage: "Overwrites the existing generated exports in output directory. " + "(default false)", Value: cobraValue, NoOptDefVal: "true", // Make this flag a boolean flag 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/pingfederate.go b/internal/configuration/services/pingfederate.go index d8a9e080..53da7c23 100644 --- a/internal/configuration/services/pingfederate.go +++ b/internal/configuration/services/pingfederate.go @@ -138,7 +138,7 @@ func initInsecureTrustAllTLSOption() { Name: cobraParamName, Usage: "Trust any certificate when connecting to the PingFederate server admin API. " + "(default false)" + - "\nThis is insecure and should not be enabled outside of testing.", + "\nThis is insecure and shouldn't be enabled outside of testing.", Value: cobraValue, NoOptDefVal: "true", // Make this flag a boolean flag }, 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 8190ac98..feb076f8 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" @@ -15,7 +16,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 @@ -33,6 +34,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 } @@ -45,6 +47,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. @@ -58,7 +61,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 { @@ -66,7 +74,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 { @@ -80,6 +88,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..be0cb164 100644 --- a/internal/connector/exportable_resource.go +++ b/internal/connector/exportable_resource.go @@ -34,12 +34,12 @@ 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) }) - // Prefix resource names with pingcli-- - b.ResourceName = "pingcli--" + b.ResourceName + // Prefix resource names with pingcli__ + b.ResourceName = "pingcli__" + b.ResourceName } func (b *ImportBlock) Equals(a ImportBlock) bool { @@ -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/exportable_resource_test.go b/internal/connector/exportable_resource_test.go index 3e70dd70..f3ee7411 100644 --- a/internal/connector/exportable_resource_test.go +++ b/internal/connector/exportable_resource_test.go @@ -10,7 +10,7 @@ import ( // Test sanitization of resource name func TestSanitize(t *testing.T) { - sanitizedResourceName := "pingcli--Customer-0020-HTML-0020-Form-0020--0028-PF-0029-" + sanitizedResourceName := "pingcli__Customer-0020-HTML-0020-Form-0020--0028-PF-0029-" importBlock := connector.ImportBlock{ ResourceName: "Customer HTML Form (PF)", 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 e0a6bcc9..13cb6aac 100644 --- a/internal/customtypes/export_services.go +++ b/internal/customtypes/export_services.go @@ -48,8 +48,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, ", ")) @@ -58,7 +60,8 @@ func (es *ExportServices) Set(services string) error { slices.Sort(returnServiceList) - *es = ExportServices(returnServiceList) + *es = returnServiceList + return nil } @@ -152,5 +155,6 @@ func (es *ExportServices) Merge(es2 ExportServices) error { } slices.Sort(mergedServices) + return es.Set(strings.Join(mergedServices, ",")) } diff --git a/internal/customtypes/headers.go b/internal/customtypes/headers.go index 8419bb61..3bb4f4b4 100644 --- a/internal/customtypes/headers.go +++ b/internal/customtypes/headers.go @@ -11,6 +11,8 @@ import ( "github.com/spf13/pflag" ) +var headers []string + type Header struct { Key string Value string @@ -70,7 +72,6 @@ func (h HeaderSlice) String() string { return "" } - var headers []string for _, header := range h { headers = append(headers, fmt.Sprintf("%s:%s", header.Key, header.Value)) } @@ -83,7 +84,6 @@ func (h HeaderSlice) StringSlice() []string { return []string{} } - var headers []string for _, header := range h { headers = append(headers, fmt.Sprintf("%s:%s", header.Key, header.Value)) } 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 64d54413..023540b5 100644 --- a/main.go +++ b/main.go @@ -26,6 +26,7 @@ func main() { for _, setting := range info.Settings { if setting.Key == "vcs.revision" { commit = setting.Value + break } } @@ -55,5 +56,4 @@ func main() { } os.Exit(0) - } From 859df4cc7b3f0e450ced484ef0eaa7d393579568 Mon Sep 17 00:00:00 2001 From: wesleymccollam Date: Mon, 31 Mar 2025 16:28:49 -0400 Subject: [PATCH 3/7] disallow overriding of default Authorization header, edit header customtype function and flag options, add additional tests --- cmd/request/request.go | 2 +- cmd/request/request_test.go | 25 ++++++++++++++++++- internal/commands/request/request_internal.go | 8 ++---- internal/configuration/request/request.go | 7 +++--- internal/customtypes/headers.go | 23 ++++++++++------- 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/cmd/request/request.go b/cmd/request/request.go index 6868fe0c..5a614c2a 100644 --- a/cmd/request/request.go +++ b/cmd/request/request.go @@ -57,7 +57,7 @@ The command offers a cURL-like experience to interact with the Ping platform ser // --fail, -f cmd.Flags().AddFlag(options.RequestFailOption.Flag) - // --header, -H + // --header, -r cmd.Flags().AddFlag(options.RequestHeaderOption.Flag) // --http-method, -m diff --git a/cmd/request/request_test.go b/cmd/request/request_test.go index 1840781c..508823d9 100644 --- a/cmd/request/request_test.go +++ b/cmd/request/request_test.go @@ -131,9 +131,21 @@ func TestRequestCmd_Execute_HeaderFlag(t *testing.T) { testutils.CheckExpectedError(t, err, nil) } +// Test Request Command with Header Flag with and without spacing +func TestRequestCmd_Execute_HeaderFlagSpacing(t *testing.T) { + err := testutils_cobra.ExecutePingcli(t, "request", + "--"+options.RequestServiceOption.CobraParamName, "pingone", + "--"+options.RequestHTTPMethodOption.CobraParamName, "GET", + "--"+options.RequestHeaderOption.CobraParamName, "Test-Header:TestValue", + "--"+options.RequestHeaderOption.CobraParamName, "Test-Header:\tTestValue", + fmt.Sprintf("environments/%s/users", os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar)), + ) + testutils.CheckExpectedError(t, err, nil) +} + // Test Request Command with invalid Header Flag func TestRequestCmd_Execute_InvalidHeaderFlag(t *testing.T) { - expectedErrorPattern := `^invalid argument ".*" for "-H, --header" flag: failed to set Headers: Invalid header: invalid=header. Headers must be in the proper format$` + expectedErrorPattern := `^invalid argument ".*" for "-r, --header" flag: failed to set Headers: Invalid header: invalid=header. Headers must be in the proper format. Expected regex pattern: .*$` err := testutils_cobra.ExecutePingcli(t, "request", "--"+options.RequestServiceOption.CobraParamName, "pingone", "--"+options.RequestHeaderOption.CobraParamName, "invalid=header", @@ -141,3 +153,14 @@ func TestRequestCmd_Execute_InvalidHeaderFlag(t *testing.T) { ) testutils.CheckExpectedError(t, err, &expectedErrorPattern) } + +// Test Request Command with disallowed Authorization Header Flag +func TestRequestCmd_Execute_DisallowedAuthorizationFlag(t *testing.T) { + expectedErrorPattern := `^invalid argument ".*" for "-r, --header" flag: failed to set Headers: Invalid header: Authorization. Authorization header is not allowed$` + err := testutils_cobra.ExecutePingcli(t, "request", + "--"+options.RequestServiceOption.CobraParamName, "pingone", + "--"+options.RequestHeaderOption.CobraParamName, "Authorization: Bearer token", + fmt.Sprintf("environments/%s/populations", os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar)), + ) + testutils.CheckExpectedError(t, err, &expectedErrorPattern) +} diff --git a/internal/commands/request/request_internal.go b/internal/commands/request/request_internal.go index 1cc51b3c..733025b4 100644 --- a/internal/commands/request/request_internal.go +++ b/internal/commands/request/request_internal.go @@ -116,12 +116,8 @@ func runInternalPingOneRequest(uri string) (err error) { req.Header.Add("Content-Type", "application/json") } - // Set default authorization header if not provided - if req.Header.Get("Authorization") != "" { - output.Warn(fmt.Sprintf("'Authorization' header has been supplied via --%s flag. Default 'Authorization' header will not be used.", options.RequestHeaderOption.CobraParamName), nil) - } else { - req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", accessToken)) - } + // Set default authorization header + req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", accessToken)) res, err := client.Do(req) if err != nil { diff --git a/internal/configuration/request/request.go b/internal/configuration/request/request.go index c6b6f4e8..c81a7ec4 100644 --- a/internal/configuration/request/request.go +++ b/internal/configuration/request/request.go @@ -71,17 +71,16 @@ func initDataRawOption() { func initHeaderOption() { cobraParamName := "header" cobraValue := new(customtypes.HeaderSlice) - defaultValue := customtypes.StringSlice([]string{}) - envVar := "PINGCLI_REQUEST_HEADER" + defaultValue := customtypes.HeaderSlice{} options.RequestHeaderOption = options.Option{ CobraParamName: cobraParamName, CobraParamValue: cobraValue, DefaultValue: &defaultValue, - EnvVar: envVar, + EnvVar: "", // No environment variable Flag: &pflag.Flag{ Name: cobraParamName, - Shorthand: "H", + Shorthand: "r", Usage: fmt.Sprintf( "A custom header to send in the request." + "\nExample: --header \"Content-Type: application/vnd.pingidentity.user.import+json\"", diff --git a/internal/customtypes/headers.go b/internal/customtypes/headers.go index 3bb4f4b4..08bdad6a 100644 --- a/internal/customtypes/headers.go +++ b/internal/customtypes/headers.go @@ -23,17 +23,22 @@ type HeaderSlice []Header // Verify that the custom type satisfies the pflag.Value interface var _ pflag.Value = (*HeaderSlice)(nil) -func IsValidHeader(header string) (Header, bool) { - headerNameRegex := regexp.MustCompile(`(^[^\s]+):[\t ]{0,1}(.*)$`) +func NewHeader(header string) (*Header, error) { + regexPattern := `(^[^\s]+):[\t ]{0,1}(.*)$` + headerNameRegex := regexp.MustCompile(regexPattern) matches := headerNameRegex.FindStringSubmatch(header) if len(matches) != 3 { - return Header{}, false + return nil, fmt.Errorf("failed to set Headers: Invalid header: %s. Headers must be in the proper format. Expected regex pattern: %s", header, regexPattern) } - return Header{ + if matches[1] == "Authorization" { + return nil, fmt.Errorf("failed to set Headers: Invalid header: %s. Authorization header is not allowed", matches[1]) + } + + return &Header{ Key: matches[1], Value: matches[2], - }, true + }, nil } func (h *HeaderSlice) Set(val string) error { @@ -46,11 +51,11 @@ func (h *HeaderSlice) Set(val string) error { } else { valH := strings.SplitSeq(val, ",") for header := range valH { - headerVal, isValid := IsValidHeader(header) - if !isValid { - return fmt.Errorf("failed to set Headers: Invalid header: %s. Headers must be in the proper format", header) + headerVal, err := NewHeader(header) + if err != nil { + return err } - *h = append(*h, headerVal) + *h = append(*h, *headerVal) } } From 54dd14c1cdffec262daab6839d3d868e6ca71dcd Mon Sep 17 00:00:00 2001 From: wesleymccollam Date: Mon, 31 Mar 2025 16:42:22 -0400 Subject: [PATCH 4/7] simplify string method on customtypes slices --- internal/customtypes/headers.go | 10 +--------- internal/customtypes/string_slice.go | 6 +----- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/internal/customtypes/headers.go b/internal/customtypes/headers.go index 08bdad6a..01651e64 100644 --- a/internal/customtypes/headers.go +++ b/internal/customtypes/headers.go @@ -73,15 +73,7 @@ func (h HeaderSlice) Type() string { } func (h HeaderSlice) String() string { - if h == nil { - return "" - } - - for _, header := range h { - headers = append(headers, fmt.Sprintf("%s:%s", header.Key, header.Value)) - } - - return strings.Join(headers, ",") + return strings.Join(h.StringSlice(), ",") } func (h HeaderSlice) StringSlice() []string { diff --git a/internal/customtypes/string_slice.go b/internal/customtypes/string_slice.go index cb05097b..b3caf1f1 100644 --- a/internal/customtypes/string_slice.go +++ b/internal/customtypes/string_slice.go @@ -34,11 +34,7 @@ func (ss StringSlice) Type() string { } func (ss StringSlice) String() string { - if ss == nil { - return "" - } - - return strings.Join(ss, ",") + return strings.Join(ss.StringSlice(), ",") } func (ss StringSlice) StringSlice() []string { From ee383d41931c41c77a4c08a399549a471100637f Mon Sep 17 00:00:00 2001 From: wesleymccollam Date: Mon, 31 Mar 2025 16:43:22 -0400 Subject: [PATCH 5/7] update test error regex pattern --- internal/customtypes/headers_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/customtypes/headers_test.go b/internal/customtypes/headers_test.go index a58c5ed6..d27bab3b 100644 --- a/internal/customtypes/headers_test.go +++ b/internal/customtypes/headers_test.go @@ -25,7 +25,7 @@ func Test_Headers_Set_InvalidValue(t *testing.T) { hs := new(customtypes.HeaderSlice) invalidValue := "invalid=value" - expectedErrorPattern := `^failed to set Headers: Invalid header: .*\. Headers must be in the proper format$` + expectedErrorPattern := `^failed to set Headers: Invalid header: .*\. Headers must be in the proper format. Expected regex pattern: .*$` err := hs.Set(invalidValue) testutils.CheckExpectedError(t, err, &expectedErrorPattern) } From 026a567d5bbc0029ccb6ee28d17710acd9c4ecbd Mon Sep 17 00:00:00 2001 From: wesleymccollam Date: Mon, 31 Mar 2025 17:47:02 -0400 Subject: [PATCH 6/7] edit tests, stringslice method, default value type --- cmd/request/request_test.go | 2 +- internal/configuration/request/request.go | 2 +- internal/customtypes/headers.go | 6 ++++-- internal/customtypes/headers_test.go | 3 +-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cmd/request/request_test.go b/cmd/request/request_test.go index 508823d9..e7e63b8d 100644 --- a/cmd/request/request_test.go +++ b/cmd/request/request_test.go @@ -137,7 +137,7 @@ func TestRequestCmd_Execute_HeaderFlagSpacing(t *testing.T) { "--"+options.RequestServiceOption.CobraParamName, "pingone", "--"+options.RequestHTTPMethodOption.CobraParamName, "GET", "--"+options.RequestHeaderOption.CobraParamName, "Test-Header:TestValue", - "--"+options.RequestHeaderOption.CobraParamName, "Test-Header:\tTestValue", + "--"+options.RequestHeaderOption.CobraParamName, "Test-Header-Two:\tTestValue", fmt.Sprintf("environments/%s/users", os.Getenv(options.PingOneAuthenticationWorkerEnvironmentIDOption.EnvVar)), ) testutils.CheckExpectedError(t, err, nil) diff --git a/internal/configuration/request/request.go b/internal/configuration/request/request.go index c81a7ec4..c549733b 100644 --- a/internal/configuration/request/request.go +++ b/internal/configuration/request/request.go @@ -71,7 +71,7 @@ func initDataRawOption() { func initHeaderOption() { cobraParamName := "header" cobraValue := new(customtypes.HeaderSlice) - defaultValue := customtypes.HeaderSlice{} + defaultValue := customtypes.HeaderSlice([]customtypes.Header{}) options.RequestHeaderOption = options.Option{ CobraParamName: cobraParamName, diff --git a/internal/customtypes/headers.go b/internal/customtypes/headers.go index 01651e64..16192adf 100644 --- a/internal/customtypes/headers.go +++ b/internal/customtypes/headers.go @@ -6,13 +6,12 @@ import ( "fmt" "net/http" "regexp" + "slices" "strings" "github.com/spf13/pflag" ) -var headers []string - type Header struct { Key string Value string @@ -81,9 +80,12 @@ func (h HeaderSlice) StringSlice() []string { return []string{} } + headers := []string{} for _, header := range h { headers = append(headers, fmt.Sprintf("%s:%s", header.Key, header.Value)) } + slices.Sort(headers) + return headers } diff --git a/internal/customtypes/headers_test.go b/internal/customtypes/headers_test.go index d27bab3b..c5fc0764 100644 --- a/internal/customtypes/headers_test.go +++ b/internal/customtypes/headers_test.go @@ -34,8 +34,7 @@ func Test_Headers_Set_InvalidValue(t *testing.T) { func Test_Headers_Set_Nil(t *testing.T) { var hs *customtypes.HeaderSlice - service := customtypes.ENUM_EXPORT_SERVICE_PINGONE_MFA expectedErrorPattern := `^failed to set Headers value: .* Headers is nil$` - err := hs.Set(service) + err := hs.Set("key: value") testutils.CheckExpectedError(t, err, &expectedErrorPattern) } From 1b418c258acf13c3e60ca69b9ef6123714a129cb Mon Sep 17 00:00:00 2001 From: wesleymccollam Date: Mon, 31 Mar 2025 17:59:06 -0400 Subject: [PATCH 7/7] update type constructor function --- internal/customtypes/headers.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/customtypes/headers.go b/internal/customtypes/headers.go index 16192adf..e21b1847 100644 --- a/internal/customtypes/headers.go +++ b/internal/customtypes/headers.go @@ -22,19 +22,19 @@ type HeaderSlice []Header // Verify that the custom type satisfies the pflag.Value interface var _ pflag.Value = (*HeaderSlice)(nil) -func NewHeader(header string) (*Header, error) { +func NewHeader(header string) (Header, error) { regexPattern := `(^[^\s]+):[\t ]{0,1}(.*)$` headerNameRegex := regexp.MustCompile(regexPattern) matches := headerNameRegex.FindStringSubmatch(header) if len(matches) != 3 { - return nil, fmt.Errorf("failed to set Headers: Invalid header: %s. Headers must be in the proper format. Expected regex pattern: %s", header, regexPattern) + return Header{}, fmt.Errorf("failed to set Headers: Invalid header: %s. Headers must be in the proper format. Expected regex pattern: %s", header, regexPattern) } if matches[1] == "Authorization" { - return nil, fmt.Errorf("failed to set Headers: Invalid header: %s. Authorization header is not allowed", matches[1]) + return Header{}, fmt.Errorf("failed to set Headers: Invalid header: %s. Authorization header is not allowed", matches[1]) } - return &Header{ + return Header{ Key: matches[1], Value: matches[2], }, nil @@ -54,7 +54,7 @@ func (h *HeaderSlice) Set(val string) error { if err != nil { return err } - *h = append(*h, *headerVal) + *h = append(*h, headerVal) } }