TestAccountUpdate: Support modifying secondary emails
Signed-off-by: Edwin Kempin <ekempin@google.com> Change-Id: I26b5f3e5e03fb877bfc8bc2c3468030c4d86059f
This commit is contained in:
@@ -17,6 +17,8 @@ package com.google.gerrit.acceptance.testsuite.account;
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
import static com.google.common.collect.ImmutableSet.toImmutableSet;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.gerrit.entities.Account;
|
||||
import com.google.gerrit.server.ServerInitiated;
|
||||
import com.google.gerrit.server.account.AccountState;
|
||||
@@ -61,8 +63,8 @@ public class AccountOperationsImpl implements AccountOperations {
|
||||
|
||||
private Account.Id createAccount(TestAccountCreation accountCreation) throws Exception {
|
||||
AccountsUpdate.AccountUpdater accountUpdater =
|
||||
(account, updateBuilder) ->
|
||||
fillBuilder(updateBuilder, accountCreation, account.account().id());
|
||||
(accountState, updateBuilder) ->
|
||||
fillBuilder(updateBuilder, accountCreation, accountState.account().id());
|
||||
AccountState createdAccount = createAccount(accountUpdater);
|
||||
return createdAccount.account().id();
|
||||
}
|
||||
@@ -154,7 +156,7 @@ public class AccountOperationsImpl implements AccountOperations {
|
||||
private void updateAccount(TestAccountUpdate accountUpdate)
|
||||
throws IOException, ConfigInvalidException {
|
||||
AccountsUpdate.AccountUpdater accountUpdater =
|
||||
(account, updateBuilder) -> fillBuilder(updateBuilder, accountUpdate, accountId);
|
||||
(accountState, updateBuilder) -> fillBuilder(updateBuilder, accountUpdate, accountState);
|
||||
Optional<AccountState> updatedAccount = updateAccount(accountUpdater);
|
||||
checkState(updatedAccount.isPresent(), "Tried to update non-existing test account");
|
||||
}
|
||||
@@ -167,13 +169,50 @@ public class AccountOperationsImpl implements AccountOperations {
|
||||
private void fillBuilder(
|
||||
InternalAccountUpdate.Builder builder,
|
||||
TestAccountUpdate accountUpdate,
|
||||
Account.Id accountId) {
|
||||
AccountState accountState) {
|
||||
accountUpdate.fullname().ifPresent(builder::setFullName);
|
||||
accountUpdate.preferredEmail().ifPresent(e -> setPreferredEmail(builder, accountId, e));
|
||||
String httpPassword = accountUpdate.httpPassword().orElse(null);
|
||||
accountUpdate.username().ifPresent(u -> setUsername(builder, accountId, u, httpPassword));
|
||||
accountUpdate.status().ifPresent(builder::setStatus);
|
||||
accountUpdate.active().ifPresent(builder::setActive);
|
||||
|
||||
ImmutableSet<String> secondaryEmails;
|
||||
ImmutableSet<String> allEmails =
|
||||
ExternalId.getEmails(accountState.externalIds()).collect(toImmutableSet());
|
||||
if (accountUpdate.preferredEmail().isPresent()) {
|
||||
secondaryEmails =
|
||||
ImmutableSet.copyOf(
|
||||
Sets.difference(allEmails, ImmutableSet.of(accountUpdate.preferredEmail().get())));
|
||||
} else if (accountState.account().preferredEmail() != null) {
|
||||
secondaryEmails =
|
||||
ImmutableSet.copyOf(
|
||||
Sets.difference(
|
||||
allEmails, ImmutableSet.of(accountState.account().preferredEmail())));
|
||||
} else {
|
||||
secondaryEmails = allEmails;
|
||||
}
|
||||
ImmutableSet<String> newSecondaryEmails =
|
||||
ImmutableSet.copyOf(accountUpdate.secondaryEmailsModification().apply(secondaryEmails));
|
||||
if (!secondaryEmails.equals(newSecondaryEmails)) {
|
||||
// delete all external IDs of SCHEME_MAILTO scheme, then add back SCHEME_MAILTO external IDs
|
||||
// for the new secondary emails and the preferred email
|
||||
builder.deleteExternalIds(
|
||||
accountState.externalIds().stream()
|
||||
.filter(e -> e.isScheme(ExternalId.SCHEME_MAILTO))
|
||||
.collect(toImmutableSet()));
|
||||
builder.addExternalIds(
|
||||
newSecondaryEmails.stream()
|
||||
.map(secondaryEmail -> ExternalId.createEmail(accountId, secondaryEmail))
|
||||
.collect(toImmutableSet()));
|
||||
if (accountUpdate.preferredEmail().isPresent()) {
|
||||
builder.addExternalId(
|
||||
ExternalId.createEmail(accountId, accountUpdate.preferredEmail().get()));
|
||||
} else if (accountState.account().preferredEmail() != null) {
|
||||
builder.addExternalId(
|
||||
ExternalId.createEmail(accountId, accountState.account().preferredEmail()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -15,8 +15,12 @@
|
||||
package com.google.gerrit.acceptance.testsuite.account;
|
||||
|
||||
import com.google.auto.value.AutoValue;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.gerrit.acceptance.testsuite.ThrowingConsumer;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
|
||||
@AutoValue
|
||||
public abstract class TestAccountUpdate {
|
||||
@@ -32,11 +36,14 @@ public abstract class TestAccountUpdate {
|
||||
|
||||
public abstract Optional<Boolean> active();
|
||||
|
||||
public abstract Function<ImmutableSet<String>, Set<String>> secondaryEmailsModification();
|
||||
|
||||
abstract ThrowingConsumer<TestAccountUpdate> accountUpdater();
|
||||
|
||||
public static Builder builder(ThrowingConsumer<TestAccountUpdate> accountUpdater) {
|
||||
return new AutoValue_TestAccountUpdate.Builder()
|
||||
.accountUpdater(accountUpdater)
|
||||
.secondaryEmailsModification(in -> in)
|
||||
.httpPassword("http-pass");
|
||||
}
|
||||
|
||||
@@ -82,6 +89,37 @@ public abstract class TestAccountUpdate {
|
||||
return active(false);
|
||||
}
|
||||
|
||||
abstract Builder secondaryEmailsModification(
|
||||
Function<ImmutableSet<String>, Set<String>> secondaryEmailsModification);
|
||||
|
||||
abstract Function<ImmutableSet<String>, Set<String>> secondaryEmailsModification();
|
||||
|
||||
public Builder clearSecondaryEmails() {
|
||||
return secondaryEmailsModification(originalSecondaryEmail -> ImmutableSet.of());
|
||||
}
|
||||
|
||||
public Builder addSecondaryEmail(String secondaryEmail) {
|
||||
Function<ImmutableSet<String>, Set<String>> secondaryEmailsModification =
|
||||
secondaryEmailsModification();
|
||||
secondaryEmailsModification(
|
||||
originalSecondaryEmails ->
|
||||
Sets.union(
|
||||
secondaryEmailsModification.apply(originalSecondaryEmails),
|
||||
ImmutableSet.of(secondaryEmail)));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder removeSecondaryEmail(String secondaryEmail) {
|
||||
Function<ImmutableSet<String>, Set<String>> previousModification =
|
||||
secondaryEmailsModification();
|
||||
secondaryEmailsModification(
|
||||
originalSecondaryEmails ->
|
||||
Sets.difference(
|
||||
previousModification.apply(originalSecondaryEmails),
|
||||
ImmutableSet.of(secondaryEmail)));
|
||||
return this;
|
||||
}
|
||||
|
||||
abstract Builder accountUpdater(ThrowingConsumer<TestAccountUpdate> accountUpdater);
|
||||
|
||||
abstract TestAccountUpdate autoBuild();
|
||||
|
||||
Reference in New Issue
Block a user