/* vim: set ts=2 et sw=2 cindent fo=qroca: */
package com.globant.katari.gadgetcontainer.domain;
import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.*;
import java.io.File;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.context.ApplicationContext;
import com.globant.katari.gadgetcontainer.SpringTestUtils;
import com.globant.katari.hibernate.coreuser.domain.CoreUser;
import com.globant.katari.shindig.domain.Application;
/** Test for the repository {@link GadgetGroupRepository}
*/
public class GadgetGroupRepositoryTest {
private static final String REPOSITORY
= "gadgetcontainer.gadgetGroupRepository";
private GadgetGroupRepository repository;
private ApplicationContext appContext;
private Session session;
private CoreUser user;
private String url = "file:///" + new File(
"target/test-classes/SampleGadget.xml").getAbsolutePath();
@Before
public void setUp() throws Exception {
appContext = SpringTestUtils.getContext();
repository = (GadgetGroupRepository) appContext.getBean(REPOSITORY);
user = new SampleUser("me");
session = ((SessionFactory) appContext.getBean("katari.sessionFactory"))
.openSession();
session.createQuery("delete from GadgetInstance").executeUpdate();
session.createQuery("delete from GadgetGroup").executeUpdate();
session.createQuery("delete from CoreUser").executeUpdate();
session.saveOrUpdate(user);
user = (CoreUser) session.createQuery("from CoreUser").uniqueResult();
}
@After
public void tearDown() {
session.close();
}
@Test
public void testFindGadgetGroup() {
createGadgetGroups(url);
GadgetGroup group = repository.findGadgetGroup(user.getId(), "for me");
assertThat(group, notNullValue());
assertThat(group.getName(), is("for me"));
assertThat(group.getGadgets().isEmpty(), is(false));
assertThat(group.getGadgets().iterator().next().getUrl(), is(url));
}
@Test
public void testFindGadgetGroup_forEverybody() {
createGadgetGroups(url);
GadgetGroup group;
group = repository.findGadgetGroup(Long.MAX_VALUE, "for everybody");
assertThat(group, notNullValue());
assertThat(group.getName(), is("for everybody"));
assertThat(group.getGadgets().isEmpty(), is(false));
assertThat(group.getGadgets().iterator().next().getUrl(), is(url));
}
@Test
public void testFindGadgetGroup_nonExisting() {
GadgetGroup group = repository.findGadgetGroup(user.getId(), "nonExist");
assertThat(group, nullValue());
}
@Test
public void testFindGadgetGroupTemplate() {
createGadgetGroups(url);
GadgetGroup group = repository.findGadgetGroupTemplate("for user");
assertThat(group, notNullValue());
assertThat(group.getGadgets().isEmpty(), is(false));
assertThat(group.getName(), is("for user"));
assertThat(group.getGadgets().iterator().next().getUrl(), is(url));
}
@Test
public void testRemoveGroupsFromUser() {
createGadgetGroups(url);
repository.removeGroupsFromUser(user.getId());
GadgetGroup group = repository.findGadgetGroup(user.getId(), "for me");
assertThat(group, is(nullValue()));
}
@Test
public void testRemoveGroupsFromUser_noGroups() {
// This simply tests that removeGroupsFromUser does not throw an exception.
repository.removeGroupsFromUser(user.getId());
}
/** Creates one gadget group for the user (named 'for me'), and another for
* everybody (named 'for everybody') and a gadget group template (named 'for
* user').
*/
@SuppressWarnings("unchecked")
private void createGadgetGroups(final String gadgetUrl) {
CustomizableGadgetGroup group;
group = new CustomizableGadgetGroup(user, "for me", "default", 2);
Application app = new Application(gadgetUrl);
// Test friendly hack: never use the repository like this.
repository.getHibernateTemplate().saveOrUpdate(app);
group.add(new GadgetInstance(app, 1, 2));
repository.save(group);
SharedGadgetGroup shared;
shared = new SharedGadgetGroup("for everybody", "default", 2);
((Set<GadgetInstance>) new DirectFieldAccessor(shared)
.getPropertyValue("gadgets")).add(new GadgetInstance(app, 1, 2));
repository.save(shared);
GadgetGroupTemplate templ;
templ = new GadgetGroupTemplate("for user", "default", 2);
((Set<GadgetInstance>) new DirectFieldAccessor(templ)
.getPropertyValue("gadgets")).add(new GadgetInstance(app, 1, 2));
repository.save(templ);
}
}