@@ -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/listplanmodifier"
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 TestUseStateForUnknownModifierPlanModifyList (t * testing.T ) {
@@ -26,6 +27,16 @@ func TestUseStateForUnknownModifierPlanModifyList(t *testing.T) {
2627 // when we first create the resource, use the unknown
2728 // value
2829 request : planmodifier.ListRequest {
30+ State : tfsdk.State {
31+ Raw : tftypes .NewValue (
32+ tftypes.Object {
33+ AttributeTypes : map [string ]tftypes.Type {
34+ "attr" : tftypes.List {ElementType : tftypes .String },
35+ },
36+ },
37+ nil ,
38+ ),
39+ },
2940 StateValue : types .ListNull (types .StringType ),
3041 PlanValue : types .ListUnknown (types .StringType ),
3142 ConfigValue : types .ListNull (types .StringType ),
@@ -42,6 +53,23 @@ func TestUseStateForUnknownModifierPlanModifyList(t *testing.T) {
4253 // but we still want to preserve that value, in this
4354 // case
4455 request : planmodifier.ListRequest {
56+ State : tfsdk.State {
57+ Raw : tftypes .NewValue (
58+ tftypes.Object {
59+ AttributeTypes : map [string ]tftypes.Type {
60+ "attr" : tftypes.List {ElementType : tftypes .String },
61+ },
62+ },
63+ map [string ]tftypes.Value {
64+ "attr" : tftypes .NewValue (
65+ tftypes.List {ElementType : tftypes .String },
66+ []tftypes.Value {
67+ tftypes .NewValue (tftypes .String , "other" ),
68+ },
69+ ),
70+ },
71+ ),
72+ },
4573 StateValue : types .ListValueMust (types .StringType , []attr.Value {types .StringValue ("other" )}),
4674 PlanValue : types .ListValueMust (types .StringType , []attr.Value {types .StringValue ("test" )}),
4775 ConfigValue : types .ListNull (types .StringType ),
@@ -50,10 +78,27 @@ func TestUseStateForUnknownModifierPlanModifyList(t *testing.T) {
5078 PlanValue : types .ListValueMust (types .StringType , []attr.Value {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.ListRequest {
85+ State : tfsdk.State {
86+ Raw : tftypes .NewValue (
87+ tftypes.Object {
88+ AttributeTypes : map [string ]tftypes.Type {
89+ "attr" : tftypes.List {ElementType : tftypes .String },
90+ },
91+ },
92+ map [string ]tftypes.Value {
93+ "attr" : tftypes .NewValue (
94+ tftypes.List {ElementType : tftypes .String },
95+ []tftypes.Value {
96+ tftypes .NewValue (tftypes .String , "test" ),
97+ },
98+ ),
99+ },
100+ ),
101+ },
57102 StateValue : types .ListValueMust (types .StringType , []attr.Value {types .StringValue ("test" )}),
58103 PlanValue : types .ListUnknown (types .StringType ),
59104 ConfigValue : types .ListNull (types .StringType ),
@@ -62,6 +107,32 @@ func TestUseStateForUnknownModifierPlanModifyList(t *testing.T) {
62107 PlanValue : types .ListValueMust (types .StringType , []attr.Value {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.ListRequest {
113+ State : tfsdk.State {
114+ Raw : tftypes .NewValue (
115+ tftypes.Object {
116+ AttributeTypes : map [string ]tftypes.Type {
117+ "attr" : tftypes.List {ElementType : tftypes .String },
118+ },
119+ },
120+ map [string ]tftypes.Value {
121+ "attr" : tftypes .NewValue (
122+ tftypes.List {ElementType : tftypes .String },
123+ nil ,
124+ ),
125+ },
126+ ),
127+ },
128+ StateValue : types .ListNull (types .StringType ),
129+ PlanValue : types .ListUnknown (types .StringType ),
130+ ConfigValue : types .ListNull (types .StringType ),
131+ },
132+ expected : & planmodifier.ListResponse {
133+ PlanValue : types .ListNull (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 TestUseStateForUnknownModifierPlanModifyList(t *testing.T) {
78149 PlanValue : types .ListUnknown (types .StringType ),
79150 },
80151 },
81- "under-list" : {
82- request : planmodifier.ListRequest {
83- ConfigValue : types .ListNull (types .StringType ),
84- Path : path .Root ("test" ).AtListIndex (0 ).AtName ("nested_test" ),
85- PlanValue : types .ListUnknown (types .StringType ),
86- StateValue : types .ListNull (types .StringType ),
87- },
88- expected : & planmodifier.ListResponse {
89- PlanValue : types .ListUnknown (types .StringType ),
90- },
91- },
92- "under-set" : {
93- request : planmodifier.ListRequest {
94- ConfigValue : types .ListNull (types .StringType ),
95- Path : path .Root ("test" ).AtSetValue (
96- types .SetValueMust (
97- types.ObjectType {
98- AttrTypes : map [string ]attr.Type {
99- "nested_test" : types.ListType {ElemType : types .StringType },
100- },
101- },
102- []attr.Value {
103- types .ObjectValueMust (
104- map [string ]attr.Type {
105- "nested_test" : types.ListType {ElemType : types .StringType },
106- },
107- map [string ]attr.Value {
108- "nested_test" : types .ListUnknown (types .StringType ),
109- },
110- ),
111- },
112- ),
113- ).AtName ("nested_test" ),
114- PlanValue : types .ListUnknown (types .StringType ),
115- StateValue : types .ListNull (types .StringType ),
116- },
117- expected : & planmodifier.ListResponse {
118- PlanValue : types .ListUnknown (types .StringType ),
119- },
120- },
121152 }
122153
123154 for name , testCase := range testCases {
0 commit comments