fuzzyworld

template / windows / files / config_test.go

Branch windows · default branch · all branches

config_test.go

Blame: the commit that last changed each line · file · history

763c260d 2022-10-06 Pavel Safronov1package main
2
3import (
4 "errors"
5 "os"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9)
10
9573ca02 2022-11-16 Pavel Safronov11const configPath string = "./test/test-config.yaml"
12
e86c26ae 2022-11-02 Pavel Safronov13// Compares YAML representation of two objects
14func compareObjectYaml(t *testing.T, expected, actual interface{}) {
15 expectedYaml, err := getYaml(expected)
16 assert.Nil(t, err, "Error marshalling expected")
17 actualYaml, err := getYaml(actual)
18 assert.Nil(t, err, "Error marshalling actual")
5e424f1b 2022-11-12 Pavel Safronov19 assert.Equal(t, len(expectedYaml), len(actualYaml), "Expected YAML and actual YAML are different lengths")
e86c26ae 2022-11-02 Pavel Safronov20 assert.Equal(t, expectedYaml, actualYaml)
21}
22
763c260d 2022-10-06 Pavel Safronov23func TestSaveLoadConfig(t *testing.T) {
05f9e8ef 2022-10-06 Pavel Safronov24
763c260d 2022-10-06 Pavel Safronov25 config := defaultConfig()
26
27 // save config
4ded4215 2022-10-26 Pavel Safronov28 err := saveConfig(configPath, config)
763c260d 2022-10-06 Pavel Safronov29 assert.Nil(t, err, "Error saving config")
30
31 // load config
32 loadedConfig, err := loadConfig(configPath)
33 assert.Nil(t, err, "Error loading config")
34
35 // test config
e86c26ae 2022-11-02 Pavel Safronov36 compareObjectYaml(t, loadedConfig, config)
763c260d 2022-10-06 Pavel Safronov37
38 // test load non-existent config
9573ca02 2022-11-16 Pavel Safronov39 _, err = loadConfig("./test/non-existent-file.yaml")
763c260d 2022-10-06 Pavel Safronov40 assert.NotNil(t, err, "Expected to fail to load config, but succeeded")
41
42 // test load invalid yaml
75a066b2 2022-11-16 Pavel Safronov43 err = os.WriteFile("./test/invalid-yaml.yaml", []byte("invalid yaml"), 0644)
44 assert.Nil(t, err, "Error writing invalid yaml file")
763c260d 2022-10-06 Pavel Safronov45 _, err = loadConfig("./test/invalid-yaml.yaml")
46 assert.NotNil(t, err, "Expected to fail to parse config, but succeeded")
47
48 // test saving config to invalid path
49 err = saveConfig("invalid/path/invalid-config.yaml", config)
50 assert.NotNil(t, err, "Expected to fail to save config, but succeeded")
51
52 // remove config
53 os.Remove(configPath)
54
55 // test default config creation
56 _, err = os.Stat(configPath)
57 assert.True(t, errors.Is(err, os.ErrNotExist), "Expected config file to not exist, but it does")
58
ae89a42a 2022-11-02 Pavel Safronov59 // fail to get config
60 _, err = loadConfig(configPath)
61 assert.NotNil(t, err, "Expected to fail to load config, but succeeded")
62
63 // create default config
64 err = saveConfig(configPath, defaultConfig())
e86c26ae 2022-11-02 Pavel Safronov65 assert.Nil(t, err, "Error saving config")
763c260d 2022-10-06 Pavel Safronov66
67 // test config
e86c26ae 2022-11-02 Pavel Safronov68 compareObjectYaml(t, loadedConfig, config)
763c260d 2022-10-06 Pavel Safronov69
70 // verify config file exists
71 stat1, err := os.Stat(configPath)
72 assert.Nil(t, err, "Expected config file to exist, but it does not")
73
74 // get and create config
ae89a42a 2022-11-02 Pavel Safronov75 loadedConfig, err = loadConfig(configPath)
763c260d 2022-10-06 Pavel Safronov76 assert.Nil(t, err, "Error loading config")
77
78 // test config
e86c26ae 2022-11-02 Pavel Safronov79 compareObjectYaml(t, loadedConfig, config)
763c260d 2022-10-06 Pavel Safronov80
81 // verify config file wasn't updated
82 stat2, err := os.Stat(configPath)
83 assert.Nil(t, err, "Expected config file to exist, but it does not")
84 assert.Equal(t, stat1.ModTime(), stat2.ModTime(), "Expected config file to not be modified, but it was")
85}
86
87func TestValidateDefaultConfig(t *testing.T) {
88 config := defaultConfig()
b0586433 2022-10-21 Pavel Safronov89 err := validateConfig(&config)
763c260d 2022-10-06 Pavel Safronov90 if err != nil {
91 t.Errorf("Expected to validate config, but failed: %v", err)
92 }
93}
94
95func TestValidateConfig(t *testing.T) {
05f9e8ef 2022-10-06 Pavel Safronov96 testFailure := func(config Config, errorText string) {
b0586433 2022-10-21 Pavel Safronov97 err := validateConfig(&config)
763c260d 2022-10-06 Pavel Safronov98 if err == nil {
99 t.Errorf("Expected to fail to validate config, but succeeded")
100 }
05f9e8ef 2022-10-06 Pavel Safronov101 assert.Contains(t, err.Error(), errorText)
763c260d 2022-10-06 Pavel Safronov102 }
103
05f9e8ef 2022-10-06 Pavel Safronov104 testFailure(Config{}, "no profiles found")
105 testFailure(Config{Profiles: []Profile{}}, "no profiles found")
106 testFailure(Config{Profiles: []Profile{
107 {
108 Name: "daily",
109 IsDefault: true,
1a02ef4e 2022-10-21 Pavel Safronov110 NamePatterns: []ParameterizedText{"daily"},
b0586433 2022-10-21 Pavel Safronov111 File: File{
112 Template: "foo",
113 },
05f9e8ef 2022-10-06 Pavel Safronov114 },
115 }}, "error validating profile")
763c260d 2022-10-06 Pavel Safronov116 testFailure(Config{Profiles: []Profile{
117 {
05f9e8ef 2022-10-06 Pavel Safronov118 Name: "daily",
119 IsDefault: true,
1a02ef4e 2022-10-21 Pavel Safronov120 NamePatterns: []ParameterizedText{"daily"},
05f9e8ef 2022-10-06 Pavel Safronov121 Type: FileType,
8c15a714 2022-11-04 Pavel Safronov122 Path: "foo",
b0586433 2022-10-21 Pavel Safronov123 File: File{
124 Template: "foo",
125 },
763c260d 2022-10-06 Pavel Safronov126 },
127 {
05f9e8ef 2022-10-06 Pavel Safronov128 Name: "daily2",
129 IsDefault: true,
1a02ef4e 2022-10-21 Pavel Safronov130 NamePatterns: []ParameterizedText{"daily"},
05f9e8ef 2022-10-06 Pavel Safronov131 Type: FileType,
8c15a714 2022-11-04 Pavel Safronov132 Path: "foo",
b0586433 2022-10-21 Pavel Safronov133 File: File{
134 Template: "foo",
135 },
763c260d 2022-10-06 Pavel Safronov136 },
05f9e8ef 2022-10-06 Pavel Safronov137 }}, "multiple default profiles found")
9573ca02 2022-11-16 Pavel Safronov138 testFailure(Config{Profiles: []Profile{
139 {
140 Name: "daily",
141 IsDefault: true,
142 NamePatterns: []ParameterizedText{"daily"},
143 Type: FileType,
144 Path: "foo",
145 File: File{
146 Template: "foo",
147 },
148 },
149 {
150 Name: "daily",
151 IsDefault: true,
152 NamePatterns: []ParameterizedText{"daily"},
153 Type: FileType,
154 Path: "foo",
155 File: File{
156 Template: "foo",
157 },
158 },
159 }}, "duplicate profile name 'daily'")
160}
161
162func TestLoadConfig(t *testing.T) {
163 bytes := []byte(`
164profiles:
165 - name:
166`)
75a066b2 2022-11-16 Pavel Safronov167 err := os.WriteFile("./test/invalid-config.yaml", bytes, 0644)
168 assert.Nil(t, err, "Error writing invalid config file")
9573ca02 2022-11-16 Pavel Safronov169
170 // load config
75a066b2 2022-11-16 Pavel Safronov171 _, err = loadConfig("./test/invalid-config.yaml")
9573ca02 2022-11-16 Pavel Safronov172 assert.NotNil(t, err, "Expected to fail to load config, but succeeded")
173 assert.Contains(t, err.Error(), "error validating profile : Profile name is required")
174}
175
176func TestSaveConfig(t *testing.T) {
177 config := Config{Profiles: []Profile{}}
178 err := saveConfig("./test/invalid-config.yaml", config)
179 assert.NotNil(t, err, "Expected to fail to save config, but succeeded")
180 assert.Contains(t, err.Error(), "no profiles found")
181}
182
183func TestMergeConfigs(t *testing.T) {
184 defaultConfig := defaultConfig()
185 testSuccess := func(config1 Config, config2 Config) Config {
186 config, err := mergeConfigs(config1, config2)
187 // compareObjectYaml(t, mergedConfig, expected)
188 assert.Nil(t, err, "Expected to merge configs, but failed")
189 return config
190 }
191 testFailure := func(config1 Config, config2 Config, errorText string) {
192 _, err := mergeConfigs(config1, config2)
193 assert.NotNil(t, err, "Expected to fail to merge configs, but succeeded")
194 assert.Contains(t, err.Error(), errorText)
195 }
196 testFailure(Config{}, Config{}, "no profiles found")
197 testFailure(Config{Profiles: []Profile{Profile{}}}, Config{}, "error validating config a: error validating profile : Profile name is required")
198 testFailure(Config{Profiles: []Profile{defaultConfig.Profiles[0]}}, Config{}, "error validating config b: no profiles found")
199
200 profile1 := defaultConfig.Profiles[0]
201 profile2 := defaultConfig.Profiles[1]
202 testSuccess(Config{Profiles: []Profile{profile1}}, Config{Profiles: []Profile{profile2}})
203
204 profile1_updated := profile1
205 profile1_updated.Description += " This profile has been updated!"
206
207 result := testSuccess(Config{Profiles: []Profile{profile1}}, Config{Profiles: []Profile{profile1_updated}})
208 assert.Equal(t, 1, len(result.Profiles))
209 assert.Equal(t, profile1_updated.Name, result.Profiles[0].Name)
763c260d 2022-10-06 Pavel Safronov210}