all repos

viye @ 0dd05131dc9f72c1b37a19c75e9c9329086f299f

my shot at reimplementing xiki

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
use olexsmir.xyz/x/is for asserts; test missing plumbings, 2 months 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
			is.Equal(t, val, cfg.Get(key))
23
		}
24
	})
25
26
	t.Run("loads existing config file", func(t *testing.T) {
27
		dir := t.TempDir()
28
		t.Setenv("XDG_CONFIG_HOME", dir)
29
30
		cfgDir := filepath.Join(dir, "viye.conf")
31
		is.Err(t, os.WriteFile(cfgDir, []byte("custom = value\n"), 0o644), nil)
32
33
		cfg, err := Load()
34
		is.Err(t, err, nil)
35
		is.Equal(t, "value", cfg.Get("custom"))
36
	})
37
38
	t.Run("invalid config file returns error", func(t *testing.T) {
39
		dir := t.TempDir()
40
		t.Setenv("XDG_CONFIG_HOME", dir)
41
42
		cfgDir := filepath.Join(dir, "viye.conf")
43
		is.Err(t, os.WriteFile(cfgDir, []byte("bad line\n"), 0o644), nil)
44
45
		_, err := Load()
46
		is.Err(t, err, ErrInvalidConfig)
47
	})
48
}
49
50
func TestSet(t *testing.T) {
51
	dir := t.TempDir()
52
	path := filepath.Join(dir, "conf")
53
	c := Config{
54
		cfgPath: path,
55
		cfg:     map[string]string{},
56
	}
57
58
	is.Err(t, c.Set("key", "val"), nil)
59
	is.Equal(t, "val", c.cfg["key"])
60
61
	b, err := os.ReadFile(path)
62
	is.Err(t, err, nil)
63
	is.Equal(t, "key = val\n", string(b))
64
}
65
66
func TestRead(t *testing.T) {
67
	t.Run("valid config", func(t *testing.T) {
68
		c := Config{cfg: make(map[string]string)}
69
		is.Err(t, c.read([]byte("key1 = value1\nkey2 = value2\n")), nil)
70
		is.Equal(t, "value1", c.cfg["key1"])
71
		is.Equal(t, "value2", c.cfg["key2"])
72
	})
73
74
	t.Run("trailing newline", func(t *testing.T) {
75
		c := Config{cfg: make(map[string]string)}
76
		is.Err(t, c.read([]byte("key = val\n")), nil)
77
		is.Equal(t, "val", c.cfg["key"])
78
	})
79
80
	t.Run("empty lines", func(t *testing.T) {
81
		c := Config{cfg: make(map[string]string)}
82
		is.Err(t, c.read([]byte("\nkey = val\n\n")), nil)
83
		is.Equal(t, "val", c.cfg["key"])
84
	})
85
86
	t.Run("multiple equals signs", func(t *testing.T) {
87
		c := Config{cfg: make(map[string]string)}
88
		is.Err(t, c.read([]byte("key = val = extra")), ErrInvalidConfig)
89
	})
90
91
	t.Run("no separator", func(t *testing.T) {
92
		c := Config{cfg: make(map[string]string)}
93
		is.Err(t, c.read([]byte("justtext")), ErrInvalidConfig)
94
	})
95
}