package net.sf.gazpachoquest.facades; 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 net.sf.gazpachoquest.domain.core.Questionnaire; import net.sf.gazpachoquest.domain.user.User; import net.sf.gazpachoquest.dto.QuestionDTO; import net.sf.gazpachoquest.dto.QuestionnaireDTO; import net.sf.gazpachoquest.dto.QuestionnaireDefinitionDTO; import net.sf.gazpachoquest.dto.QuestionnairePageDTO; import net.sf.gazpachoquest.dto.answers.Answer; import net.sf.gazpachoquest.dto.answers.BooleanAnswer; import net.sf.gazpachoquest.dto.answers.LongTextAnswer; import net.sf.gazpachoquest.dto.answers.NumericAnswer; import net.sf.gazpachoquest.dto.answers.TextAnswer; import net.sf.gazpachoquest.repository.dynamic.QuestionnaireAnswersRepository; import net.sf.gazpachoquest.services.QuestionnaireAnswersService; import net.sf.gazpachoquest.test.dbunit.support.ColumnDetectorXmlDataSetLoader; import net.sf.gazpachoquest.test.shiro.support.AbstractShiroTest; import net.sf.gazpachoquest.types.Language; import net.sf.gazpachoquest.types.NavigationAction; import net.sf.gazpachoquest.types.RenderingMode; import org.apache.shiro.subject.Subject; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; 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.DatabaseOperation; 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", "classpath:/facades-context.xml" }) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DbUnitTestExecutionListener.class }) @DatabaseSetup(value = "QuestionnaireFacade-dataset.xml") @DatabaseTearDown("QuestionnaireFacade-dataset.xml") @DbUnitConfiguration(dataSetLoader = ColumnDetectorXmlDataSetLoader.class) public class QuestionnaireFacadeTest extends AbstractShiroTest { @Autowired private QuestionnaireFacade questionnaireFacade; @Autowired private QuestionnaireAnswersRepository repository; @Autowired private QuestionnaireAnswersService questionnaireAnswersService; @Autowired private JdbcTemplate jdbcTemplate; @Before public void setUp() { repository.activeAllAnswers(); jdbcTemplate.update("INSERT INTO questionnaire_answers_7 (id) values(?)", 5); jdbcTemplate.update("INSERT INTO questionnaire_answers_7 (id) values(?)", 10); } @Test public void getDefinitionTest() { Integer questionnaireId = 70; QuestionnaireDefinitionDTO questionnaireDefinitionDTO = questionnaireFacade.getDefinition(questionnaireId); assertThat(questionnaireDefinitionDTO).isNotNull(); } @Test public void resolvePageTest() { Integer questionnaireId = 70; QuestionnairePageDTO page = questionnaireFacade.resolvePage(questionnaireId, RenderingMode.SECTION_BY_SECTION, Language.EN, NavigationAction.ENTERING); assertThat(page.getQuestions()).containsSequence(QuestionDTO.with().id(12).build(), QuestionDTO.with().id(13).build(), QuestionDTO.with().id(29).build()); page = questionnaireFacade.resolvePage(questionnaireId, RenderingMode.SECTION_BY_SECTION, Language.EN, NavigationAction.NEXT); assertThat(page.getQuestions()).containsSequence(QuestionDTO.with().id(30).build(), QuestionDTO.with().id(31).build(), QuestionDTO.with().id(35).build()); page = questionnaireFacade.resolvePage(questionnaireId, RenderingMode.SECTION_BY_SECTION, Language.EN, NavigationAction.PREVIOUS); assertThat(page.getQuestions()).containsSequence(QuestionDTO.with().id(12).build(), QuestionDTO.with().id(13).build(), QuestionDTO.with().id(29).build()); } @Test @Ignore public void resolveFirstPageTest() { Questionnaire questionnaire = Questionnaire.with().id(70).build(); String answer = "Antonio Maria"; String questionCode = "Q1"; questionnaireAnswersService.save(questionnaire, questionCode, answer); QuestionnairePageDTO page = questionnaireFacade.resolvePage(questionnaire.getId(), RenderingMode.QUESTION_BY_QUESTION, Language.EN, NavigationAction.ENTERING); assertThat(page.getQuestions()).isNotEmpty(); QuestionDTO questionDTO = page.getQuestions().get(0); assertThat(questionDTO.getId()).isEqualTo(12); assertThat(questionDTO.getAnswer()).isExactlyInstanceOf(TextAnswer.class); assertThat(((TextAnswer) questionDTO.getAnswer()).getValue()).isEqualTo("Antonio Maria"); } @Test public void saveAnswerTest() { Questionnaire questionnaire = Questionnaire.with().id(75).build(); String questionCode = "Q1"; Answer answer = TextAnswer.fromValue("Antonio Maria"); Integer questionDefinitionId = jdbcTemplate.queryForObject( "select questionnairedefinition_id from questionnaire where id = ?", Integer.class, questionnaire.getId()); questionnaireFacade.saveAnswer(questionnaire.getId(), questionCode, answer); Integer answersId = jdbcTemplate.queryForObject("select answers_id from questionnaire where id = ?", Integer.class, questionnaire.getId()); assertThat(answersId).isNotNull(); Object value = jdbcTemplate.queryForObject("select " + questionCode.toLowerCase() + " from questionnaire_answers_" + questionDefinitionId + " where id = ?", new Object[] { answersId }, String.class); assertThat(value).isEqualTo(answer.getValue()); questionCode = "Q2"; answer = TextAnswer.fromValue("O5"); questionnaireFacade.saveAnswer(questionnaire.getId(), questionCode, answer); value = jdbcTemplate.queryForObject("select " + questionCode.toLowerCase() + " from questionnaire_answers_" + questionDefinitionId + " where id = ?", new Object[] { answersId }, String.class); assertThat(value).isEqualTo(answer.getValue()); questionCode = "Q3"; answer = NumericAnswer.fromValue(33); questionnaireFacade.saveAnswer(questionnaire.getId(), questionCode, answer); value = jdbcTemplate.queryForObject("select " + questionCode.toLowerCase() + " from questionnaire_answers_" + questionDefinitionId + " where id = ?", Integer.class, answersId); assertThat(value).isEqualTo(answer.getValue()); questionCode = "Q4"; answer = LongTextAnswer.fromValue("I started to work in IECISA, 10 years ago"); questionnaireFacade.saveAnswer(questionnaire.getId(), questionCode, answer); questionCode = "Q5"; answer = TextAnswer.fromValue("O2"); questionnaireFacade.saveAnswer(questionnaire.getId(), questionCode, answer); value = jdbcTemplate.queryForObject("select " + questionCode.toLowerCase() + " from questionnaire_answers_" + questionDefinitionId + " where id = ?", new Object[] { answersId }, String.class); assertThat(value).isEqualTo(answer.getValue()); questionCode = "Q6"; answer = TextAnswer.fromValue("O2"); questionnaireFacade.saveAnswer(questionnaire.getId(), questionCode, answer); value = jdbcTemplate.queryForObject("select " + questionCode.toLowerCase() + " from questionnaire_answers_" + questionDefinitionId + " where id = ?", new Object[] { answersId }, String.class); assertThat(value).isEqualTo(answer.getValue()); questionCode = "Q7_1"; answer = TextAnswer.fromValue("O1"); questionnaireFacade.saveAnswer(questionnaire.getId(), questionCode, answer); value = jdbcTemplate.queryForObject("select " + questionCode.toLowerCase() + " from questionnaire_answers_" + questionDefinitionId + " where id = ?", new Object[] { answersId }, String.class); assertThat(value).isEqualTo(answer.getValue()); questionCode = "Q7_2"; answer = TextAnswer.fromValue("O1"); questionnaireFacade.saveAnswer(questionnaire.getId(), questionCode, answer); // Checkbox list questionCode = "Q8"; answer = BooleanAnswer.valueOf("O1", Boolean.TRUE); questionnaireFacade.saveAnswer(questionnaire.getId(), questionCode, answer); questionCode = "Q8"; String questionOption = "O2"; answer = BooleanAnswer.valueOf(questionOption, Boolean.TRUE); questionnaireFacade.saveAnswer(questionnaire.getId(), questionCode, answer); value = jdbcTemplate.queryForObject("select " + questionCode.toLowerCase() + "_" + questionOption + " from questionnaire_answers_" + questionDefinitionId + " where id = ?", new Object[] { answersId }, Boolean.class); assertThat(value).isEqualTo(answer.getValue()); } @After public void tearDown() { jdbcTemplate.update("delete from questionnaire_answers_7"); } @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(); } }