diff --git a/internal/service/advancedcluster/resource_compatiblity.go b/internal/service/advancedcluster/resource_compatiblity.go index e12156dd41..4041edc8dc 100644 --- a/internal/service/advancedcluster/resource_compatiblity.go +++ b/internal/service/advancedcluster/resource_compatiblity.go @@ -94,7 +94,8 @@ func overrideAttributesWithPrevStateValue(modelIn, modelOut *TFModel) { return } beforeVersion := conversion.NilForUnknown(modelIn.MongoDBMajorVersion, modelIn.MongoDBMajorVersion.ValueStringPointer()) - if beforeVersion != nil && !modelIn.MongoDBMajorVersion.Equal(modelOut.MongoDBMajorVersion) { + afterVersion := conversion.NilForUnknown(modelOut.MongoDBMajorVersion, modelOut.MongoDBMajorVersion.ValueStringPointer()) + if beforeVersion != nil && afterVersion != nil && shouldUsePreviousMongoDBMajorVersion(*beforeVersion, *afterVersion) { modelOut.MongoDBMajorVersion = types.StringPointerValue(beforeVersion) } overrideMapStringWithPrevStateValue(&modelIn.Labels, &modelOut.Labels) @@ -109,6 +110,10 @@ func overrideAttributesWithPrevStateValue(modelIn, modelOut *TFModel) { modelOut.UseEffectiveFields = modelIn.UseEffectiveFields } +func shouldUsePreviousMongoDBMajorVersion(beforeVersion, afterVersion string) bool { + return beforeVersion != afterVersion && FormatMongoDBMajorVersion(beforeVersion) == FormatMongoDBMajorVersion(afterVersion) +} + func overrideMapStringWithPrevStateValue(mapIn, mapOut *types.Map) { if mapIn == nil || mapOut == nil || len(mapOut.Elements()) > 0 { return diff --git a/internal/service/advancedcluster/resource_compatiblity_test.go b/internal/service/advancedcluster/resource_compatiblity_test.go new file mode 100644 index 0000000000..9e655ae385 --- /dev/null +++ b/internal/service/advancedcluster/resource_compatiblity_test.go @@ -0,0 +1,50 @@ +package advancedcluster + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-framework/types" +) + +func TestOverrideAttributesWithPrevStateValueMongoDBMajorVersion(t *testing.T) { + testCases := []struct { + name string + before string + after string + expected string + }{ + { + name: "keeps previous version when only formatting differs", + before: "8", + after: "8.0", + expected: "8", + }, + { + name: "uses API value when major version actually changed", + before: "7.0", + after: "8.0", + expected: "8.0", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + modelIn := &TFModel{ + MongoDBMajorVersion: types.StringValue(tc.before), + Labels: types.MapNull(types.StringType), + Tags: types.MapNull(types.StringType), + } + modelOut := &TFModel{ + MongoDBMajorVersion: types.StringValue(tc.after), + Labels: types.MapNull(types.StringType), + Tags: types.MapNull(types.StringType), + } + + overrideAttributesWithPrevStateValue(modelIn, modelOut) + + if got := modelOut.MongoDBMajorVersion.ValueString(); got != tc.expected { + t.Fatalf("unexpected mongo_db_major_version: got %q want %q", got, tc.expected) + } + }) + } +}