Using Gmail for most use cases (#2126)

* Using Gmail for most use cases
This commit is contained in:
Weimin Yu 2023-08-28 11:11:59 -04:00 committed by GitHub
parent 7b59c4abbf
commit e6f9b1c7e6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 58 additions and 57 deletions

View file

@ -31,6 +31,7 @@ import com.google.common.flogger.FluentLogger;
import com.google.common.net.MediaType; import com.google.common.net.MediaType;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.flows.certs.CertificateChecker; import google.registry.flows.certs.CertificateChecker;
import google.registry.groups.GmailClient;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
import google.registry.model.registrar.RegistrarPoc; import google.registry.model.registrar.RegistrarPoc;
import google.registry.model.registrar.RegistrarPoc.Type; import google.registry.model.registrar.RegistrarPoc.Type;
@ -38,7 +39,6 @@ import google.registry.request.Action;
import google.registry.request.Response; import google.registry.request.Response;
import google.registry.request.auth.Auth; import google.registry.request.auth.Auth;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.SendEmailService;
import java.util.Date; import java.util.Date;
import java.util.Optional; import java.util.Optional;
import javax.inject.Inject; import javax.inject.Inject;
@ -72,7 +72,7 @@ public class SendExpiringCertificateNotificationEmailAction implements Runnable
private final CertificateChecker certificateChecker; private final CertificateChecker certificateChecker;
private final String expirationWarningEmailBodyText; private final String expirationWarningEmailBodyText;
private final SendEmailService sendEmailService; private final GmailClient gmailClient;
private final String expirationWarningEmailSubjectText; private final String expirationWarningEmailSubjectText;
private final InternetAddress gSuiteOutgoingEmailAddress; private final InternetAddress gSuiteOutgoingEmailAddress;
private final Response response; private final Response response;
@ -82,12 +82,12 @@ public class SendExpiringCertificateNotificationEmailAction implements Runnable
@Config("expirationWarningEmailBodyText") String expirationWarningEmailBodyText, @Config("expirationWarningEmailBodyText") String expirationWarningEmailBodyText,
@Config("expirationWarningEmailSubjectText") String expirationWarningEmailSubjectText, @Config("expirationWarningEmailSubjectText") String expirationWarningEmailSubjectText,
@Config("gSuiteOutgoingEmailAddress") InternetAddress gSuiteOutgoingEmailAddress, @Config("gSuiteOutgoingEmailAddress") InternetAddress gSuiteOutgoingEmailAddress,
SendEmailService sendEmailService, GmailClient gmailClient,
CertificateChecker certificateChecker, CertificateChecker certificateChecker,
Response response) { Response response) {
this.certificateChecker = certificateChecker; this.certificateChecker = certificateChecker;
this.expirationWarningEmailSubjectText = expirationWarningEmailSubjectText; this.expirationWarningEmailSubjectText = expirationWarningEmailSubjectText;
this.sendEmailService = sendEmailService; this.gmailClient = gmailClient;
this.gSuiteOutgoingEmailAddress = gSuiteOutgoingEmailAddress; this.gSuiteOutgoingEmailAddress = gSuiteOutgoingEmailAddress;
this.expirationWarningEmailBodyText = expirationWarningEmailBodyText; this.expirationWarningEmailBodyText = expirationWarningEmailBodyText;
this.response = response; this.response = response;
@ -173,7 +173,7 @@ public class SendExpiringCertificateNotificationEmailAction implements Runnable
registrar.getRegistrarName()); registrar.getRegistrarName());
return false; return false;
} }
sendEmailService.sendEmail( gmailClient.sendEmail(
EmailMessage.newBuilder() EmailMessage.newBuilder()
.setFrom(gSuiteOutgoingEmailAddress) .setFrom(gSuiteOutgoingEmailAddress)
.setSubject(expirationWarningEmailSubjectText) .setSubject(expirationWarningEmailSubjectText)

View file

@ -45,6 +45,7 @@ import google.registry.dns.DnsMetrics.ActionStatus;
import google.registry.dns.DnsMetrics.CommitStatus; import google.registry.dns.DnsMetrics.CommitStatus;
import google.registry.dns.DnsMetrics.PublishStatus; import google.registry.dns.DnsMetrics.PublishStatus;
import google.registry.dns.writer.DnsWriter; import google.registry.dns.writer.DnsWriter;
import google.registry.groups.GmailClient;
import google.registry.model.domain.Domain; import google.registry.model.domain.Domain;
import google.registry.model.host.Host; import google.registry.model.host.Host;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
@ -61,7 +62,6 @@ import google.registry.request.lock.LockHandler;
import google.registry.util.Clock; import google.registry.util.Clock;
import google.registry.util.DomainNameUtils; import google.registry.util.DomainNameUtils;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.SendEmailService;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
@ -112,7 +112,7 @@ public final class PublishDnsUpdatesAction implements Runnable, Callable<Void> {
private final Clock clock; private final Clock clock;
private final CloudTasksUtils cloudTasksUtils; private final CloudTasksUtils cloudTasksUtils;
private final Response response; private final Response response;
private final SendEmailService sendEmailService; private final GmailClient gmailClient;
private final String dnsUpdateFailEmailSubjectText; private final String dnsUpdateFailEmailSubjectText;
private final String dnsUpdateFailEmailBodyText; private final String dnsUpdateFailEmailBodyText;
private final String dnsUpdateFailRegistryName; private final String dnsUpdateFailRegistryName;
@ -143,12 +143,12 @@ public final class PublishDnsUpdatesAction implements Runnable, Callable<Void> {
LockHandler lockHandler, LockHandler lockHandler,
Clock clock, Clock clock,
CloudTasksUtils cloudTasksUtils, CloudTasksUtils cloudTasksUtils,
SendEmailService sendEmailService, GmailClient gmailClient,
Response response) { Response response) {
this.dnsWriterProxy = dnsWriterProxy; this.dnsWriterProxy = dnsWriterProxy;
this.dnsMetrics = dnsMetrics; this.dnsMetrics = dnsMetrics;
this.timeout = timeout; this.timeout = timeout;
this.sendEmailService = sendEmailService; this.gmailClient = gmailClient;
this.retryCount = retryCount; this.retryCount = retryCount;
this.dnsWriter = dnsWriter; this.dnsWriter = dnsWriter;
this.enqueuedTime = enqueuedTime; this.enqueuedTime = enqueuedTime;
@ -303,7 +303,7 @@ public final class PublishDnsUpdatesAction implements Runnable, Callable<Void> {
.map(PublishDnsUpdatesAction::emailToInternetAddress) .map(PublishDnsUpdatesAction::emailToInternetAddress)
.collect(toImmutableList()); .collect(toImmutableList());
sendEmailService.sendEmail( gmailClient.sendEmail(
EmailMessage.newBuilder() EmailMessage.newBuilder()
.setBody(body) .setBody(body)
.setSubject(dnsUpdateFailEmailSubjectText) .setSubject(dnsUpdateFailEmailSubjectText)

View file

@ -23,6 +23,7 @@ import com.google.api.services.gmail.model.Message;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.flogger.FluentLogger; import com.google.common.flogger.FluentLogger;
import com.google.common.net.MediaType; import com.google.common.net.MediaType;
import dagger.Lazy;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.EmailMessage.Attachment; import google.registry.util.EmailMessage.Attachment;
@ -49,7 +50,7 @@ public final class GmailClient {
private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final Gmail gmail; private final Lazy<Gmail> gmail;
private final Retrier retrier; private final Retrier retrier;
private final boolean isEmailSendingEnabled; private final boolean isEmailSendingEnabled;
private final InternetAddress outgoingEmailAddressWithUsername; private final InternetAddress outgoingEmailAddressWithUsername;
@ -57,7 +58,7 @@ public final class GmailClient {
@Inject @Inject
GmailClient( GmailClient(
Gmail gmail, Lazy<Gmail> gmail,
Retrier retrier, Retrier retrier,
@Config("isEmailSendingEnabled") boolean isEmailSendingEnabled, @Config("isEmailSendingEnabled") boolean isEmailSendingEnabled,
@Config("gSuiteNewOutgoingEmailAddress") String gSuiteOutgoingEmailAddress, @Config("gSuiteNewOutgoingEmailAddress") String gSuiteOutgoingEmailAddress,
@ -99,7 +100,7 @@ public final class GmailClient {
// Unlike other Cloud APIs such as GCS and SecretManager, Gmail does not retry on errors. // Unlike other Cloud APIs such as GCS and SecretManager, Gmail does not retry on errors.
retrier.callWithRetry( retrier.callWithRetry(
// "me" is reserved word for the authorized user of the Gmail API. // "me" is reserved word for the authorized user of the Gmail API.
() -> this.gmail.users().messages().send("me", message).execute(), () -> this.gmail.get().users().messages().send("me", message).execute(),
RetriableGmailExceptionPredicate.INSTANCE); RetriableGmailExceptionPredicate.INSTANCE);
} }

View file

@ -20,8 +20,8 @@ import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.flogger.FluentLogger; import com.google.common.flogger.FluentLogger;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.groups.GmailClient;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.SendEmailService;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -38,7 +38,7 @@ public class SendEmailUtils {
private final InternetAddress gSuiteOutgoingEmailAddress; private final InternetAddress gSuiteOutgoingEmailAddress;
private final String gSuiteOutgoingEmailDisplayName; private final String gSuiteOutgoingEmailDisplayName;
private final SendEmailService emailService; private final GmailClient gmailClient;
private final ImmutableList<String> registrarChangesNotificationEmailAddresses; private final ImmutableList<String> registrarChangesNotificationEmailAddresses;
@Inject @Inject
@ -47,10 +47,10 @@ public class SendEmailUtils {
@Config("gSuiteOutgoingEmailDisplayName") String gSuiteOutgoingEmailDisplayName, @Config("gSuiteOutgoingEmailDisplayName") String gSuiteOutgoingEmailDisplayName,
@Config("registrarChangesNotificationEmailAddresses") @Config("registrarChangesNotificationEmailAddresses")
ImmutableList<String> registrarChangesNotificationEmailAddresses, ImmutableList<String> registrarChangesNotificationEmailAddresses,
SendEmailService emailService) { GmailClient gmailClient) {
this.gSuiteOutgoingEmailAddress = gSuiteOutgoingEmailAddress; this.gSuiteOutgoingEmailAddress = gSuiteOutgoingEmailAddress;
this.gSuiteOutgoingEmailDisplayName = gSuiteOutgoingEmailDisplayName; this.gSuiteOutgoingEmailDisplayName = gSuiteOutgoingEmailDisplayName;
this.emailService = emailService; this.gmailClient = gmailClient;
this.registrarChangesNotificationEmailAddresses = registrarChangesNotificationEmailAddresses; this.registrarChangesNotificationEmailAddresses = registrarChangesNotificationEmailAddresses;
} }
@ -109,7 +109,7 @@ public class SendEmailUtils {
"Could not send email to %s with subject '%s'.", bcc, subject); "Could not send email to %s with subject '%s'.", bcc, subject);
} }
} }
emailService.sendEmail(emailMessage.build()); gmailClient.sendEmail(emailMessage.build());
return true; return true;
} catch (Throwable t) { } catch (Throwable t) {
logger.atSevere().withCause(t).log( logger.atSevere().withCause(t).log(

View file

@ -28,6 +28,7 @@ import static org.mockito.Mockito.verifyNoInteractions;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.testing.TestLogHandler; import com.google.common.testing.TestLogHandler;
import google.registry.groups.GmailClient;
import google.registry.model.billing.BillingBase.RenewalPriceBehavior; import google.registry.model.billing.BillingBase.RenewalPriceBehavior;
import google.registry.model.contact.Contact; import google.registry.model.contact.Contact;
import google.registry.model.domain.token.AllocationToken; import google.registry.model.domain.token.AllocationToken;
@ -39,7 +40,6 @@ import google.registry.testing.DatabaseHelper;
import google.registry.testing.FakeClock; import google.registry.testing.FakeClock;
import google.registry.ui.server.SendEmailUtils; import google.registry.ui.server.SendEmailUtils;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.SendEmailService;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
@ -77,7 +77,7 @@ public class CheckBulkComplianceActionTest {
private final TestLogHandler logHandler = new TestLogHandler(); private final TestLogHandler logHandler = new TestLogHandler();
private final Logger loggerToIntercept = private final Logger loggerToIntercept =
Logger.getLogger(CheckBulkComplianceAction.class.getCanonicalName()); Logger.getLogger(CheckBulkComplianceAction.class.getCanonicalName());
private final SendEmailService emailService = mock(SendEmailService.class); private final GmailClient gmailClient = mock(GmailClient.class);
private Contact contact; private Contact contact;
private BulkPricingPackage bulkPricingPackage; private BulkPricingPackage bulkPricingPackage;
private SendEmailUtils sendEmailUtils; private SendEmailUtils sendEmailUtils;
@ -91,7 +91,7 @@ public class CheckBulkComplianceActionTest {
new InternetAddress("outgoing@registry.example"), new InternetAddress("outgoing@registry.example"),
"UnitTest Registry", "UnitTest Registry",
ImmutableList.of("notification@test.example", "notification2@test.example"), ImmutableList.of("notification@test.example", "notification2@test.example"),
emailService); gmailClient);
createTld("tld"); createTld("tld");
action = action =
new CheckBulkComplianceAction( new CheckBulkComplianceAction(
@ -143,7 +143,7 @@ public class CheckBulkComplianceActionTest {
.build()); .build());
action.run(); action.run();
verifyNoInteractions(emailService); verifyNoInteractions(gmailClient);
assertAboutLogs() assertAboutLogs()
.that(logHandler) .that(logHandler)
.hasLogAtLevelWithMessage( .hasLogAtLevelWithMessage(
@ -176,7 +176,7 @@ public class CheckBulkComplianceActionTest {
Level.INFO, Level.INFO,
"Bulk pricing package with bulk token abc123 has exceeded their max domain creation" "Bulk pricing package with bulk token abc123 has exceeded their max domain creation"
+ " limit by 1 name(s)."); + " limit by 1 name(s).");
verify(emailService).sendEmail(emailCaptor.capture()); verify(gmailClient).sendEmail(emailCaptor.capture());
EmailMessage emailMessage = emailCaptor.getValue(); EmailMessage emailMessage = emailCaptor.getValue();
assertThat(emailMessage.subject()).isEqualTo(CREATE_LIMIT_EMAIL_SUBJECT); assertThat(emailMessage.subject()).isEqualTo(CREATE_LIMIT_EMAIL_SUBJECT);
assertThat(emailMessage.body()) assertThat(emailMessage.body())
@ -248,7 +248,7 @@ public class CheckBulkComplianceActionTest {
Level.INFO, Level.INFO,
"Bulk pricing package with bulk token token has exceeded their max domain creation" "Bulk pricing package with bulk token token has exceeded their max domain creation"
+ " limit by 1 name(s)."); + " limit by 1 name(s).");
verify(emailService, times(2)).sendEmail(any(EmailMessage.class)); verify(gmailClient, times(2)).sendEmail(any(EmailMessage.class));
} }
@Test @Test
@ -292,7 +292,7 @@ public class CheckBulkComplianceActionTest {
.that(logHandler) .that(logHandler)
.hasLogAtLevelWithMessage( .hasLogAtLevelWithMessage(
Level.INFO, "Found no bulk pricing packages over their create limit."); Level.INFO, "Found no bulk pricing packages over their create limit.");
verifyNoInteractions(emailService); verifyNoInteractions(gmailClient);
} }
@Test @Test
@ -305,7 +305,7 @@ public class CheckBulkComplianceActionTest {
.build()); .build());
action.run(); action.run();
verifyNoInteractions(emailService); verifyNoInteractions(gmailClient);
assertAboutLogs() assertAboutLogs()
.that(logHandler) .that(logHandler)
.hasLogAtLevelWithMessage( .hasLogAtLevelWithMessage(
@ -365,7 +365,7 @@ public class CheckBulkComplianceActionTest {
Level.INFO, Level.INFO,
"Bulk pricing package with bulk token abc123 has exceed their max active domains limit" "Bulk pricing package with bulk token abc123 has exceed their max active domains limit"
+ " by 1 name(s)."); + " by 1 name(s).");
verify(emailService).sendEmail(emailCaptor.capture()); verify(gmailClient).sendEmail(emailCaptor.capture());
EmailMessage emailMessage = emailCaptor.getValue(); EmailMessage emailMessage = emailCaptor.getValue();
assertThat(emailMessage.subject()).isEqualTo(DOMAIN_LIMIT_WARNING_EMAIL_SUBJECT); assertThat(emailMessage.subject()).isEqualTo(DOMAIN_LIMIT_WARNING_EMAIL_SUBJECT);
assertThat(emailMessage.body()) assertThat(emailMessage.body())
@ -442,7 +442,7 @@ public class CheckBulkComplianceActionTest {
Level.INFO, Level.INFO,
"Bulk pricing package with bulk token token has exceed their max active domains limit" "Bulk pricing package with bulk token token has exceed their max active domains limit"
+ " by 1 name(s)."); + " by 1 name(s).");
verify(emailService, times(2)).sendEmail(any(EmailMessage.class)); verify(gmailClient, times(2)).sendEmail(any(EmailMessage.class));
} }
@Test @Test
@ -479,7 +479,7 @@ public class CheckBulkComplianceActionTest {
Level.INFO, Level.INFO,
"Bulk pricing package with bulk token abc123 has exceed their max active domains limit" "Bulk pricing package with bulk token abc123 has exceed their max active domains limit"
+ " by 1 name(s)."); + " by 1 name(s).");
verifyNoInteractions(emailService); verifyNoInteractions(gmailClient);
BulkPricingPackage packageAfterCheck = BulkPricingPackage packageAfterCheck =
tm().transact(() -> BulkPricingPackage.loadByTokenString(token.getToken()).get()); tm().transact(() -> BulkPricingPackage.loadByTokenString(token.getToken()).get());
assertThat(packageAfterCheck.getLastNotificationSent().get()) assertThat(packageAfterCheck.getLastNotificationSent().get())
@ -520,7 +520,7 @@ public class CheckBulkComplianceActionTest {
Level.INFO, Level.INFO,
"Bulk pricing package with bulk token abc123 has exceed their max active domains limit" "Bulk pricing package with bulk token abc123 has exceed their max active domains limit"
+ " by 1 name(s)."); + " by 1 name(s).");
verify(emailService).sendEmail(emailCaptor.capture()); verify(gmailClient).sendEmail(emailCaptor.capture());
EmailMessage emailMessage = emailCaptor.getValue(); EmailMessage emailMessage = emailCaptor.getValue();
assertThat(emailMessage.subject()).isEqualTo(DOMAIN_LIMIT_WARNING_EMAIL_SUBJECT); assertThat(emailMessage.subject()).isEqualTo(DOMAIN_LIMIT_WARNING_EMAIL_SUBJECT);
assertThat(emailMessage.body()) assertThat(emailMessage.body())
@ -565,7 +565,7 @@ public class CheckBulkComplianceActionTest {
Level.INFO, Level.INFO,
"Bulk pricing package with bulk token abc123 has exceed their max active domains limit" "Bulk pricing package with bulk token abc123 has exceed their max active domains limit"
+ " by 1 name(s)."); + " by 1 name(s).");
verify(emailService).sendEmail(emailCaptor.capture()); verify(gmailClient).sendEmail(emailCaptor.capture());
EmailMessage emailMessage = emailCaptor.getValue(); EmailMessage emailMessage = emailCaptor.getValue();
assertThat(emailMessage.subject()).isEqualTo(DOMAIN_LIMIT_UPGRADE_EMAIL_SUBJECT); assertThat(emailMessage.subject()).isEqualTo(DOMAIN_LIMIT_UPGRADE_EMAIL_SUBJECT);
assertThat(emailMessage.body()) assertThat(emailMessage.body())

