Skip to content

Commit 98c3e2f

Browse files
committed
fixup! fixup! Check that a ListResource type has a matching Resource type
1 parent f74e230 commit 98c3e2f

File tree

6 files changed

+125
-20
lines changed

6 files changed

+125
-20
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package testprovider
5+
6+
import (
7+
"context"
8+
9+
"github.com/hashicorp/terraform-plugin-framework/list"
10+
"github.com/hashicorp/terraform-plugin-framework/resource"
11+
)
12+
13+
var _ list.ListResource = &ListResource{}
14+
15+
// Declarative list.ListResource for unit testing.
16+
type ListResource struct {
17+
// ListResource interface methods
18+
MetadataMethod func(context.Context, resource.MetadataRequest, *resource.MetadataResponse)
19+
ListResourceConfigSchemaMethod func(context.Context, list.ListResourceSchemaRequest, *list.ListResourceSchemaResponse)
20+
ListResourceMethod func(context.Context, list.ListResourceRequest, *list.ListResourceResponse)
21+
}
22+
23+
// Metadata satisfies the list.ListResource interface.
24+
func (r *ListResource) Metadata(ctx context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) {
25+
if r.MetadataMethod == nil {
26+
return
27+
}
28+
29+
r.MetadataMethod(ctx, req, resp)
30+
}
31+
32+
// ListResourceConfigSchema satisfies the list.ListResource interface.
33+
func (r *ListResource) ListResourceConfigSchema(ctx context.Context, req list.ListResourceSchemaRequest, resp *list.ListResourceSchemaResponse) {
34+
if r.ListResourceConfigSchemaMethod == nil {
35+
return
36+
}
37+
38+
r.ListResourceConfigSchemaMethod(ctx, req, resp)
39+
}
40+
41+
// ListResource satisfies the list.ListResource interface.
42+
func (r *ListResource) ListResource(ctx context.Context, req list.ListResourceRequest, resp *list.ListResourceResponse) {
43+
if r.ListResourceMethod == nil {
44+
return
45+
}
46+
r.ListResourceMethod(ctx, req, resp)
47+
}

internal/testing/testprovider/resource.go

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,72 @@ package testprovider
66
import (
77
"context"
88

9-
"github.com/hashicorp/terraform-plugin-framework/list"
109
"github.com/hashicorp/terraform-plugin-framework/resource"
1110
)
1211

13-
var _ list.ListResource = &ListResource{}
12+
var _ resource.Resource = &Resource{}
1413

