diff --git a/addrs/target_test.go b/addrs/target_test.go index a16111560..8d5c9cc9c 100644 --- a/addrs/target_test.go +++ b/addrs/target_test.go @@ -95,7 +95,8 @@ func TestTargetContains(t *testing.T) { false, }, - // Config paths, while never returned from parsing a target, must still be targetable + // Config paths, while never returned from parsing a target, must still + // be targetable { ConfigResource{ Module: []string{"bar"}, @@ -131,6 +132,45 @@ func TestTargetContains(t *testing.T) { mustParseTarget("module.bar[0].test_resource.foo"), true, }, + + // Modules are also never the result of parsing a target, but also need + // to be targetable + { + Module{"bar"}, + Module{"bar", "baz"}, + true, + }, + { + Module{"bar"}, + mustParseTarget("module.bar[0]"), + true, + }, + { + // Parsing an ambiguous module path needs to ensure the + // ModuleInstance could contain the Module. This is safe because if + // the module could be expanded, it must have an index, meaning no + // index indicates that the module instance and module are + // functionally equivalent. + mustParseTarget("module.bar"), + Module{"bar"}, + true, + }, + { + // A specific ModuleInstance cannot contain a module + mustParseTarget("module.bar[0]"), + Module{"bar"}, + false, + }, + { + Module{"bar", "baz"}, + mustParseTarget("module.bar[0].module.baz.test_resource.foo[1]"), + true, + }, + { + mustParseTarget("module.bar[0].module.baz"), + Module{"bar", "baz"}, + false, + }, } { t.Run(fmt.Sprintf("%s-in-%s", test.other, test.addr), func(t *testing.T) { got := test.addr.TargetContains(test.other)