package net.thucydides.core.reports.csv; import au.com.bytecode.opencsv.CSVWriter; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import net.thucydides.core.ThucydidesSystemProperty; import net.thucydides.core.guice.Injectors; import net.thucydides.core.model.TestOutcome; import net.thucydides.core.reports.TestOutcomes; import net.thucydides.core.reports.ThucydidesReporter; import net.thucydides.core.util.EnvironmentVariables; import net.thucydides.core.util.Inflector; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import static ch.lambdaj.Lambda.extract; import static ch.lambdaj.Lambda.on; /** * Stores test outcomes as CSV files */ public class CSVReporter extends ThucydidesReporter { private static final String[] TITLE_LINE = {"Story", "Title", "Result", "Date", "Stability", "Duration (s)"}; private static final String[] OF_STRINGS = new String[]{}; private final List<String> extraColumns; private final String encoding; public CSVReporter(File outputDirectory) { this(outputDirectory, Injectors.getInjector().getProvider(EnvironmentVariables.class).get() ); } public CSVReporter(File outputDirectory, EnvironmentVariables environmentVariables) { this.setOutputDirectory(outputDirectory); this.extraColumns = extraColumnsDefinedIn(environmentVariables); this.encoding = ThucydidesSystemProperty.THUCYDIDES_REPORT_ENCODING.from(environmentVariables, java.nio.charset.Charset.defaultCharset().name()); } private List<String> extraColumnsDefinedIn(EnvironmentVariables environmentVariables) { String columns = ThucydidesSystemProperty.THUCYDIDES_CSV_EXTRA_COLUMNS.from(environmentVariables,""); return ImmutableList.copyOf(Splitter.on(",").omitEmptyStrings().trimResults().split(columns)); } public File generateReportFor(TestOutcomes testOutcomes, String reportName) throws IOException { CSVWriter writer = new CSVWriter(new java.io.OutputStreamWriter(new java.io.FileOutputStream(getOutputFile(reportName)), encoding)); writeTitleRow(writer); writeEachRow(testOutcomes.withHistory(), writer); writer.close(); return getOutputFile(reportName); } private void writeTitleRow(CSVWriter writer) { Inflector inflector = Inflector.getInstance(); List<String> titles = new ArrayList<String>(); titles.addAll(Arrays.asList(TITLE_LINE)); for(String extraColumn : extraColumns) { titles.add(inflector.of(extraColumn).asATitle().toString()); } writer.writeNext(titles.toArray(OF_STRINGS)); } private void writeEachRow(TestOutcomes testOutcomes, CSVWriter writer) { for (TestOutcome outcome : testOutcomes.getTests()) { writer.writeNext(withRowDataFrom(outcome)); } } private Double passRateFor(TestOutcome outcome) { return 0.0;//outcome.getStatistics().getPassRate().overTheLast(5).testRuns(); } private String[] withRowDataFrom(TestOutcome outcome) { List<? extends Serializable> defaultValues = ImmutableList.of(outcome.getStoryTitle(), outcome.getTitle(), outcome.getResult(), outcome.getStartTime(), passRateFor(outcome), outcome.getDurationInSeconds()); List<String> cellValues = extract(defaultValues, on(Object.class).toString()); cellValues.addAll(extraValuesFrom(outcome)); return cellValues.toArray(OF_STRINGS); } private Collection<String> extraValuesFrom(TestOutcome outcome) { List<String> extraValues = Lists.newArrayList(); for(String extraColumn : extraColumns) { extraValues.add(outcome.getTagValue(extraColumn).or("")); } return extraValues; } private File getOutputFile(String reportName) { return new File(getOutputDirectory(), reportName); } }