blob: 661a9e712a185b4131bbcf33e8bc78b483b684c4 [file] [log] [blame]
Akrone73bc912025-06-17 16:36:45 +02001package config
2
3import (
4 "testing"
5 "time"
6
7 "github.com/stretchr/testify/assert"
8)
9
10func TestDefaultCacheConfig(t *testing.T) {
11 config := DefaultCacheConfig()
12
13 assert.True(t, config.Enabled)
14 assert.Equal(t, "5m", config.DefaultTTL)
15 assert.Equal(t, "2m", config.SearchTTL)
16 assert.Equal(t, "15m", config.MetadataTTL)
17 assert.Equal(t, 1000, config.MaxSize)
18}
19
20func TestCacheConfigValidate(t *testing.T) {
21 tests := []struct {
22 name string
23 config CacheConfig
24 wantError bool
25 errorMsg string
26 }{
27 {
28 name: "disabled cache",
29 config: CacheConfig{Enabled: false},
30 wantError: false,
31 },
32 {
33 name: "valid cache config",
34 config: CacheConfig{
35 Enabled: true,
36 DefaultTTL: "5m",
37 SearchTTL: "2m",
38 MetadataTTL: "15m",
39 MaxSize: 1000,
40 },
41 wantError: false,
42 },
43 {
44 name: "invalid max size",
45 config: CacheConfig{
46 Enabled: true,
47 DefaultTTL: "5m",
48 SearchTTL: "2m",
49 MetadataTTL: "15m",
50 MaxSize: 0,
51 },
52 wantError: true,
53 errorMsg: "cache max_size must be positive",
54 },
55 {
56 name: "invalid default TTL",
57 config: CacheConfig{
58 Enabled: true,
59 DefaultTTL: "invalid",
60 SearchTTL: "2m",
61 MetadataTTL: "15m",
62 MaxSize: 1000,
63 },
64 wantError: true,
65 errorMsg: "invalid default_ttl",
66 },
67 {
68 name: "invalid search TTL",
69 config: CacheConfig{
70 Enabled: true,
71 DefaultTTL: "5m",
72 SearchTTL: "bad-duration",
73 MetadataTTL: "15m",
74 MaxSize: 1000,
75 },
76 wantError: true,
77 errorMsg: "invalid search_ttl",
78 },
79 {
80 name: "invalid metadata TTL",
81 config: CacheConfig{
82 Enabled: true,
83 DefaultTTL: "5m",
84 SearchTTL: "2m",
85 MetadataTTL: "not-a-duration",
86 MaxSize: 1000,
87 },
88 wantError: true,
89 errorMsg: "invalid metadata_ttl",
90 },
91 }
92
93 for _, tt := range tests {
94 t.Run(tt.name, func(t *testing.T) {
95 err := tt.config.Validate()
96
97 if tt.wantError {
98 assert.Error(t, err)
99 assert.Contains(t, err.Error(), tt.errorMsg)
100 } else {
101 assert.NoError(t, err)
102 }
103 })
104 }
105}
106
107func TestCacheConfigGetTTLMethods(t *testing.T) {
108 config := &CacheConfig{
109 Enabled: true,
110 DefaultTTL: "5m",
111 SearchTTL: "2m",
112 MetadataTTL: "15m",
113 MaxSize: 1000,
114 }
115
116 // Test valid TTL parsing
117 assert.Equal(t, 5*time.Minute, config.GetDefaultTTL())
118 assert.Equal(t, 2*time.Minute, config.GetSearchTTL())
119 assert.Equal(t, 15*time.Minute, config.GetMetadataTTL())
120
121 // Test disabled cache returns 0
122 disabledConfig := &CacheConfig{Enabled: false}
123 assert.Equal(t, time.Duration(0), disabledConfig.GetDefaultTTL())
124 assert.Equal(t, time.Duration(0), disabledConfig.GetSearchTTL())
125 assert.Equal(t, time.Duration(0), disabledConfig.GetMetadataTTL())
126
127 // Test invalid TTL falls back to defaults
128 invalidConfig := &CacheConfig{
129 Enabled: true,
130 DefaultTTL: "invalid",
131 SearchTTL: "bad",
132 MetadataTTL: "worse",
133 }
134 assert.Equal(t, 5*time.Minute, invalidConfig.GetDefaultTTL())
135 assert.Equal(t, 2*time.Minute, invalidConfig.GetSearchTTL())
136 assert.Equal(t, 15*time.Minute, invalidConfig.GetMetadataTTL())
137}
138
139func TestCacheConfigVariousTTLFormats(t *testing.T) {
140 tests := []struct {
141 name string
142 ttl string
143 expected time.Duration
144 }{
145 {
146 name: "seconds",
147 ttl: "30s",
148 expected: 30 * time.Second,
149 },
150 {
151 name: "minutes",
152 ttl: "5m",
153 expected: 5 * time.Minute,
154 },
155 {
156 name: "hours",
157 ttl: "1h",
158 expected: 1 * time.Hour,
159 },
160 {
161 name: "mixed format",
162 ttl: "1h30m",
163 expected: 1*time.Hour + 30*time.Minute,
164 },
165 {
166 name: "microseconds",
167 ttl: "500ms",
168 expected: 500 * time.Millisecond,
169 },
170 }
171
172 for _, tt := range tests {
173 t.Run(tt.name, func(t *testing.T) {
174 config := &CacheConfig{
175 Enabled: true,
176 DefaultTTL: tt.ttl,
177 }
178
179 assert.Equal(t, tt.expected, config.GetDefaultTTL())
180 })
181 }
182}