package net.thucydides.core.reports.json;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import net.thucydides.core.guice.Injectors;
import net.thucydides.core.model.ReportType;
import net.thucydides.core.model.TestOutcome;
import net.thucydides.core.reports.AcceptanceTestLoader;
import net.thucydides.core.reports.AcceptanceTestReporter;
import net.thucydides.core.reports.OutcomeFormat;
import net.thucydides.core.reports.TestOutcomes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.List;
import java.util.Locale;
public class JSONTestOutcomeReporter implements AcceptanceTestReporter, AcceptanceTestLoader {
private static final Logger LOGGER = LoggerFactory
.getLogger(JSONTestOutcomeReporter.class);
private File outputDirectory;
private transient String qualifier;
@Override
public String getName() {
return "json";
}
JSONConverter jsonConverter;
public JSONTestOutcomeReporter() {
jsonConverter = Injectors.getInjector().getInstance(JSONConverter.class);
}
@Override
public File generateReportFor(TestOutcome testOutcome,
TestOutcomes allTestOutcomes) throws IOException {
TestOutcome storedTestOutcome = testOutcome.withQualifier(qualifier);
Preconditions.checkNotNull(outputDirectory);
String reportFilename = reportFor(storedTestOutcome);
File report = new File(getOutputDirectory(), reportFilename);
try(OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(report))){
jsonConverter.toJson(storedTestOutcome, outputStream);
}
return report;
}
public File getOutputDirectory() {
return outputDirectory;
}
private String reportFor(final TestOutcome testOutcome) {
return testOutcome.withQualifier(qualifier).getReportName(
ReportType.JSON);
}
public void setOutputDirectory(final File outputDirectory) {
this.outputDirectory = outputDirectory;
}
@Override
public void setQualifier(final String qualifier) {
this.qualifier = qualifier;
}
public void setResourceDirectory(String resourceDirectoryPath) {
}
public Optional<TestOutcome> loadReportFrom(final File reportFile) {
try(BufferedInputStream report = new BufferedInputStream(new FileInputStream(reportFile))) {
TestOutcome fromJson = jsonConverter.fromJson(report);
return Optional.of(fromJson);
// } catch (JsonMappingException mappingException) {
// throw new RuntimeException("Error loading JSON test outcomes", mappingException);
} catch (Throwable e) {
LOGGER.warn("this file was not a valid JSON Thucydides test report: " + reportFile.getName()
+ System.lineSeparator()
+ e.getMessage());
return Optional.absent();
}
}
@Override
public List<TestOutcome> loadReportsFrom(File outputDirectory) {
File[] reportFiles = getAllJsonFilesFrom(outputDirectory);
List<TestOutcome> testOutcomes = Lists.newArrayList();
if (reportFiles != null) {
for (File reportFile : reportFiles) {
testOutcomes.addAll(loadReportFrom(reportFile).asSet());
}
}
return testOutcomes;
}
private File[] getAllJsonFilesFrom(final File reportsDirectory) {
return reportsDirectory.listFiles(new JsonFilenameFilter());
}
private static final class JsonFilenameFilter implements FilenameFilter {
public boolean accept(final File file, final String filename) {
return filename.toLowerCase(Locale.getDefault()).endsWith(".json");
}
}
@Override
public Optional<OutcomeFormat> getFormat() {
return Optional.of(OutcomeFormat.JSON);
}
}