package com.aconex.scrutineer.jdbc;
import static com.aconex.scrutineer.HasIdAndVersionMatcher.hasIdAndVersion;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.sql.Types;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.aconex.scrutineer.IdAndVersionFactory;
import com.aconex.scrutineer.StringIdAndVersion;
public class IdAndVersionResultSetIteratorTest {
private static final String ID = "ID";
private static final long VERSION = 123L;
private IdAndVersionFactory idAndVersionFactory = StringIdAndVersion.FACTORY;
@Mock
private ResultSet resultSet;
@Mock
private ResultSetMetaData metaData;
@Before
public void setup() {
initMocks(this);
}
@Test
public void shouldReturnNextIfResultSetHasMoreResults() throws SQLException {
when(resultSet.next()).thenReturn(true);
when(resultSet.getMetaData()).thenReturn(metaData);
when(metaData.getColumnType(1)).thenReturn(Types.VARCHAR);
when(metaData.getColumnType(2)).thenReturn(Types.TIMESTAMP);
when(resultSet.getString(1)).thenReturn(ID);
when(resultSet.getTimestamp(2)).thenReturn(new Timestamp(VERSION));
IdAndVersionResultSetIterator idAndVersionResultSetIterator = new IdAndVersionResultSetIterator(resultSet, idAndVersionFactory);
assertThat(idAndVersionResultSetIterator.hasNext(), is(true));
}
@Test
public void shouldReturnFalseIfResultSetHasNoMoreResults() throws SQLException {
when(resultSet.next()).thenReturn(false);
when(resultSet.getMetaData()).thenReturn(metaData);
when(metaData.getColumnType(1)).thenReturn(Types.VARCHAR);
when(metaData.getColumnType(2)).thenReturn(Types.TIMESTAMP);
when(resultSet.getString(1)).thenReturn(ID);
when(resultSet.getTimestamp(2)).thenReturn(new Timestamp(VERSION));
IdAndVersionResultSetIterator idAndVersionResultSetIterator = new IdAndVersionResultSetIterator(resultSet, idAndVersionFactory);
assertThat(idAndVersionResultSetIterator.hasNext(), is(false));
}
@Test
public void shouldGetTheNextIdAndVersion() throws SQLException {
when(resultSet.getMetaData()).thenReturn(metaData);
when(metaData.getColumnType(1)).thenReturn(Types.VARCHAR);
when(metaData.getColumnType(2)).thenReturn(Types.TIMESTAMP);
when(resultSet.next()).thenReturn(true).thenReturn(false);
when(resultSet.getString(1)).thenReturn(ID);
when(resultSet.getTimestamp(2)).thenReturn(new Timestamp(VERSION));
IdAndVersionResultSetIterator idAndVersionResultSetIterator = new IdAndVersionResultSetIterator(resultSet, idAndVersionFactory);
assertThat(idAndVersionResultSetIterator.next(), hasIdAndVersion(ID,VERSION));
assertThat(idAndVersionResultSetIterator.hasNext(), is(false));
}
@Test
public void shouldSupportBothDatesAndLongVersions() throws SQLException {
when(resultSet.getMetaData()).thenReturn(metaData);
when(metaData.getColumnType(1)).thenReturn(Types.VARCHAR);
when(metaData.getColumnType(2)).thenReturn(Types.BIGINT);
when(resultSet.next()).thenReturn(true).thenReturn(false);
when(resultSet.getString(1)).thenReturn(ID);
when(resultSet.getLong(2)).thenReturn(VERSION);
IdAndVersionResultSetIterator idAndVersionResultSetIterator = new IdAndVersionResultSetIterator(resultSet, idAndVersionFactory);
assertThat(idAndVersionResultSetIterator.next(), hasIdAndVersion(ID,VERSION));
assertThat(idAndVersionResultSetIterator.hasNext(), is(false));
}
}