Removing tests from base group broker mapper test classes
This commit is contained in:
parent
9b01bf382d
commit
1a1ee78dbd
4 changed files with 349 additions and 332 deletions
|
@ -1,209 +0,0 @@
|
||||||
package org.keycloak.testsuite.broker;
|
|
||||||
|
|
||||||
import static org.keycloak.models.IdentityProviderMapperSyncMode.FORCE;
|
|
||||||
import static org.keycloak.models.IdentityProviderMapperSyncMode.IMPORT;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.keycloak.models.IdentityProviderMapperSyncMode;
|
|
||||||
import org.keycloak.representations.idm.IdentityProviderRepresentation;
|
|
||||||
import org.keycloak.representations.idm.UserRepresentation;
|
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="mailto:artur.baltabayev@bosch.io">Artur Baltabayev</a>,
|
|
||||||
* <a href="mailto:daniel.fesenmeyer@bosch.io">Daniel Fesenmeyer</a>
|
|
||||||
*/
|
|
||||||
public abstract class AbstractAdvancedGroupMapperTest extends AbstractGroupMapperTest {
|
|
||||||
|
|
||||||
private static final String CLAIMS_OR_ATTRIBUTES = "[\n" +
|
|
||||||
" {\n" +
|
|
||||||
" \"key\": \"" + KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME + "\",\n" +
|
|
||||||
" \"value\": \"value 1\"\n" +
|
|
||||||
" },\n" +
|
|
||||||
" {\n" +
|
|
||||||
" \"key\": \"" + KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2 + "\",\n" +
|
|
||||||
" \"value\": \"value 2\"\n" +
|
|
||||||
" }\n" +
|
|
||||||
"]";
|
|
||||||
|
|
||||||
private static final String CLAIMS_OR_ATTRIBUTES_REGEX = "[\n" +
|
|
||||||
" {\n" +
|
|
||||||
" \"key\": \"" + KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME + "\",\n" +
|
|
||||||
" \"value\": \"va.*\"\n" +
|
|
||||||
" },\n" +
|
|
||||||
" {\n" +
|
|
||||||
" \"key\": \"" + KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2 + "\",\n" +
|
|
||||||
" \"value\": \"value 2\"\n" +
|
|
||||||
" }\n" +
|
|
||||||
"]";
|
|
||||||
|
|
||||||
private String newValueForAttribute2 = "";
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void allValuesMatch() {
|
|
||||||
createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES, false, MAPPER_TEST_GROUP_PATH);
|
|
||||||
createUserInProviderRealm(createMatchingAttributes());
|
|
||||||
|
|
||||||
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
|
||||||
|
|
||||||
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
|
||||||
assertThatUserHasBeenAssignedToGroup(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void valuesMismatch() {
|
|
||||||
createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES, false, MAPPER_TEST_GROUP_PATH);
|
|
||||||
createUserInProviderRealm(ImmutableMap.<String, List<String>>builder()
|
|
||||||
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME, ImmutableList.<String>builder().add("value 1").build())
|
|
||||||
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2, ImmutableList.<String>builder().add("value mismatch").build())
|
|
||||||
.build());
|
|
||||||
|
|
||||||
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
|
||||||
|
|
||||||
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
|
||||||
assertThatUserHasNotBeenAssignedToGroup(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void valuesMatchIfNoClaimsSpecified() {
|
|
||||||
createAdvancedGroupMapper("[]", false, MAPPER_TEST_GROUP_PATH);
|
|
||||||
createUserInProviderRealm(ImmutableMap.<String, List<String>>builder()
|
|
||||||
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME, ImmutableList.<String>builder().add("some value").build())
|
|
||||||
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2, ImmutableList.<String>builder().add("some value").build())
|
|
||||||
.build());
|
|
||||||
|
|
||||||
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
|
||||||
|
|
||||||
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
|
||||||
assertThatUserHasBeenAssignedToGroup(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void allValuesMatchRegex() {
|
|
||||||
createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES_REGEX, true, MAPPER_TEST_GROUP_PATH);
|
|
||||||
createUserInProviderRealm(createMatchingAttributes());
|
|
||||||
|
|
||||||
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
|
||||||
|
|
||||||
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
|
||||||
assertThatUserHasBeenAssignedToGroup(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void valuesMismatchRegex() {
|
|
||||||
createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES_REGEX, true, MAPPER_TEST_GROUP_PATH);
|
|
||||||
createUserInProviderRealm(ImmutableMap.<String, List<String>>builder()
|
|
||||||
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME, ImmutableList.<String>builder().add("mismatch").build())
|
|
||||||
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2, ImmutableList.<String>builder().add("value 2").build())
|
|
||||||
.build());
|
|
||||||
|
|
||||||
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
|
||||||
|
|
||||||
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
|
||||||
assertThatUserHasNotBeenAssignedToGroup(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void updateBrokeredUserMismatchLeavesGroup() {
|
|
||||||
newValueForAttribute2 = "value mismatch";
|
|
||||||
UserRepresentation user = createMapperAndLoginAsUserTwiceWithMapper(FORCE, false, MAPPER_TEST_GROUP_PATH);
|
|
||||||
|
|
||||||
assertThatUserHasNotBeenAssignedToGroup(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void updateBrokeredUserMismatchDoesNotLeaveGroupInImportMode() {
|
|
||||||
newValueForAttribute2 = "value mismatch";
|
|
||||||
UserRepresentation user = createMapperAndLoginAsUserTwiceWithMapper(IMPORT, false, MAPPER_TEST_GROUP_PATH);
|
|
||||||
|
|
||||||
assertThatUserHasBeenAssignedToGroup(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void updateBrokeredUserMatchDoesntLeaveGroup() {
|
|
||||||
newValueForAttribute2 = "value 2";
|
|
||||||
UserRepresentation user = createMapperAndLoginAsUserTwiceWithMapper(FORCE, false, MAPPER_TEST_GROUP_PATH);
|
|
||||||
|
|
||||||
assertThatUserHasBeenAssignedToGroup(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void tryToUpdateBrokeredUserWithMissingGroupDoesNotBreakLogin() {
|
|
||||||
newValueForAttribute2 = "value 2";
|
|
||||||
UserRepresentation user =
|
|
||||||
createMapperAndLoginAsUserTwiceWithMapper(FORCE, true, MAPPER_TEST_NOT_EXISTING_GROUP_PATH);
|
|
||||||
|
|
||||||
assertThatUserDoesNotHaveGroups(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void updateBrokeredUserIsAssignedToGroupInForceModeWhenCreatingTheMapperAfterFirstLogin() {
|
|
||||||
newValueForAttribute2 = "value 2";
|
|
||||||
UserRepresentation user = createMapperAndLoginAsUserTwiceWithMapper(FORCE, true, MAPPER_TEST_GROUP_PATH);
|
|
||||||
|
|
||||||
assertThatUserHasBeenAssignedToGroup(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
public UserRepresentation createMapperAndLoginAsUserTwiceWithMapper(IdentityProviderMapperSyncMode syncMode,
|
|
||||||
boolean createAfterFirstLogin, String groupPath) {
|
|
||||||
return loginAsUserTwiceWithMapper(syncMode, createAfterFirstLogin, createMatchingAttributes(), groupPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void updateUser() {
|
|
||||||
UserRepresentation user = findUser(bc.providerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
|
||||||
ImmutableMap<String, List<String>> matchingAttributes = ImmutableMap.<String, List<String>>builder()
|
|
||||||
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME, ImmutableList.<String>builder().add("value 1").build())
|
|
||||||
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2, ImmutableList.<String>builder().add(newValueForAttribute2).build())
|
|
||||||
.put("some.other.attribute", ImmutableList.<String>builder().add("some value").build())
|
|
||||||
.build();
|
|
||||||
user.setAttributes(matchingAttributes);
|
|
||||||
adminClient.realm(bc.providerRealmName()).users().get(user.getId()).update(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String createMapperInIdp(IdentityProviderRepresentation idp, IdentityProviderMapperSyncMode syncMode,
|
|
||||||
String groupPath) {
|
|
||||||
return createMapperInIdp(idp, CLAIMS_OR_ATTRIBUTES, false, syncMode, groupPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String setupScenarioWithGroupPath(String groupPath) {
|
|
||||||
String mapperId = createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES, false, groupPath);
|
|
||||||
createUserInProviderRealm(createMatchingAttributes());
|
|
||||||
return mapperId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setupScenarioWithNonExistingGroup() {
|
|
||||||
createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES, false, MAPPER_TEST_NOT_EXISTING_GROUP_PATH);
|
|
||||||
createUserInProviderRealm(createMatchingAttributes());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String createAdvancedGroupMapper(String claimsOrAttributeRepresentation,
|
|
||||||
boolean areClaimsOrAttributeValuesRegexes, String groupPath) {
|
|
||||||
IdentityProviderRepresentation idp = setupIdentityProvider();
|
|
||||||
return createMapperInIdp(idp, claimsOrAttributeRepresentation, areClaimsOrAttributeValuesRegexes, IMPORT,
|
|
||||||
groupPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract protected String createMapperInIdp(
|
|
||||||
IdentityProviderRepresentation idp, String claimsOrAttributeRepresentation,
|
|
||||||
boolean areClaimsOrAttributeValuesRegexes, IdentityProviderMapperSyncMode syncMode, String groupPath);
|
|
||||||
|
|
||||||
private static Map<String, List<String>> createMatchingAttributes() {
|
|
||||||
return ImmutableMap.<String, List<String>> builder()
|
|
||||||
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME,
|
|
||||||
ImmutableList.<String> builder().add("value 1").build())
|
|
||||||
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2,
|
|
||||||
ImmutableList.<String> builder().add("value 2").build())
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2022 Red Hat, Inc. and/or its affiliates
|
||||||
|
* and other contributors as indicated by the @author tags.
|
||||||
|
*
|
||||||
|
* 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 org.keycloak.testsuite.broker;
|
||||||
|
|
||||||
|
import static org.keycloak.models.IdentityProviderMapperSyncMode.IMPORT;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import org.keycloak.models.IdentityProviderMapperSyncMode;
|
||||||
|
import org.keycloak.representations.idm.IdentityProviderRepresentation;
|
||||||
|
import org.keycloak.representations.idm.UserRepresentation;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
|
||||||
|
public abstract class AbstractGroupBrokerMapperTest extends AbstractGroupMapperTest {
|
||||||
|
|
||||||
|
protected static final String CLAIMS_OR_ATTRIBUTES = "[\n" +
|
||||||
|
" {\n" +
|
||||||
|
" \"key\": \"" + KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME + "\",\n" +
|
||||||
|
" \"value\": \"value 1\"\n" +
|
||||||
|
" },\n" +
|
||||||
|
" {\n" +
|
||||||
|
" \"key\": \"" + KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2 + "\",\n" +
|
||||||
|
" \"value\": \"value 2\"\n" +
|
||||||
|
" }\n" +
|
||||||
|
"]";
|
||||||
|
|
||||||
|
protected static final String CLAIMS_OR_ATTRIBUTES_REGEX = "[\n" +
|
||||||
|
" {\n" +
|
||||||
|
" \"key\": \"" + KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME + "\",\n" +
|
||||||
|
" \"value\": \"va.*\"\n" +
|
||||||
|
" },\n" +
|
||||||
|
" {\n" +
|
||||||
|
" \"key\": \"" + KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2 + "\",\n" +
|
||||||
|
" \"value\": \"value 2\"\n" +
|
||||||
|
" }\n" +
|
||||||
|
"]";
|
||||||
|
|
||||||
|
protected String newValueForAttribute2 = "";
|
||||||
|
|
||||||
|
public UserRepresentation createMapperAndLoginAsUserTwiceWithMapper(IdentityProviderMapperSyncMode syncMode,
|
||||||
|
boolean createAfterFirstLogin, String groupPath) {
|
||||||
|
return loginAsUserTwiceWithMapper(syncMode, createAfterFirstLogin, createMatchingAttributes(), groupPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void updateUser() {
|
||||||
|
UserRepresentation user = findUser(bc.providerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
||||||
|
ImmutableMap<String, List<String>> matchingAttributes = ImmutableMap.<String, List<String>>builder()
|
||||||
|
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME, ImmutableList.<String>builder().add("value 1").build())
|
||||||
|
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2, ImmutableList.<String>builder().add(newValueForAttribute2).build())
|
||||||
|
.put("some.other.attribute", ImmutableList.<String>builder().add("some value").build())
|
||||||
|
.build();
|
||||||
|
user.setAttributes(matchingAttributes);
|
||||||
|
adminClient.realm(bc.providerRealmName()).users().get(user.getId()).update(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String createMapperInIdp(IdentityProviderRepresentation idp, IdentityProviderMapperSyncMode syncMode,
|
||||||
|
String groupPath) {
|
||||||
|
return createMapperInIdp(idp, CLAIMS_OR_ATTRIBUTES, false, syncMode, groupPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String setupScenarioWithGroupPath(String groupPath) {
|
||||||
|
String mapperId = createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES, false, groupPath);
|
||||||
|
createUserInProviderRealm(createMatchingAttributes());
|
||||||
|
return mapperId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setupScenarioWithNonExistingGroup() {
|
||||||
|
createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES, false, MAPPER_TEST_NOT_EXISTING_GROUP_PATH);
|
||||||
|
createUserInProviderRealm(createMatchingAttributes());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String createAdvancedGroupMapper(String claimsOrAttributeRepresentation,
|
||||||
|
boolean areClaimsOrAttributeValuesRegexes, String groupPath) {
|
||||||
|
IdentityProviderRepresentation idp = setupIdentityProvider();
|
||||||
|
return createMapperInIdp(idp, claimsOrAttributeRepresentation, areClaimsOrAttributeValuesRegexes, IMPORT,
|
||||||
|
groupPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract protected String createMapperInIdp(
|
||||||
|
IdentityProviderRepresentation idp, String claimsOrAttributeRepresentation,
|
||||||
|
boolean areClaimsOrAttributeValuesRegexes, IdentityProviderMapperSyncMode syncMode, String groupPath);
|
||||||
|
|
||||||
|
protected static Map<String, List<String>> createMatchingAttributes() {
|
||||||
|
return ImmutableMap.<String, List<String>> builder()
|
||||||
|
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME,
|
||||||
|
ImmutableList.<String> builder().add("value 1").build())
|
||||||
|
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2,
|
||||||
|
ImmutableList.<String> builder().add("value 2").build())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -60,127 +60,6 @@ public abstract class AbstractGroupMapperTest extends AbstractIdentityProviderMa
|
||||||
mapperGroupId = CreatedResponseUtil.getCreatedId(response);
|
mapperGroupId = CreatedResponseUtil.getCreatedId(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void tryToCreateBrokeredUserWithNonExistingGroupDoesNotBreakLogin() {
|
|
||||||
setupScenarioWithNonExistingGroup();
|
|
||||||
|
|
||||||
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
|
||||||
|
|
||||||
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
|
||||||
assertThatUserDoesNotHaveGroups(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void mapperStillWorksWhenTopLevelGroupIsConvertedToSubGroup() {
|
|
||||||
final String mapperId = setupScenarioWithGroupPath(MAPPER_TEST_GROUP_PATH);
|
|
||||||
|
|
||||||
String newParentGroupName = "new-parent";
|
|
||||||
GroupRepresentation newParentGroup = new GroupRepresentation();
|
|
||||||
newParentGroup.setName(newParentGroupName);
|
|
||||||
String newParentGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(newParentGroup));
|
|
||||||
|
|
||||||
GroupRepresentation mappedGroup = realm.groups().group(mapperGroupId).toRepresentation();
|
|
||||||
realm.groups().group(newParentGroupId).subGroup(mappedGroup).close();
|
|
||||||
|
|
||||||
String expectedNewGroupPath = buildGroupPath(newParentGroupName, MAPPER_TEST_GROUP_NAME);
|
|
||||||
|
|
||||||
assertMapperHasExpectedPathAndSucceeds(mapperId, expectedNewGroupPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void mapperStillWorksWhenSubGroupChangesParent() {
|
|
||||||
String parentGroupName = "parent-group";
|
|
||||||
GroupRepresentation parentGroup = new GroupRepresentation();
|
|
||||||
parentGroup.setName(parentGroupName);
|
|
||||||
String parentGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(parentGroup));
|
|
||||||
|
|
||||||
GroupRepresentation mappedGroup = realm.groups().group(mapperGroupId).toRepresentation();
|
|
||||||
realm.groups().group(parentGroupId).subGroup(mappedGroup).close();
|
|
||||||
|
|
||||||
String initialGroupPath = buildGroupPath(parentGroupName, MAPPER_TEST_GROUP_NAME);
|
|
||||||
|
|
||||||
final String mapperId = setupScenarioWithGroupPath(initialGroupPath);
|
|
||||||
|
|
||||||
String newParentGroupName = "new-parent-group";
|
|
||||||
GroupRepresentation newParentGroup = new GroupRepresentation();
|
|
||||||
newParentGroup.setName(newParentGroupName);
|
|
||||||
String newParentGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(newParentGroup));
|
|
||||||
|
|
||||||
realm.groups().group(newParentGroupId).subGroup(mappedGroup).close();
|
|
||||||
|
|
||||||
String expectedNewGroupPath = buildGroupPath(newParentGroupName, MAPPER_TEST_GROUP_NAME);
|
|
||||||
|
|
||||||
assertMapperHasExpectedPathAndSucceeds(mapperId, expectedNewGroupPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void mapperStillWorksWhenSubGroupIsConvertedToTopLevelGroup() {
|
|
||||||
String parentGroupName = "parent-group";
|
|
||||||
GroupRepresentation parentGroup = new GroupRepresentation();
|
|
||||||
parentGroup.setName(parentGroupName);
|
|
||||||
String parentGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(parentGroup));
|
|
||||||
|
|
||||||
GroupRepresentation mappedGroup = realm.groups().group(mapperGroupId).toRepresentation();
|
|
||||||
realm.groups().group(parentGroupId).subGroup(mappedGroup).close();
|
|
||||||
|
|
||||||
String initialGroupPath = buildGroupPath(parentGroupName, MAPPER_TEST_GROUP_NAME);
|
|
||||||
|
|
||||||
final String mapperId = setupScenarioWithGroupPath(initialGroupPath);
|
|
||||||
|
|
||||||
// convert the mapped group to a top-level group
|
|
||||||
realm.groups().add(realm.groups().group(mapperGroupId).toRepresentation());
|
|
||||||
|
|
||||||
String expectedNewGroupPath = buildGroupPath(MAPPER_TEST_GROUP_NAME);
|
|
||||||
|
|
||||||
assertMapperHasExpectedPathAndSucceeds(mapperId, expectedNewGroupPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void mapperStillWorksWhenGroupIsRenamed() {
|
|
||||||
final String mapperId = setupScenarioWithGroupPath(MAPPER_TEST_GROUP_PATH);
|
|
||||||
|
|
||||||
String newGroupName = "new-name-" + MAPPER_TEST_GROUP_NAME;
|
|
||||||
GroupRepresentation mappedGroup = realm.groups().group(mapperGroupId).toRepresentation();
|
|
||||||
mappedGroup.setName(newGroupName);
|
|
||||||
realm.groups().group(mapperGroupId).update(mappedGroup);
|
|
||||||
|
|
||||||
String expectedNewGroupPath = buildGroupPath(newGroupName);
|
|
||||||
|
|
||||||
assertMapperHasExpectedPathAndSucceeds(mapperId, expectedNewGroupPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void mapperStillWorksWhenAncestorGroupIsRenamed() {
|
|
||||||
String topLevelGroupName = "top-level";
|
|
||||||
GroupRepresentation topLevelGroup = new GroupRepresentation();
|
|
||||||
topLevelGroup.setName(topLevelGroupName);
|
|
||||||
String topLevelGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(topLevelGroup));
|
|
||||||
|
|
||||||
String midLevelGroupName = "mid-level";
|
|
||||||
GroupRepresentation midLevelGroup = new GroupRepresentation();
|
|
||||||
midLevelGroup.setName(midLevelGroupName);
|
|
||||||
String midLevelGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(midLevelGroup));
|
|
||||||
|
|
||||||
midLevelGroup = realm.groups().group(midLevelGroupId).toRepresentation();
|
|
||||||
realm.groups().group(topLevelGroupId).subGroup(midLevelGroup).close();
|
|
||||||
|
|
||||||
GroupRepresentation mappedGroup = realm.groups().group(mapperGroupId).toRepresentation();
|
|
||||||
realm.groups().group(midLevelGroupId).subGroup(mappedGroup).close();
|
|
||||||
|
|
||||||
String initialGroupPath = buildGroupPath(topLevelGroupName, midLevelGroupName, MAPPER_TEST_GROUP_NAME);
|
|
||||||
|
|
||||||
final String mapperId = setupScenarioWithGroupPath(initialGroupPath);
|
|
||||||
|
|
||||||
String newTopLevelGroupName = "new-name-" + topLevelGroupName;
|
|
||||||
topLevelGroup = realm.groups().group(topLevelGroupId).toRepresentation();
|
|
||||||
topLevelGroup.setName(newTopLevelGroupName);
|
|
||||||
realm.groups().group(topLevelGroupId).update(topLevelGroup);
|
|
||||||
|
|
||||||
String expectedNewGroupPath = buildGroupPath(newTopLevelGroupName, midLevelGroupName, MAPPER_TEST_GROUP_NAME);
|
|
||||||
|
|
||||||
assertMapperHasExpectedPathAndSucceeds(mapperId, expectedNewGroupPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected UserRepresentation loginAsUserTwiceWithMapper(
|
protected UserRepresentation loginAsUserTwiceWithMapper(
|
||||||
IdentityProviderMapperSyncMode syncMode, boolean createAfterFirstLogin,
|
IdentityProviderMapperSyncMode syncMode, boolean createAfterFirstLogin,
|
||||||
Map<String, List<String>> userConfig, String groupPath) {
|
Map<String, List<String>> userConfig, String groupPath) {
|
||||||
|
@ -213,7 +92,7 @@ public abstract class AbstractGroupMapperTest extends AbstractIdentityProviderMa
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertMapperHasExpectedPathAndSucceeds(String mapperId, String expectedGroupPath) {
|
protected void assertMapperHasExpectedPathAndSucceeds(String mapperId, String expectedGroupPath) {
|
||||||
IdentityProviderMapperRepresentation mapper =
|
IdentityProviderMapperRepresentation mapper =
|
||||||
realm.identityProviders().get(bc.getIDPAlias()).getMapperById(mapperId);
|
realm.identityProviders().get(bc.getIDPAlias()).getMapperById(mapperId);
|
||||||
Map<String, String> config = mapper.getConfig();
|
Map<String, String> config = mapper.getConfig();
|
||||||
|
|
|
@ -1,14 +1,22 @@
|
||||||
package org.keycloak.testsuite.broker;
|
package org.keycloak.testsuite.broker;
|
||||||
|
|
||||||
|
import static org.keycloak.models.IdentityProviderMapperSyncMode.FORCE;
|
||||||
|
import static org.keycloak.models.IdentityProviderMapperSyncMode.IMPORT;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import org.junit.Test;
|
||||||
import org.keycloak.admin.client.CreatedResponseUtil;
|
import org.keycloak.admin.client.CreatedResponseUtil;
|
||||||
import org.keycloak.admin.client.resource.IdentityProviderResource;
|
import org.keycloak.admin.client.resource.IdentityProviderResource;
|
||||||
import org.keycloak.broker.oidc.mappers.AdvancedClaimToGroupMapper;
|
import org.keycloak.broker.oidc.mappers.AdvancedClaimToGroupMapper;
|
||||||
import org.keycloak.broker.provider.ConfigConstants;
|
import org.keycloak.broker.provider.ConfigConstants;
|
||||||
import org.keycloak.models.IdentityProviderMapperModel;
|
import org.keycloak.models.IdentityProviderMapperModel;
|
||||||
import org.keycloak.models.IdentityProviderMapperSyncMode;
|
import org.keycloak.models.IdentityProviderMapperSyncMode;
|
||||||
|
import org.keycloak.representations.idm.GroupRepresentation;
|
||||||
import org.keycloak.representations.idm.IdentityProviderMapperRepresentation;
|
import org.keycloak.representations.idm.IdentityProviderMapperRepresentation;
|
||||||
import org.keycloak.representations.idm.IdentityProviderRepresentation;
|
import org.keycloak.representations.idm.IdentityProviderRepresentation;
|
||||||
|
import org.keycloak.representations.idm.UserRepresentation;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
|
@ -17,7 +25,7 @@ import javax.ws.rs.core.Response;
|
||||||
* @author <a href="mailto:artur.baltabayev@bosch.io">Artur Baltabayev</a>,
|
* @author <a href="mailto:artur.baltabayev@bosch.io">Artur Baltabayev</a>,
|
||||||
* <a href="mailto:daniel.fesenmeyer@bosch.io">Daniel Fesenmeyer</a>
|
* <a href="mailto:daniel.fesenmeyer@bosch.io">Daniel Fesenmeyer</a>
|
||||||
*/
|
*/
|
||||||
public class OidcAdvancedClaimToGroupMapperTest extends AbstractAdvancedGroupMapperTest {
|
public class OidcAdvancedClaimToGroupMapperTest extends AbstractGroupBrokerMapperTest {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BrokerConfiguration getBrokerConfiguration() {
|
protected BrokerConfiguration getBrokerConfiguration() {
|
||||||
|
@ -44,4 +52,229 @@ public class OidcAdvancedClaimToGroupMapperTest extends AbstractAdvancedGroupMap
|
||||||
return CreatedResponseUtil.getCreatedId(response);
|
return CreatedResponseUtil.getCreatedId(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void allValuesMatch() {
|
||||||
|
createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES, false, MAPPER_TEST_GROUP_PATH);
|
||||||
|
createUserInProviderRealm(createMatchingAttributes());
|
||||||
|
|
||||||
|
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
||||||
|
|
||||||
|
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
||||||
|
assertThatUserHasBeenAssignedToGroup(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void valuesMismatch() {
|
||||||
|
createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES, false, MAPPER_TEST_GROUP_PATH);
|
||||||
|
createUserInProviderRealm(ImmutableMap.<String, List<String>>builder()
|
||||||
|
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME, ImmutableList.<String>builder().add("value 1").build())
|
||||||
|
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2, ImmutableList.<String>builder().add("value mismatch").build())
|
||||||
|
.build());
|
||||||
|
|
||||||
|
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
||||||
|
|
||||||
|
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
||||||
|
assertThatUserHasNotBeenAssignedToGroup(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void valuesMatchIfNoClaimsSpecified() {
|
||||||
|
createAdvancedGroupMapper("[]", false, MAPPER_TEST_GROUP_PATH);
|
||||||
|
createUserInProviderRealm(ImmutableMap.<String, List<String>>builder()
|
||||||
|
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME, ImmutableList.<String>builder().add("some value").build())
|
||||||
|
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2, ImmutableList.<String>builder().add("some value").build())
|
||||||
|
.build());
|
||||||
|
|
||||||
|
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
||||||
|
|
||||||
|
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
||||||
|
assertThatUserHasBeenAssignedToGroup(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void allValuesMatchRegex() {
|
||||||
|
createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES_REGEX, true, MAPPER_TEST_GROUP_PATH);
|
||||||
|
createUserInProviderRealm(createMatchingAttributes());
|
||||||
|
|
||||||
|
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
||||||
|
|
||||||
|
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
||||||
|
assertThatUserHasBeenAssignedToGroup(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void valuesMismatchRegex() {
|
||||||
|
createAdvancedGroupMapper(CLAIMS_OR_ATTRIBUTES_REGEX, true, MAPPER_TEST_GROUP_PATH);
|
||||||
|
createUserInProviderRealm(ImmutableMap.<String, List<String>>builder()
|
||||||
|
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME, ImmutableList.<String>builder().add("mismatch").build())
|
||||||
|
.put(KcOidcBrokerConfiguration.ATTRIBUTE_TO_MAP_NAME_2, ImmutableList.<String>builder().add("value 2").build())
|
||||||
|
.build());
|
||||||
|
|
||||||
|
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
||||||
|
|
||||||
|
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
||||||
|
assertThatUserHasNotBeenAssignedToGroup(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void updateBrokeredUserMismatchLeavesGroup() {
|
||||||
|
newValueForAttribute2 = "value mismatch";
|
||||||
|
UserRepresentation user = createMapperAndLoginAsUserTwiceWithMapper(FORCE, false, MAPPER_TEST_GROUP_PATH);
|
||||||
|
|
||||||
|
assertThatUserHasNotBeenAssignedToGroup(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void updateBrokeredUserMismatchDoesNotLeaveGroupInImportMode() {
|
||||||
|
newValueForAttribute2 = "value mismatch";
|
||||||
|
UserRepresentation user = createMapperAndLoginAsUserTwiceWithMapper(IMPORT, false, MAPPER_TEST_GROUP_PATH);
|
||||||
|
|
||||||
|
assertThatUserHasBeenAssignedToGroup(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void updateBrokeredUserMatchDoesntLeaveGroup() {
|
||||||
|
newValueForAttribute2 = "value 2";
|
||||||
|
UserRepresentation user = createMapperAndLoginAsUserTwiceWithMapper(FORCE, false, MAPPER_TEST_GROUP_PATH);
|
||||||
|
|
||||||
|
assertThatUserHasBeenAssignedToGroup(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void tryToUpdateBrokeredUserWithMissingGroupDoesNotBreakLogin() {
|
||||||
|
newValueForAttribute2 = "value 2";
|
||||||
|
UserRepresentation user =
|
||||||
|
createMapperAndLoginAsUserTwiceWithMapper(FORCE, true, MAPPER_TEST_NOT_EXISTING_GROUP_PATH);
|
||||||
|
|
||||||
|
assertThatUserDoesNotHaveGroups(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void updateBrokeredUserIsAssignedToGroupInForceModeWhenCreatingTheMapperAfterFirstLogin() {
|
||||||
|
newValueForAttribute2 = "value 2";
|
||||||
|
UserRepresentation user = createMapperAndLoginAsUserTwiceWithMapper(FORCE, true, MAPPER_TEST_GROUP_PATH);
|
||||||
|
|
||||||
|
assertThatUserHasBeenAssignedToGroup(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void tryToCreateBrokeredUserWithNonExistingGroupDoesNotBreakLogin() {
|
||||||
|
setupScenarioWithNonExistingGroup();
|
||||||
|
|
||||||
|
logInAsUserInIDPForFirstTimeAndAssertSuccess();
|
||||||
|
|
||||||
|
UserRepresentation user = findUser(bc.consumerRealmName(), bc.getUserLogin(), bc.getUserEmail());
|
||||||
|
assertThatUserDoesNotHaveGroups(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void mapperStillWorksWhenTopLevelGroupIsConvertedToSubGroup() {
|
||||||
|
final String mapperId = setupScenarioWithGroupPath(MAPPER_TEST_GROUP_PATH);
|
||||||
|
|
||||||
|
String newParentGroupName = "new-parent";
|
||||||
|
GroupRepresentation newParentGroup = new GroupRepresentation();
|
||||||
|
newParentGroup.setName(newParentGroupName);
|
||||||
|
String newParentGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(newParentGroup));
|
||||||
|
|
||||||
|
GroupRepresentation mappedGroup = realm.groups().group(mapperGroupId).toRepresentation();
|
||||||
|
realm.groups().group(newParentGroupId).subGroup(mappedGroup).close();
|
||||||
|
|
||||||
|
String expectedNewGroupPath = buildGroupPath(newParentGroupName, MAPPER_TEST_GROUP_NAME);
|
||||||
|
|
||||||
|
assertMapperHasExpectedPathAndSucceeds(mapperId, expectedNewGroupPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void mapperStillWorksWhenSubGroupChangesParent() {
|
||||||
|
String parentGroupName = "parent-group";
|
||||||
|
GroupRepresentation parentGroup = new GroupRepresentation();
|
||||||
|
parentGroup.setName(parentGroupName);
|
||||||
|
String parentGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(parentGroup));
|
||||||
|
|
||||||
|
GroupRepresentation mappedGroup = realm.groups().group(mapperGroupId).toRepresentation();
|
||||||
|
realm.groups().group(parentGroupId).subGroup(mappedGroup).close();
|
||||||
|
|
||||||
|
String initialGroupPath = buildGroupPath(parentGroupName, MAPPER_TEST_GROUP_NAME);
|
||||||
|
|
||||||
|
final String mapperId = setupScenarioWithGroupPath(initialGroupPath);
|
||||||
|
|
||||||
|
String newParentGroupName = "new-parent-group";
|
||||||
|
GroupRepresentation newParentGroup = new GroupRepresentation();
|
||||||
|
newParentGroup.setName(newParentGroupName);
|
||||||
|
String newParentGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(newParentGroup));
|
||||||
|
|
||||||
|
realm.groups().group(newParentGroupId).subGroup(mappedGroup).close();
|
||||||
|
|
||||||
|
String expectedNewGroupPath = buildGroupPath(newParentGroupName, MAPPER_TEST_GROUP_NAME);
|
||||||
|
|
||||||
|
assertMapperHasExpectedPathAndSucceeds(mapperId, expectedNewGroupPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void mapperStillWorksWhenSubGroupIsConvertedToTopLevelGroup() {
|
||||||
|
String parentGroupName = "parent-group";
|
||||||
|
GroupRepresentation parentGroup = new GroupRepresentation();
|
||||||
|
parentGroup.setName(parentGroupName);
|
||||||
|
String parentGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(parentGroup));
|
||||||
|
|
||||||
|
GroupRepresentation mappedGroup = realm.groups().group(mapperGroupId).toRepresentation();
|
||||||
|
realm.groups().group(parentGroupId).subGroup(mappedGroup).close();
|
||||||
|
|
||||||
|
String initialGroupPath = buildGroupPath(parentGroupName, MAPPER_TEST_GROUP_NAME);
|
||||||
|
|
||||||
|
final String mapperId = setupScenarioWithGroupPath(initialGroupPath);
|
||||||
|
|
||||||
|
// convert the mapped group to a top-level group
|
||||||
|
realm.groups().add(realm.groups().group(mapperGroupId).toRepresentation());
|
||||||
|
|
||||||
|
String expectedNewGroupPath = buildGroupPath(MAPPER_TEST_GROUP_NAME);
|
||||||
|
|
||||||
|
assertMapperHasExpectedPathAndSucceeds(mapperId, expectedNewGroupPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void mapperStillWorksWhenGroupIsRenamed() {
|
||||||
|
final String mapperId = setupScenarioWithGroupPath(MAPPER_TEST_GROUP_PATH);
|
||||||
|
|
||||||
|
String newGroupName = "new-name-" + MAPPER_TEST_GROUP_NAME;
|
||||||
|
GroupRepresentation mappedGroup = realm.groups().group(mapperGroupId).toRepresentation();
|
||||||
|
mappedGroup.setName(newGroupName);
|
||||||
|
realm.groups().group(mapperGroupId).update(mappedGroup);
|
||||||
|
|
||||||
|
String expectedNewGroupPath = buildGroupPath(newGroupName);
|
||||||
|
|
||||||
|
assertMapperHasExpectedPathAndSucceeds(mapperId, expectedNewGroupPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void mapperStillWorksWhenAncestorGroupIsRenamed() {
|
||||||
|
String topLevelGroupName = "top-level";
|
||||||
|
GroupRepresentation topLevelGroup = new GroupRepresentation();
|
||||||
|
topLevelGroup.setName(topLevelGroupName);
|
||||||
|
String topLevelGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(topLevelGroup));
|
||||||
|
|
||||||
|
String midLevelGroupName = "mid-level";
|
||||||
|
GroupRepresentation midLevelGroup = new GroupRepresentation();
|
||||||
|
midLevelGroup.setName(midLevelGroupName);
|
||||||
|
String midLevelGroupId = CreatedResponseUtil.getCreatedId(realm.groups().add(midLevelGroup));
|
||||||
|
|
||||||
|
midLevelGroup = realm.groups().group(midLevelGroupId).toRepresentation();
|
||||||
|
realm.groups().group(topLevelGroupId).subGroup(midLevelGroup).close();
|
||||||
|
|
||||||
|
GroupRepresentation mappedGroup = realm.groups().group(mapperGroupId).toRepresentation();
|
||||||
|
realm.groups().group(midLevelGroupId).subGroup(mappedGroup).close();
|
||||||
|
|
||||||
|
String initialGroupPath = buildGroupPath(topLevelGroupName, midLevelGroupName, MAPPER_TEST_GROUP_NAME);
|
||||||
|
|
||||||
|
final String mapperId = setupScenarioWithGroupPath(initialGroupPath);
|
||||||
|
|
||||||
|
String newTopLevelGroupName = "new-name-" + topLevelGroupName;
|
||||||
|
topLevelGroup = realm.groups().group(topLevelGroupId).toRepresentation();
|
||||||
|
topLevelGroup.setName(newTopLevelGroupName);
|
||||||
|
realm.groups().group(topLevelGroupId).update(topLevelGroup);
|
||||||
|
|
||||||
|
String expectedNewGroupPath = buildGroupPath(newTopLevelGroupName, midLevelGroupName, MAPPER_TEST_GROUP_NAME);
|
||||||
|
|
||||||
|
assertMapperHasExpectedPathAndSucceeds(mapperId, expectedNewGroupPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue