package net.sf.gazpachoquest.questionnaire.resolver;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.fest.assertions.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.sf.gazpachoquest.domain.core.Question;
import net.sf.gazpachoquest.domain.core.Questionnaire;
import net.sf.gazpachoquest.domain.core.Section;
import net.sf.gazpachoquest.domain.user.User;
import net.sf.gazpachoquest.questionnaire.support.PageStructure;
import net.sf.gazpachoquest.services.QuestionnaireService;
import net.sf.gazpachoquest.test.dbunit.support.ColumnDetectorXmlDataSetLoader;
import net.sf.gazpachoquest.test.shiro.support.AbstractShiroTest;
import net.sf.gazpachoquest.types.NavigationAction;
import org.apache.shiro.subject.Subject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import com.github.springtestdbunit.DbUnitTestExecutionListener;
import com.github.springtestdbunit.annotation.DatabaseSetup;
import com.github.springtestdbunit.annotation.DatabaseTearDown;
import com.github.springtestdbunit.annotation.DbUnitConfiguration;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/jpa-test-context.xml", "classpath:/datasource-test-context.xml",
"classpath:/services-context.xml", "classpath:/components-context.xml", "classpath:/questionnaire-context.xml" })
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DbUnitTestExecutionListener.class })
@DbUnitConfiguration(dataSetLoader = ColumnDetectorXmlDataSetLoader.class)
public class AllInOneResolverTest extends AbstractShiroTest {
@Autowired
private QuestionnaireService questionnaireService;
@Autowired
@Qualifier("AllInOneResolver")
private PageResolver resolver;
@Test
@DatabaseSetup("QuestionnaireDefinitionNoRandomizationEnabled-dataset.xml")
@DatabaseTearDown("QuestionnaireDefinitionNoRandomizationEnabled-dataset.xml")
public void resolveNextPageNoRandomizationTest() {
Integer questionnaireId = 58;
Questionnaire questionnaire = questionnaireService.findOne(questionnaireId);
PageStructure pageStructure = resolver.resolveNextPage(questionnaire, NavigationAction.ENTERING);
List<Section> sections = pageStructure.getSections();
assertThat(sections).hasSize(3);
Section firstGroup = sections.get(0);
assertThat(firstGroup.getId()).isEqualTo(9);
assertThat(firstGroup.getQuestions()).isEqualTo(
Arrays.asList(Question.with().id(13).build(), Question.with().id(12).build(), Question.with().id(29)
.build()));
Section secondGroup = sections.get(1);
assertThat(secondGroup.getId()).isEqualTo(10);
assertThat(secondGroup.getQuestions()).isEqualTo(
Arrays.asList(Question.with().id(30).build(), Question.with().id(31).build(), Question.with().id(35)
.build()));
Section thirdGroup = sections.get(2);
assertThat(thirdGroup.getId()).isEqualTo(11);
assertThat(thirdGroup.getQuestions()).isEqualTo(
Arrays.asList(Question.with().id(39).build(), Question.with().id(50).build()));
assertQuestionNumberPresent(sections);
}
@Test
@DatabaseSetup("QuestionnaireDefinitionNoRandomizationEnabledGroupByGroupStarted-dataset.xml")
@DatabaseTearDown("QuestionnaireDefinitionNoRandomizationEnabledGroupByGroupStarted-dataset.xml")
public void resolveNextPageNoRandomizationEnabledDirty() {
Integer questionnaireId = 58;
Questionnaire questionnaire = questionnaireService.findOne(questionnaireId);
PageStructure pageStructure = resolver.resolveNextPage(questionnaire, NavigationAction.ENTERING);
List<Section> sections = pageStructure.getSections();
assertThat(sections).hasSize(3);
Section firstGroup = sections.get(0);
assertThat(firstGroup.getId()).isEqualTo(9);
assertThat(firstGroup.getQuestions()).isEqualTo(
Arrays.asList(Question.with().id(13).build(), Question.with().id(12).build(), Question.with().id(29)
.build()));
Section secondGroup = sections.get(1);
assertThat(secondGroup.getId()).isEqualTo(10);
assertThat(secondGroup.getQuestions()).isEqualTo(
Arrays.asList(Question.with().id(30).build(), Question.with().id(31).build(), Question.with().id(35)
.build()));
Section thirdGroup = sections.get(2);
assertThat(thirdGroup.getId()).isEqualTo(11);
assertThat(thirdGroup.getQuestions()).isEqualTo(
Arrays.asList(Question.with().id(39).build(), Question.with().id(50).build()));
assertQuestionNumberPresent(sections);
}
@Test
@DatabaseSetup("QuestionnaireDefinitionNoRandomizationEnabledAllInOneStarted-dataset.xml")
@DatabaseTearDown("QuestionnaireDefinitionNoRandomizationEnabledAllInOneStarted-dataset.xml")
public void resolveNextPageNoRandomizationEnabledStarted() {
Integer questionnaireId = 58;
Questionnaire questionnaire = questionnaireService.findOne(questionnaireId);
PageStructure pageStructure = resolver.resolveNextPage(questionnaire, NavigationAction.ENTERING);
List<Section> sections = pageStructure.getSections();
assertThat(sections).hasSize(3);
Section firstGroup = sections.get(0);
assertThat(firstGroup.getId()).isEqualTo(9);
assertThat(firstGroup.getQuestions()).isEqualTo(
Arrays.asList(Question.with().id(13).build(), Question.with().id(12).build(), Question.with().id(29)
.build()));
Section secondGroup = sections.get(1);
assertThat(secondGroup.getId()).isEqualTo(10);
assertThat(secondGroup.getQuestions()).isEqualTo(
Arrays.asList(Question.with().id(30).build(), Question.with().id(31).build(), Question.with().id(35)
.build()));
Section thirdGroup = sections.get(2);
assertThat(thirdGroup.getId()).isEqualTo(11);
assertThat(thirdGroup.getQuestions()).isEqualTo(
Arrays.asList(Question.with().id(39).build(), Question.with().id(50).build()));
assertQuestionNumberPresent(sections);
}
@Test
@DatabaseSetup("QuestionnaireDefinitionSectionRandomizationEnabled-dataset.xml")
@DatabaseTearDown("QuestionnaireDefinitionSectionRandomizationEnabled-dataset.xml")
public void resolveNextPageGroupsRandomizationTest() {
Integer questionnaireId = 58;
Questionnaire questionnaire = questionnaireService.findOne(questionnaireId);
PageStructure pageStructure = resolver.resolveNextPage(questionnaire, NavigationAction.ENTERING);
List<Section> sections = pageStructure.getSections();
assertThat(sections).hasSize(3);
List<Question> visitedQuestions = new ArrayList<>();
List<Question> allQuestions = getAllQuestions();
Section firstGroup = sections.get(0);
for (Question question : firstGroup.getQuestions()) {
visitedQuestions.add(question);
}
assertThat(allQuestions).containsAll(visitedQuestions);
assertQuestionNumberPresent(sections);
}
@Test
@DatabaseSetup("QuestionnaireDefinitionQuestionRandomizationEnabled-dataset.xml")
@DatabaseTearDown("QuestionnaireDefinitionQuestionRandomizationEnabled-dataset.xml")
public void resolveNextPageQuestionRandomizationStrategyTest() {
Integer questionnaireId = 58;
Questionnaire questionnaire = questionnaireService.findOne(questionnaireId);
PageStructure pageStructure = resolver.resolveNextPage(questionnaire, NavigationAction.ENTERING);
List<Section> sections = pageStructure.getSections();
assertThat(sections).hasSize(1);
List<Question> visitedQuestions = new ArrayList<>();
List<Question> allQuestions = getAllQuestions();
for (Section section : sections) {
for (Question question : section.getQuestions()) {
visitedQuestions.add(question);
}
}
assertThat(allQuestions).containsAll(visitedQuestions);
assertQuestionNumberPresent(sections);
}
private List<Question> getAllQuestions() {
List<Integer> allQuestionsIds = Arrays.asList(13, 12, 29, 30, 31, 35, 39, 50);
List<Question> allQuestions = new ArrayList<>();
for (Integer questionId : allQuestionsIds) {
allQuestions.add(Question.with().id(questionId).build());
}
return allQuestions;
}
@Before
public void setUpSubject() {
Subject subjectUnderTest = createNiceMock(Subject.class);
User support = User.with().id(1).build();
expect(subjectUnderTest.getPrincipal()).andReturn(support).anyTimes();
replay(subjectUnderTest);
// 2. Bind the subject to the current thread:
setSubject(subjectUnderTest);
}
@After
public void tearDownSubject() {
// 3. Unbind the subject from the current thread:
clearSubject();
}
private void assertQuestionNumberPresent(List<Section> sections) {
int questionNumberCounter = 1;
for (Section section : sections) {
List<Question> questions = section.getQuestions();
for (Question question : questions) {
assertThat(question.getNumber()).isEqualTo(questionNumberCounter++);
}
}
}
}