package org.adaptlab.chpir.android.survey.Models;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import org.adaptlab.chpir.android.survey.Models.Question.QuestionType;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.reflect.Whitebox;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class QuestionTest {
private static final String QUESTION_TYPE_ONE = "SELECT_ONE";
private static final String QUESTION_ID = "9210TEST";
private static final Long REMOTE_ID = 910289L;
private Question question;
private Instrument instrument;
private Option option;
private List<Option> optionsList;
@Before
public void onSetup() {
question = spy(new Question());
instrument = mock(Instrument.class);
option = mock(Option.class);
optionsList = new ArrayList<Option>();
}
@Test
public void shouldSetAndGetQuestionText() throws Exception {
//TODO FIX STATIC MOCKING
//question.setText(QUESTION_TEXT);
//assertEquals(QUESTION_TEXT, question.getText());
}
@Test
public void shouldSetAndGetQuestionType() throws Exception {
question.setQuestionType(QUESTION_TYPE_ONE);
assertEquals(QuestionType.valueOf(QUESTION_TYPE_ONE),
question.getQuestionType());
}
@Test
public void shouldSetAndGetQuestionIdentifier() throws Exception {
question.setQuestionIdentifier(QUESTION_ID);
assertEquals(QUESTION_ID, question.getQuestionIdentifier());
}
@Test
public void shouldSetAndGetIntrumentOfQuestion() throws Exception {
question.setInstrument(instrument);
assertEquals(instrument, question.getInstrument());
}
@Test
public void shouldSetAndGetRemoteId() throws Exception {
question.setRemoteId(REMOTE_ID);
assertEquals(REMOTE_ID, question.getRemoteId());
}
@Test
public void shouldFindQuestionByRemoteId() throws Exception {
// TODO FIX STATIC MOCKING
/*
* PowerMockito.mockStatic(Question.class);
* doReturn(question).when(Question.findByRemoteId(REMOTE_ID));
* assertEquals(question, Question.findByRemoteId(REMOTE_ID));
*/
}
@Test
public void shouldFindQuestionByQuestionIdentifier() throws Exception {
// TODO Fix Static Mocking
/*
* question.setQuestionIdentifier(QUESTION_ID); assertEquals(question,
* Question.findByQuestionIdentifier(QUESTION_ID));
*/
}
@Test
public void shouldReturnListOfOptions() throws Exception {
doReturn(optionsList).when(question).options();
assertThat(question.options(), instanceOf(List.class));
optionsList.add(option);
when(option.getQuestion()).thenReturn(question);
for (Option option : question.options()) {
assertEquals(question, option.getQuestion());
}
}
@Test
public void shouldTestIfQuestionHasOptions() throws Exception {
doReturn(optionsList).when(question).options();
assertThat(question.hasOptions(), equalTo(false));
optionsList.add(option);
assertThat(question.hasOptions(), equalTo(true));
}
@Test
public void shouldTestIfQuestionHasSkipPattern() throws Exception {
optionsList.add(option);
Question secondQuestion = mock(Question.class);
doReturn(optionsList).when(question).options();
when(option.getNextQuestion()).thenReturn(secondQuestion);
when(secondQuestion.getQuestionIdentifier()).thenReturn(QUESTION_ID);
assertThat(question.hasSkipPattern(), equalTo(true));
}
@Test
public void shouldGetAllQuestions() throws Exception {
/*
* assertThat(Question.getAll(), instanceOf(List.class)); //TODO FIX
* STATIC MOCKING Question quiz1 = mock(Question.class);
* verify(quiz1).save(); Question quiz2 = mock(Question.class);
* verify(quiz2).save(); assertThat(Question.getAll().size(),
* equalTo(2)); PowerMockito.verifyStatic();
*/
}
@Test
// TODO FIX
public void shouldReturnValidQuestionType() throws Exception {
Question quiz = spy(new Question());
boolean bool1 = Whitebox.invokeMethod(quiz, "validQuestionType","SELECT_ONE");
assertThat(bool1, equalTo(true));
boolean bool2 = Whitebox.invokeMethod(quiz, "validQuestionType","COACH K");
assertThat(bool2, equalTo(false));
}
@Test
public void shouldCreateObjectFromJson() throws Exception {
// TODO Implement
}
@Test
public void shouldSetAndGetRegExpValidation() throws Exception {
question.setRegExValidation("validate");
assertEquals("validate", question.getRegExValidation());
}
}