@@ -9,13 +9,15 @@ import (
9
9
"testing"
10
10
11
11
"github.com/google/go-cmp/cmp"
12
+ "github.com/google/go-cmp/cmp/cmpopts"
12
13
13
14
"github.com/hashicorp/terraform-plugin-framework/datasource"
14
15
"github.com/hashicorp/terraform-plugin-framework/diag"
15
16
"github.com/hashicorp/terraform-plugin-framework/ephemeral"
16
17
"github.com/hashicorp/terraform-plugin-framework/function"
17
18
"github.com/hashicorp/terraform-plugin-framework/internal/fwserver"
18
19
"github.com/hashicorp/terraform-plugin-framework/internal/testing/testprovider"
20
+ "github.com/hashicorp/terraform-plugin-framework/list"
19
21
"github.com/hashicorp/terraform-plugin-framework/provider"
20
22
"github.com/hashicorp/terraform-plugin-framework/resource"
21
23
)
@@ -485,6 +487,190 @@ func TestServerGetMetadata(t *testing.T) {
485
487
},
486
488
},
487
489
},
490
+ "listresources" : {
491
+ server : & fwserver.Server {
492
+ Provider : & testprovider.Provider {
493
+ ListResourcesMethod : func (_ context.Context ) []func () list.ListResource {
494
+ return []func () list.ListResource {
495
+ func () list.ListResource {
496
+ return & testprovider.ListResource {
497
+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
498
+ resp .TypeName = "test_resource_1"
499
+ },
500
+ }
501
+ },
502
+ }
503
+ },
504
+ ResourcesMethod : func (_ context.Context ) []func () resource.Resource {
505
+ return []func () resource.Resource {
506
+ func () resource.Resource {
507
+ return & testprovider.Resource {
508
+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
509
+ resp .TypeName = "test_resource_1"
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
+ Functions : []fwserver.FunctionMetadata {},
523
+ ListResources : []fwserver.ListResourceMetadata {
524
+ {TypeName : "test_resource_1" },
525
+ },
526
+ Resources : []fwserver.ResourceMetadata {
527
+ {TypeName : "test_resource_1" },
528
+ },
529
+ ServerCapabilities : & fwserver.ServerCapabilities {
530
+ GetProviderSchemaOptional : true ,
531
+ MoveResourceState : true ,
532
+ PlanDestroy : true ,
533
+ },
534
+ },
535
+ },
536
+ "list-resources-empty-type-name" : {
537
+ server : & fwserver.Server {
538
+ Provider : & testprovider.Provider {
539
+ ListResourcesMethod : func (_ context.Context ) []func () list.ListResource {
540
+ return []func () list.ListResource {
541
+ func () list.ListResource {
542
+ return & testprovider.ListResource {
543
+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
544
+ resp .TypeName = ""
545
+ },
546
+ }
547
+ },
548
+ }
549
+ },
550
+ },
551
+ },
552
+ request : & fwserver.GetMetadataRequest {},
553
+ expectedResponse : & fwserver.GetMetadataResponse {
554
+ DataSources : []fwserver.DataSourceMetadata {},
555
+ EphemeralResources : []fwserver.EphemeralResourceMetadata {},
556
+ Diagnostics : diag.Diagnostics {
557
+ diag .NewErrorDiagnostic (
558
+ "ListResource Type Name Missing" ,
559
+ "The *testprovider.ListResource ListResource returned an empty string from the Metadata method. " +
560
+ "This is always an issue with the provider and should be reported to the provider developers." ,
561
+ ),
562
+ },
563
+ Functions : []fwserver.FunctionMetadata {},
564
+ Resources : []fwserver.ResourceMetadata {},
565
+ ServerCapabilities : & fwserver.ServerCapabilities {
566
+ GetProviderSchemaOptional : true ,
567
+ MoveResourceState : true ,
568
+ PlanDestroy : true ,
569
+ },
570
+ },
571
+ },
572
+ "list-resources-duplicate-type-name" : {
573
+ server : & fwserver.Server {
574
+ Provider : & testprovider.Provider {
575
+ ListResourcesMethod : func (_ context.Context ) []func () list.ListResource {
576
+ return []func () list.ListResource {
577
+ func () list.ListResource {
578
+ return & testprovider.ListResource {
579
+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
580
+ resp .TypeName = "test_resource"
581
+ },
582
+ }
583
+ },
584
+ func () list.ListResource {
585
+ return & testprovider.ListResource {
586
+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
587
+ resp .TypeName = "test_resource"
588
+ },
589
+ }
590
+ },
591
+ }
592
+ },
593
+ ResourcesMethod : func (_ context.Context ) []func () resource.Resource {
594
+ return []func () resource.Resource {
595
+ func () resource.Resource {
596
+ return & testprovider.Resource {
597
+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
598
+ resp .TypeName = "test_resource"
599
+ },
600
+ }
601
+ },
602
+ }
603
+ },
604
+ },
605
+ },
606
+ request : & fwserver.GetMetadataRequest {},
607
+ expectedResponse : & fwserver.GetMetadataResponse {
608
+ DataSources : []fwserver.DataSourceMetadata {},
609
+ EphemeralResources : []fwserver.EphemeralResourceMetadata {},
610
+ Diagnostics : diag.Diagnostics {
611
+ diag .NewErrorDiagnostic (
612
+ "Duplicate ListResource Type Defined" ,
613
+ "The test_resource ListResource type name was returned for multiple list resources. " +
614
+ "ListResource type names must be unique. " +
615
+ "This is always an issue with the provider and should be reported to the provider developers." ,
616
+ ),
617
+ },
618
+ Functions : []fwserver.FunctionMetadata {},
619
+ Resources : []fwserver.ResourceMetadata {},
620
+ ServerCapabilities : & fwserver.ServerCapabilities {
621
+ GetProviderSchemaOptional : true ,
622
+ MoveResourceState : true ,
623
+ PlanDestroy : true ,
624
+ },
625
+ },
626
+ },
627
+ "list-resources-no-matching-managed-resource-type" : {
628
+ server : & fwserver.Server {
629
+ Provider : & testprovider.Provider {
630
+ ListResourcesMethod : func (_ context.Context ) []func () list.ListResource {
631
+ return []func () list.ListResource {
632
+ func () list.ListResource {
633
+ return & testprovider.ListResource {
634
+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
635
+ resp .TypeName = "test_resource_1"
636
+ },
637
+ }
638
+ },
639
+ }
640
+ },
641
+ ResourcesMethod : func (_ context.Context ) []func () resource.Resource {
642
+ return []func () resource.Resource {
643
+ func () resource.Resource {
644
+ return & testprovider.Resource {
645
+ MetadataMethod : func (_ context.Context , _ resource.MetadataRequest , resp * resource.MetadataResponse ) {
646
+ resp .TypeName = "test_resource_2"
647
+ },
648
+ }
649
+ },
650
+ }
651
+ },
652
+ },
653
+ },
654
+ request : & fwserver.GetMetadataRequest {},
655
+ expectedResponse : & fwserver.GetMetadataResponse {
656
+ DataSources : []fwserver.DataSourceMetadata {},
657
+ EphemeralResources : []fwserver.EphemeralResourceMetadata {},
658
+ Diagnostics : diag.Diagnostics {
659
+ diag .NewErrorDiagnostic (
660
+ "ListResource Type Defined without a Matching Managed Resource Type" ,
661
+ "The test_resource_1 ListResource type name was returned, but no matching managed Resource type was defined. " +
662
+ "This is always an issue with the provider and should be reported to the provider developers." ,
663
+ ),
664
+ },
665
+ Functions : []fwserver.FunctionMetadata {},
666
+ Resources : []fwserver.ResourceMetadata {},
667
+ ServerCapabilities : & fwserver.ServerCapabilities {
668
+ GetProviderSchemaOptional : true ,
669
+ MoveResourceState : true ,
670
+ PlanDestroy : true ,
671
+ },
672
+ },
673
+ },
488
674
"resources" : {
489
675
server : & fwserver.Server {
490
676
Provider : & testprovider.Provider {
@@ -666,11 +852,19 @@ func TestServerGetMetadata(t *testing.T) {
666
852
return response .Functions [i ].Name < response .Functions [j ].Name
667
853
})
668
854
855
+ sort .Slice (response .ListResources , func (i int , j int ) bool {
856
+ return response .ListResources [i ].TypeName < response .ListResources [j ].TypeName
857
+ })
858
+
669
859
sort .Slice (response .Resources , func (i int , j int ) bool {
670
860
return response .Resources [i ].TypeName < response .Resources [j ].TypeName
671
861
})
672
862
673
- if diff := cmp .Diff (response , testCase .expectedResponse ); diff != "" {
863
+ opts := cmp.Options {
864
+ cmpopts .EquateEmpty (),
865
+ }
866
+
867
+ if diff := cmp .Diff (response , testCase .expectedResponse , opts ... ); diff != "" {
674
868
t .Errorf ("unexpected difference: %s" , diff )
675
869
}
676
870
})
0 commit comments