Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor tests for EntityAliasHandler.ensureConsistencyOfAliasEntity #2824

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
5fb1518
Add superclass for tests for EntityAliasHandler.ensureConsistencyOfAl…
adrianhoelzl-sap Apr 11, 2024
e6f1a72
Move customZoneId generation to superclass
adrianhoelzl-sap Apr 11, 2024
767c967
Add inner classes for different combinations of existing/non-existing…
adrianhoelzl-sap Apr 11, 2024
87b0046
Move IdpWithAliasMatcher to superclass and make it generic
adrianhoelzl-sap Apr 11, 2024
5d41d70
Refactor
adrianhoelzl-sap Apr 11, 2024
a0c9c02
Use correct import for "assertThatExceptionOfType"
adrianhoelzl-sap Apr 11, 2024
998ba12
Move "shallowCloneEntity" to test superclass
adrianhoelzl-sap Apr 11, 2024
9e71418
Move "arrangeZoneDoesNotExist" to test superclass
adrianhoelzl-sap Apr 11, 2024
b6e4598
Move creation of aliasHandler to test superclass
adrianhoelzl-sap Apr 11, 2024
d58146f
Move 'entitiesAreEqual' and 'changeNonAliasProperties' to test superc…
adrianhoelzl-sap Apr 11, 2024
271aa06
Move 'NoExistingAliasBase' to test superclass
adrianhoelzl-sap Apr 11, 2024
21e3c78
Use test superclass for each combination of enabled/disabled alias fe…
adrianhoelzl-sap Apr 11, 2024
bdc7f73
Move 'arrangeEntityExists' and 'arrangeEntityDoesNotExist' to test su…
adrianhoelzl-sap Apr 11, 2024
0c82134
Move 'NoExistingAlias' -> 'AliasFeatureEnabled' -> 'shouldThrow_WhenA…
adrianhoelzl-sap Apr 11, 2024
e584467
Move 'ExistingAlias' -> 'AliasFeatureDisabled' -> 'shouldThrow_IfExis…
adrianhoelzl-sap Apr 11, 2024
8ce9106
Add test 'ExistingAlias' -> 'AliasFeatureDisabled' -> 'shouldThrow_Ev…
adrianhoelzl-sap Apr 11, 2024
c500307
Refactor
adrianhoelzl-sap Apr 11, 2024
6badead
Move 'ExistingAlias' -> 'AliasFeatureEnabled' -> 'shouldThrow_WhenRef…
adrianhoelzl-sap Apr 11, 2024
f39f67b
Add test 'NoExistingAlias' -> 'AliasFeatureDisabled' -> 'shouldThrow_…
adrianhoelzl-sap Apr 11, 2024
541d13a
Move test 'NoExistingAlias' -> 'AliasFeatureEnabled' -> 'shouldCreate…
adrianhoelzl-sap Apr 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
package org.cloudfoundry.identity.uaa.alias;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
import static org.cloudfoundry.identity.uaa.constants.OriginKeys.UAA;

import java.util.Objects;
import java.util.UUID;

import org.cloudfoundry.identity.uaa.EntityWithAlias;
import org.cloudfoundry.identity.uaa.scim.ScimUser;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentMatcher;
import org.springframework.lang.Nullable;

