package webGrude; import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; import static com.github.tomakehurst.wiremock.client.WireMock.get; import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Locale; import org.apache.http.message.BasicNameValuePair; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; import com.github.tomakehurst.wiremock.junit.WireMockClassRule; import com.google.common.io.ByteStreams; import webGrude.elements.WrongTypeForField; import webGrude.http.BrowserClient; import webGrude.http.GetException; import webGrude.mappables.Foo; import webGrude.mappables.TooManyResultsError; import webGrude.mappables.WrongTypeError; public class BrowserTest { @ClassRule public static WireMockClassRule wireMockRule = new WireMockClassRule(48089); private static final String HTTP_URL = "http://localhost:48089/Foo.html"; @BeforeClass public static void beforeClass() throws Exception { try (final InputStream is = Foo.class.getResourceAsStream("Foo.html")) { stubFor(get(urlEqualTo("/Foo.html")) .willReturn(aResponse() .withHeader("Content-Type", "text/html;encoding=UTF-8") .withBody(ByteStreams.toByteArray(is)))); } } @AfterClass public static void afterClass() throws Exception { wireMockRule.shutdown(); } @Test public void testMappingFromResource() { final Foo foo = Browser.get(HTTP_URL, Foo.class); assertEquals("Title", foo.someContent.title); assertEquals("Lorem ipsum", foo.someContent.text); assertEquals("Nested content Title", foo.someNestedContent.getHeader()); assertEquals("Nested content", foo.someNestedContent.content); assertEquals(2, foo.section.someRepeatingContent.size()); assertEquals("bar baz", foo.section.someRepeatingContent.get(0)); assertEquals("bar2 baz2", foo.section.someRepeatingContent.get(1)); assertEquals("<p> Get content as <br> element </p>", foo.htmlContent.html()); assertEquals("<a href=\"linkToBeExtracted1\">Some useless text</a> \n<a href=\"linkToBeExtracted2\">Some useless text</a>", foo.linksInnerHtml); assertEquals("<a href=\"./page2\">link to next page</a>", foo.linksOuterHtml); assertEquals("linkToBeExtracted1", foo.linksWithHref.get(0)); assertEquals("linkToBeExtracted2", foo.linksWithHref.get(1)); assertEquals(HTTP_URL + "/./page2", foo.nextPage.getLinkUrl()); assertEquals("www.example.com", foo.linkList.get(0).getLinkUrl()); assertEquals(HTTP_URL + "/./page3", foo.linkList.get(1).getLinkUrl()); assertEquals("HEAD1", foo.repeatingContentsNoSurroundingTag.get(0).head); assertEquals("TAIL1", foo.repeatingContentsNoSurroundingTag.get(0).tail); assertEquals("HEAD2", foo.repeatingContentsNoSurroundingTag.get(1).head); assertEquals("TAIL2", foo.repeatingContentsNoSurroundingTag.get(1).tail); assertEquals(0, foo.doesNotExist.size()); assertEquals("[a, b]", foo.multiSelector.toString()); assertEquals(42, foo.getIntValue()); assertEquals(42, foo.getIntValueWithRegex()); assertEquals(0, foo.intRegexWithDefault); assertEquals(42.24, foo.getFloatValue(), 0.001); assertEquals(42.24, foo.getFloatEuropeanValue(), 0.001); assertEquals(3.1415, foo.fHref, 0.00001); assertEquals(3.1415, foo.fHrefRegex, 0.00001); final SimpleDateFormat df = new SimpleDateFormat("MMMM dd, yyyy - h:mm a", Locale.US); assertEquals("September 23, 2016 - 1:00 PM", df.format(foo.date)); assertTrue(foo.getBoolValue()); assertEquals(41, foo.afterLoadValue); } @Test public void testUrlSubstitution() { Browser.setWebClient(new BrowserClient() { @Override public String get(final String url) { return "DUMMY"; } @Override public String post(final String post, final BasicNameValuePair... params) { return "DUMMY"; } }); Browser.get(PageWithParameterizedURL.class, "x", "y"); assertEquals("http://www.foo.com/x/bar/y/baz", Browser.getCurentUrl()); } @Test(expected = GetException.class) public void testUriInvalidFormat() { Browser.get("jnnkljbnkjb", Foo.class); } @Test(expected = GetException.class) public void testUriNotAccessible() { Browser.get("www.thisurldoesnotexis.bla.blabla", Foo.class); } @Test(expected = TooManyResultsException.class) public void tooManyResults() { Browser.get(HTTP_URL, TooManyResultsError.class); } @Test(expected = WrongTypeForField.class) public void testWrongType() { Browser.get(HTTP_URL, WrongTypeError.class); } }