@@ -9,10 +9,11 @@ import (
99
1010 "github.com/google/go-cmp/cmp"
1111 "github.com/hashicorp/terraform-plugin-framework/attr"
12- "github.com/hashicorp/terraform-plugin-framework/path"
1312 "github.com/hashicorp/terraform-plugin-framework/resource/schema/objectplanmodifier"
1413 "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
14+ "github.com/hashicorp/terraform-plugin-framework/tfsdk"
1515 "github.com/hashicorp/terraform-plugin-framework/types"
16+ "github.com/hashicorp/terraform-plugin-go/tftypes"
1617)
1718
1819func TestUseStateForUnknownModifierPlanModifyObject (t * testing.T ) {
@@ -26,6 +27,16 @@ func TestUseStateForUnknownModifierPlanModifyObject(t *testing.T) {
2627 // when we first create the resource, use the unknown
2728 // value
2829 request : planmodifier.ObjectRequest {
30+ State : tfsdk.State {
31+ Raw : tftypes .NewValue (
32+ tftypes.Object {
33+ AttributeTypes : map [string ]tftypes.Type {
34+ "attr" : tftypes.Object {AttributeTypes : map [string ]tftypes.Type {"testattr" : tftypes .String }},
35+ },
36+ },
37+ nil ,
38+ ),
39+ },
2940 StateValue : types .ObjectNull (map [string ]attr.Type {"testattr" : types .StringType }),
3041 PlanValue : types .ObjectUnknown (map [string ]attr.Type {"testattr" : types .StringType }),
3142 ConfigValue : types .ObjectNull (map [string ]attr.Type {"testattr" : types .StringType }),
@@ -42,6 +53,23 @@ func TestUseStateForUnknownModifierPlanModifyObject(t *testing.T) {
4253 // but we still want to preserve that value, in this
4354 // case
4455 request : planmodifier.ObjectRequest {
56+ State : tfsdk.State {
57+ Raw : tftypes .NewValue (
58+ tftypes.Object {
59+ AttributeTypes : map [string ]tftypes.Type {
60+ "attr" : tftypes.Object {AttributeTypes : map [string ]tftypes.Type {"testattr" : tftypes .String }},
61+ },
62+ },
63+ map [string ]tftypes.Value {
64+ "attr" : tftypes .NewValue (
65+ tftypes.Object {AttributeTypes : map [string ]tftypes.Type {"testattr" : tftypes .String }},
66+ map [string ]tftypes.Value {
67+ "testattr" : tftypes .NewValue (tftypes .String , "other" ),
68+ },
69+ ),
70+ },
71+ ),
72+ },
4573 StateValue : types .ObjectValueMust (map [string ]attr.Type {"testattr" : types .StringType }, map [string ]attr.Value {"testattr" : types .StringValue ("other" )}),
4674 PlanValue : types .ObjectValueMust (map [string ]attr.Type {"testattr" : types .StringType }, map [string ]attr.Value {"testattr" : types .StringValue ("test" )}),
4775 ConfigValue : types .ObjectNull (map [string ]attr.Type {"testattr" : types .StringType }),
@@ -50,10 +78,27 @@ func TestUseStateForUnknownModifierPlanModifyObject(t *testing.T) {
5078 PlanValue : types .ObjectValueMust (map [string ]attr.Type {"testattr" : types .StringType }, map [string ]attr.Value {"testattr" : types .StringValue ("test" )}),
5179 },
5280 },
53- "non-null-state-unknown-plan" : {
81+ "non-null-state-value- unknown-plan" : {
5482 // this is the situation we want to preserve the state
5583 // in
5684 request : planmodifier.ObjectRequest {
85+ State : tfsdk.State {
86+ Raw : tftypes .NewValue (
87+ tftypes.Object {
88+ AttributeTypes : map [string ]tftypes.Type {
89+ "attr" : tftypes.Object {AttributeTypes : map [string ]tftypes.Type {"testattr" : tftypes .String }},
90+ },
91+ },
92+ map [string ]tftypes.Value {
93+ "attr" : tftypes .NewValue (
94+ tftypes.Object {AttributeTypes : map [string ]tftypes.Type {"testattr" : tftypes .String }},
95+ map [string ]tftypes.Value {
96+ "testattr" : tftypes .NewValue (tftypes .String , "test" ),
97+ },
98+ ),
99+ },
100+ ),
101+ },
57102 StateValue : types .ObjectValueMust (map [string ]attr.Type {"testattr" : types .StringType }, map [string ]attr.Value {"testattr" : types .StringValue ("test" )}),
58103 PlanValue : types .ObjectUnknown (map [string ]attr.Type {"testattr" : types .StringType }),
59104 ConfigValue : types .ObjectNull (map [string ]attr.Type {"testattr" : types .StringType }),
@@ -62,6 +107,32 @@ func TestUseStateForUnknownModifierPlanModifyObject(t *testing.T) {
62107 PlanValue : types .ObjectValueMust (map [string ]attr.Type {"testattr" : types .StringType }, map [string ]attr.Value {"testattr" : types .StringValue ("test" )}),
63108 },
64109 },
110+ "null-state-value-unknown-plan" : {
111+ // Null state values are still known, so we should preserve this as well.
112+ request : planmodifier.ObjectRequest {
113+ State : tfsdk.State {
114+ Raw : tftypes .NewValue (
115+ tftypes.Object {
116+ AttributeTypes : map [string ]tftypes.Type {
117+ "attr" : tftypes.Object {AttributeTypes : map [string ]tftypes.Type {"testattr" : tftypes .String }},
118+ },
119+ },
120+ map [string ]tftypes.Value {
121+ "attr" : tftypes .NewValue (
122+ tftypes.Object {AttributeTypes : map [string ]tftypes.Type {"testattr" : tftypes .String }},
123+ nil ,
124+ ),
125+ },
126+ ),
127+ },
128+ StateValue : types .ObjectNull (map [string ]attr.Type {"testattr" : types .StringType }),
129+ PlanValue : types .ObjectUnknown (map [string ]attr.Type {"testattr" : types .StringType }),
130+ ConfigValue : types .ObjectNull (map [string ]attr.Type {"testattr" : types .StringType }),
131+ },
132+ expected : & planmodifier.ObjectResponse {
133+ PlanValue : types .ObjectNull (map [string ]attr.Type {"testattr" : types .StringType }),
134+ },
135+ },
65136 "unknown-config" : {
66137 // this is the situation in which a user is
67138 // interpolating into a field. We want that to still
@@ -78,46 +149,6 @@ func TestUseStateForUnknownModifierPlanModifyObject(t *testing.T) {
78149 PlanValue : types .ObjectUnknown (map [string ]attr.Type {"testattr" : types .StringType }),
79150 },
80151 },
81- "under-list" : {
82- request : planmodifier.ObjectRequest {
83- ConfigValue : types .ObjectNull (map [string ]attr.Type {"testattr" : types .StringType }),
84- Path : path .Root ("test" ).AtListIndex (0 ).AtName ("nested_test" ),
85- PlanValue : types .ObjectUnknown (map [string ]attr.Type {"testattr" : types .StringType }),
86- StateValue : types .ObjectNull (map [string ]attr.Type {"testattr" : types .StringType }),
87- },
88- expected : & planmodifier.ObjectResponse {
89- PlanValue : types .ObjectUnknown (map [string ]attr.Type {"testattr" : types .StringType }),
90- },
91- },
92- "under-set" : {
93- request : planmodifier.ObjectRequest {
94- ConfigValue : types .ObjectNull (map [string ]attr.Type {"testattr" : types .StringType }),
95- Path : path .Root ("test" ).AtSetValue (
96- types .SetValueMust (
97- types.ObjectType {
98- AttrTypes : map [string ]attr.Type {
99- "nested_test" : types.ObjectType {AttrTypes : map [string ]attr.Type {"testattr" : types .StringType }},
100- },
101- },
102- []attr.Value {
103- types .ObjectValueMust (
104- map [string ]attr.Type {
105- "nested_test" : types.ObjectType {AttrTypes : map [string ]attr.Type {"testattr" : types .StringType }},
106- },
107- map [string ]attr.Value {
108- "nested_test" : types .ObjectUnknown (map [string ]attr.Type {"testattr" : types .StringType }),
109- },
110- ),
111- },
112- ),
113- ).AtName ("nested_test" ),
114- PlanValue : types .ObjectUnknown (map [string ]attr.Type {"testattr" : types .StringType }),
115- StateValue : types .ObjectNull (map [string ]attr.Type {"testattr" : types .StringType }),
116- },
117- expected : & planmodifier.ObjectResponse {
118- PlanValue : types .ObjectUnknown (map [string ]attr.Type {"testattr" : types .StringType }),
119- },
120- },
121152 }
122153
123154 for name , testCase := range testCases {
0 commit comments