package org.springframework.data.simpledb.repository;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.simpledb.config.SimpleDBJavaConfiguration;
import org.springframework.data.simpledb.core.SimpleDbOperations;
import org.springframework.data.simpledb.domain.SimpleDbReferences;
import org.springframework.data.simpledb.domain.SimpleDbReferences.FirstNestedEntity;
import org.springframework.data.simpledb.domain.SimpleDbReferences.SecondNestedEntity;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.amazonaws.services.simpledb.AmazonSimpleDB;
import com.amazonaws.services.simpledb.model.ListDomainsRequest;
import com.amazonaws.services.simpledb.model.ListDomainsResult;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SimpleDBJavaConfiguration.class)
public class SimpleDbReferencesRepositoryTest {
@Autowired
private SimpleDbReferencesRepository repository;
@Autowired
SimpleDbOperations operations;
@After
public void tearDown() {
repository.deleteAll();
operations.deleteAll(SecondNestedEntity.class);
operations.deleteAll(FirstNestedEntity.class);
}
@Test
public void manageDomains_should_create_domains_referred_by_repository() {
AmazonSimpleDB sdb = operations.getDB();
final String domainPrefix = operations.getSimpleDb().getDomainPrefix();
ListDomainsResult listDomainsResult = sdb.listDomains(new ListDomainsRequest());
List<String> domainNames = listDomainsResult.getDomainNames();
String nextToken = listDomainsResult.getNextToken();
while (nextToken != null && !nextToken.isEmpty()) {
listDomainsResult = sdb.listDomains(new ListDomainsRequest().withNextToken(nextToken));
domainNames.addAll(listDomainsResult.getDomainNames());
nextToken = listDomainsResult.getNextToken();
}
assertThat(domainNames.contains(domainPrefix + ".simpleDbReferences"), is(true));
assertThat(domainNames.contains(domainPrefix + ".firstNestedEntity"), is(true));
assertThat(domainNames.contains(domainPrefix + ".secondNestedEntity"), is(true));
Assert.assertNotNull(operations);
}
@Test
public void should_persist_reference_entities_in_separate_domains() {
final SimpleDbReferences domainEntity = new SimpleDbReferences();
final FirstNestedEntity nestedEntity1 = new FirstNestedEntity();
nestedEntity1.setItemName("nested_entity_1");
final SecondNestedEntity nestedEntity2 = new SecondNestedEntity();
nestedEntity1.setSecondNestedEntity(nestedEntity2);
domainEntity.setFirstNestedEntity(nestedEntity1);
repository.save(domainEntity);
final SimpleDbReferences foundReferences = repository.findOne(domainEntity.getItemName());
final FirstNestedEntity foundFirstNestedEntity = operations.read(nestedEntity1.getItemName(),
FirstNestedEntity.class);
final SecondNestedEntity foundSecondNestedEntity = operations.read(nestedEntity2.getItemName(),
SecondNestedEntity.class);
/*
* We haven't implemented deserialization for reference attributes, therefore we are testing for ID equalito
* only. This proves that they were saved in separate domains!
*/
assertNotNull(foundReferences);
assertEquals(domainEntity.getItemName(), foundReferences.getItemName());
assertNotNull(foundFirstNestedEntity);
assertEquals(nestedEntity1.getItemName(), foundFirstNestedEntity.getItemName());
assertNotNull(foundSecondNestedEntity);
assertEquals(nestedEntity2.getItemName(), foundSecondNestedEntity.getItemName());
assertEquals(nestedEntity2.getPrimitive(), foundSecondNestedEntity.getPrimitive());
}
@Test
public void should_cascade_delete_on_reference_entities() {
final SimpleDbReferences domainEntity = new SimpleDbReferences();
final FirstNestedEntity nestedEntity1 = new FirstNestedEntity();
nestedEntity1.setItemName("nested_entity_1");
final SecondNestedEntity nestedEntity2 = new SecondNestedEntity();
nestedEntity1.setSecondNestedEntity(nestedEntity2);
domainEntity.setFirstNestedEntity(nestedEntity1);
final SimpleDbReferences savedEntity = repository.save(domainEntity);
repository.delete(savedEntity);
final SimpleDbReferences foundReferences = repository.findOne(domainEntity.getItemName());
final FirstNestedEntity foundFirstNestedEntity = operations.read(nestedEntity1.getItemName(),
FirstNestedEntity.class);
final SecondNestedEntity foundSecondNestedEntity = operations.read(nestedEntity2.getItemName(),
SecondNestedEntity.class);
assertNull(foundReferences);
assertNull(foundFirstNestedEntity);
assertNull(foundSecondNestedEntity);
}
@Test
public void should_deserialize_nested_references() {
final SimpleDbReferences domainEntity = new SimpleDbReferences();
final FirstNestedEntity nestedEntity1 = new FirstNestedEntity();
nestedEntity1.setItemName("nested_entity_1");
final SecondNestedEntity nestedEntity2 = new SecondNestedEntity();
nestedEntity1.setSecondNestedEntity(nestedEntity2);
domainEntity.setFirstNestedEntity(nestedEntity1);
repository.save(domainEntity);
final SimpleDbReferences foundParent = repository.findOne(domainEntity.getItemName());
assertEquals(nestedEntity1, foundParent.getFirstNestedEntity());
assertEquals(nestedEntity2, foundParent.getFirstNestedEntity().getSecondNestedEntity());
}
}