diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/Authentication.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/Authentication.java index 5cd74bf3c0..05b00246d2 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/Authentication.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/Authentication.java @@ -3,6 +3,7 @@ package org.keycloak.testsuite.console.page.authentication; import org.keycloak.testsuite.console.page.AdminConsoleRealm; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; +import static org.keycloak.testsuite.util.WaitUtils.waitAjaxForElement; /** * @author tkyjovsk @@ -13,6 +14,22 @@ public class Authentication extends AdminConsoleRealm { @FindBy(xpath = "//h1[text()='Authentication']/..") private AuthenticationTabs authenticationTabs; + @FindBy(xpath = "//div[contains(@class, 'alert-danger')]") + private WebElement error; + + @FindBy(xpath = "//div[contains(@class, 'alert-success')]") + private WebElement success; + + public String getSuccessMessage() { + waitAjaxForElement(success); + return success.getText(); + } + + public String getErrorMessage() { + waitAjaxForElement(error); + return error.getText(); + } + public AuthenticationTabs tabs() { return authenticationTabs; } diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/OTPPolicy.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/OTPPolicy.java deleted file mode 100644 index 2a2bfdb57e..0000000000 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/OTPPolicy.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.keycloak.testsuite.console.page.authentication; - -import org.keycloak.testsuite.page.Form; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.FindBy; - -/** - * Created by mhajas on 8/21/15. - */ -public class OTPPolicy extends Authentication { - - @FindBy(linkText = "Save") - private WebElement saveButton; - - public void clickSave() { - saveButton.click(); - } - - @FindBy(linkText = "Cancel") - private WebElement cancelButton; - - @FindBy(id = "lookAhead") - private WebElement lookAheadInput; - - @FindBy(id = "counter") - private WebElement initialCounterInput; - - public void clickCancel() { - cancelButton.click(); - } - - public void setLookAheadInputValue(String value) { - Form.setInputValue(lookAheadInput, value); - } - - public void setInitialcounterInputValue(String value) { - Form.setInputValue(initialCounterInput, value); - } - - public enum OTPTypeSelectValues { - - TIME_BASED("time Based"), COUNTER_BASED("Counter Based"); - - private String name; - - private OTPTypeSelectValues(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } - - public enum OTPHashAlgorithmSelectValues { - - SHA1("SHA1"), SHA256("SHA256"), SHA512("SHA512"); - - private String name; - - private OTPHashAlgorithmSelectValues(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } - - public enum NumberOfDigitsSelectValues { - - NUMBER6("6"), NUMBER8("8"); - - private String name; - - private NumberOfDigitsSelectValues(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } - -} diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/otppolicy/OTPPolicy.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/otppolicy/OTPPolicy.java new file mode 100644 index 0000000000..814ae5450e --- /dev/null +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/otppolicy/OTPPolicy.java @@ -0,0 +1,44 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2012, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.keycloak.testsuite.console.page.authentication.otppolicy; + +import org.jboss.arquillian.graphene.page.Page; +import org.keycloak.testsuite.console.page.authentication.Authentication; + +/** + * + * @author Vlastislav Ramik + */ +public class OTPPolicy extends Authentication { + + @Override + public String getUriFragment() { + return super.getUriFragment() + "/otp-policy"; + } + + @Page + private OTPPolicyForm form; + + public OTPPolicyForm form() { + return form; + } +} diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/otppolicy/OTPPolicyForm.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/otppolicy/OTPPolicyForm.java new file mode 100644 index 0000000000..1e88cb3193 --- /dev/null +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/authentication/otppolicy/OTPPolicyForm.java @@ -0,0 +1,119 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2012, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.keycloak.testsuite.console.page.authentication.otppolicy; + +import org.keycloak.testsuite.page.Form; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.ui.Select; + +/** + * + * @author Vlastislav Ramik + */ +public class OTPPolicyForm extends Form { + + @FindBy(id = "type") + private Select otpType; + + @FindBy(id = "alg") + private Select otpHashAlg; + + @FindBy(id = "digits") + private Select digits; + + @FindBy(id = "lookAhead") + private WebElement lookAhead; + + @FindBy(id = "period") + private WebElement period; + + @FindBy(id = "counter") + private WebElement counter; + + public void setValues(OTPType otpType, OTPHashAlg otpHashAlg, Digits digits, String lookAhead, String periodOrCounter) { + this.otpType.selectByValue(otpType.getName()); + this.otpHashAlg.selectByValue(otpHashAlg.getName()); + this.digits.selectByValue(digits.getName()); + setInputValue(this.lookAhead, lookAhead); + + switch (otpType) { + case TIME_BASED: + setInputValue(period, periodOrCounter); + break; + case COUNTER_BASED: + setInputValue(counter, periodOrCounter); + break; + } + save(); + } + + public enum OTPType { + + TIME_BASED("totp"), + COUNTER_BASED("hotp"); + + private final String name; + + private OTPType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + public enum OTPHashAlg { + + SHA1("HmacSHA1"), + SHA256("HmacSHA256"), + SHA512("HmacSHA512"); + + private final String name; + + private OTPHashAlg(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + public enum Digits { + + EMPTY("? number:6 ?"), + SIX("6"), + EIGHT("8"); + + private final String name; + + private Digits(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } +} diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/authentication/OTPPolicyTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/authentication/OTPPolicyTest.java new file mode 100644 index 0000000000..78045a34f8 --- /dev/null +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/authentication/OTPPolicyTest.java @@ -0,0 +1,117 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2012, Red Hat, Inc., and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.keycloak.testsuite.console.authentication; + +import org.jboss.arquillian.graphene.page.Page; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import org.keycloak.representations.idm.RealmRepresentation; +import org.keycloak.testsuite.arquillian.jira.Jira; +import org.keycloak.testsuite.console.AbstractConsoleTest; +import org.keycloak.testsuite.console.page.authentication.otppolicy.OTPPolicy; +import org.keycloak.testsuite.console.page.authentication.otppolicy.OTPPolicyForm.Digits; +import org.keycloak.testsuite.console.page.authentication.otppolicy.OTPPolicyForm.OTPHashAlg; +import org.keycloak.testsuite.console.page.authentication.otppolicy.OTPPolicyForm.OTPType; + +/** + * + * @author Vlastislav Ramik + */ +public class OTPPolicyTest extends AbstractConsoleTest { + + @Page + private OTPPolicy otpPolicyPage; + + @Before + public void beforeOTPPolicyTest() { + otpPolicyPage.navigateTo(); + } + + @Test + public void otpPolicyTest() { + otpPolicyPage.form().setValues(OTPType.COUNTER_BASED, OTPHashAlg.SHA256, Digits.EIGHT, "10", "50"); + assertEquals("Success! Your changes have been saved to the realm.", otpPolicyPage.getSuccessMessage()); + + RealmRepresentation realm = testRealmResource().toRepresentation(); + assertEquals("hotp", realm.getOtpPolicyType()); + assertEquals("HmacSHA256", realm.getOtpPolicyAlgorithm()); + assertEquals(Integer.valueOf(8), realm.getOtpPolicyDigits()); + assertEquals(Integer.valueOf(10), realm.getOtpPolicyLookAheadWindow()); + assertEquals(Integer.valueOf(50), realm.getOtpPolicyInitialCounter()); + + otpPolicyPage.form().setValues(OTPType.TIME_BASED, OTPHashAlg.SHA512, Digits.EIGHT, "10", "40"); + assertEquals("Success! Your changes have been saved to the realm.", otpPolicyPage.getSuccessMessage()); + + realm = testRealmResource().toRepresentation(); + assertEquals(Integer.valueOf(40), realm.getOtpPolicyPeriod()); + } + + @Test + @Jira(value = "KEYCLOAK-2031") + public void invalidValuesTest() { + otpPolicyPage.form().setValues(OTPType.TIME_BASED, OTPHashAlg.SHA1, Digits.EMPTY, "", "30"); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + otpPolicyPage.form().setValues(OTPType.TIME_BASED, OTPHashAlg.SHA1, Digits.EMPTY, " ", "30"); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + otpPolicyPage.form().setValues(OTPType.TIME_BASED, OTPHashAlg.SHA1, Digits.EMPTY, "no number", "30"); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + otpPolicyPage.form().setValues(OTPType.TIME_BASED, OTPHashAlg.SHA1, Digits.EMPTY, "1 2", "30"); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + RealmRepresentation realm = testRealmResource().toRepresentation(); + assertEquals(Integer.valueOf(1), realm.getOtpPolicyLookAheadWindow()); + + otpPolicyPage.form().setValues(OTPType.TIME_BASED, OTPHashAlg.SHA1, Digits.EMPTY, "1", ""); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + otpPolicyPage.form().setValues(OTPType.TIME_BASED, OTPHashAlg.SHA1, Digits.EMPTY, "1", " "); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + otpPolicyPage.form().setValues(OTPType.TIME_BASED, OTPHashAlg.SHA1, Digits.EMPTY, "1", "no number"); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + otpPolicyPage.form().setValues(OTPType.TIME_BASED, OTPHashAlg.SHA1, Digits.EMPTY, "1", "1 2"); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + realm = testRealmResource().toRepresentation(); + assertEquals(Integer.valueOf(30), realm.getOtpPolicyPeriod()); + + otpPolicyPage.form().setValues(OTPType.COUNTER_BASED, OTPHashAlg.SHA1, Digits.EMPTY, "1", ""); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + otpPolicyPage.form().setValues(OTPType.COUNTER_BASED, OTPHashAlg.SHA1, Digits.EMPTY, "1", " "); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + otpPolicyPage.form().setValues(OTPType.COUNTER_BASED, OTPHashAlg.SHA1, Digits.EMPTY, "1", "no number"); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + otpPolicyPage.form().setValues(OTPType.COUNTER_BASED, OTPHashAlg.SHA1, Digits.EMPTY, "1", "1 2"); + assertEquals("Error! Failed to update test Realm.", otpPolicyPage.getErrorMessage()); + + realm = testRealmResource().toRepresentation(); + assertEquals(Integer.valueOf(0), realm.getOtpPolicyInitialCounter()); + } +}