package cucumber.api.testng;
import gherkin.formatter.Reporter;
import gherkin.formatter.model.Match;
import gherkin.formatter.model.Result;
import org.testng.annotations.Test;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
public class FeatureResultListenerTest {
@Test
public void should_be_passed_for_passed_result() throws Exception {
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), false);
resultListener.result(mockPassedResult());
assertTrue(resultListener.isPassed());
assertNull(resultListener.getFirstError());
}
@Test
public void should_not_be_passed_for_failed_result() throws Exception {
Result result = mockFailedResult();
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), false);
resultListener.result(result);
assertFalse(resultListener.isPassed());
assertEquals(resultListener.getFirstError(), result.getError());
}
@Test
public void should_be_passed_for_undefined_result() throws Exception {
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), false);
resultListener.result(Result.UNDEFINED);
assertTrue(resultListener.isPassed());
assertNull(resultListener.getFirstError());
}
@Test
public void should_not_be_passed_for_undefined_result_in_strict_mode() throws Exception {
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), true);
resultListener.result(Result.UNDEFINED);
assertFalse(resultListener.isPassed());
assertEquals(resultListener.getFirstError().getMessage(), FeatureResultListener.UNDEFINED_MESSAGE);
}
@Test
public void should_be_passed_for_pending_result() throws Exception {
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), false);
resultListener.result(mockPendingResult());
assertTrue(resultListener.isPassed());
assertNull(resultListener.getFirstError());
}
@Test
public void should_not_be_passed_for_pending_result_in_strict_mode() throws Exception {
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), true);
resultListener.result(mockPendingResult());
assertFalse(resultListener.isPassed());
assertEquals(resultListener.getFirstError().getMessage(), FeatureResultListener.PENDING_MESSAGE);
}
@Test
public void should_collect_first_error() throws Exception {
Result result = mockFailedResult();
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), false);
resultListener.result(result);
resultListener.result(mockFailedResult());
resultListener.result(mockPendingResult());
resultListener.result(Result.UNDEFINED);
assertEquals(resultListener.getFirstError(), result.getError());
}
@Test
public void should_collect_error_after_undefined() throws Exception {
Result result = mockFailedResult();
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), true);
resultListener.result(Result.UNDEFINED);
resultListener.result(result);
assertEquals(resultListener.getFirstError(), result.getError());
}
@Test
public void should_collect_error_after_pending() throws Exception {
Result result = mockFailedResult();
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), true);
resultListener.result(mockPendingResult());
resultListener.result(result);
assertEquals(resultListener.getFirstError(), result.getError());
}
@Test
public void should_collect_pending_after_undefined() throws Exception {
Result result = mockPendingResult();
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), true);
resultListener.result(Result.UNDEFINED);
resultListener.result(result);
assertEquals(resultListener.getFirstError().getMessage(), FeatureResultListener.PENDING_MESSAGE);
}
@Test
public void should_not_be_passed_for_failed_before_hook() throws Exception {
Result result = mockFailedResult();
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), false);
resultListener.before(mock(Match.class), result);
assertFalse(resultListener.isPassed());
assertEquals(resultListener.getFirstError(), result.getError());
}
@Test
public void should_not_be_passed_for_failed_after_hook() throws Exception {
Result result = mockFailedResult();
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), false);
resultListener.after(mock(Match.class), result);
assertFalse(resultListener.isPassed());
assertEquals(resultListener.getFirstError(), result.getError());
}
@Test
public void should_reset_errors() throws Exception {
FeatureResultListener resultListener = new FeatureResultListener(mock(Reporter.class), false);
resultListener.result(mockFailedResult());
resultListener.startFeature();
assertTrue(resultListener.isPassed());
assertNull(resultListener.getFirstError());
}
@Test
public void should_forward_calls_to_reporter_interface_methods() throws Exception {
Match match = mock(Match.class);
Result result = mockPassedResult();
String mimeType = "mimeType";
byte data[] = new byte[] {1};
String text = "text";
Reporter reporter = mock(Reporter.class);
FeatureResultListener resultListener = new FeatureResultListener(reporter, false);
resultListener.before(match, result);
resultListener.match(match);
resultListener.embedding(mimeType, data);
resultListener.write(text);
resultListener.result(result);
resultListener.after(match, result);
verify(reporter).before(match, result);
verify(reporter).match(match);
verify(reporter).embedding(mimeType, data);
verify(reporter).write(text);
verify(reporter).result(result);
verify(reporter).after(match, result);
}
private Result mockPassedResult() {
Result result = mock(Result.class);
when(result.getStatus()).thenReturn(Result.PASSED);
return result;
}
private Result mockFailedResult() {
Result result = mock(Result.class);
when(result.getStatus()).thenReturn(Result.FAILED);
when(result.getError()).thenReturn(mock(Throwable.class));
return result;
}
private Result mockPendingResult() {
Result result = mock(Result.class);
when(result.getStatus()).thenReturn(FeatureResultListener.PENDING_STATUS);
return result;
}
}