package org.arquillian.cube.docker.impl.client.reporter;
import org.arquillian.cube.docker.drone.event.AfterVideoRecorded;
import org.arquillian.reporter.api.builder.BuilderLoader;
import org.arquillian.reporter.api.event.SectionEvent;
import org.arquillian.reporter.api.model.entry.FileEntry;
import org.arquillian.reporter.api.model.entry.KeyValueEntry;
import org.arquillian.reporter.api.model.report.Report;
import org.arquillian.reporter.api.model.report.TestMethodReport;
import org.arquillian.reporter.config.ReporterConfiguration;
import org.jboss.arquillian.core.api.Event;
import org.jboss.arquillian.test.spi.event.suite.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.lang.reflect.Method;
import java.nio.file.Paths;
import java.util.LinkedHashMap;
import static org.arquillian.reporter.impl.asserts.ReportAssert.assertThatReport;
import static org.arquillian.reporter.impl.asserts.SectionAssert.assertThatSection;
import static org.mockito.Mockito.verify;
@RunWith(MockitoJUnitRunner.class)
public class TakeVncDroneVideoTest {
@Before
public void setUp() {
BuilderLoader.load();
}
@Mock
Event<SectionEvent> reportEvent;
@Captor
ArgumentCaptor<SectionEvent> reportEventArgumentCaptor;
@Test
public void should_create_video_from_root_directory() throws NoSuchMethodException {
//given
TakeVncDroneVideo takeVncDroneVideo = new TakeVncDroneVideo();
takeVncDroneVideo.reportEvent = reportEvent;
final Method method = getMethod("should_create_video_from_root_directory");
AfterVideoRecorded afterVideoRecorded = new AfterVideoRecorded(new After(TakeDockerEnvironmentTest.class, method), Paths.get("target/myvideo.flv"));
//when
takeVncDroneVideo.reportScreencastRecording(afterVideoRecorded, getReporterConfiguration());
//then
verify(reportEvent).fire(reportEventArgumentCaptor.capture());
final SectionEvent sectionEvent = reportEventArgumentCaptor.getValue();
final String methodName = method.getName();
assertThatSection(sectionEvent)
.hasSectionId(methodName)
.hasReportOfTypeThatIsAssignableFrom(TestMethodReport.class);
final Report report = sectionEvent.getReport();
assertThatReport(report)
.hasName(methodName)
.hasNumberOfEntries(1)
.hasEntriesContaining(new KeyValueEntry(DockerEnvironmentReportKey.VIDEO_PATH, new FileEntry("myvideo.mp4")));
}
@Test
public void should_create_video_from_surefire_report_directory() throws NoSuchMethodException {
//given
TakeVncDroneVideo takeVncDroneVideo = new TakeVncDroneVideo();
takeVncDroneVideo.reportEvent = reportEvent;
final Method method = getMethod("should_create_video_from_surefire_report_directory");
AfterVideoRecorded afterVideoRecorded = new AfterVideoRecorded(new After(TakeDockerEnvironmentTest.class, method), Paths.get("target/surefire-report/myvideo.flv"));
//when
takeVncDroneVideo.reportScreencastRecording(afterVideoRecorded, getReporterConfiguration());
//then
verify(reportEvent).fire(reportEventArgumentCaptor.capture());
final SectionEvent sectionEvent = reportEventArgumentCaptor.getValue();
final String methodName = method.getName();
assertThatSection(sectionEvent)
.hasSectionId(methodName)
.hasReportOfTypeThatIsAssignableFrom(TestMethodReport.class);
final Report report = sectionEvent.getReport();
assertThatReport(report)
.hasName(methodName)
.hasNumberOfEntries(1)
.hasEntriesContaining(new KeyValueEntry(DockerEnvironmentReportKey.VIDEO_PATH, new FileEntry("surefire-report/myvideo.mp4")));
}
private ReporterConfiguration getReporterConfiguration() {
return ReporterConfiguration.fromMap(new LinkedHashMap<>());
}
private Method getMethod(String name) throws NoSuchMethodException {
return TakeVncDroneVideoTest.class.getMethod(name);
}
}