/*
* Copyright 2015 Victor Albertos
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.rx_cache2.internal;
import io.reactivex.Flowable;
import io.reactivex.Maybe;
import io.reactivex.Observable;
import io.reactivex.Single;
import io.rx_cache2.ConfigProvider;
import io.rx_cache2.DynamicKey;
import io.rx_cache2.DynamicKeyGroup;
import io.rx_cache2.EvictDynamicKey;
import io.rx_cache2.EvictDynamicKeyGroup;
import io.rx_cache2.EvictProvider;
import java.lang.reflect.Method;
import org.junit.Before;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
/**
* Created by victor on 28/12/15.
*/
public class ProxyTranslatorTest {
private ProxyTranslator proxyTranslatorUT;
private final Object[] dataMethod = {Observable.just(new Object[]{})};
@Before public void init() {
proxyTranslatorUT = new ProxyTranslator();
}
@Test public void Check_Basic_Method() throws NoSuchMethodException {
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocks", Observable.class);
ConfigProvider configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethod);
assertThat(configProvider.getProviderKey(), is("getMocks"));
assertNotNull(configProvider.getLoaderObservable());
assertNull(configProvider.getLifeTimeMillis());
assertThat(configProvider.evictProvider().evict(), is(false));
assertThat(configProvider.requiredDetailedResponse(), is(false));
}
@Test public void Check_Single_Reactive_Type() throws NoSuchMethodException {
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocksSingle", Single.class);
ConfigProvider configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethod);
assertNotNull(configProvider.getLoaderObservable());
}
@Test public void Check_Maybe_Reactive_Type() throws NoSuchMethodException {
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocksMaybe", Maybe.class);
ConfigProvider configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethod);
assertNotNull(configProvider.getLoaderObservable());
}
@Test public void Check_Flowable_Reactive_Type() throws NoSuchMethodException {
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocksFlowable", Flowable.class);
ConfigProvider configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethod);
assertNotNull(configProvider.getLoaderObservable());
}
@Test public void Check_Method_With_Life_Time_Defined() throws NoSuchMethodException {
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocksLifeTimeMinutes",
Observable.class);
ConfigProvider configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethod);
assertThat(configProvider.getLifeTimeMillis(), is(60000l));
mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocksLifeTimeSeconds",
Observable.class);
configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethod);
assertThat(configProvider.getLifeTimeMillis(), is(1000l));
mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocksLifeTimeMillis",
Observable.class);
configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethod);
assertThat(configProvider.getLifeTimeMillis(), is(65000l));
}
@Test public void When_Return_Response_Then_Required_Detail_Response_Is_True()
throws NoSuchMethodException {
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocksWithDetailResponse",
Observable.class);
ConfigProvider configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethod);
assertThat(configProvider.requiredDetailedResponse(), is(true));
}
@Test(expected = IllegalArgumentException.class)
public void When_Method_Not_Return_Supported_Reactive_Type_Then_Throw_Exception()
throws NoSuchMethodException {
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocksBadReturnType",
Observable.class);
proxyTranslatorUT.processMethod(mockMethod, dataMethod);
}
@Test public void When_Evict_Cache_Evict() throws NoSuchMethodException {
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocksEvictProvider",
Observable.class, EvictProvider.class);
Object[] dataMethodEvict = {Observable.just(new Object[]{}), new EvictProvider(true)};
ConfigProvider configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethodEvict);
assertThat(configProvider.evictProvider().evict(), is(true));
Object[] dataMethodNoEvict = {Observable.just(new Object[]{}), new EvictProvider(false)};
configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethodNoEvict);
assertThat(configProvider.evictProvider().evict(), is(false));
}
@Test public void When_Evict_Cache_Dynamic_Key_Evict() throws NoSuchMethodException {
final String dynamicKey = "aDynamicKey";
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocksDynamicKeyEvictPage",
Observable.class, DynamicKey.class, EvictDynamicKey.class);
Object[] dataMethodEvict =
{Observable.just(new Object[]{}), new DynamicKey(dynamicKey), new EvictDynamicKey(true)};
ConfigProvider configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethodEvict);
EvictDynamicKey evictDynamicKey = (EvictDynamicKey) configProvider.evictProvider();
assertThat(configProvider.getDynamicKey(), is(dynamicKey));
assertThat(evictDynamicKey.evict(), is(true));
Object[] dataMethodNoEvict =
{Observable.just(new Object[]{}), new DynamicKey(dynamicKey), new EvictDynamicKey(false)};
configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethodNoEvict);
evictDynamicKey = (EvictDynamicKey) configProvider.evictProvider();
assertThat(configProvider.getDynamicKey(), is(dynamicKey));
assertThat(evictDynamicKey.evict(), is(false));
}
@Test public void When_Get_Page_Get_Pages() throws NoSuchMethodException {
Object[] dataMethodPaginate = {Observable.just(new Object[]{}), new DynamicKey(1)};
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMocksPaginate",
Observable.class, DynamicKey.class);
ConfigProvider configProvider = proxyTranslatorUT.processMethod(mockMethod, dataMethodPaginate);
assertThat(configProvider.getDynamicKey(), is("1"));
}
@Test(expected = IllegalArgumentException.class)
public void When_Not_Loader_Provided_Throw_Exception() throws NoSuchMethodException {
Method mockMethod = io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod(
"getMockWithoutLoaderObservable");
Object[] emptyDataMethod = {};
proxyTranslatorUT.processMethod(mockMethod, emptyDataMethod);
}
@Test(expected = IllegalArgumentException.class)
public void When_Not_Return_Observable_Throw_Exception() throws NoSuchMethodException {
Method mockMethod = io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod(
"getMockWithoutReturnObservable");
proxyTranslatorUT.processMethod(mockMethod, dataMethod);
}
@Test(expected = IllegalArgumentException.class)
public void When_Multiple_Observable_Throw_Exception() throws NoSuchMethodException {
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMockMultipleObservables",
Observable.class, Observable.class);
Object[] data = {Observable.just(new Object[]{}), Observable.just("")};
proxyTranslatorUT.processMethod(mockMethod, data);
}
@Test(expected = IllegalArgumentException.class) public void When_Multiple_Evict_Throw_Exception()
throws NoSuchMethodException {
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMockMultipleEvicts",
Observable.class, EvictProvider.class, EvictProvider.class);
Object[] data = {Observable.just(new Object[]{}), new EvictProvider(true), new EvictProvider(true)};
proxyTranslatorUT.processMethod(mockMethod, data);
}
@Test(expected = IllegalArgumentException.class)
public void When_Multiple_Dynamic_Keys_Throw_Exception() throws NoSuchMethodException {
Method mockMethod =
io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod("getMockMultipleDynamicKeys",
Observable.class, DynamicKey.class, DynamicKey.class);
Object[] data = {Observable.just(new Object[]{}), new DynamicKey(1), new DynamicKey(1)};
proxyTranslatorUT.processMethod(mockMethod, data);
}
@Test public void When_Use_Evict_Dynamic_Key_Providing_Dynamic_Key_Not_Throw_Exception()
throws NoSuchMethodException {
Method mockMethod = io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod(
"getMockEvictDynamicKeyProvidingDynamicKey", Observable.class, DynamicKey.class,
EvictDynamicKey.class);
Object[] data = {Observable.just(new Object[]{}), new DynamicKey("1"), new EvictDynamicKey(true)};
proxyTranslatorUT.processMethod(mockMethod, data);
}
@Test(expected = IllegalArgumentException.class)
public void When_Use_Evict_Dynamic_Key_Without_Providing_Dynamic_Key_Throw_Exception()
throws NoSuchMethodException {
Method mockMethod = io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod(
"getMockEvictDynamicKeyWithoutProvidingDynamicKey", Observable.class,
EvictDynamicKey.class);
Object[] data = {Observable.just(new Object[]{}), new EvictDynamicKey(true)};
proxyTranslatorUT.processMethod(mockMethod, data);
}
@Test
public void When_Use_Evict_Dynamic_Key_Group_Providing_Dynamic_Key_Group_Not_Throw_Exception()
throws NoSuchMethodException {
Method mockMethod = io.rx_cache2.internal.ProvidersRxCache.class.getDeclaredMethod(
"getMockEvictDynamicKeyGroupProvidingDynamicKeyGroup", Observable.class,
DynamicKeyGroup.class, EvictDynamicKeyGroup.class);
Object[] data =
{Observable.just(new Object[]{}), new DynamicKeyGroup("1", "1"), new EvictDynamicKeyGroup(true)};
proxyTranslatorUT.processMethod(mockMethod, data);
}
@Test(expected = IllegalArgumentException.class)
public void When_Use_Evict_Dynamic_Key_Group_Without_Providing_Dynamic_Key_Group_Throw_Exception()
throws NoSuchMethodException {
Method mockMethod = ProvidersRxCache.class.getDeclaredMethod(
"getMockEvictDynamicKeyGroupWithoutProvidingDynamicKeyGroup", Observable.class,
EvictDynamicKeyGroup.class);
Object[] data = {Observable.just(new Object[]{}), new EvictDynamicKeyGroup(true)};
proxyTranslatorUT.processMethod(mockMethod, data);
}
}