package net.sf.gazpachoquest.rest.resources.runtime;
import static org.fest.assertions.api.Assertions.assertThat;
import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import net.sf.gazpachoquest.domain.core.Questionnair;
import net.sf.gazpachoquest.dto.PageDTO;
import net.sf.gazpachoquest.dto.QuestionDTO;
import net.sf.gazpachoquest.dto.QuestionnairDTO;
import net.sf.gazpachoquest.dto.answers.TextAnswer;
import net.sf.gazpachoquest.repository.dynamic.QuestionnairAnswersRepository;
import net.sf.gazpachoquest.rest.ApplicationConfig;
import net.sf.gazpachoquest.rest.feature.Jackson2Feature;
import net.sf.gazpachoquest.services.QuestionnairAnswersService;
import net.sf.gazpachoquest.test.dbunit.support.ColumnDetectorXmlDataSetLoader;
import net.sf.gazpachoquest.types.BrowsingAction;
import net.sf.gazpachoquest.types.RenderingMode;
import org.apache.commons.lang3.ArrayUtils;
import org.glassfish.grizzly.http.util.HttpStatus;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.filter.HttpBasicAuthFilter;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.test.TestProperties;
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.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
import com.github.springtestdbunit.DbUnitTestExecutionListener;
import com.github.springtestdbunit.annotation.DatabaseSetup;
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:/questionnair-context.xml" })
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class, DbUnitTestExecutionListener.class })
@DatabaseSetup("QuestionnairResource-dataset.xml")
@DbUnitConfiguration(dataSetLoader = ColumnDetectorXmlDataSetLoader.class)
public class QuestionnairResourceTest {
@Autowired
private QuestionnairAnswersRepository repository;
@Autowired
private QuestionnairAnswersService questionnairAnswersService;
private JerseyTestImpl jerseyTest;
class JerseyTestImpl extends JerseyTest {
@Override
public URI getBaseUri() {
return super.getBaseUri();
}
@Override
protected ResourceConfig configure() {
enable(TestProperties.LOG_TRAFFIC);
enable(TestProperties.DUMP_ENTITY);
ResourceConfig config = new ApplicationConfig();
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("contextConfigLocation", "root-test-context.xml");
config.setProperties(properties);
return config;
}
@Override
protected void configureClient(final ClientConfig config) {
config.register(new Jackson2Feature());
}
}
@Before
public void beforeMethod() throws Exception {
jerseyTest = new JerseyTestImpl();
jerseyTest.setUp();
repository.activeAllAnswers();
}
/*-
public void getquestionnairesTestOldWay() throws JsonParseException, JsonMappingException, IOException {
String invitationToken = "UO6QUYLIK1";
ObjectMapper mapper = new ObjectMapper();
JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, QuestionnairDTO.class);
client().register(new HttpBasicAuthFilter(LoginService.RESPONDENT_USER_NAME, invitationToken));
String response = client().target(getBaseUri() + "runtime/questionnaires").request()
.accept(MediaType.APPLICATION_JSON).get(String.class);
List<QuestionnairDTO> questionnairDTOs = mapper.readValue(response, type);
assertThat(questionnairDTOs).hasSize(1);
}*/
@Test
public void questionnairesListTest() {
String invitationToken = "UO6QUYLIK1";
client().register(new HttpBasicAuthFilter(Login.RESPONDENT_USER_NAME, invitationToken));
Response response = client().target(getBaseUri() + "runtime/questionnaires").request()
.accept(MediaType.APPLICATION_JSON).get();
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200.getStatusCode());
List<QuestionnairDTO> questionnairDTOs = response.readEntity(new GenericType<List<QuestionnairDTO>>() {
});
assertThat(questionnairDTOs).contains(QuestionnairDTO.with().id(58).build());
}
@Test
public void navigateQuestionByQuestionTest() {
String invitationToken = "UO6QUYLIK1";
Integer questionnaireId = 58;
RenderingMode mode = RenderingMode.QUESTION_BY_QUESTION;
BrowsingAction action = BrowsingAction.ENTERING;
// client().register(new HttpBasicAuthFilter(LoginService.RESPONDENT_USER_NAME, invitationToken));
PageDTO page = null;
Response response = client()
.target(String.format("%sruntime/questionnaires/%d/page?mode=%s&action=%s", getBaseUri(),
questionnaireId, mode, action)).request().accept(MediaType.APPLICATION_JSON).get();
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200.getStatusCode());
page = response.readEntity(PageDTO.class);
assertThat(page.getQuestions()).containsExactly(QuestionDTO.with().id(12).build());
action = BrowsingAction.FORWARD;
// client().register(new HttpBasicAuthFilter(LoginService.RESPONDENT_USER_NAME, invitationToken));
response = client()
.target(String.format("%sruntime/questionnaires/%d/page?mode=%s&action=%s", getBaseUri(),
questionnaireId, mode, action)).request().accept(MediaType.APPLICATION_JSON).get();
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200.getStatusCode());
page = response.readEntity(PageDTO.class);
assertThat(page.getQuestions()).containsExactly(QuestionDTO.with().id(13).build());
}
@Test
public void navigateGroupByGroupTest() {
Questionnair questionnair = Questionnair.with().id(58).build();
questionnairAnswersService.save(questionnair, "Q1", "Antonio Maria");
questionnairAnswersService.save(questionnair, "Q2", "05");
questionnairAnswersService.save(questionnair, "Q3", 33);
String longAnswer = "I started to work in IECISA, 10 years ago";
questionnairAnswersService.save(questionnair, "Q4", ArrayUtils.toObject(longAnswer.toCharArray()));
questionnairAnswersService.save(questionnair, "Q5", "O2");
questionnairAnswersService.save(questionnair, "Q6", "O1");
// Radio options
questionnairAnswersService.save(questionnair, "q7_1", "O1");
questionnairAnswersService.save(questionnair, "q7_2", "O2");
questionnairAnswersService.save(questionnair, "q7_3", "O3");
questionnairAnswersService.save(questionnair, "q7_4", "O1");
// Checkbox list
questionnairAnswersService.save(questionnair, "q8_o1", Boolean.TRUE);
questionnairAnswersService.save(questionnair, "q8_o2", Boolean.TRUE);
questionnairAnswersService.save(questionnair, "q8_o3", Boolean.TRUE);
questionnairAnswersService.save(questionnair, "q8_o4", Boolean.FALSE);
String invitationToken = "UO6QUYLIK1";
Integer questionnaireId = questionnair.getId();
RenderingMode mode = RenderingMode.GROUP_BY_GROUP;
BrowsingAction action = BrowsingAction.ENTERING;
// client().register(new HttpBasicAuthFilter(LoginService.RESPONDENT_USER_NAME, invitationToken));
PageDTO page = null;
Response response = client()
.target(String.format("%sruntime/questionnaires/%d/page?mode=%s&action=%s", getBaseUri(),
questionnaireId, mode, action)).request().accept(MediaType.APPLICATION_JSON).get();
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200.getStatusCode());
page = response.readEntity(PageDTO.class);
assertThat(page.getQuestions()).containsExactly(QuestionDTO.with().id(12).build(),
QuestionDTO.with().id(13).build(), QuestionDTO.with().id(29).build());
action = BrowsingAction.FORWARD;
// client().register(new HttpBasicAuthFilter(LoginService.RESPONDENT_USER_NAME, invitationToken));
response = client()
.target(String.format("%sruntime/questionnaires/%d/page?mode=%s&action=%s", getBaseUri(),
questionnaireId, mode, action)).request().accept(MediaType.APPLICATION_JSON).get();
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200.getStatusCode());
page = response.readEntity(PageDTO.class);
assertThat(page.getQuestions()).containsExactly(QuestionDTO.with().id(30).build(),
QuestionDTO.with().id(31).build(), QuestionDTO.with().id(35).build());
// client().register(new HttpBasicAuthFilter(LoginService.RESPONDENT_USER_NAME, invitationToken));
response = client()
.target(String.format("%sruntime/questionnaires/%d/page?mode=%s&action=%s", getBaseUri(),
questionnaireId, mode, action)).request().accept(MediaType.APPLICATION_JSON).get();
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200.getStatusCode());
page = response.readEntity(PageDTO.class);
assertThat(page.getQuestions()).containsExactly(QuestionDTO.with().id(39).build(),
QuestionDTO.with().id(50).build());
}
@Test
public void saveAnswerTest() {
String invitationToken = "UO6QUYLIK1";
Integer questionnaireId = 58;
// client().register(new HttpBasicAuthFilter(LoginService.RESPONDENT_USER_NAME, invitationToken));
String questionCode = "Q1";
TextAnswer answer = TextAnswer.fromValue("Antonio Maria");
Entity<TextAnswer> wrapper = Entity.json(answer);
Response response = client()
.target(String.format("%sruntime/questionnaires/%d/answer?questionCode=%s", getBaseUri(),
questionnaireId, questionCode)).request().accept(MediaType.APPLICATION_JSON).post(wrapper);
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200.getStatusCode());
}
@After
public void tearDown() throws Exception {
jerseyTest.tearDown();
}
protected Client client() {
return jerseyTest.client();
}
protected URI getBaseUri() {
return jerseyTest.getBaseUri();
}
}