package rod; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import org.slf4j.LoggerFactory; import rx.Observable; import rx.schedulers.Schedulers; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; public class CommandLoggerTest { private TestAppender testAppender; @Before public void setupLogsForTesting() { final Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); testAppender = (TestAppender) root.getAppender("TEST"); if (testAppender != null) { testAppender.clear(); } } @Test public void testOnComplete() throws Exception { Observable.just(new NopCommand()).subscribeOn(Schedulers.immediate()).subscribe(new CommandLogger()); final ILoggingEvent lastEvent = testAppender.getLastEvent(); assertThat(lastEvent.getMessage(), equalTo("Command stream complete.")); assertThat(lastEvent.getLevel(), equalTo(Level.INFO)); } @Test public void testOnError() throws Exception { final Observable<Action> observable = Observable.error(new RuntimeException("Simulating an error.")); observable.subscribeOn(Schedulers.immediate()).subscribe(new CommandLogger()); final ILoggingEvent lastEvent = testAppender.getLastEvent(); assertThat(lastEvent.getMessage(), equalTo("Error processing stream: {}")); assertThat(lastEvent.getLevel(), equalTo(Level.ERROR)); } @Test public void testOnNext() throws Exception { Observable.from(Arrays.asList(new NopCommand(), new NopCommand(), new NopCommand())).subscribeOn(Schedulers.immediate()).subscribe(new CommandLogger()); final List<ILoggingEvent> allEvents = testAppender.getAllEvents(); assertThat(allEvents, hasSize(4)); assertThat(allEvents.get(0).getMessage(), equalTo("Processed command: {}")); assertThat(allEvents.get(0).getLevel(), equalTo(Level.INFO)); assertThat(allEvents.get(1).getMessage(), equalTo("Processed command: {}")); assertThat(allEvents.get(1).getLevel(), equalTo(Level.INFO)); assertThat(allEvents.get(2).getMessage(), equalTo("Processed command: {}")); assertThat(allEvents.get(2).getLevel(), equalTo(Level.INFO)); assertThat(allEvents.get(3).getMessage(), equalTo("Command stream complete.")); assertThat(allEvents.get(3).getLevel(), equalTo(Level.INFO)); } }