@@ -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 )),
@@ -745,6 +759,45 @@ func TestProvision(t *testing.T) {
745
759
}},
746
760
},
747
761
},
762
+ {
763
+ Name :"returns-modules" ,
764
+ Files :map [string ]string {
765
+ "main.tf" :`module "hello" {
766
+ source = "./module"
767
+ }` ,
768
+ "module/module.tf" :`
769
+ resource "null_resource" "example" {}
770
+
771
+ module "there" {
772
+ source = "./inner_module"
773
+ }
774
+ ` ,
775
+ "module/inner_module/inner_module.tf" :`
776
+ resource "null_resource" "inner_example" {}
777
+ ` ,
778
+ },
779
+ Request :& proto.PlanRequest {},
780
+ Response :& proto.PlanComplete {
781
+ Resources : []* proto.Resource {{
782
+ Name :"example" ,
783
+ Type :"null_resource" ,
784
+ ModulePath :"module.hello" ,
785
+ }, {
786
+ Name :"inner_example" ,
787
+ Type :"null_resource" ,
788
+ ModulePath :"module.hello.module.there" ,
789
+ }},
790
+ Modules : []* proto.Module {{
791
+ Key :"hello" ,
792
+ Version :"" ,
793
+ Source :"./module" ,
794
+ }, {
795
+ Key :"hello.there" ,
796
+ Version :"" ,
797
+ Source :"./inner_module" ,
798
+ }},
799
+ },
800
+ },
748
801
}
749
802
750
803
for _ ,testCase := range testCases {
@@ -799,7 +852,7 @@ func TestProvision(t *testing.T) {
799
852
if testCase .Response != nil {
800
853
require .Equal (t ,testCase .Response .Error ,planComplete .Error )
801
854
802
- // Remove randomly generated data.
855
+ // Remove randomly generated data and sort by name .
803
856
normalizeResources (planComplete .Resources )
804
857
resourcesGot ,err := json .Marshal (planComplete .Resources )
805
858
require .NoError (t ,err )
@@ -812,6 +865,12 @@ func TestProvision(t *testing.T) {
812
865
parametersWant ,err := json .Marshal (testCase .Response .Parameters )
813
866
require .NoError (t ,err )
814
867
require .Equal (t ,string (parametersWant ),string (parametersGot ))
868
+
869
+ modulesGot ,err := json .Marshal (planComplete .Modules )
870
+ require .NoError (t ,err )
871
+ modulesWant ,err := json .Marshal (testCase .Response .Modules )
872
+ require .NoError (t ,err )
873
+ require .Equal (t ,string (modulesWant ),string (modulesGot ))
815
874
}
816
875
817
876
if testCase .Apply {
@@ -852,6 +911,9 @@ func normalizeResources(resources []*proto.Resource) {
852
911
agent .Auth = & proto.Agent_Token {}
853
912
}
854
913
}
914
+ sort .Slice (resources ,func (i ,j int )bool {
915
+ return resources [i ].Name < resources [j ].Name
916
+ })
855
917
}
856
918
857
919
// nolint:paralleltest