@@ -82,7 +82,21 @@ func makeTar(t *testing.T, files map[string]string) []byte {
82
82
t .Helper ()
83
83
var buffer bytes.Buffer
84
84
writer := tar .NewWriter (& buffer )
85
+
86
+ addedDirs := make (map [string ]bool )
85
87
for name ,content := range files {
88
+ // Add parent directories if they don't exist
89
+ dir := filepath .Dir (name )
90
+ if dir != "." && ! addedDirs [dir ] {
91
+ err := writer .WriteHeader (& tar.Header {
92
+ Name :dir + "/" ,// Directory names must end with /
93
+ Mode :0o755 ,
94
+ Typeflag :tar .TypeDir ,
95
+ })
96
+ require .NoError (t ,err )
97
+ addedDirs [dir ]= true
98
+ }
99
+
86
100
err := writer .WriteHeader (& tar.Header {
87
101
Name :name ,
88
102
Size :int64 (len (content )),
@@ -703,6 +717,45 @@ func TestProvision(t *testing.T) {
703
717
}},
704
718
},
705
719
},
720
+ {
721
+ Name :"returns-modules" ,
722
+ Files :map [string ]string {
723
+ "main.tf" :`module "hello" {
724
+ source = "./module"
725
+ }` ,
726
+ "module/module.tf" :`
727
+ resource "null_resource" "example" {}
728
+
729
+ module "there" {
730
+ source = "./inner_module"
731
+ }
732
+ ` ,
733
+ "module/inner_module/inner_module.tf" :`
734
+ resource "null_resource" "inner_example" {}
735
+ ` ,
736
+ },
737
+ Request :& proto.PlanRequest {},
738
+ Response :& proto.PlanComplete {
739
+ Resources : []* proto.Resource {{
740
+ Name :"example" ,
741
+ Type :"null_resource" ,
742
+ ModulePath :"module.hello" ,
743
+ }, {
744
+ Name :"inner_example" ,
745
+ Type :"null_resource" ,
746
+ ModulePath :"module.hello.module.there" ,
747
+ }},
748
+ Modules : []* proto.Module {{
749
+ Key :"hello" ,
750
+ Version :"" ,
751
+ Source :"./module" ,
752
+ }, {
753
+ Key :"hello.there" ,
754
+ Version :"" ,
755
+ Source :"./inner_module" ,
756
+ }},
757
+ },
758
+ },
706
759
}
707
760
708
761
for _ ,testCase := range testCases {
@@ -753,7 +806,7 @@ func TestProvision(t *testing.T) {
753
806
if testCase .Response != nil {
754
807
require .Equal (t ,testCase .Response .Error ,planComplete .Error )
755
808
756
- // Remove randomly generated data.
809
+ // Remove randomly generated data and sort by name .
757
810
normalizeResources (planComplete .Resources )
758
811
resourcesGot ,err := json .Marshal (planComplete .Resources )
759
812
require .NoError (t ,err )
@@ -766,6 +819,12 @@ func TestProvision(t *testing.T) {
766
819
parametersWant ,err := json .Marshal (testCase .Response .Parameters )
767
820
require .NoError (t ,err )
768
821
require .Equal (t ,string (parametersWant ),string (parametersGot ))
822
+
823
+ modulesGot ,err := json .Marshal (planComplete .Modules )
824
+ require .NoError (t ,err )
825
+ modulesWant ,err := json .Marshal (testCase .Response .Modules )
826
+ require .NoError (t ,err )
827
+ require .Equal (t ,string (modulesWant ),string (modulesGot ))
769
828
}
770
829
771
830
if testCase .Apply {
@@ -806,6 +865,9 @@ func normalizeResources(resources []*proto.Resource) {
806
865
agent .Auth = & proto.Agent_Token {}
807
866
}
808
867
}
868
+ sort .Slice (resources ,func (i ,j int )bool {
869
+ return resources [i ].Name < resources [j ].Name
870
+ })
809
871
}
810
872
811
873
// nolint:paralleltest