summaryrefslogtreecommitdiff
path: root/internal/config/config_test.go
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2022-12-11 13:03:15 +0000
committerLibravatar GitHub <noreply@github.com>2022-12-11 13:03:15 +0000
commitcb2b2fd8058a71826f23f60036cb0232eee113c7 (patch)
tree761e6c0acc211c8ca9e8b957cd99d1e93668eebe /internal/config/config_test.go
parent[docs] Caching webfinger with nginx (#1242) (diff)
downloadgotosocial-cb2b2fd8058a71826f23f60036cb0232eee113c7.tar.xz
[feature] support configuring database caches (#1246)
* update config generator to support nested structs, add cache configuration options * update envparsing test * add cache configuration to config parse tests * set cache configuration in testrig * move caches to sub-cache "gts" namespace, update envparsing, add cache config docs to example config Signed-off-by: kim <grufwub@gmail.com>
Diffstat (limited to 'internal/config/config_test.go')
-rw-r--r--internal/config/config_test.go206
1 files changed, 206 insertions, 0 deletions
diff --git a/internal/config/config_test.go b/internal/config/config_test.go
new file mode 100644
index 000000000..5f41cbe08
--- /dev/null
+++ b/internal/config/config_test.go
@@ -0,0 +1,206 @@
+/*
+ GoToSocial
+ Copyright (C) 2022 GoToSocial Authors admin@gotosocial.org
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package config_test
+
+import (
+ "os"
+ "strings"
+ "testing"
+
+ "github.com/spf13/cobra"
+ "github.com/spf13/viper"
+ "github.com/stretchr/testify/assert"
+ "github.com/superseriousbusiness/gotosocial/internal/config"
+ "gopkg.in/yaml.v3"
+)
+
+func expectedKV(kvpairs ...string) map[string]interface{} {
+ ret := make(map[string]interface{}, len(kvpairs)/2)
+
+ for i := 0; i < len(kvpairs)-1; i += 2 {
+ ret[kvpairs[i]] = kvpairs[i+1]
+ }
+
+ return ret
+}
+
+func expectedFile(t *testing.T, file string) map[string]interface{} {
+ expectedConfig, err := os.ReadFile(file)
+ if err != nil {
+ t.Errorf("error reading expected config from file %q: %v", file, err)
+ }
+
+ var ret map[string]interface{}
+ if err := yaml.Unmarshal(expectedConfig, &ret); err != nil {
+ t.Errorf("error parsing expected config from file %q: %v", file, err)
+ }
+
+ return ret
+}
+
+func TestCLIParsing(t *testing.T) {
+ type testcase struct {
+ cli []string
+ env []string
+ expected map[string]interface{}
+ }
+
+ defaults, _ := config.Defaults.MarshalMap()
+
+ testcases := map[string]testcase{
+ "Make sure defaults are set correctly": {
+ expected: defaults,
+ },
+
+ "Override db-address from default using cli flag": {
+ cli: []string{
+ "--db-address", "some.db.address",
+ },
+ expected: expectedKV(
+ "db-address", "some.db.address",
+ ),
+ },
+
+ "Override db-address from default using env var": {
+ env: []string{
+ "GTS_DB_ADDRESS=some.db.address",
+ },
+ expected: expectedKV(
+ "db-address", "some.db.address",
+ ),
+ },
+
+ "Override db-address from default using both env var and cli flag. The cli flag should take priority": {
+ cli: []string{
+ "--db-address", "some.db.address",
+ },
+ env: []string{
+ "GTS_DB_ADDRESS=some.other.db.address",
+ },
+ expected: expectedKV(
+ "db-address", "some.db.address",
+ ),
+ },
+
+ "Loading a config file via env var": {
+ env: []string{
+ "GTS_CONFIG_PATH=testdata/test.yaml",
+ },
+ expected: expectedFile(t, "testdata/test.yaml"),
+ },
+
+ "Loading a config file via cli flag": {
+ cli: []string{
+ "--config-path", "testdata/test.yaml",
+ },
+ expected: expectedFile(t, "testdata/test.yaml"),
+ },
+
+ "Loading a config file and overriding one of the variables with a cli flag": {
+ cli: []string{
+ "--config-path", "testdata/test.yaml",
+ "--account-domain", "my.test.domain",
+ },
+ // only checking our overridden one and one non-default from the config file here instead of including all of test.yaml
+ expected: expectedKV(
+ "account-domain", "my.test.domain",
+ "host", "gts.example.org",
+ ),
+ },
+
+ "Loading a config file and overriding one of the variables with an env var": {
+ cli: []string{
+ "--config-path", "testdata/test.yaml",
+ },
+ env: []string{
+ "GTS_ACCOUNT_DOMAIN=my.test.domain",
+ },
+ // only checking our overridden one and one non-default from the config file here instead of including all of test.yaml
+ expected: expectedKV(
+ "account-domain", "my.test.domain",
+ "host", "gts.example.org",
+ ),
+ },
+
+ "Loading a config file and overriding one of the variables with both an env var and a cli flag. The cli flag should have priority": {
+ cli: []string{
+ "--config-path", "testdata/test.yaml",
+ "--account-domain", "my.test.domain",
+ },
+ env: []string{
+ "GTS_ACCOUNT_DOMAIN=my.wrong.test.domain",
+ },
+ // only checking our overridden one and one non-default from the config file here instead of including all of test.yaml
+ expected: expectedKV(
+ "account-domain", "my.test.domain",
+ "host", "gts.example.org",
+ ),
+ },
+
+ "Loading a config file from json": {
+ cli: []string{
+ "--config-path", "testdata/test.json",
+ },
+ expected: expectedFile(t, "testdata/test.json"),
+ },
+
+ "Loading a partial config file. Default values should be used apart from those set in the config file": {
+ cli: []string{
+ "--config-path", "testdata/test2.yaml",
+ },
+ expected: expectedKV(
+ "log-level", "trace",
+ "account-domain", "peepee.poopoo",
+ "application-name", "gotosocial",
+ ),
+ },
+ }
+
+ for desc, data := range testcases {
+ t.Run(desc, func(t *testing.T) {
+ os.Clearenv()
+
+ if data.env != nil {
+ for _, s := range data.env {
+ kv := strings.SplitN(s, "=", 2)
+ os.Setenv(kv[0], kv[1])
+ }
+ }
+
+ state := config.NewState()
+ cmd := cobra.Command{}
+ state.AddGlobalFlags(&cmd)
+ state.AddServerFlags(&cmd)
+
+ if data.cli != nil {
+ cmd.ParseFlags(data.cli)
+ }
+
+ state.BindFlags(&cmd)
+
+ state.Reload()
+
+ state.Viper(func(v *viper.Viper) {
+ for k, ev := range data.expected {
+ assert.EqualValues(t, ev, v.Get(k))
+ }
+ })
+ })
+ }
+}