@@ -3,12 +3,15 @@ package config
3
3
import (
4
4
"bytes"
5
5
_ "embed"
6
+ "fmt"
7
+ "os"
6
8
"path"
7
9
"strings"
8
10
"testing"
9
11
fs "testing/fstest"
10
12
11
13
"github.com/BurntSushi/toml"
14
+ "github.com/spf13/viper"
12
15
"github.com/stretchr/testify/assert"
13
16
"github.com/stretchr/testify/require"
14
17
)
@@ -525,3 +528,90 @@ func TestLoadFunctionErrorMessageParsing(t *testing.T) {
525
528
assert .ErrorContains (t , err , `'functions[verify_jwt]' expected a map, got 'bool'` )
526
529
})
527
530
}
531
+
532
+ func TestLoadEnvIfExists (t * testing.T ) {
533
+ t .Run ("returns nil when file does not exist" , func (t * testing.T ) {
534
+ err := loadEnvIfExists ("nonexistent.env" )
535
+ assert .NoError (t , err )
536
+ })
537
+
538
+ t .Run ("returns raw error when file exists but is malformed and DEBUG=1" , func (t * testing.T ) {
539
+ // Set DEBUG=1
540
+ t .Setenv ("DEBUG" , "1" )
541
+ viper .AutomaticEnv ()
542
+
543
+ // Create a temporary file with malformed content
544
+ tmpFile , err := os .CreateTemp ("" , "test-*.env" )
545
+ require .NoError (t , err )
546
+ defer os .Remove (tmpFile .Name ())
547
+
548
+ // Write malformed content
549
+ _ , err = tmpFile .WriteString ("[invalid]\n value=secret_value\n " )
550
+ require .NoError (t , err )
551
+ require .NoError (t , tmpFile .Close ())
552
+
553
+ // Test loading the malformed file
554
+ err = loadEnvIfExists (tmpFile .Name ())
555
+ // Should contain the raw error, including the secret value
556
+ assert .ErrorContains (t , err , "unexpected character" )
557
+ assert .ErrorContains (t , err , "secret_value" )
558
+ })
559
+
560
+ t .Run ("returns error when file exists but is malformed invalid character" , func (t * testing.T ) {
561
+ // Create a temporary file with malformed content
562
+ tmpFile , err := os .CreateTemp ("" , "test-*.env" )
563
+ require .NoError (t , err )
564
+ defer os .Remove (tmpFile .Name ())
565
+
566
+ // Write malformed content
567
+ _ , err = tmpFile .WriteString ("[invalid]\n value=secret_value\n " )
568
+ require .NoError (t , err )
569
+ require .NoError (t , tmpFile .Close ())
570
+
571
+ // Test loading the malformed file
572
+ err = loadEnvIfExists (tmpFile .Name ())
573
+ assert .ErrorContains (t , err , fmt .Sprintf ("failed to parse environment file: %s (unexpected character '[' in variable name)" , tmpFile .Name ()))
574
+ assert .NotContains (t , err .Error (), "secret_value" )
575
+ })
576
+
577
+ t .Run ("returns error when file exists but is malformed unterminated quotes" , func (t * testing.T ) {
578
+ // Create a temporary file with malformed content
579
+ tmpFile , err := os .CreateTemp ("" , "test-*.env" )
580
+ require .NoError (t , err )
581
+ defer os .Remove (tmpFile .Name ())
582
+
583
+ // Write malformed content
584
+ _ , err = tmpFile .WriteString ("value=\" secret_value\n " )
585
+ require .NoError (t , err )
586
+ require .NoError (t , tmpFile .Close ())
587
+
588
+ // Test loading the malformed file
589
+ err = loadEnvIfExists (tmpFile .Name ())
590
+ assert .ErrorContains (t , err , fmt .Sprintf ("failed to parse environment file: %s (unterminated quoted value)" , tmpFile .Name ()))
591
+ assert .NotContains (t , err .Error (), "secret_value" )
592
+ })
593
+
594
+ t .Run ("loads valid env file successfully" , func (t * testing.T ) {
595
+ // Create a temporary file with valid content
596
+ tmpFile , err := os .CreateTemp ("" , "test-*.env" )
597
+ require .NoError (t , err )
598
+ defer os .Remove (tmpFile .Name ())
599
+
600
+ // Write valid content
601
+ _ , err = tmpFile .WriteString ("TEST_KEY=test_value\n ANOTHER_KEY=another_value" )
602
+ require .NoError (t , err )
603
+ require .NoError (t , tmpFile .Close ())
604
+
605
+ // Test loading the valid file
606
+ err = loadEnvIfExists (tmpFile .Name ())
607
+ assert .NoError (t , err )
608
+
609
+ // Verify environment variables were loaded
610
+ assert .Equal (t , "test_value" , os .Getenv ("TEST_KEY" ))
611
+ assert .Equal (t , "another_value" , os .Getenv ("ANOTHER_KEY" ))
612
+
613
+ // Clean up environment variables
614
+ os .Unsetenv ("TEST_KEY" )
615
+ os .Unsetenv ("ANOTHER_KEY" )
616
+ })
617
+ }
0 commit comments