package net.sf.gazpachoquest.questionnaire.support;
import static org.fest.assertions.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.sf.gazpachoquest.domain.core.Questionnaire;
import net.sf.gazpachoquest.dto.QuestionDTO;
import net.sf.gazpachoquest.dto.answers.MultipleAnswer;
import net.sf.gazpachoquest.dto.answers.NoAnswer;
import net.sf.gazpachoquest.dto.answers.TextAnswer;
import net.sf.gazpachoquest.facades.QuestionnaireDefinitionAccessorFacade;
import net.sf.gazpachoquest.repository.dynamic.QuestionnaireAnswersRepository;
import net.sf.gazpachoquest.services.QuestionnaireAnswersService;
import net.sf.gazpachoquest.test.dbunit.support.ColumnDetectorXmlDataSetLoader;
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.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.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("AnswersPopulatorTest-dataset.xml")
@DatabaseTearDown("AnswersPopulatorTest-dataset.xml")
@DbUnitConfiguration(dataSetLoader = ColumnDetectorXmlDataSetLoader.class)
public class AnswersPopulatorTest {
@Autowired
private AnswersPopulator answersPopulator;
@Autowired
private QuestionnaireAnswersRepository repository;
@Autowired
private QuestionnaireAnswersService questionnaireAnswersService;
@Autowired
private QuestionnaireDefinitionAccessorFacade questionnaireDefinitionAccessorFacade;
@Autowired
private JdbcTemplate jdbcTemplate;
@Before
public void setUp() {
repository.activeAllAnswers();
jdbcTemplate.update("INSERT INTO questionnaire_answers_7 (id) values(?)", 5);
}
@Test
public void populateTest() {
Integer questionnaireId = 71;
Questionnaire questionnaire = Questionnaire.with().id(questionnaireId).build();
String answer = "Antonio Maria";
String questionCode = "Q1";
questionnaireAnswersService.save(questionnaire, questionCode, answer);
QuestionDTO firstQuestion = questionnaireDefinitionAccessorFacade.findOneQuestion(12);
QuestionDTO secondQuestion = questionnaireDefinitionAccessorFacade.findOneQuestion(13);
QuestionDTO lastQuestion = questionnaireDefinitionAccessorFacade.findOneQuestion(50);
List<QuestionDTO> questions = new ArrayList<>();
questions.add(firstQuestion);
questions.add(secondQuestion);
questions.add(lastQuestion);
Map<String, Object> answers = questionnaireAnswersService.findByQuestionnaire(questionnaire);
answersPopulator.populate(answers, questions);
assertThat(firstQuestion.getAnswer()).isExactlyInstanceOf(TextAnswer.class);
assertThat(((TextAnswer) firstQuestion.getAnswer()).getValue()).isEqualTo("Antonio Maria");
assertThat(secondQuestion.getAnswer()).isExactlyInstanceOf(NoAnswer.class);
assertThat(lastQuestion.getAnswer()).isExactlyInstanceOf(MultipleAnswer.class);
}
@After
public void tearDown() {
jdbcTemplate.update("delete from questionnaire_answers_7");
}
}