package example.domain.web.nodriver;
import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.mock.web.MockHttpServletResponse;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasItem;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
public class HtmlPage {
private String html;
private Document dom;
private Browser browser;
public HtmlPage(MockHttpServletResponse response, Browser browser) throws Exception {
this.browser = browser;
if (StringUtils.startsWith(response.getContentType(), "text/html")) {
html = response.getContentAsString();
dom = Jsoup.parse(html);
}
}
public String currentURI() {
return browser.currentURI();
}
public void shouldHaveBodyClass(String index) {
assertNotNull("Page is not text/html", html);
assertThat(dom.body().classNames(), hasItem(index));
}
public <T> T clickAndExpect(String selector, Class<T> pageClass) {
Element link = expect(first(selector), "a");
String href = link.attr("href");
if (StringUtils.isEmpty(href)) {
fail("Empty 'href' attribute in " + link.outerHtml());
return null;
}
return browser.get(href, pageClass);
}
public HtmlForm getForm(String selector) {
Element form = expect(first(selector), "form");
return new HtmlForm(form, browser);
}
public Element first(String selector) {
Elements elements = dom.select(selector);
if (elements.isEmpty()) {
fail("Cannot find " + selector + " in " + html);
return null;
}
return elements.first();
}
private Element expect(Element tag, String tagName) {
assertThat("Unexpected element", tag.tagName(), equalTo(tagName));
return tag;
}
}