package no.dusken.aranea.service;
import no.dusken.aranea.model.*;
import no.dusken.common.service.GenericService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import java.util.List;
import static junit.framework.Assert.*;
/**
* @author Marvin B. Lillehaug <lillehau@underdusken.no>
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/META-INF/integrationTest.xml"})
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
@Transactional
public class TestPageServiceImpl {
@Autowired
private PageService pageService;
@Autowired
private SectionService sectionService;
@Autowired
private PersonService personService;
@Autowired
private GenericService<PageImage> pageImageService;
@Autowired
private ImageService imageService;
@Autowired
private GenericService<SectionPage> sectionPageService;
private Section s;
@Before
public void onSetup(){
List<Page> ps = pageService.getNotPublishedPages(0, 5);
List<Image> imgs = imageService.getImages();
List<Section> secs = sectionService.getSections(true);
assertEquals("Database not empty", 0, ps.size());
assertEquals("Database not empty", 0, imgs.size());
assertEquals("Database not empty", 0, secs.size());
Person person = new Person();
person.setFirstname("f");
person.setSurname("sur");
person.setUsername("uwwwd1");
person = personService.saveOrUpdate(person);
assertNotNull(person);
s = new Section();
s.setName("Section");
s = sectionService.saveOrUpdate(s);
Section sub = new Section();
sub.setParent(s);
sub.setName("Subsection");
sub.setUrl("sub");
sub = sectionService.saveOrUpdate(sub);
Page p1 = new ExtendedPage();
p1.setTitle("tittel1");
p1.setPublished(true);
p1.setSummary("ingress");
p1.setParent(s);
p1.setVisibleFrom(new GregorianCalendar(1900, 1, 1));
p1.setVisibleTo(new GregorianCalendar(3900, 1, 1));
p1.getAuthors().add(person);
Page p = pageService.saveOrUpdate(p1);
assertNotNull(p);
Page p2 = new ExtendedPage();
p2.setTitle("tittel2");
p2.setPublished(true);
p2.setSummary("ingress");
p2.setParent(s);
p2.setVisibleFrom(new GregorianCalendar(1900, 1, 1));
p2.setVisibleTo(new GregorianCalendar(3900, 1, 1));
p = pageService.saveOrUpdate(p1);
assertNotNull(p);
Page p3 = new ExtendedPage();
p3.setTitle("tittel3");
p3.setPublished(true);
p3.setSummary("ingress");
p3.setParent(sub);
p3.setVisibleFrom(new GregorianCalendar(1900, 1, 1));
p3.setVisibleTo(new GregorianCalendar(3900, 1, 1));
p = pageService.saveOrUpdate(p1);
assertNotNull(p);
Page p4 = new ExtendedPage();
p4.setTitle("tittel4");
p4.setPublished(false);
p4.setSummary("ingress");
p4.setParent(s);
p4.getAuthors().add(person);
p4.setVisibleFrom(new GregorianCalendar(1900, 1, 1));
p4.setVisibleTo(new GregorianCalendar(3900, 1, 1));
p = pageService.saveOrUpdate(p1);
assertNotNull(p);
Page p5 = new ExtendedPage();
p5.setTitle("tittel5");
p5.setPublished(false);
p5.setSummary("ingress");
p5.setParent(sub);
p5.setVisibleFrom(new GregorianCalendar(1900, 1, 1));
p5.setVisibleTo(new GregorianCalendar(3900, 1, 1));
p = pageService.saveOrUpdate(p1);
assertNotNull(p);
SectionPage sp1 = new SectionPage(s, p1, 1, "");
SectionPage sp2 = new SectionPage(s, p2, 2, "");
SectionPage sp3 = new SectionPage(s, p4, 3, "");
List<SectionPage> pages = new LinkedList<SectionPage>();
pages.add(sp1);
pages.add(sp2);
pages.add(sp3);
s.setPages(pages);
sectionService.saveOrUpdate(s);
Section k = sectionService.getEntity(s.getID());
assertEquals("Wrong number of pages", 3, k.getPages().size());
SectionPage subp1 = new SectionPage(sub, p3, 1, "");
SectionPage subp2 = new SectionPage(sub, p5, 2, "");
List<SectionPage> subpages = new LinkedList<SectionPage>();
subpages.add(subp1);
subpages.add(subp2);
sub.setPages(subpages);
sectionService.saveOrUpdate(sub);
Section l = sectionService.getEntity(sub.getID());
assertEquals("Wrong number of pages", 2, l.getPages().size());
}
/**
* Test that all published pages in the section is returned in the order
* specified by their association to section.
*/
@Test
public void testgetSectionPagePublished(){
List<Page> pages = pageService.getSectionPagePublished(5, s);
assertEquals("Wrong number of pages returned", 2, pages.size());
assertEquals("Wrong page as number one", "tittel1", pages.get(0).getTitle());
assertEquals("Wrong page as number two", "tittel2", pages.get(1).getTitle());
}
@Test
public void testGetSectionPageAfterVisibleInterval(){
List<Page> pages = pageService.getSectionPagePublished(5, s);
assertEquals("Wrong number of pages returned", 2, pages.size());
for(Page p : pages){
p.setVisibleFrom(new GregorianCalendar(1900, 1, 1));
p.setVisibleTo(new GregorianCalendar(2000, 1, 1));
pageService.saveOrUpdate(p);
}
pages = pageService.getSectionPagePublished(5, s);
assertEquals("Wrong number of pages returned", 0, pages.size());
}
@Test
public void testGetSectionPageBeforeVisibleInterval(){
List<Page> pages = pageService.getSectionPagePublished(5, s);
assertEquals("Wrong number of pages returned", 2, pages.size());
for(Page p : pages){
p.setVisibleFrom(new GregorianCalendar(2900, 1, 1));
p.setVisibleTo(new GregorianCalendar(3000, 1, 1));
pageService.saveOrUpdate(p);
}
pages = pageService.getSectionPagePublished(5, s);
assertEquals("Wrong number of pages returned", 0, pages.size());
}
@Test
public void testPageAssociatedInParentsParent(){
List<Page> pages = pageService.getSectionPagePublished(5, s);
assertEquals("Wrong number of pages returned", 2, pages.size());
Section sub = sectionService.getSectionByUrl("sub", s);
for(SectionPage sp : sub.getPages()){
s.getPages().add(new SectionPage(s, sp.getPage(), s.getPages().size(), ""));
}
s = sectionService.saveOrUpdate(s);
pages = pageService.getSectionPagePublished(5, s);
assertEquals("Wrong number of pages returned", 3, pages.size());
}
@Test
public void testgetPhotographers(){
Person p1 = new Person();
p1.setFirstname("f");
p1.setSurname("sur");
p1.setUsername("u1");
p1 = personService.saveOrUpdate(p1);
Image i1 = new Image();
i1.setPhotographer(p1);
i1.setIllustration(false);
i1.setHash("ha");
i1 = imageService.saveOrUpdate(i1);
Person p2 = new Person();
p2.setFirstname("f");
p2.setSurname("sur");
p2.setUsername("u2");
p2 = personService.saveOrUpdate(p2);
Image i2 = new Image();
i2.setPhotographer(p2);
i2.setIllustration(true);
i2.setHash("hu");
i2 = imageService.saveOrUpdate(i2);
Page p = new ExtendedPage();
p.setTitle("fvff");
p.setSummary("ffdf");
p.setParent(s);
p = pageService.saveOrUpdate(p);
PageImage pi1 = new PageImage();
pi1.setImage(i1);
pi1.setPage(p);
pi1 = pageImageService.saveOrUpdate(pi1);
PageImage pi2 = new PageImage();
pi2.setImage(i2);
pi2.setPage(p);
pi2 = pageImageService.saveOrUpdate(pi2);
Page dp = pageService.getEntity(p.getID());
List<Person> photographers = pageService.getPhotographers(p);
assertEquals("Should contain 1 person", 1, photographers.size());
assertTrue("Should contain p1", photographers.contains(p1));
}
@Test
public void testgetdrawers(){
Person p1 = new Person();
p1.setFirstname("f");
p1.setSurname("sur");
p1.setUsername("u1");
p1 = personService.saveOrUpdate(p1);
Image i1 = new Image();
i1.setPhotographer(p1);
i1.setIllustration(false);
i1.setHash("ha");
i1 = imageService.saveOrUpdate(i1);
Person p2 = new Person();
p2.setFirstname("f");
p2.setSurname("sur");
p2.setUsername("u2");
p2 = personService.saveOrUpdate(p2);
Image i2 = new Image();
i2.setPhotographer(p2);
i2.setIllustration(true);
i2.setHash("hu");
i2 = imageService.saveOrUpdate(i2);
Page p = new ExtendedPage();
p.setTitle("fvff");
p.setSummary("ffdf");
p.setParent(s);
p = pageService.saveOrUpdate(p);
PageImage pi1 = new PageImage();
pi1.setImage(i1);
pi1.setPage(p);
pi1 = pageImageService.saveOrUpdate(pi1);
PageImage pi2 = new PageImage();
pi2.setImage(i2);
pi2.setPage(p);
pi2 = pageImageService.saveOrUpdate(pi2);
List<Person> photographers = pageService.getDrawers(p);
assertEquals("Should contain 1 person", 1, photographers.size());
assertTrue("Should contain p2", photographers.contains(p2));
}
@Test
public void testgetNotPublishedPages(){
List<Page> pages = pageService.getNotPublishedPages(0, 5);
assertEquals("Wrong number of pages", 2, pages.size());
}
@Test
public void testPageWithAuthorsAreDeleted(){
for(Page page : pageService.getPages(0, 5)){
boolean remove = pageService.remove(page);
assertTrue("Remove was not successful", remove);
}
}
}