@@ -82,7 +82,21 @@ func makeTar(t *testing.T, files map[string]string) []byte {
8282t .Helper ()
8383var buffer bytes.Buffer
8484writer := tar .NewWriter (& buffer )
85+
86+ addedDirs := make (map [string ]bool )
8587for 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+
86100err := writer .WriteHeader (& tar.Header {
87101Name :name ,
88102Size :int64 (len (content )),
@@ -703,6 +717,45 @@ func TestProvision(t *testing.T) {
703717}},
704718},
705719},
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+ },
706759}
707760
708761for _ ,testCase := range testCases {
@@ -753,7 +806,7 @@ func TestProvision(t *testing.T) {
753806if testCase .Response != nil {
754807require .Equal (t ,testCase .Response .Error ,planComplete .Error )
755808
756- // Remove randomly generated data.
809+ // Remove randomly generated data and sort by name .
757810normalizeResources (planComplete .Resources )
758811resourcesGot ,err := json .Marshal (planComplete .Resources )
759812require .NoError (t ,err )
@@ -766,6 +819,12 @@ func TestProvision(t *testing.T) {
766819parametersWant ,err := json .Marshal (testCase .Response .Parameters )
767820require .NoError (t ,err )
768821require .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 ))
769828}
770829
771830if testCase .Apply {
@@ -806,6 +865,9 @@ func normalizeResources(resources []*proto.Resource) {
806865agent .Auth = & proto.Agent_Token {}
807866}
808867}
868+ sort .Slice (resources ,func (i ,j int )bool {
869+ return resources [i ].Name < resources [j ].Name
870+ })
809871}
810872
811873// nolint:paralleltest