@@ -700,6 +700,55 @@ func Test_Extract(t *testing.T) {
700700 }
701701}
702702
703+ func TestPresetValidation (t * testing.T ) {
704+ t .Parallel ()
705+
706+ for _ , tc := range []struct {
707+ name string
708+ dir string
709+ input preview.Input
710+ presetAssert map [string ]assertPreset
711+ }{
712+ {
713+ name : "preset failure" ,
714+ dir : "presetfail" ,
715+ input : preview.Input {},
716+ presetAssert : map [string ]assertPreset {
717+ "invalid_parameters" : aPreWithDiags ().
718+ errorDiagnostics ("Parameter no_default: Required parameter not provided" ),
719+ "valid_preset" : aPre ().
720+ value ("has_default" , "changed" ).
721+ value ("no_default" , "custom value" ).
722+ noDiagnostics (),
723+ "prebuild_instance_zero" : aPre (),
724+ "not_prebuild" : aPre (),
725+ },
726+ },
727+ } {
728+ t .Run (tc .name , func (t * testing.T ) {
729+ t .Parallel ()
730+
731+ dirFs := os .DirFS (filepath .Join ("testdata" , tc .dir ))
732+ output , diags := preview .Preview (context .Background (), tc .input , dirFs )
733+ if diags .HasErrors () {
734+ t .Logf ("diags: %s" , diags )
735+ }
736+ require .False (t , diags .HasErrors ())
737+ require .Len (t , diags , 0 )
738+
739+ preview .ValidatePresets (context .Background (), tc .input , output .Presets , dirFs )
740+ for _ , preset := range output .Presets {
741+ check , ok := tc .presetAssert [preset .Name ]
742+ require .True (t , ok , "unknown preset %s" , preset .Name )
743+ check (t , preset )
744+ delete (tc .presetAssert , preset .Name )
745+ }
746+
747+ require .Len (t , tc .presetAssert , 0 , "some presets were not found" )
748+ })
749+ }
750+ }
751+
703752type assertVariable func (t * testing.T , variable types.Variable )
704753
705754func av () assertVariable {
@@ -890,6 +939,71 @@ func (a assertVariable) extend(f assertVariable) assertVariable {
890939 }
891940}
892941
942+ type assertPreset func (t * testing.T , preset types.Preset )
943+
944+ func aPre () assertPreset {
945+ return func (t * testing.T , parameter types.Preset ) {
946+ t .Helper ()
947+ assert .Empty (t , parameter .Diagnostics , "parameter should have no diagnostics" )
948+ }
949+ }
950+
951+ func aPreWithDiags () assertPreset {
952+ return func (t * testing.T , parameter types.Preset ) {}
953+ }
954+
955+ func (a assertPreset ) def (def bool ) assertPreset {
956+ return a .extend (func (t * testing.T , preset types.Preset ) {
957+ require .Equal (t , def , preset .Default )
958+ })
959+ }
960+
961+ func (a assertPreset ) value (key , value string ) assertPreset {
962+ return a .extend (func (t * testing.T , preset types.Preset ) {
963+ v , ok := preset .Parameters [key ]
964+ require .Truef (t , ok , "preset parameter %q existence check" , key )
965+ assert .Equalf (t , value , v , "preset parameter %q value equality check" , key )
966+ })
967+ }
968+
969+ func (a assertPreset ) errorDiagnostics (patterns ... string ) assertPreset {
970+ return a .diagnostics (hcl .DiagError , patterns ... )
971+ }
972+
973+ func (a assertPreset ) warnDiagnostics (patterns ... string ) assertPreset {
974+ return a .diagnostics (hcl .DiagWarning , patterns ... )
975+ }
976+
977+ func (a assertPreset ) diagnostics (sev hcl.DiagnosticSeverity , patterns ... string ) assertPreset {
978+ shadow := patterns
979+ return a .extend (func (t * testing.T , preset types.Preset ) {
980+ t .Helper ()
981+
982+ assertDiags (t , sev , preset .Diagnostics , shadow ... )
983+ })
984+ }
985+
986+ func (a assertPreset ) noDiagnostics () assertPreset {
987+ return a .extend (func (t * testing.T , preset types.Preset ) {
988+ t .Helper ()
989+
990+ assert .Empty (t , preset .Diagnostics , "parameter should have no diagnostics" )
991+ })
992+ }
993+
994+ //nolint:revive
995+ func (a assertPreset ) extend (f assertPreset ) assertPreset {
996+ if a == nil {
997+ a = func (t * testing.T , v types.Preset ) {}
998+ }
999+
1000+ return func (t * testing.T , v types.Preset ) {
1001+ t .Helper ()
1002+ (a )(t , v )
1003+ f (t , v )
1004+ }
1005+ }
1006+
8931007func assertDiags (t * testing.T , sev hcl.DiagnosticSeverity , diags types.Diagnostics , patterns ... string ) {
8941008 t .Helper ()
8951009 checks := make ([]string , len (patterns ))
0 commit comments