From 46a02da29009e217f67d89b1086c1f0fa3988b8a Mon Sep 17 00:00:00 2001 From: Thisara-Welmilla Date: Fri, 8 Nov 2024 10:34:18 +0530 Subject: [PATCH 1/7] Add unit tests for user defined federated Authenticators. --- .../api/server/idp/v1/IdPSuccessTest.java | 60 +++++++ .../idp/v1/model/AuthenticationType.java | 162 ++++++++++++++++++ .../api/server/idp/v1/model/Endpoint.java | 114 ++++++++++++ .../model/FederatedAuthenticatorRequest.java | 92 +++++++++- .../util/UserDefinedAuthenticatorPayload.java | 77 +++++++++ .../idp/v1/add-idp-with-custom-fed-auth.json | 38 ++++ 6 files changed, 539 insertions(+), 4 deletions(-) create mode 100644 modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/AuthenticationType.java create mode 100644 modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/Endpoint.java create mode 100644 modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/util/UserDefinedAuthenticatorPayload.java create mode 100644 modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/add-idp-with-custom-fed-auth.json diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java index ba7dfcc0609..811a8aabed9 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java @@ -29,6 +29,10 @@ import org.testng.annotations.Factory; import org.testng.annotations.Test; import org.wso2.carbon.automation.engine.context.TestUserMode; +import org.wso2.identity.integration.test.rest.api.server.idp.v1.model.AuthenticationType; +import org.wso2.identity.integration.test.rest.api.server.idp.v1.model.Endpoint; +import org.wso2.identity.integration.test.rest.api.server.idp.v1.model.FederatedAuthenticatorRequest; +import org.wso2.identity.integration.test.rest.api.server.idp.v1.util.UserDefinedAuthenticatorPayload; import java.io.IOException; import java.util.HashMap; @@ -45,7 +49,19 @@ public class IdPSuccessTest extends IdPTestBase { private String idPId; + private String customIdPId; private String idPTemplateId; + private UserDefinedAuthenticatorPayload userDefinedAuthenticatorPayload; + private String idpCreatePayload; + + private static final String FEDERATED_AUTHENTICATOR_ID_PLACEHOLDER = ""; + private static final String FEDERATED_AUTHENTICATOR_PLACEHOLDER = "\"\""; + private static final String FEDERATED_AUTHENTICATOR_ID = "Y3VzdG9tQXV0aGVudGljYXRvcg=="; + private static final String ENDPOINT_URI = "https://abc.com/authenticate"; + private static final String USERNAME = "username"; + private static final String PASSWORD = "password"; + private static final String USERNAME_VALUE = "testUser"; + private static final String PASSWORD_VALUE = "testPassword"; @Factory(dataProvider = "restAPIUserConfigProvider") public IdPSuccessTest(TestUserMode userMode) throws Exception { @@ -61,6 +77,30 @@ public IdPSuccessTest(TestUserMode userMode) throws Exception { public void init() throws IOException { super.testInit(API_VERSION, swaggerDefinition, tenant); + userDefinedAuthenticatorPayload = createUserDefinedAuthenticatorPayload(); + idpCreatePayload = readResource("add-idp-with-custom-fed-auth.json"); + + } + + private UserDefinedAuthenticatorPayload createUserDefinedAuthenticatorPayload() { + + UserDefinedAuthenticatorPayload userDefinedAuthenticatorPayload = new UserDefinedAuthenticatorPayload(); + userDefinedAuthenticatorPayload.setIsEnabled(true); + userDefinedAuthenticatorPayload.setAuthenticatorId(FEDERATED_AUTHENTICATOR_ID); + userDefinedAuthenticatorPayload.setDefinedBy(FederatedAuthenticatorRequest.DefinedByEnum.USER.toString()); + + Endpoint endpoint = new Endpoint(); + endpoint.setUri(ENDPOINT_URI); + AuthenticationType authenticationType = new AuthenticationType(); + authenticationType.setType(AuthenticationType.TypeEnum.BASIC); + Map properties = new HashMap<>(); + properties.put(USERNAME, USERNAME_VALUE); + properties.put(PASSWORD, PASSWORD_VALUE); + authenticationType.setProperties(properties); + endpoint.authentication(authenticationType); + userDefinedAuthenticatorPayload.setEndpoint(endpoint); + + return userDefinedAuthenticatorPayload; } @AfterClass(alwaysRun = true) @@ -256,6 +296,26 @@ public void testGetMetaOutboundConnector() throws IOException { .body("rulesEnabled", equalTo(false)); } + @Test + public void testAddIdPWithUserDefinedAuthenticator() throws IOException { + + String body = idpCreatePayload.replace(FEDERATED_AUTHENTICATOR_ID_PLACEHOLDER, + userDefinedAuthenticatorPayload.getAuthenticatorId()); + body = body.replace(FEDERATED_AUTHENTICATOR_PLACEHOLDER, + userDefinedAuthenticatorPayload.convertToJasonPayload()); + Response response = getResponseOfPost(IDP_API_BASE_PATH, body); + response.then() + .log().ifValidationFails() + .assertThat() + .statusCode(HttpStatus.SC_CREATED) + .header(HttpHeaders.LOCATION, notNullValue()); + + String location = response.getHeader(HttpHeaders.LOCATION); + assertNotNull(location); + customIdPId = location.substring(location.lastIndexOf("/") + 1); + assertNotNull(customIdPId); + } + @Test(dependsOnMethods = {"testGetMetaOutboundConnector"}) public void testAddIdP() throws IOException { diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/AuthenticationType.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/AuthenticationType.java new file mode 100644 index 00000000000..67232e2a518 --- /dev/null +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/AuthenticationType.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you 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 org.wso2.identity.integration.test.rest.api.server.idp.v1.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class AuthenticationType { + + + @XmlType(name="TypeEnum") + @XmlEnum(String.class) + public enum TypeEnum { + + @XmlEnumValue("NONE") NONE(String.valueOf("NONE")), @XmlEnumValue("BEARER") BEARER(String.valueOf("BEARER")), @XmlEnumValue("API_KEY") API_KEY(String.valueOf("API_KEY")), @XmlEnumValue("BASIC") BASIC(String.valueOf("BASIC")); + + + private String value; + + TypeEnum(String v) { + value = v; + } + + public String value() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + public static TypeEnum fromValue(String value) { + for (TypeEnum b : TypeEnum.values()) { + if (b.value.equals(value)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } + } + + private TypeEnum type; + private Map properties = new HashMap<>(); + + + /** + **/ + public AuthenticationType type(TypeEnum type) { + + this.type = type; + return this; + } + + @ApiModelProperty(example = "BASIC", required = true, value = "") + @JsonProperty("type") + @Valid + @NotNull(message = "Property type cannot be null.") + + public TypeEnum getType() { + return type; + } + public void setType(TypeEnum type) { + this.type = type; + } + + /** + **/ + public AuthenticationType properties(Map properties) { + + this.properties = properties; + return this; + } + + @ApiModelProperty(example = "{\"username\":\"auth_username\",\"password\":\"auth_password\"}", required = true, value = "") + @JsonProperty("properties") + @Valid + @NotNull(message = "Property properties cannot be null.") + + public Map getProperties() { + return properties; + } + public void setProperties(Map properties) { + this.properties = properties; + } + + + public AuthenticationType putPropertiesItem(String key, Object propertiesItem) { + this.properties.put(key, propertiesItem); + return this; + } + + + + @Override + public boolean equals(java.lang.Object o) { + + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AuthenticationType authenticationType = (AuthenticationType) o; + return Objects.equals(this.type, authenticationType.type) && + Objects.equals(this.properties, authenticationType.properties); + } + + @Override + public int hashCode() { + return Objects.hash(type, properties); + } + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + sb.append("class AuthenticationType {\n"); + + sb.append(" type: ").append(toIndentedString(type)).append("\n"); + sb.append(" properties: ").append(toIndentedString(properties)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n"); + } +} diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/Endpoint.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/Endpoint.java new file mode 100644 index 00000000000..66be70e6f61 --- /dev/null +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/Endpoint.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you 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 org.wso2.identity.integration.test.rest.api.server.idp.v1.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.Valid; +import javax.validation.constraints.Pattern; +import java.util.Objects; + +public class Endpoint { + + private String uri; + private AuthenticationType authentication; + + /** + **/ + public Endpoint uri(String uri) { + + this.uri = uri; + return this; + } + + @ApiModelProperty(example = "https://abc.com/token", value = "") + @JsonProperty("uri") + @Valid + @Pattern(regexp="^https?://.+") + public String getUri() { + return uri; + } + public void setUri(String uri) { + this.uri = uri; + } + + /** + **/ + public Endpoint authentication(AuthenticationType authentication) { + + this.authentication = authentication; + return this; + } + + @ApiModelProperty(value = "") + @JsonProperty("authentication") + @Valid + public AuthenticationType getAuthentication() { + return authentication; + } + public void setAuthentication(AuthenticationType authentication) { + this.authentication = authentication; + } + + + + @Override + public boolean equals(java.lang.Object o) { + + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Endpoint endpoint = (Endpoint) o; + return Objects.equals(this.uri, endpoint.uri) && + Objects.equals(this.authentication, endpoint.authentication); + } + + @Override + public int hashCode() { + return Objects.hash(uri, authentication); + } + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + sb.append("class Endpoint {\n"); + + sb.append(" uri: ").append(toIndentedString(uri)).append("\n"); + sb.append(" authentication: ").append(toIndentedString(authentication)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n"); + } +} diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/FederatedAuthenticatorRequest.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/FederatedAuthenticatorRequest.java index d281b5611fb..9c49cdfdbf2 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/FederatedAuthenticatorRequest.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/model/FederatedAuthenticatorRequest.java @@ -23,6 +23,9 @@ import org.wso2.identity.integration.test.rest.api.server.application.management.v1.model.OpenIDConnectConfiguration; import javax.validation.Valid; +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -107,6 +110,38 @@ public String toString() { "}"; } + @XmlType(name="DefinedByEnum") + @XmlEnum(String.class) + public enum DefinedByEnum { + + @XmlEnumValue("SYSTEM") SYSTEM(String.valueOf("SYSTEM")), @XmlEnumValue("USER") USER(String.valueOf("USER")); + + + private String value; + + DefinedByEnum(String v) { + value = v; + } + + public String value() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + public static DefinedByEnum fromValue(String value) { + for (DefinedByEnum b : DefinedByEnum.values()) { + if (b.value.equals(value)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } + } + /** * Convert the given object to string with each line indented by 4 spaces * (except the first line). @@ -125,6 +160,8 @@ public static class FederatedAuthenticator { private Boolean isEnabled = false; private Boolean isDefault = false; private List properties = null; + private DefinedByEnum definedBy; + private Endpoint endpoint; /** * @@ -234,16 +271,63 @@ public FederatedAuthenticator addProperty(Property property) { return this; } + /** + * + **/ + public FederatedAuthenticator definedBy(DefinedByEnum definedBy) { + + this.definedBy = definedBy; + return this; + } + + @ApiModelProperty(value = "") + @JsonProperty("definedBy") + @Valid + public DefinedByEnum getDefinedBy() { + return definedBy; + } + public void setDefinedBy(DefinedByEnum definedBy) { + this.definedBy = definedBy; + } + + /** + **/ + public FederatedAuthenticator endpoint(Endpoint endpoint) { + + this.endpoint = endpoint; + return this; + } + + @ApiModelProperty(value = "") + @JsonProperty("endpoint") + @Valid + public Endpoint getEndpoint() { + return endpoint; + } + public void setEndpoint(Endpoint endpoint) { + this.endpoint = endpoint; + } + @Override public String toString() { - return "class FederatedAuthenticator {\n" + + String classToString = "class FederatedAuthenticator {\n" + " authenticatorId: " + toIndentedString(authenticatorId) + "\n" + " name: " + toIndentedString(name) + "\n" + " isEnabled: " + toIndentedString(isEnabled) + "\n" + - " isDefault: " + toIndentedString(isDefault) + "\n" + - " properties: " + toIndentedString(properties) + "\n" + - "}"; + + " isDefault: " + toIndentedString(isDefault) + "\n"; + if (properties != null) { + classToString += " properties: " + toIndentedString(properties) + "\n"; + } + if (definedBy != null) { + classToString += " definedBy: " + toIndentedString(definedBy) + "\n"; + } + if (endpoint != null) { + classToString += " endpoint: " + toIndentedString(endpoint) + "\n"; + } + + return classToString + "}"; } } } diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/util/UserDefinedAuthenticatorPayload.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/util/UserDefinedAuthenticatorPayload.java new file mode 100644 index 00000000000..79bcb71aec3 --- /dev/null +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/util/UserDefinedAuthenticatorPayload.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you 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 org.wso2.identity.integration.test.rest.api.server.idp.v1.util; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.wso2.identity.integration.test.rest.api.server.idp.v1.model.Endpoint; + +public class UserDefinedAuthenticatorPayload { + + @JsonProperty("isEnabled") + private Boolean isEnabled; + + @JsonProperty("authenticatorId") + private String authenticatorId; + + @JsonProperty("definedBy") + private String definedBy; + + @JsonProperty("endpoint") + private Endpoint endpoint; + + public Boolean getIsEnabled() { + return isEnabled; + } + + public void setIsEnabled(Boolean isEnabled) { + this.isEnabled = isEnabled; + } + + public String getAuthenticatorId() { + return authenticatorId; + } + + public void setAuthenticatorId(String authenticatorId) { + this.authenticatorId = authenticatorId; + } + + public String getDefinedBy() { + return definedBy; + } + + public void setDefinedBy(String definedBy) { + this.definedBy = definedBy; + } + + public Endpoint getEndpoint() { + return endpoint; + } + + public void setEndpoint(Endpoint endpoint) { + this.endpoint = endpoint; + } + + public String convertToJasonPayload() throws JsonProcessingException { + + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.writeValueAsString(this); + } +} diff --git a/modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/add-idp-with-custom-fed-auth.json b/modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/add-idp-with-custom-fed-auth.json new file mode 100644 index 00000000000..81f6fb6aaa6 --- /dev/null +++ b/modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/add-idp-with-custom-fed-auth.json @@ -0,0 +1,38 @@ +{ + "name": "Custom Auth IDP", + "description": "IdP with user defined federated authenticator", + "image": "https://example.com/image", + "isPrimary": false, + "isFederationHub": false, + "homeRealmIdentifier": "localhost", + "alias": "https://localhost:9444/oauth2/token", + "claims": { + "userIdClaim": { + "uri": "http://wso2.org/claims/username" + }, + "roleClaim": { + "uri": "http://wso2.org/claims/role" + }, + "provisioningClaims": [ + { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "defaultValue": "sathya" + } + ] + }, + "federatedAuthenticators": { + "defaultAuthenticatorId": "", + "authenticators": [ + "" + ] + }, + "provisioning": { + "jit": { + "isEnabled": true, + "scheme": "PROVISION_SILENTLY", + "userstore": "PRIMARY" + } + } +} From 4a3c4da0d1da2ffb2276a950e67fd6b4744b8c4b Mon Sep 17 00:00:00 2001 From: Shenali Date: Wed, 27 Nov 2024 01:01:51 +0530 Subject: [PATCH 2/7] Add success API tests for IdPs with user defined authenticators --- .../api/server/idp/v1/IdPSuccessTest.java | 82 ++++++++++++++++++- .../server/idp/v1/empty-custom-fed-auth.json | 4 + 2 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/empty-custom-fed-auth.json diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java index 811a8aabed9..73ff5128f03 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java @@ -35,6 +35,7 @@ import org.wso2.identity.integration.test.rest.api.server.idp.v1.util.UserDefinedAuthenticatorPayload; import java.io.IOException; +import java.util.Base64; import java.util.HashMap; import java.util.Map; @@ -53,10 +54,11 @@ public class IdPSuccessTest extends IdPTestBase { private String idPTemplateId; private UserDefinedAuthenticatorPayload userDefinedAuthenticatorPayload; private String idpCreatePayload; - private static final String FEDERATED_AUTHENTICATOR_ID_PLACEHOLDER = ""; private static final String FEDERATED_AUTHENTICATOR_PLACEHOLDER = "\"\""; - private static final String FEDERATED_AUTHENTICATOR_ID = "Y3VzdG9tQXV0aGVudGljYXRvcg=="; + private static final String IDP_NAME_PLACEHOLDER = ""; + private static final String FEDERATED_AUTHENTICATOR_ID = "Y3VzdG9tQXV0aGVudGljYXRvcg"; + private static final String IDP_NAME = "Custom Auth IDP"; private static final String ENDPOINT_URI = "https://abc.com/authenticate"; private static final String USERNAME = "username"; private static final String PASSWORD = "password"; @@ -103,6 +105,27 @@ private UserDefinedAuthenticatorPayload createUserDefinedAuthenticatorPayload() return userDefinedAuthenticatorPayload; } + private UserDefinedAuthenticatorPayload createUserDefinedAuthenticatorPayload(String endpointUri) { + + UserDefinedAuthenticatorPayload userDefinedAuthenticatorPayload = new UserDefinedAuthenticatorPayload(); + userDefinedAuthenticatorPayload.setIsEnabled(true); + userDefinedAuthenticatorPayload.setAuthenticatorId(FEDERATED_AUTHENTICATOR_ID); + userDefinedAuthenticatorPayload.setDefinedBy(FederatedAuthenticatorRequest.DefinedByEnum.USER.toString()); + + Endpoint endpoint = new Endpoint(); + endpoint.setUri(endpointUri); + AuthenticationType authenticationType = new AuthenticationType(); + authenticationType.setType(AuthenticationType.TypeEnum.BASIC); + Map properties = new HashMap<>(); + properties.put(USERNAME, USERNAME_VALUE); + properties.put(PASSWORD, PASSWORD_VALUE); + authenticationType.setProperties(properties); + endpoint.authentication(authenticationType); + userDefinedAuthenticatorPayload.setEndpoint(endpoint); + + return userDefinedAuthenticatorPayload; + } + @AfterClass(alwaysRun = true) public void testConclude() { @@ -303,6 +326,7 @@ public void testAddIdPWithUserDefinedAuthenticator() throws IOException { userDefinedAuthenticatorPayload.getAuthenticatorId()); body = body.replace(FEDERATED_AUTHENTICATOR_PLACEHOLDER, userDefinedAuthenticatorPayload.convertToJasonPayload()); + body = body.replace(IDP_NAME_PLACEHOLDER, IDP_NAME); Response response = getResponseOfPost(IDP_API_BASE_PATH, body); response.then() .log().ifValidationFails() @@ -316,6 +340,60 @@ public void testAddIdPWithUserDefinedAuthenticator() throws IOException { assertNotNull(customIdPId); } + @Test(dependsOnMethods = "testAddIdPWithUserDefinedAuthenticator") + public void testGetUserDefinedAuthenticatorsOfIdP() { + + Response response = getResponseOfGet(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId + + PATH_SEPARATOR + IDP_FEDERATED_AUTHENTICATORS_PATH); + + response.then() + .log().ifValidationFails() + .assertThat() + .statusCode(HttpStatus.SC_OK) + .body("defaultAuthenticatorId", equalTo(FEDERATED_AUTHENTICATOR_ID)) + .body("authenticators.find { it.authenticatorId == '" + FEDERATED_AUTHENTICATOR_ID + "' }.name", + equalTo(new String(Base64.getDecoder().decode(FEDERATED_AUTHENTICATOR_ID)))) + .body("authenticators.find { it.authenticatorId == '" + FEDERATED_AUTHENTICATOR_ID + "' }.isEnabled", + equalTo(true)); + } + + @Test(dependsOnMethods = "testAddIdPWithUserDefinedAuthenticator") + public void testUpdateUserDefinedAuthenticatorOfIdP() { + + // TODO: check the OpenAPI validation + // The following patch request fails from OpenAPI validations, as the response object does not contains + // "authentication" field in the "endpoint" object. + Response response = getResponseOfPut(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId + + PATH_SEPARATOR + IDP_FEDERATED_AUTHENTICATORS_PATH + PATH_SEPARATOR + FEDERATED_AUTHENTICATOR_ID, + createUserDefinedAuthenticatorPayload(UPDATED_ENDPOINT_URI).toString()); + + response.then() + .log().ifValidationFails() + .assertThat() + .statusCode(HttpStatus.SC_OK) + .body("authenticatorId", equalTo(FEDERATED_AUTHENTICATOR_ID)) + .body("name", equalTo(new String(Base64.getDecoder().decode(FEDERATED_AUTHENTICATOR_ID)))) + .body("endpoint.uri", equalTo(UPDATED_ENDPOINT_URI)); + } + + @Test(dependsOnMethods = "testAddIdPWithUserDefinedAuthenticator") + public void testDeleteUserDefinedAuthenticatorOfIdP() throws IOException { + + // TODO: check the behaviour of the DELETE functionality + // When a put request is tried with empty authenticators list, postman request is successful + // but this put request fails from openAPI validation saying + // "Provided request body content is not in the expected format." + Response response = getResponseOfPut(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId + + PATH_SEPARATOR + IDP_FEDERATED_AUTHENTICATORS_PATH + PATH_SEPARATOR + + FEDERATED_AUTHENTICATOR_ID, readResource("empty-custom-fed-auth.json")); + + response.then() + .log().ifValidationFails() + .assertThat() + .statusCode(HttpStatus.SC_OK) // Receiving 400 + .body("authenticators", nullValue()); + } + @Test(dependsOnMethods = {"testGetMetaOutboundConnector"}) public void testAddIdP() throws IOException { diff --git a/modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/empty-custom-fed-auth.json b/modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/empty-custom-fed-auth.json new file mode 100644 index 00000000000..b519af81612 --- /dev/null +++ b/modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/empty-custom-fed-auth.json @@ -0,0 +1,4 @@ +{ + "authenticators": [], + "defaultAuthenticatorId": "" +} \ No newline at end of file From 75c6c8f67d4ee8595478f838cf1707e41a833eda Mon Sep 17 00:00:00 2001 From: Shenali Date: Thu, 28 Nov 2024 16:11:00 +0530 Subject: [PATCH 3/7] Improve success test cases --- .../api/server/idp/v1/IdPSuccessTest.java | 63 +++++++++---------- 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java index 73ff5128f03..97ec40860fa 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java @@ -17,6 +17,7 @@ package org.wso2.identity.integration.test.rest.api.server.idp.v1; import io.restassured.RestAssured; +import io.restassured.parsing.Parser; import io.restassured.response.Response; import org.apache.commons.lang.StringUtils; import org.apache.http.HttpHeaders; @@ -49,11 +50,6 @@ */ public class IdPSuccessTest extends IdPTestBase { - private String idPId; - private String customIdPId; - private String idPTemplateId; - private UserDefinedAuthenticatorPayload userDefinedAuthenticatorPayload; - private String idpCreatePayload; private static final String FEDERATED_AUTHENTICATOR_ID_PLACEHOLDER = ""; private static final String FEDERATED_AUTHENTICATOR_PLACEHOLDER = "\"\""; private static final String IDP_NAME_PLACEHOLDER = ""; @@ -64,6 +60,11 @@ public class IdPSuccessTest extends IdPTestBase { private static final String PASSWORD = "password"; private static final String USERNAME_VALUE = "testUser"; private static final String PASSWORD_VALUE = "testPassword"; + private String idPId; + private String customIdPId; + private String idPTemplateId; + private UserDefinedAuthenticatorPayload userDefinedAuthenticatorPayload; + private String idpCreatePayload; @Factory(dataProvider = "restAPIUserConfigProvider") public IdPSuccessTest(TestUserMode userMode) throws Exception { @@ -81,7 +82,6 @@ public void init() throws IOException { super.testInit(API_VERSION, swaggerDefinition, tenant); userDefinedAuthenticatorPayload = createUserDefinedAuthenticatorPayload(); idpCreatePayload = readResource("add-idp-with-custom-fed-auth.json"); - } private UserDefinedAuthenticatorPayload createUserDefinedAuthenticatorPayload() { @@ -322,6 +322,7 @@ public void testGetMetaOutboundConnector() throws IOException { @Test public void testAddIdPWithUserDefinedAuthenticator() throws IOException { + RestAssured.defaultParser = Parser.JSON; String body = idpCreatePayload.replace(FEDERATED_AUTHENTICATOR_ID_PLACEHOLDER, userDefinedAuthenticatorPayload.getAuthenticatorId()); body = body.replace(FEDERATED_AUTHENTICATOR_PLACEHOLDER, @@ -357,41 +358,33 @@ public void testGetUserDefinedAuthenticatorsOfIdP() { equalTo(true)); } - @Test(dependsOnMethods = "testAddIdPWithUserDefinedAuthenticator") - public void testUpdateUserDefinedAuthenticatorOfIdP() { - - // TODO: check the OpenAPI validation - // The following patch request fails from OpenAPI validations, as the response object does not contains - // "authentication" field in the "endpoint" object. - Response response = getResponseOfPut(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId + - PATH_SEPARATOR + IDP_FEDERATED_AUTHENTICATORS_PATH + PATH_SEPARATOR + FEDERATED_AUTHENTICATOR_ID, - createUserDefinedAuthenticatorPayload(UPDATED_ENDPOINT_URI).toString()); - - response.then() - .log().ifValidationFails() - .assertThat() - .statusCode(HttpStatus.SC_OK) - .body("authenticatorId", equalTo(FEDERATED_AUTHENTICATOR_ID)) - .body("name", equalTo(new String(Base64.getDecoder().decode(FEDERATED_AUTHENTICATOR_ID)))) - .body("endpoint.uri", equalTo(UPDATED_ENDPOINT_URI)); - } +// @Test(dependsOnMethods = "testAddIdPWithUserDefinedAuthenticator") +// public void testUpdateUserDefinedAuthenticatorOfIdP() throws JsonProcessingException { +// +// // TODO: Check the result with development improvement +// RestAssured.defaultParser = Parser.JSON; +// Response response = getResponseOfPut(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId + +// PATH_SEPARATOR + IDP_FEDERATED_AUTHENTICATORS_PATH + PATH_SEPARATOR + FEDERATED_AUTHENTICATOR_ID, +// createUserDefinedAuthenticatorPayload(UPDATED_ENDPOINT_URI).convertToJasonPayload()); +// +// response.then() +// .log().ifValidationFails() +// .assertThat() +// .statusCode(HttpStatus.SC_OK) +// .body("authenticatorId", equalTo(FEDERATED_AUTHENTICATOR_ID)) +// .body("name", equalTo(new String(Base64.getDecoder().decode(FEDERATED_AUTHENTICATOR_ID)))) +// .body("endpoint.uri", equalTo(UPDATED_ENDPOINT_URI)); +// } - @Test(dependsOnMethods = "testAddIdPWithUserDefinedAuthenticator") - public void testDeleteUserDefinedAuthenticatorOfIdP() throws IOException { + @Test(dependsOnMethods = "testGetUserDefinedAuthenticatorsOfIdP") + public void testDeleteIdPWithUserDefinedAuthenticator() { - // TODO: check the behaviour of the DELETE functionality - // When a put request is tried with empty authenticators list, postman request is successful - // but this put request fails from openAPI validation saying - // "Provided request body content is not in the expected format." - Response response = getResponseOfPut(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId + - PATH_SEPARATOR + IDP_FEDERATED_AUTHENTICATORS_PATH + PATH_SEPARATOR + - FEDERATED_AUTHENTICATOR_ID, readResource("empty-custom-fed-auth.json")); + Response response = getResponseOfDelete(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId); response.then() .log().ifValidationFails() .assertThat() - .statusCode(HttpStatus.SC_OK) // Receiving 400 - .body("authenticators", nullValue()); + .statusCode(HttpStatus.SC_NO_CONTENT); } @Test(dependsOnMethods = {"testGetMetaOutboundConnector"}) From f71392b5530ec7231152e7c1e3ce20376b9ec64c Mon Sep 17 00:00:00 2001 From: Shenali Date: Thu, 28 Nov 2024 23:46:38 +0530 Subject: [PATCH 4/7] Add success API tests for IdPs with user defined authenticators --- .../api/server/idp/v1/IdPSuccessTest.java | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java index 97ec40860fa..31adb855557 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java @@ -16,8 +16,8 @@ package org.wso2.identity.integration.test.rest.api.server.idp.v1; +import com.fasterxml.jackson.core.JsonProcessingException; import io.restassured.RestAssured; -import io.restassured.parsing.Parser; import io.restassured.response.Response; import org.apache.commons.lang.StringUtils; import org.apache.http.HttpHeaders; @@ -56,6 +56,7 @@ public class IdPSuccessTest extends IdPTestBase { private static final String FEDERATED_AUTHENTICATOR_ID = "Y3VzdG9tQXV0aGVudGljYXRvcg"; private static final String IDP_NAME = "Custom Auth IDP"; private static final String ENDPOINT_URI = "https://abc.com/authenticate"; + private static final String UPDATED_ENDPOINT_URI = "https://xyz.com/authenticate"; private static final String USERNAME = "username"; private static final String PASSWORD = "password"; private static final String USERNAME_VALUE = "testUser"; @@ -322,7 +323,6 @@ public void testGetMetaOutboundConnector() throws IOException { @Test public void testAddIdPWithUserDefinedAuthenticator() throws IOException { - RestAssured.defaultParser = Parser.JSON; String body = idpCreatePayload.replace(FEDERATED_AUTHENTICATOR_ID_PLACEHOLDER, userDefinedAuthenticatorPayload.getAuthenticatorId()); body = body.replace(FEDERATED_AUTHENTICATOR_PLACEHOLDER, @@ -358,25 +358,23 @@ public void testGetUserDefinedAuthenticatorsOfIdP() { equalTo(true)); } -// @Test(dependsOnMethods = "testAddIdPWithUserDefinedAuthenticator") -// public void testUpdateUserDefinedAuthenticatorOfIdP() throws JsonProcessingException { -// -// // TODO: Check the result with development improvement -// RestAssured.defaultParser = Parser.JSON; -// Response response = getResponseOfPut(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId + -// PATH_SEPARATOR + IDP_FEDERATED_AUTHENTICATORS_PATH + PATH_SEPARATOR + FEDERATED_AUTHENTICATOR_ID, -// createUserDefinedAuthenticatorPayload(UPDATED_ENDPOINT_URI).convertToJasonPayload()); -// -// response.then() -// .log().ifValidationFails() -// .assertThat() -// .statusCode(HttpStatus.SC_OK) -// .body("authenticatorId", equalTo(FEDERATED_AUTHENTICATOR_ID)) -// .body("name", equalTo(new String(Base64.getDecoder().decode(FEDERATED_AUTHENTICATOR_ID)))) -// .body("endpoint.uri", equalTo(UPDATED_ENDPOINT_URI)); -// } - @Test(dependsOnMethods = "testGetUserDefinedAuthenticatorsOfIdP") + public void testUpdateUserDefinedAuthenticatorOfIdP() throws JsonProcessingException { + + Response response = getResponseOfPut(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId + + PATH_SEPARATOR + IDP_FEDERATED_AUTHENTICATORS_PATH + PATH_SEPARATOR + FEDERATED_AUTHENTICATOR_ID, + createUserDefinedAuthenticatorPayload(UPDATED_ENDPOINT_URI).convertToJasonPayload()); + + response.then() + .log().ifValidationFails() + .assertThat() + .statusCode(HttpStatus.SC_OK) + .body("authenticatorId", equalTo(FEDERATED_AUTHENTICATOR_ID)) + .body("name", equalTo(new String(Base64.getDecoder().decode(FEDERATED_AUTHENTICATOR_ID)))) + .body("endpoint.uri", equalTo(UPDATED_ENDPOINT_URI)); + } + + @Test(dependsOnMethods = "testUpdateUserDefinedAuthenticatorOfIdP") public void testDeleteIdPWithUserDefinedAuthenticator() { Response response = getResponseOfDelete(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId); From 38608298188e4987329c170552b4a0de9fb72daf Mon Sep 17 00:00:00 2001 From: Shenali Date: Sat, 30 Nov 2024 20:29:41 +0530 Subject: [PATCH 5/7] Update test assertions --- .../api/server/idp/v1/IdPSuccessTest.java | 26 ++++++++++++------- .../server/idp/v1/empty-custom-fed-auth.json | 4 --- 2 files changed, 17 insertions(+), 13 deletions(-) delete mode 100644 modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/empty-custom-fed-auth.json diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java index 31adb855557..383aaa76195 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java @@ -57,9 +57,13 @@ public class IdPSuccessTest extends IdPTestBase { private static final String IDP_NAME = "Custom Auth IDP"; private static final String ENDPOINT_URI = "https://abc.com/authenticate"; private static final String UPDATED_ENDPOINT_URI = "https://xyz.com/authenticate"; + private static final String BASIC = "BASIC"; + private static final String BEARER = "BEARER"; private static final String USERNAME = "username"; private static final String PASSWORD = "password"; + private static final String ACCESS_TOKEN = "accessToken"; private static final String USERNAME_VALUE = "testUser"; + private static final String ACCESS_TOKEN_VALUE = "testBearerToken"; private static final String PASSWORD_VALUE = "testPassword"; private String idPId; private String customIdPId; @@ -81,11 +85,11 @@ public IdPSuccessTest(TestUserMode userMode) throws Exception { public void init() throws IOException { super.testInit(API_VERSION, swaggerDefinition, tenant); - userDefinedAuthenticatorPayload = createUserDefinedAuthenticatorPayload(); + userDefinedAuthenticatorPayload = createUserDefinedAuthenticatorPayloadWithBasic(ENDPOINT_URI); idpCreatePayload = readResource("add-idp-with-custom-fed-auth.json"); } - private UserDefinedAuthenticatorPayload createUserDefinedAuthenticatorPayload() { + private UserDefinedAuthenticatorPayload createUserDefinedAuthenticatorPayloadWithBasic(String endpointUri) { UserDefinedAuthenticatorPayload userDefinedAuthenticatorPayload = new UserDefinedAuthenticatorPayload(); userDefinedAuthenticatorPayload.setIsEnabled(true); @@ -93,7 +97,7 @@ private UserDefinedAuthenticatorPayload createUserDefinedAuthenticatorPayload() userDefinedAuthenticatorPayload.setDefinedBy(FederatedAuthenticatorRequest.DefinedByEnum.USER.toString()); Endpoint endpoint = new Endpoint(); - endpoint.setUri(ENDPOINT_URI); + endpoint.setUri(endpointUri); AuthenticationType authenticationType = new AuthenticationType(); authenticationType.setType(AuthenticationType.TypeEnum.BASIC); Map properties = new HashMap<>(); @@ -106,7 +110,7 @@ private UserDefinedAuthenticatorPayload createUserDefinedAuthenticatorPayload() return userDefinedAuthenticatorPayload; } - private UserDefinedAuthenticatorPayload createUserDefinedAuthenticatorPayload(String endpointUri) { + private UserDefinedAuthenticatorPayload createUserDefinedAuthenticatorPayloadWithBearer(String endpointUri) { UserDefinedAuthenticatorPayload userDefinedAuthenticatorPayload = new UserDefinedAuthenticatorPayload(); userDefinedAuthenticatorPayload.setIsEnabled(true); @@ -116,10 +120,10 @@ private UserDefinedAuthenticatorPayload createUserDefinedAuthenticatorPayload(St Endpoint endpoint = new Endpoint(); endpoint.setUri(endpointUri); AuthenticationType authenticationType = new AuthenticationType(); - authenticationType.setType(AuthenticationType.TypeEnum.BASIC); + authenticationType.setType(AuthenticationType.TypeEnum.BEARER); Map properties = new HashMap<>(); - properties.put(USERNAME, USERNAME_VALUE); - properties.put(PASSWORD, PASSWORD_VALUE); + authenticationType.setType(AuthenticationType.TypeEnum.BEARER); + properties.put(ACCESS_TOKEN, ACCESS_TOKEN_VALUE); authenticationType.setProperties(properties); endpoint.authentication(authenticationType); userDefinedAuthenticatorPayload.setEndpoint(endpoint); @@ -354,6 +358,8 @@ public void testGetUserDefinedAuthenticatorsOfIdP() { .body("defaultAuthenticatorId", equalTo(FEDERATED_AUTHENTICATOR_ID)) .body("authenticators.find { it.authenticatorId == '" + FEDERATED_AUTHENTICATOR_ID + "' }.name", equalTo(new String(Base64.getDecoder().decode(FEDERATED_AUTHENTICATOR_ID)))) + .body("authenticators.find { it.authenticatorId == '" + FEDERATED_AUTHENTICATOR_ID + "' }.isEnabled", + equalTo(true)) .body("authenticators.find { it.authenticatorId == '" + FEDERATED_AUTHENTICATOR_ID + "' }.isEnabled", equalTo(true)); } @@ -363,7 +369,8 @@ public void testUpdateUserDefinedAuthenticatorOfIdP() throws JsonProcessingExcep Response response = getResponseOfPut(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId + PATH_SEPARATOR + IDP_FEDERATED_AUTHENTICATORS_PATH + PATH_SEPARATOR + FEDERATED_AUTHENTICATOR_ID, - createUserDefinedAuthenticatorPayload(UPDATED_ENDPOINT_URI).convertToJasonPayload()); + createUserDefinedAuthenticatorPayloadWithBearer(UPDATED_ENDPOINT_URI) + .convertToJasonPayload()); response.then() .log().ifValidationFails() @@ -371,7 +378,8 @@ public void testUpdateUserDefinedAuthenticatorOfIdP() throws JsonProcessingExcep .statusCode(HttpStatus.SC_OK) .body("authenticatorId", equalTo(FEDERATED_AUTHENTICATOR_ID)) .body("name", equalTo(new String(Base64.getDecoder().decode(FEDERATED_AUTHENTICATOR_ID)))) - .body("endpoint.uri", equalTo(UPDATED_ENDPOINT_URI)); + .body("endpoint.uri", equalTo(UPDATED_ENDPOINT_URI)) + .body("endpoint.authentication.type", equalTo(AuthenticationType.TypeEnum.BEARER.value())); } @Test(dependsOnMethods = "testUpdateUserDefinedAuthenticatorOfIdP") diff --git a/modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/empty-custom-fed-auth.json b/modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/empty-custom-fed-auth.json deleted file mode 100644 index b519af81612..00000000000 --- a/modules/integration/tests-integration/tests-backend/src/test/resources/org/wso2/identity/integration/test/rest/api/server/idp/v1/empty-custom-fed-auth.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "authenticators": [], - "defaultAuthenticatorId": "" -} \ No newline at end of file From 250ad09f2a74914b9c89455d5ccca61e8bc8b414 Mon Sep 17 00:00:00 2001 From: Shenali Date: Sun, 1 Dec 2024 18:25:02 +0530 Subject: [PATCH 6/7] Update test cases to check definedBy property --- .../api/server/idp/v1/IdPSuccessTest.java | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java index 383aaa76195..bbd2f26cd8e 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java @@ -40,6 +40,8 @@ import java.util.HashMap; import java.util.Map; +import javax.xml.xpath.XPathExpressionException; + import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.core.IsNull.notNullValue; import static org.hamcrest.core.IsNull.nullValue; @@ -57,8 +59,6 @@ public class IdPSuccessTest extends IdPTestBase { private static final String IDP_NAME = "Custom Auth IDP"; private static final String ENDPOINT_URI = "https://abc.com/authenticate"; private static final String UPDATED_ENDPOINT_URI = "https://xyz.com/authenticate"; - private static final String BASIC = "BASIC"; - private static final String BEARER = "BEARER"; private static final String USERNAME = "username"; private static final String PASSWORD = "password"; private static final String ACCESS_TOKEN = "accessToken"; @@ -346,7 +346,7 @@ public void testAddIdPWithUserDefinedAuthenticator() throws IOException { } @Test(dependsOnMethods = "testAddIdPWithUserDefinedAuthenticator") - public void testGetUserDefinedAuthenticatorsOfIdP() { + public void testGetUserDefinedAuthenticatorsOfIdP() throws XPathExpressionException { Response response = getResponseOfGet(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId + PATH_SEPARATOR + IDP_FEDERATED_AUTHENTICATORS_PATH); @@ -360,8 +360,10 @@ public void testGetUserDefinedAuthenticatorsOfIdP() { equalTo(new String(Base64.getDecoder().decode(FEDERATED_AUTHENTICATOR_ID)))) .body("authenticators.find { it.authenticatorId == '" + FEDERATED_AUTHENTICATOR_ID + "' }.isEnabled", equalTo(true)) - .body("authenticators.find { it.authenticatorId == '" + FEDERATED_AUTHENTICATOR_ID + "' }.isEnabled", - equalTo(true)); + .body("authenticators.find { it.authenticatorId == '" + FEDERATED_AUTHENTICATOR_ID + "' }.self", + equalTo(getTenantedRelativePath("/api/server/v1/identity-providers/" + + customIdPId + "/federated-authenticators/" + FEDERATED_AUTHENTICATOR_ID, + context.getContextTenant().getDomain()))); } @Test(dependsOnMethods = "testGetUserDefinedAuthenticatorsOfIdP") @@ -378,19 +380,30 @@ public void testUpdateUserDefinedAuthenticatorOfIdP() throws JsonProcessingExcep .statusCode(HttpStatus.SC_OK) .body("authenticatorId", equalTo(FEDERATED_AUTHENTICATOR_ID)) .body("name", equalTo(new String(Base64.getDecoder().decode(FEDERATED_AUTHENTICATOR_ID)))) + .body("definedBy", equalTo("USER")) .body("endpoint.uri", equalTo(UPDATED_ENDPOINT_URI)) .body("endpoint.authentication.type", equalTo(AuthenticationType.TypeEnum.BEARER.value())); } - @Test(dependsOnMethods = "testUpdateUserDefinedAuthenticatorOfIdP") + @Test(dependsOnMethods = {"testGetIdPs", "testUpdateUserDefinedAuthenticatorOfIdP"}) public void testDeleteIdPWithUserDefinedAuthenticator() { Response response = getResponseOfDelete(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId); - response.then() .log().ifValidationFails() .assertThat() .statusCode(HttpStatus.SC_NO_CONTENT); + + Response responseOfGet = getResponseOfGet(IDP_API_BASE_PATH + PATH_SEPARATOR + customIdPId); + responseOfGet.then() + .log().ifValidationFails() + .assertThat() + .assertThat() + .statusCode(HttpStatus.SC_NOT_FOUND) + .body("message", equalTo("Resource not found.")) + .body("description", equalTo("Unable to find a resource matching the provided identity " + + "provider identifier " + customIdPId + ".")); + } @Test(dependsOnMethods = {"testGetMetaOutboundConnector"}) @@ -423,6 +436,8 @@ public void testGetIdP() throws IOException { .body("description", equalTo("IDP for Google Federation")) .body("isEnabled", equalTo(true)) .body("isPrimary", equalTo(false)) + .body("federatedAuthenticators.authenticators.find { it.authenticatorId == '" + + SAMPLE_FEDERATED_AUTHENTICATOR_ID + "' }.definedBy", equalTo("SYSTEM")) .body("image", equalTo("google-logo-url")) .body("isFederationHub", equalTo(false)) .body("homeRealmIdentifier", equalTo("localhost")) @@ -433,6 +448,7 @@ public void testGetIdP() throws IOException { public void testGetIdPs() throws Exception { String baseIdentifier = "identityProviders.find{ it.id == '" + idPId + "' }."; + String baseIdentifierUserDef = "identityProviders.find{ it.id == '" + customIdPId + "' }."; Response response = getResponseOfGet(IDP_API_BASE_PATH); response.then() .log().ifValidationFails() @@ -444,6 +460,11 @@ public void testGetIdPs() throws Exception { .body(baseIdentifier + "image", equalTo("google-logo-url")) .body(baseIdentifier + "self", equalTo(getTenantedRelativePath( "/api/server/v1/identity-providers/" + idPId, + context.getContextTenant().getDomain()))) + .body(baseIdentifierUserDef + "name", equalTo(IDP_NAME)) + .body(baseIdentifierUserDef + "isEnabled", equalTo(true)) + .body(baseIdentifierUserDef + "self", equalTo(getTenantedRelativePath( + "/api/server/v1/identity-providers/" + customIdPId, context.getContextTenant().getDomain()))); } From bca65612b8bd18f916d6872a149d6c3824abe953 Mon Sep 17 00:00:00 2001 From: Shenali Date: Tue, 3 Dec 2024 20:37:28 +0530 Subject: [PATCH 7/7] Bump api-server version --- .../test/rest/api/server/idp/v1/IdPSuccessTest.java | 8 ++++---- pom.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java index 3018289bb14..69ca753532a 100644 --- a/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java +++ b/modules/integration/tests-integration/tests-backend/src/test/java/org/wso2/identity/integration/test/rest/api/server/idp/v1/IdPSuccessTest.java @@ -57,7 +57,7 @@ public class IdPSuccessTest extends IdPTestBase { private static final String FEDERATED_AUTHENTICATOR_PLACEHOLDER = "\"\""; private static final String IDP_NAME_PLACEHOLDER = ""; private static final String FEDERATED_AUTHENTICATOR_ID = "Y3VzdG9tQXV0aGVudGljYXRvcg"; - private static final String IDP_NAME = "Custom Auth IDP"; + private static final String CUSTOM_IDP_NAME = "Custom Auth IDP"; private static final String ENDPOINT_URI = "https://abc.com/authenticate"; private static final String UPDATED_ENDPOINT_URI = "https://xyz.com/authenticate"; private static final String USERNAME = "username"; @@ -66,12 +66,12 @@ public class IdPSuccessTest extends IdPTestBase { private static final String USERNAME_VALUE = "testUser"; private static final String ACCESS_TOKEN_VALUE = "testBearerToken"; private static final String PASSWORD_VALUE = "testPassword"; + private static final String IDP_NAME = "Google"; private String idPId; private String customIdPId; private String idPTemplateId; private UserDefinedAuthenticatorPayload userDefinedAuthenticatorPayload; private String idpCreatePayload; - private static final String IDP_NAME = "Google"; @Factory(dataProvider = "restAPIUserConfigProvider") public IdPSuccessTest(TestUserMode userMode) throws Exception { @@ -333,7 +333,7 @@ public void testAddIdPWithUserDefinedAuthenticator() throws IOException { userDefinedAuthenticatorPayload.getAuthenticatorId()); body = body.replace(FEDERATED_AUTHENTICATOR_PLACEHOLDER, userDefinedAuthenticatorPayload.convertToJasonPayload()); - body = body.replace(IDP_NAME_PLACEHOLDER, IDP_NAME); + body = body.replace(IDP_NAME_PLACEHOLDER, CUSTOM_IDP_NAME); Response response = getResponseOfPost(IDP_API_BASE_PATH, body); response.then() .log().ifValidationFails() @@ -463,7 +463,7 @@ public void testGetIdPs() throws Exception { .body(baseIdentifier + "self", equalTo(getTenantedRelativePath( "/api/server/v1/identity-providers/" + idPId, context.getContextTenant().getDomain()))) - .body(baseIdentifierUserDef + "name", equalTo(IDP_NAME)) + .body(baseIdentifierUserDef + "name", equalTo(CUSTOM_IDP_NAME)) .body(baseIdentifierUserDef + "isEnabled", equalTo(true)) .body(baseIdentifierUserDef + "self", equalTo(getTenantedRelativePath( "/api/server/v1/identity-providers/" + customIdPId, diff --git a/pom.xml b/pom.xml index cba25d3ce8a..a3927b787b0 100755 --- a/pom.xml +++ b/pom.xml @@ -2456,7 +2456,7 @@ 2.0.17 - 1.3.2 + 1.3.3 1.3.45 5.5.9