1
1
package rules
2
2
3
3
import (
4
+ "reflect"
4
5
"testing"
5
6
7
+ "github.com/google/go-cmp/cmp"
8
+ "github.com/google/go-cmp/cmp/cmpopts"
6
9
"github.com/hashicorp/hcl/v2"
7
10
"github.com/terraform-linters/tflint-plugin-sdk/helper"
11
+ "github.com/terraform-linters/tflint-plugin-sdk/tflint"
8
12
)
9
13
10
14
func Test_TerraformRequiredProvidersRule (t * testing.T ) {
@@ -570,6 +574,107 @@ output "foo" {
570
574
},
571
575
},
572
576
},
577
+ {
578
+ Name : "multiple required providers" ,
579
+ Content : `
580
+ terraform {
581
+ required_providers {
582
+ template = "~> 2"
583
+ }
584
+
585
+ required_providers {
586
+ aws = "~> 5.0"
587
+ }
588
+ }
589
+
590
+ provider "template" {}
591
+ provider "aws" {}
592
+ provider "google" {}
593
+
594
+ terraform {
595
+ required_providers {
596
+ google = "~> 6.0"
597
+ }
598
+ }
599
+ ` ,
600
+ Expected : helper.Issues {
601
+ {
602
+ Rule : NewTerraformRequiredProvidersRule (),
603
+ Message : "Legacy version constraint for provider \" template\" in `required_providers`" ,
604
+ Range : hcl.Range {
605
+ Filename : "module.tf" ,
606
+ Start : hcl.Pos {
607
+ Line : 4 ,
608
+ Column : 16 ,
609
+ },
610
+ End : hcl.Pos {
611
+ Line : 4 ,
612
+ Column : 22 ,
613
+ },
614
+ },
615
+ },
616
+ {
617
+ Rule : NewTerraformRequiredProvidersRule (),
618
+ Message : "Legacy version constraint for provider \" aws\" in `required_providers`" ,
619
+ Range : hcl.Range {
620
+ Filename : "module.tf" ,
621
+ Start : hcl.Pos {
622
+ Line : 8 ,
623
+ Column : 11 ,
624
+ },
625
+ End : hcl.Pos {
626
+ Line : 8 ,
627
+ Column : 19 ,
628
+ },
629
+ },
630
+ },
631
+ {
632
+ Rule : NewTerraformRequiredProvidersRule (),
633
+ Message : "Legacy version constraint for provider \" google\" in `required_providers`" ,
634
+ Range : hcl.Range {
635
+ Filename : "module.tf" ,
636
+ Start : hcl.Pos {
637
+ Line : 18 ,
638
+ Column : 14 ,
639
+ },
640
+ End : hcl.Pos {
641
+ Line : 18 ,
642
+ Column : 22 ,
643
+ },
644
+ },
645
+ },
646
+ },
647
+ Fixed : `
648
+ terraform {
649
+ required_providers {
650
+ template = {
651
+ source = "hashicorp/template"
652
+ version = "~> 2"
653
+ }
654
+ }
655
+
656
+ required_providers {
657
+ aws = {
658
+ source = "hashicorp/aws"
659
+ version = "~> 5.0"
660
+ }
661
+ }
662
+ }
663
+
664
+ provider "template" {}
665
+ provider "aws" {}
666
+ provider "google" {}
667
+
668
+ terraform {
669
+ required_providers {
670
+ google = {
671
+ source = "hashicorp/google"
672
+ version = "~> 6.0"
673
+ }
674
+ }
675
+ }
676
+ ` ,
677
+ },
573
678
}
574
679
575
680
rule := NewTerraformRequiredProvidersRule ()
@@ -590,7 +695,35 @@ output "foo" {
590
695
t .Fatalf ("Unexpected error occurred: %s" , err )
591
696
}
592
697
593
- helper .AssertIssues (t , tc .Expected , runner .Runner .(* helper.Runner ).Issues )
698
+ // TODO: replace the following assertions without ordering by AssertIssues
699
+ // helper.AssertIssues(t, tc.Expected, runner.Runner.(*helper.Runner).Issues)
700
+ opts := []cmp.Option {
701
+ cmpopts .IgnoreFields (hcl.Pos {}, "Byte" ),
702
+ cmp .Comparer (func (x , y tflint.Rule ) bool {
703
+ return reflect .TypeOf (x ) == reflect .TypeOf (y )
704
+ }),
705
+ cmpopts .SortSlices (func (i , j * helper.Issue ) bool {
706
+ if i .Range .Filename != j .Range .Filename {
707
+ return i .Range .Filename < j .Range .Filename
708
+ }
709
+ if i .Range .Start .Line != j .Range .Start .Line {
710
+ return i .Range .Start .Line < j .Range .Start .Line
711
+ }
712
+ if i .Range .Start .Column != j .Range .Start .Column {
713
+ return i .Range .Start .Column < j .Range .Start .Column
714
+ }
715
+ if i .Range .End .Line != j .Range .End .Line {
716
+ return i .Range .End .Line > j .Range .End .Line
717
+ }
718
+ if i .Range .End .Column != j .Range .End .Column {
719
+ return i .Range .End .Column > j .Range .End .Column
720
+ }
721
+ return i .Message < j .Message
722
+ }),
723
+ }
724
+ if diff := cmp .Diff (tc .Expected , runner .Runner .(* helper.Runner ).Issues , opts ... ); diff != "" {
725
+ t .Fatalf ("Expected issues are not matched:\n %s\n " , diff )
726
+ }
594
727
want := map [string ]string {}
595
728
if tc .Fixed != "" {
596
729
want [filename ] = tc .Fixed
0 commit comments