@@ -7,28 +7,79 @@ import (
7
7
"github.com/google/go-cmp/cmp"
8
8
"github.com/hashicorp/terraform-plugin-framework/diag"
9
9
"github.com/hashicorp/terraform-plugin-framework/internal/fwserver"
10
- "github.com/hashicorp/terraform-plugin-framework/internal/testing/emptyprovider"
10
+ "github.com/hashicorp/terraform-plugin-framework/internal/testing/testprovider"
11
+ "github.com/hashicorp/terraform-plugin-framework/tfsdk"
12
+ "github.com/hashicorp/terraform-plugin-framework/types"
13
+ "github.com/hashicorp/terraform-plugin-go/tftypes"
11
14
)
12
15
13
- // TODO: Migrate tfsdk.Provider bits of proto6server.testProviderServer to
14
- // new internal/testing/provider.Provider that allows customization of all
15
- // method implementations via struct fields. Then, create additional test
16
- // cases in this unit test.
17
- //
18
- // For now this testing is covered by proto6server.ReadResource.
19
- //
20
- // Reference: https://github.com/hashicorp/terraform-plugin-framework/issues/215
21
16
func TestServerReadResource (t * testing.T ) {
22
17
t .Parallel ()
23
18
19
+ testType := tftypes.Object {
20
+ AttributeTypes : map [string ]tftypes.Type {
21
+ "test_computed" : tftypes .String ,
22
+ "test_required" : tftypes .String ,
23
+ },
24
+ }
25
+
26
+ testCurrentStateValue := tftypes .NewValue (testType , map [string ]tftypes.Value {
27
+ "test_computed" : tftypes .NewValue (tftypes .String , nil ),
28
+ "test_required" : tftypes .NewValue (tftypes .String , "test-currentstate-value" ),
29
+ })
30
+
31
+ testNewStateValue := tftypes .NewValue (testType , map [string ]tftypes.Value {
32
+ "test_computed" : tftypes .NewValue (tftypes .String , "test-newstate-value" ),
33
+ "test_required" : tftypes .NewValue (tftypes .String , "test-currentstate-value" ),
34
+ })
35
+
36
+ testSchema := tfsdk.Schema {
37
+ Attributes : map [string ]tfsdk.Attribute {
38
+ "test_computed" : {
39
+ Computed : true ,
40
+ Type : types .StringType ,
41
+ },
42
+ "test_required" : {
43
+ Required : true ,
44
+ Type : types .StringType ,
45
+ },
46
+ },
47
+ }
48
+
49
+ testConfig := & tfsdk.Config {
50
+ Raw : testCurrentStateValue ,
51
+ Schema : testSchema ,
52
+ }
53
+
54
+ testCurrentState := & tfsdk.State {
55
+ Raw : testCurrentStateValue ,
56
+ Schema : testSchema ,
57
+ }
58
+
59
+ testNewState := & tfsdk.State {
60
+ Raw : testNewStateValue ,
61
+ Schema : testSchema ,
62
+ }
63
+
64
+ testNewStateRemoved := & tfsdk.State {
65
+ Raw : tftypes .NewValue (testType , nil ),
66
+ Schema : testSchema ,
67
+ }
68
+
24
69
testCases := map [string ]struct {
25
70
server * fwserver.Server
26
71
request * fwserver.ReadResourceRequest
27
72
expectedResponse * fwserver.ReadResourceResponse
28
73
}{
29
- "currentstate-missing" : {
74
+ "nil" : {
75
+ server : & fwserver.Server {
76
+ Provider : & testprovider.Provider {},
77
+ },
78
+ expectedResponse : & fwserver.ReadResourceResponse {},
79
+ },
80
+ "request-currentstate-missing" : {
30
81
server : & fwserver.Server {
31
- Provider : & emptyprovider .Provider {},
82
+ Provider : & testprovider .Provider {},
32
83
},
33
84
request : & fwserver.ReadResourceRequest {},
34
85
expectedResponse : & fwserver.ReadResourceResponse {
@@ -41,11 +92,159 @@ func TestServerReadResource(t *testing.T) {
41
92
},
42
93
},
43
94
},
44
- "empty-provider " : {
95
+ "request-currentstate " : {
45
96
server : & fwserver.Server {
46
- Provider : & emptyprovider.Provider {},
97
+ Provider : & testprovider.Provider {},
98
+ },
99
+ request : & fwserver.ReadResourceRequest {
100
+ CurrentState : testCurrentState ,
101
+ ResourceType : & testprovider.ResourceType {
102
+ GetSchemaMethod : func (_ context.Context ) (tfsdk.Schema , diag.Diagnostics ) {
103
+ return testSchema , nil
104
+ },
105
+ NewResourceMethod : func (_ context.Context , _ tfsdk.Provider ) (tfsdk.Resource , diag.Diagnostics ) {
106
+ return & testprovider.Resource {
107
+ ReadMethod : func (ctx context.Context , req tfsdk.ReadResourceRequest , resp * tfsdk.ReadResourceResponse ) {
108
+ var data struct {
109
+ TestComputed types.String `tfsdk:"test_computed"`
110
+ TestRequired types.String `tfsdk:"test_required"`
111
+ }
112
+
113
+ resp .Diagnostics .Append (req .State .Get (ctx , & data )... )
114
+
115
+ if data .TestRequired .Value != "test-currentstate-value" {
116
+ resp .Diagnostics .AddError ("unexpected req.State value: %s" , data .TestRequired .Value )
117
+ }
118
+ },
119
+ }, nil
120
+ },
121
+ },
122
+ },
123
+ expectedResponse : & fwserver.ReadResourceResponse {
124
+ NewState : testCurrentState ,
125
+ },
126
+ },
127
+ "request-providermeta" : {
128
+ server : & fwserver.Server {
129
+ Provider : & testprovider.Provider {},
130
+ },
131
+ request : & fwserver.ReadResourceRequest {
132
+ CurrentState : testCurrentState ,
133
+ ResourceType : & testprovider.ResourceType {
134
+ GetSchemaMethod : func (_ context.Context ) (tfsdk.Schema , diag.Diagnostics ) {
135
+ return testSchema , nil
136
+ },
137
+ NewResourceMethod : func (_ context.Context , _ tfsdk.Provider ) (tfsdk.Resource , diag.Diagnostics ) {
138
+ return & testprovider.Resource {
139
+ ReadMethod : func (ctx context.Context , req tfsdk.ReadResourceRequest , resp * tfsdk.ReadResourceResponse ) {
140
+ var config struct {
141
+ TestComputed types.String `tfsdk:"test_computed"`
142
+ TestRequired types.String `tfsdk:"test_required"`
143
+ }
144
+
145
+ resp .Diagnostics .Append (req .ProviderMeta .Get (ctx , & config )... )
146
+
147
+ if config .TestRequired .Value != "test-currentstate-value" {
148
+ resp .Diagnostics .AddError ("unexpected req.ProviderMeta value: %s" , config .TestRequired .Value )
149
+ }
150
+ },
151
+ }, nil
152
+ },
153
+ },
154
+ ProviderMeta : testConfig ,
155
+ },
156
+ expectedResponse : & fwserver.ReadResourceResponse {
157
+ NewState : testCurrentState ,
158
+ },
159
+ },
160
+ "response-diagnostics" : {
161
+ server : & fwserver.Server {
162
+ Provider : & testprovider.Provider {},
163
+ },
164
+ request : & fwserver.ReadResourceRequest {
165
+ CurrentState : testCurrentState ,
166
+ ResourceType : & testprovider.ResourceType {
167
+ GetSchemaMethod : func (_ context.Context ) (tfsdk.Schema , diag.Diagnostics ) {
168
+ return testSchema , nil
169
+ },
170
+ NewResourceMethod : func (_ context.Context , _ tfsdk.Provider ) (tfsdk.Resource , diag.Diagnostics ) {
171
+ return & testprovider.Resource {
172
+ ReadMethod : func (ctx context.Context , req tfsdk.ReadResourceRequest , resp * tfsdk.ReadResourceResponse ) {
173
+ resp .Diagnostics .AddWarning ("warning summary" , "warning detail" )
174
+ resp .Diagnostics .AddError ("error summary" , "error detail" )
175
+ },
176
+ }, nil
177
+ },
178
+ },
179
+ },
180
+ expectedResponse : & fwserver.ReadResourceResponse {
181
+ Diagnostics : diag.Diagnostics {
182
+ diag .NewWarningDiagnostic (
183
+ "warning summary" ,
184
+ "warning detail" ,
185
+ ),
186
+ diag .NewErrorDiagnostic (
187
+ "error summary" ,
188
+ "error detail" ,
189
+ ),
190
+ },
191
+ NewState : testCurrentState ,
192
+ },
193
+ },
194
+ "response-state" : {
195
+ server : & fwserver.Server {
196
+ Provider : & testprovider.Provider {},
197
+ },
198
+ request : & fwserver.ReadResourceRequest {
199
+ CurrentState : testCurrentState ,
200
+ ResourceType : & testprovider.ResourceType {
201
+ GetSchemaMethod : func (_ context.Context ) (tfsdk.Schema , diag.Diagnostics ) {
202
+ return testSchema , nil
203
+ },
204
+ NewResourceMethod : func (_ context.Context , _ tfsdk.Provider ) (tfsdk.Resource , diag.Diagnostics ) {
205
+ return & testprovider.Resource {
206
+ ReadMethod : func (ctx context.Context , req tfsdk.ReadResourceRequest , resp * tfsdk.ReadResourceResponse ) {
207
+ var data struct {
208
+ TestComputed types.String `tfsdk:"test_computed"`
209
+ TestRequired types.String `tfsdk:"test_required"`
210
+ }
211
+
212
+ resp .Diagnostics .Append (req .State .Get (ctx , & data )... )
213
+
214
+ data .TestComputed = types.String {Value : "test-newstate-value" }
215
+
216
+ resp .Diagnostics .Append (resp .State .Set (ctx , & data )... )
217
+ },
218
+ }, nil
219
+ },
220
+ },
221
+ },
222
+ expectedResponse : & fwserver.ReadResourceResponse {
223
+ NewState : testNewState ,
224
+ },
225
+ },
226
+ "response-state-removeresource" : {
227
+ server : & fwserver.Server {
228
+ Provider : & testprovider.Provider {},
229
+ },
230
+ request : & fwserver.ReadResourceRequest {
231
+ CurrentState : testCurrentState ,
232
+ ResourceType : & testprovider.ResourceType {
233
+ GetSchemaMethod : func (_ context.Context ) (tfsdk.Schema , diag.Diagnostics ) {
234
+ return testSchema , nil
235
+ },
236
+ NewResourceMethod : func (_ context.Context , _ tfsdk.Provider ) (tfsdk.Resource , diag.Diagnostics ) {
237
+ return & testprovider.Resource {
238
+ ReadMethod : func (ctx context.Context , req tfsdk.ReadResourceRequest , resp * tfsdk.ReadResourceResponse ) {
239
+ resp .State .RemoveResource (ctx )
240
+ },
241
+ }, nil
242
+ },
243
+ },
244
+ },
245
+ expectedResponse : & fwserver.ReadResourceResponse {
246
+ NewState : testNewStateRemoved ,
47
247
},
48
- expectedResponse : & fwserver.ReadResourceResponse {},
49
248
},
50
249
}
51
250
0 commit comments