# -*- coding: utf-8 -*-

"""
@author: leohowell
@date: 2019-06-07
"""

import unittest

import time
import redis

from lru import RedisLRU


class RedisLRUTest(unittest.TestCase):
    @classmethod
    def get_cache(cls, **kwargs):
        client = redis.StrictRedis('127.0.0.1', 6379)
        return RedisLRU(client, clear_on_exit=True, **kwargs)

    def test_lru_cache(self):
        cache = self.get_cache()
        flag = 0

        @cache
        def foo(x, y=10):
            nonlocal flag
            flag += 1
            return x + y

        result1 = foo(10)
        self.assertEqual(result1, 20)
        self.assertEqual(flag, 1)

        result2 = foo(10)
        self.assertEqual(result2, 20)
        self.assertEqual(flag, 1)

    def test_ttl(self):
        cache = self.get_cache()

        flag = 0

        @cache(ttl=1)
        def bar(x, y=10):
            nonlocal flag
            flag += 1
            return x + y

        result1 = bar(10)
        self.assertEqual(result1, 20)
        self.assertEqual(flag, 1)

        result2 = bar(10)
        self.assertEqual(result2, 20)
        self.assertEqual(flag, 1)

        time.sleep(1.1)
        result3 = bar(10)
        self.assertEqual(result3, 20)
        self.assertEqual(flag, 2)

    def test_exclude(self):
        cache = self.get_cache(exclude_values={20})

        flag = 0

        @cache
        def baz(x, y=10):
            nonlocal flag
            flag += 1
            return x + y

        result1 = baz(10)
        self.assertEqual(result1, 20)
        self.assertEqual(flag, 1)

        result2 = baz(10)
        self.assertEqual(result2, 20)
        self.assertEqual(flag, 2)

        result3 = baz(20)
        self.assertEqual(result3, 30)
        self.assertEqual(flag, 3)

        result4 = baz(20)
        self.assertEqual(result4, 30)
        self.assertEqual(flag, 3)


if __name__ == '__main__':
    unittest.main()