package org.atomhopper.hibernate.query;
import org.atomhopper.adapter.jpa.PersistedCategory;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import java.util.LinkedList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(Enclosed.class)
public class SimpleCategoryCriteriaGeneratorTest {
public static class WhenGeneratingSearchQueries {
private List<String> inclusionTerms;
private Session sessionMock;
private Criteria criteriaMock;
@Before
public void standUp() {
inclusionTerms = new LinkedList<String>();
criteriaMock = mock(Criteria.class);
sessionMock = mock(Session.class);
when(sessionMock.createCriteria(PersistedCategory.class)).thenReturn(criteriaMock);
}
@Test
public void shouldIncludeSingleTerm() {
final SimpleCategoryCriteriaGenerator generator = new SimpleCategoryCriteriaGenerator("+term", inclusionTerms);
assertEquals("Generated inclusion term should match 'term'", inclusionTerms.get(0), "term");
}
@Test
public void shouldIncludeMultipleTerms() {
final SimpleCategoryCriteriaGenerator generator = new SimpleCategoryCriteriaGenerator("+term_1+term_2+term_3", inclusionTerms);
assertEquals("Generated inclusion term should match 'term_1'", "term_1", inclusionTerms.get(0));
assertEquals("Generated inclusion term should match 'term_2'", "term_2", inclusionTerms.get(1));
assertEquals("Generated inclusion term should match 'term_3'", "term_3", inclusionTerms.get(2));
}
@Test
public void shouldHandleEscapeOperators() {
final SimpleCategoryCriteriaGenerator generator = new SimpleCategoryCriteriaGenerator("+\\+term_1+\\+term_2", inclusionTerms);
assertEquals("Generated inclusion term should match '+term_1'", "+term_1", inclusionTerms.get(0));
assertEquals("Generated inclusion term should match '+term_3'", "+term_2", inclusionTerms.get(1));
}
@Test
public void shouldHandleOperatorButNoCriteria() {
final SimpleCategoryCriteriaGenerator generator = new SimpleCategoryCriteriaGenerator("+", inclusionTerms);
assertEquals(0, inclusionTerms.size());
}
@Test
public void shouldTrim() {
final SimpleCategoryCriteriaGenerator generator = new SimpleCategoryCriteriaGenerator(" \n\t+\\+term_1+\\+term_2\t\n\t \r", inclusionTerms);
assertEquals("Generated inclusion term should match '+term_1'", "+term_1", inclusionTerms.get(0));
assertEquals("Generated inclusion term should match '+term_3'", "+term_2", inclusionTerms.get(1));
}
@Test
public void shouldAcceptEmptySearchStrings() {
final SimpleCategoryCriteriaGenerator generator = new SimpleCategoryCriteriaGenerator("", inclusionTerms);
assertTrue("Generated inclusion terms should be empty", inclusionTerms.isEmpty());
}
@Test
public void shouldAcceptBlankSearchStrings() {
final SimpleCategoryCriteriaGenerator generator = new SimpleCategoryCriteriaGenerator(" \t\n\r", inclusionTerms);
assertTrue("Generated inclusion terms should be empty", inclusionTerms.isEmpty());
}
@Test
public void shouldAddCriteria() {
final SimpleCategoryCriteriaGenerator generator = new SimpleCategoryCriteriaGenerator("+term_a");
final Criteria secondCriteriaMock = mock(Criteria.class);
when(criteriaMock.createCriteria(anyString())).thenReturn(secondCriteriaMock);
generator.enhanceCriteria(criteriaMock);
}
}
}