/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you 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 the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>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.apereo.portal.portlet.dao.jpa; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import java.util.List; import java.util.Random; import java.util.Set; import java.util.concurrent.Callable; import org.apereo.portal.persondir.ILocalAccountDao; import org.apereo.portal.persondir.ILocalAccountPerson; import org.apereo.portal.portlet.dao.IMarketplaceRatingDao; import org.apereo.portal.portlet.dao.IPortletDefinitionDao; import org.apereo.portal.portlet.dao.IPortletTypeDao; import org.apereo.portal.portlet.marketplace.IMarketplaceRating; import org.apereo.portal.portlet.om.IPortletDefinition; import org.apereo.portal.portlet.om.IPortletType; import org.apereo.portal.test.BasePortalJpaDaoTest; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.ComponentScan; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:jpaPortalTestApplicationContext.xml") @ComponentScan("org.apereo.portal.portlet.marketplace") public class JpaMarketplaceRatingDaoTest extends BasePortalJpaDaoTest { @Autowired private IPortletDefinitionDao portletDefinitionDao; @Autowired private IMarketplaceRatingDao marketplaceRatingDao; @Autowired private ILocalAccountDao localAccountDao; @Autowired private IPortletTypeDao jpaChannelTypeDao; private final Random random = new Random(); @Before public void setup() { List<ILocalAccountPerson> personList = localAccountDao.getAllAccounts(); //Just a quick assertion that this is utilizing the correct db assertEquals(personList.size(), 0); /* * Let's make two users (user1, user2) * We want to make sure that this finishes before moving on * This assumes that localAccountDao is correct and we * won't retest that code here, but rather in * @link org.apereo.portal.persondir.dao.jpa.JpaLocalAccountDaoImplTest */ this.execute( new Callable<Object>() { @Override public Object call() throws Exception { final ILocalAccountPerson user1 = localAccountDao.createPerson("user1"); ; localAccountDao.updateAccount(user1); final ILocalAccountPerson user2 = localAccountDao.createPerson("user2"); localAccountDao.updateAccount(user2); return null; } }); /* * Let's make up some portlets * This assumes the portletDefinitionDao works * won't retest that code here but rather in * @link org.apereo.portal.portlet.dao.jpa.JpaPortletDaoTest * */ this.execute( new Callable<Object>() { @Override public Object call() throws Exception { List<IPortletDefinition> portletList = portletDefinitionDao.getPortletDefinitions(); //Just a quick assertion that this is utilizing the correct db assertEquals(portletList.size(), 0); //Create portletType final IPortletType channelType = jpaChannelTypeDao.createPortletType("BaseType", "foobar"); //Create a definition final IPortletDefinition portletDef1 = new PortletDefinitionImpl( channelType, "fname1", "Test Portlet 1", "Test Portlet 1 Title", "/context1", "portletName1", false); portletDefinitionDao.savePortletDefinition(portletDef1); //Create a second definition with the same app/portlet final IPortletDefinition portletDef2 = new PortletDefinitionImpl( channelType, "fname2", "Test Portlet 2", "Test Portlet 2 Title", "/uPortal", "portletName2", true); portletDefinitionDao.savePortletDefinition(portletDef2); return null; } }); } @Test public void testCreateAndRetrieveRating() { //Easy Test Can we make every combination of portlet and user rating this.execute( new Callable<Object>() { @Override public Object call() throws Exception { List<IPortletDefinition> portletList = portletDefinitionDao.getPortletDefinitions(); List<ILocalAccountPerson> personList = localAccountDao.getAllAccounts(); assertNotEquals(portletList.size(), 0); assertNotEquals(personList.size(), 0); for (IPortletDefinition portlet : portletList) { for (ILocalAccountPerson person : personList) { MarketplaceRatingImpl rating = new MarketplaceRatingImpl(); int starRating = random.nextInt(MarketplaceRatingImpl.MAX_RATING) + 1; rating.setRating(starRating); MarketplaceRatingPK ratingPK = new MarketplaceRatingPK(); ratingPK.setPortletDefinition((PortletDefinitionImpl) portlet); ratingPK.setUserName(person.getName()); rating.setMarketplaceRatingPK(ratingPK); marketplaceRatingDao.createOrUpdateRating(rating); } } return null; } }); //Now let's retrieve our objects and delete them this.execute( new Callable<Object>() { @Override public Object call() throws Exception { Set<IMarketplaceRating> ratingList = marketplaceRatingDao.getAllRatings(); assertNotEquals(ratingList.size(), 0); for (IMarketplaceRating rating : ratingList) { marketplaceRatingDao.deleteRating(rating); } assertEquals(marketplaceRatingDao.getAllRatings().size(), 0); return null; } }); } @Test public void testUpdateRatings() { //Let's create some ratings this.execute( new Callable<Object>() { @Override public Object call() throws Exception { List<IPortletDefinition> portletList = portletDefinitionDao.getPortletDefinitions(); List<ILocalAccountPerson> personList = localAccountDao.getAllAccounts(); assertNotEquals(portletList.size(), 0); assertNotEquals(personList.size(), 0); for (IPortletDefinition portlet : portletList) { for (ILocalAccountPerson person : personList) { MarketplaceRatingImpl rating = new MarketplaceRatingImpl(); int starRating = random.nextInt(MarketplaceRatingImpl.MAX_RATING) + 1; rating.setRating(starRating); MarketplaceRatingPK ratingPK = new MarketplaceRatingPK(); ratingPK.setPortletDefinition((PortletDefinitionImpl) portlet); ratingPK.setUserName(person.getName()); rating.setMarketplaceRatingPK(ratingPK); marketplaceRatingDao.createOrUpdateRating(rating); } } return null; } }); //Now let's update with random numbers this.execute( new Callable<Object>() { @Override public Object call() throws Exception { List<IPortletDefinition> portletList = portletDefinitionDao.getPortletDefinitions(); List<ILocalAccountPerson> personList = localAccountDao.getAllAccounts(); assertNotEquals(portletList.size(), 0); assertNotEquals(personList.size(), 0); for (IPortletDefinition portlet : portletList) { for (ILocalAccountPerson person : personList) { MarketplaceRatingImpl rating = new MarketplaceRatingImpl(); int starRating = random.nextInt(MarketplaceRatingImpl.MAX_RATING) + 1; rating.setRating(starRating); org.apereo.portal.portlet.dao.jpa.MarketplaceRatingPK ratingPK = new MarketplaceRatingPK(); ratingPK.setPortletDefinition((PortletDefinitionImpl) portlet); ratingPK.setUserName(person.getName()); rating.setMarketplaceRatingPK(ratingPK); marketplaceRatingDao.createOrUpdateRating(rating); } } return null; } }); //Now let's retrieve our objects and delete them this.execute( new Callable<Object>() { @Override public Object call() throws Exception { Set<IMarketplaceRating> ratingList = marketplaceRatingDao.getAllRatings(); assertNotEquals(ratingList.size(), 0); for (IMarketplaceRating rating : ratingList) { marketplaceRatingDao.deleteRating(rating); } assertEquals(marketplaceRatingDao.getAllRatings().size(), 0); return null; } }); } @Test public void testAggregatingRatings() { this.execute( new Callable<Object>() { @Override public Object call() throws Exception { //first create some ratings List<IPortletDefinition> portletList = portletDefinitionDao.getPortletDefinitions(); List<ILocalAccountPerson> personList = localAccountDao.getAllAccounts(); assertNotEquals(portletList.size(), 0); assertNotEquals(personList.size(), 0); for (IPortletDefinition portlet : portletList) { for (ILocalAccountPerson person : personList) { MarketplaceRatingImpl rating = new MarketplaceRatingImpl(); int starRating = random.nextInt(MarketplaceRatingImpl.MAX_RATING) + 1; rating.setRating(starRating); MarketplaceRatingPK ratingPK = new MarketplaceRatingPK(); ratingPK.setPortletDefinition((PortletDefinitionImpl) portlet); ratingPK.setUserName(person.getName()); rating.setMarketplaceRatingPK(ratingPK); marketplaceRatingDao.createOrUpdateRating(rating); } } //now aggregate them marketplaceRatingDao.aggregateMarketplaceRating(); //now verified the portlet definitions are up-to-date with aggregated data List<IPortletDefinition> updatedPortletList = portletDefinitionDao.getPortletDefinitions(); for (IPortletDefinition def : updatedPortletList) { assertNotNull(def.getRating()); assertNotNull(def.getUsersRated()); } return null; } }); } }