/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* 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 org.uberfire.preferences.backend;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.uberfire.preferences.shared.PreferenceScope;
import org.uberfire.preferences.shared.PreferenceScopeResolutionStrategy;
import org.uberfire.preferences.shared.PreferenceStore;
import org.uberfire.preferences.shared.bean.BasePreference;
import org.uberfire.preferences.shared.bean.BasePreferencePortable;
import org.uberfire.preferences.shared.bean.PreferenceHierarchyElement;
import org.uberfire.preferences.shared.impl.PreferenceScopeResolutionStrategyInfo;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class PreferenceBeanStoreImplTest {
private PreferenceStore preferenceStore;
private PreferenceBeanStoreImpl preferenceBeanStoreImpl;
private PreferenceScopeResolutionStrategy preferenceScopeResolutionStrategy;
private PreferenceScopeResolutionStrategyInfo scopeInfo;
private PreferenceScope lastScope;
@Before
public void setup() {
preferenceScopeResolutionStrategy = mock(PreferenceScopeResolutionStrategy.class);
preferenceStore = mock(PreferenceStore.class);
preferenceBeanStoreImpl = spy(new PreferenceBeanStoreImpl(preferenceStore,
preferenceScopeResolutionStrategy,
null));
lastScope = mock(PreferenceScope.class);
scopeInfo = new PreferenceScopeResolutionStrategyInfo(Arrays.asList(lastScope),
mock(PreferenceScope.class));
doReturn(scopeInfo).when(preferenceScopeResolutionStrategy).getInfo();
doAnswer(invocationOnMock -> {
Object[] args = invocationOnMock.getArguments();
Class<?> clazz = (Class<?>) args[0];
return getPortablePreferenceByClass(clazz);
}).when(preferenceBeanStoreImpl).lookupPortablePreference(any(Class.class));
}
@Test
public void loadTest() {
MyPreference myPreference = new MyPreferencePortableGeneratedImpl();
MySharedPreference mySharedPreference = new MySharedPreferencePortableGeneratedImpl();
MySharedPreference2 mySharedPreference2 = new MySharedPreference2PortableGeneratedImpl();
doReturn(myPreference).when(preferenceStore).get(MyPreference.class.getSimpleName());
doReturn(mySharedPreference).when(preferenceStore).get(MySharedPreference.class.getSimpleName());
doReturn(mySharedPreference2).when(preferenceStore).get(MySharedPreference2.class.getSimpleName());
final MyPreferencePortableGeneratedImpl loadedMyPreference = preferenceBeanStoreImpl.load(new MyPreferencePortableGeneratedImpl());
final MySharedPreference2PortableGeneratedImpl loadedMySharedPreference2 = preferenceBeanStoreImpl.load(new MySharedPreference2PortableGeneratedImpl());
verify(preferenceStore,
times(3)).get(eq(scopeInfo),
anyString());
verify(preferenceStore).get(scopeInfo,
MyPreference.class.getSimpleName());
verify(preferenceStore).get(scopeInfo,
MySharedPreference.class.getSimpleName());
verify(preferenceStore).get(scopeInfo,
MySharedPreference2.class.getSimpleName());
assertEquals(myPreference,
loadedMyPreference);
assertEquals(mySharedPreference,
loadedMyPreference.mySharedPreference);
assertEquals(mySharedPreference2,
loadedMySharedPreference2);
}
@Test
public void loadWithCustomResolutionStrategyScopeTest() {
MyPreference myPreference = new MyPreferencePortableGeneratedImpl();
MySharedPreference mySharedPreference = new MySharedPreferencePortableGeneratedImpl();
MySharedPreference2 mySharedPreference2 = new MySharedPreference2PortableGeneratedImpl();
doReturn(myPreference).when(preferenceStore).get(MyPreference.class.getSimpleName());
doReturn(mySharedPreference).when(preferenceStore).get(MySharedPreference.class.getSimpleName());
doReturn(mySharedPreference2).when(preferenceStore).get(MySharedPreference2.class.getSimpleName());
PreferenceScopeResolutionStrategyInfo scopeResolutionStrategyInfo = new PreferenceScopeResolutionStrategyInfo(new ArrayList<>(),
mock(PreferenceScope.class));
final MyPreferencePortableGeneratedImpl loadedMyPreference = preferenceBeanStoreImpl.load(new MyPreferencePortableGeneratedImpl(),
scopeResolutionStrategyInfo);
final MySharedPreference2PortableGeneratedImpl loadedMySharedPreference2 = preferenceBeanStoreImpl.load(new MySharedPreference2PortableGeneratedImpl(),
scopeResolutionStrategyInfo);
verify(preferenceStore,
times(3)).get(eq(scopeResolutionStrategyInfo),
anyString());
verify(preferenceStore).get(scopeResolutionStrategyInfo,
MyPreference.class.getSimpleName());
verify(preferenceStore).get(scopeResolutionStrategyInfo,
MySharedPreference.class.getSimpleName());
verify(preferenceStore).get(scopeResolutionStrategyInfo,
MySharedPreference2.class.getSimpleName());
assertEquals(myPreference,
loadedMyPreference);
assertEquals(mySharedPreference,
loadedMyPreference.mySharedPreference);
assertEquals(mySharedPreference2,
loadedMySharedPreference2);
}
@Test
public void saveTest() {
final MyPreferencePortableGeneratedImpl myPreference = preferenceBeanStoreImpl.load(new MyPreferencePortableGeneratedImpl());
preferenceBeanStoreImpl.save(myPreference);
verify(preferenceStore,
times(2)).put(any(PreferenceScope.class),
anyString(),
any(Object.class));
verify(preferenceStore).put(eq(scopeInfo.defaultScope()),
eq(MyPreference.class.getSimpleName()),
eq(myPreference));
verify(preferenceStore).put(eq(scopeInfo.defaultScope()),
eq(MySharedPreference.class.getSimpleName()),
eq(myPreference.mySharedPreference));
}
@Test
public void saveWithCustomResolutionStrategyScopeTest() {
PreferenceScopeResolutionStrategyInfo scopeResolutionStrategyInfo = new PreferenceScopeResolutionStrategyInfo(new ArrayList<>(),
mock(PreferenceScope.class));
final MyPreferencePortableGeneratedImpl myPreference = preferenceBeanStoreImpl.load(new MyPreferencePortableGeneratedImpl(),
scopeResolutionStrategyInfo);
preferenceBeanStoreImpl.save(myPreference,
scopeResolutionStrategyInfo);
verify(preferenceStore,
times(2)).put(same(scopeResolutionStrategyInfo.defaultScope()),
anyString(),
any(Object.class));
verify(preferenceStore).put(same(scopeResolutionStrategyInfo.defaultScope()),
eq(MyPreference.class.getSimpleName()),
eq(myPreference));
verify(preferenceStore).put(same(scopeResolutionStrategyInfo.defaultScope()),
eq(MySharedPreference.class.getSimpleName()),
eq(myPreference.mySharedPreference));
}
@Test
public void saveCollectionTest() {
final List<BasePreferencePortable<? extends BasePreference<?>>> preferencesToSave = getRootPortablePreferences();
final MyPreference myPreference = (MyPreference) preferencesToSave.get(0);
final MySharedPreference2 mySharedPreference2 = (MySharedPreference2) preferencesToSave.get(1);
preferenceBeanStoreImpl.save(preferencesToSave);
verify(preferenceStore,
times(2)).put(eq(scopeInfo.defaultScope()),
anyString(),
any(Object.class));
verify(preferenceStore).put(scopeInfo.defaultScope(),
MyPreference.class.getSimpleName(),
myPreference);
verify(preferenceStore).put(scopeInfo.defaultScope(),
MySharedPreference.class.getSimpleName(),
myPreference.mySharedPreference);
verify(preferenceStore,
never()).put(eq(scopeInfo.defaultScope()),
eq(MySharedPreference2.class.getSimpleName()),
same(mySharedPreference2));
}
@Test
public void saveCollectionWithCustomResolutionStrategyScopeTest() {
PreferenceScopeResolutionStrategyInfo scopeResolutionStrategyInfo = new PreferenceScopeResolutionStrategyInfo(new ArrayList<>(),
mock(PreferenceScope.class));
final List<BasePreferencePortable<? extends BasePreference<?>>> preferencesToSave = getRootPortablePreferences();
final MyPreference myPreference = (MyPreference) preferencesToSave.get(0);
final MySharedPreference2 mySharedPreference2 = (MySharedPreference2) preferencesToSave.get(1);
preferenceBeanStoreImpl.save(preferencesToSave,
scopeResolutionStrategyInfo);
verify(preferenceStore,
times(2)).put(eq(scopeResolutionStrategyInfo.defaultScope()),
anyString(),
any(Object.class));
verify(preferenceStore).put(scopeResolutionStrategyInfo.defaultScope(),
MyPreference.class.getSimpleName(),
myPreference);
verify(preferenceStore).put(scopeResolutionStrategyInfo.defaultScope(),
MySharedPreference.class.getSimpleName(),
myPreference.mySharedPreference);
verify(preferenceStore,
never()).put(eq(scopeResolutionStrategyInfo.defaultScope()),
eq(MySharedPreference2.class.getSimpleName()),
same(mySharedPreference2));
}
@Test
public void saveDefaultValueTest() {
final MyPreferencePortableGeneratedImpl myPreference = new MyPreferencePortableGeneratedImpl();
preferenceBeanStoreImpl.saveDefaultValue((MyPreferencePortableGeneratedImpl) myPreference.defaultValue(myPreference));
verify(preferenceStore,
times(2)).put(any(PreferenceScope.class),
anyString(),
any(Object.class));
verify(preferenceStore).put(eq(lastScope),
eq(MyPreference.class.getSimpleName()),
eq(myPreference));
verify(preferenceStore).put(eq(lastScope),
eq(MySharedPreference.class.getSimpleName()),
eq(myPreference.mySharedPreference));
}
@Test
public void buildHierarchyStructureTest() {
final List<BasePreferencePortable<? extends BasePreference<?>>> rootPreferences = getRootPortablePreferences();
final MyPreferencePortableGeneratedImpl myPreference = (MyPreferencePortableGeneratedImpl) rootPreferences.get(0);
doReturn(getPortablePreferences()).when(preferenceBeanStoreImpl).getPortablePreferences();
final PreferenceHierarchyElement<?> preferenceHierarchyElement = preferenceBeanStoreImpl.buildHierarchyStructureForPreference(myPreference.identifier());
final PreferenceHierarchyElement<?> firstElement = preferenceHierarchyElement;
assertEquals(myPreference.identifier(),
firstElement.getPortablePreference().identifier());
assertTrue(firstElement.isRoot());
assertFalse(firstElement.isShared());
assertEquals(2,
firstElement.getChildren().size());
final PreferenceHierarchyElement<?> firstElementFirstChild = firstElement.getChildren().get(0);
assertEquals(((MyInnerPreferencePortableGeneratedImpl) myPreference.myInnerPreference).identifier(),
firstElementFirstChild.getPortablePreference().identifier());
assertFalse(firstElementFirstChild.isRoot());
assertFalse(firstElementFirstChild.isShared());
assertEquals(0,
firstElementFirstChild.getChildren().size());
final PreferenceHierarchyElement<?> firstElementSecondChild = firstElement.getChildren().get(1);
assertEquals(((MySharedPreferencePortableGeneratedImpl) myPreference.mySharedPreference).identifier(),
firstElementSecondChild.getPortablePreference().identifier());
assertFalse(firstElementSecondChild.isRoot());
assertTrue(firstElementSecondChild.isShared());
assertEquals(1,
firstElementSecondChild.getChildren().size());
final PreferenceHierarchyElement<?> firstElementSecondChildFirstChild = firstElementSecondChild.getChildren().get(0);
assertEquals(((MyInnerPreference2PortableGeneratedImpl) myPreference.mySharedPreference.myInnerPreference2).identifier(),
firstElementSecondChildFirstChild.getPortablePreference().identifier());
assertFalse(firstElementSecondChildFirstChild.isRoot());
assertFalse(firstElementSecondChildFirstChild.isShared());
assertEquals(1,
firstElementSecondChildFirstChild.getChildren().size());
final PreferenceHierarchyElement<?> firstElementSecondChildFirstChildFirstChild = firstElementSecondChildFirstChild.getChildren().get(0);
assertEquals("MySharedPreference2",
firstElementSecondChildFirstChildFirstChild.getPortablePreference().identifier());
assertTrue(firstElementSecondChildFirstChildFirstChild.isRoot());
assertFalse(firstElementSecondChildFirstChildFirstChild.isShared());
assertEquals(0,
firstElementSecondChildFirstChildFirstChild.getChildren().size());
}
private List<BasePreferencePortable<? extends BasePreference<?>>> getRootPortablePreferences() {
final MyPreferencePortableGeneratedImpl myPreference = preferenceBeanStoreImpl.load(new MyPreferencePortableGeneratedImpl());
final MySharedPreference2PortableGeneratedImpl mySharedPreference2 = preferenceBeanStoreImpl.load(new MySharedPreference2PortableGeneratedImpl());
List<BasePreferencePortable<? extends BasePreference<?>>> rootPreferences = new ArrayList<>();
rootPreferences.add(myPreference);
rootPreferences.add(mySharedPreference2);
return rootPreferences;
}
private List<BasePreferencePortable<?>> getPortablePreferences() {
List<BasePreferencePortable<?>> portablePreferences = new ArrayList<>();
portablePreferences.add(getPortablePreferenceByClass(MyPreference.class));
portablePreferences.add(getPortablePreferenceByClass(MyInnerPreference.class));
portablePreferences.add(getPortablePreferenceByClass(MyInnerPreference2.class));
portablePreferences.add(getPortablePreferenceByClass(MySharedPreference.class));
portablePreferences.add(getPortablePreferenceByClass(MySharedPreference2.class));
return portablePreferences;
}
private BasePreferencePortable<?> getPortablePreferenceByClass(final Class<?> clazz) {
if (MyPreference.class.equals(clazz)) {
return new MyPreferencePortableGeneratedImpl();
} else if (MyInnerPreference.class.equals(clazz)) {
return new MyInnerPreferencePortableGeneratedImpl();
} else if (MyInnerPreference2.class.equals(clazz)) {
return new MyInnerPreference2PortableGeneratedImpl();
} else if (MySharedPreference.class.equals(clazz)) {
return new MySharedPreferencePortableGeneratedImpl();
} else if (MySharedPreference2.class.equals(clazz)) {
return new MySharedPreference2PortableGeneratedImpl();
}
return null;
}
}