packages feed

keter-rate-limiting-plugin-0.1.0.0: test/Keter/RateLimiter/Cache/PurgeTests.hs

{-# LANGUAGE OverloadedStrings, NumericUnderscores #-}

{-|
Module      : Keter.RateLimiter.Cache.PurgeTests
Description : Tests for the background cache purging mechanism.
Copyright   : (c) 2025 Oleksandr Zhabenko
License     : MIT
Maintainer  : oleksandr.zhabenko@yahoo.com
Stability   : stable
Portability : portable

This module contains tests to verify that the automatic background purging
of expired keys in the cache works as expected.
-}
module Keter.RateLimiter.Cache.PurgeTests (
  -- * Test Suite
  testBackgroundPurge
) where

import Test.Tasty
import Test.Tasty.HUnit
import qualified Data.Cache as C
import Control.Concurrent (threadDelay)
import Data.Text (Text)
import System.Clock (TimeSpec(..))
import Keter.RateLimiter.Cache (startAutoPurge) -- Import your module

-- | A test suite for background cache purging.
testBackgroundPurge :: TestTree
testBackgroundPurge = testCase "Background purge removes expired keys" $ do
  -- Create cache with no default TTL
  cache <- C.newCache Nothing :: IO (C.Cache Text Text)

  -- Create a proper TimeSpec for 2 seconds (2 seconds = 2 * 10^9 nanoseconds)
  let ttlSeconds = 2
  let ttlTimeSpec = TimeSpec ttlSeconds 0  -- 2 seconds, 0 nanoseconds

  -- Insert a key with proper TTL
  C.insert' cache (Just ttlTimeSpec) "expired-key" "value"

  -- Confirm it's there using lookup' (non-deleting version)
  mval <- C.lookup' cache "expired-key"
  case mval of
    Nothing -> assertFailure "Expected key to exist immediately after insert"
    Just v  -> v @?= "value"

  -- Start the auto-purge with 1-second interval
  startAutoPurge cache 1

  -- Wait for 3 seconds (TTL = 2s, purge interval = 1s, should be purged)
  threadDelay 3_000_000

  -- Now the key should be completely gone
  mval' <- C.lookup' cache "expired-key"
  mval' @?= Nothing