11package rules
22
33import (
4+ "reflect"
45 "testing"
56
7+ "github.com/google/go-cmp/cmp"
8+ "github.com/google/go-cmp/cmp/cmpopts"
69 "github.com/hashicorp/hcl/v2"
710 "github.com/terraform-linters/tflint-plugin-sdk/helper"
11+ "github.com/terraform-linters/tflint-plugin-sdk/tflint"
812)
913
1014func Test_TerraformRequiredProvidersRule (t * testing.T ) {
@@ -570,6 +574,107 @@ output "foo" {
570574 },
571575 },
572576 },
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+ },
573678 }
574679
575680 rule := NewTerraformRequiredProvidersRule ()
@@ -590,7 +695,35 @@ output "foo" {
590695 t .Fatalf ("Unexpected error occurred: %s" , err )
591696 }
592697
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+ }
594727 want := map [string ]string {}
595728 if tc .Fixed != "" {
596729 want [filename ] = tc .Fixed
0 commit comments