package sample.webdriver;
import java.text.ParseException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.WebDriver;
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
import sample.config.MockDataConfig;
import sample.config.WebMvcConfig;
import sample.config.WebSecurityConfig;
import sample.data.Message;
import static sample.fest.Assertions.assertThat;
import sample.webdriver.pages.CreateMessagePage;
import sample.webdriver.pages.ViewMessagePage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.htmlunit.webdriver.MockMvcHtmlUnitDriverBuilder;
import org.springframework.web.context.WebApplicationContext;
/**
* An end to end test that validates the {@link CreateMessagePage}. A few things to notice:
*
* <ul>
* <li>You will see that all the tests are the same as {@link WebDriverCreateMessageITests}. This shows how little difference
* there is in how you would write the tests.</li>
* <li>The only difference is how we initialize our {@link WebDriver}</li>
* <li>We do not need to run the web application on a server for this test since we are using
* {@link org.springframework.test.web.servlet.htmlunit.webdriver.MockMvcHtmlUnitDriver}</li>
* </ul>
*
* @author Rob Winch
*
*/
// tag::junit-spring-setup[]
@RunWith(SpringJUnit4ClassRunner.class) // <1>
@ContextConfiguration(classes = {WebMvcConfig.class, WebSecurityConfig.class, MockDataConfig.class}) // <2>
@WebAppConfiguration // <3>
@WithMockUser // <4>
public class MockMvcHtmlUnitDriverCreateMessageTests {
@Autowired
WebApplicationContext context;
// end::junit-spring-setup[]
@Autowired
Message expectedMessage;
// tag::webdriver[]
WebDriver driver;
@Before
public void setup() {
driver = MockMvcHtmlUnitDriverBuilder
.webAppContextSetup(context, springSecurity())
.createDriver();
}
// end::webdriver[]
// tag::cleanup[]
@After
public void destroy() {
if(driver != null) {
driver.close();
}
}
// end::cleanup[]
@Test
public void missingFieldWithJavascriptValidationDisplaysError() {
CreateMessagePage messagePage = CreateMessagePage.to(driver);
messagePage = messagePage.createMessage(CreateMessagePage.class, "", "");
assertThat(messagePage.getErrors()).isEqualTo("This field is required.");
}
@Test
public void missingFieldServerSideValidationDisplaysError() {
CreateMessagePage messagePage = CreateMessagePage.to(driver);
messagePage = messagePage.createMessage(CreateMessagePage.class, "Summary", "");
assertThat(messagePage.getErrors()).isEqualTo("Message is required.");
}
@Test
public void successfullyCreateMessage() throws ParseException {
String expectedSummary = expectedMessage.getSummary();
String expectedText = expectedMessage.getText();
// tag::to-create-message[]
CreateMessagePage page = CreateMessagePage.to(driver);
// end::to-create-message[]
// tag::create-message[]
ViewMessagePage viewMessagePage =
page.createMessage(ViewMessagePage.class, expectedSummary, expectedText);
// end::create-message[]
// tag::create-message-assert[]
assertThat(viewMessagePage.getMessage()).isEqualTo(expectedMessage);
assertThat(viewMessagePage.getSuccess()).isEqualTo("Successfully created a new message");
// end::create-message-assert[]
}
}