diff --git a/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java b/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java
index 74f5f535c..6cd35611b 100644
--- a/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java
+++ b/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java
@@ -14,60 +14,19 @@
package google.registry.flows.contact;
-import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
-import static google.registry.flows.ResourceFlowUtils.verifyTargetIdCount;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import google.registry.config.RegistryConfig.Config;
-import google.registry.flows.EppException;
-import google.registry.flows.ExtensionManager;
-import google.registry.flows.FlowModule.RegistrarId;
-import google.registry.flows.TransactionalFlow;
import google.registry.flows.annotations.ReportingSpec;
-import google.registry.model.ForeignKeyUtils;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactCommand.Check;
-import google.registry.model.eppinput.ResourceCommand;
-import google.registry.model.eppoutput.CheckData.ContactCheck;
-import google.registry.model.eppoutput.CheckData.ContactCheckData;
-import google.registry.model.eppoutput.EppResponse;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
-import google.registry.util.Clock;
import jakarta.inject.Inject;
/**
- * An EPP flow that checks whether a contact can be provisioned.
+ * An EPP flow that is meant to check whether a contact can be provisioned.
*
- *
This flows can check the existence of multiple contacts simultaneously.
- *
- * @error {@link google.registry.flows.exceptions.TooManyResourceChecksException}
- * @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
+ * @error {@link ContactsProhibitedException}
*/
+@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_CHECK)
-public final class ContactCheckFlow implements TransactionalFlow {
-
- @Inject ResourceCommand resourceCommand;
- @Inject @RegistrarId String registrarId;
- @Inject ExtensionManager extensionManager;
- @Inject Clock clock;
- @Inject @Config("maxChecks") int maxChecks;
- @Inject EppResponse.Builder responseBuilder;
+public final class ContactCheckFlow extends ContactsProhibitedFlow {
@Inject ContactCheckFlow() {}
-
- @Override
- public EppResponse run() throws EppException {
- validateRegistrarIsLoggedIn(registrarId);
- extensionManager.validate(); // There are no legal extensions for this flow.
- ImmutableList targetIds = ((Check) resourceCommand).getTargetIds();
- verifyTargetIdCount(targetIds, maxChecks);
- ImmutableSet existingIds =
- ForeignKeyUtils.loadKeys(Contact.class, targetIds, clock.nowUtc()).keySet();
- ImmutableList.Builder checks = new ImmutableList.Builder<>();
- for (String id : targetIds) {
- boolean unused = !existingIds.contains(id);
- checks.add(ContactCheck.create(unused, id, unused ? null : "In use"));
- }
- return responseBuilder.setResData(ContactCheckData.create(checks.build())).build();
- }
}
diff --git a/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java b/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java
index 364ef2f74..b360c846e 100644
--- a/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java
+++ b/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java
@@ -14,94 +14,19 @@
package google.registry.flows.contact;
-import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
-import static google.registry.flows.ResourceFlowUtils.verifyResourceDoesNotExist;
-import static google.registry.flows.contact.ContactFlowUtils.validateAsciiPostalInfo;
-import static google.registry.flows.contact.ContactFlowUtils.validateContactAgainstPolicy;
-import static google.registry.model.EppResourceUtils.createRepoId;
-import static google.registry.model.common.FeatureFlag.FeatureName.MINIMUM_DATASET_CONTACTS_PROHIBITED;
-import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
-import com.google.common.collect.ImmutableSet;
-import google.registry.config.RegistryConfig.Config;
-import google.registry.flows.EppException;
-import google.registry.flows.ExtensionManager;
-import google.registry.flows.FlowModule.RegistrarId;
-import google.registry.flows.FlowModule.TargetId;
-import google.registry.flows.MutatingFlow;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
-import google.registry.flows.exceptions.ResourceAlreadyExistsForThisClientException;
-import google.registry.flows.exceptions.ResourceCreateContentionException;
-import google.registry.model.common.FeatureFlag;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactCommand.Create;
-import google.registry.model.contact.ContactHistory;
-import google.registry.model.domain.metadata.MetadataExtension;
-import google.registry.model.eppinput.ResourceCommand;
-import google.registry.model.eppoutput.CreateData.ContactCreateData;
-import google.registry.model.eppoutput.EppResponse;
-import google.registry.model.reporting.HistoryEntry;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
-import org.joda.time.DateTime;
/**
- * An EPP flow that creates a new contact.
+ * An EPP flow meant to create a new contact.
*
- * @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link ContactsProhibitedException}
- * @error {@link ResourceAlreadyExistsForThisClientException}
- * @error {@link ResourceCreateContentionException}
- * @error {@link ContactFlowUtils.BadInternationalizedPostalInfoException}
- * @error {@link ContactFlowUtils.DeclineContactDisclosureFieldDisallowedPolicyException}
*/
+@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_CREATE)
-public final class ContactCreateFlow implements MutatingFlow {
-
- @Inject ResourceCommand resourceCommand;
- @Inject ExtensionManager extensionManager;
- @Inject @RegistrarId String registrarId;
- @Inject @TargetId String targetId;
- @Inject ContactHistory.Builder historyBuilder;
- @Inject EppResponse.Builder responseBuilder;
- @Inject @Config("contactAndHostRoidSuffix") String roidSuffix;
+public final class ContactCreateFlow extends ContactsProhibitedFlow {
@Inject ContactCreateFlow() {}
-
- @Override
- public EppResponse run() throws EppException {
- extensionManager.register(MetadataExtension.class);
- validateRegistrarIsLoggedIn(registrarId);
- extensionManager.validate();
- if (FeatureFlag.isActiveNow(MINIMUM_DATASET_CONTACTS_PROHIBITED)) {
- throw new ContactsProhibitedException();
- }
- Create command = (Create) resourceCommand;
- DateTime now = tm().getTransactionTime();
- verifyResourceDoesNotExist(Contact.class, targetId, now, registrarId);
- Contact newContact =
- new Contact.Builder()
- .setContactId(targetId)
- .setAuthInfo(command.getAuthInfo())
- .setCreationRegistrarId(registrarId)
- .setPersistedCurrentSponsorRegistrarId(registrarId)
- .setRepoId(createRepoId(tm().allocateId(), roidSuffix))
- .setFaxNumber(command.getFax())
- .setVoiceNumber(command.getVoice())
- .setDisclose(command.getDisclose())
- .setEmailAddress(command.getEmail())
- .setInternationalizedPostalInfo(command.getInternationalizedPostalInfo())
- .setLocalizedPostalInfo(command.getLocalizedPostalInfo())
- .build();
- validateAsciiPostalInfo(newContact.getInternationalizedPostalInfo());
- validateContactAgainstPolicy(newContact);
- historyBuilder
- .setType(HistoryEntry.Type.CONTACT_CREATE)
- .setXmlBytes(null) // We don't want to store contact details in the history entry.
- .setContact(newContact);
- tm().insertAll(ImmutableSet.of(newContact, historyBuilder.build()));
- return responseBuilder
- .setResData(ContactCreateData.create(newContact.getContactId(), now))
- .build();
- }
}
diff --git a/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java b/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java
index f25a03e5f..32cc74c90 100644
--- a/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java
+++ b/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java
@@ -14,97 +14,20 @@
package google.registry.flows.contact;
-import static google.registry.flows.FlowUtils.DELETE_PROHIBITED_STATUSES;
-import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
-import static google.registry.flows.ResourceFlowUtils.checkLinkedDomains;
-import static google.registry.flows.ResourceFlowUtils.loadAndVerifyExistence;
-import static google.registry.flows.ResourceFlowUtils.verifyNoDisallowedStatuses;
-import static google.registry.flows.ResourceFlowUtils.verifyOptionalAuthInfo;
-import static google.registry.flows.ResourceFlowUtils.verifyResourceOwnership;
-import static google.registry.model.ResourceTransferUtils.denyPendingTransfer;
-import static google.registry.model.ResourceTransferUtils.handlePendingTransferOnDelete;
-import static google.registry.model.eppoutput.Result.Code.SUCCESS;
-import static google.registry.model.transfer.TransferStatus.SERVER_CANCELLED;
-import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
-import com.google.common.collect.ImmutableSet;
-import google.registry.flows.EppException;
-import google.registry.flows.ExtensionManager;
-import google.registry.flows.FlowModule.RegistrarId;
-import google.registry.flows.FlowModule.Superuser;
-import google.registry.flows.FlowModule.TargetId;
-import google.registry.flows.MutatingFlow;
import google.registry.flows.annotations.ReportingSpec;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactHistory;
-import google.registry.model.domain.metadata.MetadataExtension;
-import google.registry.model.eppcommon.AuthInfo;
-import google.registry.model.eppcommon.StatusValue;
-import google.registry.model.eppcommon.Trid;
-import google.registry.model.eppoutput.EppResponse;
-import google.registry.model.reporting.HistoryEntry.Type;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
-import java.util.Optional;
-import org.joda.time.DateTime;
/**
- * An EPP flow that deletes a contact.
+ * An EPP flow that is meant to delete a contact.
*
- * Contacts that are in use by any domain cannot be deleted. The flow may return immediately if a
- * quick smoke check determines that deletion is impossible due to an existing reference. However, a
- * successful delete will always be asynchronous, as all existing domains must be checked for
- * references to the host before the deletion is allowed to proceed. A poll message will be written
- * with the success or failure message when the process is complete.
- *
- * @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException}
- * @error {@link google.registry.flows.exceptions.ResourceStatusProhibitsOperationException}
- * @error {@link google.registry.flows.exceptions.ResourceToDeleteIsReferencedException}
+ * @error {@link ContactsProhibitedException}
*/
+@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_DELETE)
-public final class ContactDeleteFlow implements MutatingFlow {
-
- @Inject ExtensionManager extensionManager;
- @Inject @RegistrarId String registrarId;
- @Inject @TargetId String targetId;
- @Inject Trid trid;
- @Inject @Superuser boolean isSuperuser;
- @Inject Optional authInfo;
- @Inject ContactHistory.Builder historyBuilder;
- @Inject EppResponse.Builder responseBuilder;
-
+public final class ContactDeleteFlow extends ContactsProhibitedFlow {
@Inject
ContactDeleteFlow() {}
-
- @Override
- public EppResponse run() throws EppException {
- extensionManager.register(MetadataExtension.class);
- validateRegistrarIsLoggedIn(registrarId);
- extensionManager.validate();
- DateTime now = tm().getTransactionTime();
- checkLinkedDomains(targetId, now, Contact.class);
- Contact existingContact = loadAndVerifyExistence(Contact.class, targetId, now);
- verifyOptionalAuthInfo(authInfo, existingContact);
- verifyNoDisallowedStatuses(existingContact, ImmutableSet.of(StatusValue.PENDING_DELETE));
- if (!isSuperuser) {
- verifyNoDisallowedStatuses(existingContact, DELETE_PROHIBITED_STATUSES);
- verifyResourceOwnership(registrarId, existingContact);
- }
- // Handle pending transfers on contact deletion.
- Contact newContact =
- existingContact.getStatusValues().contains(StatusValue.PENDING_TRANSFER)
- ? denyPendingTransfer(existingContact, SERVER_CANCELLED, now, registrarId)
- : existingContact;
- // Wipe out PII on contact deletion.
- newContact =
- newContact.asBuilder().wipeOut().setStatusValues(null).setDeletionTime(now).build();
- ContactHistory contactHistory =
- historyBuilder.setType(Type.CONTACT_DELETE).setContact(newContact).build();
- handlePendingTransferOnDelete(existingContact, newContact, now, contactHistory);
- tm().insert(contactHistory);
- tm().update(newContact);
- return responseBuilder.setResultFromCode(SUCCESS).build();
- }
}
diff --git a/core/src/main/java/google/registry/flows/contact/ContactFlowUtils.java b/core/src/main/java/google/registry/flows/contact/ContactFlowUtils.java
deleted file mode 100644
index b90a130e6..000000000
--- a/core/src/main/java/google/registry/flows/contact/ContactFlowUtils.java
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2017 The Nomulus Authors. All Rights Reserved.
-//
-// 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 google.registry.flows.contact;
-
-import static google.registry.model.contact.PostalInfo.Type.INTERNATIONALIZED;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Sets;
-import google.registry.flows.EppException;
-import google.registry.flows.EppException.ParameterValuePolicyErrorException;
-import google.registry.flows.EppException.ParameterValueSyntaxErrorException;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactAddress;
-import google.registry.model.contact.PostalInfo;
-import google.registry.model.poll.PendingActionNotificationResponse.ContactPendingActionNotificationResponse;
-import google.registry.model.poll.PollMessage;
-import google.registry.model.reporting.HistoryEntry.HistoryEntryId;
-import google.registry.model.transfer.TransferData;
-import google.registry.model.transfer.TransferResponse.ContactTransferResponse;
-import java.util.Set;
-import javax.annotation.Nullable;
-import org.joda.time.DateTime;
-
-/** Static utility functions for contact flows. */
-public class ContactFlowUtils {
- /** Check that an internationalized postal info has only ascii characters. */
- static void validateAsciiPostalInfo(@Nullable PostalInfo internationalized) throws EppException {
- if (internationalized != null) {
- Preconditions.checkState(INTERNATIONALIZED.equals(internationalized.getType()));
- ContactAddress address = internationalized.getAddress();
- Set fields = Sets.newHashSet(
- internationalized.getName(),
- internationalized.getOrg(),
- address.getCity(),
- address.getCountryCode(),
- address.getState(),
- address.getZip());
- fields.addAll(address.getStreet());
- for (String field : fields) {
- if (field != null && !CharMatcher.ascii().matchesAllOf(field)) {
- throw new BadInternationalizedPostalInfoException();
- }
- }
- }
- }
-
- /** Check contact's state against server policy. */
- static void validateContactAgainstPolicy(Contact contact) throws EppException {
- if (contact.getDisclose() != null && !contact.getDisclose().getFlag()) {
- throw new DeclineContactDisclosureFieldDisallowedPolicyException();
- }
- }
-
- /** Create a poll message for the gaining client in a transfer. */
- static PollMessage createGainingTransferPollMessage(
- String targetId, TransferData transferData, DateTime now, HistoryEntryId contactHistoryId) {
- return new PollMessage.OneTime.Builder()
- .setRegistrarId(transferData.getGainingRegistrarId())
- .setEventTime(transferData.getPendingTransferExpirationTime())
- .setMsg(transferData.getTransferStatus().getMessage())
- .setResponseData(
- ImmutableList.of(
- createTransferResponse(targetId, transferData),
- ContactPendingActionNotificationResponse.create(
- targetId,
- transferData.getTransferStatus().isApproved(),
- transferData.getTransferRequestTrid(),
- now)))
- .setContactHistoryId(contactHistoryId)
- .build();
- }
-
- /** Create a poll message for the losing client in a transfer. */
- static PollMessage createLosingTransferPollMessage(
- String targetId, TransferData transferData, HistoryEntryId contactHistoryId) {
- return new PollMessage.OneTime.Builder()
- .setRegistrarId(transferData.getLosingRegistrarId())
- .setEventTime(transferData.getPendingTransferExpirationTime())
- .setMsg(transferData.getTransferStatus().getMessage())
- .setResponseData(ImmutableList.of(createTransferResponse(targetId, transferData)))
- .setContactHistoryId(contactHistoryId)
- .build();
- }
-
- /** Create a {@link ContactTransferResponse} off of the info in a {@link TransferData}. */
- static ContactTransferResponse createTransferResponse(
- String targetId, TransferData transferData) {
- return new ContactTransferResponse.Builder()
- .setContactId(targetId)
- .setGainingRegistrarId(transferData.getGainingRegistrarId())
- .setLosingRegistrarId(transferData.getLosingRegistrarId())
- .setPendingTransferExpirationTime(transferData.getPendingTransferExpirationTime())
- .setTransferRequestTime(transferData.getTransferRequestTime())
- .setTransferStatus(transferData.getTransferStatus())
- .build();
- }
-
- /** Declining contact disclosure is disallowed by server policy. */
- static class DeclineContactDisclosureFieldDisallowedPolicyException
- extends ParameterValuePolicyErrorException {
- public DeclineContactDisclosureFieldDisallowedPolicyException() {
- super("Declining contact disclosure is disallowed by server policy.");
- }
- }
-
- /** Internationalized postal infos can only contain ASCII characters. */
- static class BadInternationalizedPostalInfoException extends ParameterValueSyntaxErrorException {
- public BadInternationalizedPostalInfoException() {
- super("Internationalized postal infos can only contain ASCII characters");
- }
- }
-}
diff --git a/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java b/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java
index 0f5a1f4d2..20ee4afcc 100644
--- a/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java
+++ b/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java
@@ -14,91 +14,20 @@
package google.registry.flows.contact;
-import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
-import static google.registry.flows.ResourceFlowUtils.loadAndVerifyExistence;
-import static google.registry.flows.ResourceFlowUtils.verifyResourceOwnership;
-import static google.registry.model.EppResourceUtils.isLinked;
-import com.google.common.collect.ImmutableSet;
-import google.registry.flows.EppException;
-import google.registry.flows.ExtensionManager;
-import google.registry.flows.FlowModule.RegistrarId;
-import google.registry.flows.FlowModule.Superuser;
-import google.registry.flows.FlowModule.TargetId;
-import google.registry.flows.TransactionalFlow;
import google.registry.flows.annotations.ReportingSpec;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactInfoData;
-import google.registry.model.eppcommon.AuthInfo;
-import google.registry.model.eppcommon.StatusValue;
-import google.registry.model.eppoutput.EppResponse;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
-import google.registry.util.Clock;
import jakarta.inject.Inject;
-import java.util.Optional;
-import org.joda.time.DateTime;
/**
- * An EPP flow that returns information about a contact.
+ * An EPP flow that is meant to return information about a contact.
*
- * The response includes the contact's postal info, phone numbers, emails, the authInfo which can
- * be used to request a transfer and the details of the contact's most recent transfer if it has
- * ever been transferred. Any registrar can see any contact's information, but the authInfo is only
- * visible to the registrar that owns the contact or to a registrar that already supplied it.
- *
- * @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException}
+ * @error {@link ContactsProhibitedException}
*/
+@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_INFO)
-public final class ContactInfoFlow implements TransactionalFlow {
-
- @Inject ExtensionManager extensionManager;
- @Inject Clock clock;
- @Inject @RegistrarId String registrarId;
- @Inject @TargetId String targetId;
- @Inject Optional authInfo;
- @Inject @Superuser boolean isSuperuser;
- @Inject EppResponse.Builder responseBuilder;
-
+public final class ContactInfoFlow extends ContactsProhibitedFlow {
@Inject
ContactInfoFlow() {}
-
- @Override
- public EppResponse run() throws EppException {
- DateTime now = clock.nowUtc();
- validateRegistrarIsLoggedIn(registrarId);
- extensionManager.validate(); // There are no legal extensions for this flow.
- Contact contact = loadAndVerifyExistence(Contact.class, targetId, now);
- if (!isSuperuser) {
- verifyResourceOwnership(registrarId, contact);
- }
- boolean includeAuthInfo =
- registrarId.equals(contact.getCurrentSponsorRegistrarId()) || authInfo.isPresent();
- ImmutableSet.Builder statusValues = new ImmutableSet.Builder<>();
- statusValues.addAll(contact.getStatusValues());
- if (isLinked(contact.createVKey(), now)) {
- statusValues.add(StatusValue.LINKED);
- }
- return responseBuilder
- .setResData(
- ContactInfoData.newBuilder()
- .setContactId(contact.getContactId())
- .setRepoId(contact.getRepoId())
- .setStatusValues(statusValues.build())
- .setPostalInfos(contact.getPostalInfosAsList())
- .setVoiceNumber(contact.getVoiceNumber())
- .setFaxNumber(contact.getFaxNumber())
- .setEmailAddress(contact.getEmailAddress())
- .setCurrentSponsorRegistrarId(contact.getCurrentSponsorRegistrarId())
- .setCreationRegistrarId(contact.getCreationRegistrarId())
- .setCreationTime(contact.getCreationTime())
- .setLastEppUpdateRegistrarId(contact.getLastEppUpdateRegistrarId())
- .setLastEppUpdateTime(contact.getLastEppUpdateTime())
- .setLastTransferTime(contact.getLastTransferTime())
- .setAuthInfo(includeAuthInfo ? contact.getAuthInfo() : null)
- .setDisclose(contact.getDisclose())
- .build())
- .build();
- }
}
diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java
index bf04f6361..9b85caffc 100644
--- a/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java
+++ b/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java
@@ -14,92 +14,19 @@
package google.registry.flows.contact;
-import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
-import static google.registry.flows.ResourceFlowUtils.loadAndVerifyExistence;
-import static google.registry.flows.ResourceFlowUtils.verifyHasPendingTransfer;
-import static google.registry.flows.ResourceFlowUtils.verifyOptionalAuthInfo;
-import static google.registry.flows.ResourceFlowUtils.verifyResourceOwnership;
-import static google.registry.flows.contact.ContactFlowUtils.createGainingTransferPollMessage;
-import static google.registry.flows.contact.ContactFlowUtils.createTransferResponse;
-import static google.registry.model.ResourceTransferUtils.approvePendingTransfer;
-import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_TRANSFER_APPROVE;
-import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
-import com.google.common.collect.ImmutableSet;
-import google.registry.flows.EppException;
-import google.registry.flows.ExtensionManager;
-import google.registry.flows.FlowModule.RegistrarId;
-import google.registry.flows.FlowModule.TargetId;
-import google.registry.flows.MutatingFlow;
import google.registry.flows.annotations.ReportingSpec;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactHistory;
-import google.registry.model.domain.metadata.MetadataExtension;
-import google.registry.model.eppcommon.AuthInfo;
-import google.registry.model.eppinput.ResourceCommand;
-import google.registry.model.eppoutput.EppResponse;
-import google.registry.model.poll.PollMessage;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
-import google.registry.model.transfer.TransferStatus;
import jakarta.inject.Inject;
-import java.util.Optional;
-import org.joda.time.DateTime;
/**
- * An EPP flow that approves a pending transfer on a contact.
+ * An EPP flow that is meant to approve a pending transfer on a contact.
*
- * The "gaining" registrar requests a transfer from the "losing" (aka current) registrar. The
- * losing registrar has a "transfer" time period to respond (by default five days) after which the
- * transfer is automatically approved. Within that window, this flow allows the losing client to
- * explicitly approve the transfer request, which then becomes effective immediately.
- *
- * @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
- * @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
- * @error {@link google.registry.flows.exceptions.NotPendingTransferException}
+ * @error {@link ContactsProhibitedException}
*/
+@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_TRANSFER_APPROVE)
-public final class ContactTransferApproveFlow implements MutatingFlow {
-
- @Inject ResourceCommand resourceCommand;
- @Inject ExtensionManager extensionManager;
- @Inject @RegistrarId String registrarId;
- @Inject @TargetId String targetId;
- @Inject Optional authInfo;
- @Inject ContactHistory.Builder historyBuilder;
- @Inject EppResponse.Builder responseBuilder;
+public final class ContactTransferApproveFlow extends ContactsProhibitedFlow {
@Inject ContactTransferApproveFlow() {}
-
- /**
- * The logic in this flow, which handles client approvals, very closely parallels the logic in
- * {@link Contact#cloneProjectedAtTime} which handles implicit server approvals.
- */
- @Override
- public EppResponse run() throws EppException {
- extensionManager.register(MetadataExtension.class);
- validateRegistrarIsLoggedIn(registrarId);
- extensionManager.validate();
- DateTime now = tm().getTransactionTime();
- Contact existingContact = loadAndVerifyExistence(Contact.class, targetId, now);
- verifyOptionalAuthInfo(authInfo, existingContact);
- verifyHasPendingTransfer(existingContact);
- verifyResourceOwnership(registrarId, existingContact);
- Contact newContact =
- approvePendingTransfer(existingContact, TransferStatus.CLIENT_APPROVED, now);
- ContactHistory contactHistory =
- historyBuilder.setType(CONTACT_TRANSFER_APPROVE).setContact(newContact).build();
- // Create a poll message for the gaining client.
- PollMessage gainingPollMessage =
- createGainingTransferPollMessage(
- targetId, newContact.getTransferData(), now, contactHistory.getHistoryEntryId());
- tm().insertAll(ImmutableSet.of(contactHistory, gainingPollMessage));
- tm().update(newContact);
- // Delete the billing event and poll messages that were written in case the transfer would have
- // been implicitly server approved.
- tm().delete(existingContact.getTransferData().getServerApproveEntities());
- return responseBuilder
- .setResData(createTransferResponse(targetId, newContact.getTransferData()))
- .build();
- }
}
diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java
index c126451e9..8f7d5a833 100644
--- a/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java
+++ b/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java
@@ -14,88 +14,19 @@
package google.registry.flows.contact;
-import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
-import static google.registry.flows.ResourceFlowUtils.loadAndVerifyExistence;
-import static google.registry.flows.ResourceFlowUtils.verifyHasPendingTransfer;
-import static google.registry.flows.ResourceFlowUtils.verifyOptionalAuthInfo;
-import static google.registry.flows.ResourceFlowUtils.verifyTransferInitiator;
-import static google.registry.flows.contact.ContactFlowUtils.createLosingTransferPollMessage;
-import static google.registry.flows.contact.ContactFlowUtils.createTransferResponse;
-import static google.registry.model.ResourceTransferUtils.denyPendingTransfer;
-import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_TRANSFER_CANCEL;
-import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
-import com.google.common.collect.ImmutableSet;
-import google.registry.flows.EppException;
-import google.registry.flows.ExtensionManager;
-import google.registry.flows.FlowModule.RegistrarId;
-import google.registry.flows.FlowModule.TargetId;
-import google.registry.flows.MutatingFlow;
import google.registry.flows.annotations.ReportingSpec;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactHistory;
-import google.registry.model.domain.metadata.MetadataExtension;
-import google.registry.model.eppcommon.AuthInfo;
-import google.registry.model.eppinput.ResourceCommand;
-import google.registry.model.eppoutput.EppResponse;
-import google.registry.model.poll.PollMessage;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
-import google.registry.model.transfer.TransferStatus;
import jakarta.inject.Inject;
-import java.util.Optional;
-import org.joda.time.DateTime;
/**
- * An EPP flow that cancels a pending transfer on a contact.
+ * An EPP flow that is meant to cancel a pending transfer on a contact.
*
- * The "gaining" registrar requests a transfer from the "losing" (aka current) registrar. The
- * losing registrar has a "transfer" time period to respond (by default five days) after which the
- * transfer is automatically approved. Within that window, this flow allows the gaining client to
- * withdraw the transfer request.
- *
- * @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
- * @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
- * @error {@link google.registry.flows.exceptions.NotPendingTransferException}
- * @error {@link google.registry.flows.exceptions.NotTransferInitiatorException}
+ * @error {@link ContactsProhibitedException}
*/
+@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_TRANSFER_CANCEL)
-public final class ContactTransferCancelFlow implements MutatingFlow {
-
- @Inject ResourceCommand resourceCommand;
- @Inject ExtensionManager extensionManager;
- @Inject Optional authInfo;
- @Inject @RegistrarId String registrarId;
- @Inject @TargetId String targetId;
- @Inject ContactHistory.Builder historyBuilder;
- @Inject EppResponse.Builder responseBuilder;
+public final class ContactTransferCancelFlow extends ContactsProhibitedFlow {
@Inject ContactTransferCancelFlow() {}
-
- @Override
- public EppResponse run() throws EppException {
- extensionManager.register(MetadataExtension.class);
- validateRegistrarIsLoggedIn(registrarId);
- extensionManager.validate();
- DateTime now = tm().getTransactionTime();
- Contact existingContact = loadAndVerifyExistence(Contact.class, targetId, now);
- verifyOptionalAuthInfo(authInfo, existingContact);
- verifyHasPendingTransfer(existingContact);
- verifyTransferInitiator(registrarId, existingContact);
- Contact newContact =
- denyPendingTransfer(existingContact, TransferStatus.CLIENT_CANCELLED, now, registrarId);
- ContactHistory contactHistory =
- historyBuilder.setType(CONTACT_TRANSFER_CANCEL).setContact(newContact).build();
- // Create a poll message for the losing client.
- PollMessage losingPollMessage =
- createLosingTransferPollMessage(
- targetId, newContact.getTransferData(), contactHistory.getHistoryEntryId());
- tm().insertAll(ImmutableSet.of(contactHistory, losingPollMessage));
- tm().update(newContact);
- // Delete the billing event and poll messages that were written in case the transfer would have
- // been implicitly server approved.
- tm().delete(existingContact.getTransferData().getServerApproveEntities());
- return responseBuilder
- .setResData(createTransferResponse(targetId, newContact.getTransferData()))
- .build();
- }
}
diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java
index deee73fdd..1894ecd3d 100644
--- a/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java
+++ b/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java
@@ -14,74 +14,19 @@
package google.registry.flows.contact;
-import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
-import static google.registry.flows.ResourceFlowUtils.loadAndVerifyExistence;
-import static google.registry.flows.ResourceFlowUtils.verifyOptionalAuthInfo;
-import static google.registry.flows.contact.ContactFlowUtils.createTransferResponse;
-import google.registry.flows.EppException;
-import google.registry.flows.ExtensionManager;
-import google.registry.flows.FlowModule.RegistrarId;
-import google.registry.flows.FlowModule.TargetId;
-import google.registry.flows.TransactionalFlow;
import google.registry.flows.annotations.ReportingSpec;
-import google.registry.flows.exceptions.NoTransferHistoryToQueryException;
-import google.registry.flows.exceptions.NotAuthorizedToViewTransferException;
-import google.registry.model.contact.Contact;
-import google.registry.model.eppcommon.AuthInfo;
-import google.registry.model.eppoutput.EppResponse;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
-import google.registry.util.Clock;
import jakarta.inject.Inject;
-import java.util.Optional;
/**
- * An EPP flow that queries a pending transfer on a contact.
+ * An EPP flow that is meant to query a pending transfer on a contact.
*
- * The "gaining" registrar requests a transfer from the "losing" (aka current) registrar. The
- * losing registrar has a "transfer" time period to respond (by default five days) after which the
- * transfer is automatically approved. This flow can be used by the gaining or losing registrars (or
- * anyone with the correct authId) to see the status of a transfer, which may still be pending or
- * may have been approved, rejected, cancelled or implicitly approved by virtue of the transfer
- * period expiring.
- *
- * @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
- * @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
- * @error {@link google.registry.flows.exceptions.NoTransferHistoryToQueryException}
- * @error {@link google.registry.flows.exceptions.NotAuthorizedToViewTransferException}
+ * @error {@link ContactsProhibitedException}
*/
+@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_TRANSFER_QUERY)
-public final class ContactTransferQueryFlow implements TransactionalFlow {
-
- @Inject ExtensionManager extensionManager;
- @Inject Optional authInfo;
- @Inject @RegistrarId String registrarId;
- @Inject @TargetId String targetId;
- @Inject Clock clock;
- @Inject EppResponse.Builder responseBuilder;
+public final class ContactTransferQueryFlow extends ContactsProhibitedFlow {
@Inject ContactTransferQueryFlow() {}
-
- @Override
- public EppResponse run() throws EppException {
- validateRegistrarIsLoggedIn(registrarId);
- extensionManager.validate(); // There are no legal extensions for this flow.
- Contact contact = loadAndVerifyExistence(Contact.class, targetId, clock.nowUtc());
- verifyOptionalAuthInfo(authInfo, contact);
- // Most of the fields on the transfer response are required, so there's no way to return valid
- // XML if the object has never been transferred (and hence the fields aren't populated).
- if (contact.getTransferData().getTransferStatus() == null) {
- throw new NoTransferHistoryToQueryException();
- }
- // Note that the authorization info on the command (if present) has already been verified. If
- // it's present, then the other checks are unnecessary.
- if (authInfo.isEmpty()
- && !registrarId.equals(contact.getTransferData().getGainingRegistrarId())
- && !registrarId.equals(contact.getTransferData().getLosingRegistrarId())) {
- throw new NotAuthorizedToViewTransferException();
- }
- return responseBuilder
- .setResData(createTransferResponse(targetId, contact.getTransferData()))
- .build();
- }
}
diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java
index dddce31da..3eb7d0564 100644
--- a/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java
+++ b/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java
@@ -14,85 +14,19 @@
package google.registry.flows.contact;
-import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
-import static google.registry.flows.ResourceFlowUtils.loadAndVerifyExistence;
-import static google.registry.flows.ResourceFlowUtils.verifyHasPendingTransfer;
-import static google.registry.flows.ResourceFlowUtils.verifyOptionalAuthInfo;
-import static google.registry.flows.ResourceFlowUtils.verifyResourceOwnership;
-import static google.registry.flows.contact.ContactFlowUtils.createGainingTransferPollMessage;
-import static google.registry.flows.contact.ContactFlowUtils.createTransferResponse;
-import static google.registry.model.ResourceTransferUtils.denyPendingTransfer;
-import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_TRANSFER_REJECT;
-import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
-import com.google.common.collect.ImmutableSet;
-import google.registry.flows.EppException;
-import google.registry.flows.ExtensionManager;
-import google.registry.flows.FlowModule.RegistrarId;
-import google.registry.flows.FlowModule.TargetId;
-import google.registry.flows.MutatingFlow;
import google.registry.flows.annotations.ReportingSpec;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactHistory;
-import google.registry.model.domain.metadata.MetadataExtension;
-import google.registry.model.eppcommon.AuthInfo;
-import google.registry.model.eppoutput.EppResponse;
-import google.registry.model.poll.PollMessage;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
-import google.registry.model.transfer.TransferStatus;
import jakarta.inject.Inject;
-import java.util.Optional;
-import org.joda.time.DateTime;
/**
- * An EPP flow that rejects a pending transfer on a contact.
+ * An EPP flow that is meant to reject a pending transfer on a contact.
*
- * The "gaining" registrar requests a transfer from the "losing" (aka current) registrar. The
- * losing registrar has a "transfer" time period to respond (by default five days) after which the
- * transfer is automatically approved. Within that window, this flow allows the losing client to
- * reject the transfer request.
- *
- * @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
- * @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException}
- * @error {@link google.registry.flows.exceptions.NotPendingTransferException}
+ * @error {@link ContactsProhibitedException}
*/
+@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_TRANSFER_REJECT)
-public final class ContactTransferRejectFlow implements MutatingFlow {
-
- @Inject ExtensionManager extensionManager;
- @Inject Optional authInfo;
- @Inject @RegistrarId String registrarId;
- @Inject @TargetId String targetId;
- @Inject ContactHistory.Builder historyBuilder;
- @Inject EppResponse.Builder responseBuilder;
+public final class ContactTransferRejectFlow extends ContactsProhibitedFlow {
@Inject ContactTransferRejectFlow() {}
-
- @Override
- public EppResponse run() throws EppException {
- extensionManager.register(MetadataExtension.class);
- validateRegistrarIsLoggedIn(registrarId);
- extensionManager.validate();
- DateTime now = tm().getTransactionTime();
- Contact existingContact = loadAndVerifyExistence(Contact.class, targetId, now);
- verifyOptionalAuthInfo(authInfo, existingContact);
- verifyHasPendingTransfer(existingContact);
- verifyResourceOwnership(registrarId, existingContact);
- Contact newContact =
- denyPendingTransfer(existingContact, TransferStatus.CLIENT_REJECTED, now, registrarId);
- ContactHistory contactHistory =
- historyBuilder.setType(CONTACT_TRANSFER_REJECT).setContact(newContact).build();
- PollMessage gainingPollMessage =
- createGainingTransferPollMessage(
- targetId, newContact.getTransferData(), now, contactHistory.getHistoryEntryId());
- tm().insertAll(ImmutableSet.of(contactHistory, gainingPollMessage));
- tm().update(newContact);
- // Delete the billing event and poll messages that were written in case the transfer would have
- // been implicitly server approved.
- tm().delete(existingContact.getTransferData().getServerApproveEntities());
- return responseBuilder
- .setResData(createTransferResponse(targetId, newContact.getTransferData()))
- .build();
- }
}
diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java
index af662cc5e..18f1436ce 100644
--- a/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java
+++ b/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java
@@ -14,162 +14,20 @@
package google.registry.flows.contact;
-import static google.registry.flows.FlowUtils.createHistoryEntryId;
-import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
-import static google.registry.flows.ResourceFlowUtils.loadAndVerifyExistence;
-import static google.registry.flows.ResourceFlowUtils.verifyAuthInfo;
-import static google.registry.flows.ResourceFlowUtils.verifyAuthInfoPresentForResourceTransfer;
-import static google.registry.flows.ResourceFlowUtils.verifyNoDisallowedStatuses;
-import static google.registry.flows.contact.ContactFlowUtils.createGainingTransferPollMessage;
-import static google.registry.flows.contact.ContactFlowUtils.createLosingTransferPollMessage;
-import static google.registry.flows.contact.ContactFlowUtils.createTransferResponse;
-import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_ACTION_PENDING;
-import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_TRANSFER_REQUEST;
-import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
-import com.google.common.collect.ImmutableSet;
-import google.registry.config.RegistryConfig.Config;
-import google.registry.flows.EppException;
-import google.registry.flows.ExtensionManager;
-import google.registry.flows.FlowModule.RegistrarId;
-import google.registry.flows.FlowModule.TargetId;
-import google.registry.flows.MutatingFlow;
import google.registry.flows.annotations.ReportingSpec;
-import google.registry.flows.exceptions.AlreadyPendingTransferException;
-import google.registry.flows.exceptions.ObjectAlreadySponsoredException;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactHistory;
-import google.registry.model.domain.metadata.MetadataExtension;
-import google.registry.model.eppcommon.AuthInfo;
-import google.registry.model.eppcommon.StatusValue;
-import google.registry.model.eppcommon.Trid;
-import google.registry.model.eppoutput.EppResponse;
-import google.registry.model.poll.PollMessage;
-import google.registry.model.reporting.HistoryEntry.HistoryEntryId;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
-import google.registry.model.transfer.ContactTransferData;
-import google.registry.model.transfer.TransferStatus;
import jakarta.inject.Inject;
-import java.util.Optional;
-import org.joda.time.DateTime;
-import org.joda.time.Duration;
/**
- * An EPP flow that requests a transfer on a contact.
+ * An EPP flow that is meant to request a transfer on a contact.
*
- * The "gaining" registrar requests a transfer from the "losing" (aka current) registrar. The
- * losing registrar has a "transfer" time period to respond (by default five days) after which the
- * transfer is automatically approved. Within that window, the transfer might be approved explicitly
- * by the losing registrar or rejected, and the gaining registrar can also cancel the transfer
- * request.
- *
- * @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
- * @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
- * @error {@link google.registry.flows.exceptions.AlreadyPendingTransferException}
- * @error {@link google.registry.flows.exceptions.MissingTransferRequestAuthInfoException}
- * @error {@link google.registry.flows.exceptions.ObjectAlreadySponsoredException}
- * @error {@link google.registry.flows.exceptions.ResourceStatusProhibitsOperationException}
+ * @error {@link ContactsProhibitedException}
*/
+@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_TRANSFER_REQUEST)
-public final class ContactTransferRequestFlow implements MutatingFlow {
-
- private static final ImmutableSet DISALLOWED_STATUSES =
- ImmutableSet.of(
- StatusValue.CLIENT_TRANSFER_PROHIBITED,
- StatusValue.PENDING_DELETE,
- StatusValue.SERVER_TRANSFER_PROHIBITED);
-
- @Inject ExtensionManager extensionManager;
- @Inject Optional authInfo;
- @Inject @RegistrarId String gainingClientId;
- @Inject @TargetId String targetId;
-
- @Inject
- @Config("contactAutomaticTransferLength")
- Duration automaticTransferLength;
-
- @Inject ContactHistory.Builder historyBuilder;
- @Inject Trid trid;
- @Inject EppResponse.Builder responseBuilder;
-
+public final class ContactTransferRequestFlow extends ContactsProhibitedFlow {
@Inject
ContactTransferRequestFlow() {}
-
- @Override
- public EppResponse run() throws EppException {
- extensionManager.register(MetadataExtension.class);
- validateRegistrarIsLoggedIn(gainingClientId);
- extensionManager.validate();
- DateTime now = tm().getTransactionTime();
- Contact existingContact = loadAndVerifyExistence(Contact.class, targetId, now);
- verifyAuthInfoPresentForResourceTransfer(authInfo);
- verifyAuthInfo(authInfo.get(), existingContact);
- // Verify that the resource does not already have a pending transfer.
- if (TransferStatus.PENDING.equals(existingContact.getTransferData().getTransferStatus())) {
- throw new AlreadyPendingTransferException(targetId);
- }
- String losingClientId = existingContact.getCurrentSponsorRegistrarId();
- // Verify that this client doesn't already sponsor this resource.
- if (gainingClientId.equals(losingClientId)) {
- throw new ObjectAlreadySponsoredException();
- }
- verifyNoDisallowedStatuses(existingContact, DISALLOWED_STATUSES);
-
- DateTime transferExpirationTime = now.plus(automaticTransferLength);
- ContactTransferData serverApproveTransferData =
- new ContactTransferData.Builder()
- .setTransferRequestTime(now)
- .setTransferRequestTrid(trid)
- .setGainingRegistrarId(gainingClientId)
- .setLosingRegistrarId(losingClientId)
- .setPendingTransferExpirationTime(transferExpirationTime)
- .setTransferStatus(TransferStatus.SERVER_APPROVED)
- .build();
- HistoryEntryId contactHistoryId = createHistoryEntryId(existingContact);
- historyBuilder
- .setRevisionId(contactHistoryId.getRevisionId())
- .setType(CONTACT_TRANSFER_REQUEST);
- // If the transfer is server approved, this message will be sent to the losing registrar. */
- PollMessage serverApproveLosingPollMessage =
- createLosingTransferPollMessage(targetId, serverApproveTransferData, contactHistoryId);
- // If the transfer is server approved, this message will be sent to the gaining registrar. */
- PollMessage serverApproveGainingPollMessage =
- createGainingTransferPollMessage(
- targetId, serverApproveTransferData, now, contactHistoryId);
- ContactTransferData pendingTransferData =
- serverApproveTransferData
- .asBuilder()
- .setTransferStatus(TransferStatus.PENDING)
- .setServerApproveEntities(
- serverApproveGainingPollMessage.getContactRepoId(),
- contactHistoryId.getRevisionId(),
- ImmutableSet.of(
- serverApproveGainingPollMessage.createVKey(),
- serverApproveLosingPollMessage.createVKey()))
- .build();
- // When a transfer is requested, a poll message is created to notify the losing registrar.
- PollMessage requestPollMessage =
- createLosingTransferPollMessage(targetId, pendingTransferData, contactHistoryId)
- .asBuilder()
- .setEventTime(now) // Unlike the serverApprove messages, this applies immediately.
- .build();
- Contact newContact =
- existingContact
- .asBuilder()
- .setTransferData(pendingTransferData)
- .addStatusValue(StatusValue.PENDING_TRANSFER)
- .build();
- tm().update(newContact);
- tm().insertAll(
- ImmutableSet.of(
- historyBuilder.setContact(newContact).build(),
- requestPollMessage,
- serverApproveGainingPollMessage,
- serverApproveLosingPollMessage));
- return responseBuilder
- .setResultFromCode(SUCCESS_WITH_ACTION_PENDING)
- .setResData(createTransferResponse(targetId, newContact.getTransferData()))
- .build();
- }
}
diff --git a/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java b/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java
index afc3c2070..726f11028 100644
--- a/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java
+++ b/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java
@@ -14,158 +14,19 @@
package google.registry.flows.contact;
-import static com.google.common.collect.Sets.union;
-import static google.registry.flows.FlowUtils.validateRegistrarIsLoggedIn;
-import static google.registry.flows.ResourceFlowUtils.checkSameValuesNotAddedAndRemoved;
-import static google.registry.flows.ResourceFlowUtils.loadAndVerifyExistence;
-import static google.registry.flows.ResourceFlowUtils.verifyAllStatusesAreClientSettable;
-import static google.registry.flows.ResourceFlowUtils.verifyNoDisallowedStatuses;
-import static google.registry.flows.ResourceFlowUtils.verifyOptionalAuthInfo;
-import static google.registry.flows.ResourceFlowUtils.verifyResourceOwnership;
-import static google.registry.flows.contact.ContactFlowUtils.validateAsciiPostalInfo;
-import static google.registry.flows.contact.ContactFlowUtils.validateContactAgainstPolicy;
-import static google.registry.model.common.FeatureFlag.FeatureName.MINIMUM_DATASET_CONTACTS_PROHIBITED;
-import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_UPDATE;
-import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
-import com.google.common.collect.ImmutableSet;
-import google.registry.flows.EppException;
-import google.registry.flows.ExtensionManager;
-import google.registry.flows.FlowModule.RegistrarId;
-import google.registry.flows.FlowModule.Superuser;
-import google.registry.flows.FlowModule.TargetId;
-import google.registry.flows.MutatingFlow;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.flows.exceptions.ContactsProhibitedException;
-import google.registry.flows.exceptions.ResourceHasClientUpdateProhibitedException;
-import google.registry.model.common.FeatureFlag;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactCommand.Update;
-import google.registry.model.contact.ContactCommand.Update.Change;
-import google.registry.model.contact.ContactHistory;
-import google.registry.model.contact.PostalInfo;
-import google.registry.model.domain.metadata.MetadataExtension;
-import google.registry.model.eppcommon.AuthInfo;
-import google.registry.model.eppcommon.StatusValue;
-import google.registry.model.eppinput.ResourceCommand;
-import google.registry.model.eppoutput.EppResponse;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import jakarta.inject.Inject;
-import java.util.Optional;
-import javax.annotation.Nullable;
-import org.joda.time.DateTime;
/**
- * An EPP flow that updates a contact.
+ * An EPP flow meant to update a contact.
*
* @error {@link ContactsProhibitedException}
- * @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
- * @error {@link google.registry.flows.ResourceFlowUtils.AddRemoveSameValueException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
- * @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException}
- * @error {@link google.registry.flows.ResourceFlowUtils.StatusNotClientSettableException}
- * @error {@link google.registry.flows.exceptions.ResourceHasClientUpdateProhibitedException}
- * @error {@link google.registry.flows.exceptions.ResourceStatusProhibitsOperationException}
- * @error {@link ContactFlowUtils.BadInternationalizedPostalInfoException}
- * @error {@link ContactFlowUtils.DeclineContactDisclosureFieldDisallowedPolicyException}
*/
+@Deprecated
@ReportingSpec(ActivityReportField.CONTACT_UPDATE)
-public final class ContactUpdateFlow implements MutatingFlow {
-
- /**
- * Note that CLIENT_UPDATE_PROHIBITED is intentionally not in this list. This is because it
- * requires special checking, since you must be able to clear the status off the object with an
- * update.
- */
- private static final ImmutableSet DISALLOWED_STATUSES = ImmutableSet.of(
- StatusValue.PENDING_DELETE,
- StatusValue.SERVER_UPDATE_PROHIBITED);
-
- @Inject ResourceCommand resourceCommand;
- @Inject ExtensionManager extensionManager;
- @Inject Optional authInfo;
- @Inject @RegistrarId String registrarId;
- @Inject @TargetId String targetId;
- @Inject @Superuser boolean isSuperuser;
- @Inject ContactHistory.Builder historyBuilder;
- @Inject EppResponse.Builder responseBuilder;
+public final class ContactUpdateFlow extends ContactsProhibitedFlow {
@Inject ContactUpdateFlow() {}
-
- @Override
- public EppResponse run() throws EppException {
- extensionManager.register(MetadataExtension.class);
- validateRegistrarIsLoggedIn(registrarId);
- extensionManager.validate();
- if (FeatureFlag.isActiveNow(MINIMUM_DATASET_CONTACTS_PROHIBITED)) {
- throw new ContactsProhibitedException();
- }
- Update command = (Update) resourceCommand;
- DateTime now = tm().getTransactionTime();
- Contact existingContact = loadAndVerifyExistence(Contact.class, targetId, now);
- verifyOptionalAuthInfo(authInfo, existingContact);
- ImmutableSet statusToRemove = command.getInnerRemove().getStatusValues();
- ImmutableSet statusesToAdd = command.getInnerAdd().getStatusValues();
- if (!isSuperuser) { // The superuser can update any contact and set any status.
- verifyResourceOwnership(registrarId, existingContact);
- verifyAllStatusesAreClientSettable(union(statusesToAdd, statusToRemove));
- }
- verifyNoDisallowedStatuses(existingContact, DISALLOWED_STATUSES);
- checkSameValuesNotAddedAndRemoved(statusesToAdd, statusToRemove);
- Contact.Builder builder = existingContact.asBuilder();
- Change change = command.getInnerChange();
- // The spec requires the following behaviors:
- // * If you update part of a postal info, the fields that you didn't update are unchanged.
- // * If you update one postal info but not the other, the other is deleted.
- // Therefore, if you want to preserve one postal info and update another you need to send the
- // update and also something that technically updates the preserved one, even if it only
- // "updates" it by setting just one field to the same value.
- PostalInfo internationalized = change.getInternationalizedPostalInfo();
- PostalInfo localized = change.getLocalizedPostalInfo();
- if (internationalized != null) {
- builder.overlayInternationalizedPostalInfo(internationalized);
- if (localized == null) {
- builder.setLocalizedPostalInfo(null);
- }
- }
- if (localized != null) {
- builder.overlayLocalizedPostalInfo(localized);
- if (internationalized == null) {
- builder.setInternationalizedPostalInfo(null);
- }
- }
- Contact newContact =
- builder
- .setLastEppUpdateTime(now)
- .setLastEppUpdateRegistrarId(registrarId)
- .setAuthInfo(preferFirst(change.getAuthInfo(), existingContact.getAuthInfo()))
- .setDisclose(preferFirst(change.getDisclose(), existingContact.getDisclose()))
- .setEmailAddress(preferFirst(change.getEmail(), existingContact.getEmailAddress()))
- .setFaxNumber(preferFirst(change.getFax(), existingContact.getFaxNumber()))
- .setVoiceNumber(preferFirst(change.getVoice(), existingContact.getVoiceNumber()))
- .addStatusValues(statusesToAdd)
- .removeStatusValues(statusToRemove)
- .build();
- // If the resource is marked with clientUpdateProhibited, and this update did not clear that
- // status, then the update must be disallowed (unless a superuser is requesting the change).
- if (!isSuperuser
- && existingContact.getStatusValues().contains(StatusValue.CLIENT_UPDATE_PROHIBITED)
- && newContact.getStatusValues().contains(StatusValue.CLIENT_UPDATE_PROHIBITED)) {
- throw new ResourceHasClientUpdateProhibitedException();
- }
- validateAsciiPostalInfo(newContact.getInternationalizedPostalInfo());
- validateContactAgainstPolicy(newContact);
- historyBuilder
- .setType(CONTACT_UPDATE)
- .setXmlBytes(null) // We don't want to store contact details in the history entry.
- .setContact(newContact);
- tm().insert(historyBuilder.build());
- tm().update(newContact);
- return responseBuilder.build();
- }
-
- /** Return the first non-null param, or null if both are null. */
- @Nullable
- private static T preferFirst(@Nullable T a, @Nullable T b) {
- return a != null ? a : b;
- }
}
diff --git a/core/src/main/java/google/registry/flows/contact/ContactsProhibitedFlow.java b/core/src/main/java/google/registry/flows/contact/ContactsProhibitedFlow.java
new file mode 100644
index 000000000..64aaa73be
--- /dev/null
+++ b/core/src/main/java/google/registry/flows/contact/ContactsProhibitedFlow.java
@@ -0,0 +1,28 @@
+// Copyright 2025 The Nomulus Authors. All Rights Reserved.
+//
+// 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 google.registry.flows.contact;
+
+import google.registry.flows.EppException;
+import google.registry.flows.Flow;
+import google.registry.flows.exceptions.ContactsProhibitedException;
+import google.registry.model.eppoutput.EppResponse;
+
+/** Nomulus follows the Minimum Dataset Requirements, meaning it stores no contact information. */
+public abstract class ContactsProhibitedFlow implements Flow {
+ @Override
+ public EppResponse run() throws EppException {
+ throw new ContactsProhibitedException();
+ }
+}
diff --git a/core/src/main/java/google/registry/flows/picker/FlowPicker.java b/core/src/main/java/google/registry/flows/picker/FlowPicker.java
index 4440fa568..e38b0d03d 100644
--- a/core/src/main/java/google/registry/flows/picker/FlowPicker.java
+++ b/core/src/main/java/google/registry/flows/picker/FlowPicker.java
@@ -135,7 +135,6 @@ public class FlowPicker {
return switch (((Poll) innerCommand).getPollOp()) {
case ACK -> PollAckFlow.class;
case REQUEST -> PollRequestFlow.class;
- default -> UnimplementedFlow.class;
};
}
};
diff --git a/core/src/test/java/google/registry/flows/EppLifecycleContactTest.java b/core/src/test/java/google/registry/flows/EppLifecycleContactTest.java
deleted file mode 100644
index e79ed9170..000000000
--- a/core/src/test/java/google/registry/flows/EppLifecycleContactTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2017 The Nomulus Authors. All Rights Reserved.
-//
-// 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 google.registry.flows;
-
-import static google.registry.model.eppoutput.Result.Code.SUCCESS;
-import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_ACK_MESSAGE;
-import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_NO_MESSAGES;
-import static google.registry.testing.EppMetricSubject.assertThat;
-
-import com.google.common.collect.ImmutableMap;
-import google.registry.persistence.transaction.JpaTestExtensions;
-import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-
-/** Tests for contact lifecycle. */
-class EppLifecycleContactTest extends EppTestCase {
-
- @RegisterExtension
- final JpaIntegrationTestExtension jpa =
- new JpaTestExtensions.Builder().withClock(clock).buildIntegrationTestExtension();
-
- @Test
- void testContactLifecycle() throws Exception {
- assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
- assertThatCommand("contact_create_sh8013.xml")
- .atTime("2000-06-01T00:00:00Z")
- .hasResponse(
- "contact_create_response_sh8013.xml",
- ImmutableMap.of("CRDATE", "2000-06-01T00:00:00Z"));
- assertThat(getRecordedEppMetric())
- .hasClientId("NewRegistrar")
- .and()
- .hasNoTld()
- .and()
- .hasCommandName("ContactCreate")
- .and()
- .hasStatus(SUCCESS);
- assertThatCommand("contact_info.xml")
- .atTime("2000-06-01T00:01:00Z")
- .hasResponse("contact_info_from_create_response.xml");
- assertThat(getRecordedEppMetric())
- .hasClientId("NewRegistrar")
- .and()
- .hasCommandName("ContactInfo")
- .and()
- .hasStatus(SUCCESS);
- assertThatCommand("contact_delete_sh8013.xml")
- .hasResponse("contact_delete_response_sh8013.xml");
- assertThat(getRecordedEppMetric())
- .hasClientId("NewRegistrar")
- .and()
- .hasCommandName("ContactDelete")
- .and()
- .hasStatus(SUCCESS);
- assertThatLogoutSucceeds();
- }
-
- @Test
- void testContactTransferPollMessage() throws Exception {
- assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
- assertThatCommand("contact_create_sh8013.xml")
- .atTime("2000-06-01T00:00:00Z")
- .hasResponse(
- "contact_create_response_sh8013.xml",
- ImmutableMap.of("CRDATE", "2000-06-01T00:00:00Z"));
- assertThatLogoutSucceeds();
-
- // Initiate a transfer of the newly created contact.
- assertThatLoginSucceeds("TheRegistrar", "password2");
- assertThatCommand("contact_transfer_request.xml")
- .atTime("2000-06-08T22:00:00Z")
- .hasResponse("contact_transfer_request_response_alternate.xml");
- assertThatLogoutSucceeds();
-
- // Log back in with the losing registrar, read the poll message, and then ack it.
- assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
- assertThatCommand("poll.xml")
- .atTime("2000-06-08T22:01:00Z")
- .hasResponse("poll_response_contact_transfer.xml");
- assertThat(getRecordedEppMetric())
- .hasClientId("NewRegistrar")
- .and()
- .hasCommandName("PollRequest")
- .and()
- .hasStatus(SUCCESS_WITH_ACK_MESSAGE);
- assertThatCommand("poll_ack.xml", ImmutableMap.of("ID", "6-2000"))
- .atTime("2000-06-08T22:02:00Z")
- .hasResponse("poll_ack_response_empty.xml");
- assertThat(getRecordedEppMetric())
- .hasClientId("NewRegistrar")
- .and()
- .hasCommandName("PollAck")
- .and()
- .hasStatus(SUCCESS_WITH_NO_MESSAGES);
- assertThatLogoutSucceeds();
- }
-}
diff --git a/core/src/test/java/google/registry/flows/EppLifecycleHostTest.java b/core/src/test/java/google/registry/flows/EppLifecycleHostTest.java
index f97396af5..ccb5705c7 100644
--- a/core/src/test/java/google/registry/flows/EppLifecycleHostTest.java
+++ b/core/src/test/java/google/registry/flows/EppLifecycleHostTest.java
@@ -91,14 +91,6 @@ class EppLifecycleHostTest extends EppTestCase {
createTld("example");
assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
// Create the fakesite domain.
- assertThatCommand("contact_create_sh8013.xml")
- .atTime("2000-06-01T00:00:00Z")
- .hasResponse(
- "contact_create_response_sh8013.xml",
- ImmutableMap.of("CRDATE", "2000-06-01T00:00:00Z"));
- assertThatCommand("contact_create_jd1234.xml")
- .atTime("2000-06-01T00:01:00Z")
- .hasResponse("contact_create_response_jd1234.xml");
assertThatCommand("domain_create_fakesite_no_nameservers.xml")
.atTime("2000-06-01T00:04:00Z")
.hasResponse(
@@ -142,15 +134,6 @@ class EppLifecycleHostTest extends EppTestCase {
assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
- assertThatCommand("contact_create_sh8013.xml")
- .atTime("2000-06-01T00:00:00Z")
- .hasResponse(
- "contact_create_response_sh8013.xml",
- ImmutableMap.of("CRDATE", "2000-06-01T00:00:00Z"));
- assertThatCommand("contact_create_jd1234.xml")
- .atTime("2000-06-01T00:01:00Z")
- .hasResponse("contact_create_response_jd1234.xml");
-
// Create domain example.bar.foo.tld
assertThatCommand(
"domain_create_no_hosts_or_dsdata.xml",
diff --git a/core/src/test/java/google/registry/flows/EppTestCase.java b/core/src/test/java/google/registry/flows/EppTestCase.java
index d86f84134..23f6979d6 100644
--- a/core/src/test/java/google/registry/flows/EppTestCase.java
+++ b/core/src/test/java/google/registry/flows/EppTestCase.java
@@ -223,7 +223,7 @@ public class EppTestCase {
return eppMetricBuilder.build();
}
- /** Create the two administrative contacts and two hosts. */
+ /** Create the two hosts. */
void createHosts() throws Exception {
DateTime createTime = DateTime.parse("2000-06-01T00:00:00Z");
assertThatCommand("host_create.xml", ImmutableMap.of("HOSTNAME", "ns1.example.external"))
diff --git a/core/src/test/java/google/registry/flows/contact/ContactCheckFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactCheckFlowTest.java
index bb95bd53d..d8763dea1 100644
--- a/core/src/test/java/google/registry/flows/contact/ContactCheckFlowTest.java
+++ b/core/src/test/java/google/registry/flows/contact/ContactCheckFlowTest.java
@@ -14,85 +14,25 @@
package google.registry.flows.contact;
-import static google.registry.model.eppoutput.CheckData.ContactCheck.create;
-import static google.registry.testing.DatabaseHelper.persistActiveContact;
-import static google.registry.testing.DatabaseHelper.persistDeletedContact;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import google.registry.flows.EppException;
-import google.registry.flows.FlowUtils.NotLoggedInException;
-import google.registry.flows.ResourceCheckFlowTestCase;
-import google.registry.flows.exceptions.TooManyResourceChecksException;
-import google.registry.model.contact.Contact;
+import google.registry.flows.FlowTestCase;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactCheckFlow}. */
-class ContactCheckFlowTest extends ResourceCheckFlowTestCase {
+class ContactCheckFlowTest extends FlowTestCase {
ContactCheckFlowTest() {
setEppInput("contact_check.xml");
}
@Test
- void testNotLoggedIn() {
- sessionMetadata.setRegistrarId(null);
- EppException thrown = assertThrows(NotLoggedInException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
+ void testThrowsException() {
+ assertAboutEppExceptions()
+ .that(assertThrows(ContactsProhibitedException.class, this::runFlow))
+ .marshalsToXml();
}
- @Test
- void testNothingExists() throws Exception {
- // These ids come from the check xml.
- doCheckTest(
- create(true, "sh8013", null),
- create(true, "sah8013", null),
- create(true, "8013sah", null));
- }
-
- @Test
- void testOneExists() throws Exception {
- persistActiveContact("sh8013");
- // These ids come from the check xml.
- doCheckTest(
- create(false, "sh8013", "In use"),
- create(true, "sah8013", null),
- create(true, "8013sah", null));
- }
-
- @Test
- void testOneExistsButWasDeleted() throws Exception {
- persistDeletedContact("sh8013", clock.nowUtc().minusDays(1));
- // These ids come from the check xml.
- doCheckTest(
- create(true, "sh8013", null),
- create(true, "sah8013", null),
- create(true, "8013sah", null));
- }
-
- @Test
- void testXmlMatches() throws Exception {
- persistActiveContact("sah8013");
- runFlowAssertResponse(loadFile("contact_check_response.xml"));
- }
-
- @Test
- void test50IdsAllowed() throws Exception {
- // Make sure we don't have a regression that reduces the number of allowed checks.
- setEppInput("contact_check_50.xml");
- runFlow();
- }
-
- @Test
- void testTooManyIds() {
- setEppInput("contact_check_51.xml");
- EppException thrown = assertThrows(TooManyResourceChecksException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testIcannActivityReportField_getsLogged() throws Exception {
- runFlow();
- assertIcannReportingActivityFieldLogged("srs-cont-check");
- }
}
diff --git a/core/src/test/java/google/registry/flows/contact/ContactCreateFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactCreateFlowTest.java
index 4b2232b4c..7ad3517f5 100644
--- a/core/src/test/java/google/registry/flows/contact/ContactCreateFlowTest.java
+++ b/core/src/test/java/google/registry/flows/contact/ContactCreateFlowTest.java
@@ -14,141 +14,24 @@
package google.registry.flows.contact;
-import static com.google.common.truth.Truth.assertThat;
-import static google.registry.model.common.FeatureFlag.FeatureName.MINIMUM_DATASET_CONTACTS_PROHIBITED;
-import static google.registry.model.common.FeatureFlag.FeatureStatus.ACTIVE;
-import static google.registry.model.common.FeatureFlag.FeatureStatus.INACTIVE;
-import static google.registry.testing.ContactSubject.assertAboutContacts;
-import static google.registry.testing.DatabaseHelper.assertNoBillingEvents;
-import static google.registry.testing.DatabaseHelper.newContact;
-import static google.registry.testing.DatabaseHelper.persistActiveContact;
-import static google.registry.testing.DatabaseHelper.persistDeletedContact;
-import static google.registry.testing.DatabaseHelper.persistResource;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
-import static google.registry.util.DateTimeUtils.START_OF_TIME;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import com.google.common.collect.ImmutableSortedMap;
-import google.registry.flows.EppException;
-import google.registry.flows.FlowUtils.NotLoggedInException;
-import google.registry.flows.ResourceFlowTestCase;
-import google.registry.flows.contact.ContactFlowUtils.BadInternationalizedPostalInfoException;
-import google.registry.flows.contact.ContactFlowUtils.DeclineContactDisclosureFieldDisallowedPolicyException;
+import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
-import google.registry.flows.exceptions.ResourceAlreadyExistsForThisClientException;
-import google.registry.flows.exceptions.ResourceCreateContentionException;
-import google.registry.model.common.FeatureFlag;
-import google.registry.model.contact.Contact;
-import org.joda.time.DateTime;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactCreateFlow}. */
-class ContactCreateFlowTest extends ResourceFlowTestCase {
+class ContactCreateFlowTest extends FlowTestCase {
ContactCreateFlowTest() {
setEppInput("contact_create.xml");
- clock.setTo(DateTime.parse("1999-04-03T22:00:00.0Z"));
- }
-
- private void doSuccessfulTest() throws Exception {
- assertMutatingFlow(true);
- runFlowAssertResponse(loadFile("contact_create_response.xml"));
- // Check that the contact was created and persisted with a history entry.
- Contact contact = reloadResourceByForeignKey();
- assertAboutContacts().that(contact).hasOnlyOneHistoryEntryWhich().hasNoXml();
- assertNoBillingEvents();
- assertLastHistoryContainsResource(contact);
}
@Test
- void testNotLoggedIn() {
- sessionMetadata.setRegistrarId(null);
- EppException thrown = assertThrows(NotLoggedInException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testDryRun() throws Exception {
- dryRunFlowAssertResponse(loadFile("contact_create_response.xml"));
- }
-
- @Test
- void testSuccess_neverExisted() throws Exception {
- doSuccessfulTest();
- }
-
- @Test
- void testSuccess_existedButWasDeleted() throws Exception {
- persistDeletedContact(getUniqueIdFromCommand(), clock.nowUtc().minusDays(1));
- clock.advanceOneMilli();
- doSuccessfulTest();
- }
-
- @Test
- void testFailure_alreadyExists() throws Exception {
- persistActiveContact(getUniqueIdFromCommand());
- ResourceAlreadyExistsForThisClientException thrown =
- assertThrows(ResourceAlreadyExistsForThisClientException.class, this::runFlow);
- assertThat(thrown)
- .hasMessageThat()
- .contains(
- String.format("Object with given ID (%s) already exists", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_minimumDatasetPhase2_cannotCreateContacts() throws Exception {
- persistResource(
- new FeatureFlag.Builder()
- .setFeatureName(MINIMUM_DATASET_CONTACTS_PROHIBITED)
- .setStatusMap(
- ImmutableSortedMap.of(START_OF_TIME, INACTIVE, clock.nowUtc().minusDays(5), ACTIVE))
- .build());
- EppException thrown = assertThrows(ContactsProhibitedException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_resourceContention() throws Exception {
- String targetId = getUniqueIdFromCommand();
- persistResource(
- newContact(targetId)
- .asBuilder()
- .setPersistedCurrentSponsorRegistrarId("NewRegistrar")
- .build());
- ResourceCreateContentionException thrown =
- assertThrows(ResourceCreateContentionException.class, this::runFlow);
- assertThat(thrown)
- .hasMessageThat()
- .contains(String.format("Object with given ID (%s) already exists", targetId));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testSuccess_nonAsciiInLocAddress() throws Exception {
- setEppInput("contact_create_hebrew_loc.xml");
- doSuccessfulTest();
- }
-
- @Test
- void testFailure_nonAsciiInIntAddress() {
- setEppInput("contact_create_hebrew_int.xml");
- EppException thrown =
- assertThrows(BadInternationalizedPostalInfoException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_declineDisclosure() {
- setEppInput("contact_create_decline_disclosure.xml");
- EppException thrown =
- assertThrows(DeclineContactDisclosureFieldDisallowedPolicyException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testIcannActivityReportField_getsLogged() throws Exception {
- runFlow();
- assertIcannReportingActivityFieldLogged("srs-cont-create");
+ void testThrowsException() {
+ assertAboutEppExceptions()
+ .that(assertThrows(ContactsProhibitedException.class, this::runFlow))
+ .marshalsToXml();
}
}
diff --git a/core/src/test/java/google/registry/flows/contact/ContactDeleteFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactDeleteFlowTest.java
index 71c419704..20298cfad 100644
--- a/core/src/test/java/google/registry/flows/contact/ContactDeleteFlowTest.java
+++ b/core/src/test/java/google/registry/flows/contact/ContactDeleteFlowTest.java
@@ -14,269 +14,24 @@
package google.registry.flows.contact;
-import static com.google.common.collect.MoreCollectors.onlyElement;
-import static com.google.common.truth.Truth.assertThat;
-import static google.registry.testing.ContactSubject.assertAboutContacts;
-import static google.registry.testing.DatabaseHelper.assertNoBillingEvents;
-import static google.registry.testing.DatabaseHelper.createTld;
-import static google.registry.testing.DatabaseHelper.getPollMessages;
-import static google.registry.testing.DatabaseHelper.newContact;
-import static google.registry.testing.DatabaseHelper.persistActiveContact;
-import static google.registry.testing.DatabaseHelper.persistContactWithPendingTransfer;
-import static google.registry.testing.DatabaseHelper.persistDeletedContact;
-import static google.registry.testing.DatabaseHelper.persistResource;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import google.registry.flows.EppException;
-import google.registry.flows.FlowUtils.NotLoggedInException;
-import google.registry.flows.ResourceFlowTestCase;
-import google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException;
-import google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException;
-import google.registry.flows.exceptions.ResourceStatusProhibitsOperationException;
-import google.registry.flows.exceptions.ResourceToDeleteIsReferencedException;
-import google.registry.model.contact.Contact;
-import google.registry.model.eppcommon.StatusValue;
-import google.registry.model.eppcommon.Trid;
-import google.registry.model.poll.PendingActionNotificationResponse;
-import google.registry.model.poll.PollMessage;
-import google.registry.model.reporting.HistoryEntry;
-import google.registry.model.reporting.HistoryEntry.Type;
-import google.registry.model.tld.Tld;
-import google.registry.model.transfer.TransferData;
-import google.registry.model.transfer.TransferResponse;
-import google.registry.model.transfer.TransferStatus;
-import google.registry.testing.DatabaseHelper;
-import org.joda.time.DateTime;
-import org.junit.jupiter.api.BeforeEach;
+import google.registry.flows.FlowTestCase;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactDeleteFlow}. */
-class ContactDeleteFlowTest extends ResourceFlowTestCase {
+class ContactDeleteFlowTest extends FlowTestCase {
- @BeforeEach
- void initFlowTest() {
+ ContactDeleteFlowTest() {
setEppInput("contact_delete.xml");
}
@Test
- void testNotLoggedIn() {
- sessionMetadata.setRegistrarId(null);
- EppException thrown = assertThrows(NotLoggedInException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testDryRun() throws Exception {
- persistActiveContact(getUniqueIdFromCommand());
- dryRunFlowAssertResponse(loadFile("contact_delete_response.xml"));
- }
-
- @Test
- void testSuccess() throws Exception {
- persistActiveContact(getUniqueIdFromCommand());
- clock.advanceOneMilli();
- assertMutatingFlow(true);
- runFlowAssertResponse(loadFile("contact_delete_response.xml"));
- assertSqlDeleteSuccess();
- }
-
- @Test
- void testSuccess_pendingTransfer_sql() throws Exception {
- DateTime transferRequestTime = clock.nowUtc().minusDays(3);
- TransferData oldTransferData =
- persistContactWithPendingTransfer(
- persistActiveContact(getUniqueIdFromCommand()),
- transferRequestTime,
- transferRequestTime.plus(Tld.DEFAULT_TRANSFER_GRACE_PERIOD),
- clock.nowUtc())
- .getTransferData();
- clock.advanceOneMilli();
- assertMutatingFlow(true);
- runFlowAssertResponse(loadFile("contact_delete_response.xml"));
- assertSqlDeleteSuccess(Type.CONTACT_DELETE, Type.CONTACT_TRANSFER_REQUEST);
- Contact softDeletedContact = reloadResourceByForeignKey(clock.nowUtc().minusMillis(1));
- assertThat(softDeletedContact.getTransferData())
- .isEqualTo(
- oldTransferData
- .copyConstantFieldsToBuilder()
- .setTransferStatus(TransferStatus.SERVER_CANCELLED)
- .setPendingTransferExpirationTime(softDeletedContact.getDeletionTime())
- .build());
- PollMessage gainingPollMessage =
- Iterables.getOnlyElement(getPollMessages("NewRegistrar", clock.nowUtc()));
- assertThat(gainingPollMessage.getEventTime()).isEqualTo(clock.nowUtc());
- assertThat(
- gainingPollMessage.getResponseData().stream()
- .filter(TransferResponse.class::isInstance)
- .map(TransferResponse.class::cast)
- .collect(onlyElement())
- .getTransferStatus())
- .isEqualTo(TransferStatus.SERVER_CANCELLED);
- PendingActionNotificationResponse panData =
- gainingPollMessage.getResponseData().stream()
- .filter(PendingActionNotificationResponse.class::isInstance)
- .map(PendingActionNotificationResponse.class::cast)
- .collect(onlyElement());
- assertThat(panData.getTrid())
- .isEqualTo(Trid.create("transferClient-trid", "transferServer-trid"));
- assertThat(panData.getActionResult()).isFalse();
- }
-
- @Test
- void testSuccess_clTridNotSpecified() throws Exception {
- setEppInput("contact_delete_no_cltrid.xml");
- persistActiveContact(getUniqueIdFromCommand());
- clock.advanceOneMilli();
- assertMutatingFlow(true);
- runFlowAssertResponse(loadFile("contact_delete_response_no_cltrid.xml"));
- assertSqlDeleteSuccess();
- }
-
- @Test
- void testFailure_neverExisted() throws Exception {
- ResourceDoesNotExistException thrown =
- assertThrows(ResourceDoesNotExistException.class, this::runFlow);
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_existedButWasDeleted() throws Exception {
- persistDeletedContact(getUniqueIdFromCommand(), clock.nowUtc().minusDays(1));
- ResourceDoesNotExistException thrown =
- assertThrows(ResourceDoesNotExistException.class, this::runFlow);
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_existedButWasClientDeleteProhibited() throws Exception {
- doFailingStatusTest(
- StatusValue.CLIENT_DELETE_PROHIBITED, ResourceStatusProhibitsOperationException.class);
- }
-
- @Test
- void testFailure_existedButWasServerDeleteProhibited() throws Exception {
- doFailingStatusTest(
- StatusValue.SERVER_DELETE_PROHIBITED, ResourceStatusProhibitsOperationException.class);
- }
-
- @Test
- void testFailure_existedButWasPendingDelete() throws Exception {
- doFailingStatusTest(
- StatusValue.PENDING_DELETE, ResourceStatusProhibitsOperationException.class);
- }
-
- private void doFailingStatusTest(StatusValue statusValue, Class extends EppException> exception)
- throws Exception {
- persistResource(
- newContact(getUniqueIdFromCommand())
- .asBuilder()
- .setStatusValues(ImmutableSet.of(statusValue))
- .build());
- EppException thrown = assertThrows(exception, this::runFlow);
- assertThat(thrown).hasMessageThat().contains(statusValue.getXmlName());
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testSuccess_clientDeleteProhibited_superuser() throws Exception {
- persistResource(
- persistActiveContact(getUniqueIdFromCommand())
- .asBuilder()
- .addStatusValue(StatusValue.CLIENT_DELETE_PROHIBITED)
- .build());
- runFlowAssertResponse(
- CommitMode.LIVE, UserPrivileges.SUPERUSER, loadFile("contact_delete_response.xml"));
- }
-
- @Test
- void testSuccess_serverDeleteProhibited_superuser() throws Exception {
- persistResource(
- persistActiveContact(getUniqueIdFromCommand())
- .asBuilder()
- .addStatusValue(StatusValue.SERVER_DELETE_PROHIBITED)
- .build());
- runFlowAssertResponse(
- CommitMode.LIVE, UserPrivileges.SUPERUSER, loadFile("contact_delete_response.xml"));
- }
-
- @Test
- void testFailure_pendingDelete_superuser() throws Exception {
- persistResource(
- persistActiveContact(getUniqueIdFromCommand())
- .asBuilder()
- .addStatusValue(StatusValue.PENDING_DELETE)
- .build());
+ void testThrowsException() {
assertAboutEppExceptions()
- .that(
- assertThrows(
- ResourceStatusProhibitsOperationException.class,
- () -> runFlow(CommitMode.LIVE, UserPrivileges.SUPERUSER)))
+ .that(assertThrows(ContactsProhibitedException.class, this::runFlow))
.marshalsToXml();
}
-
- @Test
- void testFailure_unauthorizedClient() throws Exception {
- sessionMetadata.setRegistrarId("NewRegistrar");
- persistActiveContact(getUniqueIdFromCommand());
- EppException thrown = assertThrows(ResourceNotOwnedException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testSuccess_superuserUnauthorizedClient() throws Exception {
- sessionMetadata.setRegistrarId("NewRegistrar");
- persistActiveContact(getUniqueIdFromCommand());
- clock.advanceOneMilli();
- runFlowAssertResponse(
- CommitMode.LIVE, UserPrivileges.SUPERUSER, loadFile("contact_delete_response.xml"));
- assertSqlDeleteSuccess();
- }
-
- @Test
- void testFailure_failfastWhenLinkedToDomain() throws Exception {
- createTld("tld");
- persistResource(
- DatabaseHelper.newDomain("example.tld", persistActiveContact(getUniqueIdFromCommand())));
- EppException thrown = assertThrows(ResourceToDeleteIsReferencedException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testIcannActivityReportField_getsLogged() throws Exception {
- persistActiveContact(getUniqueIdFromCommand());
- clock.advanceOneMilli();
- runFlow();
- assertIcannReportingActivityFieldLogged("srs-cont-delete");
- }
-
- private void assertSqlDeleteSuccess(HistoryEntry.Type... historyEntryTypes) throws Exception {
- assertThat(reloadResourceByForeignKey()).isNull();
- assertAboutContacts()
- .that(reloadResourceByForeignKey(clock.nowUtc().minusMillis(1)))
- .isNotActiveAt(clock.nowUtc())
- .and()
- .hasNullLocalizedPostalInfo()
- .and()
- .hasNullInternationalizedPostalInfo()
- .and()
- .hasNullEmailAddress()
- .and()
- .hasNullVoiceNumber()
- .and()
- .hasNullFaxNumber()
- .and()
- .hasExactlyStatusValues(StatusValue.OK)
- .and()
- .hasOneHistoryEntryEachOfTypes(historyEntryTypes);
- assertNoBillingEvents();
- }
-
- private void assertSqlDeleteSuccess() throws Exception {
- assertSqlDeleteSuccess(Type.CONTACT_DELETE);
- }
}
diff --git a/core/src/test/java/google/registry/flows/contact/ContactInfoFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactInfoFlowTest.java
index 2a637da85..dcf034c00 100644
--- a/core/src/test/java/google/registry/flows/contact/ContactInfoFlowTest.java
+++ b/core/src/test/java/google/registry/flows/contact/ContactInfoFlowTest.java
@@ -14,202 +14,24 @@
package google.registry.flows.contact;
-import static com.google.common.truth.Truth.assertThat;
-import static google.registry.model.EppResourceUtils.isDeleted;
-import static google.registry.testing.DatabaseHelper.assertNoBillingEvents;
-import static google.registry.testing.DatabaseHelper.createTld;
-import static google.registry.testing.DatabaseHelper.persistResource;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import google.registry.flows.EppException;
-import google.registry.flows.FlowUtils.NotLoggedInException;
-import google.registry.flows.ResourceFlowTestCase;
-import google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException;
-import google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactAddress;
-import google.registry.model.contact.ContactAuthInfo;
-import google.registry.model.contact.ContactPhoneNumber;
-import google.registry.model.contact.Disclose;
-import google.registry.model.contact.PostalInfo;
-import google.registry.model.contact.PostalInfo.Type;
-import google.registry.model.eppcommon.AuthInfo.PasswordAuth;
-import google.registry.model.eppcommon.PresenceMarker;
-import google.registry.model.eppcommon.StatusValue;
-import google.registry.testing.DatabaseHelper;
-import org.joda.time.DateTime;
+import google.registry.flows.FlowTestCase;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactInfoFlow}. */
-class ContactInfoFlowTest extends ResourceFlowTestCase {
+class ContactInfoFlowTest extends FlowTestCase {
ContactInfoFlowTest() {
setEppInput("contact_info.xml");
}
- private Contact persistContact(boolean active) {
- Contact contact =
- persistResource(
- new Contact.Builder()
- .setContactId("sh8013")
- .setRepoId("2FF-ROID")
- .setDeletionTime(active ? null : clock.nowUtc().minusDays(1))
- .setStatusValues(ImmutableSet.of(StatusValue.CLIENT_DELETE_PROHIBITED))
- .setInternationalizedPostalInfo(
- new PostalInfo.Builder()
- .setType(Type.INTERNATIONALIZED)
- .setName("John Doe")
- .setOrg("Example Inc.")
- .setAddress(
- new ContactAddress.Builder()
- .setStreet(ImmutableList.of("123 Example Dr.", "Suite 100"))
- .setCity("Dulles")
- .setState("VA")
- .setZip("20166-6503")
- .setCountryCode("US")
- .build())
- .build())
- .setVoiceNumber(
- new ContactPhoneNumber.Builder()
- .setPhoneNumber("+1.7035555555")
- .setExtension("1234")
- .build())
- .setFaxNumber(
- new ContactPhoneNumber.Builder().setPhoneNumber("+1.7035555556").build())
- .setEmailAddress("jdoe@example.com")
- .setPersistedCurrentSponsorRegistrarId("TheRegistrar")
- .setCreationRegistrarId("NewRegistrar")
- .setLastEppUpdateRegistrarId("NewRegistrar")
- .setCreationTimeForTest(DateTime.parse("1999-04-03T22:00:00.0Z"))
- .setLastEppUpdateTime(DateTime.parse("1999-12-03T09:00:00.0Z"))
- .setLastTransferTime(DateTime.parse("2000-04-08T09:00:00.0Z"))
- .setAuthInfo(ContactAuthInfo.create(PasswordAuth.create("2fooBAR")))
- .setDisclose(
- new Disclose.Builder()
- .setFlag(true)
- .setVoice(new PresenceMarker())
- .setEmail(new PresenceMarker())
- .build())
- .build());
- assertThat(isDeleted(contact, clock.nowUtc())).isNotEqualTo(active);
- return contact;
- }
-
@Test
- void testNotLoggedIn() {
- sessionMetadata.setRegistrarId(null);
- EppException thrown = assertThrows(NotLoggedInException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testSuccess() throws Exception {
- persistContact(true);
- // Check that the persisted contact info was returned.
- assertMutatingFlow(false);
- runFlowAssertResponse(
- loadFile("contact_info_response.xml"),
- // We use a different roid scheme than the samples so ignore it.
- "epp.response.resData.infData.roid");
- assertNoHistory();
- assertNoBillingEvents();
- }
-
- @Test
- void testSuccess_linked() throws Exception {
- createTld("foobar");
- persistResource(DatabaseHelper.newDomain("example.foobar", persistContact(true)));
- // Check that the persisted contact info was returned.
- assertMutatingFlow(false);
- runFlowAssertResponse(
- loadFile("contact_info_response_linked.xml"),
- // We use a different roid scheme than the samples so ignore it.
- "epp.response.resData.infData.roid");
- assertNoHistory();
- assertNoBillingEvents();
- }
-
- @Test
- void testSuccess_owningRegistrarWithoutAuthInfo_seesAuthInfo() throws Exception {
- setEppInput("contact_info_no_authinfo.xml");
- persistContact(true);
- // Check that the persisted contact info was returned.
- assertMutatingFlow(false);
- runFlowAssertResponse(
- loadFile("contact_info_response.xml"),
- // We use a different roid scheme than the samples so ignore it.
- "epp.response.resData.infData.roid");
- assertNoHistory();
- assertNoBillingEvents();
- }
-
- @Test
- void testFailure_otherRegistrar_notAuthorized() throws Exception {
- setRegistrarIdForFlow("NewRegistrar");
- persistContact(true);
- // Check that the persisted contact info was returned.
- assertMutatingFlow(false);
- ResourceNotOwnedException thrown = assertThrows(ResourceNotOwnedException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testSuccess_otherRegistrarWithoutAuthInfoAsSuperuser_doesNotSeeAuthInfo() throws Exception {
- setRegistrarIdForFlow("NewRegistrar");
- setEppInput("contact_info_no_authinfo.xml");
- persistContact(true);
- // Check that the persisted contact info was returned.
- assertMutatingFlow(false);
- runFlowAssertResponse(
- CommitMode.LIVE,
- UserPrivileges.SUPERUSER,
- loadFile("contact_info_response_no_authinfo.xml"),
- // We use a different roid scheme than the samples so ignore it.
- "epp.response.resData.infData.roid");
- assertNoHistory();
- assertNoBillingEvents();
- }
-
- @Test
- void testSuccess_otherRegistrarWithAuthInfoAsSuperuser_seesAuthInfo() throws Exception {
- setRegistrarIdForFlow("NewRegistrar");
- persistContact(true);
- // Check that the persisted contact info was returned.
- assertMutatingFlow(false);
- runFlowAssertResponse(
- CommitMode.LIVE,
- UserPrivileges.SUPERUSER,
- loadFile("contact_info_response.xml"),
- // We use a different roid scheme than the samples so ignore it.
- "epp.response.resData.infData.roid");
- assertNoHistory();
- assertNoBillingEvents();
- }
-
- @Test
- void testFailure_neverExisted() throws Exception {
- ResourceDoesNotExistException thrown =
- assertThrows(ResourceDoesNotExistException.class, this::runFlow);
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_existedButWasDeleted() throws Exception {
- persistContact(false);
- ResourceDoesNotExistException thrown =
- assertThrows(ResourceDoesNotExistException.class, this::runFlow);
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testIcannActivityReportField_getsLogged() throws Exception {
- persistContact(true);
- runFlow();
- assertIcannReportingActivityFieldLogged("srs-cont-info");
+ void testThrowsException() {
+ assertAboutEppExceptions()
+ .that(assertThrows(ContactsProhibitedException.class, this::runFlow))
+ .marshalsToXml();
}
}
diff --git a/core/src/test/java/google/registry/flows/contact/ContactTransferApproveFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactTransferApproveFlowTest.java
index ed2bb584a..b8fd10471 100644
--- a/core/src/test/java/google/registry/flows/contact/ContactTransferApproveFlowTest.java
+++ b/core/src/test/java/google/registry/flows/contact/ContactTransferApproveFlowTest.java
@@ -14,254 +14,24 @@
package google.registry.flows.contact;
-import static com.google.common.collect.MoreCollectors.onlyElement;
-import static com.google.common.truth.Truth.assertThat;
-import static google.registry.testing.ContactSubject.assertAboutContacts;
-import static google.registry.testing.DatabaseHelper.assertNoBillingEvents;
-import static google.registry.testing.DatabaseHelper.createTld;
-import static google.registry.testing.DatabaseHelper.getOnlyPollMessage;
-import static google.registry.testing.DatabaseHelper.getPollMessages;
-import static google.registry.testing.DatabaseHelper.persistResource;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import google.registry.flows.EppException;
-import google.registry.flows.FlowUtils.NotLoggedInException;
-import google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException;
-import google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException;
-import google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException;
-import google.registry.flows.exceptions.NotPendingTransferException;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactAuthInfo;
-import google.registry.model.eppcommon.AuthInfo.PasswordAuth;
-import google.registry.model.eppcommon.Trid;
-import google.registry.model.poll.PendingActionNotificationResponse;
-import google.registry.model.poll.PollMessage;
-import google.registry.model.reporting.HistoryEntry;
-import google.registry.model.transfer.TransferData;
-import google.registry.model.transfer.TransferResponse;
-import google.registry.model.transfer.TransferStatus;
-import org.junit.jupiter.api.BeforeEach;
+import google.registry.flows.FlowTestCase;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactTransferApproveFlow}. */
-class ContactTransferApproveFlowTest
- extends ContactTransferFlowTestCase {
+class ContactTransferApproveFlowTest extends FlowTestCase {
- @BeforeEach
- void setUp() {
+ ContactTransferApproveFlowTest() {
setEppInput("contact_transfer_approve.xml");
- setRegistrarIdForFlow("TheRegistrar");
- setupContactWithPendingTransfer();
- clock.advanceOneMilli();
- createTld("foobar");
- }
-
- private void doSuccessfulTest(String commandFilename, String expectedXmlFilename)
- throws Exception {
- setEppInput(commandFilename);
- // Look in the future and make sure the poll messages for implicit ack are there.
- assertThat(getPollMessages("NewRegistrar", clock.nowUtc().plusMonths(1)))
- .hasSize(1);
- assertThat(getPollMessages("TheRegistrar", clock.nowUtc().plusMonths(1)))
- .hasSize(1);
-
- // Setup done; run the test.
- contact = reloadResourceByForeignKey();
- TransferData originalTransferData = contact.getTransferData();
- assertMutatingFlow(true);
- runFlowAssertResponse(loadFile(expectedXmlFilename));
-
- // Transfer should have succeeded. Verify correct fields were set.
- contact = reloadResourceByForeignKey();
- assertAboutContacts()
- .that(contact)
- .hasCurrentSponsorRegistrarId("NewRegistrar")
- .and()
- .hasLastTransferTime(clock.nowUtc())
- .and()
- .hasOneHistoryEntryEachOfTypes(
- HistoryEntry.Type.CONTACT_TRANSFER_REQUEST, HistoryEntry.Type.CONTACT_TRANSFER_APPROVE);
- assertThat(contact.getTransferData())
- .isEqualTo(
- originalTransferData.copyConstantFieldsToBuilder()
- .setTransferStatus(TransferStatus.CLIENT_APPROVED)
- .setPendingTransferExpirationTime(clock.nowUtc())
- .build());
- assertNoBillingEvents();
- // The poll message (in the future) to the losing registrar for implicit ack should be gone.
- assertThat(getPollMessages("TheRegistrar", clock.nowUtc().plusMonths(1))).isEmpty();
- // The poll message in the future to the gaining registrar should be gone too, but there
- // should be one at the current time to the gaining registrar.
- PollMessage gainingPollMessage = getOnlyPollMessage("NewRegistrar");
- assertThat(gainingPollMessage.getEventTime()).isEqualTo(clock.nowUtc());
- assertThat(
- gainingPollMessage
- .getResponseData()
- .stream()
- .filter(TransferResponse.class::isInstance)
- .map(TransferResponse.class::cast)
- .collect(onlyElement())
- .getTransferStatus())
- .isEqualTo(TransferStatus.CLIENT_APPROVED);
- PendingActionNotificationResponse panData =
- gainingPollMessage
- .getResponseData()
- .stream()
- .filter(PendingActionNotificationResponse.class::isInstance)
- .map(PendingActionNotificationResponse.class::cast)
- .collect(onlyElement());
- assertThat(panData.getTrid())
- .isEqualTo(Trid.create("transferClient-trid", "transferServer-trid"));
- assertThat(panData.getActionResult()).isTrue();
- assertLastHistoryContainsResource(contact);
- }
-
- private void doFailingTest(String commandFilename) throws Exception {
- setEppInput(commandFilename);
- // Setup done; run the test.
- assertMutatingFlow(true);
- runFlow();
}
@Test
- void testNotLoggedIn() {
- sessionMetadata.setRegistrarId(null);
- EppException thrown = assertThrows(NotLoggedInException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testDryRun() throws Exception {
- setEppInput("contact_transfer_approve.xml");
- dryRunFlowAssertResponse(loadFile("contact_transfer_approve_response.xml"));
- }
-
- @Test
- void testSuccess() throws Exception {
- doSuccessfulTest("contact_transfer_approve.xml", "contact_transfer_approve_response.xml");
- }
-
- @Test
- void testSuccess_withAuthinfo() throws Exception {
- doSuccessfulTest("contact_transfer_approve_with_authinfo.xml",
- "contact_transfer_approve_response.xml");
- }
-
- @Test
- void testFailure_badContactPassword() {
- // Change the contact's password so it does not match the password in the file.
- contact = persistResource(
- contact.asBuilder()
- .setAuthInfo(ContactAuthInfo.create(PasswordAuth.create("badpassword")))
- .build());
- EppException thrown =
- assertThrows(
- BadAuthInfoForResourceException.class,
- () -> doFailingTest("contact_transfer_approve_with_authinfo.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_neverBeenTransferred() {
- changeTransferStatus(null);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_approve.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_clientApproved() {
- changeTransferStatus(TransferStatus.CLIENT_APPROVED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_approve.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_clientRejected() {
- changeTransferStatus(TransferStatus.CLIENT_REJECTED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_approve.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_clientCancelled() {
- changeTransferStatus(TransferStatus.CLIENT_CANCELLED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_approve.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_serverApproved() {
- changeTransferStatus(TransferStatus.SERVER_APPROVED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_approve.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_serverCancelled() {
- changeTransferStatus(TransferStatus.SERVER_CANCELLED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_approve.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_gainingClient() {
- setRegistrarIdForFlow("NewRegistrar");
- EppException thrown =
- assertThrows(
- ResourceNotOwnedException.class, () -> doFailingTest("contact_transfer_approve.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_unrelatedClient() {
- setRegistrarIdForFlow("ClientZ");
- EppException thrown =
- assertThrows(
- ResourceNotOwnedException.class, () -> doFailingTest("contact_transfer_approve.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_deletedContact() throws Exception {
- contact = persistResource(
- contact.asBuilder().setDeletionTime(clock.nowUtc().minusDays(1)).build());
- ResourceDoesNotExistException thrown =
- assertThrows(
- ResourceDoesNotExistException.class,
- () -> doFailingTest("contact_transfer_approve.xml"));
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_nonexistentContact() throws Exception {
- persistResource(contact.asBuilder().setDeletionTime(clock.nowUtc().minusDays(1)).build());
- contact = persistResource(
- contact.asBuilder().setDeletionTime(clock.nowUtc().minusDays(1)).build());
- ResourceDoesNotExistException thrown =
- assertThrows(
- ResourceDoesNotExistException.class,
- () -> doFailingTest("contact_transfer_approve.xml"));
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testIcannActivityReportField_getsLogged() throws Exception {
- runFlow();
- assertIcannReportingActivityFieldLogged("srs-cont-transfer-approve");
+ void testThrowsException() {
+ assertAboutEppExceptions()
+ .that(assertThrows(ContactsProhibitedException.class, this::runFlow))
+ .marshalsToXml();
}
}
diff --git a/core/src/test/java/google/registry/flows/contact/ContactTransferCancelFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactTransferCancelFlowTest.java
index 34cc6feab..97ca53213 100644
--- a/core/src/test/java/google/registry/flows/contact/ContactTransferCancelFlowTest.java
+++ b/core/src/test/java/google/registry/flows/contact/ContactTransferCancelFlowTest.java
@@ -14,240 +14,24 @@
package google.registry.flows.contact;
-import static com.google.common.collect.MoreCollectors.onlyElement;
-import static com.google.common.truth.Truth.assertThat;
-import static google.registry.testing.ContactSubject.assertAboutContacts;
-import static google.registry.testing.DatabaseHelper.assertNoBillingEvents;
-import static google.registry.testing.DatabaseHelper.getOnlyPollMessage;
-import static google.registry.testing.DatabaseHelper.getPollMessages;
-import static google.registry.testing.DatabaseHelper.persistResource;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import google.registry.flows.EppException;
-import google.registry.flows.FlowUtils.NotLoggedInException;
-import google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException;
-import google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException;
-import google.registry.flows.exceptions.NotPendingTransferException;
-import google.registry.flows.exceptions.NotTransferInitiatorException;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactAuthInfo;
-import google.registry.model.eppcommon.AuthInfo.PasswordAuth;
-import google.registry.model.poll.PollMessage;
-import google.registry.model.reporting.HistoryEntry;
-import google.registry.model.transfer.TransferData;
-import google.registry.model.transfer.TransferResponse;
-import google.registry.model.transfer.TransferStatus;
-import org.junit.jupiter.api.BeforeEach;
+import google.registry.flows.FlowTestCase;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactTransferCancelFlow}. */
-class ContactTransferCancelFlowTest
- extends ContactTransferFlowTestCase {
+class ContactTransferCancelFlowTest extends FlowTestCase {
- @BeforeEach
- void setUp() {
- this.setEppInput("contact_transfer_cancel.xml");
- setRegistrarIdForFlow("NewRegistrar");
- setupContactWithPendingTransfer();
- clock.advanceOneMilli();
- }
-
- private void doSuccessfulTest(String commandFilename, String expectedXmlFilename)
- throws Exception {
- this.setEppInput(commandFilename);
- // Look in the future and make sure the poll messages for implicit ack are there.
- assertThat(getPollMessages("NewRegistrar", clock.nowUtc().plusMonths(1))).hasSize(1);
- assertThat(getPollMessages("TheRegistrar", clock.nowUtc().plusMonths(1))).hasSize(1);
-
- // Setup done; run the test.
- contact = reloadResourceByForeignKey();
- TransferData originalTransferData = contact.getTransferData();
- assertMutatingFlow(true);
- runFlowAssertResponse(loadFile(expectedXmlFilename));
-
- // Transfer should have been cancelled. Verify correct fields were set.
- contact = reloadResourceByForeignKey();
- assertAboutContacts()
- .that(contact)
- .hasCurrentSponsorRegistrarId("TheRegistrar")
- .and()
- .hasLastTransferTimeNotEqualTo(clock.nowUtc())
- .and()
- .hasOneHistoryEntryEachOfTypes(
- HistoryEntry.Type.CONTACT_TRANSFER_REQUEST, HistoryEntry.Type.CONTACT_TRANSFER_CANCEL);
- assertThat(contact.getTransferData())
- .isEqualTo(
- originalTransferData.copyConstantFieldsToBuilder()
- .setTransferStatus(TransferStatus.CLIENT_CANCELLED)
- .setPendingTransferExpirationTime(clock.nowUtc())
- .build());
- assertNoBillingEvents();
- // The poll message (in the future) to the gaining registrar for implicit ack should be gone.
- assertThat(getPollMessages("NewRegistrar", clock.nowUtc().plusMonths(1))).isEmpty();
- // The poll message in the future to the losing registrar should be gone too, but there
- // should be one at the current time to the losing registrar.
- PollMessage losingPollMessage = getOnlyPollMessage("TheRegistrar");
- assertThat(losingPollMessage.getEventTime()).isEqualTo(clock.nowUtc());
- assertThat(
- losingPollMessage
- .getResponseData()
- .stream()
- .filter(TransferResponse.class::isInstance)
- .map(TransferResponse.class::cast)
- .collect(onlyElement())
- .getTransferStatus())
- .isEqualTo(TransferStatus.CLIENT_CANCELLED);
- assertLastHistoryContainsResource(contact);
- }
-
- private void doFailingTest(String commandFilename) throws Exception {
- this.setEppInput(commandFilename);
- // Setup done; run the test.
- assertMutatingFlow(true);
- runFlow();
- }
-
- @Test
- void testNotLoggedIn() {
- sessionMetadata.setRegistrarId(null);
- EppException thrown = assertThrows(NotLoggedInException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testDryRun() throws Exception {
+ ContactTransferCancelFlowTest() {
setEppInput("contact_transfer_cancel.xml");
- dryRunFlowAssertResponse(loadFile("contact_transfer_cancel_response.xml"));
}
@Test
- void testSuccess() throws Exception {
- doSuccessfulTest("contact_transfer_cancel.xml", "contact_transfer_cancel_response.xml");
- }
-
- @Test
- void testSuccess_withAuthinfo() throws Exception {
- doSuccessfulTest("contact_transfer_cancel_with_authinfo.xml",
- "contact_transfer_cancel_response.xml");
- }
-
- @Test
- void testFailure_badContactPassword() {
- // Change the contact's password so it does not match the password in the file.
- contact =
- persistResource(
- contact
- .asBuilder()
- .setAuthInfo(ContactAuthInfo.create(PasswordAuth.create("badpassword")))
- .build());
- EppException thrown =
- assertThrows(
- BadAuthInfoForResourceException.class,
- () -> doFailingTest("contact_transfer_cancel_with_authinfo.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_neverBeenTransferred() {
- changeTransferStatus(null);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_cancel.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_clientApproved() {
- changeTransferStatus(TransferStatus.CLIENT_APPROVED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_cancel.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_clientRejected() {
- changeTransferStatus(TransferStatus.CLIENT_REJECTED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_cancel.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_clientCancelled() {
- changeTransferStatus(TransferStatus.CLIENT_CANCELLED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_cancel.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_serverApproved() {
- changeTransferStatus(TransferStatus.SERVER_APPROVED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_cancel.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_serverCancelled() {
- changeTransferStatus(TransferStatus.SERVER_CANCELLED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_cancel.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_sponsoringClient() {
- setRegistrarIdForFlow("TheRegistrar");
- EppException thrown =
- assertThrows(
- NotTransferInitiatorException.class,
- () -> doFailingTest("contact_transfer_cancel.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_unrelatedClient() {
- setRegistrarIdForFlow("ClientZ");
- EppException thrown =
- assertThrows(
- NotTransferInitiatorException.class,
- () -> doFailingTest("contact_transfer_cancel.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_deletedContact() throws Exception {
- contact =
- persistResource(contact.asBuilder().setDeletionTime(clock.nowUtc().minusDays(1)).build());
- ResourceDoesNotExistException thrown =
- assertThrows(
- ResourceDoesNotExistException.class,
- () -> doFailingTest("contact_transfer_cancel.xml"));
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_nonexistentContact() throws Exception {
- persistResource(contact.asBuilder().setDeletionTime(clock.nowUtc().minusDays(1)).build());
- ResourceDoesNotExistException thrown =
- assertThrows(
- ResourceDoesNotExistException.class,
- () -> doFailingTest("contact_transfer_cancel.xml"));
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testIcannActivityReportField_getsLogged() throws Exception {
- runFlow();
- assertIcannReportingActivityFieldLogged("srs-cont-transfer-cancel");
+ void testThrowsException() {
+ assertAboutEppExceptions()
+ .that(assertThrows(ContactsProhibitedException.class, this::runFlow))
+ .marshalsToXml();
}
}
diff --git a/core/src/test/java/google/registry/flows/contact/ContactTransferFlowTestCase.java b/core/src/test/java/google/registry/flows/contact/ContactTransferFlowTestCase.java
deleted file mode 100644
index d71577ee1..000000000
--- a/core/src/test/java/google/registry/flows/contact/ContactTransferFlowTestCase.java
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2017 The Nomulus Authors. All Rights Reserved.
-//
-// 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 google.registry.flows.contact;
-
-import static com.google.common.base.Preconditions.checkState;
-import static google.registry.testing.DatabaseHelper.newContact;
-import static google.registry.testing.DatabaseHelper.persistContactWithPendingTransfer;
-import static google.registry.testing.DatabaseHelper.persistResource;
-
-import google.registry.flows.Flow;
-import google.registry.flows.ResourceFlowTestCase;
-import google.registry.model.EppResource;
-import google.registry.model.contact.Contact;
-import google.registry.model.tld.Tld;
-import google.registry.model.transfer.TransferStatus;
-import google.registry.persistence.transaction.JpaTransactionManagerExtension;
-import org.joda.time.DateTime;
-import org.joda.time.Duration;
-import org.junit.jupiter.api.BeforeEach;
-
-/**
- * Base class for contact transfer flow unit tests.
- *
- * @param the flow type
- * @param the resource type
- */
-abstract class ContactTransferFlowTestCase
- extends ResourceFlowTestCase {
-
- // Transfer is requested on the 6th and expires on the 11th.
- // The "now" of this flow is on the 9th, 3 days in.
-
- private static final DateTime TRANSFER_REQUEST_TIME = DateTime.parse("2000-06-06T22:00:00.0Z");
- private static final DateTime TRANSFER_EXPIRATION_TIME =
- TRANSFER_REQUEST_TIME.plus(Tld.DEFAULT_TRANSFER_GRACE_PERIOD);
- private static final Duration TIME_SINCE_REQUEST = Duration.standardDays(3);
-
- protected Contact contact;
-
- ContactTransferFlowTestCase() {
- checkState(!Tld.DEFAULT_TRANSFER_GRACE_PERIOD.isShorterThan(TIME_SINCE_REQUEST));
- clock.setTo(TRANSFER_REQUEST_TIME.plus(TIME_SINCE_REQUEST));
- }
-
- @BeforeEach
- void beforeEachContactTransferFlowTestCase() {
- // Registrar ClientZ is used in tests that need another registrar that definitely doesn't own
- // the resources in question.
- persistResource(
- JpaTransactionManagerExtension.makeRegistrar1()
- .asBuilder()
- .setRegistrarId("ClientZ")
- .build());
- }
-
- /** Adds a contact that has a pending transfer on it from TheRegistrar to NewRegistrar. */
- void setupContactWithPendingTransfer() {
- contact =
- persistContactWithPendingTransfer(
- newContact("sh8013"),
- TRANSFER_REQUEST_TIME,
- TRANSFER_EXPIRATION_TIME,
- TRANSFER_REQUEST_TIME);
- }
-
- /** Changes the transfer status on the persisted contact. */
- protected void changeTransferStatus(TransferStatus transferStatus) {
- contact = persistResource(
- contact.asBuilder()
- .setTransferData(
- contact.getTransferData().asBuilder().setTransferStatus(transferStatus).build())
- .build());
- clock.advanceOneMilli();
- }
-
- /** Changes the client ID that the flow will run as. */
- @Override
- protected void setRegistrarIdForFlow(String registrarId) {
- sessionMetadata.setRegistrarId(registrarId);
- }
-}
diff --git a/core/src/test/java/google/registry/flows/contact/ContactTransferQueryFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactTransferQueryFlowTest.java
index cd0990f30..916557141 100644
--- a/core/src/test/java/google/registry/flows/contact/ContactTransferQueryFlowTest.java
+++ b/core/src/test/java/google/registry/flows/contact/ContactTransferQueryFlowTest.java
@@ -14,206 +14,24 @@
package google.registry.flows.contact;
-import static com.google.common.truth.Truth.assertThat;
-import static google.registry.testing.ContactSubject.assertAboutContacts;
-import static google.registry.testing.DatabaseHelper.assertNoBillingEvents;
-import static google.registry.testing.DatabaseHelper.persistResource;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import google.registry.flows.EppException;
-import google.registry.flows.FlowUtils.NotLoggedInException;
-import google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException;
-import google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException;
-import google.registry.flows.exceptions.NoTransferHistoryToQueryException;
-import google.registry.flows.exceptions.NotAuthorizedToViewTransferException;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactAuthInfo;
-import google.registry.model.eppcommon.AuthInfo.PasswordAuth;
-import google.registry.model.reporting.HistoryEntry;
-import google.registry.model.transfer.TransferStatus;
-import org.joda.time.DateTime;
-import org.junit.jupiter.api.BeforeEach;
+import google.registry.flows.FlowTestCase;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactTransferQueryFlow}. */
-class ContactTransferQueryFlowTest
- extends ContactTransferFlowTestCase {
+class ContactTransferQueryFlowTest extends FlowTestCase {
- @BeforeEach
- void setUp() {
+ ContactTransferQueryFlowTest() {
setEppInput("contact_transfer_query.xml");
- clock.setTo(DateTime.parse("2000-06-10T22:00:00.0Z"));
- setRegistrarIdForFlow("NewRegistrar");
- setupContactWithPendingTransfer();
- }
-
- private void doSuccessfulTest(String commandFilename, String expectedXmlFilename)
- throws Exception {
- setEppInput(commandFilename);
- eppLoader.replaceAll("JD1234-REP", contact.getRepoId());
- // Setup done; run the test.
- assertMutatingFlow(false);
- runFlowAssertResponse(loadFile(expectedXmlFilename));
- assertAboutContacts().that(reloadResourceByForeignKey(clock.nowUtc().minusDays(1)))
- .hasOneHistoryEntryEachOfTypes(HistoryEntry.Type.CONTACT_TRANSFER_REQUEST);
- assertNoBillingEvents();
- }
-
- private void doFailingTest(String commandFilename) throws Exception {
- setEppInput(commandFilename);
- eppLoader.replaceAll("JD1234-REP", contact.getRepoId());
- // Setup done; run the test.
- assertMutatingFlow(false);
- runFlow();
}
@Test
- void testNotLoggedIn() {
- sessionMetadata.setRegistrarId(null);
- EppException thrown = assertThrows(NotLoggedInException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testSuccess() throws Exception {
- doSuccessfulTest("contact_transfer_query.xml", "contact_transfer_query_response.xml");
- }
-
- @Test
- void testSuccess_withContactRoid() throws Exception {
- doSuccessfulTest("contact_transfer_query_with_roid.xml", "contact_transfer_query_response.xml");
- }
-
- @Test
- void testSuccess_sponsoringClient() throws Exception {
- setRegistrarIdForFlow("TheRegistrar");
- doSuccessfulTest("contact_transfer_query.xml", "contact_transfer_query_response.xml");
- }
-
- @Test
- void testSuccess_withAuthinfo() throws Exception {
- setRegistrarIdForFlow("ClientZ");
- doSuccessfulTest("contact_transfer_query_with_authinfo.xml",
- "contact_transfer_query_response.xml");
- }
-
- @Test
- void testSuccess_clientApproved() throws Exception {
- changeTransferStatus(TransferStatus.CLIENT_APPROVED);
- doSuccessfulTest("contact_transfer_query.xml",
- "contact_transfer_query_response_client_approved.xml");
- }
-
- @Test
- void testSuccess_clientRejected() throws Exception {
- changeTransferStatus(TransferStatus.CLIENT_REJECTED);
- doSuccessfulTest("contact_transfer_query.xml",
- "contact_transfer_query_response_client_rejected.xml");
- }
-
- @Test
- void testSuccess_clientCancelled() throws Exception {
- changeTransferStatus(TransferStatus.CLIENT_CANCELLED);
- doSuccessfulTest("contact_transfer_query.xml",
- "contact_transfer_query_response_client_cancelled.xml");
- }
-
- @Test
- void testSuccess_serverApproved() throws Exception {
- changeTransferStatus(TransferStatus.SERVER_APPROVED);
- doSuccessfulTest("contact_transfer_query.xml",
- "contact_transfer_query_response_server_approved.xml");
- }
-
- @Test
- void testSuccess_serverCancelled() throws Exception {
- changeTransferStatus(TransferStatus.SERVER_CANCELLED);
- doSuccessfulTest("contact_transfer_query.xml",
- "contact_transfer_query_response_server_cancelled.xml");
- }
-
- @Test
- void testFailure_pendingDeleteContact() throws Exception {
- changeTransferStatus(TransferStatus.SERVER_CANCELLED);
- contact = persistResource(
- contact.asBuilder().setDeletionTime(clock.nowUtc().plusDays(1)).build());
- doSuccessfulTest("contact_transfer_query.xml",
- "contact_transfer_query_response_server_cancelled.xml");
- }
-
- @Test
- void testFailure_badContactPassword() {
- // Change the contact's password so it does not match the password in the file.
- contact =
- persistResource(
- contact
- .asBuilder()
- .setAuthInfo(ContactAuthInfo.create(PasswordAuth.create("badpassword")))
- .build());
- EppException thrown =
- assertThrows(
- BadAuthInfoForResourceException.class,
- () -> doFailingTest("contact_transfer_query_with_authinfo.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_badContactRoid() {
- // Set the contact to a different ROID, but don't persist it; this is just so the substitution
- // code above will write the wrong ROID into the file.
- contact = contact.asBuilder().setRepoId("DEADBEEF_TLD-ROID").build();
- EppException thrown =
- assertThrows(
- BadAuthInfoForResourceException.class,
- () -> doFailingTest("contact_transfer_query_with_roid.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_neverBeenTransferred() {
- changeTransferStatus(null);
- EppException thrown =
- assertThrows(
- NoTransferHistoryToQueryException.class,
- () -> doFailingTest("contact_transfer_query.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_unrelatedClient() {
- setRegistrarIdForFlow("ClientZ");
- EppException thrown =
- assertThrows(
- NotAuthorizedToViewTransferException.class,
- () -> doFailingTest("contact_transfer_query.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_deletedContact() throws Exception {
- contact =
- persistResource(contact.asBuilder().setDeletionTime(clock.nowUtc().minusDays(1)).build());
- ResourceDoesNotExistException thrown =
- assertThrows(
- ResourceDoesNotExistException.class, () -> doFailingTest("contact_transfer_query.xml"));
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_nonexistentContact() throws Exception {
- persistResource(contact.asBuilder().setDeletionTime(clock.nowUtc().minusDays(1)).build());
- ResourceDoesNotExistException thrown =
- assertThrows(
- ResourceDoesNotExistException.class, () -> doFailingTest("contact_transfer_query.xml"));
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testIcannActivityReportField_getsLogged() throws Exception {
- runFlow();
- assertIcannReportingActivityFieldLogged("srs-cont-transfer-query");
+ void testThrowsException() {
+ assertAboutEppExceptions()
+ .that(assertThrows(ContactsProhibitedException.class, this::runFlow))
+ .marshalsToXml();
}
}
diff --git a/core/src/test/java/google/registry/flows/contact/ContactTransferRejectFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactTransferRejectFlowTest.java
index cadb75cd2..53c5c5305 100644
--- a/core/src/test/java/google/registry/flows/contact/ContactTransferRejectFlowTest.java
+++ b/core/src/test/java/google/registry/flows/contact/ContactTransferRejectFlowTest.java
@@ -14,253 +14,24 @@
package google.registry.flows.contact;
-import static com.google.common.collect.MoreCollectors.onlyElement;
-import static com.google.common.truth.Truth.assertThat;
-import static google.registry.testing.ContactSubject.assertAboutContacts;
-import static google.registry.testing.DatabaseHelper.assertNoBillingEvents;
-import static google.registry.testing.DatabaseHelper.getOnlyPollMessage;
-import static google.registry.testing.DatabaseHelper.getPollMessages;
-import static google.registry.testing.DatabaseHelper.persistResource;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import google.registry.flows.EppException;
-import google.registry.flows.FlowUtils.NotLoggedInException;
-import google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException;
-import google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException;
-import google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException;
-import google.registry.flows.exceptions.NotPendingTransferException;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactAuthInfo;
-import google.registry.model.eppcommon.AuthInfo.PasswordAuth;
-import google.registry.model.eppcommon.Trid;
-import google.registry.model.poll.PendingActionNotificationResponse;
-import google.registry.model.poll.PollMessage;
-import google.registry.model.reporting.HistoryEntry;
-import google.registry.model.transfer.TransferData;
-import google.registry.model.transfer.TransferResponse;
-import google.registry.model.transfer.TransferStatus;
-import org.junit.jupiter.api.BeforeEach;
+import google.registry.flows.FlowTestCase;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactTransferRejectFlow}. */
-class ContactTransferRejectFlowTest
- extends ContactTransferFlowTestCase {
+class ContactTransferRejectFlowTest extends FlowTestCase {
- @BeforeEach
- void setUp() {
+ ContactTransferRejectFlowTest() {
setEppInput("contact_transfer_reject.xml");
- setRegistrarIdForFlow("TheRegistrar");
- setupContactWithPendingTransfer();
- clock.advanceOneMilli();
- }
-
- private void doSuccessfulTest(String commandFilename, String expectedXmlFilename)
- throws Exception {
- setEppInput(commandFilename);
- // Look in the future and make sure the poll messages for implicit ack are there.
- assertThat(getPollMessages("NewRegistrar", clock.nowUtc().plusMonths(1)))
- .hasSize(1);
- assertThat(getPollMessages("TheRegistrar", clock.nowUtc().plusMonths(1)))
- .hasSize(1);
-
- // Setup done; run the test.
- contact = reloadResourceByForeignKey();
- TransferData originalTransferData = contact.getTransferData();
- assertMutatingFlow(true);
- runFlowAssertResponse(loadFile(expectedXmlFilename));
-
- // Transfer should have failed. Verify correct fields were set.
- contact = reloadResourceByForeignKey();
- assertAboutContacts()
- .that(contact)
- .hasCurrentSponsorRegistrarId("TheRegistrar")
- .and()
- .hasLastTransferTimeNotEqualTo(clock.nowUtc())
- .and()
- .hasOneHistoryEntryEachOfTypes(
- HistoryEntry.Type.CONTACT_TRANSFER_REQUEST, HistoryEntry.Type.CONTACT_TRANSFER_REJECT);
- assertThat(contact.getTransferData())
- .isEqualTo(
- originalTransferData.copyConstantFieldsToBuilder()
- .setTransferStatus(TransferStatus.CLIENT_REJECTED)
- .setPendingTransferExpirationTime(clock.nowUtc())
- .build());
- // The poll message (in the future) to the losing registrar for implicit ack should be gone.
- assertThat(getPollMessages("TheRegistrar", clock.nowUtc().plusMonths(1)))
- .isEmpty();
- // The poll message in the future to the gaining registrar should be gone too, but there
- // should be one at the current time to the gaining registrar.
- PollMessage gainingPollMessage = getOnlyPollMessage("NewRegistrar");
- assertThat(gainingPollMessage.getEventTime()).isEqualTo(clock.nowUtc());
- assertThat(
- gainingPollMessage
- .getResponseData()
- .stream()
- .filter(TransferResponse.class::isInstance)
- .map(TransferResponse.class::cast)
- .collect(onlyElement())
- .getTransferStatus())
- .isEqualTo(TransferStatus.CLIENT_REJECTED);
- PendingActionNotificationResponse panData =
- gainingPollMessage
- .getResponseData()
- .stream()
- .filter(PendingActionNotificationResponse.class::isInstance)
- .map(PendingActionNotificationResponse.class::cast)
- .collect(onlyElement());
- assertThat(panData.getTrid())
- .isEqualTo(Trid.create("transferClient-trid", "transferServer-trid"));
- assertThat(panData.getActionResult()).isFalse();
- assertNoBillingEvents();
- assertLastHistoryContainsResource(contact);
- }
-
- private void doFailingTest(String commandFilename) throws Exception {
- setEppInput(commandFilename);
- // Setup done; run the test.
- assertMutatingFlow(true);
- runFlow();
}
@Test
- void testNotLoggedIn() {
- sessionMetadata.setRegistrarId(null);
- EppException thrown = assertThrows(NotLoggedInException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testDryRun() throws Exception {
- setEppInput("contact_transfer_reject.xml");
- dryRunFlowAssertResponse(loadFile("contact_transfer_reject_response.xml"));
- }
-
- @Test
- void testSuccess() throws Exception {
- doSuccessfulTest("contact_transfer_reject.xml", "contact_transfer_reject_response.xml");
- }
-
- @Test
- void testSuccess_domainAuthInfo() throws Exception {
- doSuccessfulTest("contact_transfer_reject_with_authinfo.xml",
- "contact_transfer_reject_response.xml");
- }
-
- @Test
- void testFailure_badPassword() {
- // Change the contact's password so it does not match the password in the file.
- contact =
- persistResource(
- contact
- .asBuilder()
- .setAuthInfo(ContactAuthInfo.create(PasswordAuth.create("badpassword")))
- .build());
- EppException thrown =
- assertThrows(
- BadAuthInfoForResourceException.class,
- () -> doFailingTest("contact_transfer_reject_with_authinfo.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_neverBeenTransferred() {
- changeTransferStatus(null);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_reject.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_clientApproved() {
- changeTransferStatus(TransferStatus.CLIENT_APPROVED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_reject.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_clientRejected() {
- changeTransferStatus(TransferStatus.CLIENT_REJECTED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_reject.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_clientCancelled() {
- changeTransferStatus(TransferStatus.CLIENT_CANCELLED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_reject.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_serverApproved() {
- changeTransferStatus(TransferStatus.SERVER_APPROVED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_reject.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_serverCancelled() {
- changeTransferStatus(TransferStatus.SERVER_CANCELLED);
- EppException thrown =
- assertThrows(
- NotPendingTransferException.class, () -> doFailingTest("contact_transfer_reject.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_gainingClient() {
- setRegistrarIdForFlow("NewRegistrar");
- EppException thrown =
- assertThrows(
- ResourceNotOwnedException.class, () -> doFailingTest("contact_transfer_reject.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_unrelatedClient() {
- setRegistrarIdForFlow("ClientZ");
- EppException thrown =
- assertThrows(
- ResourceNotOwnedException.class, () -> doFailingTest("contact_transfer_reject.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_deletedContact() throws Exception {
- contact =
- persistResource(contact.asBuilder().setDeletionTime(clock.nowUtc().minusDays(1)).build());
- ResourceDoesNotExistException thrown =
- assertThrows(
- ResourceDoesNotExistException.class,
- () -> doFailingTest("contact_transfer_reject.xml"));
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_nonexistentContact() throws Exception {
- persistResource(contact.asBuilder().setDeletionTime(clock.nowUtc().minusDays(1)).build());
- ResourceDoesNotExistException thrown =
- assertThrows(
- ResourceDoesNotExistException.class,
- () -> doFailingTest("contact_transfer_reject.xml"));
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testIcannActivityReportField_getsLogged() throws Exception {
- runFlow();
- assertIcannReportingActivityFieldLogged("srs-cont-transfer-reject");
+ void testThrowsException() {
+ assertAboutEppExceptions()
+ .that(assertThrows(ContactsProhibitedException.class, this::runFlow))
+ .marshalsToXml();
}
}
diff --git a/core/src/test/java/google/registry/flows/contact/ContactTransferRequestFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactTransferRequestFlowTest.java
index de9ebf8ef..abce25fff 100644
--- a/core/src/test/java/google/registry/flows/contact/ContactTransferRequestFlowTest.java
+++ b/core/src/test/java/google/registry/flows/contact/ContactTransferRequestFlowTest.java
@@ -14,304 +14,24 @@
package google.registry.flows.contact;
-import static com.google.common.base.Predicates.equalTo;
-import static com.google.common.base.Predicates.not;
-import static com.google.common.collect.Iterables.getOnlyElement;
-import static com.google.common.collect.MoreCollectors.onlyElement;
-import static com.google.common.truth.Truth.assertThat;
-import static google.registry.config.RegistryConfig.getContactAutomaticTransferLength;
-import static google.registry.testing.ContactSubject.assertAboutContacts;
-import static google.registry.testing.DatabaseHelper.assertNoBillingEvents;
-import static google.registry.testing.DatabaseHelper.assertPollMessagesEqual;
-import static google.registry.testing.DatabaseHelper.deleteResource;
-import static google.registry.testing.DatabaseHelper.getPollMessages;
-import static google.registry.testing.DatabaseHelper.loadByKeys;
-import static google.registry.testing.DatabaseHelper.persistActiveContact;
-import static google.registry.testing.DatabaseHelper.persistResource;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
-import static google.registry.util.CollectionUtils.forceEmptyToNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import google.registry.flows.EppException;
-import google.registry.flows.FlowUtils.NotLoggedInException;
-import google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException;
-import google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException;
-import google.registry.flows.exceptions.AlreadyPendingTransferException;
-import google.registry.flows.exceptions.MissingTransferRequestAuthInfoException;
-import google.registry.flows.exceptions.ObjectAlreadySponsoredException;
-import google.registry.flows.exceptions.ResourceStatusProhibitsOperationException;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactAuthInfo;
-import google.registry.model.eppcommon.AuthInfo.PasswordAuth;
-import google.registry.model.eppcommon.StatusValue;
-import google.registry.model.eppcommon.Trid;
-import google.registry.model.poll.PollMessage;
-import google.registry.model.reporting.HistoryEntry;
-import google.registry.model.transfer.ContactTransferData;
-import google.registry.model.transfer.TransferStatus;
-import org.joda.time.DateTime;
-import org.junit.jupiter.api.BeforeEach;
+import google.registry.flows.FlowTestCase;
+import google.registry.flows.exceptions.ContactsProhibitedException;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactTransferRequestFlow}. */
-class ContactTransferRequestFlowTest
- extends ContactTransferFlowTestCase {
+class ContactTransferRequestFlowTest extends FlowTestCase {
ContactTransferRequestFlowTest() {
- // We need the transfer to happen at exactly this time in order for the response to match up.
- clock.setTo(DateTime.parse("2000-06-08T22:00:00.0Z"));
- }
-
- @BeforeEach
- void beforeEach() {
setEppInput("contact_transfer_request.xml");
- setRegistrarIdForFlow("NewRegistrar");
- contact = persistActiveContact("sh8013");
- clock.advanceOneMilli();
- }
-
- private void doSuccessfulTest(String commandFilename, String expectedXmlFilename)
- throws Exception {
- setEppInput(commandFilename);
- DateTime afterTransfer = clock.nowUtc().plus(getContactAutomaticTransferLength());
-
- // Setup done; run the test.
- assertMutatingFlow(true);
- runFlowAssertResponse(loadFile(expectedXmlFilename));
-
- // Transfer should have been requested. Verify correct fields were set.
- contact = reloadResourceByForeignKey();
- assertAboutContacts()
- .that(contact)
- .hasCurrentSponsorRegistrarId("TheRegistrar")
- .and()
- .hasOnlyOneHistoryEntryWhich()
- .hasType(HistoryEntry.Type.CONTACT_TRANSFER_REQUEST);
- Trid expectedTrid =
- Trid.create(
- getClientTrid(),
- contact.getTransferData().getTransferRequestTrid().getServerTransactionId());
- assertThat(contact.getTransferData())
- .isEqualTo(
- new ContactTransferData.Builder()
- .setTransferRequestTrid(expectedTrid)
- .setTransferRequestTime(clock.nowUtc())
- .setGainingRegistrarId("NewRegistrar")
- .setLosingRegistrarId("TheRegistrar")
- .setTransferStatus(TransferStatus.PENDING)
- .setPendingTransferExpirationTime(afterTransfer)
- // Make the server-approve entities field a no-op comparison; it's easier to
- // do this comparison separately below.
- .setServerApproveEntities(
- contact.getRepoId(),
- contact.getTransferData().getHistoryEntryId(),
- forceEmptyToNull(contact.getTransferData().getServerApproveEntities()))
- .build());
- assertNoBillingEvents();
- assertThat(getPollMessages("TheRegistrar", clock.nowUtc())).hasSize(1);
- PollMessage losingRequestMessage =
- getOnlyElement(getPollMessages("TheRegistrar", clock.nowUtc()));
-
- // If we fast forward AUTOMATIC_TRANSFER_DAYS the transfer should have happened.
- assertAboutContacts()
- .that(contact.cloneProjectedAtTime(afterTransfer))
- .hasCurrentSponsorRegistrarId("NewRegistrar");
- assertThat(getPollMessages("NewRegistrar", afterTransfer)).hasSize(1);
- assertThat(getPollMessages("TheRegistrar", afterTransfer)).hasSize(2);
- PollMessage gainingApproveMessage =
- getOnlyElement(getPollMessages("NewRegistrar", afterTransfer));
- PollMessage losingApproveMessage =
- getPollMessages("TheRegistrar", afterTransfer)
- .stream()
- .filter(not(equalTo(losingRequestMessage)))
- .collect(onlyElement());
-
- // Check for TransferData server-approve entities containing what we expect: only
- // poll messages, the approval notice ones for gaining and losing registrars.
- assertPollMessagesEqual(
- Iterables.filter(
- loadByKeys(contact.getTransferData().getServerApproveEntities()), PollMessage.class),
- ImmutableList.of(gainingApproveMessage, losingApproveMessage));
- assertLastHistoryContainsResource(contact);
- }
-
- private void doFailingTest(String commandFilename) throws Exception {
- setEppInput(commandFilename);
- // Setup done; run the test.
- assertMutatingFlow(true);
- runFlow();
}
@Test
- void testNotLoggedIn() {
- sessionMetadata.setRegistrarId(null);
- EppException thrown = assertThrows(NotLoggedInException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testDryRun() throws Exception {
- setEppInput("contact_transfer_request.xml");
- dryRunFlowAssertResponse(loadFile("contact_transfer_request_response.xml"));
- }
-
- @Test
- void testSuccess() throws Exception {
- doSuccessfulTest("contact_transfer_request.xml", "contact_transfer_request_response.xml");
- }
-
- @Test
- void testFailure_noAuthInfo() {
- EppException thrown =
- assertThrows(
- MissingTransferRequestAuthInfoException.class,
- () -> doFailingTest("contact_transfer_request_no_authinfo.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_badPassword() {
- // Change the contact's password so it does not match the password in the file.
- contact =
- persistResource(
- contact
- .asBuilder()
- .setAuthInfo(ContactAuthInfo.create(PasswordAuth.create("badpassword")))
- .build());
- EppException thrown =
- assertThrows(
- BadAuthInfoForResourceException.class,
- () -> doFailingTest("contact_transfer_request.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testSuccess_clientApproved() throws Exception {
- changeTransferStatus(TransferStatus.CLIENT_APPROVED);
- doSuccessfulTest("contact_transfer_request.xml", "contact_transfer_request_response.xml");
- }
-
- @Test
- void testSuccess_clientRejected() throws Exception {
- changeTransferStatus(TransferStatus.CLIENT_REJECTED);
- doSuccessfulTest("contact_transfer_request.xml", "contact_transfer_request_response.xml");
- }
-
- @Test
- void testSuccess_clientCancelled() throws Exception {
- changeTransferStatus(TransferStatus.CLIENT_CANCELLED);
- doSuccessfulTest("contact_transfer_request.xml", "contact_transfer_request_response.xml");
- }
-
- @Test
- void testSuccess_serverApproved() throws Exception {
- changeTransferStatus(TransferStatus.SERVER_APPROVED);
- doSuccessfulTest("contact_transfer_request.xml", "contact_transfer_request_response.xml");
- }
-
- @Test
- void testSuccess_serverCancelled() throws Exception {
- changeTransferStatus(TransferStatus.SERVER_CANCELLED);
- doSuccessfulTest("contact_transfer_request.xml", "contact_transfer_request_response.xml");
- }
-
- @Test
- void testFailure_pending() {
- contact =
- persistResource(
- contact
- .asBuilder()
- .setTransferData(
- contact
- .getTransferData()
- .asBuilder()
- .setTransferStatus(TransferStatus.PENDING)
- .setPendingTransferExpirationTime(clock.nowUtc().plusDays(1))
- .build())
- .build());
- EppException thrown =
- assertThrows(
- AlreadyPendingTransferException.class,
- () -> doFailingTest("contact_transfer_request.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_sponsoringClient() {
- setRegistrarIdForFlow("TheRegistrar");
- EppException thrown =
- assertThrows(
- ObjectAlreadySponsoredException.class,
- () -> doFailingTest("contact_transfer_request.xml"));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_deletedContact() throws Exception {
- contact =
- persistResource(contact.asBuilder().setDeletionTime(clock.nowUtc().minusDays(1)).build());
- ResourceDoesNotExistException thrown =
- assertThrows(
- ResourceDoesNotExistException.class,
- () -> doFailingTest("contact_transfer_request.xml"));
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_nonexistentContact() throws Exception {
- deleteResource(contact);
- ResourceDoesNotExistException thrown =
- assertThrows(
- ResourceDoesNotExistException.class,
- () -> doFailingTest("contact_transfer_request.xml"));
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_clientTransferProhibited() {
- contact =
- persistResource(
- contact.asBuilder().addStatusValue(StatusValue.CLIENT_TRANSFER_PROHIBITED).build());
- ResourceStatusProhibitsOperationException thrown =
- assertThrows(
- ResourceStatusProhibitsOperationException.class,
- () -> doFailingTest("contact_transfer_request.xml"));
- assertThat(thrown).hasMessageThat().contains("clientTransferProhibited");
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_serverTransferProhibited() {
- contact =
- persistResource(
- contact.asBuilder().addStatusValue(StatusValue.SERVER_TRANSFER_PROHIBITED).build());
- ResourceStatusProhibitsOperationException thrown =
- assertThrows(
- ResourceStatusProhibitsOperationException.class,
- () -> doFailingTest("contact_transfer_request.xml"));
- assertThat(thrown).hasMessageThat().contains("serverTransferProhibited");
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_pendingDelete() {
- contact =
- persistResource(contact.asBuilder().addStatusValue(StatusValue.PENDING_DELETE).build());
- ResourceStatusProhibitsOperationException thrown =
- assertThrows(
- ResourceStatusProhibitsOperationException.class,
- () -> doFailingTest("contact_transfer_request.xml"));
- assertThat(thrown).hasMessageThat().contains("pendingDelete");
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testIcannActivityReportField_getsLogged() throws Exception {
- runFlow();
- assertIcannReportingActivityFieldLogged("srs-cont-transfer-request");
+ void testThrowsException() {
+ assertAboutEppExceptions()
+ .that(assertThrows(ContactsProhibitedException.class, this::runFlow))
+ .marshalsToXml();
}
}
diff --git a/core/src/test/java/google/registry/flows/contact/ContactUpdateFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactUpdateFlowTest.java
index 81b92eced..5ad8842a5 100644
--- a/core/src/test/java/google/registry/flows/contact/ContactUpdateFlowTest.java
+++ b/core/src/test/java/google/registry/flows/contact/ContactUpdateFlowTest.java
@@ -14,449 +14,24 @@
package google.registry.flows.contact;
-import static com.google.common.truth.Truth.assertThat;
-import static google.registry.model.common.FeatureFlag.FeatureName.MINIMUM_DATASET_CONTACTS_PROHIBITED;
-import static google.registry.model.common.FeatureFlag.FeatureStatus.ACTIVE;
-import static google.registry.model.common.FeatureFlag.FeatureStatus.INACTIVE;
-import static google.registry.testing.ContactSubject.assertAboutContacts;
-import static google.registry.testing.DatabaseHelper.assertNoBillingEvents;
-import static google.registry.testing.DatabaseHelper.newContact;
-import static google.registry.testing.DatabaseHelper.persistActiveContact;
-import static google.registry.testing.DatabaseHelper.persistDeletedContact;
-import static google.registry.testing.DatabaseHelper.persistResource;
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
-import static google.registry.util.DateTimeUtils.START_OF_TIME;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedMap;
-import google.registry.flows.EppException;
-import google.registry.flows.FlowUtils.NotLoggedInException;
-import google.registry.flows.ResourceFlowTestCase;
-import google.registry.flows.ResourceFlowUtils.AddRemoveSameValueException;
-import google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException;
-import google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException;
-import google.registry.flows.ResourceFlowUtils.StatusNotClientSettableException;
-import google.registry.flows.contact.ContactFlowUtils.BadInternationalizedPostalInfoException;
-import google.registry.flows.contact.ContactFlowUtils.DeclineContactDisclosureFieldDisallowedPolicyException;
+import google.registry.flows.FlowTestCase;
import google.registry.flows.exceptions.ContactsProhibitedException;
-import google.registry.flows.exceptions.ResourceHasClientUpdateProhibitedException;
-import google.registry.flows.exceptions.ResourceStatusProhibitsOperationException;
-import google.registry.model.common.FeatureFlag;
-import google.registry.model.contact.Contact;
-import google.registry.model.contact.ContactAddress;
-import google.registry.model.contact.PostalInfo;
-import google.registry.model.contact.PostalInfo.Type;
-import google.registry.model.eppcommon.StatusValue;
import org.junit.jupiter.api.Test;
/** Unit tests for {@link ContactUpdateFlow}. */
-class ContactUpdateFlowTest extends ResourceFlowTestCase {
+class ContactUpdateFlowTest extends FlowTestCase {
ContactUpdateFlowTest() {
setEppInput("contact_update.xml");
}
- private void doSuccessfulTest() throws Exception {
- clock.advanceOneMilli();
- assertMutatingFlow(true);
- runFlowAssertResponse(loadFile("generic_success_response.xml"));
- Contact contact = reloadResourceByForeignKey();
- // Check that the contact was updated. This value came from the xml.
- assertAboutContacts()
- .that(contact)
- .hasAuthInfoPwd("2fooBAR")
- .and()
- .hasOnlyOneHistoryEntryWhich()
- .hasNoXml();
- assertNoBillingEvents();
- assertLastHistoryContainsResource(contact);
- }
-
@Test
- void testNotLoggedIn() {
- sessionMetadata.setRegistrarId(null);
- EppException thrown = assertThrows(NotLoggedInException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testDryRun() throws Exception {
- persistActiveContact(getUniqueIdFromCommand());
- dryRunFlowAssertResponse(loadFile("generic_success_response.xml"));
- }
-
- @Test
- void testSuccess() throws Exception {
- persistActiveContact(getUniqueIdFromCommand());
- doSuccessfulTest();
- }
-
- @Test
- void testFailure_minimumDatasetPhase2_cannotUpdateContacts() throws Exception {
- persistResource(
- new FeatureFlag.Builder()
- .setFeatureName(MINIMUM_DATASET_CONTACTS_PROHIBITED)
- .setStatusMap(
- ImmutableSortedMap.of(START_OF_TIME, INACTIVE, clock.nowUtc().minusDays(5), ACTIVE))
- .build());
- EppException thrown = assertThrows(ContactsProhibitedException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testSuccess_updatingInternationalizedPostalInfoDeletesLocalized() throws Exception {
- Contact contact =
- persistResource(
- newContact(getUniqueIdFromCommand())
- .asBuilder()
- .setLocalizedPostalInfo(
- new PostalInfo.Builder()
- .setType(Type.LOCALIZED)
- .setAddress(
- new ContactAddress.Builder()
- .setStreet(ImmutableList.of("111 8th Ave", "4th Floor"))
- .setCity("New York")
- .setState("NY")
- .setZip("10011")
- .setCountryCode("US")
- .build())
- .build())
- .build());
- clock.advanceOneMilli();
- // The test xml updates the internationalized postal info and should therefore implicitly delete
- // the localized one since they are treated as a pair for update purposes.
- assertAboutContacts().that(contact)
- .hasNonNullLocalizedPostalInfo().and()
- .hasNullInternationalizedPostalInfo();
-
- runFlowAssertResponse(loadFile("generic_success_response.xml"));
- assertAboutContacts().that(reloadResourceByForeignKey())
- .hasNullLocalizedPostalInfo().and()
- .hasInternationalizedPostalInfo(new PostalInfo.Builder()
- .setType(Type.INTERNATIONALIZED)
- .setAddress(new ContactAddress.Builder()
- .setStreet(ImmutableList.of("124 Example Dr.", "Suite 200"))
- .setCity("Dulles")
- .setState("VA")
- .setZip("20166-6503")
- .setCountryCode("US")
- .build())
- .build());
- }
-
- @Test
- void testSuccess_updatingLocalizedPostalInfoDeletesInternationalized() throws Exception {
- setEppInput("contact_update_localized.xml");
- Contact contact =
- persistResource(
- newContact(getUniqueIdFromCommand())
- .asBuilder()
- .setInternationalizedPostalInfo(
- new PostalInfo.Builder()
- .setType(Type.INTERNATIONALIZED)
- .setAddress(
- new ContactAddress.Builder()
- .setStreet(ImmutableList.of("111 8th Ave", "4th Floor"))
- .setCity("New York")
- .setState("NY")
- .setZip("10011")
- .setCountryCode("US")
- .build())
- .build())
- .build());
- clock.advanceOneMilli();
- // The test xml updates the localized postal info and should therefore implicitly delete
- // the internationalized one since they are treated as a pair for update purposes.
- assertAboutContacts().that(contact)
- .hasNonNullInternationalizedPostalInfo().and()
- .hasNullLocalizedPostalInfo();
-
- runFlowAssertResponse(loadFile("generic_success_response.xml"));
- assertAboutContacts().that(reloadResourceByForeignKey())
- .hasNullInternationalizedPostalInfo().and()
- .hasLocalizedPostalInfo(new PostalInfo.Builder()
- .setType(Type.LOCALIZED)
- .setAddress(new ContactAddress.Builder()
- .setStreet(ImmutableList.of("124 Example Dr.", "Suite 200"))
- .setCity("Dulles")
- .setState("VA")
- .setZip("20166-6503")
- .setCountryCode("US")
- .build())
- .build());
- }
-
- @Test
- void testSuccess_partialPostalInfoUpdate() throws Exception {
- setEppInput("contact_update_partial_postalinfo.xml");
- persistResource(
- newContact(getUniqueIdFromCommand())
- .asBuilder()
- .setLocalizedPostalInfo(
- new PostalInfo.Builder()
- .setType(Type.LOCALIZED)
- .setName("A. Person")
- .setOrg("Company Inc.")
- .setAddress(
- new ContactAddress.Builder()
- .setStreet(ImmutableList.of("123 4th st", "5th Floor"))
- .setCity("City")
- .setState("AB")
- .setZip("12345")
- .setCountryCode("US")
- .build())
- .build())
- .build());
- clock.advanceOneMilli();
- // The test xml updates the address of the postal info and should leave the name untouched.
- runFlowAssertResponse(loadFile("generic_success_response.xml"));
- assertAboutContacts().that(reloadResourceByForeignKey()).hasLocalizedPostalInfo(
- new PostalInfo.Builder()
- .setType(Type.LOCALIZED)
- .setName("A. Person")
- .setOrg("Company Inc.")
- .setAddress(new ContactAddress.Builder()
- .setStreet(ImmutableList.of("456 5th st"))
- .setCity("Place")
- .setState("CD")
- .setZip("54321")
- .setCountryCode("US")
- .build())
- .build());
- }
-
- @Test
- void testSuccess_updateOnePostalInfo_touchOtherPostalInfoPreservesIt() throws Exception {
- setEppInput("contact_update_partial_postalinfo_preserve_int.xml");
- persistResource(
- newContact(getUniqueIdFromCommand())
- .asBuilder()
- .setLocalizedPostalInfo(
- new PostalInfo.Builder()
- .setType(Type.LOCALIZED)
- .setName("A. Person")
- .setOrg("Company Inc.")
- .setAddress(
- new ContactAddress.Builder()
- .setStreet(ImmutableList.of("123 4th st", "5th Floor"))
- .setCity("City")
- .setState("AB")
- .setZip("12345")
- .setCountryCode("US")
- .build())
- .build())
- .setInternationalizedPostalInfo(
- new PostalInfo.Builder()
- .setType(Type.INTERNATIONALIZED)
- .setName("B. Person")
- .setOrg("Company Co.")
- .setAddress(
- new ContactAddress.Builder()
- .setStreet(ImmutableList.of("100 200th Dr.", "6th Floor"))
- .setCity("Town")
- .setState("CD")
- .setZip("67890")
- .setCountryCode("US")
- .build())
- .build())
- .build());
- clock.advanceOneMilli();
- // The test xml updates the address of the localized postal info. It also sets the name of the
- // internationalized postal info to the same value it previously had, which causes it to be
- // preserved. If the xml had not mentioned the internationalized one at all it would have been
- // deleted.
- runFlowAssertResponse(loadFile("generic_success_response.xml"));
- assertAboutContacts().that(reloadResourceByForeignKey())
- .hasLocalizedPostalInfo(
- new PostalInfo.Builder()
- .setType(Type.LOCALIZED)
- .setName("A. Person")
- .setOrg("Company Inc.")
- .setAddress(new ContactAddress.Builder()
- .setStreet(ImmutableList.of("456 5th st"))
- .setCity("Place")
- .setState("CD")
- .setZip("54321")
- .setCountryCode("US")
- .build())
- .build())
- .and()
- .hasInternationalizedPostalInfo(
- new PostalInfo.Builder()
- .setType(Type.INTERNATIONALIZED)
- .setName("B. Person")
- .setOrg("Company Co.")
- .setAddress(new ContactAddress.Builder()
- .setStreet(ImmutableList.of("100 200th Dr.", "6th Floor"))
- .setCity("Town")
- .setState("CD")
- .setZip("67890")
- .setCountryCode("US")
- .build())
- .build());
- }
-
- @Test
- void testFailure_neverExisted() throws Exception {
- ResourceDoesNotExistException thrown =
- assertThrows(ResourceDoesNotExistException.class, this::runFlow);
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_existedButWasDeleted() throws Exception {
- persistDeletedContact(getUniqueIdFromCommand(), clock.nowUtc().minusDays(1));
- ResourceDoesNotExistException thrown =
- assertThrows(ResourceDoesNotExistException.class, this::runFlow);
- assertThat(thrown).hasMessageThat().contains(String.format("(%s)", getUniqueIdFromCommand()));
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_statusValueNotClientSettable() throws Exception {
- setEppInput("contact_update_prohibited_status.xml");
- persistActiveContact(getUniqueIdFromCommand());
- EppException thrown = assertThrows(StatusNotClientSettableException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testSuccess_superuserStatusValueNotClientSettable() throws Exception {
- setEppInput("contact_update_prohibited_status.xml");
- persistActiveContact(getUniqueIdFromCommand());
- clock.advanceOneMilli();
- runFlowAssertResponse(
- CommitMode.LIVE, UserPrivileges.SUPERUSER, loadFile("generic_success_response.xml"));
- }
-
- @Test
- void testFailure_unauthorizedClient() throws Exception {
- sessionMetadata.setRegistrarId("NewRegistrar");
- persistActiveContact(getUniqueIdFromCommand());
- EppException thrown = assertThrows(ResourceNotOwnedException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testSuccess_superuserUnauthorizedClient() throws Exception {
- sessionMetadata.setRegistrarId("NewRegistrar");
- persistActiveContact(getUniqueIdFromCommand());
- clock.advanceOneMilli();
- runFlowAssertResponse(
- CommitMode.LIVE, UserPrivileges.SUPERUSER, loadFile("generic_success_response.xml"));
- }
-
- @Test
- void testSuccess_clientUpdateProhibited_removed() throws Exception {
- setEppInput("contact_update_remove_client_update_prohibited.xml");
- persistResource(
- newContact(getUniqueIdFromCommand())
- .asBuilder()
- .setStatusValues(ImmutableSet.of(StatusValue.CLIENT_UPDATE_PROHIBITED))
- .build());
- doSuccessfulTest();
- assertAboutContacts()
- .that(reloadResourceByForeignKey())
- .doesNotHaveStatusValue(StatusValue.CLIENT_UPDATE_PROHIBITED);
- }
-
- @Test
- void testSuccess_superuserClientUpdateProhibited_notRemoved() throws Exception {
- setEppInput("contact_update_prohibited_status.xml");
- persistResource(
- newContact(getUniqueIdFromCommand())
- .asBuilder()
- .setStatusValues(ImmutableSet.of(StatusValue.CLIENT_UPDATE_PROHIBITED))
- .build());
- clock.advanceOneMilli();
- runFlowAssertResponse(
- CommitMode.LIVE, UserPrivileges.SUPERUSER, loadFile("generic_success_response.xml"));
- assertAboutContacts()
- .that(reloadResourceByForeignKey())
- .hasStatusValue(StatusValue.CLIENT_UPDATE_PROHIBITED)
- .and()
- .hasStatusValue(StatusValue.SERVER_DELETE_PROHIBITED);
- }
-
- @Test
- void testFailure_clientUpdateProhibited_notRemoved() throws Exception {
- persistResource(
- newContact(getUniqueIdFromCommand())
- .asBuilder()
- .setStatusValues(ImmutableSet.of(StatusValue.CLIENT_UPDATE_PROHIBITED))
- .build());
- EppException thrown =
- assertThrows(ResourceHasClientUpdateProhibitedException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_serverUpdateProhibited() throws Exception {
- persistResource(
- newContact(getUniqueIdFromCommand())
- .asBuilder()
- .setStatusValues(ImmutableSet.of(StatusValue.SERVER_UPDATE_PROHIBITED))
- .build());
- ResourceStatusProhibitsOperationException thrown =
- assertThrows(ResourceStatusProhibitsOperationException.class, this::runFlow);
- assertThat(thrown).hasMessageThat().contains("serverUpdateProhibited");
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_pendingDeleteProhibited() throws Exception {
- persistResource(
- newContact(getUniqueIdFromCommand())
- .asBuilder()
- .setStatusValues(ImmutableSet.of(StatusValue.PENDING_DELETE))
- .build());
- ResourceStatusProhibitsOperationException thrown =
- assertThrows(ResourceStatusProhibitsOperationException.class, this::runFlow);
- assertThat(thrown).hasMessageThat().contains("pendingDelete");
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testSuccess_nonAsciiInLocAddress() throws Exception {
- setEppInput("contact_update_hebrew_loc.xml");
- persistActiveContact(getUniqueIdFromCommand());
- doSuccessfulTest();
- }
-
- @Test
- void testFailure_nonAsciiInIntAddress() throws Exception {
- setEppInput("contact_update_hebrew_int.xml");
- persistActiveContact(getUniqueIdFromCommand());
- EppException thrown =
- assertThrows(BadInternationalizedPostalInfoException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_declineDisclosure() throws Exception {
- setEppInput("contact_update_decline_disclosure.xml");
- persistActiveContact(getUniqueIdFromCommand());
- EppException thrown =
- assertThrows(DeclineContactDisclosureFieldDisallowedPolicyException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testFailure_addRemoveSameValue() throws Exception {
- setEppInput("contact_update_add_remove_same.xml");
- persistActiveContact(getUniqueIdFromCommand());
- EppException thrown = assertThrows(AddRemoveSameValueException.class, this::runFlow);
- assertAboutEppExceptions().that(thrown).marshalsToXml();
- }
-
- @Test
- void testIcannActivityReportField_getsLogged() throws Exception {
- persistActiveContact(getUniqueIdFromCommand());
- clock.advanceOneMilli();
- runFlow();
- assertIcannReportingActivityFieldLogged("srs-cont-update");
+ void testThrowsException() {
+ assertAboutEppExceptions()
+ .that(assertThrows(ContactsProhibitedException.class, this::runFlow))
+ .marshalsToXml();
}
}
diff --git a/core/src/test/resources/google/registry/flows/contact_create_jd1234.xml b/core/src/test/resources/google/registry/flows/contact_create_jd1234.xml
deleted file mode 100644
index 50ef7ed53..000000000
--- a/core/src/test/resources/google/registry/flows/contact_create_jd1234.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
- jd1234
-
- John Doe
- Example Inc.
-
- 123 Example Dr.
- Suite 100
- Dulles
- VA
- 20166-6503
- US
-
-
- +1.7035555555
- +1.7035555556
- jdoe@example.com
-
- 2fooBAR
-
-
-
-
-
-
-
- ABC-12345
-
-
diff --git a/core/src/test/resources/google/registry/flows/contact_create_response_jd1234.xml b/core/src/test/resources/google/registry/flows/contact_create_response_jd1234.xml
deleted file mode 100644
index 6bbe3cdbf..000000000
--- a/core/src/test/resources/google/registry/flows/contact_create_response_jd1234.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- Command completed successfully
-
-
-
- jd1234
- 2000-06-01T00:01:00.0Z
-
-
-
- ABC-12345
- server-trid
-
-
-
diff --git a/core/src/test/resources/google/registry/flows/contact_create_response_sh8013.xml b/core/src/test/resources/google/registry/flows/contact_create_response_sh8013.xml
deleted file mode 100644
index 65a59199d..000000000
--- a/core/src/test/resources/google/registry/flows/contact_create_response_sh8013.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- Command completed successfully
-
-
-
- sh8013
- %CRDATE%
-
-
-
- ABC-12345
- server-trid
-
-
-
diff --git a/core/src/test/resources/google/registry/flows/contact_create_sh8013.xml b/core/src/test/resources/google/registry/flows/contact_create_sh8013.xml
deleted file mode 100644
index 231a1f5b6..000000000
--- a/core/src/test/resources/google/registry/flows/contact_create_sh8013.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
- sh8013
-
- John Doe
- Example Inc.
-
- 123 Example Dr.
- Suite 100
- Dulles
- VA
- 20166-6503
- US
-
-
- +1.7035555555
- +1.7035555556
- jdoe@example.com
-
- 2fooBAR
-
-
-
-
-
-
-
- ABC-12345
-
-
diff --git a/core/src/test/resources/google/registry/flows/contact_delete_response_sh8013.xml b/core/src/test/resources/google/registry/flows/contact_delete_response_sh8013.xml
deleted file mode 100644
index ab613d34f..000000000
--- a/core/src/test/resources/google/registry/flows/contact_delete_response_sh8013.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- Command completed successfully
-
-
- ABC-12345
- server-trid
-
-
-
diff --git a/core/src/test/resources/google/registry/flows/contact_delete_sh8013.xml b/core/src/test/resources/google/registry/flows/contact_delete_sh8013.xml
deleted file mode 100644
index 71e444008..000000000
--- a/core/src/test/resources/google/registry/flows/contact_delete_sh8013.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- sh8013
-
-
- ABC-12345
-
-
diff --git a/core/src/test/resources/google/registry/flows/contact_transfer_request.xml b/core/src/test/resources/google/registry/flows/contact_transfer_request.xml
deleted file mode 100644
index dddbf6786..000000000
--- a/core/src/test/resources/google/registry/flows/contact_transfer_request.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
- sh8013
-
- 2fooBAR
-
-
-
- ABC-12345
-
-
diff --git a/core/src/test/resources/google/registry/flows/contact_transfer_request_response_alternate.xml b/core/src/test/resources/google/registry/flows/contact_transfer_request_response_alternate.xml
deleted file mode 100644
index eee999ae0..000000000
--- a/core/src/test/resources/google/registry/flows/contact_transfer_request_response_alternate.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
- Command completed successfully; action pending
-
-
-
- sh8013
- pending
- TheRegistrar
- 2000-06-08T22:00:00.0Z
- NewRegistrar
- 2000-06-13T22:00:00.0Z
-
-
-
- ABC-12345
- server-trid
-
-
-
diff --git a/core/src/test/resources/google/registry/flows/poll_response_domain_transfer_request.xml b/core/src/test/resources/google/registry/flows/poll_response_domain_transfer_request.xml
index 35ae1cf8c..e328be4af 100644
--- a/core/src/test/resources/google/registry/flows/poll_response_domain_transfer_request.xml
+++ b/core/src/test/resources/google/registry/flows/poll_response_domain_transfer_request.xml
@@ -20,7 +20,7 @@
ABC-12345
- BYiJH5vHRRW6EuYXo/Kdsg==-23
+ server-trid