View file

@ -32,6 +32,7 @@ import com.google.common.collect.ImmutableSortedMap;
import google.registry.batch.SendExpiringCertificateNotificationEmailAction.CertificateType; import google.registry.batch.SendExpiringCertificateNotificationEmailAction.CertificateType;
import google.registry.batch.SendExpiringCertificateNotificationEmailAction.RegistrarInfo; import google.registry.batch.SendExpiringCertificateNotificationEmailAction.RegistrarInfo;
import google.registry.flows.certs.CertificateChecker; import google.registry.flows.certs.CertificateChecker;
import google.registry.groups.GmailClient;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
import google.registry.model.registrar.RegistrarAddress; import google.registry.model.registrar.RegistrarAddress;
import google.registry.model.registrar.RegistrarPoc; import google.registry.model.registrar.RegistrarPoc;
@ -41,7 +42,6 @@ import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationT
import google.registry.testing.FakeClock; import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse; import google.registry.testing.FakeResponse;
import google.registry.util.SelfSignedCaCertificate; import google.registry.util.SelfSignedCaCertificate;
import google.registry.util.SendEmailService;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -75,7 +75,7 @@ class SendExpiringCertificateNotificationEmailActionTest {
new JpaTestExtensions.Builder().buildIntegrationTestExtension(); new JpaTestExtensions.Builder().buildIntegrationTestExtension();
private final FakeClock clock = new FakeClock(DateTime.parse("2021-05-24T20:21:22Z")); private final FakeClock clock = new FakeClock(DateTime.parse("2021-05-24T20:21:22Z"));
private final SendEmailService sendEmailService = mock(SendEmailService.class); private final GmailClient sendEmailService = mock(GmailClient.class);
private CertificateChecker certificateChecker; private CertificateChecker certificateChecker;
private SendExpiringCertificateNotificationEmailAction action; private SendExpiringCertificateNotificationEmailAction action;
private Registrar sampleRegistrar; private Registrar sampleRegistrar;

View file

@ -50,6 +50,7 @@ import google.registry.dns.DnsMetrics.ActionStatus;
import google.registry.dns.DnsMetrics.CommitStatus; import google.registry.dns.DnsMetrics.CommitStatus;
import google.registry.dns.DnsMetrics.PublishStatus; import google.registry.dns.DnsMetrics.PublishStatus;
import google.registry.dns.writer.DnsWriter; import google.registry.dns.writer.DnsWriter;
import google.registry.groups.GmailClient;
import google.registry.model.domain.Domain; import google.registry.model.domain.Domain;
import google.registry.model.tld.Tld; import google.registry.model.tld.Tld;
import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions;
@ -63,7 +64,6 @@ import google.registry.testing.FakeLockHandler;
import google.registry.testing.FakeResponse; import google.registry.testing.FakeResponse;
import google.registry.testing.Lazies; import google.registry.testing.Lazies;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.SendEmailService;
import java.util.Set; import java.util.Set;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
import org.joda.time.DateTime; import org.joda.time.DateTime;
@ -90,7 +90,7 @@ public class PublishDnsUpdatesActionTest {
private InternetAddress outgoingRegistry; private InternetAddress outgoingRegistry;
private Lazy<InternetAddress> registrySupportEmail; private Lazy<InternetAddress> registrySupportEmail;
private Lazy<InternetAddress> registryCcEmail; private Lazy<InternetAddress> registryCcEmail;
private final SendEmailService emailService = mock(SendEmailService.class); private final GmailClient emailService = mock(GmailClient.class);
@BeforeEach @BeforeEach
void beforeEach() throws Exception { void beforeEach() throws Exception {

View file

@ -61,7 +61,7 @@ public class GmailClientTest {
private GmailClient getGmailClient(boolean isExternalEmailAllowed) throws Exception { private GmailClient getGmailClient(boolean isExternalEmailAllowed) throws Exception {
return new GmailClient( return new GmailClient(
gmail, () -> gmail,
new Retrier(new SystemSleeper(), 3), new Retrier(new SystemSleeper(), 3),
isExternalEmailAllowed, isExternalEmailAllowed,
"from@example.com", "from@example.com",

View file

@ -22,8 +22,8 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import google.registry.groups.GmailClient;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.SendEmailService;
import java.util.Optional; import java.util.Optional;
import javax.mail.MessagingException; import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
@ -33,7 +33,7 @@ import org.mockito.ArgumentCaptor;
/** Unit tests for {@link SendEmailUtils}. */ /** Unit tests for {@link SendEmailUtils}. */
class SendEmailUtilsTest { class SendEmailUtilsTest {
private final SendEmailService emailService = mock(SendEmailService.class); private final GmailClient gmailClient = mock(GmailClient.class);
private SendEmailUtils sendEmailUtils; private SendEmailUtils sendEmailUtils;
private void setRecipients(ImmutableList<String> recipients) throws Exception { private void setRecipients(ImmutableList<String> recipients) throws Exception {
@ -42,7 +42,7 @@ class SendEmailUtilsTest {
new InternetAddress("outgoing@registry.example"), new InternetAddress("outgoing@registry.example"),
"outgoing display name", "outgoing display name",
recipients, recipients,
emailService); gmailClient);
} }
@Test @Test
@ -90,7 +90,7 @@ class SendEmailUtilsTest {
"Welcome to the Internet", "Welcome to the Internet",
"It is a dark and scary place.")) "It is a dark and scary place."))
.isFalse(); .isFalse();
verify(emailService, never()).sendEmail(any()); verify(gmailClient, never()).sendEmail(any());
} }
@Test @Test
@ -102,7 +102,7 @@ class SendEmailUtilsTest {
"Welcome to the Internet", "Welcome to the Internet",
"It is a dark and scary place.")) "It is a dark and scary place."))
.isFalse(); .isFalse();
verify(emailService, never()).sendEmail(any()); verify(gmailClient, never()).sendEmail(any());
} }
@Test @Test
@ -110,7 +110,7 @@ class SendEmailUtilsTest {
setRecipients(ImmutableList.of("foo@example.com")); setRecipients(ImmutableList.of("foo@example.com"));
assertThat(sendEmailUtils.hasRecipients()).isTrue(); assertThat(sendEmailUtils.hasRecipients()).isTrue();
doThrow(new RuntimeException(new MessagingException("expected"))) doThrow(new RuntimeException(new MessagingException("expected")))
.when(emailService) .when(gmailClient)
.sendEmail(any()); .sendEmail(any());
assertThat( assertThat(
sendEmailUtils.sendEmail( sendEmailUtils.sendEmail(
@ -131,7 +131,7 @@ class SendEmailUtilsTest {
ImmutableList.of("baz@example.com")); ImmutableList.of("baz@example.com"));
ArgumentCaptor<EmailMessage> contentCaptor = ArgumentCaptor.forClass(EmailMessage.class); ArgumentCaptor<EmailMessage> contentCaptor = ArgumentCaptor.forClass(EmailMessage.class);
verify(emailService).sendEmail(contentCaptor.capture()); verify(gmailClient).sendEmail(contentCaptor.capture());
EmailMessage emailMessage = contentCaptor.getValue(); EmailMessage emailMessage = contentCaptor.getValue();
ImmutableList.Builder<InternetAddress> recipientBuilder = ImmutableList.builder(); ImmutableList.Builder<InternetAddress> recipientBuilder = ImmutableList.builder();
for (String expectedRecipient : ImmutableList.of("johnny@fakesite.tld", "baz@example.com")) { for (String expectedRecipient : ImmutableList.of("johnny@fakesite.tld", "baz@example.com")) {
@ -176,7 +176,7 @@ class SendEmailUtilsTest {
private void verifyMessageSent(String... expectedRecipients) throws Exception { private void verifyMessageSent(String... expectedRecipients) throws Exception {
ArgumentCaptor<EmailMessage> contentCaptor = ArgumentCaptor.forClass(EmailMessage.class); ArgumentCaptor<EmailMessage> contentCaptor = ArgumentCaptor.forClass(EmailMessage.class);
verify(emailService).sendEmail(contentCaptor.capture()); verify(gmailClient).sendEmail(contentCaptor.capture());
EmailMessage emailMessage = contentCaptor.getValue(); EmailMessage emailMessage = contentCaptor.getValue();
ImmutableList.Builder<InternetAddress> recipientBuilder = ImmutableList.builder(); ImmutableList.Builder<InternetAddress> recipientBuilder = ImmutableList.builder();
for (String expectedRecipient : expectedRecipients) { for (String expectedRecipient : expectedRecipients) {

View file

@ -31,6 +31,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.ImmutableSetMultimap;
import google.registry.config.RegistryEnvironment; import google.registry.config.RegistryEnvironment;
import google.registry.groups.GmailClient;
import google.registry.model.tld.Tld; import google.registry.model.tld.Tld;
import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions;
import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension; import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension;
@ -47,7 +48,6 @@ import google.registry.testing.SystemPropertyExtension;
import google.registry.testing.UserServiceExtension; import google.registry.testing.UserServiceExtension;
import google.registry.ui.server.SendEmailUtils; import google.registry.ui.server.SendEmailUtils;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.SendEmailService;
import java.util.Optional; import java.util.Optional;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -79,7 +79,7 @@ public final class ConsoleOteSetupActionTest {
private final User user = new User("marla.singer@example.com", "gmail.com", "12345"); private final User user = new User("marla.singer@example.com", "gmail.com", "12345");
@Mock HttpServletRequest request; @Mock HttpServletRequest request;
@Mock SendEmailService emailService; @Mock GmailClient gmailClient;
@BeforeEach @BeforeEach
void beforeEach() throws Exception { void beforeEach() throws Exception {
@ -99,7 +99,7 @@ public final class ConsoleOteSetupActionTest {
new InternetAddress("outgoing@registry.example"), new InternetAddress("outgoing@registry.example"),
"UnitTest Registry", "UnitTest Registry",
ImmutableList.of("notification@test.example", "notification2@test.example"), ImmutableList.of("notification@test.example", "notification2@test.example"),
emailService); gmailClient);
action.logoFilename = "logo.png"; action.logoFilename = "logo.png";
action.productName = "Nomulus"; action.productName = "Nomulus";
action.clientId = Optional.empty(); action.clientId = Optional.empty();
@ -158,7 +158,7 @@ public final class ConsoleOteSetupActionTest {
assertThat(response.getPayload()) assertThat(response.getPayload())
.contains("<h1>OT&E successfully created for registrar myclientid!</h1>"); .contains("<h1>OT&E successfully created for registrar myclientid!</h1>");
ArgumentCaptor<EmailMessage> contentCaptor = ArgumentCaptor.forClass(EmailMessage.class); ArgumentCaptor<EmailMessage> contentCaptor = ArgumentCaptor.forClass(EmailMessage.class);
verify(emailService).sendEmail(contentCaptor.capture()); verify(gmailClient).sendEmail(contentCaptor.capture());
EmailMessage emailMessage = contentCaptor.getValue(); EmailMessage emailMessage = contentCaptor.getValue();
assertThat(emailMessage.subject()) assertThat(emailMessage.subject())
.isEqualTo("OT&E for registrar myclientid created in unittest"); .isEqualTo("OT&E for registrar myclientid created in unittest");

View file

@ -29,6 +29,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.ImmutableSetMultimap;
import google.registry.config.RegistryEnvironment; import google.registry.config.RegistryEnvironment;
import google.registry.groups.GmailClient;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
import google.registry.model.registrar.RegistrarAddress; import google.registry.model.registrar.RegistrarAddress;
import google.registry.model.registrar.RegistrarPoc; import google.registry.model.registrar.RegistrarPoc;
@ -47,7 +48,6 @@ import google.registry.testing.SystemPropertyExtension;
import google.registry.testing.UserServiceExtension; import google.registry.testing.UserServiceExtension;
import google.registry.ui.server.SendEmailUtils; import google.registry.ui.server.SendEmailUtils;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.SendEmailService;
import java.util.Optional; import java.util.Optional;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -79,7 +79,7 @@ final class ConsoleRegistrarCreatorActionTest {
private final User user = new User("marla.singer@example.com", "gmail.com", "12345"); private final User user = new User("marla.singer@example.com", "gmail.com", "12345");
@Mock HttpServletRequest request; @Mock HttpServletRequest request;
@Mock SendEmailService emailService; @Mock GmailClient gmailClient;
@BeforeEach @BeforeEach
void beforeEach() throws Exception { void beforeEach() throws Exception {
@ -99,7 +99,7 @@ final class ConsoleRegistrarCreatorActionTest {
new InternetAddress("outgoing@registry.example"), new InternetAddress("outgoing@registry.example"),
"UnitTest Registry", "UnitTest Registry",
ImmutableList.of("notification@test.example", "notification2@test.example"), ImmutableList.of("notification@test.example", "notification2@test.example"),
emailService); gmailClient);
action.logoFilename = "logo.png"; action.logoFilename = "logo.png";
action.productName = "Nomulus"; action.productName = "Nomulus";
@ -183,7 +183,7 @@ final class ConsoleRegistrarCreatorActionTest {
.contains("<h1>Successfully created Registrar myclientid</h1>"); .contains("<h1>Successfully created Registrar myclientid</h1>");
ArgumentCaptor<EmailMessage> contentCaptor = ArgumentCaptor.forClass(EmailMessage.class); ArgumentCaptor<EmailMessage> contentCaptor = ArgumentCaptor.forClass(EmailMessage.class);
verify(emailService).sendEmail(contentCaptor.capture()); verify(gmailClient).sendEmail(contentCaptor.capture());
EmailMessage emailMessage = contentCaptor.getValue(); EmailMessage emailMessage = contentCaptor.getValue();
assertThat(emailMessage.subject()).isEqualTo("Registrar myclientid created in unittest"); assertThat(emailMessage.subject()).isEqualTo("Registrar myclientid created in unittest");
assertThat(emailMessage.body()) assertThat(emailMessage.body())

View file

@ -65,7 +65,7 @@ class RegistrarSettingsActionTest extends RegistrarSettingsActionTestCase {
verify(rsp, never()).setStatus(anyInt()); verify(rsp, never()).setStatus(anyInt());
verifyNotificationEmailsSent(); verifyNotificationEmailsSent();
ArgumentCaptor<EmailMessage> contentCaptor = ArgumentCaptor.forClass(EmailMessage.class); ArgumentCaptor<EmailMessage> contentCaptor = ArgumentCaptor.forClass(EmailMessage.class);
verify(emailService).sendEmail(contentCaptor.capture()); verify(gmailClient).sendEmail(contentCaptor.capture());
assertThat(contentCaptor.getValue().body()).isEqualTo(expectedEmailBody); assertThat(contentCaptor.getValue().body()).isEqualTo(expectedEmailBody);
cloudTasksHelper.assertTasksEnqueued( cloudTasksHelper.assertTasksEnqueued(
"sheet", "sheet",

View file

@ -36,6 +36,7 @@ import com.google.common.collect.ImmutableSetMultimap;
import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.ImmutableSortedMap;
import com.google.common.truth.Truth; import com.google.common.truth.Truth;
import google.registry.flows.certs.CertificateChecker; import google.registry.flows.certs.CertificateChecker;
import google.registry.groups.GmailClient;
import google.registry.model.registrar.RegistrarPoc; import google.registry.model.registrar.RegistrarPoc;
import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.persistence.transaction.JpaTestExtensions;
import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension; import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension;
@ -50,7 +51,6 @@ import google.registry.testing.CloudTasksHelper;
import google.registry.testing.FakeClock; import google.registry.testing.FakeClock;
import google.registry.ui.server.SendEmailUtils; import google.registry.ui.server.SendEmailUtils;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.SendEmailService;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
@ -82,7 +82,7 @@ public abstract class RegistrarSettingsActionTestCase {
@Mock HttpServletRequest req; @Mock HttpServletRequest req;
@Mock HttpServletResponse rsp; @Mock HttpServletResponse rsp;
@Mock SendEmailService emailService; @Mock GmailClient gmailClient;
final RegistrarSettingsAction action = new RegistrarSettingsAction(); final RegistrarSettingsAction action = new RegistrarSettingsAction();
private final StringWriter writer = new StringWriter(); private final StringWriter writer = new StringWriter();
@ -110,7 +110,7 @@ public abstract class RegistrarSettingsActionTestCase {
getGSuiteOutgoingEmailAddress(), getGSuiteOutgoingEmailAddress(),
getGSuiteOutgoingEmailDisplayName(), getGSuiteOutgoingEmailDisplayName(),
ImmutableList.of("notification@test.example", "notification2@test.example"), ImmutableList.of("notification@test.example", "notification2@test.example"),
emailService); gmailClient);
action.registrarConsoleMetrics = new RegistrarConsoleMetrics(); action.registrarConsoleMetrics = new RegistrarConsoleMetrics();
action.authResult = action.authResult =
AuthResult.create( AuthResult.create(
@ -172,7 +172,7 @@ public abstract class RegistrarSettingsActionTestCase {
/** Verifies that the original contact of TheRegistrar is among those notified of a change. */ /** Verifies that the original contact of TheRegistrar is among those notified of a change. */
void verifyNotificationEmailsSent() throws Exception { void verifyNotificationEmailsSent() throws Exception {
ArgumentCaptor<EmailMessage> captor = ArgumentCaptor.forClass(EmailMessage.class); ArgumentCaptor<EmailMessage> captor = ArgumentCaptor.forClass(EmailMessage.class);
verify(emailService).sendEmail(captor.capture()); verify(gmailClient).sendEmail(captor.capture());
Truth.assertThat(captor.getValue().recipients()) Truth.assertThat(captor.getValue().recipients())
.containsExactly( .containsExactly(
new InternetAddress("notification@test.example"), new InternetAddress("notification@test.example"),