Skip to content

Commit 7b5f42d

Browse files
authored
internal: Implement fwserver ReadResource testing and update proto6server testing (#360)
Reference: #215
1 parent 389ffc5 commit 7b5f42d

File tree

3 files changed

+464
-425
lines changed

3 files changed

+464
-425
lines changed

internal/fwserver/server_readresource_test.go

+213-14
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,79 @@ import (
77
"github.com/google/go-cmp/cmp"
88
"github.com/hashicorp/terraform-plugin-framework/diag"
99
"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"
1114
)
1215

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
2116
func TestServerReadResource(t *testing.T) {
2217
t.Parallel()
2318

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+
2469
testCases := map[string]struct {
2570
server *fwserver.Server
2671
request *fwserver.ReadResourceRequest
2772
expectedResponse *fwserver.ReadResourceResponse
2873
}{
29-
"currentstate-missing": {
74+
"nil": {
75+
server: &fwserver.Server{
76+
Provider: &testprovider.Provider{},
77+
},
78+
expectedResponse: &fwserver.ReadResourceResponse{},
79+
},
80+
"request-currentstate-missing": {
3081
server: &fwserver.Server{
31-
Provider: &emptyprovider.Provider{},
82+
Provider: &testprovider.Provider{},
3283
},
3384
request: &fwserver.ReadResourceRequest{},
3485
expectedResponse: &fwserver.ReadResourceResponse{
@@ -41,11 +92,159 @@ func TestServerReadResource(t *testing.T) {
4192
},
4293
},
4394
},
44-
"empty-provider": {
95+
"request-currentstate": {
4596
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,
47247
},
48-
expectedResponse: &fwserver.ReadResourceResponse{},
49248
},
50249
}
51250

0 commit comments

Comments
 (0)