all repos

viye @ 12fd7c3

my shot at reimplementing xiki

viye/internal/config/config_test.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
add sql tool, 1 month ago
1
package config
2
3
import (
4
	"os"
5
	"path/filepath"
6
	"testing"
7
8
	"olexsmir.xyz/x/is"
9
)
10
11
func TestLoad(t *testing.T) {
12
	t.Run("creates default config when file missing", func(t *testing.T) {
13
		want := Config{cfg: make(map[string]string)}
14
		is.Err(t, want.read(defaultConfig), nil)
15
16
		dir := t.TempDir()
17
		t.Setenv("XDG_CONFIG_HOME", dir)
18
19
		cfg, err := Load()
20
		is.Err(t, err, nil)
21
		for key, val := range want.cfg {
22
			v, _ := cfg.Get(key)
23
			is.Equal(t, val, v)
24
		}
25
	})
26
27
	t.Run("loads existing config file", func(t *testing.T) {
28
		dir := t.TempDir()
29
		t.Setenv("XDG_CONFIG_HOME", dir)
30
31
		cfgDir := filepath.Join(dir, "viye.conf")
32
		is.Err(t, os.WriteFile(cfgDir, []byte("custom = value\n"), 0o644), nil)
33
34
		cfg, err := Load()
35
		is.Err(t, err, nil)
36
37
		val, ok := cfg.Get("custom")
38
		is.Equal(t, "value", val)
39
		is.Equal(t, true, ok)
40
	})
41
42
	t.Run("invalid config file returns error", func(t *testing.T) {
43
		dir := t.TempDir()
44
		t.Setenv("XDG_CONFIG_HOME", dir)
45
46
		cfgDir := filepath.Join(dir, "viye.conf")
47
		is.Err(t, os.WriteFile(cfgDir, []byte("bad line\n"), 0o644), nil)
48
49
		_, err := Load()
50
		is.Err(t, err, ErrInvalidConfig)
51
	})
52
}
53
54
func TestSet(t *testing.T) {
55
	dir := t.TempDir()
56
	path := filepath.Join(dir, "conf")
57
	c := Config{
58
		cfgPath: path,
59
		cfg:     map[string]string{},
60
	}
61
62
	is.Err(t, c.Set("key", "val"), nil)
63
	is.Equal(t, "val", c.cfg["key"])
64
65
	b, err := os.ReadFile(path)
66
	is.Err(t, err, nil)
67
	is.Equal(t, "key = val\n", string(b))
68
}
69
70
func TestRead(t *testing.T) {
71
	t.Run("valid config", func(t *testing.T) {
72
		c := Config{cfg: make(map[string]string)}
73
		is.Err(t, c.read([]byte("key1 = value1\nkey2 = value2\n")), nil)
74
		is.Equal(t, "value1", c.cfg["key1"])
75
		is.Equal(t, "value2", c.cfg["key2"])
76
	})
77
78
	t.Run("trailing newline", func(t *testing.T) {
79
		c := Config{cfg: make(map[string]string)}
80
		is.Err(t, c.read([]byte("key = val\n")), nil)
81
		is.Equal(t, "val", c.cfg["key"])
82
	})
83
84
	t.Run("empty lines", func(t *testing.T) {
85
		c := Config{cfg: make(map[string]string)}
86
		is.Err(t, c.read([]byte("\nkey = val\n\n")), nil)
87
		is.Equal(t, "val", c.cfg["key"])
88
	})
89
90
	t.Run("multiple equals signs", func(t *testing.T) {
91
		c := Config{cfg: make(map[string]string)}
92
		is.Err(t, c.read([]byte("key = val = extra")), ErrInvalidConfig)
93
	})
94
95
	t.Run("no separator", func(t *testing.T) {
96
		c := Config{cfg: make(map[string]string)}
97
		is.Err(t, c.read([]byte("justtext")), ErrInvalidConfig)
98
	})
99
}