@@ -388,6 +388,110 @@ func TestAssertPlanValid(t *testing.T) {
388388 `.b: attribute representing a list of nested blocks must be empty to indicate no blocks, not null` ,
389389 },
390390 },
391+
392+ // blocks can be unknown when using dynamic
393+ "nested list, unknown nested dynamic" : {
394+ & configschema.Block {
395+ BlockTypes : map [string ]* configschema.NestedBlock {
396+ "a" : {
397+ Nesting : configschema .NestingList ,
398+ Block : configschema.Block {
399+ BlockTypes : map [string ]* configschema.NestedBlock {
400+ "b" : {
401+ Nesting : configschema .NestingList ,
402+ Block : configschema.Block {
403+ Attributes : map [string ]* configschema.Attribute {
404+ "c" : {
405+ Type : cty .String ,
406+ Optional : true ,
407+ },
408+ "computed" : {
409+ Type : cty .String ,
410+ Computed : true ,
411+ },
412+ },
413+ },
414+ },
415+ },
416+ },
417+ },
418+ },
419+ },
420+
421+ cty .ObjectVal (map [string ]cty.Value {
422+ "a" : cty .ListVal ([]cty.Value {cty .ObjectVal (map [string ]cty.Value {
423+ "computed" : cty .NullVal (cty .String ),
424+ "b" : cty .ListVal ([]cty.Value {cty .ObjectVal (map [string ]cty.Value {
425+ "c" : cty .StringVal ("x" ),
426+ })}),
427+ })}),
428+ }),
429+ cty .ObjectVal (map [string ]cty.Value {
430+ "a" : cty .ListVal ([]cty.Value {cty .ObjectVal (map [string ]cty.Value {
431+ "b" : cty .UnknownVal (cty .List (cty .Object (map [string ]cty.Type {
432+ "c" : cty .String ,
433+ "computed" : cty .String ,
434+ }))),
435+ })}),
436+ }),
437+ cty .ObjectVal (map [string ]cty.Value {
438+ "a" : cty .ListVal ([]cty.Value {cty .ObjectVal (map [string ]cty.Value {
439+ "b" : cty .UnknownVal (cty .List (cty .Object (map [string ]cty.Type {
440+ "c" : cty .String ,
441+ "computed" : cty .String ,
442+ }))),
443+ })}),
444+ }),
445+ []string {},
446+ },
447+
448+ "nested set, unknown dynamic cannot be planned" : {
449+ & configschema.Block {
450+ Attributes : map [string ]* configschema.Attribute {
451+ "computed" : {
452+ Type : cty .String ,
453+ Computed : true ,
454+ },
455+ },
456+ BlockTypes : map [string ]* configschema.NestedBlock {
457+ "b" : {
458+ Nesting : configschema .NestingSet ,
459+ Block : configschema.Block {
460+ Attributes : map [string ]* configschema.Attribute {
461+ "c" : {
462+ Type : cty .String ,
463+ Optional : true ,
464+ },
465+ },
466+ },
467+ },
468+ },
469+ },
470+
471+ cty .ObjectVal (map [string ]cty.Value {
472+ "computed" : cty .NullVal (cty .String ),
473+ "b" : cty .SetVal ([]cty.Value {cty .ObjectVal (map [string ]cty.Value {
474+ "c" : cty .StringVal ("x" ),
475+ })}),
476+ }),
477+ cty .ObjectVal (map [string ]cty.Value {
478+ "computed" : cty .NullVal (cty .String ),
479+ "b" : cty .UnknownVal (cty .Set (cty .Object (map [string ]cty.Type {
480+ "c" : cty .String ,
481+ }))),
482+ }),
483+ cty .ObjectVal (map [string ]cty.Value {
484+ "computed" : cty .StringVal ("default" ),
485+ "b" : cty .SetVal ([]cty.Value {cty .ObjectVal (map [string ]cty.Value {
486+ "c" : cty .StringVal ("oops" ),
487+ })}),
488+ }),
489+
490+ []string {
491+ `.b: planned value cty.SetVal([]cty.Value{cty.ObjectVal(map[string]cty.Value{"c":cty.StringVal("oops")})}) for unknown dynamic block` ,
492+ },
493+ },
494+
391495 "nested set, null in plan" : {
392496 & configschema.Block {
393497 BlockTypes : map [string ]* configschema.NestedBlock {
0 commit comments