mirror of
https://github.com/logos-messaging/nim-chat-sdk.git
synced 2026-01-28 10:53:07 +00:00
fix: async store
This commit is contained in:
parent
b50240942f
commit
faadd4f68c
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user