package edu.pdx.cs410J.gwt.client.mvp;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.user.client.rpc.AsyncCallback;
import edu.pdx.cs410J.rmi.Movie;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;
import static edu.pdx.cs410J.gwt.client.mvp.MovieListPresenter.Display;
import static edu.pdx.cs410J.gwt.client.mvp.MovieListPresenter.Display.MovieSelectedHandler;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/**
* Tests the logic of the {@link MovieListPresenter}
*/
public class MovieListPresenterTest extends MovieTestCase {
@Captor
private ArgumentCaptor<AsyncCallback<ArrayList<Movie>>> allMoviesCaptor;
@Before
public void initializeMockito() {
MockitoAnnotations.initMocks(this);
}
/**
* Tests that all movie titles are displayed when the presenter is created
*/
@Test
public void testAllMovieTitlesDisplayed() {
MovieListPresenter.Display view = mock(MovieListPresenter.Display.class);
MovieServiceAsync service = mock(MovieServiceAsync.class);
HandlerManager eventBus = mock(HandlerManager.class);
new MovieListPresenter(view, service, eventBus);
verify(service).getAllMovies(allMoviesCaptor.capture());
List<String> titles = Lists.newArrayList("One", "Two", "Three", "Four");
List<Movie> movies = Lists.transform(titles, new Function<String, Movie>() {
@Override
public Movie apply(String title) {
return newMovie(title, 2010);
}
});
allMoviesCaptor.getValue().onSuccess(Lists.newArrayList(movies));
verify(view).setTitles(titles);
}
/**
* Tests that a {@link DisplayMovieEvent} is fired when a movie is selected
*/
@Test
public void testDisplayMovieEventFiredOnSelection() {
Display view = mock(Display.class);
MovieServiceAsync service = mock(MovieServiceAsync.class);
HandlerManager eventBus = new HandlerManager(null);
DisplayMovieEvent.Handler handler = mock(DisplayMovieEvent.Handler.class);
eventBus.addHandler(DisplayMovieEvent.TYPE, handler);
Movie movie0 = newMovie("Zero", 2010);
Movie movie1 = newMovie("One", 2010);
newPresenter(view, service, eventBus, movie0, movie1);
ArgumentCaptor<MovieSelectedHandler> captor = ArgumentCaptor.forClass(MovieSelectedHandler.class);
verify(view).addMovieSelectedHandler(captor.capture());
captor.getValue().onMovieSelected(0);
verify(handler).onMovieDisplayed(movie0);
captor.getValue().onMovieSelected(1);
verify(handler).onMovieDisplayed(movie1);
}
/**
* Creates a new {@link MovieListPresenter} that displays the given movies
* @param view The presenter's view
* @param service The remote service
* @param eventBus The event bus
* @param movies The movies to show
* @return The presenter
*/
private MovieListPresenter newPresenter(Display view, MovieServiceAsync service, HandlerManager eventBus, Movie... movies) {
MovieListPresenter presenter = new MovieListPresenter(view, service, eventBus);
verify(service).getAllMovies(allMoviesCaptor.capture());
allMoviesCaptor.getValue().onSuccess(Lists.newArrayList(movies));
return presenter;
}
}