@@ -16,6 +16,7 @@ import (
1616 "github.com/hashicorp/terraform-plugin-framework/function"
1717 "github.com/hashicorp/terraform-plugin-framework/internal/fwserver"
1818 "github.com/hashicorp/terraform-plugin-framework/internal/testing/testprovider"
19+ "github.com/hashicorp/terraform-plugin-framework/list"
1920 "github.com/hashicorp/terraform-plugin-framework/provider"
2021 "github.com/hashicorp/terraform-plugin-framework/resource"
2122)
@@ -497,6 +498,147 @@ func TestServerGetMetadata(t *testing.T) {
497498 },
498499 },
499500 },
501+ "list-resources-empty-type-name" : {
502+ server : & fwserver.Server {
503+ Provider : & testprovider.Provider {
504+ ListResourcesMethod : func (_ context.Context ) []func () list.ListResource {
505+ return []func () list.ListResource {
506+ func () list.ListResource {
507+ return & testprovider.ListResource {
508+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
509+ resp .TypeName = ""
510+ },
511+ }
512+ },
513+ }
514+ },
515+ },
516+ },
517+ request : & fwserver.GetMetadataRequest {},
518+ expectedResponse : & fwserver.GetMetadataResponse {
519+ DataSources : []fwserver.DataSourceMetadata {},
520+ EphemeralResources : []fwserver.EphemeralResourceMetadata {},
521+ Diagnostics : diag.Diagnostics {
522+ diag .NewErrorDiagnostic (
523+ "ListResource Type Name Missing" ,
524+ "The *testprovider.ListResource ListResource returned an empty string from the Metadata method. " +
525+ "This is always an issue with the provider and should be reported to the provider developers." ,
526+ ),
527+ },
528+ Functions : []fwserver.FunctionMetadata {},
529+ ListResources : []fwserver.ListResourceMetadata {},
530+ Resources : []fwserver.ResourceMetadata {},
531+ ServerCapabilities : & fwserver.ServerCapabilities {
532+ GetProviderSchemaOptional : true ,
533+ MoveResourceState : true ,
534+ PlanDestroy : true ,
535+ },
536+ },
537+ },
538+ "list-resources-duplicate-type-name" : {
539+ server : & fwserver.Server {
540+ Provider : & testprovider.Provider {
541+ ListResourcesMethod : func (_ context.Context ) []func () list.ListResource {
542+ return []func () list.ListResource {
543+ func () list.ListResource {
544+ return & testprovider.ListResource {
545+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
546+ resp .TypeName = "test_resource"
547+ },
548+ }
549+ },
550+ func () list.ListResource {
551+ return & testprovider.ListResource {
552+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
553+ resp .TypeName = "test_resource"
554+ },
555+ }
556+ },
557+ }
558+ },
559+ ResourcesMethod : func (_ context.Context ) []func () resource.Resource {
560+ return []func () resource.Resource {
561+ func () resource.Resource {
562+ return & testprovider.Resource {
563+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
564+ resp .TypeName = "test_resource"
565+ },
566+ }
567+ },
568+ }
569+ },
570+ },
571+ },
572+ request : & fwserver.GetMetadataRequest {},
573+ expectedResponse : & fwserver.GetMetadataResponse {
574+ DataSources : []fwserver.DataSourceMetadata {},
575+ EphemeralResources : []fwserver.EphemeralResourceMetadata {},
576+ Diagnostics : diag.Diagnostics {
577+ diag .NewErrorDiagnostic (
578+ "Duplicate ListResource Type Defined" ,
579+ "The test_resource ListResource type name was returned for multiple list resources. " +
580+ "ListResource type names must be unique. " +
581+ "This is always an issue with the provider and should be reported to the provider developers." ,
582+ ),
583+ },
584+ Functions : []fwserver.FunctionMetadata {},
585+ ListResources : []fwserver.ListResourceMetadata {},
586+ Resources : []fwserver.ResourceMetadata {},
587+ ServerCapabilities : & fwserver.ServerCapabilities {
588+ GetProviderSchemaOptional : true ,
589+ MoveResourceState : true ,
590+ PlanDestroy : true ,
591+ },
592+ },
593+ },
594+ "list-resources-no-matching-managed-resource-type" : {
595+ server : & fwserver.Server {
596+ Provider : & testprovider.Provider {
597+ ListResourcesMethod : func (_ context.Context ) []func () list.ListResource {
598+ return []func () list.ListResource {
599+ func () list.ListResource {
600+ return & testprovider.ListResource {
601+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
602+ resp .TypeName = "test_resource_1"
603+ },
604+ }
605+ },
606+ }
607+ },
608+ ResourcesMethod : func (_ context.Context ) []func () resource.Resource {
609+ return []func () resource.Resource {
610+ func () resource.Resource {
611+ return & testprovider.Resource {
612+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
613+ resp .TypeName = "test_resource_2"
614+ },
615+ }
616+ },
617+ }
618+ },
619+ },
620+ },
621+ request : & fwserver.GetMetadataRequest {},
622+ expectedResponse : & fwserver.GetMetadataResponse {
623+ DataSources : []fwserver.DataSourceMetadata {},
624+ EphemeralResources : []fwserver.EphemeralResourceMetadata {},
625+ Diagnostics : diag.Diagnostics {
626+ diag .NewErrorDiagnostic (
627+ "ListResource Type Defined without a Matching Managed Resource Type" ,
628+ "The test_resource_1 ListResource type name was returned, but no matching managed Resource type was defined. " +
629+ "This is always an issue with the provider and should be reported to the provider developers." ,
630+ ),
631+ },
632+ Functions : []fwserver.FunctionMetadata {},
633+ ListResources : []fwserver.ListResourceMetadata {},
634+ Resources : []fwserver.ResourceMetadata {},
635+ ServerCapabilities : & fwserver.ServerCapabilities {
636+ GetProviderSchemaOptional : true ,
637+ MoveResourceState : true ,
638+ PlanDestroy : true ,
639+ },
640+ },
641+ },
500642 "resources" : {
501643 server : & fwserver.Server {
502644 Provider : & testprovider.Provider {
@@ -682,6 +824,10 @@ func TestServerGetMetadata(t *testing.T) {
682824 return response .Functions [i ].Name < response .Functions [j ].Name
683825 })
684826
827+ sort .Slice (response .ListResources , func (i int , j int ) bool {
828+ return response .ListResources [i ].TypeName < response .ListResources [j ].TypeName
829+ })
830+
685831 sort .Slice (response .Resources , func (i int , j int ) bool {
686832 return response .Resources [i ].TypeName < response .Resources [j ].TypeName
687833 })
0 commit comments