/*
* 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 com.wizecommerce.hecuba.hector;
import com.wizecommerce.hecuba.HecubaConstants;
import me.prettyprint.cassandra.model.HColumnImpl;
import me.prettyprint.hector.api.beans.ColumnSlice;
import me.prettyprint.hector.api.beans.HColumn;
import org.apache.commons.collections.CollectionUtils;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* This unit tests methods of HectorColumnSliceResultSet
*
* @author asinghal
* Date: Jan-2013
*/
public class HectorColumnSliceResultSetTest {
private ColumnSlice<String, String> columnSlice;
private HColumn<String, String> hColumn;
private HectorColumnSliceResultSet<Long, String, String> sliceResultSet;
private long timeInMillis;
List<HColumn<String, String>> hColumns;
List<String> columnNameList;
@Before
public void setup() {
columnSlice = mock(ColumnSlice.class);
hColumns = new ArrayList<HColumn<String, String>>();
columnNameList = new ArrayList<String>();
for (int i = 1; i <= 5; i++) {
HColumn<String, String> hcol = new HColumnImpl<String, String>("Column" + i, "Value" + i,
System.currentTimeMillis());
hColumns.add(hcol);
columnNameList.add("Column" + i);
}
when(columnSlice.getColumns()).thenReturn(hColumns);
sliceResultSet = new HectorColumnSliceResultSet<Long, String, String>(columnSlice);
timeInMillis = System.currentTimeMillis();
}
@Test
public void testGetString() throws Exception {
final String fieldName = "AwesomeColumn";
final String stringFieldValue = "AwesomeValue";
final String defaultStringFieldValue = "AwesomeDefaultValue";
// this column has a value.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName,
stringFieldValue,
timeInMillis));
assertEquals(stringFieldValue, sliceResultSet.getString(fieldName));
// this column doesn't have a value.
when(columnSlice.getColumnByName(fieldName + "NotThere")).thenReturn(null);
assertEquals(defaultStringFieldValue,
sliceResultSet.getString(fieldName + "NotThere", defaultStringFieldValue));
assertNull(sliceResultSet.getString(fieldName + "NotThere"));
}
@Test
public void testGetBoolean() throws Exception {
final String fieldName = "AwesomeBooleanColumn";
// this column has a value.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "true",
timeInMillis));
assertTrue(sliceResultSet.getBoolean(fieldName));
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "1",
timeInMillis));
assertTrue(sliceResultSet.getBoolean(fieldName));
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "false",
timeInMillis));
assertFalse(sliceResultSet.getBoolean(fieldName));
// this column doesn't have a value.
when(columnSlice.getColumnByName(fieldName + "NotThere")).thenReturn(null);
assertFalse(sliceResultSet.getBoolean(fieldName + "NotThere", false));
assertTrue(sliceResultSet.getBoolean(fieldName + "NotThere", true));
assertFalse(sliceResultSet.getBoolean(fieldName + "NotThere"));
// let this blow up.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "false",
timeInMillis));
assertEquals(false, sliceResultSet.getBoolean(fieldName));
}
@Test
public void testGetDate() throws Exception {
final String fieldName = "AwesomeDateColumn";
// this column has a value.
final Date actualDate = new GregorianCalendar(2012, 11, 29).getTime();
when(columnSlice.getColumnByName(fieldName)).thenReturn(
new HColumnImpl<String, String>(fieldName, HecubaConstants.DATE_FORMATTER.
print(actualDate.getTime()), timeInMillis));
assertEquals(actualDate.getTime(), sliceResultSet.getDate(fieldName).getTime());
// this column doesn't have a value.
when(columnSlice.getColumnByName(fieldName + "NotThere")).thenReturn(null);
assertNull(sliceResultSet.getDate(fieldName + "NotThere"));
final Date time = new GregorianCalendar(1978, 04, 16).getTime();
assertEquals(time.getTime(), sliceResultSet.getDate(fieldName + "NotThere", time).getTime());
// let this blow up.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName,
"ThisIsNotADate",
timeInMillis));
assertNull(sliceResultSet.getDate(fieldName));
}
@Test
public void testGetInteger() throws Exception {
final String fieldName = "AwesomeIntegerColumn";
// this column has a value.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "1",
timeInMillis));
assertEquals(1, (int) sliceResultSet.getInteger(fieldName));
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "100",
timeInMillis));
assertEquals(100, (int) sliceResultSet.getInteger(fieldName));
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "-15",
timeInMillis));
assertEquals(-15, (int) sliceResultSet.getInteger(fieldName));
// this column doesn't have a value.
when(columnSlice.getColumnByName(fieldName + "NotThere")).thenReturn(new HColumnImpl<String,
String>(fieldName, "null", timeInMillis));
assertEquals(0, (int) sliceResultSet.getInteger(fieldName + "NotThere"));
assertEquals(199, (int) sliceResultSet.getInteger(fieldName + "NotThere", 199));
// let this blow up.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName,
"ThisIsNotAnInteger",
timeInMillis));
assertEquals(0, (int) sliceResultSet.getInteger(fieldName));
assertEquals(2211, (int) sliceResultSet.getInteger(fieldName, 2211));
}
@Test
public void testGetLong() throws Exception {
final String fieldName = "AwesomeLongColumn";
// this column has a value.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "1",
timeInMillis));
assertEquals(1, (long) sliceResultSet.getLong(fieldName));
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName,
"1000000000000000000",
timeInMillis));
assertEquals(1000000000000000000L, (long) sliceResultSet.getLong(fieldName));
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "-15",
timeInMillis));
assertEquals(-15L, (long) sliceResultSet.getLong(fieldName));
// this column doesn't have a value.
when(columnSlice.getColumnByName(fieldName + "NotThere")).thenReturn(new HColumnImpl<String,
String>(fieldName, "null", timeInMillis));
assertEquals(0L, (long) sliceResultSet.getLong(fieldName + "NotThere"));
assertEquals(2345L, (long) sliceResultSet.getLong(fieldName + "NotThere", 2345L));
// let this blow up.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName,
"ThisIsNotAnInteger",
timeInMillis));
assertEquals(0L, (long) sliceResultSet.getLong(fieldName));
assertEquals(2211L, (long) sliceResultSet.getLong(fieldName, 2211L));
}
@Test
public void testGetDouble() throws Exception {
final String fieldName = "AwesomeDoubleColumn";
// this column has a value.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "0.33",
timeInMillis));
assertEquals(0.33, sliceResultSet.getDouble(fieldName), 0.001);
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName,
"12345.1234",
timeInMillis));
assertEquals(12345.1234, sliceResultSet.getDouble(fieldName), 0.001);
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "-15.0",
timeInMillis));
assertEquals(-15.0, sliceResultSet.getDouble(fieldName), 0.001);
// this column doesn't have a value.
when(columnSlice.getColumnByName(fieldName + "NotThere")).thenReturn(new HColumnImpl<String,
String>(fieldName, "null", timeInMillis));
assertEquals(0.0, sliceResultSet.getDouble(fieldName + "NotThere"), 0.0);
assertEquals(1.111, sliceResultSet.getDouble(fieldName + "NotThere", 1.111), 0.0);
// let this blow up.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName,
"ThisIsNotADouble",
timeInMillis));
assertEquals(0.0, sliceResultSet.getDouble(fieldName), 0.0);
assertEquals(2211.0, sliceResultSet.getDouble(fieldName, 2211.0), 0.01);
}
@Test
public void testGetFloat() throws Exception {
final String fieldName = "AwesomeFloatColumn";
// this column has a value.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "0.33",
timeInMillis));
assertEquals(0.33, sliceResultSet.getFloat(fieldName), 0.001);
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName,
"12345.1234",
timeInMillis));
assertEquals(12345.1234, sliceResultSet.getFloat(fieldName), 0.001);
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName, "-15.0",
timeInMillis));
assertEquals(-15.0, sliceResultSet.getFloat(fieldName), 0.001);
// this column doesn't have a value.
when(columnSlice.getColumnByName(fieldName + "NotThere")).thenReturn(new HColumnImpl<String,
String>(fieldName, "null", timeInMillis));
assertEquals(0.0, sliceResultSet.getFloat(fieldName + "NotThere"), 0.0);
assertEquals(1.111, sliceResultSet.getFloat(fieldName + "NotThere", 1.111f), 0.001);
// let this blow up.
when(columnSlice.getColumnByName(fieldName)).thenReturn(new HColumnImpl<String, String>(fieldName,
"ThisIsNotAFloat",
timeInMillis));
assertEquals(0.0, sliceResultSet.getFloat(fieldName), 0.0);
assertEquals(2211.0, sliceResultSet.getFloat(fieldName, 2211.0f), 0.01);
}
@Test
public void testGetColumnNames() throws Exception {
assertTrue(CollectionUtils.isEqualCollection(columnNameList, sliceResultSet.getColumnNames()));
}
@Test
public void testHasColumn() throws Exception {
for (String columnName : columnNameList) {
assertTrue(sliceResultSet.hasColumn(columnName));
}
}
}