package core.framework.impl.cache; import core.framework.api.util.Maps; import core.framework.api.util.Strings; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import java.time.Duration; import java.util.Arrays; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** * @author neo */ public class CacheImplTest { private CacheImpl<Integer> cache; private CacheStore cacheStore; @Before public void prepare() { cacheStore = Mockito.mock(CacheStore.class); cache = new CacheImpl<>("name", Integer.class, Duration.ofHours(1), cacheStore); } @Test public void get() { when(cacheStore.get("name:key")).thenReturn(Strings.bytes("1")); Integer value = cache.get("key", key -> null); assertEquals(1, (int) value); } @Test public void getIfMiss() { when(cacheStore.get("name:key")).thenReturn(null); Integer value = cache.get("key", key -> 1); assertEquals(1, (int) value); verify(cacheStore).put("name:key", Strings.bytes("1"), Duration.ofHours(1)); } @Test public void put() { cache.put("key", 1); verify(cacheStore).put("name:key", Strings.bytes("1"), Duration.ofHours(1)); } @Test public void getAll() { Map<String, byte[]> values = Maps.newHashMap(); values.put("name:key1", Strings.bytes("1")); values.put("name:key3", Strings.bytes("3")); when(cacheStore.getAll(new String[]{"name:key1", "name:key2", "name:key3"})).thenReturn(values); Map<String, Integer> results = cache.getAll(Arrays.asList("key1", "key2", "key3"), key -> 2); assertEquals(3, results.size()); assertEquals(1, results.get("key1").intValue()); assertEquals(2, results.get("key2").intValue()); assertEquals(3, results.get("key3").intValue()); verify(cacheStore).putAll(argThat(argument -> argument.size() == 1 && Arrays.equals(argument.get("name:key2"), Strings.bytes("2"))), eq(Duration.ofHours(1))); } }