@@ -2,9 +2,12 @@ package helper
22
33import (
44 "testing"
5+ "time"
56
67 "github.com/mycontroller-org/server/v2/pkg/types/cmap"
78 sfTY "github.com/mycontroller-org/server/v2/pkg/types/service_filter"
9+ storageTY "github.com/mycontroller-org/server/v2/plugin/database/storage/types"
10+ "github.com/stretchr/testify/assert"
811 "github.com/stretchr/testify/require"
912)
1013
@@ -170,3 +173,112 @@ func TestIsMine(t *testing.T) {
170173 }
171174
172175}
176+
177+ func TestCompareTime (t * testing.T ) {
178+ base := time .Date (2024 , time .June , 15 , 12 , 0 , 0 , 0 , time .UTC )
179+ earlier := time .Date (2024 , time .June , 10 , 12 , 0 , 0 , 0 , time .UTC )
180+ later := time .Date (2024 , time .June , 20 , 12 , 0 , 0 , 0 , time .UTC )
181+
182+ baseStr := base .Format (time .RFC3339 )
183+ earlierStr := earlier .Format (time .RFC3339 )
184+
185+ tests := []struct {
186+ name string
187+ value time.Time
188+ operator string
189+ filter string
190+ expected bool
191+ }{
192+ {name : "eq match" , value : base , operator : storageTY .OperatorEqual , filter : baseStr , expected : true },
193+ {name : "eq no match" , value : base , operator : storageTY .OperatorEqual , filter : earlierStr , expected : false },
194+ {name : "ne match" , value : base , operator : storageTY .OperatorNotEqual , filter : earlierStr , expected : true },
195+ {name : "ne no match" , value : base , operator : storageTY .OperatorNotEqual , filter : baseStr , expected : false },
196+ {name : "gt match" , value : later , operator : storageTY .OperatorGreaterThan , filter : baseStr , expected : true },
197+ {name : "gt equal no match" , value : base , operator : storageTY .OperatorGreaterThan , filter : baseStr , expected : false },
198+ {name : "gt earlier no match" , value : earlier , operator : storageTY .OperatorGreaterThan , filter : baseStr , expected : false },
199+ {name : "gte match equal" , value : base , operator : storageTY .OperatorGreaterThanEqual , filter : baseStr , expected : true },
200+ {name : "gte match greater" , value : later , operator : storageTY .OperatorGreaterThanEqual , filter : baseStr , expected : true },
201+ {name : "gte no match" , value : earlier , operator : storageTY .OperatorGreaterThanEqual , filter : baseStr , expected : false },
202+ {name : "lt match" , value : earlier , operator : storageTY .OperatorLessThan , filter : baseStr , expected : true },
203+ {name : "lt equal no match" , value : base , operator : storageTY .OperatorLessThan , filter : baseStr , expected : false },
204+ {name : "lt later no match" , value : later , operator : storageTY .OperatorLessThan , filter : baseStr , expected : false },
205+ {name : "lte match equal" , value : base , operator : storageTY .OperatorLessThanEqual , filter : baseStr , expected : true },
206+ {name : "lte match less" , value : earlier , operator : storageTY .OperatorLessThanEqual , filter : baseStr , expected : true },
207+ {name : "lte no match" , value : later , operator : storageTY .OperatorLessThanEqual , filter : baseStr , expected : false },
208+ {name : "invalid filter value" , value : base , operator : storageTY .OperatorEqual , filter : "not-a-time" , expected : false },
209+ {name : "unknown operator" , value : base , operator : "unknown" , filter : baseStr , expected : false },
210+ }
211+
212+ for _ , tc := range tests {
213+ t .Run (tc .name , func (t * testing.T ) {
214+ result := CompareTime (tc .value , tc .operator , tc .filter )
215+ assert .Equal (t , tc .expected , result )
216+ })
217+ }
218+ }
219+
220+ func TestIsMatchingTimeField (t * testing.T ) {
221+ type event struct {
222+ ID string
223+ CreatedAt time.Time
224+ }
225+
226+ base := time .Date (2024 , time .June , 15 , 12 , 0 , 0 , 0 , time .UTC )
227+ earlier := time .Date (2024 , time .June , 10 , 12 , 0 , 0 , 0 , time .UTC )
228+ later := time .Date (2024 , time .June , 20 , 12 , 0 , 0 , 0 , time .UTC )
229+
230+ tests := []struct {
231+ name string
232+ entity interface {}
233+ filters []storageTY.Filter
234+ expected bool
235+ }{
236+ {
237+ name : "gt match" ,
238+ entity : & event {ID : "1" , CreatedAt : later },
239+ filters : []storageTY.Filter {
240+ {Key : "createdAt" , Operator : storageTY .OperatorGreaterThan , Value : base .Format (time .RFC3339 )},
241+ },
242+ expected : true ,
243+ },
244+ {
245+ name : "gt no match" ,
246+ entity : & event {ID : "2" , CreatedAt : earlier },
247+ filters : []storageTY.Filter {
248+ {Key : "createdAt" , Operator : storageTY .OperatorGreaterThan , Value : base .Format (time .RFC3339 )},
249+ },
250+ expected : false ,
251+ },
252+ {
253+ name : "lt match" ,
254+ entity : & event {ID : "3" , CreatedAt : earlier },
255+ filters : []storageTY.Filter {
256+ {Key : "createdAt" , Operator : storageTY .OperatorLessThan , Value : base .Format (time .RFC3339 )},
257+ },
258+ expected : true ,
259+ },
260+ {
261+ name : "lte match equal" ,
262+ entity : & event {ID : "4" , CreatedAt : base },
263+ filters : []storageTY.Filter {
264+ {Key : "createdAt" , Operator : storageTY .OperatorLessThanEqual , Value : base .Format (time .RFC3339 )},
265+ },
266+ expected : true ,
267+ },
268+ {
269+ name : "gte no match" ,
270+ entity : & event {ID : "5" , CreatedAt : earlier },
271+ filters : []storageTY.Filter {
272+ {Key : "createdAt" , Operator : storageTY .OperatorGreaterThanEqual , Value : base .Format (time .RFC3339 )},
273+ },
274+ expected : false ,
275+ },
276+ }
277+
278+ for _ , tc := range tests {
279+ t .Run (tc .name , func (t * testing.T ) {
280+ result := IsMatching (tc .entity , tc .filters )
281+ assert .Equal (t , tc .expected , result )
282+ })
283+ }
284+ }
0 commit comments