@@ -584,3 +584,134 @@ inputs = {
584
584
unitConfig := units [0 ]
585
585
assert .NotNil (t , unitConfig .Parsed , "Unit configuration should be parsed" )
586
586
}
587
+
588
+ func TestDiscoveryIncludeExcludeFilters (t * testing.T ) {
589
+ t .Parallel ()
590
+
591
+ tmpDir := t .TempDir ()
592
+
593
+ unit1Dir := filepath .Join (tmpDir , "unit1" )
594
+ unit2Dir := filepath .Join (tmpDir , "unit2" )
595
+ unit3Dir := filepath .Join (tmpDir , "unit3" )
596
+
597
+ for _ , d := range []string {unit1Dir , unit2Dir , unit3Dir } {
598
+ require .NoError (t , os .MkdirAll (d , 0755 ))
599
+ }
600
+
601
+ for _ , f := range []string {
602
+ filepath .Join (unit1Dir , "terragrunt.hcl" ),
603
+ filepath .Join (unit2Dir , "terragrunt.hcl" ),
604
+ filepath .Join (unit3Dir , "terragrunt.hcl" ),
605
+ } {
606
+ require .NoError (t , os .WriteFile (f , []byte ("" ), 0644 ))
607
+ }
608
+
609
+ l := logger .CreateLogger ()
610
+ opts , err := options .NewTerragruntOptionsForTest (tmpDir )
611
+ require .NoError (t , err )
612
+
613
+ // Exclude unit2
614
+ d := discovery .NewDiscovery (tmpDir ).WithExcludeDirs ([]string {unit2Dir })
615
+ cfgs , err := d .Discover (t .Context (), l , opts )
616
+ require .NoError (t , err )
617
+ assert .ElementsMatch (t , []string {unit1Dir , unit3Dir }, cfgs .Filter (discovery .ConfigTypeUnit ).Paths ())
618
+
619
+ // Exclude-by-default and include only unit1
620
+ d = discovery .NewDiscovery (tmpDir ).WithExcludeByDefault ().WithIncludeDirs ([]string {unit1Dir })
621
+ cfgs , err = d .Discover (t .Context (), l , opts )
622
+ require .NoError (t , err )
623
+ assert .ElementsMatch (t , []string {unit1Dir }, cfgs .Filter (discovery .ConfigTypeUnit ).Paths ())
624
+
625
+ // Strict include behaves the same
626
+ d = discovery .NewDiscovery (tmpDir ).WithStrictInclude ().WithIncludeDirs ([]string {unit3Dir })
627
+ cfgs , err = d .Discover (t .Context (), l , opts )
628
+ require .NoError (t , err )
629
+ assert .ElementsMatch (t , []string {unit3Dir }, cfgs .Filter (discovery .ConfigTypeUnit ).Paths ())
630
+ }
631
+
632
+ func TestDiscoveryHiddenIncludedByIncludeDirs (t * testing.T ) {
633
+ t .Parallel ()
634
+
635
+ tmpDir := t .TempDir ()
636
+ hiddenUnitDir := filepath .Join (tmpDir , ".hidden" , "hunit" )
637
+ require .NoError (t , os .MkdirAll (hiddenUnitDir , 0755 ))
638
+ require .NoError (t , os .WriteFile (filepath .Join (hiddenUnitDir , "terragrunt.hcl" ), []byte ("" ), 0644 ))
639
+
640
+ l := logger .CreateLogger ()
641
+ opts , err := options .NewTerragruntOptionsForTest (tmpDir )
642
+ require .NoError (t , err )
643
+
644
+ // Without hidden, but included via includeDirs pattern
645
+ d := discovery .NewDiscovery (tmpDir ).WithIncludeDirs ([]string {filepath .Join (tmpDir , ".hidden" , "**" )})
646
+ cfgs , err := d .Discover (t .Context (), l , opts )
647
+ require .NoError (t , err )
648
+ assert .ElementsMatch (t , []string {hiddenUnitDir }, cfgs .Filter (discovery .ConfigTypeUnit ).Paths ())
649
+ }
650
+
651
+ func TestDiscoveryStackHiddenAllowed (t * testing.T ) {
652
+ t .Parallel ()
653
+
654
+ tmpDir := t .TempDir ()
655
+ stackHiddenDir := filepath .Join (tmpDir , ".terragrunt-stack" , "u" )
656
+ require .NoError (t , os .MkdirAll (stackHiddenDir , 0755 ))
657
+ require .NoError (t , os .WriteFile (filepath .Join (stackHiddenDir , "terragrunt.hcl" ), []byte ("" ), 0644 ))
658
+
659
+ l := logger .CreateLogger ()
660
+ opts , err := options .NewTerragruntOptionsForTest (tmpDir )
661
+ require .NoError (t , err )
662
+
663
+ // Should be discovered even without WithHidden()
664
+ d := discovery .NewDiscovery (tmpDir )
665
+ cfgs , err := d .Discover (t .Context (), l , opts )
666
+ require .NoError (t , err )
667
+ assert .Contains (t , cfgs .Filter (discovery .ConfigTypeUnit ).Paths (), stackHiddenDir )
668
+ }
669
+
670
+ func TestDiscoveryIgnoreExternalDependencies (t * testing.T ) {
671
+ t .Parallel ()
672
+
673
+ tmpDir := t .TempDir ()
674
+ internalDir := filepath .Join (tmpDir , "internal" )
675
+ externalDir := filepath .Join (tmpDir , "external" )
676
+ appDir := filepath .Join (internalDir , "app" )
677
+ dbDir := filepath .Join (internalDir , "db" )
678
+ vpcDir := filepath .Join (internalDir , "vpc" )
679
+ extApp := filepath .Join (externalDir , "app" )
680
+
681
+ for _ , d := range []string {appDir , dbDir , vpcDir , extApp } {
682
+ require .NoError (t , os .MkdirAll (d , 0755 ))
683
+ }
684
+
685
+ require .NoError (t , os .WriteFile (filepath .Join (appDir , "terragrunt.hcl" ), []byte (`
686
+ dependency "db" { config_path = "../db" }
687
+ dependency "external" { config_path = "../../external/app" }
688
+ ` ), 0644 ))
689
+ require .NoError (t , os .WriteFile (filepath .Join (dbDir , "terragrunt.hcl" ), []byte (`
690
+ dependency "vpc" { config_path = "../vpc" }
691
+ ` ), 0644 ))
692
+ require .NoError (t , os .WriteFile (filepath .Join (vpcDir , "terragrunt.hcl" ), []byte ("" ), 0644 ))
693
+ require .NoError (t , os .WriteFile (filepath .Join (extApp , "terragrunt.hcl" ), []byte ("" ), 0644 ))
694
+
695
+ opts := options .NewTerragruntOptions ()
696
+ opts .WorkingDir = internalDir
697
+ opts .RootWorkingDir = internalDir
698
+
699
+ l := logger .CreateLogger ()
700
+
701
+ d := discovery .NewDiscovery (internalDir ).WithDiscoverDependencies ().WithIgnoreExternalDependencies ()
702
+ cfgs , err := d .Discover (t .Context (), l , opts )
703
+ require .NoError (t , err )
704
+
705
+ // Find app config and assert it only has internal deps
706
+ var appCfg * discovery.DiscoveredConfig
707
+ for _ , c := range cfgs {
708
+ if c .Path == appDir {
709
+ appCfg = c
710
+ break
711
+ }
712
+ }
713
+ require .NotNil (t , appCfg )
714
+ depPaths := appCfg .Dependencies .Paths ()
715
+ assert .Contains (t , depPaths , dbDir )
716
+ assert .NotContains (t , depPaths , extApp )
717
+ }
0 commit comments