Add cache configuration to cli
Change-Id: I22b7eb9bd9a2fb9e7106ff20487e285638c5320f
diff --git a/config/cache_test.go b/config/cache_test.go
new file mode 100644
index 0000000..661a9e7
--- /dev/null
+++ b/config/cache_test.go
@@ -0,0 +1,182 @@
+package config
+
+import (
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestDefaultCacheConfig(t *testing.T) {
+ config := DefaultCacheConfig()
+
+ assert.True(t, config.Enabled)
+ assert.Equal(t, "5m", config.DefaultTTL)
+ assert.Equal(t, "2m", config.SearchTTL)
+ assert.Equal(t, "15m", config.MetadataTTL)
+ assert.Equal(t, 1000, config.MaxSize)
+}
+
+func TestCacheConfigValidate(t *testing.T) {
+ tests := []struct {
+ name string
+ config CacheConfig
+ wantError bool
+ errorMsg string
+ }{
+ {
+ name: "disabled cache",
+ config: CacheConfig{Enabled: false},
+ wantError: false,
+ },
+ {
+ name: "valid cache config",
+ config: CacheConfig{
+ Enabled: true,
+ DefaultTTL: "5m",
+ SearchTTL: "2m",
+ MetadataTTL: "15m",
+ MaxSize: 1000,
+ },
+ wantError: false,
+ },
+ {
+ name: "invalid max size",
+ config: CacheConfig{
+ Enabled: true,
+ DefaultTTL: "5m",
+ SearchTTL: "2m",
+ MetadataTTL: "15m",
+ MaxSize: 0,
+ },
+ wantError: true,
+ errorMsg: "cache max_size must be positive",
+ },
+ {
+ name: "invalid default TTL",
+ config: CacheConfig{
+ Enabled: true,
+ DefaultTTL: "invalid",
+ SearchTTL: "2m",
+ MetadataTTL: "15m",
+ MaxSize: 1000,
+ },
+ wantError: true,
+ errorMsg: "invalid default_ttl",
+ },
+ {
+ name: "invalid search TTL",
+ config: CacheConfig{
+ Enabled: true,
+ DefaultTTL: "5m",
+ SearchTTL: "bad-duration",
+ MetadataTTL: "15m",
+ MaxSize: 1000,
+ },
+ wantError: true,
+ errorMsg: "invalid search_ttl",
+ },
+ {
+ name: "invalid metadata TTL",
+ config: CacheConfig{
+ Enabled: true,
+ DefaultTTL: "5m",
+ SearchTTL: "2m",
+ MetadataTTL: "not-a-duration",
+ MaxSize: 1000,
+ },
+ wantError: true,
+ errorMsg: "invalid metadata_ttl",
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ err := tt.config.Validate()
+
+ if tt.wantError {
+ assert.Error(t, err)
+ assert.Contains(t, err.Error(), tt.errorMsg)
+ } else {
+ assert.NoError(t, err)
+ }
+ })
+ }
+}
+
+func TestCacheConfigGetTTLMethods(t *testing.T) {
+ config := &CacheConfig{
+ Enabled: true,
+ DefaultTTL: "5m",
+ SearchTTL: "2m",
+ MetadataTTL: "15m",
+ MaxSize: 1000,
+ }
+
+ // Test valid TTL parsing
+ assert.Equal(t, 5*time.Minute, config.GetDefaultTTL())
+ assert.Equal(t, 2*time.Minute, config.GetSearchTTL())
+ assert.Equal(t, 15*time.Minute, config.GetMetadataTTL())
+
+ // Test disabled cache returns 0
+ disabledConfig := &CacheConfig{Enabled: false}
+ assert.Equal(t, time.Duration(0), disabledConfig.GetDefaultTTL())
+ assert.Equal(t, time.Duration(0), disabledConfig.GetSearchTTL())
+ assert.Equal(t, time.Duration(0), disabledConfig.GetMetadataTTL())
+
+ // Test invalid TTL falls back to defaults
+ invalidConfig := &CacheConfig{
+ Enabled: true,
+ DefaultTTL: "invalid",
+ SearchTTL: "bad",
+ MetadataTTL: "worse",
+ }
+ assert.Equal(t, 5*time.Minute, invalidConfig.GetDefaultTTL())
+ assert.Equal(t, 2*time.Minute, invalidConfig.GetSearchTTL())
+ assert.Equal(t, 15*time.Minute, invalidConfig.GetMetadataTTL())
+}
+
+func TestCacheConfigVariousTTLFormats(t *testing.T) {
+ tests := []struct {
+ name string
+ ttl string
+ expected time.Duration
+ }{
+ {
+ name: "seconds",
+ ttl: "30s",
+ expected: 30 * time.Second,
+ },
+ {
+ name: "minutes",
+ ttl: "5m",
+ expected: 5 * time.Minute,
+ },
+ {
+ name: "hours",
+ ttl: "1h",
+ expected: 1 * time.Hour,
+ },
+ {
+ name: "mixed format",
+ ttl: "1h30m",
+ expected: 1*time.Hour + 30*time.Minute,
+ },
+ {
+ name: "microseconds",
+ ttl: "500ms",
+ expected: 500 * time.Millisecond,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ config := &CacheConfig{
+ Enabled: true,
+ DefaultTTL: tt.ttl,
+ }
+
+ assert.Equal(t, tt.expected, config.GetDefaultTTL())
+ })
+ }
+}