package org.castor.jdo.jpa.processors.classprocessors;
import javax.persistence.NamedQuery;
import javax.persistence.NamedNativeQueries;
import java.util.Map;
import org.mockito.MockitoAnnotations;
import org.mockito.Mock;
import org.castor.jdo.jpa.info.ClassInfoBuilder;
import org.castor.jdo.jpa.info.ClassInfo;
import org.castor.jdo.jpa.natures.JPAClassNature;
import org.junit.Before;
import org.junit.Test;
import javax.persistence.Entity;
import javax.persistence.NamedNativeQuery;
import static org.junit.Assert.*;
public class JPANamedNativeQueriesProcessorTest {
final static String NAME = "name";
final static String QUERY = "query";
final static String NAME2 = "name2";
final static String QUERY2 = "query2";
JPANamedNativeQueriesProcessor processor;
JPAClassNature classNature;
@Mock
NamedNativeQueries annotation;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
processor = new JPANamedNativeQueriesProcessor();
ClassInfo classInfo = new ClassInfo();
classInfo.addNature(JPAClassNature.class.getCanonicalName());
classNature = new JPAClassNature(classInfo);
}
@Test
public void processorIsForNamedNativeQueriesAnnotation() throws Exception {
assertEquals(NamedNativeQueries.class, processor.forAnnotationClass());
}
@Test
public void processorReturnsTrueForNamedNativeQueriesAnnotatedClassCorrectly()
throws Exception {
boolean result = processor.processAnnotation(classNature, annotation,
NamedNativeQueriesAnnotatedClass.class);
assertTrue(result);
}
@Test
public void annotationValuesAreProcessedCorrectly() throws Exception {
ClassInfo classInfo = ClassInfoBuilder
.buildClassInfo(NamedNativeQueriesAnnotatedClass.class);
assertNotNull(classInfo);
assertTrue(classInfo.hasNature(JPAClassNature.class.getName()));
JPAClassNature jpaClassNature = new JPAClassNature(classInfo);
final Map queryMap = jpaClassNature.getNamedNativeQuery();
assertNotNull(queryMap);
assertTrue(queryMap.keySet().contains(NAME));
assertTrue(queryMap.keySet().contains(NAME2));
assertEquals(QUERY, queryMap.get(NAME));
assertEquals(QUERY2, queryMap.get(NAME2));
}
@Test
public void processorReturnsFalseForNonAnnotatedClass() throws Exception {
boolean result = processor.processAnnotation(classNature, annotation,
NonAnnotatedClass.class);
assertFalse(result);
}
@Test
public void processorReturnsFalseForOtherwiseAnnotatedClass()
throws Exception {
boolean result = processor.processAnnotation(classNature, annotation,
OtherwiseAnnotatedClass.class);
assertFalse(result);
}
// test classes
@Entity
@NamedNativeQueries( { @NamedNativeQuery(name = NAME, query = QUERY),
@NamedNativeQuery(name = NAME2, query = QUERY2) })
private class NamedNativeQueriesAnnotatedClass {
}
private class NonAnnotatedClass {
}
@Entity
@NamedQuery(name = "this is not a NamedNativeQuery annotation", query = "")
private class OtherwiseAnnotatedClass {
}
}