package jpasearch.repository.unique;
import static org.assertj.core.api.Assertions.assertThat;
import javax.inject.Inject;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.transaction.Transactional;
import jpasearch.TestApplication;
import jpasearch.domain.unique.EntityWithUniqueField;
import jpasearch.domain.unique.EntityWithUniqueField_;
import jpasearch.repository.query.SearchParameters;
import jpasearch.repository.query.builder.SearchBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
/**
* @author speralta
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestApplication.class)
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class EntityWithUniqueFieldRepositoryIT {
@Inject
private EntityWithUniqueFieldRepository entityWithUniqueFieldRepository;
@Test
public void findUniqueFailsNoResult() {
try {
entityWithUniqueFieldRepository.findUnique(findByValue("test"));
} catch (Exception e) {
assertThat(e).isInstanceOf(NoResultException.class);
}
}
@Test
public void findUniqueFailsMoreResults() {
EntityWithUniqueField entityWithUniqueField1 = new EntityWithUniqueField();
entityWithUniqueField1.setValue("test1");
entityWithUniqueFieldRepository.save(entityWithUniqueField1);
EntityWithUniqueField entityWithUniqueField2 = new EntityWithUniqueField();
entityWithUniqueField2.setValue("test2");
entityWithUniqueFieldRepository.save(entityWithUniqueField2);
try {
entityWithUniqueFieldRepository.findUnique(new SearchBuilder<EntityWithUniqueField>().build());
} catch (Exception e) {
assertThat(e).isInstanceOf(NonUniqueResultException.class);
}
}
@Test
public void findUnique() {
final String testValue = "test";
assertThat(entityWithUniqueFieldRepository.findUniqueOrNone(findByValue(testValue))).isNull();
EntityWithUniqueField entityWithUniqueField = new EntityWithUniqueField();
entityWithUniqueField.setValue(testValue);
entityWithUniqueField = entityWithUniqueFieldRepository.save(entityWithUniqueField);
assertThat(entityWithUniqueFieldRepository.findUnique(findByValue(testValue))).isEqualTo(entityWithUniqueField);
}
private SearchParameters<EntityWithUniqueField> findByValue(String value) {
return new SearchBuilder<EntityWithUniqueField>() //
.on(EntityWithUniqueField_.value).equalsTo(value) //
.build();
}
}