/*
* Copyright (c) 2011-2014 Jeppetto and Jonathan Thompson
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.iternine.jeppetto.dao.test.core;
import org.iternine.jeppetto.dao.NoSuchItemException;
import org.iternine.jeppetto.dao.test.RelatedObject;
import org.iternine.jeppetto.dao.test.SimpleObject;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public abstract class DynamicDAOTest {
//-------------------------------------------------------------
// Methods - Abstract
//-------------------------------------------------------------
protected abstract DynamicDAO getDynamicDAO();
protected abstract void reset();
//-------------------------------------------------------------
// Methods - Test Lifecycle
//-------------------------------------------------------------
@After
public void after() {
reset();
}
//-------------------------------------------------------------
// Methods - Test Cases
//-------------------------------------------------------------
@Test
public void findByIntValue() {
SimpleObject simpleObject = new SimpleObject();
simpleObject.setIntValue(20);
getDynamicDAO().save(simpleObject);
SimpleObject resultObject = getDynamicDAO().findByIntValue(20);
assertEquals(resultObject.getId(), simpleObject.getId());
}
@Test
public void findByLongValue()
throws NoSuchItemException {
SimpleObject simpleObject = new SimpleObject();
simpleObject.setLongValue(1409040442249560600L);
getDynamicDAO().save(simpleObject);
SimpleObject resultObject = getDynamicDAO().findByLongValue(1409040442249560600L);
assertEquals(resultObject.getLongValue(), simpleObject.getLongValue());
}
@Test
public void findByTwoValues() {
SimpleObject newOne = new SimpleObject();
newOne.setIntValue(1);
newOne.setAnotherIntValue(20);
getDynamicDAO().save(newOne);
List<SimpleObject> result = getDynamicDAO().findByIntValueAndAnotherIntValueGreaterThan(1, 0);
Assert.assertEquals(1, result.size());
Assert.assertEquals(newOne.getId(), result.get(0).getId());
}
@Test
public void findByRelatedValue() {
RelatedObject relatedObject1 = new RelatedObject();
relatedObject1.setRelatedIntValue(20);
SimpleObject simpleObject1 = new SimpleObject();
simpleObject1.setIntValue(1);
simpleObject1.setRelatedObject(relatedObject1);
getDynamicDAO().save(simpleObject1);
RelatedObject relatedObject2 = new RelatedObject();
relatedObject2.setRelatedIntValue(30);
SimpleObject simpleObject2 = new SimpleObject();
simpleObject1.setIntValue(2);
simpleObject2.setRelatedObject(relatedObject2);
getDynamicDAO().save(simpleObject2);
SimpleObject result = getDynamicDAO().findByHavingRelatedObjectWithRelatedIntValue(20);
Assert.assertEquals(1, result.getIntValue());
Assert.assertEquals(20, result.getRelatedObject().getRelatedIntValue());
}
@Test
public void verifyNullReturnWhenMethodDoesNotDeclareException() {
SimpleObject result = getDynamicDAO().findByIntValue(1);
Assert.assertNull(result);
}
@Test(expected = NoSuchItemException.class)
public void verifyExceptionWhenMethodDeclaresException()
throws NoSuchItemException {
getDynamicDAO().findByAnotherIntValue(1);
}
@Test
public void verifySort() {
SimpleObject simpleObject;
simpleObject = new SimpleObject();
simpleObject.setIntValue(1);
getDynamicDAO().save(simpleObject);
simpleObject = new SimpleObject();
simpleObject.setIntValue(2);
getDynamicDAO().save(simpleObject);
simpleObject = new SimpleObject();
simpleObject.setIntValue(3);
getDynamicDAO().save(simpleObject);
simpleObject = new SimpleObject();
simpleObject.setIntValue(4);
getDynamicDAO().save(simpleObject);
List<SimpleObject> result = getDynamicDAO().findByOrderByIntValueDesc();
Assert.assertEquals(4, result.size());
Assert.assertEquals(4, result.get(0).getIntValue());
Assert.assertEquals(3, result.get(1).getIntValue());
Assert.assertEquals(2, result.get(2).getIntValue());
Assert.assertEquals(1, result.get(3).getIntValue());
}
@Test
public void getSet() {
SimpleObject newOne = new SimpleObject();
newOne.setIntValue(1);
getDynamicDAO().save(newOne);
Set<SimpleObject> result = getDynamicDAO().findByIntValueGreaterThan(0);
Assert.assertEquals(1, result.size());
}
@Test
public void findSomeObjects() {
createData();
List<SimpleObject> results = getDynamicDAO().findByIntValueWithin(Arrays.asList(1, 3, 4));
assertEquals(2, results.size());
assertTrue(results.get(0).getIntValue() == 1 || results.get(0).getIntValue() == 3);
assertTrue(results.get(0).getIntValue() != results.get(1).getIntValue());
}
@Test
public void findAndSort() {
createData();
List<SimpleObject> results = getDynamicDAO().findByHavingRelatedObjectsWithRelatedIntValueLessThanOrderByIntValueDesc(19);
assertEquals(2, results.size());
assertEquals(3, results.get(0).getIntValue());
assertEquals(2, results.get(1).getIntValue());
}
@Test
public void findAndSortReturnIterable() {
createData();
Iterable<SimpleObject> results = getDynamicDAO().findByHavingRelatedObjectsWithRelatedIntValueLessThanOrderByIntValue(19);
Iterator<SimpleObject> i = results.iterator();
assertTrue(i.hasNext());
assertEquals(2, i.next().getIntValue());
assertTrue(i.hasNext());
assertEquals(3, i.next().getIntValue());
assertFalse(i.hasNext());
}
@Test
public void limit() {
createData();
List<SimpleObject> results = getDynamicDAO().findByHavingRelatedObjectsWithRelatedIntValueLessThanOrderByIntValueAndLimit(
19, 1);
assertEquals(1, results.size());
assertEquals(2, results.get(0).getIntValue());
}
@Test
public void limitAndSkip() {
createData();
List<SimpleObject> results = getDynamicDAO().findByHavingRelatedObjectsWithRelatedIntValueLessThanOrderByIntValueAndLimitAndSkip(
19, 1, 1);
assertEquals(1, results.size());
assertEquals(3, results.get(0).getIntValue());
}
@Test
// TODO: Move to functional test (requires hibernate implementation)
public void saveMultipleThenDeleteSome()
throws NoSuchItemException {
SimpleObject simpleObject = new SimpleObject();
simpleObject.setIntValue(1234);
getDynamicDAO().save(simpleObject);
SimpleObject simpleObject2 = new SimpleObject();
simpleObject2.setIntValue(2345);
getDynamicDAO().save(simpleObject2);
SimpleObject simpleObject3 = new SimpleObject();
simpleObject2.setIntValue(3456);
getDynamicDAO().save(simpleObject3);
Iterable<SimpleObject> results = getDynamicDAO().findAll();
int resultCount = 0;
// noinspection UnusedDeclaration
for (SimpleObject ignore : results) {
resultCount++;
}
Assert.assertTrue(resultCount == 3);
getDynamicDAO().deleteByIntValueWithin(Arrays.asList(1234, 2345));
Iterable<SimpleObject> results2 = getDynamicDAO().findAll();
int resultCount2 = 0;
// noinspection UnusedDeclaration
for (SimpleObject ignore : results2) {
resultCount2++;
}
Assert.assertTrue(resultCount2 == 1);
}
@Test
public void findByRelatedObjectIsNotNull() {
SimpleObject simpleObject = new SimpleObject();
simpleObject.setIntValue(1234);
getDynamicDAO().save(simpleObject);
List<SimpleObject> results = getDynamicDAO().findByRelatedObjectIsNotNull();
Assert.assertEquals(0, results.size());
}
@Test
public void findByRelatedObjectIsNull() {
for (int i = 0; i < 100; i++) {
RelatedObject relatedObject = new RelatedObject();
relatedObject.setRelatedIntValue(i);
SimpleObject simpleObject = new SimpleObject();
simpleObject.setIntValue(i);
simpleObject.setRelatedObject(relatedObject);
getDynamicDAO().save(simpleObject);
}
SimpleObject simpleObject = new SimpleObject();
simpleObject.setIntValue(100);
getDynamicDAO().save(simpleObject);
SimpleObject result = getDynamicDAO().findByRelatedObjectIsNull();
Assert.assertNotNull(result);
}
@Test
public void testBeginsWith() {
List<String> strings = Arrays.asList("abcdef", "abbcdef", "defabc", "abcxyz", "defabcghi", "abc123");
int intValue = 0;
for (String string : strings) {
SimpleObject simpleObject = new SimpleObject();
simpleObject.setIntValue(intValue++);
simpleObject.setStringValue(string);
getDynamicDAO().save(simpleObject);
}
Assert.assertEquals(3, getDynamicDAO().findByStringValueBeginsWith("abc").size());
Assert.assertEquals(2, getDynamicDAO().findByStringValueBeginsWith("defabc").size());
Assert.assertEquals(0, getDynamicDAO().findByStringValueBeginsWith("123").size());
}
@Test
public void testNestedBeginsWith() {
List<String> strings = Arrays.asList("abcdef", "abbcdef", "defabc", "abcxyz", "defabcghi", "abc123");
int intValue = 0;
for (String string : strings) {
RelatedObject relatedObject = new RelatedObject();
relatedObject.setRelatedStringValue(string);
SimpleObject simpleObject = new SimpleObject();
simpleObject.setIntValue(intValue++);
simpleObject.setRelatedObject(relatedObject);
getDynamicDAO().save(simpleObject);
}
Assert.assertEquals(3, getDynamicDAO().findByHavingRelatedObjectWithRelatedStringValueBeginsWith("abc").size());
Assert.assertEquals(2, getDynamicDAO().findByHavingRelatedObjectWithRelatedStringValueBeginsWith("defabc").size());
Assert.assertEquals(0, getDynamicDAO().findByHavingRelatedObjectWithRelatedStringValueBeginsWith("123").size());
}
//-------------------------------------------------------------
// Methods - Protected
//-------------------------------------------------------------
protected void createData() {
SimpleObject simpleObject;
RelatedObject relatedObject;
simpleObject = new SimpleObject();
simpleObject.setIntValue(1);
relatedObject = new RelatedObject();
relatedObject.setRelatedIntValue(20);
simpleObject.addRelatedObject(relatedObject);
getDynamicDAO().save(simpleObject);
simpleObject = new SimpleObject();
simpleObject.setIntValue(2);
relatedObject = new RelatedObject();
relatedObject.setRelatedIntValue(15);
simpleObject.addRelatedObject(relatedObject);
getDynamicDAO().save(simpleObject);
simpleObject = new SimpleObject();
simpleObject.setIntValue(3);
relatedObject = new RelatedObject();
relatedObject.setRelatedIntValue(10);
simpleObject.addRelatedObject(relatedObject);
getDynamicDAO().save(simpleObject);
}
}