package com.aventstack.extentreports.reporter.converters;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.gherkin.model.And;
import com.aventstack.extentreports.gherkin.model.Background;
import com.aventstack.extentreports.gherkin.model.Given;
import com.aventstack.extentreports.gherkin.model.IGherkinFormatterModel;
import com.aventstack.extentreports.gherkin.model.Scenario;
import com.aventstack.extentreports.gherkin.model.Then;
import com.aventstack.extentreports.gherkin.model.When;
import com.aventstack.extentreports.model.Log;
import com.aventstack.extentreports.model.Test;
public class ExtentHtmlBddNodesConverter {
private static final Logger logger = Logger.getLogger(ExtentHtmlBddNodesConverter.class.getName());
private Test test;
private Element testElement;
public ExtentHtmlBddNodesConverter(Test test, Element testElement) {
this.test = test;
this.testElement = testElement;
}
public void parseAndAddNodes() {
Elements nodeElementList = testElement.select(".test-content > .node");
if (nodeElementList.size() == 0)
return;
for (Element nodeElement : nodeElementList) {
parseAndAddNode(nodeElement);
}
}
public void parseAndAddNode(Element nodeElement) {
Status status;
Test node = new Test();
test.getNodeContext().add(node);
node.setUseManualConfiguration(true);
node.setParent(test);
node.setLevel(1);
Class<? extends IGherkinFormatterModel> bddType = getBddType(nodeElement);
node.setBehaviorDrivenType(bddType);
Element descText = nodeElement.select(".desc-text").first();
String description = descText != null
? nodeElement.select(".desc-text").first().html()
: "";
node.setName(description);
Elements steps = nodeElement.select(".steps > li");
Test grandchild;
for (Element step : steps) {
grandchild = new Test();
grandchild.setLevel(2);
grandchild.setParent(node);
node.getNodeContext().add(grandchild);
bddType = getBddType(step);
grandchild.setBehaviorDrivenType(bddType);
status = getStatus(step);
grandchild.setStatus(status);
String name = step.select(".bdd-step-name").first().html();
grandchild.setName(name);
Log l = new Log(grandchild);
grandchild.getLogContext().add(l);
l.setSequence(0);
l.setStatus(status);
Element pre = step.select(".pre").first();
String preText = pre != null
? pre.html()
: null;
if (preText != null)
l.setDetails(preText);
grandchild.end();
}
node.end();
status = getStatus(nodeElement);
if (node.getStatus() != status) {
logger.log(Level.WARNING, "Woops. Looks like something went wrong parsing your existing report.");
logger.log(Level.WARNING, "The current test status for " + descText + ": " + status + " does not match the calculated status: " + node.getStatus());
logger.log(Level.WARNING, "Forcefully setting the status to: " + status);
node.setStatus(status);
}
}
private Class<? extends IGherkinFormatterModel> getBddType(Element el) {
if (el.hasClass("background"))
return Background.class;
if (el.hasClass("scenario"))
return Scenario.class;
if (el.hasClass("given"))
return Given.class;
if (el.hasClass("when"))
return When.class;
if (el.hasClass("Then"))
return Then.class;
return And.class;
}
private Status getStatus(Element node) {
String status = node.attr("status").toUpperCase();
return Status.valueOf(status);
}
}