code: def test_expiring_cache(self):
      expiry_1 = Timestamp("2014")
      before_1 = expiry_1 - Timedelta("1 minute")
      after_1 = expiry_1 + Timedelta("1 minute")
  
      expiry_2 = Timestamp("2015")
      after_2 = expiry_1 + Timedelta("1 minute")
  
      expiry_3 = Timestamp("2016")
  
      cache = ExpiringCache()
  
      cache.set("foo", 1, expiry_1)
      cache.set("bar", 2, expiry_2)
  
      self.assertEqual(cache.get("foo", before_1), 1)
      # Unwrap on expiry is allowed.
      self.assertEqual(cache.get("foo", expiry_1), 1)
  
      with self.assertRaises(KeyError) as e:
          self.assertEqual(cache.get("foo", after_1))
      self.assertEqual(e.exception.args, ("foo",))
  
      # Should raise same KeyError after deletion.
      with self.assertRaises(KeyError) as e:
          self.assertEqual(cache.get("foo", before_1))
      self.assertEqual(e.exception.args, ("foo",))
  
      # Second value should still exist.
      self.assertEqual(cache.get("bar", after_2), 2)
  
      # Should raise similar KeyError on non-existent key.
      with self.assertRaises(KeyError) as e:
          self.assertEqual(cache.get("baz", expiry_3))
      self.assertEqual(e.exception.args, ("baz",))
  
file_path: catalyst/tests/utils/test_cache.py
imports: from unittest import TestCase
  from pandas import Timestamp, Timedelta
  from catalyst.utils.cache import CachedObject, Expired, ExpiringCache
label_desc: Use image node_id 1 for calling the ExpiringCacheTestCase obj's underlying member method code with example usage: obj.test_expiring_cache() without return types