/*
* Copyright (C) 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.api.explorer.client.auth;
import com.google.api.explorer.client.AuthManager;
import com.google.api.explorer.client.AuthManager.AuthCompleteCallback;
import com.google.api.explorer.client.AuthManager.AuthToken;
import com.google.api.explorer.client.analytics.AnalyticsManager;
import com.google.api.explorer.client.auth.AuthPresenter.Display;
import com.google.api.explorer.client.auth.AuthPresenter.Display.State;
import com.google.api.explorer.client.base.ApiMethod;
import com.google.api.explorer.client.base.ApiService;
import com.google.api.explorer.client.base.ApiService.AuthInformation;
import com.google.api.explorer.client.base.ApiService.AuthScope;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import junit.framework.TestCase;
import org.easymock.Capture;
import org.easymock.EasyMock;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
/**
* Tests for {@link AuthPresenter}.
*
* @author jasonhall@google.com (Jason Hall)
*/
public class AuthPresenterTest extends TestCase {
private static final Set<String> EMPTY_SCOPES = Collections.emptySet();
private final Display display = EasyMock.createMock(Display.class);
private final AuthManager authManager = EasyMock.createStrictMock(AuthManager.class);
private final ApiService service = EasyMock.createControl().createMock(ApiService.class);
private final AnalyticsManager analytics =
EasyMock.createControl().createMock(AnalyticsManager.class);
/**
* When a ServiceLoadedEvent fires, the Display becomes visible and displays
* the user as un-authenticated by default.
*/
public void testServiceLoadedWithoutAuth() {
ApiMethod method1 = EasyMock.createControl().createMock(ApiMethod.class);
ApiMethod method2 = EasyMock.createControl().createMock(ApiMethod.class);
EasyMock.expect(service.allMethods()).andReturn(
ImmutableMap.of("method.one", method1, "method.two", method2));
EasyMock.expect(service.getName()).andReturn("service");
display.setScopes(Collections.<String, ApiService.AuthScope>emptyMap());
display.setState(State.PUBLIC, EMPTY_SCOPES, EMPTY_SCOPES);
display.preSelectScopes(EMPTY_SCOPES);
EasyMock.replay(display);
@SuppressWarnings("unused")
AuthPresenter presenter = new AuthPresenter(service, authManager, analytics, display);
EasyMock.verify(display);
}
/** Check the flow which sets up the display for auth. */
public void testAuthGranted() {
ApiMethod method1 = EasyMock.createControl().createMock(ApiMethod.class);
ApiMethod method2 = EasyMock.createControl().createMock(ApiMethod.class);
EasyMock.expect(method1.getScopes()).andReturn(ImmutableList.of("scopeName")).anyTimes();
ImmutableSet<String> authScopes = ImmutableSet.of("scopeName");
Map<String, AuthInformation> auth = generateAuthInformation(authScopes);
EasyMock.expect(service.getAuth()).andReturn(auth).anyTimes();
// This is called once for every call to the presenter.
display.setScopes(auth.get("oauth2").getScopes());
EasyMock.expectLastCall().times(2);
// When the presenter is created these will be called.
display.setState(State.PUBLIC, EMPTY_SCOPES, EMPTY_SCOPES);
EasyMock.expectLastCall();
display.preSelectScopes(EMPTY_SCOPES);
EasyMock.expectLastCall();
EasyMock.expect(authManager.getToken(service)).andReturn(null).times(2);
// When the method is set, these will be called.
EasyMock.expect(display.getSelectedScopes()).andReturn(authScopes);
final Capture<AuthCompleteCallback> cbCapture = new Capture<AuthCompleteCallback>();
authManager.requestAuth(
EasyMock.eq(service), EasyMock.eq(authScopes), EasyMock.capture(cbCapture));
EasyMock.expectLastCall();
display.setState(State.PUBLIC, authScopes, EMPTY_SCOPES);
EasyMock.expectLastCall();
display.preSelectScopes(authScopes);
EasyMock.expectLastCall();
// When execute auth is clicked, these will be called.
display.hideScopeDialog();
EasyMock.expectLastCall();
display.setState(State.PRIVATE, authScopes, authScopes);
EasyMock.expectLastCall();
AuthToken token = EasyMock.createMock(AuthToken.class);
EasyMock.expect(token.getScopes()).andReturn(authScopes);
EasyMock.expect(authManager.getToken(service)).andReturn(token);
EasyMock.replay(service, display, method1, method2, authManager, token);
AuthPresenter presenter = new AuthPresenter(service, authManager, analytics, display);
presenter.setStateForMethod(method1);
presenter.clickExecuteAuth();
cbCapture.getValue().complete(token);
EasyMock.verify(display);
}
private Map<String, AuthInformation> generateAuthInformation(Set<String> scopes) {
Map<String, AuthScope> authScopes = Maps.newHashMap();
for (String scopeName : scopes) {
AuthScope mockScope = EasyMock.createMock(AuthScope.class);
EasyMock.replay(mockScope);
authScopes.put(scopeName, mockScope);
}
AuthInformation mockAuth = EasyMock.createMock(AuthInformation.class);
EasyMock.expect(mockAuth.getScopes()).andReturn(authScopes).anyTimes();
EasyMock.replay(mockAuth);
Map<String, AuthInformation> auth = Maps.newHashMap();
auth.put("oauth2", mockAuth);
return auth;
}
}