/**Copyright 2010 Research Studios Austria Forschungsgesellschaft mBH * * This file is part of easyrec. * * easyrec is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * easyrec is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with easyrec. If not, see <http://www.gnu.org/licenses/>. */ package org.easyrec.store.dao.core; import org.dbunit.dataset.Column; import org.dbunit.dataset.filter.IColumnFilter; import org.easyrec.model.core.ItemVO; import org.easyrec.model.core.RecommendationVO; import org.easyrec.model.core.RecommendedItemVO; import org.easyrec.model.core.transfer.TimeConstraintVO; import org.junit.Test; import org.junit.runner.RunWith; import org.unitils.UnitilsJUnit4TestClassRunner; import org.unitils.dbunit.annotation.DataSet; import org.unitils.dbunit.annotation.ExpectedDataSet; import org.unitils.spring.annotation.SpringApplicationContext; import org.unitils.spring.annotation.SpringBeanByName; import java.util.*; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.greaterThan; import static org.junit.Assert.*; @RunWith(UnitilsJUnit4TestClassRunner.class) @SpringApplicationContext({ "spring/easyrecDataSource.xml", "spring/core/dao/RecommendationDAO.xml", "spring/core/dao/RecommendedItemDAO.xml"}) @DataSet(value = RecommendationDAOTest.DATA_FILENAME) public class RecommendationDAOTest { // filenames of xml files public final static String DATA_FILENAME = "/dbunit/core/dao/recommendation_and_recommended_items.xml"; public final static String DATA_FILENAME_NO_TIME = "/dbunit/core/dao/recommendation_and_recommended_items_no_time.xml"; public final static String DATA_FILENAME_ONE_LESS = "/dbunit/core/dao/recommendation_and_recommended_items_one_less.xml"; // column filter used to skip actionTime column private final static IColumnFilter recommendationTimeColumnFilter = new IColumnFilter() { public boolean accept(String tableName, Column column) { if (tableName.equals(RecommendationDAO.DEFAULT_TABLE_NAME) && column.getColumnName().equals(RecommendationDAO.DEFAULT_RECOMMENDATION_TIME_COLUMN_NAME)) { return false; } return true; } }; // members @SpringBeanByName private RecommendationDAO recommendationDAO; @Test public void testGetTenantIdOfRecommendationById() { assertEquals(1, recommendationDAO.getTenantIdOfRecommendationById(1, true).intValue()); assertEquals(1, recommendationDAO.getTenantIdOfRecommendationById(2, true).intValue()); assertEquals(1, recommendationDAO.getTenantIdOfRecommendationById(3, true).intValue()); assertEquals(2, recommendationDAO.getTenantIdOfRecommendationById(4, true).intValue()); assertEquals(1, recommendationDAO.getTenantIdOfRecommendationById(5, true).intValue()); assertEquals(1, recommendationDAO.getTenantIdOfRecommendationById(1, false).intValue()); assertEquals(1, recommendationDAO.getTenantIdOfRecommendationById(2, false).intValue()); assertEquals(1, recommendationDAO.getTenantIdOfRecommendationById(3, false).intValue()); assertEquals(2, recommendationDAO.getTenantIdOfRecommendationById(4, false).intValue()); assertEquals(1, recommendationDAO.getTenantIdOfRecommendationById(5, false).intValue()); } @Test @DataSet(DATA_FILENAME_ONE_LESS) @ExpectedDataSet(DATA_FILENAME_NO_TIME) public void testInsertRecommendation() { RecommendationVO<Integer, Integer> recommendation = null; try { List<RecommendedItemVO<Integer, Integer>> recommendedItems = new ArrayList<RecommendedItemVO<Integer, Integer>>(); recommendedItems.add(new RecommendedItemVO<Integer, Integer>( new ItemVO<Integer, Integer>(1, 33, 1), 0.89d, 1, "x")); recommendedItems.add(new RecommendedItemVO<Integer, Integer>( new ItemVO<Integer, Integer>(1, 34, 1), 0.88d, 1, "x")); recommendation = new RecommendationVO<Integer, Integer>(1, 3, 1, 1, 1, 1, "a", "b", recommendedItems); } catch (Exception e) { fail("caught exception: " + e); } assertTrue(recommendation.getId() == null); recommendationDAO.insertRecommendation(recommendation); assertThat(recommendation.getId(), is(greaterThan(4))); assertThat(recommendation.getRecommendedItems().get(0).getId(), is(greaterThan(8))); assertThat(recommendation.getRecommendedItems().get(1).getId(), is(greaterThan(9))); } @Test public void testLoadRecommendation() { RecommendationVO<Integer, Integer> loadedRecommendation = recommendationDAO .loadRecommendation(5); List<RecommendedItemVO<Integer, Integer>> recommendedItems = new ArrayList<RecommendedItemVO<Integer, Integer>>(); recommendedItems.add( new RecommendedItemVO<Integer, Integer>(9, new ItemVO<Integer, Integer>(1, 33, 1), 0.89d, 5, 1, "x")); recommendedItems.add(new RecommendedItemVO<Integer, Integer>(10, new ItemVO<Integer, Integer>(1, 34, 1), 0.88d, 5, 1, "x")); RecommendationVO<Integer, Integer> expectedRecommendation = new RecommendationVO<Integer, Integer>( 5, 1, 3, 1, 1, 1, 1, "a", "b", new Date(new GregorianCalendar(2007, 3, 15, 12, 18).getTimeInMillis()), recommendedItems); assertEquals(expectedRecommendation, loadedRecommendation); } @Test public void getRecommendationIterator() { Iterator<RecommendationVO<Integer, Integer>> recommendations = null; try { recommendations = recommendationDAO.getRecommendationIterator(5000); } catch (Exception e) { fail("caught exception: " + e); } assertTrue(recommendations != null); List<RecommendationVO<Integer, Integer>> recommendationsList = iteratorToList( recommendations); assertEquals(5, recommendationsList.size()); assertEquals(2, recommendationsList.get(0).getRecommendedItems().size()); assertEquals(2, recommendationsList.get(1).getRecommendedItems().size()); assertEquals(1, recommendationsList.get(2).getRecommendedItems().size()); assertEquals(3, recommendationsList.get(3).getRecommendedItems().size()); assertEquals(2, recommendationsList.get(4).getRecommendedItems().size()); // HINT: hardcoded check if list equals expected list (Mantis Issue: #721) } @Test public void getRecommendationIteratorConstraintsFrom() { Iterator<RecommendationVO<Integer, Integer>> recommendations = null; try { recommendations = recommendationDAO.getRecommendationIterator(5000, new TimeConstraintVO(new Date(new GregorianCalendar(2007, 3, 15, 12, 15).getTimeInMillis()), null)); } catch (Exception e) { fail("caught exception: " + e); } assertTrue(recommendations != null); List<RecommendationVO<Integer, Integer>> recommendationsList = iteratorToList( recommendations); assertEquals(3, recommendationsList.size()); assertEquals(1, recommendationsList.get(0).getRecommendedItems().size()); assertEquals(3, recommendationsList.get(1).getRecommendedItems().size()); assertEquals(2, recommendationsList.get(2).getRecommendedItems().size()); // HINT: hardcoded check if list equals expected list (Mantis Issue: #721) } @Test public void getRecommendationIteratorConstraintsTo() { Iterator<RecommendationVO<Integer, Integer>> recommendations = null; try { recommendations = recommendationDAO.getRecommendationIterator(5000, new TimeConstraintVO(null, new Date(new GregorianCalendar(2007, 3, 15, 12, 14).getTimeInMillis()))); } catch (Exception e) { fail("caught exception: " + e); } assertTrue(recommendations != null); List<RecommendationVO<Integer, Integer>> recommendationsList = iteratorToList( recommendations); assertEquals(2, recommendationsList.size()); assertEquals(2, recommendationsList.get(0).getRecommendedItems().size()); assertEquals(2, recommendationsList.get(1).getRecommendedItems().size()); // HINT: hardcoded check if list equals expected list (Mantis Issue: #721) } @Test public void getRecommendationIteratorConstraintsBoth() { Iterator<RecommendationVO<Integer, Integer>> recommendations = null; try { recommendations = recommendationDAO.getRecommendationIterator(5000, new TimeConstraintVO(new Date(new GregorianCalendar(2007, 3, 15, 12, 12).getTimeInMillis()), new Date(new GregorianCalendar(2007, 3, 15, 12, 17).getTimeInMillis()))); } catch (Exception e) { fail("caught exception: " + e); } assertTrue(recommendations != null); List<RecommendationVO<Integer, Integer>> recommendationsList = iteratorToList( recommendations); assertEquals(3, recommendationsList.size()); assertEquals(2, recommendationsList.get(0).getRecommendedItems().size()); assertEquals(1, recommendationsList.get(1).getRecommendedItems().size()); assertEquals(3, recommendationsList.get(2).getRecommendedItems().size()); // HINT: hardcoded check if list equals expected list (Mantis Issue: #721) } // private methods private List<RecommendationVO<Integer, Integer>> iteratorToList( Iterator<RecommendationVO<Integer, Integer>> recommendations) { List<RecommendationVO<Integer, Integer>> recommendationsList = new ArrayList<RecommendationVO<Integer, Integer>>(); while (recommendations.hasNext()) { recommendationsList.add(recommendations.next()); } return recommendationsList; } }