@@ -142,3 +142,82 @@ func TestCopyCmd_RefusesToOverwriteExistingFile(t *testing.T) {
142142 require .Error (t , err )
143143 assert .Contains (t , err .Error (), "already exists" )
144144}
145+
146+ func TestCopyCmd_RejectsNilComponent (t * testing.T ) {
147+ t .Parallel ()
148+
149+ opts := options .NewTerragruntOptions ()
150+ opts .WorkingDir = t .TempDir ()
151+
152+ err := redesign .NewCopyCmd (logger .CreateLogger (), opts , nil ).Run ()
153+ require .Error (t , err )
154+ assert .Contains (t , err .Error (), "nil component" )
155+ }
156+
157+ func TestCopyCmd_RejectsEmptyWorkingDir (t * testing.T ) {
158+ t .Parallel ()
159+
160+ repoDir := helpers .TmpDirWOSymlinks (t )
161+ writeFile (t , filepath .Join (repoDir , "vpc" , "terragrunt.hcl" ), "# unit\n " )
162+
163+ repo := newFakeRepo (t , repoDir )
164+
165+ components , err := redesign .NewComponentDiscovery ().Discover (repo )
166+ require .NoError (t , err )
167+ require .Len (t , components , 1 )
168+
169+ opts := options .NewTerragruntOptions ()
170+ opts .WorkingDir = ""
171+
172+ err = redesign .NewCopyCmd (logger .CreateLogger (), opts , components [0 ]).Run ()
173+ require .Error (t , err )
174+ assert .Contains (t , err .Error (), "empty working directory" )
175+ }
176+
177+ func TestCopyCmd_FailsWhenSourceMissing (t * testing.T ) {
178+ t .Parallel ()
179+
180+ repoDir := helpers .TmpDirWOSymlinks (t )
181+ writeFile (t , filepath .Join (repoDir , "vpc" , "terragrunt.hcl" ), "# unit\n " )
182+
183+ repo := newFakeRepo (t , repoDir )
184+
185+ components , err := redesign .NewComponentDiscovery ().Discover (repo )
186+ require .NoError (t , err )
187+ require .Len (t , components , 1 )
188+
189+ // Remove the source directory after discovery so the copy walk fails.
190+ require .NoError (t , os .RemoveAll (filepath .Join (repoDir , "vpc" )))
191+
192+ opts := options .NewTerragruntOptions ()
193+ opts .WorkingDir = t .TempDir ()
194+
195+ err = redesign .NewCopyCmd (logger .CreateLogger (), opts , components [0 ]).Run ()
196+ require .Error (t , err )
197+ }
198+
199+ func TestCopyCmd_SkipsSymlinks (t * testing.T ) {
200+ t .Parallel ()
201+
202+ repoDir := helpers .TmpDirWOSymlinks (t )
203+ writeFile (t , filepath .Join (repoDir , "vpc" , "terragrunt.hcl" ), "# unit\n " )
204+ writeFile (t , filepath .Join (repoDir , "vpc" , "real.txt" ), "hello\n " )
205+
206+ // Add a symlink inside the component; copyDir should skip it silently.
207+ require .NoError (t , os .Symlink ("real.txt" , filepath .Join (repoDir , "vpc" , "link.txt" )))
208+
209+ repo := newFakeRepo (t , repoDir )
210+
211+ components , err := redesign .NewComponentDiscovery ().Discover (repo )
212+ require .NoError (t , err )
213+ require .Len (t , components , 1 )
214+
215+ workingDir := t .TempDir ()
216+ opts := options .NewTerragruntOptions ()
217+ opts .WorkingDir = workingDir
218+
219+ require .NoError (t , redesign .NewCopyCmd (logger .CreateLogger (), opts , components [0 ]).Run ())
220+
221+ assert .FileExists (t , filepath .Join (workingDir , "real.txt" ))
222+ assert .NoFileExists (t , filepath .Join (workingDir , "link.txt" ))
223+ }
0 commit comments