package org.teiid.resource.adapter.simpledb;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.simpledb.AmazonSimpleDBClient;
import com.amazonaws.services.simpledb.model.Attribute;
import com.amazonaws.services.simpledb.model.DomainMetadataRequest;
import com.amazonaws.services.simpledb.model.DomainMetadataResult;
import com.amazonaws.services.simpledb.model.Item;
import com.amazonaws.services.simpledb.model.ListDomainsResult;
import com.amazonaws.services.simpledb.model.ReplaceableAttribute;
import com.amazonaws.services.simpledb.model.SelectRequest;
import com.amazonaws.services.simpledb.model.SelectResult;
@SuppressWarnings("nls")
public class SimpleDbAPIClassTest {
@Mock
AmazonSimpleDBClient client;
SimpleDBConnectionImpl simpleDbApi;
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
//I can't mock constructor of AmazonSimpleDBClient, thus this try/catch
try{
simpleDbApi = new SimpleDBConnectionImpl("test", "test");
}catch(AmazonServiceException ex){
//do nothing
}
replaceField("client", simpleDbApi, client);
}
@Test
public void getDomainsTest() throws Exception {
ListDomainsResult listDomainResult = Mockito.mock(ListDomainsResult.class);
List<String> resultList = new ArrayList<String>();
resultList.add("Test");
resultList.add("Test1");
when(client.listDomains()).thenReturn(listDomainResult);
when(listDomainResult.getDomainNames()).thenReturn(resultList);
assertEquals(resultList, simpleDbApi.getDomains());
}
@Test
public void getAttributeNamesTest() throws Exception {
DomainMetadataResult metadataResult = mock(DomainMetadataResult.class);
SelectResult result = mock(SelectResult.class);
ArrayList<Item> items = new ArrayList<Item>();
items.add(new Item("1", Arrays.asList(new Attribute("c", "d"), new Attribute("a", "b"))));
stub(result.getItems()).toReturn(items);
when(metadataResult.getAttributeNameCount()).thenReturn(2);
when(client.select(any(SelectRequest.class))).thenReturn(result);
when(client.domainMetadata(any(DomainMetadataRequest.class))).thenReturn(metadataResult);
assertEquals("c", simpleDbApi.getAttributeNames("x").iterator().next().getName());
}
@Test
public void testAddNullAttribute() throws Exception {
ArrayList<ReplaceableAttribute> attributes = new ArrayList<ReplaceableAttribute>();
simpleDbApi.addAttribute("x", null, attributes);
assertNull(attributes.get(0).getValue());
}
private void replaceField(String fieldName, Object object, Object newFieldValue){
try {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, newFieldValue);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}