package tv.dyndns.kishibe.qmaclone.client.setting;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import tv.dyndns.kishibe.qmaclone.client.ServiceAsync;
import tv.dyndns.kishibe.qmaclone.client.UserData;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketUserData;
import tv.dyndns.kishibe.qmaclone.client.testing.TestDataProvider;
import com.google.api.gwt.client.OAuth2Login;
import com.google.api.gwt.services.plus.shared.Plus;
import com.google.api.gwt.services.plus.shared.Plus.PeopleContext;
import com.google.api.gwt.services.plus.shared.Plus.PeopleContext.GetRequest;
import com.google.api.gwt.services.plus.shared.Plus.PlusAuthScope;
import com.google.api.gwt.services.plus.shared.model.Person;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.web.bindery.requestfactory.shared.RequestContext;
@RunWith(MockitoJUnitRunner.class)
public class PanelSettingUserCodePresenterTest {
private static final String FAKE_GOOGLE_PLUS_ID = "fake google plus id";
private static final int FAKE_USER_CODE_1 = 11111111;
private static final int FAKE_USER_CODE_2 = 22222222;
@Mock
private ServiceAsync mockService;
@Mock
private OAuth2Login mockOAuth2Login;
@Mock
private Plus mockPlus;
@Mock
private PanelSettingUserCodePresenter.View mockView;
@Mock
private PeopleContext mockPeopleContext;
@Mock
private GetRequest mockGetRequest;
@Mock
private RequestContext mockRequestContext;
@Mock
private Person mockPerson;
@Mock
private UserData mockUserData;
private PanelSettingUserCodePresenter presenter;
@Before
public void setUp() throws Exception {
presenter = new PanelSettingUserCodePresenter(mockService, mockOAuth2Login, mockPlus,
mockUserData);
presenter.setView(mockView);
}
@Test
public void onLoadShouldProcessWithoutGooglePlusId() {
when(mockUserData.getGooglePlusId()).thenReturn(null);
presenter.onLoad();
verify(mockView).showConnectButton();
verify(mockView).showShowUserCodeListButton();
}
@Test
public void onLoadShouldProcessWithGooglePlusId() {
when(mockUserData.getGooglePlusId()).thenReturn(FAKE_GOOGLE_PLUS_ID);
presenter.onLoad();
verify(mockView).showAlreadyConnectedMessage();
verify(mockService).lookupUserDataByGooglePlusId(FAKE_GOOGLE_PLUS_ID,
presenter.callbackLookupUserDataByGooglePlusId);
}
@Test
public void callbackLookupUserDataByGooglePlusIdShouldShowBothButtonIfMultipleUserData() {
ImmutableList<PacketUserData> fakeUserDataList = ImmutableList.of(
TestDataProvider.getUserData(), TestDataProvider.getUserData());
presenter.callbackLookupUserDataByGooglePlusId.onSuccess(fakeUserDataList);
verify(mockView).setUserDataList(fakeUserDataList);
verify(mockView).setSwitchToConnectedUserCodeButtonVisible(true);
verify(mockView).setDisconnectUserCodeButtonVisible(true);
}
@Test
public void callbackLookupUserDataByGooglePlusIdShouldShowDisconnectIfOneUserData() {
ImmutableList<PacketUserData> fakeUserDataList = ImmutableList.of(TestDataProvider
.getUserData());
presenter.callbackLookupUserDataByGooglePlusId.onSuccess(fakeUserDataList);
verify(mockView).setUserDataList(fakeUserDataList);
verify(mockView, never()).setSwitchToConnectedUserCodeButtonVisible(true);
verify(mockView).setDisconnectUserCodeButtonVisible(true);
}
@Test
public void callbackLookupUserDataByGooglePlusIdShouldNotShowButtonIfEmpty() {
List<PacketUserData> fakeUserDataList = Lists.newArrayList();
presenter.callbackLookupUserDataByGooglePlusId.onSuccess(fakeUserDataList);
verify(mockView).setUserDataList(fakeUserDataList);
verify(mockView, never()).setSwitchToConnectedUserCodeButtonVisible(true);
verify(mockView, never()).setDisconnectUserCodeButtonVisible(true);
}
@Test
public void switchToUserCodeShouldLoadUserData() {
when(mockView.getUserCode()).thenReturn(String.valueOf(FAKE_USER_CODE_1));
presenter.switchToUserCode();
verify(mockView).setInvalidUserCodeMessageVisible(false);
verify(mockView).setSwitchToUserCodeButtonEnable(false);
verify(mockService).loadUserData(FAKE_USER_CODE_1, presenter.callbackLoadUserData);
}
@Test
public void switchToUserCodeShouldSetInvalidMessage() {
when(mockView.getUserCode()).thenReturn("invalid user code");
presenter.switchToUserCode();
verify(mockView).setInvalidUserCodeMessageVisible(false);
verify(mockView).setSwitchToUserCodeButtonEnable(false);
verify(mockView).setInvalidUserCodeMessageVisible(true);
}
@Test
public void callbackLoadUserDataShouldSetUserCodeAndShowMessage() {
PacketUserData fakeUserData = TestDataProvider.getUserData();
fakeUserData.userCode = FAKE_USER_CODE_1;
presenter.callbackLoadUserData.onSuccess(fakeUserData);
verify(mockView).setSwitchToUserCodeButtonEnable(true);
verify(mockUserData).setUserCode(FAKE_USER_CODE_1);
verify(mockView).showRequiredReloadMessage();
}
@Test
public void callbackLoadUserDataShouldShowInvalidUserCodeMessage() {
presenter.callbackLoadUserData.onSuccess(null);
verify(mockView).setSwitchToUserCodeButtonEnable(true);
verify(mockView).setInvalidUserCodeMessageVisible(true);
}
@Test
public void connectShouldAuthorizeGooglePlusId() {
presenter.connect();
verify(mockView).setConnectButtonEnable(false);
verify(mockOAuth2Login).authorize(PanelSettingUserCodePresenter.CLIENT_ID,
PlusAuthScope.PLUS_ME, presenter.callbackAuthorize);
}
@Test
public void callbackAuthorizeShouldGetMyProfile() {
when(mockPlus.people()).thenReturn(mockPeopleContext);
when(mockPeopleContext.get(PanelSettingUserCodePresenter.USER_ID_ME))
.thenReturn(mockGetRequest);
when(mockGetRequest.to(presenter.receiverGet)).thenReturn(mockRequestContext);
presenter.callbackAuthorize.onSuccess(null);
verify(mockRequestContext).fire();
}
@Test
public void receiverGetShouldSetGooglePlusIdAndShowMessage() {
when(mockPerson.getId()).thenReturn(FAKE_GOOGLE_PLUS_ID);
presenter.connect();
presenter.receiverGet.onSuccess(mockPerson);
verify(mockService).lookupUserDataByGooglePlusId(FAKE_GOOGLE_PLUS_ID,
presenter.callbackLookupUserDataByGooglePlusId);
verify(mockUserData).setGooglePlusId(FAKE_GOOGLE_PLUS_ID);
verify(mockUserData).save();
}
@Test
public void receiverGetShouldUpdateUserCodeList() {
when(mockPerson.getId()).thenReturn(FAKE_GOOGLE_PLUS_ID);
presenter.showUserCodeList();
presenter.receiverGet.onSuccess(mockPerson);
verify(mockService).lookupUserDataByGooglePlusId(FAKE_GOOGLE_PLUS_ID,
presenter.callbackLookupUserDataByGooglePlusId);
}
@Test
public void showUserCodeListShouldAuthorize() {
presenter.showUserCodeList();
verify(mockView).setShowUserCodeListButtonEnable(false);
verify(mockOAuth2Login).authorize(PanelSettingUserCodePresenter.CLIENT_ID,
PlusAuthScope.PLUS_ME, presenter.callbackAuthorize);
}
@Test
public void switchToConnectedUserCodeShouldSetUserCode() {
when(mockView.getSelectedUserCode()).thenReturn(FAKE_USER_CODE_1);
presenter.switchToConnectedUserCode();
verify(mockView).setSwitchToUserCodeButtonEnable(false);
verify(mockUserData).setUserCode(FAKE_USER_CODE_1);
verify(mockView).showRequiredReloadMessage();
}
@Test
public void disconnectUserCodeShouldCallRpc() {
when(mockView.getSelectedUserCode()).thenReturn(FAKE_USER_CODE_1);
when(mockUserData.getUserCode()).thenReturn(FAKE_USER_CODE_2);
presenter.disconnectUserCode();
verify(mockView).setDisconnectUserCodeButtonEnabled(false);
verify(mockService).disconnectUserCode(FAKE_USER_CODE_1, presenter.callbackDisconnectUserCode);
}
@Test
public void disconnectUserCodeShouldRequireReloadIfMine() {
when(mockView.getSelectedUserCode()).thenReturn(FAKE_USER_CODE_1);
when(mockUserData.getUserCode()).thenReturn(FAKE_USER_CODE_1);
presenter.disconnectUserCode();
verify(mockView).setDisconnectUserCodeButtonEnabled(false);
verify(mockService).disconnectUserCode(FAKE_USER_CODE_1, presenter.callbackDisconnectUserCode);
verify(mockView).showRequiredReloadMessage();
}
@Test
public void callbackDisconnectUserCodeShouldUpdateUserCodeList() {
when(mockUserData.getGooglePlusId()).thenReturn(FAKE_GOOGLE_PLUS_ID);
presenter.callbackDisconnectUserCode.onSuccess(null);
verify(mockService).lookupUserDataByGooglePlusId(FAKE_GOOGLE_PLUS_ID,
presenter.callbackLookupUserDataByGooglePlusId);
verify(mockView).setDisconnectUserCodeButtonEnabled(true);
}
}