@@ -361,6 +361,21 @@ func readFile(t *testing.T, fsys fs.FS, name string) []byte {
361361 return buf
362362}
363363
364+ // testMergeOverrides wraps mergeOverrides and asserts the contract:
365+ // error-severity diagnostics are always accompanied by a non-nil error.
366+ func testMergeOverrides (t * testing.T , fsys fs.FS ) (fs.FS , hcl.Diagnostics , error ) {
367+ t .Helper ()
368+ result , diags , err := mergeOverrides (fsys )
369+ if err == nil {
370+ for _ , d := range diags {
371+ if d .Severity == hcl .DiagError {
372+ t .Fatal ("mergeOverrides returned error diagnostic without non-nil error" )
373+ }
374+ }
375+ }
376+ return result , diags , err
377+ }
378+
364379func TestMergeOverrideFiles (t * testing.T ) {
365380 t .Parallel ()
366381
@@ -370,7 +385,7 @@ func TestMergeOverrideFiles(t *testing.T) {
370385 "main.tf" : & fstest.MapFile {Data : []byte (`resource "a" "b" { x = 1 }` )},
371386 "override.tf" : & fstest.MapFile {Data : []byte (`` )},
372387 }
373- result , diags , err := mergeOverrides ( fsys )
388+ result , diags , err := testMergeOverrides ( t , fsys )
374389 require .NoError (t , err )
375390 assert .Empty (t , diags )
376391
@@ -383,7 +398,7 @@ func TestMergeOverrideFiles(t *testing.T) {
383398 original := fstest.MapFS {
384399 "main.tf" : & fstest.MapFile {Data : []byte (`resource "a" "b" { x = 1 }` )},
385400 }
386- result , diags , err := mergeOverrides ( original )
401+ result , diags , err := testMergeOverrides ( t , original )
387402 require .NoError (t , err )
388403 assert .Empty (t , diags )
389404 // Should return the exact same FS when there are no overrides.
@@ -398,7 +413,7 @@ func TestMergeOverrideFiles(t *testing.T) {
398413 y = 2
399414}` )},
400415 }
401- _ , _ , err := mergeOverrides ( fsys )
416+ _ , _ , err := testMergeOverrides ( t , fsys )
402417 require .Error (t , err )
403418 assert .Contains (t , err .Error (), "no matching block" )
404419 })
@@ -414,7 +429,7 @@ func TestMergeOverrideFiles(t *testing.T) {
414429 y = 99
415430}` )},
416431 }
417- result , _ , err := mergeOverrides ( fsys )
432+ result , _ , err := testMergeOverrides ( t , fsys )
418433 require .NoError (t , err )
419434
420435 // Read the merged primary file.
@@ -428,7 +443,7 @@ func TestMergeOverrideFiles(t *testing.T) {
428443 "main.tf" : & fstest.MapFile {Data : []byte (`resource "a" "b" { x = 1 }` )},
429444 "override.tf" : & fstest.MapFile {Data : []byte (`resource "a" "b" { x = 2 }` )},
430445 }
431- result , _ , err := mergeOverrides ( fsys )
446+ result , _ , err := testMergeOverrides ( t , fsys )
432447 require .NoError (t , err )
433448
434449 _ , err = result .Open ("override.tf" )
@@ -443,7 +458,7 @@ func TestMergeOverrideFiles(t *testing.T) {
443458 "foo_override.tf" : & fstest.MapFile {Data : []byte (`resource "a" "b" { x = 2 }` )},
444459 "other.txt" : & fstest.MapFile {Data : []byte ("hello" )},
445460 }
446- result , _ , err := mergeOverrides ( fsys )
461+ result , _ , err := testMergeOverrides ( t , fsys )
447462 require .NoError (t , err )
448463
449464 f , err := result .Open ("." )
@@ -481,7 +496,7 @@ func TestMergeOverrideFiles(t *testing.T) {
481496 from_b = "bbb"
482497}` )},
483498 }
484- result , _ , err := mergeOverrides ( fsys )
499+ result , _ , err := testMergeOverrides ( t , fsys )
485500 require .NoError (t , err )
486501
487502 content := readFile (t , result , "main.tf" )
@@ -502,7 +517,7 @@ func TestMergeOverrideFiles(t *testing.T) {
502517 y = 42
503518}` )},
504519 }
505- result , _ , err := mergeOverrides ( fsys )
520+ result , _ , err := testMergeOverrides ( t , fsys )
506521 require .NoError (t , err )
507522
508523 // Root file should be unchanged (no overrides in root).
@@ -525,7 +540,7 @@ func TestMergeOverrideFiles(t *testing.T) {
525540 "main.tf" : & fstest.MapFile {Data : []byte (`resource "a" "b" { x = 1 }` )},
526541 "override.tf.json" : & fstest.MapFile {Data : []byte (`{}` )},
527542 }
528- result , diags , err := mergeOverrides ( fsys )
543+ result , diags , err := testMergeOverrides ( t , fsys )
529544 require .NoError (t , err )
530545
531546 // Should warn about the .tf.json override file.
@@ -543,10 +558,10 @@ func TestMergeOverrideFiles(t *testing.T) {
543558 "main.tf" : & fstest.MapFile {Data : []byte (`resource "a" "b" { x = 1 }` )},
544559 "other.tf.json" : & fstest.MapFile {Data : []byte (`{}` )},
545560 }
546- result , diags , err := mergeOverrides ( fsys )
561+ result , diags , err := testMergeOverrides ( t , fsys )
547562 require .NoError (t , err )
548563
549- // No warnings for primary .tf.json files.
564+ // No warnings for primary .tf.json files because there are no overrides .
550565 assert .Empty (t , diags )
551566
552567 // Original FS returned since no overrides exist.
@@ -561,9 +576,11 @@ func TestMergeOverrideFiles(t *testing.T) {
561576 "extra.tf.json" : & fstest.MapFile {Data : jsonContent },
562577 "override.tf" : & fstest.MapFile {Data : []byte (`resource "a" "b" { x = 2 }` )},
563578 }
564- result , diags , err := mergeOverrides ( fsys )
579+ result , diags , err := testMergeOverrides ( t , fsys )
565580 require .NoError (t , err )
566- assert .Empty (t , diags )
581+
582+ require .Len (t , diags , 1 )
583+ assert .Contains (t , diags [0 ].Summary , "Primary file uses .tf.json format" )
567584
568585 // .tf.json file should still be accessible in the result FS.
569586 content := readFile (t , result , "extra.tf.json" )
@@ -579,7 +596,7 @@ func TestMergeOverrideFiles(t *testing.T) {
579596 "a_override.tf" : & fstest.MapFile {Data : []byte (`resource "a" "b" { x = 99 }` )},
580597 "b_override.tf.json" : & fstest.MapFile {Data : []byte (`{}` )},
581598 }
582- result , diags , err := mergeOverrides ( fsys )
599+ result , diags , err := testMergeOverrides ( t , fsys )
583600 require .NoError (t , err )
584601
585602 // Warning for the .tf.json override only.
@@ -603,7 +620,7 @@ func TestMergeOverrideFiles(t *testing.T) {
603620 foo = "overridden"
604621}` )},
605622 }
606- result , diags , err := mergeOverrides ( fsys )
623+ result , diags , err := testMergeOverrides ( t , fsys )
607624 require .NoError (t , err )
608625 assert .Empty (t , diags )
609626
@@ -627,7 +644,7 @@ func TestMergeOverrideFiles(t *testing.T) {
627644 from_b = "overridden_b"
628645}` )},
629646 }
630- result , diags , err := mergeOverrides ( fsys )
647+ result , diags , err := testMergeOverrides ( t , fsys )
631648 require .NoError (t , err )
632649 assert .Empty (t , diags )
633650
@@ -660,7 +677,7 @@ locals {
660677 y = "y_from_b"
661678}` )},
662679 }
663- result , diags , err := mergeOverrides ( fsys )
680+ result , diags , err := testMergeOverrides ( t , fsys )
664681 require .NoError (t , err )
665682 assert .Empty (t , diags )
666683
@@ -682,12 +699,12 @@ locals {
682699 nonexistent = "nope"
683700}` )},
684701 }
685- result , diags , err := mergeOverrides ( fsys )
702+ result , diags , err := testMergeOverrides ( t , fsys )
686703 require .Error (t , err )
687704 assert .Nil (t , result )
688705 require .Len (t , diags , 1 )
689706 assert .Equal (t , hcl .DiagError , diags [0 ].Severity )
690- assert .Contains (t , diags [0 ].Summary , "Missing base local value definition " )
707+ assert .Contains (t , diags [0 ].Summary , "Missing base local" )
691708 })
692709
693710 t .Run ("DuplicatePrimaryBlockErrors" , func (t * testing.T ) {
@@ -704,12 +721,12 @@ data "coder_parameter" "foo" {
704721 name = "bar"
705722}` )},
706723 }
707- result , diags , err := mergeOverrides ( fsys )
724+ result , diags , err := testMergeOverrides ( t , fsys )
708725 require .Error (t , err )
709726 assert .Nil (t , result , "FS should be nil so caller keeps original" )
710727 require .Len (t , diags , 1 )
711728 assert .Equal (t , hcl .DiagError , diags [0 ].Severity )
712- assert .Contains (t , diags [0 ].Summary , "Duplicate block in primary " )
729+ assert .Contains (t , diags [0 ].Summary , "Duplicate block" )
713730 })
714731
715732 t .Run ("DuplicatePrimaryLocalsNoError" , func (t * testing.T ) {
@@ -726,7 +743,7 @@ locals {
726743 a = 99
727744}` )},
728745 }
729- result , diags , err := mergeOverrides ( fsys )
746+ result , diags , err := testMergeOverrides ( t , fsys )
730747 require .NoError (t , err )
731748 assert .Empty (t , diags )
732749
@@ -752,7 +769,7 @@ terraform {
752769resource "a" "b" { x = 1 }` )},
753770 "override.tf" : & fstest.MapFile {Data : []byte (`resource "a" "b" { x = 2 }` )},
754771 }
755- result , diags , err := mergeOverrides ( fsys )
772+ result , diags , err := testMergeOverrides ( t , fsys )
756773 require .NoError (t , err )
757774 assert .Empty (t , diags )
758775
@@ -773,7 +790,7 @@ func TestFilteredReadDir(t *testing.T) {
773790 "other.tf" : & fstest.MapFile {Data : []byte (`resource "c" "d" { y = 1 }` )},
774791 "b_override.tf" : & fstest.MapFile {Data : []byte (`resource "c" "d" { y = 2 }` )},
775792 }
776- result , _ , err := mergeOverrides ( fsys )
793+ result , _ , err := testMergeOverrides ( t , fsys )
777794 require .NoError (t , err )
778795
779796 f , err := result .Open ("." )
0 commit comments