all repos

viye @ fa602cd

my shot at reimplementing xiki

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
add config, 2 months ago
1
package config
2
3
import (
4
	"os"
5
	"path/filepath"
6
	"testing"
7
)
8
9
func TestLoad(t *testing.T) {
10
	t.Run("creates default config when file missing", func(t *testing.T) {
11
		want := Config{cfg: make(map[string]string)}
12
		if err := want.read(defaultConfig); err != nil {
13
			t.Fatal(err)
14
		}
15
16
		dir := t.TempDir()
17
		t.Setenv("XDG_CONFIG_HOME", dir)
18
19
		cfg, err := Load()
20
		if err != nil {
21
			t.Fatalf("Load() = _, %v", err)
22
		}
23
		for key, val := range want.cfg {
24
			if cfg.Get(key) != val {
25
				t.Fatalf("got %s=%q, want %q", key, cfg.Get(key), val)
26
			}
27
		}
28
	})
29
30
	t.Run("loads existing config file", func(t *testing.T) {
31
		dir := t.TempDir()
32
		t.Setenv("XDG_CONFIG_HOME", dir)
33
34
		cfgDir := filepath.Join(dir, "viye.conf")
35
		if err := os.WriteFile(cfgDir, []byte("custom = value\n"), 0o644); err != nil {
36
			t.Fatal(err)
37
		}
38
39
		cfg, err := Load()
40
		if err != nil {
41
			t.Fatalf("Load() = _, %v", err)
42
		}
43
		if cfg.Get("custom") != "value" {
44
			t.Fatalf("got custom=%q, want %q", cfg.Get("custom"), "value")
45
		}
46
	})
47
48
	t.Run("invalid config file returns error", func(t *testing.T) {
49
		dir := t.TempDir()
50
		t.Setenv("XDG_CONFIG_HOME", dir)
51
52
		cfgDir := filepath.Join(dir, "viye.conf")
53
		if err := os.WriteFile(cfgDir, []byte("bad line\n"), 0o644); err != nil {
54
			t.Fatal(err)
55
		}
56
57
		_, err := Load()
58
		if err != ErrInvalidConfig {
59
			t.Fatalf("got %v, want ErrInvalidConfig", err)
60
		}
61
	})
62
}
63
64
func TestSet(t *testing.T) {
65
	dir := t.TempDir()
66
	path := filepath.Join(dir, "conf")
67
	c := Config{
68
		cfgPath: path,
69
		cfg:     map[string]string{},
70
	}
71
72
	if err := c.Set("key", "val"); err != nil {
73
		t.Fatal(err)
74
	}
75
	if c.cfg["key"] != "val" {
76
		t.Fatalf("in-memory: got %v, want key=val", c.cfg)
77
	}
78
79
	b, err := os.ReadFile(path)
80
	if err != nil {
81
		t.Fatal(err)
82
	}
83
	if string(b) != "key = val\n" {
84
		t.Fatalf("on disk: got %q, want %q", string(b), "key = val\n")
85
	}
86
}
87
88
func TestRead(t *testing.T) {
89
	t.Run("valid config", func(t *testing.T) {
90
		c := Config{cfg: make(map[string]string)}
91
		err := c.read([]byte("key1 = value1\nkey2 = value2\n"))
92
		if err != nil {
93
			t.Fatalf("unexpected error: %v", err)
94
		}
95
		if c.cfg["key1"] != "value1" || c.cfg["key2"] != "value2" {
96
			t.Fatalf("got %v, want key1=value1 key2=value2", c.cfg)
97
		}
98
	})
99
100
	t.Run("trailing newline", func(t *testing.T) {
101
		c := Config{cfg: make(map[string]string)}
102
		err := c.read([]byte("key = val\n"))
103
		if err != nil {
104
			t.Fatalf("unexpected error: %v", err)
105
		}
106
		if c.cfg["key"] != "val" {
107
			t.Fatalf("got %v, want key=val", c.cfg)
108
		}
109
	})
110
111
	t.Run("empty lines", func(t *testing.T) {
112
		c := Config{cfg: make(map[string]string)}
113
		err := c.read([]byte("\nkey = val\n\n"))
114
		if err != nil {
115
			t.Fatalf("unexpected error: %v", err)
116
		}
117
		if c.cfg["key"] != "val" {
118
			t.Fatalf("got %v, want key=val", c.cfg)
119
		}
120
	})
121
122
	t.Run("multiple equals signs", func(t *testing.T) {
123
		c := Config{cfg: make(map[string]string)}
124
		err := c.read([]byte("key = val = extra"))
125
		if err != ErrInvalidConfig {
126
			t.Fatalf("got %v, want ErrInvalidConfig", err)
127
		}
128
	})
129
130
	t.Run("no separator", func(t *testing.T) {
131
		c := Config{cfg: make(map[string]string)}
132
		err := c.read([]byte("justtext"))
133
		if err != ErrInvalidConfig {
134
			t.Fatalf("got %v, want ErrInvalidConfig", err)
135
		}
136
	})
137
}