package config_test import ( "strings" "testing" "sneak.berlin/go/netwatch/internal/config" "sneak.berlin/go/netwatch/internal/globals" "sneak.berlin/go/netwatch/internal/logger" "go.uber.org/fx" ) // requireConfigError builds the config as main does and fails the // test unless that fails with an error naming setting. It uses // fx.New, because fxtest.New fails the test itself on an error. func requireConfigError(t *testing.T, setting string) { t.Helper() app := fx.New( fx.NopLogger, fx.Provide(globals.New, logger.New, config.New), fx.Invoke(func(*config.Config) {}), ) err := app.Err() if err == nil || !strings.Contains(err.Error(), setting) { t.Fatalf("config error = %v, want one naming %s", err, setting) } } // TestReportsPerMinuteMustBePositive: unchecked, zero would panic // when the routes are built, and a negative rate would lift the // limit. func TestReportsPerMinuteMustBePositive(t *testing.T) { t.Setenv("REPORTS_PER_MINUTE", "0") requireConfigError(t, "REPORTS_PER_MINUTE") } // TestDataDirMaxBytesMustBeANumber: viper reads a value that is not // a number, such as "1GB", as 0, which would refuse every report. func TestDataDirMaxBytesMustBeANumber(t *testing.T) { t.Setenv("DATA_DIR_MAX_BYTES", "1GB") requireConfigError(t, "DATA_DIR_MAX_BYTES") }