textmachine/backend/cmd/tmctl/dotenv_test.go

51 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"os"
"path/filepath"
"reflect"
"strings"
"testing"
)
// dotenv_test.go pins the .env parsing rules that used to live only in comments:
// парные кавычки (регресс «упростили в strings.Trim» портил бы API-ключи и
// всплывал бы 401-ми посреди прогона) и «выставленное окружение не перекрывать».
func TestParseDotEnvPairedQuotes(t *testing.T) {
in := strings.Join([]string{
`A="v1"`, // парные двойные — снять
`B='v2'`, // парные одинарные — снять
`C="v3'`, // РАЗНЫЕ кавычки — не трогать
`D=v4"`, // хвостовая кавычка без парной — оставить (главный регресс-кейс)
`E="`, // одиночная кавычка (n<2) — оставить
`F=""`, // пустые парные — пустая строка
` G = v7 `, // трим ключа и значения
`# comment`, // комментарий — пропустить
``, // пустая — пропустить
`no-equals-line`, // без «=» — пропустить
}, "\n")
got := parseDotEnv(strings.NewReader(in))
want := []dotenvPair{
{"A", "v1"}, {"B", "v2"}, {"C", `"v3'`}, {"D", `v4"`}, {"E", `"`}, {"F", ""}, {"G", "v7"},
}
if !reflect.DeepEqual(got, want) {
t.Fatalf("parseDotEnv:\n got %+v\n want %+v", got, want)
}
}
func TestLoadDotEnvDoesNotOverride(t *testing.T) {
path := filepath.Join(t.TempDir(), ".env")
if err := os.WriteFile(path, []byte("TM_TEST_SET=from_file\nTM_TEST_UNSET=filled\n"), 0o600); err != nil {
t.Fatal(err)
}
t.Setenv("TM_TEST_SET", "from_env")
t.Setenv("TM_TEST_UNSET", "") // выставленная В ПУСТОТУ считается невыставленной (заморожено)
loadDotEnv(path)
if got := os.Getenv("TM_TEST_SET"); got != "from_env" {
t.Fatalf("an already-set variable must win over .env, got %q", got)
}
if got := os.Getenv("TM_TEST_UNSET"); got != "filled" {
t.Fatalf("an empty variable is treated as unset (frozen behaviour), got %q", got)
}
}