package me.atam.atam4j;
import me.atam.atam4jdomain.TestsRunResult;
import org.hamcrest.CoreMatchers;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runner.notification.Failure;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class TestRunListenerTest {
private TestRunListener testRunListener = new TestRunListener();
@Test
public void givenTestRunNotFinished_whenGetTestRunResultCalled_thenStatusIsTooEarly() throws Exception {
assertThat(testRunListener.getTestsRunResult().getStatus(), CoreMatchers.is(TestsRunResult.Status.TOO_EARLY));
}
@Test
public void givenFirstTestRunPassesAndSecondTestRunFails_whenGetTestRunResultCalled_thenFailuresReturned()throws Exception{
//given 1st run
testRunOf(() -> passingTest(getMockedTestDescription("testThatPasses", "com.blah.MyTest")));
//given 2nd run
testRunOf(() -> failingTest(getMockedTestDescription("testThatFails", "com.blah.MyTest")));
//when
TestsRunResult secondResult = testRunListener.getTestsRunResult();
//then
assertThat(secondResult.getStatus(), CoreMatchers.is(TestsRunResult.Status.FAILURES));
}
private void testRunOf(Runnable runnable) throws Exception {
testRunListener.testRunStarted(null);
runnable.run();
testRunListener.testRunFinished(null);
}
@Test
public void givenFirstTestRunFailsAndSecondTestRunPasses_whenGetTestRunResultCalled_thenOKIsReturned()throws Exception{
//given 1st run
Description testThatFails = getMockedTestDescription("testThatFails", "com.blah.MyTest");
testRunOf(() -> failingTest(testThatFails));
//given 2nd run
testRunOf(() -> passingTest(getMockedTestDescription("testThatPasses", "com.blah.MyTest")));
//when
TestsRunResult secondResult = testRunListener.getTestsRunResult();
//then
assertThat(secondResult.getStatus(), CoreMatchers.is(TestsRunResult.Status.ALL_OK));
}
@Test
public void givenOneTestStartedNoFailureEventAndTestRunFinished_whenGetTestRunResultCalled_thenStatusIsAllOKAndTestPresentInList() throws Exception {
//given
testRunOf(() -> passingTest(getMockedTestDescription("testThatPasses", "com.blah.MyTest")));
//when then
assertThat(testRunListener.getTestsRunResult().getStatus(), CoreMatchers.is(TestsRunResult.Status.ALL_OK));
assertThat(testRunListener.getTestsRunResult().getTests().size(), CoreMatchers.is(1));
}
@Test
public void givenOneTestStartedAFailureEventOccursAndTestRunFinished_whenGetTestRunResultCalled_thenStatusIsFailuresAndTestPresentInList() throws Exception {
//given
Description testThatFails = getMockedTestDescription("testThatFails", "com.blah.MyTest");
//when
testRunOf(() -> failingTest(testThatFails));
//then
assertThat(testRunListener.getTestsRunResult().getStatus(), CoreMatchers.is(TestsRunResult.Status.FAILURES));
assertThat(testRunListener.getTestsRunResult().getTests().size(), CoreMatchers.is(1));
}
@Test
public void givenTwoTestsStartedAFailureEventOccursAndTestRunFinished_whenGetTestRunResultCalled_thenStatusIsFailuresAndTestPresentInList() throws Exception {
//given
Description testThatPasses = getMockedTestDescription("testThatPasses", "com.blah.MyTest");
Description testThatFails = getMockedTestDescription("testThatFails", "com.blah.MyTest");
//when
testRunOf(() -> {
failingTest(testThatFails);
passingTest(testThatPasses);
});
//then
assertThat(testRunListener.getTestsRunResult().getStatus(), CoreMatchers.is(TestsRunResult.Status.FAILURES));
assertThat(testRunListener.getTestsRunResult().getTests().size(), CoreMatchers.is(2));
}
private Failure mockedFailureOf(Description testThatFails) {
Failure failure = mock(Failure.class);
when(failure.getDescription()).thenReturn(testThatFails);
return failure;
}
private Description getMockedTestDescription(String testThatPasses, String t) {
Description description = mock(Description.class);
when(description.getMethodName()).thenReturn(testThatPasses);
when(description.getClassName()).thenReturn(t);
return description;
}
private void passingTest(Description testThatPasses) {
try {
testRunListener.testStarted(testThatPasses);
} catch (Exception e) {
e.printStackTrace();
}
}
private void failingTest(Description testThatFails) {
try {
testRunListener.testStarted(testThatFails);
testRunListener.testFailure(mockedFailureOf(testThatFails));
} catch (Exception e) {
e.printStackTrace();
}
}
}