public abstract class EntityAliasHandlerEnsureConsistencyTest<T extends EntityWithAlias> {
protected abstract EntityAliasHandler<T> buildAliasHandler(final boolean aliasEntitiesEnabled);

protected abstract T shallowCloneEntity(final T entity);

protected abstract T buildEntityWithAliasProperties(@Nullable final String aliasId, @Nullable final String aliasZid);

/**
* Change one or more properties (but neither 'aliasId' nor 'aliasZid') of the given entity.
*/
protected abstract void changeNonAliasProperties(final T entity);

protected abstract void arrangeZoneDoesNotExist(final String zoneId);

/**
* Mock updating entities by always returning the entity passed as an argument to the update method.
*/
protected abstract void mockUpdateEntity(final String zoneId);

/**
* Mock creating entities by taking the entity passed as an argument to the create method and setting the given new
* ID.
*/
protected abstract void mockCreateEntity(final String newId, final String zoneId);

protected abstract void arrangeEntityExists(final String id, final String zoneId, final T entity);

protected abstract void arrangeEntityDoesNotExist(final String id, final String zoneId);

/**
* Check whether the given two entities are equal. This method is required since the {@link ScimUser} class does not
* implement an {@code equals} method that is precise enough.
*/
protected abstract boolean entitiesAreEqual(final T entity1, final T entity2);

protected final String customZoneId = UUID.randomUUID().toString();

private abstract class Base {
protected EntityAliasHandler<T> aliasHandler;

@BeforeEach
final void setUp() {
final boolean aliasEntitiesEnabled = isAliasFeatureEnabled();
this.aliasHandler = buildAliasHandler(aliasEntitiesEnabled);
}

protected abstract boolean isAliasFeatureEnabled();
}

private abstract class NoExistingAliasBase extends Base {
@Test
final void shouldIgnore_AliasZidEmptyInOriginalEntity() {
final T originalEntity = buildEntityWithAliasProperties(null, null);
final T existingEntity = shallowCloneEntity(originalEntity);
changeNonAliasProperties(existingEntity);

final T result = aliasHandler.ensureConsistencyOfAliasEntity(originalEntity, existingEntity);
assertThat(entitiesAreEqual(result, originalEntity)).isTrue();
}
}

protected abstract class NoExistingAlias_AliasFeatureEnabled extends NoExistingAliasBase {
@Override
protected final boolean isAliasFeatureEnabled() {
return true;
}

@Test
final void shouldThrow_WhenAliasZidSetButZoneDoesNotExist() {
final T existingEntity = buildEntityWithAliasProperties(null, null);
final T originalEntity = shallowCloneEntity(existingEntity);
originalEntity.setAliasZid(customZoneId);

arrangeZoneDoesNotExist(customZoneId);

assertThatExceptionOfType(EntityAliasFailedException.class).isThrownBy(() ->
aliasHandler.ensureConsistencyOfAliasEntity(originalEntity, existingEntity)
);
}

@Test
final void shouldCreateNewAliasEntity_WhenAliasZoneExistsAndAliasPropertiesAreSet() {
final T existingEntity = buildEntityWithAliasProperties(null, null);
final T originalEntity = shallowCloneEntity(existingEntity);
originalEntity.setAliasZid(customZoneId);

final String aliasId = UUID.randomUUID().toString();
mockCreateEntity(aliasId, customZoneId);
mockUpdateEntity(UAA);

final T result = aliasHandler.ensureConsistencyOfAliasEntity(
originalEntity,
existingEntity
);
assertThat(result.getAliasId()).isEqualTo(aliasId);
assertThat(result.getAliasZid()).isEqualTo(customZoneId);
}
}

protected abstract class NoExistingAlias_AliasFeatureDisabled extends NoExistingAliasBase {
@Override
protected final boolean isAliasFeatureEnabled() {
return false;
}

@Test
final void shouldThrow_WhenAliasZidSet() {
final T existingEntity = buildEntityWithAliasProperties(null, null);
final T originalEntity = shallowCloneEntity(existingEntity);
originalEntity.setAliasZid(customZoneId);

assertThatIllegalStateException().isThrownBy(() ->
aliasHandler.ensureConsistencyOfAliasEntity(originalEntity, existingEntity)
).withMessage("Trying to create a new alias while alias feature is disabled.");
}
}

protected abstract class ExistingAlias_AliasFeatureEnabled extends Base {
@Override
protected final boolean isAliasFeatureEnabled() {
return true;
}

@Test
final void shouldThrow_WhenReferencedAliasEntityAndAliasZoneDoNotExist() {
final String aliasId = UUID.randomUUID().toString();

final T existingEntity = buildEntityWithAliasProperties(aliasId, customZoneId);
final T originalEntity = shallowCloneEntity(existingEntity);
changeNonAliasProperties(originalEntity);

arrangeEntityDoesNotExist(aliasId, customZoneId);
arrangeZoneDoesNotExist(customZoneId);

assertThatExceptionOfType(EntityAliasFailedException.class).isThrownBy(() ->
aliasHandler.ensureConsistencyOfAliasEntity(originalEntity, existingEntity)
);
}
}

protected abstract class ExistingAlias_AliasFeatureDisabled extends Base {
@Override
protected final boolean isAliasFeatureEnabled() {
return false;
}

@Test
final void shouldThrow_EvenIfNoAliasPropertyIsChanged() {
final T existingEntity = buildEntityWithAliasProperties(UUID.randomUUID().toString(), customZoneId);

final T originalEntity = shallowCloneEntity(existingEntity);
changeNonAliasProperties(originalEntity);

assertThatIllegalStateException().isThrownBy(() ->
aliasHandler.ensureConsistencyOfAliasEntity(originalEntity, existingEntity)
).withMessage("Performing update on entity with alias while alias feature is disabled.");
}

@Test
final void shouldThrow_AliasPropertiesSetToNull() {
final T existingEntity = buildEntityWithAliasProperties(UUID.randomUUID().toString(), customZoneId);

final T originalEntity = shallowCloneEntity(existingEntity);
changeNonAliasProperties(originalEntity);
originalEntity.setAliasId(null);
originalEntity.setAliasZid(null);

assertThatIllegalStateException().isThrownBy(() ->
aliasHandler.ensureConsistencyOfAliasEntity(originalEntity, existingEntity)
).withMessage("Performing update on entity with alias while alias feature is disabled.");
}
}

protected static class EntityWithAliasMatcher<T extends EntityWithAlias> implements ArgumentMatcher<T> {
private final String zoneId;
private final String id;
private final String aliasId;
private final String aliasZid;

public EntityWithAliasMatcher(final String zoneId, final String id, final String aliasId, final String aliasZid) {
this.zoneId = zoneId;
this.id = id;
this.aliasId = aliasId;
this.aliasZid = aliasZid;
}

@Override
public boolean matches(final T argument) {
return Objects.equals(id, argument.getId()) && Objects.equals(zoneId, argument.getZoneId())
&& Objects.equals(aliasId, argument.getAliasId()) && Objects.equals(aliasZid, argument.getAliasZid());
}
}
}
Loading
Loading