/*
* Copyright 2004-2014 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.smartbear.soapui.stepdefs.fest.rest.auth;
import com.eviware.soapui.config.CredentialsConfig;
import com.eviware.soapui.impl.rest.OAuth2Profile;
import com.eviware.soapui.support.editor.inspectors.auth.OAuth2Form;
import com.eviware.soapui.support.editor.inspectors.auth.OAuth2GetAccessTokenForm;
import com.eviware.soapui.support.editor.inspectors.auth.ProfileSelectionForm;
import com.smartbear.soapui.stepdefs.fest.ScenarioRobot;
import com.smartbear.soapui.utils.fest.FestMatchers;
import com.smartbear.soapui.utils.fest.FestUtils;
import cucumber.api.java.en.And;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import org.fest.swing.core.Robot;
import org.fest.swing.fixture.DialogFixture;
import org.fest.swing.fixture.FrameFixture;
import org.fest.swing.fixture.JComboBoxFixture;
import org.hamcrest.Matchers;
import java.util.Arrays;
import java.util.List;
import static com.smartbear.soapui.utils.fest.ApplicationUtils.getMainWindow;
import static com.smartbear.soapui.utils.fest.FestMatchers.buttonWithText;
import static com.smartbear.soapui.utils.fest.FestUtils.findDialog;
import static com.smartbear.soapui.utils.fest.FestUtils.verifyButtonIsNotShowing;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.Matchers.hasItemInArray;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
public class OAuth2Stepdefs {
private static final String CLIENT_ID = "client-id";
private static final String CLIENT_SECRET = "client-secret";
private static final String AUTHORIZATION_URI = "authorization-uri";
private static final String ACCESS_TOKEN_URI = "access-token-uri";
private static final String REDIRECT_URI = "redirect-uri";
private static final String SCOPE = "scope";
private static final String ACCESS_TOKEN = "access-token";
private static final String ADVANCED_OPTIONS_DIALOG_NAME = "OAuth 2 Advanced options";
private static final String OAUTH_2_COMBOBOX_ITEM = CredentialsConfig.AuthType.O_AUTH_2_0.toString();
public static final String BUTTON_OK = "OK";
private FrameFixture rootWindow;
private final Robot robot;
public OAuth2Stepdefs(ScenarioRobot runner) {
robot = runner.getRobot();
rootWindow = getMainWindow(robot);
}
@When("^and fills out all fields$")
public void fillInAllOAuth2Fields() {
DialogFixture accessTokenFormDialog = findDialog(OAuth2GetAccessTokenForm.ACCESS_TOKEN_FORM_DIALOG_NAME, robot);
accessTokenFormDialog.textBox(OAuth2Profile.CLIENT_ID_PROPERTY).setText(CLIENT_ID);
accessTokenFormDialog.textBox(OAuth2Profile.CLIENT_SECRET_PROPERTY).setText(CLIENT_SECRET);
accessTokenFormDialog.textBox(OAuth2Profile.AUTHORIZATION_URI_PROPERTY).setText(AUTHORIZATION_URI);
accessTokenFormDialog.textBox(OAuth2Profile.ACCESS_TOKEN_URI_PROPERTY).setText(ACCESS_TOKEN_URI);
accessTokenFormDialog.textBox(OAuth2Profile.REDIRECT_URI_PROPERTY).setText(REDIRECT_URI);
accessTokenFormDialog.textBox(OAuth2Profile.SCOPE_PROPERTY).setText(SCOPE);
}
@When("^switches to another Authorization type and then back again to (.+)$")
public void switchToAnotherAuthorizationTypeAndThenBackAgain(String profileName) {
selectItemInProfileSelectionComboBox(CredentialsConfig.AuthType.NO_AUTHORIZATION.toString());
selectItemInProfileSelectionComboBox(profileName);
}
@When("^user clicks on Advanced options button$")
public void clickOnAdvancedOptionsButton() {
rootWindow.button(OAuth2Form.ADVANCED_OPTIONS_BUTTON_NAME).click();
}
@When("^user selects access token position (.+)$")
public void selectAccessTokenPosition(String accessTokenPosition) {
getAdvancedDialogFixture().radioButton(accessTokenPosition).click();
}
@When("^selects refresh method (.+)$")
public void selectRefreshMethod(String methodName) {
getAdvancedDialogFixture().radioButton(methodName).click();
}
@When("^closes and reopens the advanced options dialog")
public void closeAndReOpenAdvancedOptionsDialog() {
closeAdvancedOptionsDialog();
clickOnAdvancedOptionsButton();
}
@When("^closes the advanced options dialog")
public void closesAdvancedOptionsDialog() {
closeAdvancedOptionsDialog();
}
@When("^enters the access token$")
public void entersTheAccessToken() {
rootWindow.textBox(OAuth2Profile.ACCESS_TOKEN_PROPERTY).setText(ACCESS_TOKEN);
}
@When("^clicks on the disclosure button$")
public void clickOnDisclosureButton() {
rootWindow.label("oAuth2DisclosureButton").click();
}
@When("clicks outside of the Get Access token form$")
public void clickOutsideOfTheGetAccessTokenForm() {
rootWindow.focus();
rootWindow.click();
}
@Then("^the OAuth 2 option is not visible in the Authentication Type dropdown$")
public void verifyThatOAuth2OptionIsNotShownInAuthenticationDropdown() {
assertThat(getAuthorizationTypeComboBox().contents(), not(hasItemInArray(OAUTH_2_COMBOBOX_ITEM)));
}
@Then("^the previously filled fields are still present$")
public void verifyThatThePreviouslyFilledFieldsAreStillPresent() {
DialogFixture accessTokenFormDialog = findDialog(OAuth2GetAccessTokenForm.ACCESS_TOKEN_FORM_DIALOG_NAME,
robot);
assertThat(accessTokenFormDialog.textBox(OAuth2Profile.CLIENT_ID_PROPERTY).text(), is(CLIENT_ID));
assertThat(accessTokenFormDialog.textBox(OAuth2Profile.CLIENT_SECRET_PROPERTY).text(), is(CLIENT_SECRET));
assertThat(accessTokenFormDialog.textBox(OAuth2Profile.AUTHORIZATION_URI_PROPERTY).text(), is(AUTHORIZATION_URI));
assertThat(accessTokenFormDialog.textBox(OAuth2Profile.ACCESS_TOKEN_URI_PROPERTY).text(), is(ACCESS_TOKEN_URI));
assertThat(accessTokenFormDialog.textBox(OAuth2Profile.REDIRECT_URI_PROPERTY).text(), is(REDIRECT_URI));
assertThat(accessTokenFormDialog.textBox(OAuth2Profile.SCOPE_PROPERTY).text(), is(SCOPE));
}
@Then("^access token position is (.+)$")
public void verifyAccessTokenPosition(String expectedAccessTokenPosition) {
getAdvancedDialogFixture().radioButton(expectedAccessTokenPosition).requireSelected();
}
@Then("^refresh method is (.+)$")
public void verifyRefreshMethod(String expectedRefreshMethod) {
getAdvancedDialogFixture().radioButton(expectedRefreshMethod).requireSelected();
}
@Then("^access token is present$")
public void verifyThatAccessTokenIsPresent() {
robot.waitForIdle();
assertThat(rootWindow.textBox(OAuth2Profile.ACCESS_TOKEN_PROPERTY).text(), is(ACCESS_TOKEN));
}
@Then("the Get Access token form is closed$")
public void verifyThatTheAccessTokenFormIsNotVisible() {
FestUtils.verifyDialogIsNotShowing(OAuth2GetAccessTokenForm.ACCESS_TOKEN_FORM_DIALOG_NAME, robot);
}
@When("^the user selects (.+) in the authorization drop down$")
public void selectItemInProfileSelectionComboBox(String itemName) {
JComboBoxFixture comboBox = getProfileSelectionComboBox();
comboBox.selectItem(itemName);
}
@Then("^refresh button is visible$")
public void verifyThatRefreshButtonIsVisible() throws Throwable {
rootWindow.button(OAuth2Form.REFRESH_ACCESS_TOKEN_BUTTON_NAME).requireVisible();
}
@Then("^refresh button is not visible$")
public void verifyThatRefreshButtonIsNotVisible() throws Throwable {
verifyButtonIsNotShowing(rootWindow, OAuth2Form.REFRESH_ACCESS_TOKEN_BUTTON_NAME);
}
@And("^sets refresh method to (.+)$")
public void setRefreshMethod(String methodName) throws Throwable {
clickOnAdvancedOptionsButton();
selectRefreshMethod(methodName);
closeAdvancedOptionsDialog();
}
@And("^selects the OAuth 2 flow (.+)$")
public void selectOAuth2Flow(String flowName) throws Throwable {
DialogFixture accessTokenFormDialog = findDialog(OAuth2GetAccessTokenForm.ACCESS_TOKEN_FORM_DIALOG_NAME,
robot);
accessTokenFormDialog.comboBox(OAuth2GetAccessTokenForm.OAUTH_2_FLOW_COMBO_BOX_NAME).selectItem(flowName);
}
@Then("^(.+) field is not visible$")
public void verifyClientIdFieldIsNotVisible(String fieldName) throws Throwable {
DialogFixture accessTokenFormDialog = findDialog(OAuth2GetAccessTokenForm.ACCESS_TOKEN_FORM_DIALOG_NAME, robot);
FestUtils.verifyTextFieldIsNotShowingInDialog(accessTokenFormDialog, fieldName);
}
@When("^the user creates an OAuth 2.0 profile with name (.+)$")
public void createOAuth2Profile(String profileName) throws Throwable {
selectItemInProfileSelectionComboBox(ProfileSelectionForm.AddEditOptions.ADD.getDescription());
selectAuthType("OAuth 2.0");
setProfileNameAndClickOk(profileName);
}
@When("^the user creates basic authentication profile for authentication type (.+)$")
public void createBasicAuthProfileWithName(String profileName) throws Throwable {
selectItemInProfileSelectionComboBox(ProfileSelectionForm.AddEditOptions.ADD.getDescription());
selectAuthType(profileName);
clickOk(getAuthorizationSelectionDialog());
}
@Then("^new profile selected with name (.+)$")
public void verifyTheProfileIsSelected(String profileName) throws Throwable {
getProfileSelectionComboBox().requireSelection(profileName);
}
@And("^user confirms for deletion$")
public void confirmDeletion() throws Throwable {
FestMatchers.dialogWithTitle(ProfileSelectionForm.DELETE_PROFILE_DIALOG_TITLE)
.using(robot).button(buttonWithText("Yes")).click();
}
@Then("^the profile with name (.+) is deleted$")
public void verifyProfileDoesNotExist(String profileName) throws Throwable {
for (String profile : getProfileSelectionComboBox().contents()) {
assertThat(profileName, is(Matchers.not(profile)));
}
}
@And("^the changes the name to (.+)$")
public void setNewProfileName(String newName) throws Throwable {
DialogFixture renameProfileDialog = FestMatchers.dialogWithTitle(ProfileSelectionForm.RENAME_PROFILE_DIALOG_TITLE)
.using(robot);
renameProfileDialog.textBox().setText(newName);
renameProfileDialog.button(buttonWithText("OK")).click();
}
@Then("^available options in authorization drop down are (.+)$")
public void verifyAddEditOptionsInProfileSelectionComboBox(String values) throws Throwable {
String[] expectedAddEditOptions = (values + "," + ProfileSelectionForm.OPTIONS_SEPARATOR).split(",");
List<String> expectedOptionsList = Arrays.asList(expectedAddEditOptions);
String[] actualOptions = getProfileSelectionComboBox().contents();
for (String actualOption : actualOptions) {
assertThat(expectedOptionsList, hasItem(actualOption));
}
}
@And("^user selects to add new profile$")
public void selectAddNewAuthorizationInProfileSelectionComboBox() throws Throwable {
selectItemInProfileSelectionComboBox(ProfileSelectionForm.AddEditOptions.ADD.getDescription());
}
@And("^closes the authorization type selection dialog$")
public void closeAuthorizationSelectionDialog() throws Throwable {
getAuthorizationSelectionDialog().close();
}
private void closeAdvancedOptionsDialog() {
DialogFixture dialogFixture = getAdvancedDialogFixture();
dialogFixture.button(BUTTON_OK).click();
}
private DialogFixture getAdvancedDialogFixture() {
return rootWindow.dialog(ADVANCED_OPTIONS_DIALOG_NAME);
}
private void setProfileNameAndClickOk(String profileName) {
DialogFixture authorizationSelectionDialog = getAuthorizationSelectionDialog();
authorizationSelectionDialog.textBox("Profile name").setText(profileName);
clickOk(authorizationSelectionDialog);
}
private void clickOk(DialogFixture authorizationSelectionDialog) {
authorizationSelectionDialog.button("OK").click();
}
private void selectAuthType(String authType) {
getAuthorizationTypeComboBox().selectItem(authType);
}
private JComboBoxFixture getAuthorizationTypeComboBox() {
return getAuthorizationSelectionDialog().comboBox("Type");
}
private DialogFixture getAuthorizationSelectionDialog() {
return findDialog("Add Authorization", robot);
}
private JComboBoxFixture getProfileSelectionComboBox() {
JComboBoxFixture comboBox = rootWindow.comboBox(ProfileSelectionForm.PROFILE_COMBO_BOX);
comboBox.focus();
return comboBox;
}
}