15-
// Declarative list.ListResource for unit testing.
16-
type ListResource struct {
17-
// ListResource interface methods
18-
MetadataMethod func(context.Context, resource.MetadataRequest, *resource.MetadataResponse)
19-
ListResourceConfigSchemaMethod func(context.Context, resource.SchemaRequest, *resource.SchemaResponse)
20-
ListResourceMethod func(context.Context, list.ListResourceRequest, *list.ListResourceResponse)
14+
// Declarative resource.Resource for unit testing.
15+
type Resource struct {
16+
// Resource interface methods
17+
MetadataMethod func(context.Context, resource.MetadataRequest, *resource.MetadataResponse)
18+
SchemaMethod func(context.Context, resource.SchemaRequest, *resource.SchemaResponse)
19+
CreateMethod func(context.Context, resource.CreateRequest, *resource.CreateResponse)
20+
DeleteMethod func(context.Context, resource.DeleteRequest, *resource.DeleteResponse)
21+
ReadMethod func(context.Context, resource.ReadRequest, *resource.ReadResponse)
22+
UpdateMethod func(context.Context, resource.UpdateRequest, *resource.UpdateResponse)
2123
}
2224

23-
// Metadata satisfies the list.ListResource interface.
24-
func (r *ListResource) Metadata(ctx context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) {
25+
// Metadata satisfies the resource.Resource interface.
26+
func (r *Resource) Metadata(ctx context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) {
2527
if r.MetadataMethod == nil {
2628
return
2729
}
2830

2931
r.MetadataMethod(ctx, req, resp)
3032
}
3133

32-
// ListResourceConfigSchema satisfies the list.ListResource interface.
33-
func (r *ListResource) ListResourceConfigSchema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {
34-
if r.ListResourceConfigSchemaMethod == nil {
34+
// Schema satisfies the resource.Resource interface.
35+
func (r *Resource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {
36+
if r.SchemaMethod == nil {
3537
return
3638
}
3739

38-
r.ListResourceConfigSchemaMethod(ctx, req, resp)
40+
r.SchemaMethod(ctx, req, resp)
3941
}
4042

41-
// ListResource satisfies the list.ListResource interface.
42-
func (r *ListResource) ListResource(ctx context.Context, req list.ListResourceRequest, resp *list.ListResourceResponse) {
43-
if r.ListResourceMethod == nil {
43+
// Create satisfies the resource.Resource interface.
44+
func (r *Resource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
45+
if r.CreateMethod == nil {
4446
return
4547
}
46-
r.ListResourceMethod(ctx, req, resp)
48+
49+
r.CreateMethod(ctx, req, resp)
50+
}
51+
52+
// Delete satisfies the resource.Resource interface.
53+
func (r *Resource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
54+
if r.DeleteMethod == nil {
55+
return
56+
}
57+
58+
r.DeleteMethod(ctx, req, resp)
59+
}
60+
61+
// Read satisfies the resource.Resource interface.
62+
func (r *Resource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
63+
if r.ReadMethod == nil {
64+
return
65+
}
66+
67+
r.ReadMethod(ctx, req, resp)
68+
}
69+
70+
// Update satisfies the resource.Resource interface.
71+
func (r *Resource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
72+
if r.UpdateMethod == nil {
73+
return
74+
}
75+
76+
r.UpdateMethod(ctx, req, resp)
4777
}

list/list_resource.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type ListResource interface {
2626
Metadata(context.Context, resource.MetadataRequest, *resource.MetadataResponse)
2727

2828
// ListConfigSchema should return the schema for list blocks.
29-
ListResourceConfigSchema(context.Context, resource.SchemaRequest, *resource.SchemaResponse) // TODO: list.Schema{Request,Response}
29+
ListResourceConfigSchema(context.Context, ListResourceSchemaRequest, *ListResourceSchemaResponse)
3030

3131
// ListResource is called when the provider must list instances of a
3232
// managed resource type that satisfy a user-provided request.

list/list_resource_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ type ComputeInstanceWithListResourceConfigValidators struct {
2424
func (c *ComputeInstance) Configure(_ context.Context, _ resource.ConfigureRequest, _ *resource.ConfigureResponse) {
2525
}
2626

27-
func (c *ComputeInstance) ListResourceConfigSchema(_ context.Context, _ resource.SchemaRequest, _ *resource.SchemaResponse) {
27+
func (c *ComputeInstance) ListResourceConfigSchema(_ context.Context, _ list.ListResourceSchemaRequest, _ *list.ListResourceSchemaResponse) {
2828
}
2929

3030
func (c *ComputeInstance) ListResource(_ context.Context, _ list.ListResourceRequest, _ *list.ListResourceResponse) {

list/schema.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package list
2+
3+
import (
4+
"github.com/hashicorp/terraform-plugin-framework/diag"
5+
"github.com/hashicorp/terraform-plugin-framework/provider/schema"
6+
)
7+
8+
// ListResourceSchemaRequest represents a request for the ListResource to
9+
// return its schema. An instance of this request struct is supplied as an
10+
// argument to the ListResource type ListResourceSchema method.
11+
type ListResourceSchemaRequest struct{}
12+
13+
// ListResourceSchemaResponse represents a response to a
14+
// ListResourceSchemaRequest. An instance of this response struct is supplied
15+
// as an argument to the ListResource type ListResourceResourceSchema method.
16+
type ListResourceSchemaResponse struct {
17+
// Schema is the schema of the list resource.
18+
Schema schema.Schema
19+
20+
// Diagnostics report errors or warnings related to retrieving the list
21+
// resource schema. An empty slice indicates success, with no warnings
22+
// or errors generated.
23+
Diagnostics diag.Diagnostics
24+
}

list/schema/schema.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package schema
2+
3+
type Schema struct {
4+
}

0 commit comments

Comments
 (0)