package org.springframework.data.simpledb.core;
import static org.junit.Assert.*;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.simpledb.domain.SimpleDbUser;
import org.springframework.data.simpledb.repository.util.SimpleDbUserBuilder;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:simpledb-configured-template-context.xml")
public class SimpleDbTemplateTest {
@Autowired
private SimpleDbOperations operations;
@After
public void tearDown() {
operations.deleteAll(SimpleDbUser.class);
}
@Test
public void save_should_persist_single_item() {
String itemName = "FirstItem";
SimpleDbUser user = SimpleDbUserBuilder
.createUserWithSampleAttributes(itemName);
operations.createOrUpdate(user);
SimpleDbUser foundUser = operations.read(user.getItemName(),
user.getClass());
assertEquals(user.getItemName(), foundUser.getItemName());
assertEquals(user, foundUser);
}
@Test
public void save_should_create_new_item_for_modified_item_name() {
String itemName = "FirstItem";
SimpleDbUser user = SimpleDbUserBuilder
.createUserWithSampleAttributes(itemName);
operations.createOrUpdate(user);
itemName = "SecondItem";
user.setItemName(itemName);
operations.createOrUpdate(user);
SimpleDbUser foundUser = operations.read("SecondItem",
SimpleDbUser.class);
assertNotNull(foundUser);
assertEquals(user, foundUser);
foundUser = operations.read("FirstItem", SimpleDbUser.class);
assertNotNull(foundUser);
}
@Test
public void delete_should_remove_item() {
String itemName = "FirstItem";
SimpleDbUser user = SimpleDbUserBuilder
.createUserWithSampleAttributes(itemName);
user = operations.createOrUpdate(user);
operations.delete(user);
user = operations.read(itemName, SimpleDbUser.class);
assertNull(user);
}
@Test
public void consistent_count_should_return_total_number_of_item_with_no_delay() {
String itemName = "FirstItem";
SimpleDbUser user = SimpleDbUserBuilder
.createUserWithSampleAttributes(itemName);
operations.createOrUpdate(user);
assertEquals(1, operations.count(user.getClass()));
operations.delete(user);
assertEquals(0, operations.count(user.getClass()));
}
@Test
public void save_should_generateId() {
SimpleDbUser user = SimpleDbUserBuilder
.createUserWithSampleAttributes(null);
user = operations.createOrUpdate(user);
assertNotNull(user.getItemName());
}
@Test
public void save_should_persist_inner_nested_entities() {
String itemName = "FirstItem";
SimpleDbUser user = SimpleDbUserBuilder
.createUserWithSampleAttributes(itemName);
SimpleDbUser.NestedEntity.InnerNestedEntity innerNestedEntity = new SimpleDbUser.NestedEntity.InnerNestedEntity();
final String innerNestedFieldValue = "innerNestedFieldValue";
innerNestedEntity.setInnerNestedField(innerNestedFieldValue);
user.getNestedEntity().setInnerNestedEntity(innerNestedEntity);
operations.createOrUpdate(user);
SimpleDbUser foundUser = operations.read(user.getItemName(),
user.getClass());
assertEquals(user.getItemName(), foundUser.getItemName());
assertEquals(user, foundUser);
assertEquals(innerNestedFieldValue, user.getNestedEntity()
.getInnerNestedEntity().getInnerNestedField());
}
@Test
public void save_should_persist_fields_with_persistent_annotation()
throws Exception {
final String fieldValue = "persistedFieldValue";
SimpleDbUser user = new SimpleDbUser(fieldValue);
operations.createOrUpdate(user);
SimpleDbUser foundUser = operations.read(user.getItemName(),
user.getClass());
assertNotNull(foundUser);
Field persistentField = foundUser.getClass().getDeclaredField(
"persistedField");
if (!persistentField.isAccessible()) {
persistentField.setAccessible(true);
}
String foundFieldValue = (String) persistentField.get(foundUser);
assertEquals(fieldValue, foundFieldValue);
}
@Test
public void save_should_not_persist_transient_fields() {
String itemName = "FirstItem";
SimpleDbUser user = SimpleDbUserBuilder
.createUserWithSampleAttributes(itemName);
user.setTransientField("transientFieldValue");
operations.createOrUpdate(user);
SimpleDbUser foundUser = operations.read(user.getItemName(),
user.getClass());
assertNull(foundUser.getTransientField());
}
@Test
public void update_entity_should_update_all_given_fields() {
String itemName = "FirstItem";
SimpleDbUser user = SimpleDbUserBuilder
.createUserWithSampleAttributes(itemName);
operations.createOrUpdate(user);
Map<String, Object> propertyMap = new HashMap<String, Object>();
propertyMap.put("primitiveField", 0.02f);
propertyMap.put("coreField", "test_string$");
propertyMap.put("primitiveArrayField", new long[] { 1235L, 1236L });
propertyMap.put("coreTypeList", Arrays.asList(Integer.valueOf(123),
Integer.valueOf(23), Integer.valueOf(3)));
propertyMap.put("nestedEntity.nestedPrimitiveField", 12);
SimpleDbUser.NestedEntity.InnerNestedEntity sni = new SimpleDbUser.NestedEntity.InnerNestedEntity();
sni.setInnerNestedField("innerNestedFieldValue");
propertyMap.put("nestedEntity.innerNestedEntity", sni);
operations.update(itemName, SimpleDbUser.class, propertyMap);
SimpleDbUser found = operations.read(user.getItemName(),
SimpleDbUser.class);
assertEquals(propertyMap.get("primitiveField"),
found.getPrimitiveField());
assertEquals(propertyMap.get("coreField"), found.getCoreField());
assertArrayEquals((long[]) propertyMap.get("primitiveArrayField"),
found.getPrimitiveArrayField());
assertEquals(propertyMap.get("coreTypeList"), found.getCoreTypeList());
assertEquals(propertyMap.get("nestedEntity.nestedPrimitiveField"),
found.getNestedEntity().getNestedPrimitiveField());
assertEquals(propertyMap.get("nestedEntity.innerNestedEntity"), found
.getNestedEntity().getInnerNestedEntity());
}
}