diff --git a/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/dataworkarounds/workaround_web_40128.go b/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/dataworkarounds/workaround_web_40128.go new file mode 100644 index 0000000000..1e28e13d98 --- /dev/null +++ b/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/dataworkarounds/workaround_web_40128.go @@ -0,0 +1,59 @@ +// Copyright IBM Corp. 2023, 2026 +// SPDX-License-Identifier: MPL-2.0 + +package dataworkarounds + +import ( + "errors" + + sdkModels "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" +) + +var _ workaround = workaroundWeb40128{} + +type workaroundWeb40128 struct{} + +func (workaroundWeb40128) IsApplicable(serviceName string, apiVersion sdkModels.APIVersion) bool { + if serviceName != "Web" { + return false + } + + switch apiVersion.APIVersion { + case "2023-01-01", "2023-12-01", "2024-11-01", "2025-05-01": + return true + } + + return false +} + +func (workaroundWeb40128) Name() string { + return "Web / 40128" +} + +func (workaroundWeb40128) Process(input sdkModels.APIVersion) (*sdkModels.APIVersion, error) { + resource, ok := input.Resources["WebApps"] + if !ok { + return nil, errors.New("expected a resource named `WebApps` but didn't get one") + } + + model, ok := resource.Models["AzureStorageInfoValue"] + if !ok { + return nil, errors.New("expected a model named `AzureStorageInfoValue` but didn't get one") + } + + if _, ok := model.Fields["Endpoint"]; ok { + return nil, errors.New("found a field named `Endpoint` but expected none, this workaround can be removed") + } + + model.Fields["Endpoint"] = sdkModels.SDKField{ + JsonName: "endpoint", + ObjectDefinition: sdkModels.SDKObjectDefinition{ + Type: sdkModels.StringSDKObjectDefinitionType, + }, + Optional: true, + } + resource.Models["AzureStorageInfoValue"] = model + input.Resources["WebApps"] = resource + + return &input, nil +} diff --git a/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/dataworkarounds/workaround_web_40128_test.go b/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/dataworkarounds/workaround_web_40128_test.go new file mode 100644 index 0000000000..f70450ed4e --- /dev/null +++ b/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/dataworkarounds/workaround_web_40128_test.go @@ -0,0 +1,68 @@ +// Copyright IBM Corp. 2023, 2026 +// SPDX-License-Identifier: MPL-2.0 + +package dataworkarounds + +import ( + "testing" + + sdkModels "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" +) + +func TestWorkaroundWeb40128(t *testing.T) { + versions := []string{"2023-01-01", "2023-12-01", "2024-11-01", "2025-05-01"} + + for _, version := range versions { + t.Run(version, func(t *testing.T) { + input := sdkModels.APIVersion{ + APIVersion: version, + Resources: map[string]sdkModels.APIResource{ + "WebApps": { + Models: map[string]sdkModels.SDKModel{ + "AzureStorageInfoValue": { + Fields: map[string]sdkModels.SDKField{}, + }, + }, + }, + }, + } + + workaround := workaroundWeb40128{} + if !workaround.IsApplicable("Web", input) { + t.Fatalf("expected workaround to apply to Web %q", version) + } + + result, err := workaround.Process(input) + if err != nil { + t.Fatalf("processing workaround: %+v", err) + } + + field := result.Resources["WebApps"].Models["AzureStorageInfoValue"].Fields["Endpoint"] + if field.JsonName != "endpoint" { + t.Errorf("expected JsonName to be %q, got %q", "endpoint", field.JsonName) + } + if !field.Optional { + t.Error("expected Endpoint to be optional") + } + if field.ObjectDefinition.Type != sdkModels.StringSDKObjectDefinitionType { + t.Errorf("expected Endpoint to be a string, got %q", field.ObjectDefinition.Type) + } + }) + } +} + +func TestWorkaroundWeb40128IsNotApplicable(t *testing.T) { + workaround := workaroundWeb40128{} + + for _, test := range []struct { + service string + version string + }{ + {service: "Compute", version: "2023-12-01"}, + {service: "Web", version: "2016-06-01"}, + } { + if workaround.IsApplicable(test.service, sdkModels.APIVersion{APIVersion: test.version}) { + t.Errorf("expected workaround not to apply to %s %s", test.service, test.version) + } + } +} diff --git a/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/dataworkarounds/workarounds.go b/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/dataworkarounds/workarounds.go index 42d510fae2..c9ac38f1df 100644 --- a/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/dataworkarounds/workarounds.go +++ b/tools/importer-rest-api-specs/internal/components/apidefinitions/parser/dataworkarounds/workarounds.go @@ -57,6 +57,7 @@ var workarounds = []workaround{ workaroundSubscriptions20254{}, workaroundWeb14529{}, workaroundWeb31682{}, + workaroundWeb40128{}, WorkaroundWeb43978{}, // Special Case for Network duplicated Enum