package net.ttddyy.dsproxy.proxy;
import net.ttddyy.dsproxy.ExecutionInfo;
import net.ttddyy.dsproxy.QueryInfo;
import net.ttddyy.dsproxy.listener.QueryExecutionListener;
import org.mockito.ArgumentCaptor;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.aMapWithSize;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Mockito.verify;
/**
* @author Tadaya Tsuyukubo
*/
public class MockTestUtils {
// TODO: this needs clean up
@SuppressWarnings("unchecked")
public static void verifyListenerForBatch(QueryExecutionListener listener, String dataSourceName, String query,
Map<String, Object>... expectedQueryParamsArray) {
ArgumentCaptor<ExecutionInfo> executionInfoCaptor = ArgumentCaptor.forClass(ExecutionInfo.class);
ArgumentCaptor<List> queryInfoListCaptor = ArgumentCaptor.forClass(List.class);
verify(listener).afterQuery(executionInfoCaptor.capture(), queryInfoListCaptor.capture());
final int expectedBatchSize = expectedQueryParamsArray.length;
ExecutionInfo execInfo = executionInfoCaptor.getValue();
assertThat(execInfo.getMethod(), is(notNullValue()));
assertThat(execInfo.getMethod().getName(), is("executeBatch"));
assertThat(execInfo.getMethodArgs(), is(nullValue()));
assertThat(execInfo.getDataSourceName(), is(dataSourceName));
assertThat(execInfo.getThrowable(), is(nullValue()));
assertThat(execInfo.isBatch(), is(true));
assertThat(execInfo.getBatchSize(), is(expectedBatchSize));
List<QueryInfo> queryInfoList = queryInfoListCaptor.getValue();
assertThat("for prepared/callable statement, batch query size is always 1", queryInfoList.size(), is(1));
QueryInfo queryInfo = queryInfoList.get(0);
assertThat(queryInfo.getQuery(), is(query));
assertThat(queryInfo.getParametersList(), hasSize(expectedBatchSize));
for (int i = 0; i < expectedBatchSize; i++) {
Map<String, Object> expectedQueryArgs = expectedQueryParamsArray[i];
Map<String, Object> actualQueryArgs = new HashMap<String, Object>();
for (ParameterSetOperation operation : queryInfo.getParametersList().get(i)) {
Object[] args = operation.getArgs();
actualQueryArgs.put(args[0].toString(), args[1]);
}
assertThat(actualQueryArgs, aMapWithSize(expectedQueryArgs.size()));
for (Map.Entry<String, Object> entry : expectedQueryArgs.entrySet()) {
assertThat(actualQueryArgs, hasEntry(entry.getKey(), entry.getValue()));
}
}
// TODO: change
// for (int i = 0; i < expectedBatchSize; i++) {
// Object[] queryArgs = expectedQueryArgsList[i];
//
// verifyQueryInfo(queryInfo, query, queryArgs);
// }
}
// private static void verifyQueryInfo(QueryInfo queryInfo, String query, Object... args) {
// assertThat(queryInfo.getQuery(), is(equalTo(query)));
//
// List<?> queryArgs = queryInfo.getQueryArgsList();
// assertThat(queryArgs.size(), is(args.length));
//
// for (int i = 0; i < queryArgs.size(); i++) {
// Object value = queryArgs.get(i);
// Object expected = args[i];
//
// assertThat(value, is(expected));
// }
//
// }
}