From faadd4f68c014ad1b974c933496f22036e63ba71 Mon Sep 17 00:00:00 2001 From: pablo Date: Tue, 12 Aug 2025 12:29:57 +0300 Subject: [PATCH] fix: async store --- ratelimit/store.nim | 4 ++-- tests/test_ratelimit_manager.nim | 12 ++++++------ tests/test_store.nim | 18 +++++++++--------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/ratelimit/store.nim b/ratelimit/store.nim index 3c023aa..262bd41 100644 --- a/ratelimit/store.nim +++ b/ratelimit/store.nim @@ -11,7 +11,7 @@ type normalLength: int nextBatchId: int - BucketState* = object + BucketState* {.pure} = object budget*: int budgetCap*: int lastTimeFull*: Moment @@ -22,7 +22,7 @@ type const BUCKET_STATE_KEY = "rate_limit_bucket_state" -proc new*[T](M: type[RateLimitStore[T]], db: DbConn): M = +proc new*[T](M: type[RateLimitStore[T]], db: DbConn): Future[M] {.async} = result = M(db: db, criticalLength: 0, normalLength: 0, nextBatchId: 1) # Initialize cached lengths from database diff --git a/tests/test_ratelimit_manager.nim b/tests/test_ratelimit_manager.nim index 70ebe2c..50a2000 100644 --- a/tests/test_ratelimit_manager.nim +++ b/tests/test_ratelimit_manager.nim @@ -33,7 +33,7 @@ suite "Queue RateLimitManager": asyncTest "sendOrEnqueue - immediate send when capacity available": ## Given - let store: RateLimitStore[string] = RateLimitStore[string].new(db) + let store: RateLimitStore[string] = await RateLimitStore[string].new(db) let manager = await RateLimitManager[string].new( store, mockSender, capacity = 10, duration = chronos.milliseconds(100) ) @@ -52,7 +52,7 @@ suite "Queue RateLimitManager": asyncTest "sendOrEnqueue - multiple messages": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) let manager = await RateLimitManager[string].new( store, mockSender, capacity = 10, duration = chronos.milliseconds(100) ) @@ -73,7 +73,7 @@ suite "Queue RateLimitManager": asyncTest "start and stop - drop large batch": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) let manager = await RateLimitManager[string].new( store, mockSender, @@ -90,7 +90,7 @@ suite "Queue RateLimitManager": asyncTest "enqueue - enqueue critical only when exceeded": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) let manager = await RateLimitManager[string].new( store, mockSender, @@ -134,7 +134,7 @@ suite "Queue RateLimitManager": asyncTest "enqueue - enqueue normal on 70% capacity": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) let manager = await RateLimitManager[string].new( store, mockSender, @@ -179,7 +179,7 @@ suite "Queue RateLimitManager": asyncTest "enqueue - process queued messages": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) let manager = await RateLimitManager[string].new( store, mockSender, diff --git a/tests/test_store.nim b/tests/test_store.nim index b08b7d3..16cfdfe 100644 --- a/tests/test_store.nim +++ b/tests/test_store.nim @@ -21,7 +21,7 @@ suite "SqliteRateLimitStore Tests": asyncTest "newSqliteRateLimitStore - empty state": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) ## When let loadedState = await store.loadBucketState() @@ -31,7 +31,7 @@ suite "SqliteRateLimitStore Tests": asyncTest "saveBucketState and loadBucketState - state persistence": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) let now = Moment.now() echo "now: ", now.epochSeconds() @@ -51,7 +51,7 @@ suite "SqliteRateLimitStore Tests": asyncTest "queue operations - empty store": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) ## When/Then check store.getQueueLength(QueueType.Critical) == 0 @@ -65,7 +65,7 @@ suite "SqliteRateLimitStore Tests": asyncTest "addToQueue and popFromQueue - single batch": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) let msgs = @[("msg1", "Hello"), ("msg2", "World")] ## When @@ -92,7 +92,7 @@ suite "SqliteRateLimitStore Tests": asyncTest "addToQueue and popFromQueue - multiple batches FIFO": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) let batch1 = @[("msg1", "First")] let batch2 = @[("msg2", "Second")] let batch3 = @[("msg3", "Third")] @@ -130,7 +130,7 @@ suite "SqliteRateLimitStore Tests": asyncTest "queue isolation - critical and normal queues are separate": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) let criticalMsgs = @[("crit1", "Critical Message")] let normalMsgs = @[("norm1", "Normal Message")] @@ -167,14 +167,14 @@ suite "SqliteRateLimitStore Tests": let msgs = @[("persist1", "Persistent Message")] block: - let store1 = RateLimitStore[string].new(db) + let store1 = await RateLimitStore[string].new(db) let addResult = await store1.pushToQueue(QueueType.Critical, msgs) check addResult == true check store1.getQueueLength(QueueType.Critical) == 1 ## When - Create new store instance block: - let store2 = RateLimitStore[string].new(db) + let store2 =await RateLimitStore[string].new(db) ## Then - Queue length should be restored from database check store2.getQueueLength(QueueType.Critical) == 1 @@ -186,7 +186,7 @@ suite "SqliteRateLimitStore Tests": asyncTest "large batch handling": ## Given - let store = RateLimitStore[string].new(db) + let store = await RateLimitStore[string].new(db) var largeBatch: seq[tuple[msgId: string, msg: string]] for i in 1 .. 100: