package org.ovirt.engine.core.bll; import static org.junit.Assert.assertNotSame; import static org.mockito.Answers.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.ovirt.engine.core.utils.MockConfigRule.MockConfigDescriptor; import java.lang.reflect.Constructor; import java.lang.reflect.ParameterizedType; import java.util.Collections; import java.util.Set; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.ovirt.engine.core.common.businessentities.aaa.DbUser; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.utils.MockConfigRule; public abstract class AbstractQueryTest<P extends VdcQueryParametersBase, Q extends QueriesCommandBase<? extends P>> extends BaseCommandTest { @ClassRule public static MockConfigRule mcr = new MockConfigRule(); @Mock (answer = RETURNS_DEEP_STUBS) protected DbUser dbUserMock; protected P params = createMockQueryParameters(); @Spy @InjectMocks private Q query = createQuery(); /** Sets up a mock user a spy query with it, and the generic query parameters */ @Before public void setUp() throws Exception { initQuery(getQuery()); for (MockConfigDescriptor<?> mcd : getExtraConfigDescriptors()) { mcr.mockConfigValue(mcd); } } protected <T> Set<MockConfigDescriptor<T>> getExtraConfigDescriptors() { return Collections.emptySet(); } /** Sets up a mock for {@link #params} */ private P createMockQueryParameters() { P params = mock(getParameterType()); when(params.getSessionId()).thenReturn("test"); when(params.getRefresh()).thenReturn(true); return params; } private Q createQuery() { try { Constructor<? extends Q> con = getQueryType().getConstructor(getParameterType()); return con.newInstance(getQueryParameters()); } catch (Exception e) { throw new RuntimeException(e); } } /** Hook for initialization */ protected void initQuery(Q query) { sessionDataContainer.setUser(query.getParameters().getSessionId(), dbUserMock); query.postConstruct(); } /** Extract the {@link Class} object for the P generic parameter */ @SuppressWarnings("unchecked") protected Class<? extends P> getParameterType() { ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass(); return (Class<? extends P>) parameterizedType.getActualTypeArguments()[0]; } /** Extract the {@link Class} object for the Q generic parameter */ @SuppressWarnings("unchecked") protected Class<? extends Q> getQueryType() { ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass(); ParameterizedType queryParameterizedType = (ParameterizedType) parameterizedType.getActualTypeArguments()[1]; return (Class<? extends Q>) queryParameterizedType.getRawType(); } /** @return The spied query to use in the test */ protected Q getQuery() { return query; } /** @return The mock query parameters to use in the test */ protected P getQueryParameters() { return params; } /** @return The mocked user to use in the test */ protected DbUser getUser() { return dbUserMock; } @Test public void testQueryType() throws IllegalArgumentException, IllegalAccessException { assertNotSame("The query can't be found in the enum VdcQueryType", VdcQueryType.Unknown, TestHelperQueriesCommandType.getQueryTypeFieldValue(query)); } }