@@ -241,4 +241,90 @@ func TestEventExpander(t *testing.T) {
241241 }
242242 assert .Equal (t , expectedMondays , scheduledMondays )
243243 })
244+
245+ t .Run ("update_event_cleans_and_reexpands" , func (t * testing.T ) {
246+ cleanup ()
247+ fixedNow := time .Date (2024 , 6 , 1 , 10 , 0 , 0 , 0 , time .UTC ) // Saturday
248+ lookAheadDuration := 14 * 24 * time .Hour // 2 weeks
249+ gracePeriod := 2 * time .Minute
250+ expansionInterval := 5 * time .Minute
251+
252+ oldNow := TimeNow
253+ TimeNow = func () time.Time { return fixedNow }
254+ defer func () { TimeNow = oldNow }()
255+
256+ eventStart := fixedNow .AddDate (0 , 0 , - 7 ) // 1 week ago
257+ scheduleConfig := & models.ScheduleConfig {
258+ Frequency : "weekly" ,
259+ Interval : 1 ,
260+ ByDay : []string {"MO" }, // Every Monday
261+ }
262+ event := & models.Event {
263+ ID : uuid .New (),
264+ Name : "Weekly Event" ,
265+ Description : "Weekly event for update test" ,
266+ StartTime : eventStart ,
267+ Webhook : "http://example.com" ,
268+ Schedule : scheduleConfig ,
269+ Status : models .EventStatusActive ,
270+ Metadata : []byte (`{"key": "value"}` ),
271+ Tags : pq.StringArray {"test" },
272+ CreatedAt : eventStart ,
273+ }
274+ err := eventRepo .Create (ctx , event )
275+ require .NoError (t , err )
276+
277+ expander := NewExpander (scheduler , eventRepo , occurrenceRepo , lookAheadDuration , expansionInterval , gracePeriod , logger )
278+ err = expander .ExpandEvents (ctx )
279+ require .NoError (t , err )
280+
281+ // Check that Monday is scheduled
282+ results , err := redisClient .ZRange (ctx , ScheduleKey , 0 , - 1 ).Result ()
283+ require .NoError (t , err )
284+ var scheduledDays []time.Weekday
285+ for _ , key := range results {
286+ data , err := redisClient .HGet (ctx , "schedule:data" , key ).Result ()
287+ require .NoError (t , err )
288+ var sched models.Schedule
289+ err = json .Unmarshal ([]byte (data ), & sched )
290+ require .NoError (t , err )
291+ if sched .EventID == event .ID {
292+ scheduledDays = append (scheduledDays , sched .ScheduledAt .Weekday ())
293+ }
294+ }
295+ assert .Contains (t , scheduledDays , time .Monday )
296+ assert .NotContains (t , scheduledDays , time .Wednesday )
297+
298+ // Update event to schedule on Wednesday instead
299+ event .Schedule = & models.ScheduleConfig {
300+ Frequency : "weekly" ,
301+ Interval : 1 ,
302+ ByDay : []string {"WE" }, // Every Wednesday
303+ }
304+ err = eventRepo .Update (ctx , event )
305+ require .NoError (t , err )
306+ // Remove old occurrences
307+ err = eventRepo .RemoveEventOccurrencesFromRedis (ctx , event .ID )
308+ require .NoError (t , err )
309+ // Re-expand
310+ err = expander .ExpandEvents (ctx )
311+ require .NoError (t , err )
312+
313+ // Check that only Wednesday is scheduled
314+ results , err = redisClient .ZRange (ctx , ScheduleKey , 0 , - 1 ).Result ()
315+ require .NoError (t , err )
316+ scheduledDays = scheduledDays [:0 ]
317+ for _ , key := range results {
318+ data , err := redisClient .HGet (ctx , "schedule:data" , key ).Result ()
319+ require .NoError (t , err )
320+ var sched models.Schedule
321+ err = json .Unmarshal ([]byte (data ), & sched )
322+ require .NoError (t , err )
323+ if sched .EventID == event .ID {
324+ scheduledDays = append (scheduledDays , sched .ScheduledAt .Weekday ())
325+ }
326+ }
327+ assert .Contains (t , scheduledDays , time .Wednesday )
328+ assert .NotContains (t , scheduledDays , time .Monday )
329+ })
244330}
0 commit comments