@@ -7835,3 +7835,79 @@ func TestUpdateAIBridgeInterceptionEnded(t *testing.T) {
78357835}
78367836})
78377837}
7838+
7839+ func TestDeleteExpiredAPIKeys (t * testing.T ) {
7840+ t .Parallel ()
7841+ db ,_ := dbtestutil .NewDB (t )
7842+
7843+ // Constant time for testing
7844+ now := time .Date (2025 ,11 ,20 ,12 ,0 ,0 ,0 ,time .UTC )
7845+ expiredBefore := now .Add (- time .Hour )// Anything before this is expired
7846+
7847+ ctx := testutil .Context (t ,testutil .WaitLong )
7848+
7849+ user := dbgen .User (t ,db , database.User {})
7850+
7851+ expiredTimes := []time.Time {
7852+ expiredBefore .Add (- time .Hour * 24 * 365 ),
7853+ expiredBefore .Add (- time .Hour * 24 ),
7854+ expiredBefore .Add (- time .Hour ),
7855+ expiredBefore .Add (- time .Minute ),
7856+ expiredBefore .Add (- time .Second ),
7857+ }
7858+ for _ ,exp := range expiredTimes {
7859+ // Expired api keys
7860+ dbgen .APIKey (t ,db , database.APIKey {UserID :user .ID ,ExpiresAt :exp })
7861+ }
7862+
7863+ unexpiredTimes := []time.Time {
7864+ expiredBefore .Add (time .Hour * 24 * 365 ),
7865+ expiredBefore .Add (time .Hour * 24 ),
7866+ expiredBefore .Add (time .Hour ),
7867+ expiredBefore .Add (time .Minute ),
7868+ expiredBefore .Add (time .Second ),
7869+ }
7870+ for _ ,unexp := range unexpiredTimes {
7871+ // Unexpired api keys
7872+ dbgen .APIKey (t ,db , database.APIKey {UserID :user .ID ,ExpiresAt :unexp })
7873+ }
7874+
7875+ // All keys are present before deletion
7876+ keys ,err := db .GetAPIKeysByUserID (ctx , database.GetAPIKeysByUserIDParams {
7877+ LoginType :user .LoginType ,
7878+ UserID :user .ID ,
7879+ })
7880+ require .NoError (t ,err )
7881+ require .Len (t ,keys ,len (expiredTimes )+ len (unexpiredTimes ))
7882+
7883+ // Delete expired keys
7884+ // First verify the limit works by deleting one at a time
7885+ err = db .DeleteExpiredAPIKeys (ctx , database.DeleteExpiredAPIKeysParams {
7886+ Before :expiredBefore ,
7887+ LimitCount :1 ,
7888+ })
7889+ require .NoError (t ,err )
7890+
7891+ // Ensure it was deleted
7892+ remaining ,err := db .GetAPIKeysByUserID (ctx , database.GetAPIKeysByUserIDParams {
7893+ LoginType :user .LoginType ,
7894+ UserID :user .ID ,
7895+ })
7896+ require .NoError (t ,err )
7897+ require .Len (t ,remaining ,len (expiredTimes )+ len (unexpiredTimes )- 1 )
7898+
7899+ // Delete the rest of the expired keys
7900+ err = db .DeleteExpiredAPIKeys (ctx , database.DeleteExpiredAPIKeysParams {
7901+ Before :expiredBefore ,
7902+ LimitCount :100 ,
7903+ })
7904+ require .NoError (t ,err )
7905+
7906+ // Ensure only unexpired keys remain
7907+ remaining ,err = db .GetAPIKeysByUserID (ctx , database.GetAPIKeysByUserIDParams {
7908+ LoginType :user .LoginType ,
7909+ UserID :user .ID ,
7910+ })
7911+ require .NoError (t ,err )
7912+ require .Len (t ,remaining ,len (unexpiredTimes ))
7913+ }