package net.thucydides.core.pages;
import net.thucydides.core.annotations.ManagedPages;
import net.thucydides.core.reflection.FieldSetter;
import net.thucydides.core.steps.InvalidManagedPagesFieldException;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.lang.reflect.Field;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.doThrow;
public class WhenUsingThePagesAnnotation {
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void the_ManagedPages_annotation_should_identify_the_pages_field() {
SimpleScenario testCase = new SimpleScenario();
PagesAnnotatedField pagesField = PagesAnnotatedField.findFirstAnnotatedField(testCase.getClass());
assertThat(pagesField, is(not(nullValue())));
}
@Test
public void the_ManagedPages_annotation_should_define_the_default_url() {
SimpleScenario testCase = new SimpleScenario();
PagesAnnotatedField pagesField = PagesAnnotatedField.findFirstAnnotatedField(testCase.getClass());
assertThat(pagesField.getDefaultBaseUrl(), is("http://www.google.com"));
}
@Test
public void should_be_able_to_inject_a_Pages_object_into_a_test_case() {
SimpleScenario testCase = new SimpleScenario();
Pages pages = new Pages();
PagesAnnotatedField pagesField = PagesAnnotatedField.findFirstAnnotatedField(testCase.getClass());
pagesField.setValue(testCase, pages);
assertThat(testCase.getPages(), is(pages));
}
class SimpleUnannotatedScenario {
public Pages pages;
}
@Test(expected = InvalidManagedPagesFieldException.class)
public void should_throw_exception_if_no_annotation_pages_object_found() {
SimpleUnannotatedScenario testCase = new SimpleUnannotatedScenario();
PagesAnnotatedField.findFirstAnnotatedField(testCase.getClass());
}
class SimpleBadlyannotatedScenario {
@ManagedPages(defaultUrl = "http://www.google.com")
public String pages;
}
@Test(expected = InvalidManagedPagesFieldException.class)
public void should_throw_exception_if_pages_object_is_not_a_Pages_instance() {
SimpleBadlyannotatedScenario testCase = new SimpleBadlyannotatedScenario();
PagesAnnotatedField.findFirstAnnotatedField(testCase.getClass());
}
@Mock Pages pages;
@Mock Object testCase;
@Mock ManagedPages managedPages;
@Mock FieldSetter fieldSetter;
class TestPagesAnnotatedField extends PagesAnnotatedField {
TestPagesAnnotatedField(Field field, ManagedPages annotation) {
super(field, annotation);
}
@Override
protected FieldSetter set(Object targetObject) {
return fieldSetter;
}
}
@Test(expected = InvalidManagedPagesFieldException.class)
public void should_throw_exception_if_pages_object_field_cannot_be_accessed() throws Exception {
doThrow(new IllegalAccessException()).when(fieldSetter).to(anyObject());
Field field = null;
TestPagesAnnotatedField testField = new TestPagesAnnotatedField(field, managedPages);
testField.setValue(testCase, pages);
}
}