diff --git a/src/NuGetGallery.Core/Services/CoreMessageService.cs b/src/NuGetGallery.Core/Services/CoreMessageService.cs index cf7b86bb65..cdefaf2edb 100644 --- a/src/NuGetGallery.Core/Services/CoreMessageService.cs +++ b/src/NuGetGallery.Core/Services/CoreMessageService.cs @@ -2,13 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.ObjectModel; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Net.Mail; using System.Text; -using System.Threading.Tasks; using AnglicanGeek.MarkdownMailer; using NuGet.Services.Validation; using NuGet.Services.Validation.Issues; @@ -17,11 +15,9 @@ namespace NuGetGallery.Services { public class CoreMessageService : ICoreMessageService { - private static readonly ReadOnlyCollection RetryDelays = Array.AsReadOnly(new[] { - TimeSpan.FromSeconds(0.1), - TimeSpan.FromSeconds(1), - TimeSpan.FromSeconds(10) - }); + protected CoreMessageService() + { + } public CoreMessageService(IMailSender mailSender, ICoreMessageServiceConfiguration coreConfiguration) { @@ -32,7 +28,7 @@ public CoreMessageService(IMailSender mailSender, ICoreMessageServiceConfigurati public IMailSender MailSender { get; protected set; } public ICoreMessageServiceConfiguration CoreConfiguration { get; protected set; } - public async Task SendPackageAddedNoticeAsync(Package package, string packageUrl, string packageSupportUrl, string emailSettingsUrl) + public void SendPackageAddedNotice(Package package, string packageUrl, string packageSupportUrl, string emailSettingsUrl) { string subject = $"[{CoreConfiguration.GalleryOwner.DisplayName}] Package published - {package.PackageRegistration.Id} {package.Version}"; string body = $@"The package [{package.PackageRegistration.Id} {package.Version}]({packageUrl}) was recently published on {CoreConfiguration.GalleryOwner.DisplayName} by {package.User.Username}. If this was not intended, please [contact support]({packageSupportUrl}). @@ -53,12 +49,12 @@ [change your email notification settings]({emailSettingsUrl}). if (mailMessage.To.Any()) { - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } } - public async Task SendPackageValidationFailedNoticeAsync(Package package, PackageValidationSet validationSet, string packageUrl, string packageSupportUrl, string announcementsUrl, string twitterUrl) + public void SendPackageValidationFailedNotice(Package package, PackageValidationSet validationSet, string packageUrl, string packageSupportUrl, string announcementsUrl, string twitterUrl) { var validationIssues = validationSet.GetValidationIssues(); @@ -99,7 +95,7 @@ public async Task SendPackageValidationFailedNoticeAsync(Package package, Packag if (mailMessage.To.Any()) { - await SendMessageAsync(mailMessage); + SendMessage(mailMessage, copySender: false); } } } @@ -135,7 +131,7 @@ private static string ParseValidationIssue(ValidationIssue validationIssue, stri } } - public async Task SendValidationTakingTooLongNoticeAsync(Package package, string packageUrl) + public void SendValidationTakingTooLongNotice(Package package, string packageUrl) { string subject = "[{0}] Package validation taking longer than expected - {1} {2}"; string body = "It is taking longer than expected for your package [{1} {2}]({3}) to get published.\n\n" + @@ -167,7 +163,7 @@ public async Task SendValidationTakingTooLongNoticeAsync(Package package, string if (mailMessage.To.Any()) { - await SendMessageAsync(mailMessage); + SendMessage(mailMessage, copySender: false); } } } @@ -197,54 +193,30 @@ protected static void AddOwnersSubscribedToPackagePushedNotification(PackageRegi } } - protected virtual async Task SendMessageAsync(MailMessage mailMessage) + protected void SendMessage(MailMessage mailMessage) { - int attempt = 0; - bool success = false; - while (!success) - { - try - { - await AttemptSendMessageAsync(mailMessage, attempt + 1); - success = true; - } - catch (SmtpException) - { - if (attempt < RetryDelays.Count) - { - await Task.Delay(RetryDelays[attempt]); - attempt++; - } - else - { - throw; - } - } - } + SendMessage(mailMessage, copySender: false); } - protected virtual Task AttemptSendMessageAsync(MailMessage mailMessage, int attemptNumber) + virtual protected void SendMessage(MailMessage mailMessage, bool copySender) { - // AnglicanGeek.MarkdownMailer doesn't have an async overload MailSender.Send(mailMessage); - return Task.CompletedTask; - } - - protected async Task SendMessageToSenderAsync(MailMessage mailMessage) - { - using (var senderCopy = new MailMessage( - CoreConfiguration.GalleryOwner, - mailMessage.ReplyToList.First())) + if (copySender) { - senderCopy.Subject = mailMessage.Subject + " [Sender Copy]"; - senderCopy.Body = string.Format( - CultureInfo.CurrentCulture, - "You sent the following message via {0}: {1}{1}{2}", - CoreConfiguration.GalleryOwner.DisplayName, - Environment.NewLine, - mailMessage.Body); + var senderCopy = new MailMessage( + CoreConfiguration.GalleryOwner, + mailMessage.ReplyToList.First()) + { + Subject = mailMessage.Subject + " [Sender Copy]", + Body = string.Format( + CultureInfo.CurrentCulture, + "You sent the following message via {0}: {1}{1}{2}", + CoreConfiguration.GalleryOwner.DisplayName, + Environment.NewLine, + mailMessage.Body), + }; senderCopy.ReplyToList.Add(mailMessage.ReplyToList.First()); - await SendMessageAsync(senderCopy); + MailSender.Send(senderCopy); } } } diff --git a/src/NuGetGallery.Core/Services/ICoreMessageService.cs b/src/NuGetGallery.Core/Services/ICoreMessageService.cs index 25dfa773b9..2f81dafcad 100644 --- a/src/NuGetGallery.Core/Services/ICoreMessageService.cs +++ b/src/NuGetGallery.Core/Services/ICoreMessageService.cs @@ -2,14 +2,13 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using NuGet.Services.Validation; -using System.Threading.Tasks; namespace NuGetGallery.Services { public interface ICoreMessageService { - Task SendPackageAddedNoticeAsync(Package package, string packageUrl, string packageSupportUrl, string emailSettingsUrl); - Task SendPackageValidationFailedNoticeAsync(Package package, PackageValidationSet validationSet, string packageUrl, string packageSupportUrl, string announcementsUrl, string twitterUrl); - Task SendValidationTakingTooLongNoticeAsync(Package package, string packageUrl); + void SendPackageAddedNotice(Package package, string packageUrl, string packageSupportUrl, string emailSettingsUrl); + void SendPackageValidationFailedNotice(Package package, PackageValidationSet validationSet, string packageUrl, string packageSupportUrl, string announcementsUrl, string twitterUrl); + void SendValidationTakingTooLongNotice(Package package, string packageUrl); } } \ No newline at end of file diff --git a/src/NuGetGallery/App_Start/DefaultDependenciesModule.cs b/src/NuGetGallery/App_Start/DefaultDependenciesModule.cs index 166a335837..1b9f768c34 100644 --- a/src/NuGetGallery/App_Start/DefaultDependenciesModule.cs +++ b/src/NuGetGallery/App_Start/DefaultDependenciesModule.cs @@ -35,7 +35,6 @@ using NuGetGallery.Infrastructure.Authentication; using NuGetGallery.Infrastructure.Lucene; using NuGetGallery.Security; -using NuGetGallery.Services; using SecretReaderFactory = NuGetGallery.Configuration.SecretReader.SecretReaderFactory; namespace NuGetGallery @@ -357,7 +356,7 @@ protected override void Load(ContainerBuilder builder) .As() .InstancePerLifetimeScope(); - builder.RegisterType() + builder.RegisterType() .AsSelf() .As() .InstancePerLifetimeScope(); diff --git a/src/NuGetGallery/Controllers/AccountsController.cs b/src/NuGetGallery/Controllers/AccountsController.cs index 27be140c32..6fed67835b 100644 --- a/src/NuGetGallery/Controllers/AccountsController.cs +++ b/src/NuGetGallery/Controllers/AccountsController.cs @@ -92,7 +92,7 @@ public virtual ActionResult ConfirmationRequired(string accountName = null) [HttpPost] [ActionName("ConfirmationRequired")] [ValidateAntiForgeryToken] - public virtual async Task ConfirmationRequiredPost(string accountName = null) + public virtual ActionResult ConfirmationRequiredPost(string accountName = null) { var account = GetAccount(accountName); @@ -108,7 +108,7 @@ public virtual async Task ConfirmationRequiredPost(string accountN ConfirmationViewModel model; if (!alreadyConfirmed) { - await SendNewAccountEmailAsync(account); + SendNewAccountEmail(account); model = new ConfirmationViewModel(account) { @@ -122,7 +122,7 @@ public virtual async Task ConfirmationRequiredPost(string accountN return View(model); } - protected abstract Task SendNewAccountEmailAsync(User account); + protected abstract void SendNewAccountEmail(User account); [UIAuthorize(allowDiscontinuedLogins: true)] public virtual async Task Confirm(string accountName, string token) @@ -163,7 +163,7 @@ public virtual async Task Confirm(string accountName, string token // Change notice not required for new accounts. if (model.SuccessfulConfirmation && !model.ConfirmingNewAccount) { - await MessageService.SendEmailChangeNoticeToPreviousEmailAddressAsync(account, existingEmail); + MessageService.SendEmailChangeNoticeToPreviousEmailAddress(account, existingEmail); string returnUrl = HttpContext.GetConfirmationReturnUrl(); if (!String.IsNullOrEmpty(returnUrl)) @@ -254,13 +254,13 @@ public virtual async Task ChangeEmail(TAccountViewModel model) if (account.Confirmed) { - await SendEmailChangedConfirmationNoticeAsync(account); + SendEmailChangedConfirmationNotice(account); } return RedirectToAction(AccountAction); } - protected abstract Task SendEmailChangedConfirmationNoticeAsync(User account); + protected abstract void SendEmailChangedConfirmationNotice(User account); [HttpPost] [UIAuthorize] diff --git a/src/NuGetGallery/Controllers/ApiController.cs b/src/NuGetGallery/Controllers/ApiController.cs index 7971c18f04..9515563495 100644 --- a/src/NuGetGallery/Controllers/ApiController.cs +++ b/src/NuGetGallery/Controllers/ApiController.cs @@ -699,7 +699,7 @@ await AuditingService.SaveAuditRecordAsync( if (!(ConfigurationService.Current.AsynchronousPackageValidationEnabled && ConfigurationService.Current.BlockingAsynchronousPackageValidationEnabled)) { // Notify user of push unless async validation in blocking mode is used - await MessageService.SendPackageAddedNoticeAsync(package, + MessageService.SendPackageAddedNotice(package, Url.Package(package.PackageRegistration.Id, package.NormalizedVersion, relativeUrl: false), Url.ReportPackage(package.PackageRegistration.Id, package.NormalizedVersion, relativeUrl: false), Url.AccountSettings(relativeUrl: false)); diff --git a/src/NuGetGallery/Controllers/AuthenticationController.cs b/src/NuGetGallery/Controllers/AuthenticationController.cs index 4cf2b03841..0218a76257 100644 --- a/src/NuGetGallery/Controllers/AuthenticationController.cs +++ b/src/NuGetGallery/Controllers/AuthenticationController.cs @@ -287,7 +287,7 @@ public virtual async Task Register(LogOnViewModel model, string re // Send a new account email if (NuGetContext.Config.Current.ConfirmEmailAddresses && !string.IsNullOrEmpty(user.User.UnconfirmedEmailAddress)) { - await _messageService.SendNewAccountEmailAsync( + _messageService.SendNewAccountEmail( user.User, Url.ConfirmEmail( user.User.Username, @@ -325,7 +325,7 @@ public virtual ActionResult LogOff(string returnUrl) [HttpPost] [ValidateAntiForgeryToken] - public virtual async Task SignInAssistance(string username, string providedEmailAddress) + public virtual JsonResult SignInAssistance(string username, string providedEmailAddress) { // If provided email address is empty or null, return the result with a formatted // email address, otherwise send sign-in assistance email to the associated mail address. @@ -352,7 +352,7 @@ public virtual async Task SignInAssistance(string username, string p else { var externalCredentials = user.Credentials.Where(cred => cred.IsExternal()); - await _messageService.SendSigninAssistanceEmailAsync(new MailAddress(email, user.Username), externalCredentials); + _messageService.SendSigninAssistanceEmail(new MailAddress(email, user.Username), externalCredentials); return Json(new { success = true }); } } @@ -674,7 +674,7 @@ private async Task AssociateCredential(AuthenticatedUser user) await RemovePasswordCredential(user.User); // Notify the user of the change - await _messageService.SendCredentialAddedNoticeAsync(user.User, _authService.DescribeCredential(result.Credential)); + _messageService.SendCredentialAddedNotice(user.User, _authService.DescribeCredential(result.Credential)); return new LoginUserDetails { diff --git a/src/NuGetGallery/Controllers/JsonApiController.cs b/src/NuGetGallery/Controllers/JsonApiController.cs index 248444737e..c9fb270c53 100644 --- a/src/NuGetGallery/Controllers/JsonApiController.cs +++ b/src/NuGetGallery/Controllers/JsonApiController.cs @@ -119,7 +119,7 @@ public async Task AddPackageOwner(string id, string username, string foreach (var owner in model.Package.Owners) { - await _messageService.SendPackageOwnerAddedNoticeAsync(owner, model.User, model.Package, packageUrl); + _messageService.SendPackageOwnerAddedNotice(owner, model.User, model.Package, packageUrl); } } else @@ -147,12 +147,12 @@ public async Task AddPackageOwner(string id, string username, string model.User.Username, relativeUrl: false); - await _messageService.SendPackageOwnerRequestAsync(model.CurrentUser, model.User, model.Package, packageUrl, + _messageService.SendPackageOwnerRequest(model.CurrentUser, model.User, model.Package, packageUrl, confirmationUrl, rejectionUrl, encodedMessage, policyMessage: string.Empty); foreach (var owner in model.Package.Owners) { - await _messageService.SendPackageOwnerRequestInitiatedNoticeAsync(model.CurrentUser, owner, model.User, model.Package, cancellationUrl); + _messageService.SendPackageOwnerRequestInitiatedNotice(model.CurrentUser, owner, model.User, model.Package, cancellationUrl); } } @@ -190,12 +190,12 @@ public async Task RemovePackageOwner(string id, string username) throw new InvalidOperationException("You can't remove the only owner from a package."); } await _packageOwnershipManagementService.RemovePackageOwnerAsync(model.Package, model.CurrentUser, model.User, commitAsTransaction:true); - await _messageService.SendPackageOwnerRemovedNoticeAsync(model.CurrentUser, model.User, model.Package); + _messageService.SendPackageOwnerRemovedNotice(model.CurrentUser, model.User, model.Package); } else { await _packageOwnershipManagementService.DeletePackageOwnershipRequestAsync(model.Package, model.User); - await _messageService.SendPackageOwnerRequestCancellationNoticeAsync(model.CurrentUser, model.User, model.Package); + _messageService.SendPackageOwnerRequestCancellationNotice(model.CurrentUser, model.User, model.Package); } return Json(new { success = true }); diff --git a/src/NuGetGallery/Controllers/OrganizationsController.cs b/src/NuGetGallery/Controllers/OrganizationsController.cs index c5ef85db72..d007a4ea2b 100644 --- a/src/NuGetGallery/Controllers/OrganizationsController.cs +++ b/src/NuGetGallery/Controllers/OrganizationsController.cs @@ -53,17 +53,17 @@ public OrganizationsController( EmailUpdateCancelled = Strings.OrganizationEmailUpdateCancelled }; - protected override Task SendNewAccountEmailAsync(User account) + protected override void SendNewAccountEmail(User account) { var confirmationUrl = Url.ConfirmOrganizationEmail(account.Username, account.EmailConfirmationToken, relativeUrl: false); - return MessageService.SendNewAccountEmailAsync(account, confirmationUrl); + MessageService.SendNewAccountEmail(account, confirmationUrl); } - protected override Task SendEmailChangedConfirmationNoticeAsync(User account) + protected override void SendEmailChangedConfirmationNotice(User account) { var confirmationUrl = Url.ConfirmOrganizationEmail(account.Username, account.EmailConfirmationToken, relativeUrl: false); - return MessageService.SendEmailChangeConfirmationNoticeAsync(account, confirmationUrl); + MessageService.SendEmailChangeConfirmationNotice(account, confirmationUrl); } [HttpGet] @@ -85,7 +85,7 @@ public async Task Add(AddOrganizationViewModel model) try { var organization = await UserService.AddOrganizationAsync(organizationName, organizationEmailAddress, adminUser); - await SendNewAccountEmailAsync(organization); + SendNewAccountEmail(organization); TelemetryService.TrackOrganizationAdded(organization); return RedirectToAction(nameof(ManageOrganization), new { accountName = organization.Username }); } @@ -134,8 +134,8 @@ public async Task AddMember(string accountName, string memberName, b var rejectUrl = Url.RejectOrganizationMembershipRequest(request, relativeUrl: false); var cancelUrl = Url.CancelOrganizationMembershipRequest(memberName, relativeUrl: false); - await MessageService.SendOrganizationMembershipRequestAsync(account, request.NewMember, currentUser, request.IsAdmin, profileUrl, confirmUrl, rejectUrl); - await MessageService.SendOrganizationMembershipRequestInitiatedNoticeAsync(account, currentUser, request.NewMember, request.IsAdmin, cancelUrl); + MessageService.SendOrganizationMembershipRequest(account, request.NewMember, currentUser, request.IsAdmin, profileUrl, confirmUrl, rejectUrl); + MessageService.SendOrganizationMembershipRequestInitiatedNotice(account, currentUser, request.NewMember, request.IsAdmin, cancelUrl); return Json(new OrganizationMemberViewModel(request)); } @@ -159,7 +159,7 @@ public async Task ConfirmMemberRequest(string accountName, string try { var member = await UserService.AddMemberAsync(account, GetCurrentUser().Username, confirmationToken); - await MessageService.SendOrganizationMemberUpdatedNoticeAsync(account, member); + MessageService.SendOrganizationMemberUpdatedNotice(account, member); TempData["Message"] = String.Format(CultureInfo.CurrentCulture, Strings.AddMember_Success, account.Username); @@ -188,7 +188,7 @@ public async Task RejectMemberRequest(string accountName, string c { var member = GetCurrentUser(); await UserService.RejectMembershipRequestAsync(account, member.Username, confirmationToken); - await MessageService.SendOrganizationMembershipRequestRejectedNoticeAsync(account, member); + MessageService.SendOrganizationMembershipRequestRejectedNotice(account, member); return HandleOrganizationMembershipRequestView(new HandleOrganizationMembershipRequestModel(false, account)); } @@ -221,7 +221,7 @@ public async Task CancelMemberRequest(string accountName, string mem try { var removedUser = await UserService.CancelMembershipRequestAsync(account, memberName); - await MessageService.SendOrganizationMembershipRequestCancelledNoticeAsync(account, removedUser); + MessageService.SendOrganizationMembershipRequestCancelledNotice(account, removedUser); return Json(Strings.CancelMemberRequest_Success); } catch (EntityException e) @@ -252,7 +252,7 @@ public async Task UpdateMember(string accountName, string memberName try { var membership = await UserService.UpdateMemberAsync(account, memberName, isAdmin); - await MessageService.SendOrganizationMemberUpdatedNoticeAsync(account, membership); + MessageService.SendOrganizationMemberUpdatedNotice(account, membership); return Json(new OrganizationMemberViewModel(membership)); } @@ -287,7 +287,7 @@ public async Task DeleteMember(string accountName, string memberName try { var removedMember = await UserService.DeleteMemberAsync(account, memberName); - await MessageService.SendOrganizationMemberRemovedNoticeAsync(account, removedMember); + MessageService.SendOrganizationMemberRemovedNotice(account, removedMember); return Json(Strings.DeleteMember_Success); } catch (EntityException e) diff --git a/src/NuGetGallery/Controllers/PackagesController.cs b/src/NuGetGallery/Controllers/PackagesController.cs index 6b7bc386d7..694c01804e 100644 --- a/src/NuGetGallery/Controllers/PackagesController.cs +++ b/src/NuGetGallery/Controllers/PackagesController.cs @@ -740,7 +740,7 @@ public virtual async Task ReportAbuse(string id, string version, R await _supportRequestService.AddNewSupportRequestAsync(subject, reportForm.Message, requestorEmailAddress, reason, user, package); - await _messageService.ReportAbuseAsync(request); + _messageService.ReportAbuse(request); TempData["Message"] = "Your abuse report has been sent to the gallery operators."; @@ -800,7 +800,7 @@ public virtual async Task ReportMyPackage(string id, string versio if (!deleted) { - await NotifyReportMyPackageSupportRequestAsync(reportForm, package, user, from); + NotifyReportMyPackageSupportRequest(reportForm, package, user, from); } return Redirect(Url.Package(package.PackageRegistration.Id, package.NormalizedVersion)); @@ -868,7 +868,7 @@ private async Task ValidateReportMyPackageViewModel(ReportMyPackag return null; } - private async Task NotifyReportMyPackageSupportRequestAsync(ReportMyPackageViewModel reportForm, Package package, User user, MailAddress from) + private void NotifyReportMyPackageSupportRequest(ReportMyPackageViewModel reportForm, Package package, User user, MailAddress from) { var request = new ReportPackageRequest { @@ -881,7 +881,7 @@ private async Task NotifyReportMyPackageSupportRequestAsync(ReportMyPackageViewM CopySender = reportForm.CopySender }; - await _messageService.ReportMyPackageAsync(request); + _messageService.ReportMyPackage(request); TempData["Message"] = Strings.SupportRequestSentTransientMessage; } @@ -919,7 +919,7 @@ await _supportRequestService.UpdateIssueAsync( comment: null, editedBy: user.Username); - await _messageService.SendPackageDeletedNoticeAsync( + _messageService.SendPackageDeletedNotice( package, Url.Package(package.PackageRegistration.Id, package.NormalizedVersion, relativeUrl: false), Url.ReportPackage(package.PackageRegistration.Id, package.NormalizedVersion, relativeUrl: false)); @@ -960,7 +960,7 @@ public virtual ActionResult ContactOwners(string id, string version) [ValidateAntiForgeryToken] [ValidateRecaptchaResponse] [RequiresAccountConfirmation("contact package owners")] - public virtual async Task ContactOwners(string id, string version, ContactOwnersViewModel contactForm) + public virtual ActionResult ContactOwners(string id, string version, ContactOwnersViewModel contactForm) { // Html Encode the message contactForm.Message = System.Web.HttpUtility.HtmlEncode(contactForm.Message); @@ -978,7 +978,7 @@ public virtual async Task ContactOwners(string id, string version, var user = GetCurrentUser(); var fromAddress = new MailAddress(user.EmailAddress, user.Username); - await _messageService.SendContactOwnersMessageAsync( + _messageService.SendContactOwnersMessage( fromAddress, package, Url.Package(package, false), @@ -1344,7 +1344,7 @@ private async Task HandleOwnershipRequest(string id, string userna { await _packageOwnershipManagementService.AddPackageOwnerAsync(package, user); - await SendAddPackageOwnerNotificationAsync(package, user); + SendAddPackageOwnerNotification(package, user); return View("ConfirmOwner", new PackageOwnerConfirmationModel(id, user.Username, ConfirmOwnershipResult.Success)); } @@ -1354,7 +1354,7 @@ private async Task HandleOwnershipRequest(string id, string userna await _packageOwnershipManagementService.DeletePackageOwnershipRequestAsync(package, user); - await _messageService.SendPackageOwnerRequestRejectionNoticeAsync(requestingUser, user, package); + _messageService.SendPackageOwnerRequestRejectionNotice(requestingUser, user, package); return View("ConfirmOwner", new PackageOwnerConfirmationModel(id, user.Username, ConfirmOwnershipResult.Rejected)); } @@ -1396,7 +1396,7 @@ public virtual async Task CancelPendingOwnershipRequest(string id, await _packageOwnershipManagementService.DeletePackageOwnershipRequestAsync(package, pendingUser); - await _messageService.SendPackageOwnerRequestCancellationNoticeAsync(requestingUser, pendingUser, package); + _messageService.SendPackageOwnerRequestCancellationNotice(requestingUser, pendingUser, package); return View("ConfirmOwner", new PackageOwnerConfirmationModel(id, pendingUsername, ConfirmOwnershipResult.Cancelled)); } @@ -1406,15 +1406,14 @@ public virtual async Task CancelPendingOwnershipRequest(string id, /// /// Package to which owner was added. /// Owner added. - private Task SendAddPackageOwnerNotificationAsync(PackageRegistration package, User newOwner) + private void SendAddPackageOwnerNotification(PackageRegistration package, User newOwner) { var packageUrl = Url.Package(package.Id, version: null, relativeUrl: false); Func notNewOwner = o => !o.Username.Equals(newOwner.Username, StringComparison.OrdinalIgnoreCase); // Notify existing owners var notNewOwners = package.Owners.Where(notNewOwner).ToList(); - var tasks = notNewOwners.Select(owner => _messageService.SendPackageOwnerAddedNoticeAsync(owner, newOwner, package, packageUrl)); - return Task.WhenAll(tasks); + notNewOwners.ForEach(owner => _messageService.SendPackageOwnerAddedNotice(owner, newOwner, package, packageUrl)); } internal virtual async Task Edit(string id, string version, bool? listed, Func urlFactory) @@ -1694,7 +1693,7 @@ await _auditingService.SaveAuditRecordAsync( if (!(_config.AsynchronousPackageValidationEnabled && _config.BlockingAsynchronousPackageValidationEnabled)) { // notify user unless async validation in blocking mode is used - await _messageService.SendPackageAddedNoticeAsync(package, + _messageService.SendPackageAddedNotice(package, Url.Package(package.PackageRegistration.Id, package.NormalizedVersion, relativeUrl: false), Url.ReportPackage(package.PackageRegistration.Id, package.NormalizedVersion, relativeUrl: false), Url.AccountSettings(relativeUrl: false)); diff --git a/src/NuGetGallery/Controllers/PagesController.cs b/src/NuGetGallery/Controllers/PagesController.cs index 76072a8bc4..d10103cd4c 100644 --- a/src/NuGetGallery/Controllers/PagesController.cs +++ b/src/NuGetGallery/Controllers/PagesController.cs @@ -94,7 +94,7 @@ public virtual async Task Contact(ContactSupportViewModel contactF var subject = $"Support Request for user '{user.Username}'"; await _supportRequestService.AddNewSupportRequestAsync(subject, contactForm.Message, user.EmailAddress, "Other", user); - await _messageService.SendContactSupportEmailAsync(request); + _messageService.SendContactSupportEmail(request); ModelState.Clear(); diff --git a/src/NuGetGallery/Controllers/UsersController.cs b/src/NuGetGallery/Controllers/UsersController.cs index ab357566d8..1006534acf 100644 --- a/src/NuGetGallery/Controllers/UsersController.cs +++ b/src/NuGetGallery/Controllers/UsersController.cs @@ -70,17 +70,17 @@ public UsersController( EmailUpdateCancelled = Strings.UserEmailUpdateCancelled }; - protected override Task SendNewAccountEmailAsync(User account) + protected override void SendNewAccountEmail(User account) { var confirmationUrl = Url.ConfirmEmail(account.Username, account.EmailConfirmationToken, relativeUrl: false); - return MessageService.SendNewAccountEmailAsync(account, confirmationUrl); + MessageService.SendNewAccountEmail(account, confirmationUrl); } - protected override Task SendEmailChangedConfirmationNoticeAsync(User account) + protected override void SendEmailChangedConfirmationNotice(User account) { var confirmationUrl = Url.ConfirmEmail(account.Username, account.EmailConfirmationToken, relativeUrl: false); - return MessageService.SendEmailChangeConfirmationNoticeAsync(account, confirmationUrl); + MessageService.SendEmailChangeConfirmationNotice(account, confirmationUrl); } protected override User GetAccount(string accountName) @@ -158,16 +158,16 @@ public virtual async Task TransformToOrganization(TransformAccount if (existingTransformRequestUser != null) { - await MessageService.SendOrganizationTransformRequestCancelledNoticeAsync(accountToTransform, existingTransformRequestUser); + MessageService.SendOrganizationTransformRequestCancelledNotice(accountToTransform, existingTransformRequestUser); } var returnUrl = Url.ConfirmTransformAccount(accountToTransform); var confirmUrl = Url.ConfirmTransformAccount(accountToTransform, relativeUrl: false); var rejectUrl = Url.RejectTransformAccount(accountToTransform, relativeUrl: false); - await MessageService.SendOrganizationTransformRequestAsync(accountToTransform, adminUser, Url.User(accountToTransform, relativeUrl: false), confirmUrl, rejectUrl); + MessageService.SendOrganizationTransformRequest(accountToTransform, adminUser, Url.User(accountToTransform, relativeUrl: false), confirmUrl, rejectUrl); var cancelUrl = Url.CancelTransformAccount(accountToTransform, relativeUrl: false); - await MessageService.SendOrganizationTransformInitiatedNoticeAsync(accountToTransform, adminUser, cancelUrl); + MessageService.SendOrganizationTransformInitiatedNotice(accountToTransform, adminUser, cancelUrl); TelemetryService.TrackOrganizationTransformInitiated(accountToTransform); @@ -206,7 +206,7 @@ public virtual async Task ConfirmTransformToOrganization(string ac return TransformToOrganizationFailed(errorReason); } - await MessageService.SendOrganizationTransformRequestAcceptedNoticeAsync(accountToTransform, adminUser); + MessageService.SendOrganizationTransformRequestAcceptedNotice(accountToTransform, adminUser); TelemetryService.TrackOrganizationTransformCompleted(accountToTransform); @@ -234,7 +234,7 @@ public virtual async Task RejectTransformToOrganization(string acc { if (await UserService.RejectTransformUserToOrganizationRequest(accountToTransform, adminUser, token)) { - await MessageService.SendOrganizationTransformRequestRejectedNoticeAsync(accountToTransform, adminUser); + MessageService.SendOrganizationTransformRequestRejectedNotice(accountToTransform, adminUser); TelemetryService.TrackOrganizationTransformDeclined(accountToTransform); @@ -262,7 +262,7 @@ public virtual async Task CancelTransformToOrganization(string tok if (await UserService.CancelTransformUserToOrganizationRequest(accountToTransform, token)) { - await MessageService.SendOrganizationTransformRequestCancelledNoticeAsync(accountToTransform, adminUser); + MessageService.SendOrganizationTransformRequestCancelledNotice(accountToTransform, adminUser); TelemetryService.TrackOrganizationTransformCancelled(accountToTransform); @@ -314,7 +314,7 @@ public override async Task RequestAccountDeletion(string accountNa var isSupportRequestCreated = await _supportRequestService.TryAddDeleteSupportRequestAsync(user); if (isSupportRequestCreated) { - await MessageService.SendAccountDeleteNoticeAsync(user); + MessageService.SendAccountDeleteNotice(user); } else { @@ -527,7 +527,7 @@ public virtual async Task ForgotPassword(ForgotPasswordViewModel m ModelState.AddModelError(string.Empty, Strings.CouldNotFindAnyoneWithThatUsernameOrEmail); break; case PasswordResetResultType.Success: - return await SendPasswordResetEmailAsync(result.User, forgotPassword: true); + return SendPasswordResetEmail(result.User, forgotPassword: true); default: throw new NotImplementedException($"The password reset result type '{result.Type}' is not supported."); } @@ -597,7 +597,7 @@ public virtual async Task ResetPassword(string username, string to if (credential != null && !forgot) { // Setting a password, so notify the user - await MessageService.SendCredentialAddedNoticeAsync(credential.User, AuthenticationService.DescribeCredential(credential)); + MessageService.SendCredentialAddedNotice(credential.User, AuthenticationService.DescribeCredential(credential)); } return RedirectToAction("PasswordChanged"); @@ -646,7 +646,7 @@ public virtual async Task ChangePassword(UserAccountViewModel mode return AccountView(user, model); } - return await SendPasswordResetEmailAsync(user, forgotPassword: false); + return SendPasswordResetEmail(user, forgotPassword: false); } else { @@ -831,7 +831,7 @@ public virtual async Task GenerateApiKey(string description, string var newCredentialViewModel = await GenerateApiKeyInternal(description, resolvedScopes, expiration); - await MessageService.SendCredentialAddedNoticeAsync(GetCurrentUser(), newCredentialViewModel); + MessageService.SendCredentialAddedNotice(GetCurrentUser(), newCredentialViewModel); return Json(new ApiKeyViewModel(newCredentialViewModel)); } @@ -987,7 +987,7 @@ private async Task RemoveApiKeyCredential(User user, Credential cred await AuthenticationService.RemoveCredential(user, cred); // Notify the user of the change - await MessageService.SendCredentialRemovedNoticeAsync(user, AuthenticationService.DescribeCredential(cred)); + MessageService.SendCredentialRemovedNotice(user, AuthenticationService.DescribeCredential(cred)); return Json(Strings.CredentialRemoved); } @@ -1017,7 +1017,7 @@ private async Task RemoveCredentialInternal(User user, Credential } // Notify the user of the change - await MessageService.SendCredentialRemovedNoticeAsync(user, AuthenticationService.DescribeCredential(cred)); + MessageService.SendCredentialRemovedNotice(user, AuthenticationService.DescribeCredential(cred)); TempData["Message"] = message; } @@ -1058,14 +1058,14 @@ private static int CountLoginCredentials(User user) c.Type.StartsWith(CredentialTypes.External.Prefix, StringComparison.OrdinalIgnoreCase)); } - private async Task SendPasswordResetEmailAsync(User user, bool forgotPassword) + private ActionResult SendPasswordResetEmail(User user, bool forgotPassword) { var resetPasswordUrl = Url.ResetEmailOrPassword( user.Username, user.PasswordResetToken, forgotPassword, relativeUrl: false); - await MessageService.SendPasswordResetInstructionsAsync(user, resetPasswordUrl, forgotPassword); + MessageService.SendPasswordResetInstructions(user, resetPasswordUrl, forgotPassword); return RedirectToAction(actionName: "PasswordSent", controllerName: "Users"); } diff --git a/src/NuGetGallery/NuGetGallery.csproj b/src/NuGetGallery/NuGetGallery.csproj index d03e6c5259..03359de560 100644 --- a/src/NuGetGallery/NuGetGallery.csproj +++ b/src/NuGetGallery/NuGetGallery.csproj @@ -386,7 +386,6 @@ - diff --git a/src/NuGetGallery/Services/BackgroundMessageService.cs b/src/NuGetGallery/Services/BackgroundMessageService.cs deleted file mode 100644 index e6b2ed9e02..0000000000 --- a/src/NuGetGallery/Services/BackgroundMessageService.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Net.Mail; -using System.Threading.Tasks; -using AnglicanGeek.MarkdownMailer; -using Elmah; -using NuGetGallery.Configuration; - -namespace NuGetGallery.Services -{ - public class BackgroundMessageService : MessageService - { - public BackgroundMessageService(IMailSender mailSender, IAppConfiguration config, ITelemetryService telemetryService, ErrorLog errorLog) - :base(mailSender, config, telemetryService) - { - this.errorLog = errorLog; - } - - private ErrorLog errorLog; - - protected override Task SendMessageAsync(MailMessage mailMessage) - { - // Send email as background task, as we don't want to delay the HTTP response. - // Particularly when sending email fails and needs to be retried with a delay. - // MailMessage is IDisposable, so first clone the message, to ensure if the - // caller disposes it, the message is available until the async task is complete. - - var messageCopy = CloneMessage(mailMessage); - - Task.Run(async () => - { - try - { - await base.SendMessageAsync(messageCopy); - } - catch (Exception ex) - { - // Log but swallow the exception. - QuietLog.LogHandledException(ex, errorLog); - } - finally - { - messageCopy.Dispose(); - } - }); - - return Task.CompletedTask; - } - - private MailMessage CloneMessage(MailMessage mailMessage) - { - string from = mailMessage.From.ToString(); - string to = mailMessage.To.ToString(); - - MailMessage copy = new MailMessage(from, to, mailMessage.Subject, mailMessage.Body); - - copy.IsBodyHtml = mailMessage.IsBodyHtml; - copy.BodyTransferEncoding = mailMessage.BodyTransferEncoding; - copy.BodyEncoding = mailMessage.BodyEncoding; - copy.HeadersEncoding = mailMessage.HeadersEncoding; - foreach (System.Collections.Specialized.NameValueCollection header in mailMessage.Headers) - { - copy.Headers.Add(header); - } - copy.SubjectEncoding = mailMessage.SubjectEncoding; - copy.DeliveryNotificationOptions = mailMessage.DeliveryNotificationOptions; - foreach (var cc in mailMessage.CC) - { - copy.CC.Add(cc); - } - foreach(var attachment in mailMessage.Attachments) - { - copy.Attachments.Add(attachment); - } - foreach (var bcc in mailMessage.Bcc) - { - copy.Bcc.Add(bcc); - } - foreach (var replyTo in mailMessage.ReplyToList) - { - copy.ReplyToList.Add(replyTo); - } - copy.Sender = mailMessage.Sender; - copy.Priority = mailMessage.Priority; - foreach (var view in mailMessage.AlternateViews) - { - copy.AlternateViews.Add(view); - } - - return copy; - } - } -} \ No newline at end of file diff --git a/src/NuGetGallery/Services/IMessageService.cs b/src/NuGetGallery/Services/IMessageService.cs index acb684d4d5..b971bb9c4f 100644 --- a/src/NuGetGallery/Services/IMessageService.cs +++ b/src/NuGetGallery/Services/IMessageService.cs @@ -3,43 +3,42 @@ using System.Collections.Generic; using System.Net.Mail; -using System.Threading.Tasks; using NuGetGallery.Services; namespace NuGetGallery { public interface IMessageService { - Task SendContactOwnersMessageAsync(MailAddress fromAddress, Package package, string packageUrl, string message, string emailSettingsUrl, bool copyFromAddress); - Task ReportAbuseAsync(ReportPackageRequest report); - Task ReportMyPackageAsync(ReportPackageRequest report); - Task SendNewAccountEmailAsync(User newUser, string confirmationUrl); - Task SendEmailChangeConfirmationNoticeAsync(User user, string confirmationUrl); - Task SendPasswordResetInstructionsAsync(User user, string resetPasswordUrl, bool forgotPassword); - Task SendEmailChangeNoticeToPreviousEmailAddressAsync(User user, string oldEmailAddress); - Task SendPackageOwnerRequestAsync(User fromUser, User toUser, PackageRegistration package, string packageUrl, string confirmationUrl, string rejectionUrl, string message, string policyMessage); - Task SendPackageOwnerRequestInitiatedNoticeAsync(User requestingOwner, User receivingOwner, User newOwner, PackageRegistration package, string cancellationUrl); - Task SendPackageOwnerRequestRejectionNoticeAsync(User requestingOwner, User newOwner, PackageRegistration package); - Task SendPackageOwnerRequestCancellationNoticeAsync(User requestingOwner, User newOwner, PackageRegistration package); - Task SendPackageOwnerAddedNoticeAsync(User toUser, User newOwner, PackageRegistration package, string packageUrl); - Task SendPackageOwnerRemovedNoticeAsync(User fromUser, User toUser, PackageRegistration package); - Task SendCredentialRemovedNoticeAsync(User user, CredentialViewModel removedCredentialViewModel); - Task SendCredentialAddedNoticeAsync(User user, CredentialViewModel addedCredentialViewModel); - Task SendContactSupportEmailAsync(ContactSupportRequest request); - Task SendPackageAddedNoticeAsync(Package package, string packageUrl, string packageSupportUrl, string emailSettingsUrl); - Task SendAccountDeleteNoticeAsync(User user); - Task SendPackageDeletedNoticeAsync(Package package, string packageUrl, string packageSupportUrl); - Task SendSigninAssistanceEmailAsync(MailAddress emailAddress, IEnumerable credentials); - Task SendOrganizationTransformRequestAsync(User accountToTransform, User adminUser, string profileUrl, string confirmationUrl, string rejectionUrl); - Task SendOrganizationTransformInitiatedNoticeAsync(User accountToTransform, User adminUser, string cancellationUrl); - Task SendOrganizationTransformRequestAcceptedNoticeAsync(User accountToTransform, User adminUser); - Task SendOrganizationTransformRequestRejectedNoticeAsync(User accountToTransform, User adminUser); - Task SendOrganizationTransformRequestCancelledNoticeAsync(User accountToTransform, User adminUser); - Task SendOrganizationMembershipRequestAsync(Organization organization, User newUser, User adminUser, bool isAdmin, string profileUrl, string confirmationUrl, string rejectionUrl); - Task SendOrganizationMembershipRequestInitiatedNoticeAsync(Organization organization, User requestingUser, User pendingUser, bool isAdmin, string cancellationUrl); - Task SendOrganizationMembershipRequestRejectedNoticeAsync(Organization organization, User pendingUser); - Task SendOrganizationMembershipRequestCancelledNoticeAsync(Organization organization, User pendingUser); - Task SendOrganizationMemberUpdatedNoticeAsync(Organization organization, Membership membership); - Task SendOrganizationMemberRemovedNoticeAsync(Organization organization, User removedUser); + void SendContactOwnersMessage(MailAddress fromAddress, Package package, string packageUrl, string message, string emailSettingsUrl, bool copyFromAddress); + void ReportAbuse(ReportPackageRequest report); + void ReportMyPackage(ReportPackageRequest report); + void SendNewAccountEmail(User newUser, string confirmationUrl); + void SendEmailChangeConfirmationNotice(User user, string confirmationUrl); + void SendPasswordResetInstructions(User user, string resetPasswordUrl, bool forgotPassword); + void SendEmailChangeNoticeToPreviousEmailAddress(User user, string oldEmailAddress); + void SendPackageOwnerRequest(User fromUser, User toUser, PackageRegistration package, string packageUrl, string confirmationUrl, string rejectionUrl, string message, string policyMessage); + void SendPackageOwnerRequestInitiatedNotice(User requestingOwner, User receivingOwner, User newOwner, PackageRegistration package, string cancellationUrl); + void SendPackageOwnerRequestRejectionNotice(User requestingOwner, User newOwner, PackageRegistration package); + void SendPackageOwnerRequestCancellationNotice(User requestingOwner, User newOwner, PackageRegistration package); + void SendPackageOwnerAddedNotice(User toUser, User newOwner, PackageRegistration package, string packageUrl); + void SendPackageOwnerRemovedNotice(User fromUser, User toUser, PackageRegistration package); + void SendCredentialRemovedNotice(User user, CredentialViewModel removedCredentialViewModel); + void SendCredentialAddedNotice(User user, CredentialViewModel addedCredentialViewModel); + void SendContactSupportEmail(ContactSupportRequest request); + void SendPackageAddedNotice(Package package, string packageUrl, string packageSupportUrl, string emailSettingsUrl); + void SendAccountDeleteNotice(User user); + void SendPackageDeletedNotice(Package package, string packageUrl, string packageSupportUrl); + void SendSigninAssistanceEmail(MailAddress emailAddress, IEnumerable credentials); + void SendOrganizationTransformRequest(User accountToTransform, User adminUser, string profileUrl, string confirmationUrl, string rejectionUrl); + void SendOrganizationTransformInitiatedNotice(User accountToTransform, User adminUser, string cancellationUrl); + void SendOrganizationTransformRequestAcceptedNotice(User accountToTransform, User adminUser); + void SendOrganizationTransformRequestRejectedNotice(User accountToTransform, User adminUser); + void SendOrganizationTransformRequestCancelledNotice(User accountToTransform, User adminUser); + void SendOrganizationMembershipRequest(Organization organization, User newUser, User adminUser, bool isAdmin, string profileUrl, string confirmationUrl, string rejectionUrl); + void SendOrganizationMembershipRequestInitiatedNotice(Organization organization, User requestingUser, User pendingUser, bool isAdmin, string cancellationUrl); + void SendOrganizationMembershipRequestRejectedNotice(Organization organization, User pendingUser); + void SendOrganizationMembershipRequestCancelledNotice(Organization organization, User pendingUser); + void SendOrganizationMemberUpdatedNotice(Organization organization, Membership membership); + void SendOrganizationMemberRemovedNotice(Organization organization, User removedUser); } } \ No newline at end of file diff --git a/src/NuGetGallery/Services/ITelemetryClient.cs b/src/NuGetGallery/Services/ITelemetryClient.cs index bdaf36a540..99c7ff37f7 100644 --- a/src/NuGetGallery/Services/ITelemetryClient.cs +++ b/src/NuGetGallery/Services/ITelemetryClient.cs @@ -14,15 +14,5 @@ public interface ITelemetryClient void TrackMetric(string metricName, double value, IDictionary properties = null); void TrackException(Exception exception, IDictionary properties = null, IDictionary metrics = null); - - void TrackDependency(string dependencyTypeName, - string target, - string dependencyName, - string data, - DateTimeOffset startTime, - TimeSpan duration, - string resultCode, - bool success, - IDictionary properties); } } diff --git a/src/NuGetGallery/Services/ITelemetryService.cs b/src/NuGetGallery/Services/ITelemetryService.cs index 7a5bdef870..5516657395 100644 --- a/src/NuGetGallery/Services/ITelemetryService.cs +++ b/src/NuGetGallery/Services/ITelemetryService.cs @@ -136,15 +136,5 @@ public interface ITelemetryService /// /// The requesting the delete. void TrackRequestForAccountDeletion(User user); - - /// - /// A telemetry event emitted when an email is sent. - /// - /// URI to the SMTP server - /// The start time of when sending the email is attempted. - /// The duration of how long the send took. - /// Whether sending the email was successful. - /// The number of attempts the message has tried to be sent. - void TrackSendEmail(string smtpUri, DateTimeOffset startTime, TimeSpan duration, bool success, int attemptNumber); } } \ No newline at end of file diff --git a/src/NuGetGallery/Services/MessageService.cs b/src/NuGetGallery/Services/MessageService.cs index e1fb64252a..0ed979707e 100644 --- a/src/NuGetGallery/Services/MessageService.cs +++ b/src/NuGetGallery/Services/MessageService.cs @@ -3,12 +3,10 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Globalization; using System.Linq; using System.Net.Mail; using System.Text; -using System.Threading.Tasks; using System.Web; using AnglicanGeek.MarkdownMailer; using NuGetGallery.Configuration; @@ -18,15 +16,14 @@ namespace NuGetGallery { public class MessageService : CoreMessageService, IMessageService { - public MessageService(IMailSender mailSender, IAppConfiguration config, ITelemetryService telemetryService) - : base(mailSender, config) + protected MessageService() { - this.telemetryService = telemetryService ?? throw new ArgumentNullException(nameof(telemetryService)); - smtpUri = config.SmtpUri?.Host; } - private readonly ITelemetryService telemetryService; - private readonly string smtpUri; + public MessageService(IMailSender mailSender, IAppConfiguration config) + : base(mailSender, config) + { + } public IAppConfiguration Config { @@ -34,7 +31,7 @@ public IAppConfiguration Config set { CoreConfiguration = value; } } - public async Task ReportAbuseAsync(ReportPackageRequest request) + public void ReportAbuse(ReportPackageRequest request) { string subject = "[{GalleryOwnerName}] Support Request for '{Id}' version {Version} (Reason: {Reason})"; subject = request.FillIn(subject, Config); @@ -82,11 +79,11 @@ public async Task ReportAbuseAsync(ReportPackageRequest request) // CCing helps to create a thread of email that can be augmented by the sending user mailMessage.CC.Add(request.FromAddress); } - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task ReportMyPackageAsync(ReportPackageRequest request) + public void ReportMyPackage(ReportPackageRequest request) { string subject = "[{GalleryOwnerName}] Owner Support Request for '{Id}' version {Version} (Reason: {Reason})"; subject = request.FillIn(subject, Config); @@ -129,11 +126,11 @@ public async Task ReportMyPackageAsync(ReportPackageRequest request) // CCing helps to create a thread of email that can be augmented by the sending user mailMessage.CC.Add(request.FromAddress); } - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendContactOwnersMessageAsync(MailAddress fromAddress, Package package, string packageUrl, string message, string emailSettingsUrl, bool copySender) + public void SendContactOwnersMessage(MailAddress fromAddress, Package package, string packageUrl, string message, string emailSettingsUrl, bool copySender) { string subject = "[{0}] Message for owners of the package '{1}'"; string body = @"_User {0} <{1}> sends the following message to the owners of Package '[{2} {3}]({4})'._ @@ -171,16 +168,12 @@ [change your email notification settings]({7}). if (mailMessage.To.Any()) { - await SendMessageAsync(mailMessage); - if (copySender) - { - await SendMessageToSenderAsync(mailMessage); - } + SendMessage(mailMessage, copySender); } } } - public async Task SendNewAccountEmailAsync(User newUser, string confirmationUrl) + public void SendNewAccountEmail(User newUser, string confirmationUrl) { var isOrganization = newUser is Organization; @@ -201,11 +194,11 @@ We can't wait to see what packages you'll upload. mailMessage.From = Config.GalleryNoReplyAddress; mailMessage.To.Add(newUser.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendSigninAssistanceEmailAsync(MailAddress emailAddress, IEnumerable credentials) + public void SendSigninAssistanceEmail(MailAddress emailAddress, IEnumerable credentials) { string body = @"Hi there, @@ -242,12 +235,12 @@ public async Task SendSigninAssistanceEmailAsync(MailAddress emailAddress, IEnum mailMessage.From = Config.GalleryNoReplyAddress; mailMessage.To.Add(emailAddress); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendEmailChangeConfirmationNoticeAsync(User user, string confirmationUrl) + public void SendEmailChangeConfirmationNotice(User user, string confirmationUrl) { string body = @"You recently changed your {0}'s {1} email address. @@ -279,11 +272,11 @@ public async Task SendEmailChangeConfirmationNoticeAsync(User user, string confi mailMessage.From = Config.GalleryNoReplyAddress; mailMessage.To.Add(newEmailAddress); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendEmailChangeNoticeToPreviousEmailAddressAsync(User user, string oldEmailAddress) + public void SendEmailChangeNoticeToPreviousEmailAddress(User user, string oldEmailAddress) { string body = @"The email address associated with your {0} {1} was recently changed from _{2}_ to _{3}_. @@ -309,11 +302,11 @@ public async Task SendEmailChangeNoticeToPreviousEmailAddressAsync(User user, st mailMessage.From = Config.GalleryNoReplyAddress; mailMessage.To.Add(new MailAddress(oldEmailAddress, user.Username)); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendPasswordResetInstructionsAsync(User user, string resetPasswordUrl, bool forgotPassword) + public void SendPasswordResetInstructions(User user, string resetPasswordUrl, bool forgotPassword) { string body = string.Format( CultureInfo.CurrentCulture, @@ -332,11 +325,11 @@ public async Task SendPasswordResetInstructionsAsync(User user, string resetPass mailMessage.From = Config.GalleryNoReplyAddress; mailMessage.To.Add(user.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendPackageOwnerRequestAsync(User fromUser, User toUser, PackageRegistration package, string packageUrl, string confirmationUrl, string rejectionUrl, string message, string policyMessage) + public void SendPackageOwnerRequest(User fromUser, User toUser, PackageRegistration package, string packageUrl, string confirmationUrl, string rejectionUrl, string message, string policyMessage) { if (!string.IsNullOrEmpty(policyMessage)) { @@ -379,11 +372,11 @@ public async Task SendPackageOwnerRequestAsync(User fromUser, User toUser, Packa return; } - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendPackageOwnerRequestInitiatedNoticeAsync(User requestingOwner, User receivingOwner, User newOwner, PackageRegistration package, string cancellationUrl) + public void SendPackageOwnerRequestInitiatedNotice(User requestingOwner, User receivingOwner, User newOwner, PackageRegistration package, string cancellationUrl) { var subject = string.Format(CultureInfo.CurrentCulture, $"[{Config.GalleryOwner.DisplayName}] Package ownership request for '{package.Id}'"); @@ -408,11 +401,11 @@ public async Task SendPackageOwnerRequestInitiatedNoticeAsync(User requestingOwn return; } - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendPackageOwnerRequestRejectionNoticeAsync(User requestingOwner, User newOwner, PackageRegistration package) + public void SendPackageOwnerRequestRejectionNotice(User requestingOwner, User newOwner, PackageRegistration package) { if (!requestingOwner.EmailAllowed) { @@ -438,11 +431,11 @@ public async Task SendPackageOwnerRequestRejectionNoticeAsync(User requestingOwn return; } - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendPackageOwnerRequestCancellationNoticeAsync(User requestingOwner, User newOwner, PackageRegistration package) + public void SendPackageOwnerRequestCancellationNotice(User requestingOwner, User newOwner, PackageRegistration package) { var subject = string.Format(CultureInfo.CurrentCulture, $"[{Config.GalleryOwner.DisplayName}] Package ownership request for '{package.Id}' cancelled"); @@ -463,11 +456,11 @@ public async Task SendPackageOwnerRequestCancellationNoticeAsync(User requesting return; } - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendPackageOwnerAddedNoticeAsync(User toUser, User newOwner, PackageRegistration package, string packageUrl) + public void SendPackageOwnerAddedNotice(User toUser, User newOwner, PackageRegistration package, string packageUrl) { var subject = $"[{Config.GalleryOwner.DisplayName}] Package ownership update for '{package.Id}'"; @@ -487,11 +480,11 @@ public async Task SendPackageOwnerAddedNoticeAsync(User toUser, User newOwner, P { return; } - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendPackageOwnerRemovedNoticeAsync(User fromUser, User toUser, PackageRegistration package) + public void SendPackageOwnerRemovedNotice(User fromUser, User toUser, PackageRegistration package) { var subject = $"[{Config.GalleryOwner.DisplayName}] Package ownership removal for '{package.Id}'"; @@ -512,7 +505,7 @@ public async Task SendPackageOwnerRemovedNoticeAsync(User fromUser, User toUser, return; } - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } @@ -521,11 +514,11 @@ private bool AddAddressesForPackageOwnershipManagementToEmail(MailMessage mailMe return AddAddressesWithPermissionToEmail(mailMessage, user, ActionsRequiringPermissions.HandlePackageOwnershipRequest); } - public Task SendCredentialRemovedNoticeAsync(User user, CredentialViewModel removedCredentialViewModel) + public void SendCredentialRemovedNotice(User user, CredentialViewModel removedCredentialViewModel) { if (CredentialTypes.IsApiKey(removedCredentialViewModel.Type)) { - return SendApiKeyChangeNoticeAsync( + SendApiKeyChangeNotice( user, removedCredentialViewModel, Strings.Emails_ApiKeyRemoved_Body, @@ -533,7 +526,7 @@ public Task SendCredentialRemovedNoticeAsync(User user, CredentialViewModel remo } else { - return SendCredentialChangeNoticeAsync( + SendCredentialChangeNotice( user, removedCredentialViewModel, Strings.Emails_CredentialRemoved_Body, @@ -541,11 +534,11 @@ public Task SendCredentialRemovedNoticeAsync(User user, CredentialViewModel remo } } - public Task SendCredentialAddedNoticeAsync(User user, CredentialViewModel addedCredentialViewModel) + public void SendCredentialAddedNotice(User user, CredentialViewModel addedCredentialViewModel) { if (CredentialTypes.IsApiKey(addedCredentialViewModel.Type)) { - return SendApiKeyChangeNoticeAsync( + SendApiKeyChangeNotice( user, addedCredentialViewModel, Strings.Emails_ApiKeyAdded_Body, @@ -553,7 +546,7 @@ public Task SendCredentialAddedNoticeAsync(User user, CredentialViewModel addedC } else { - return SendCredentialChangeNoticeAsync( + SendCredentialChangeNotice( user, addedCredentialViewModel, Strings.Emails_CredentialAdded_Body, @@ -561,7 +554,7 @@ public Task SendCredentialAddedNoticeAsync(User user, CredentialViewModel addedC } } - private Task SendApiKeyChangeNoticeAsync(User user, CredentialViewModel changedCredentialViewModel, string bodyTemplate, string subjectTemplate) + private void SendApiKeyChangeNotice(User user, CredentialViewModel changedCredentialViewModel, string bodyTemplate, string subjectTemplate) { string body = String.Format( CultureInfo.CurrentCulture, @@ -574,10 +567,10 @@ private Task SendApiKeyChangeNoticeAsync(User user, CredentialViewModel changedC Config.GalleryOwner.DisplayName, Strings.CredentialType_ApiKey); - return SendSupportMessageAsync(user, body, subject); + SendSupportMessage(user, body, subject); } - private Task SendCredentialChangeNoticeAsync(User user, CredentialViewModel changedCredentialViewModel, string bodyTemplate, string subjectTemplate) + private void SendCredentialChangeNotice(User user, CredentialViewModel changedCredentialViewModel, string bodyTemplate, string subjectTemplate) { // What kind of credential is this? string name = changedCredentialViewModel.AuthUI == null ? changedCredentialViewModel.TypeCaption : changedCredentialViewModel.AuthUI.AccountNoun; @@ -593,10 +586,10 @@ private Task SendCredentialChangeNoticeAsync(User user, CredentialViewModel chan Config.GalleryOwner.DisplayName, name); - return SendSupportMessageAsync(user, body, subject); + SendSupportMessage(user, body, subject); } - public async Task SendContactSupportEmailAsync(ContactSupportRequest request) + public void SendContactSupportEmail(ContactSupportRequest request) { string subject = string.Format(CultureInfo.CurrentCulture, "Support Request (Reason: {0})", request.SubjectLine); @@ -621,11 +614,11 @@ public async Task SendContactSupportEmailAsync(ContactSupportRequest request) { mailMessage.CC.Add(request.FromAddress); } - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - private async Task SendSupportMessageAsync(User user, string body, string subject) + private void SendSupportMessage(User user, string body, string subject) { if (user == null) { @@ -639,11 +632,11 @@ private async Task SendSupportMessageAsync(User user, string body, string subjec mailMessage.From = Config.GalleryOwner; mailMessage.To.Add(user.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendAccountDeleteNoticeAsync(User user) + public void SendAccountDeleteNotice(User user) { string body = @"We received a request to delete your account {0}. If you did not initiate this request, please contact the {1} team immediately. {2}When your account will be deleted, we will:{2} @@ -670,11 +663,11 @@ public async Task SendAccountDeleteNoticeAsync(User user) mailMessage.From = Config.GalleryNoReplyAddress; mailMessage.To.Add(user.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendPackageDeletedNoticeAsync(Package package, string packageUrl, string packageSupportUrl) + public void SendPackageDeletedNotice(Package package, string packageUrl, string packageSupportUrl) { string subject = "[{0}] Package deleted - {1} {2}"; string body = @"The package [{1} {2}]({3}) was just deleted from {0}. If this was not intended, please [contact support]({4}). @@ -708,12 +701,12 @@ public async Task SendPackageDeletedNoticeAsync(Package package, string packageU if (mailMessage.To.Any()) { - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } } - public async Task SendOrganizationTransformRequestAsync(User accountToTransform, User adminUser, string profileUrl, string confirmationUrl, string rejectionUrl) + public void SendOrganizationTransformRequest(User accountToTransform, User adminUser, string profileUrl, string confirmationUrl, string rejectionUrl) { if (!adminUser.EmailAllowed) { @@ -743,11 +736,11 @@ public async Task SendOrganizationTransformRequestAsync(User accountToTransform, mailMessage.ReplyToList.Add(accountToTransform.ToMailAddress()); mailMessage.To.Add(adminUser.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendOrganizationTransformInitiatedNoticeAsync(User accountToTransform, User adminUser, string cancellationUrl) + public void SendOrganizationTransformInitiatedNotice(User accountToTransform, User adminUser, string cancellationUrl) { if (!accountToTransform.EmailAllowed) { @@ -775,11 +768,11 @@ public async Task SendOrganizationTransformInitiatedNoticeAsync(User accountToTr mailMessage.ReplyToList.Add(adminUser.ToMailAddress()); mailMessage.To.Add(accountToTransform.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendOrganizationTransformRequestAcceptedNoticeAsync(User accountToTransform, User adminUser) + public void SendOrganizationTransformRequestAcceptedNotice(User accountToTransform, User adminUser) { if (!accountToTransform.EmailAllowed) { @@ -801,21 +794,21 @@ public async Task SendOrganizationTransformRequestAcceptedNoticeAsync(User accou mailMessage.ReplyToList.Add(adminUser.ToMailAddress()); mailMessage.To.Add(accountToTransform.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public Task SendOrganizationTransformRequestRejectedNoticeAsync(User accountToTransform, User adminUser) + public void SendOrganizationTransformRequestRejectedNotice(User accountToTransform, User adminUser) { - return SendOrganizationTransformRequestRejectedNoticeInternalAsync(accountToTransform, adminUser, isCancelledByAdmin: true); + SendOrganizationTransformRequestRejectedNoticeInternal(accountToTransform, adminUser, isCancelledByAdmin: true); } - public Task SendOrganizationTransformRequestCancelledNoticeAsync(User accountToTransform, User adminUser) + public void SendOrganizationTransformRequestCancelledNotice(User accountToTransform, User adminUser) { - return SendOrganizationTransformRequestRejectedNoticeInternalAsync(accountToTransform, adminUser, isCancelledByAdmin: false); + SendOrganizationTransformRequestRejectedNoticeInternal(accountToTransform, adminUser, isCancelledByAdmin: false); } - private async Task SendOrganizationTransformRequestRejectedNoticeInternalAsync(User accountToTransform, User adminUser, bool isCancelledByAdmin) + private void SendOrganizationTransformRequestRejectedNoticeInternal(User accountToTransform, User adminUser, bool isCancelledByAdmin) { var accountToSendTo = isCancelledByAdmin ? accountToTransform : adminUser; var accountToReplyTo = isCancelledByAdmin ? adminUser : accountToTransform; @@ -840,11 +833,11 @@ private async Task SendOrganizationTransformRequestRejectedNoticeInternalAsync(U mailMessage.ReplyToList.Add(accountToReplyTo.ToMailAddress()); mailMessage.To.Add(accountToSendTo.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendOrganizationMembershipRequestAsync(Organization organization, User newUser, User adminUser, bool isAdmin, string profileUrl, string confirmationUrl, string rejectionUrl) + public void SendOrganizationMembershipRequest(Organization organization, User newUser, User adminUser, bool isAdmin, string profileUrl, string confirmationUrl, string rejectionUrl) { if (!newUser.EmailAllowed) { @@ -879,11 +872,11 @@ public async Task SendOrganizationMembershipRequestAsync(Organization organizati mailMessage.ReplyToList.Add(adminUser.ToMailAddress()); mailMessage.To.Add(newUser.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendOrganizationMembershipRequestInitiatedNoticeAsync(Organization organization, User requestingUser, User pendingUser, bool isAdmin, string cancellationUrl) + public void SendOrganizationMembershipRequestInitiatedNotice(Organization organization, User requestingUser, User pendingUser, bool isAdmin, string cancellationUrl) { var membershipLevel = isAdmin ? "an administrator" : "a collaborator"; @@ -906,11 +899,11 @@ public async Task SendOrganizationMembershipRequestInitiatedNoticeAsync(Organiza return; } - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendOrganizationMembershipRequestRejectedNoticeAsync(Organization organization, User pendingUser) + public void SendOrganizationMembershipRequestRejectedNotice(Organization organization, User pendingUser) { string subject = $"[{Config.GalleryOwner.DisplayName}] Membership request for organization '{organization.Username}' declined"; @@ -931,11 +924,11 @@ public async Task SendOrganizationMembershipRequestRejectedNoticeAsync(Organizat return; } - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendOrganizationMembershipRequestCancelledNoticeAsync(Organization organization, User pendingUser) + public void SendOrganizationMembershipRequestCancelledNotice(Organization organization, User pendingUser) { if (!pendingUser.EmailAllowed) { @@ -957,11 +950,11 @@ public async Task SendOrganizationMembershipRequestCancelledNoticeAsync(Organiza mailMessage.ReplyToList.Add(organization.ToMailAddress()); mailMessage.To.Add(pendingUser.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendOrganizationMemberUpdatedNoticeAsync(Organization organization, Membership membership) + public void SendOrganizationMemberUpdatedNotice(Organization organization, Membership membership) { if (!organization.EmailAllowed) { @@ -986,11 +979,11 @@ public async Task SendOrganizationMemberUpdatedNoticeAsync(Organization organiza mailMessage.ReplyToList.Add(member.ToMailAddress()); mailMessage.To.Add(organization.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } - public async Task SendOrganizationMemberRemovedNoticeAsync(Organization organization, User removedUser) + public void SendOrganizationMemberRemovedNotice(Organization organization, User removedUser) { if (!organization.EmailAllowed) { @@ -1012,7 +1005,7 @@ public async Task SendOrganizationMemberRemovedNoticeAsync(Organization organiza mailMessage.ReplyToList.Add(removedUser.ToMailAddress()); mailMessage.To.Add(organization.ToMailAddress()); - await SendMessageAsync(mailMessage); + SendMessage(mailMessage); } } @@ -1021,20 +1014,21 @@ private bool AddAddressesForAccountManagementToEmail(MailMessage mailMessage, Us return AddAddressesWithPermissionToEmail(mailMessage, user, ActionsRequiringPermissions.ManageAccount); } - protected override async Task AttemptSendMessageAsync(MailMessage mailMessage, int attemptNumber) + protected override void SendMessage(MailMessage mailMessage, bool copySender) { - bool success = false; - DateTimeOffset startTime = DateTimeOffset.UtcNow; - Stopwatch sw = Stopwatch.StartNew(); try { - await base.AttemptSendMessageAsync(mailMessage, attemptNumber); - success = true; + base.SendMessage(mailMessage, copySender); + } + catch (InvalidOperationException ex) + { + // Log but swallow the exception + QuietLog.LogHandledException(ex); } - finally + catch (SmtpException ex) { - sw.Stop(); - telemetryService.TrackSendEmail(smtpUri, startTime, sw.Elapsed, success, attemptNumber); + // Log but swallow the exception + QuietLog.LogHandledException(ex); } } diff --git a/src/NuGetGallery/Services/TelemetryClientWrapper.cs b/src/NuGetGallery/Services/TelemetryClientWrapper.cs index e817cba55e..d5d7f1fdbe 100644 --- a/src/NuGetGallery/Services/TelemetryClientWrapper.cs +++ b/src/NuGetGallery/Services/TelemetryClientWrapper.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using Microsoft.ApplicationInsights; -using Microsoft.ApplicationInsights.DataContracts; namespace NuGetGallery { @@ -53,31 +52,5 @@ public void TrackMetric(string metricName, double value, IDictionary properties) - { - try - { - var telemetry = new DependencyTelemetry(dependencyTypeName, target, dependencyName, data, startTime, duration, resultCode, success); - foreach (var property in properties) - { - telemetry.Properties.Add(property); - } - - UnderlyingClient.TrackDependency(telemetry); - } - catch - { - // logging failed, don't allow exception to escape - } - } } } \ No newline at end of file diff --git a/src/NuGetGallery/Services/TelemetryService.cs b/src/NuGetGallery/Services/TelemetryService.cs index 1bfb9efef7..0ff51395dc 100644 --- a/src/NuGetGallery/Services/TelemetryService.cs +++ b/src/NuGetGallery/Services/TelemetryService.cs @@ -594,15 +594,6 @@ public void TrackRequestForAccountDeletion(User user) }); } - public void TrackSendEmail(string smtpUri, DateTimeOffset startTime, TimeSpan duration, bool success, int attemptNumber) - { - var properties = new Dictionary - { - { "attempt", attemptNumber.ToString() } - }; - _telemetryClient.TrackDependency("SMTP", smtpUri, "SendMessage", null, startTime, duration, null, success, properties); - } - /// /// We use instead of /// diff --git a/src/NuGetGallery/Telemetry/QuietLog.cs b/src/NuGetGallery/Telemetry/QuietLog.cs index a5d2d4e49a..df32524584 100644 --- a/src/NuGetGallery/Telemetry/QuietLog.cs +++ b/src/NuGetGallery/Telemetry/QuietLog.cs @@ -38,31 +38,6 @@ public static void LogHandledException(Exception e) } } - public static void LogHandledException(Exception e, ErrorLog errorLog) - { - var aggregateExceptionId = Guid.NewGuid().ToString(); - - var aggregateException = e as AggregateException; - if (aggregateException != null) - { - LogHandledExceptionCore(aggregateException, aggregateExceptionId, errorLog); - - foreach (var innerException in aggregateException.InnerExceptions) - { - LogHandledExceptionCore(innerException, aggregateExceptionId, errorLog); - } - } - else - { - LogHandledExceptionCore(e, aggregateExceptionId, errorLog); - - if (e.InnerException != null) - { - LogHandledExceptionCore(e.InnerException, aggregateExceptionId, errorLog); - } - } - } - private static void LogHandledExceptionCore(Exception e, string aggregateExceptionId) { try @@ -90,24 +65,6 @@ private static void LogHandledExceptionCore(Exception e, string aggregateExcepti } } - private static void LogHandledExceptionCore(Exception e, string aggregateExceptionId, ErrorLog errorLog) - { - try - { - errorLog.Log(new Error(e)); - - // send exception to AppInsights - Telemetry.TrackException(e, new Dictionary - { - { "aggregateExceptionId", aggregateExceptionId } - }); - } - catch - { - // logging failed, don't allow exception to escape - } - } - internal static bool IsPIIRoute(RouteData route, out string operation) { if(route == null) diff --git a/tests/NuGetGallery.Facts/Controllers/AccountsControllerFacts.cs b/tests/NuGetGallery.Facts/Controllers/AccountsControllerFacts.cs index f0c093f1af..f32ed2e1a7 100644 --- a/tests/NuGetGallery.Facts/Controllers/AccountsControllerFacts.cs +++ b/tests/NuGetGallery.Facts/Controllers/AccountsControllerFacts.cs @@ -6,7 +6,6 @@ using System.Linq; using System.Threading.Tasks; using System.Web.Mvc; -using Autofac; using Moq; using NuGetGallery.Framework; using Xunit; @@ -244,7 +243,7 @@ public virtual async Task WhenNewEmailIsDifferentAndWasConfirmed_SavesChanges(Fu ResultAssert.IsRedirectToRoute(result, new { action = controller.AccountAction }); GetMock() - .Verify(m => m.SendEmailChangeConfirmationNoticeAsync(It.IsAny(), It.IsAny()), + .Verify(m => m.SendEmailChangeConfirmationNotice(It.IsAny(), It.IsAny()), Times.Once); } @@ -269,7 +268,7 @@ public virtual async Task WhenNewEmailIsDifferentAndWasUnconfirmed_SavesChanges( ResultAssert.IsRedirectToRoute(result, new { action = controller.AccountAction }); GetMock() - .Verify(m => m.SendEmailChangeConfirmationNoticeAsync(It.IsAny(), It.IsAny()), + .Verify(m => m.SendEmailChangeConfirmationNotice(It.IsAny(), It.IsAny()), Times.Never); } @@ -292,8 +291,7 @@ protected virtual Task InvokeChangeEmail( controller.SetCurrentUser(getCurrentUser(Fakes)); var messageService = GetMock(); - messageService.Setup(m => m.SendEmailChangeConfirmationNoticeAsync(It.IsAny(), It.IsAny())) - .Returns(Task.CompletedTask) + messageService.Setup(m => m.SendEmailChangeConfirmationNotice(It.IsAny(), It.IsAny())) .Verifiable(); var userService = GetMock(); @@ -465,18 +463,18 @@ public abstract class TheConfirmationRequiredPostBaseAction : AccountsController { [Theory] [MemberData(AllowedCurrentUsersDataName)] - public virtual async Task WhenAlreadyConfirmed_DoesNotSendEmail(Func getCurrentUser) + public virtual void WhenAlreadyConfirmed_DoesNotSendEmail(Func getCurrentUser) { // Arrange var controller = GetController(); var account = GetAccount(controller); // Act - var result = await InvokeConfirmationRequiredPostAsync(controller, account, getCurrentUser); + var result = InvokeConfirmationRequiredPost(controller, account, getCurrentUser); // Assert var mailService = GetMock(); - mailService.Verify(m => m.SendNewAccountEmailAsync(It.IsAny(), It.IsAny()), Times.Never); + mailService.Verify(m => m.SendNewAccountEmail(It.IsAny(), It.IsAny()), Times.Never); var model = ResultAssert.IsView(result); Assert.False(model.SentEmail); @@ -484,7 +482,7 @@ public virtual async Task WhenAlreadyConfirmed_DoesNotSendEmail(Func getCurrentUser) + public virtual void WhenIsNotConfirmed_SendsEmail(Func getCurrentUser) { // Arrange var controller = GetController(); @@ -498,17 +496,17 @@ public virtual async Task WhenIsNotConfirmed_SendsEmail(Func getCur var confirmationUrl = (account is Organization) ? TestUtility.GallerySiteRootHttps + $"organization/{account.Username}/Confirm?token=confirmation" : TestUtility.GallerySiteRootHttps + $"account/confirm/{account.Username}/confirmation"; - var result = await InvokeConfirmationRequiredPostAsync(controller, account, getCurrentUser, confirmationUrl); + var result = InvokeConfirmationRequiredPost(controller, account, getCurrentUser, confirmationUrl); // Assert var mailService = GetMock(); - mailService.Verify(m => m.SendNewAccountEmailAsync(It.IsAny(), confirmationUrl), Times.Once); + mailService.Verify(m => m.SendNewAccountEmail(It.IsAny(), confirmationUrl), Times.Once); var model = ResultAssert.IsView(result); Assert.True(model.SentEmail); } - protected virtual Task InvokeConfirmationRequiredPostAsync( + protected virtual ActionResult InvokeConfirmationRequiredPost( TAccountsController controller, TUser account, Func getCurrentUser, @@ -521,10 +519,9 @@ protected virtual Task InvokeConfirmationRequiredPostAsync( .Returns(account as User); GetMock() - .Setup(m => m.SendNewAccountEmailAsync( + .Setup(m => m.SendNewAccountEmail( account, string.IsNullOrEmpty(confirmationUrl) ? It.IsAny() : confirmationUrl)) - .Returns(Task.CompletedTask) .Verifiable(); // Act @@ -597,7 +594,7 @@ public virtual async Task WhenAlreadyConfirmed_DoesNotConfirmEmailAddress(Func(); - mailService.Verify(m => m.SendEmailChangeNoticeToPreviousEmailAddressAsync( + mailService.Verify(m => m.SendEmailChangeNoticeToPreviousEmailAddress( It.IsAny(), It.IsAny()), Times.Never); @@ -630,7 +627,7 @@ public virtual async Task WhenIsNotConfirmedAndNoExistingEmail_ConfirmsEmailAddr Times.Once); var mailService = GetMock(); - mailService.Verify(m => m.SendEmailChangeNoticeToPreviousEmailAddressAsync( + mailService.Verify(m => m.SendEmailChangeNoticeToPreviousEmailAddress( It.IsAny(), It.IsAny()), Times.Never); @@ -662,7 +659,7 @@ public virtual async Task WhenIsNotConfirmedAndHasExistingEmail_ConfirmsEmailAdd Times.Once); var mailService = GetMock(); - mailService.Verify(m => m.SendEmailChangeNoticeToPreviousEmailAddressAsync( + mailService.Verify(m => m.SendEmailChangeNoticeToPreviousEmailAddress( It.IsAny(), It.IsAny()), Times.Once); @@ -733,10 +730,9 @@ protected virtual Task InvokeConfirm( } GetMock() - .Setup(m => m.SendEmailChangeNoticeToPreviousEmailAddressAsync( + .Setup(m => m.SendEmailChangeNoticeToPreviousEmailAddress( It.IsAny(), It.IsAny())) - .Returns(Task.CompletedTask) .Verifiable(); // Act diff --git a/tests/NuGetGallery.Facts/Controllers/ApiControllerFacts.cs b/tests/NuGetGallery.Facts/Controllers/ApiControllerFacts.cs index b6599c3a03..e45a7444a3 100644 --- a/tests/NuGetGallery.Facts/Controllers/ApiControllerFacts.cs +++ b/tests/NuGetGallery.Facts/Controllers/ApiControllerFacts.cs @@ -622,7 +622,7 @@ public async Task CreatePackageWillSendPackageAddedNotice(bool asyncValidationEn // Assert controller.MockMessageService - .Verify(ms => ms.SendPackageAddedNoticeAsync(package, It.IsAny(), It.IsAny(), It.IsAny()), + .Verify(ms => ms.SendPackageAddedNotice(package, It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(callExpected ? 1 : 0)); } diff --git a/tests/NuGetGallery.Facts/Controllers/AuthenticationControllerFacts.cs b/tests/NuGetGallery.Facts/Controllers/AuthenticationControllerFacts.cs index 66fbd62387..539021f2fc 100644 --- a/tests/NuGetGallery.Facts/Controllers/AuthenticationControllerFacts.cs +++ b/tests/NuGetGallery.Facts/Controllers/AuthenticationControllerFacts.cs @@ -107,11 +107,11 @@ public void WillNotRedirectToTheReturnUrlWhenReturnUrlContainsAccount() public class TheSigninAssistanceAction : TestContainer { [Fact] - public async Task NullUsernameReturnsFalse() + public void NullUsernameReturnsFalse() { var controller = GetController(); - var result = await controller.SignInAssistance(username: null, providedEmailAddress: null); + var result = controller.SignInAssistance(username: null, providedEmailAddress: null); dynamic data = result.Data; Assert.False(data.success); } @@ -121,7 +121,7 @@ public async Task NullUsernameReturnsFalse() [InlineData("rm@address.com", "r**********m@address.com")] [InlineData("r@address.com", "r**********@address.com")] [InlineData("random.very.long.address@address.com", "r**********s@address.com")] - public async Task NullProvidedEmailReturnsFormattedEmail(string email, string expectedEmail) + public void NullProvidedEmailReturnsFormattedEmail(string email, string expectedEmail) { var cred = new CredentialBuilder().CreateExternalCredential("MicrosoftAccount", "blorg", identity: "John Doe "); var existingUser = new User("existingUser") { EmailAddress = email, Credentials = new[] { cred } }; @@ -133,7 +133,7 @@ public async Task NullProvidedEmailReturnsFormattedEmail(string email, string ex var controller = GetController(); - var result = await controller.SignInAssistance(username: "existingUser", providedEmailAddress: null); + var result = controller.SignInAssistance(username: "existingUser", providedEmailAddress: null); dynamic data = result.Data; Assert.True(data.success); Assert.Equal(expectedEmail, data.EmailAddress); @@ -144,7 +144,7 @@ public async Task NullProvidedEmailReturnsFormattedEmail(string email, string ex [InlineData("rm@address.com", "r**********m@address.com")] [InlineData("r@address.com", "r**********@address.com")] [InlineData("random.very.long.address@address.com", "r**********s@address.com")] - public async Task NullProvidedEmailReturnsFormattedEmailForUnconfirmedAccount(string email, string expectedEmail) + public void NullProvidedEmailReturnsFormattedEmailForUnconfirmedAccount(string email, string expectedEmail) { var cred = new CredentialBuilder().CreateExternalCredential("MicrosoftAccount", "blorg", identity: "John Doe "); var existingUser = new User("existingUser") { UnconfirmedEmailAddress = email, Credentials = new[] { cred } }; @@ -156,7 +156,7 @@ public async Task NullProvidedEmailReturnsFormattedEmailForUnconfirmedAccount(st var controller = GetController(); - var result = await controller.SignInAssistance(username: "existingUser", providedEmailAddress: null); + var result = controller.SignInAssistance(username: "existingUser", providedEmailAddress: null); dynamic data = result.Data; Assert.True(data.success); Assert.Equal(expectedEmail, data.EmailAddress); @@ -166,7 +166,7 @@ public async Task NullProvidedEmailReturnsFormattedEmailForUnconfirmedAccount(st [InlineData("blarg")] [InlineData("wrong@email")] [InlineData("nonmatching@emailaddress.com")] - public async Task InvalidProvidedEmailReturnsFalse(string providedEmail) + public void InvalidProvidedEmailReturnsFalse(string providedEmail) { var cred = new CredentialBuilder().CreateExternalCredential("MicrosoftAccount", "blorg", identity: "existing@example.com"); var existingUser = new User("existingUser") { EmailAddress = "existing@example.com", Credentials = new[] { cred } }; @@ -178,13 +178,13 @@ public async Task InvalidProvidedEmailReturnsFalse(string providedEmail) var controller = GetController(); - var result = await controller.SignInAssistance(username: "existingUser", providedEmailAddress: providedEmail); + var result = controller.SignInAssistance(username: "existingUser", providedEmailAddress: providedEmail); dynamic data = result.Data; Assert.False(data.success); } [Fact] - public async Task SendsNotificationForAssistance() + public void SendsNotificationForAssistance() { var email = "existing@example.com"; var fakes = Get(); @@ -197,13 +197,12 @@ public async Task SendsNotificationForAssistance() .Returns(existingUser); var messageServiceMock = GetMock(); messageServiceMock - .Setup(m => m.SendSigninAssistanceEmailAsync(It.IsAny(), It.IsAny>())) - .Returns(Task.CompletedTask) + .Setup(m => m.SendSigninAssistanceEmail(It.IsAny(), It.IsAny>())) .Verifiable(); var controller = GetController(); - var result = await controller.SignInAssistance(username: "existingUser", providedEmailAddress: email); + var result = controller.SignInAssistance(username: "existingUser", providedEmailAddress: email); dynamic data = result.Data; Assert.True(data.success); messageServiceMock.Verify(); @@ -397,7 +396,7 @@ public async Task WhenAttemptingToLinkExternalToExistingAccountWithNoExternalAcc .Verify(x => x.RemoveCredential(user, passwordCredential)); GetMock() - .Verify(x => x.SendCredentialAddedNoticeAsync(It.IsAny(), It.IsAny())); + .Verify(x => x.SendCredentialAddedNotice(It.IsAny(), It.IsAny())); } public async Task WhenAttemptingToLinkExternalToAccountWithExistingExternals_RejectsLinking() @@ -492,7 +491,7 @@ public async Task WhenAttemptingToLinkExternalToAdminUserWithExistingExternals_A .Verify(x => x.CreateSessionAsync(controller.OwinContext, authUser, false)); GetMock() - .Verify(x => x.SendCredentialAddedNoticeAsync(authUser.User, credentialViewModel)); + .Verify(x => x.SendCredentialAddedNotice(authUser.User, credentialViewModel)); } [Fact] @@ -549,9 +548,8 @@ public async Task GivenValidExternalAuth_ItLinksCredentialSendsEmailAndLogsIn() .Completes() .Verifiable(); GetMock() - .Setup(x => x.SendCredentialAddedNoticeAsync(authUser.User, + .Setup(x => x.SendCredentialAddedNotice(authUser.User, It.Is(c => c.Type == CredentialTypes.External.MicrosoftAccount))) - .Returns(Task.CompletedTask) .Verifiable(); var controller = GetController(); @@ -619,9 +617,8 @@ public async Task GivenAdminLogsInWithValidExternalAuth_ItChallengesWhenNotUsing .Verifiable(); GetMock() - .Setup(x => x.SendCredentialAddedNoticeAsync(authUser.User, + .Setup(x => x.SendCredentialAddedNotice(authUser.User, It.Is(c => c.Type == CredentialTypes.External.Prefix + providerUsedForLogin))) - .Returns(Task.CompletedTask) .Verifiable(); EnableAllAuthenticators(Get()); @@ -752,7 +749,7 @@ public async Task WillCreateAndLogInTheUserWhenNotLinking() GetMock().VerifyAll(); GetMock() - .Verify(x => x.SendNewAccountEmailAsync( + .Verify(x => x.SendNewAccountEmail( authUser.User, TestUtility.GallerySiteRootHttps + "account/confirm/" + authUser.User.Username + "/" + authUser.User.EmailConfirmationToken)); ResultAssert.IsSafeRedirectTo(result, "/theReturnUrl"); @@ -798,7 +795,7 @@ public async Task WillNotSendConfirmationEmailWhenConfirmEmailAddressesIsOff() // Assert GetMock() - .Verify(x => x.SendNewAccountEmailAsync( + .Verify(x => x.SendNewAccountEmail( It.IsAny(), It.IsAny()), Times.Never()); } @@ -888,7 +885,7 @@ public async Task GivenValidExternalAuth_ItCreatesAccountAndLinksCredential() authenticationServiceMock.VerifyAll(); GetMock() - .Verify(x => x.SendNewAccountEmailAsync( + .Verify(x => x.SendNewAccountEmail( authUser.User, TestUtility.GallerySiteRootHttps + "account/confirm/" + authUser.User.Username + "/" + authUser.User.EmailConfirmationToken)); diff --git a/tests/NuGetGallery.Facts/Controllers/JsonApiControllerFacts.cs b/tests/NuGetGallery.Facts/Controllers/JsonApiControllerFacts.cs index ed2a009e03..c72b300488 100644 --- a/tests/NuGetGallery.Facts/Controllers/JsonApiControllerFacts.cs +++ b/tests/NuGetGallery.Facts/Controllers/JsonApiControllerFacts.cs @@ -365,7 +365,7 @@ public async Task CreatesPackageOwnerRequestSendsEmailAndReturnsPendingState(Fun .Verifiable(); messageServiceMock - .Setup(m => m.SendPackageOwnerRequestAsync( + .Setup(m => m.SendPackageOwnerRequest( currentUser, userToAdd, fakes.Package, @@ -374,19 +374,17 @@ public async Task CreatesPackageOwnerRequestSendsEmailAndReturnsPendingState(Fun TestUtility.GallerySiteRootHttps + $"packages/FakePackage/owners/{userToAdd.Username}/reject/confirmation-code", "Hello World! Html Encoded <3", "")) - .Returns(Task.CompletedTask) .Verifiable(); foreach (var owner in fakes.Package.Owners) { messageServiceMock - .Setup(m => m.SendPackageOwnerRequestInitiatedNoticeAsync( + .Setup(m => m.SendPackageOwnerRequestInitiatedNotice( currentUser, owner, userToAdd, fakes.Package, It.IsAny())) - .Returns(Task.CompletedTask) .Verifiable(); } } @@ -400,12 +398,11 @@ public async Task CreatesPackageOwnerRequestSendsEmailAndReturnsPendingState(Fun foreach (var owner in fakes.Package.Owners) { messageServiceMock - .Setup(m => m.SendPackageOwnerAddedNoticeAsync( + .Setup(m => m.SendPackageOwnerAddedNotice( owner, userToAdd, fakes.Package, It.IsAny())) - .Returns(Task.CompletedTask) .Verifiable(); } } @@ -543,7 +540,7 @@ public async Task RemovesPackageOwnerRequest(Func getCurrentUser, F packageOwnershipManagementService.Verify(x => x.DeletePackageOwnershipRequestAsync(package, requestedUser)); GetMock() - .Verify(x => x.SendPackageOwnerRequestCancellationNoticeAsync(currentUser, requestedUser, package)); + .Verify(x => x.SendPackageOwnerRequestCancellationNotice(currentUser, requestedUser, package)); } [Theory] @@ -574,7 +571,7 @@ public async Task RemovesExistingOwner(Func getCurrentUser, Func x.RemovePackageOwnerAsync(package, currentUser, userToRemove, It.IsAny())); GetMock() - .Verify(x => x.SendPackageOwnerRemovedNoticeAsync(currentUser, userToRemove, package)); + .Verify(x => x.SendPackageOwnerRemovedNotice(currentUser, userToRemove, package)); } } diff --git a/tests/NuGetGallery.Facts/Controllers/OrganizationsControllerFacts.cs b/tests/NuGetGallery.Facts/Controllers/OrganizationsControllerFacts.cs index 80ad7fb521..0c81c73903 100644 --- a/tests/NuGetGallery.Facts/Controllers/OrganizationsControllerFacts.cs +++ b/tests/NuGetGallery.Facts/Controllers/OrganizationsControllerFacts.cs @@ -257,14 +257,14 @@ public static IEnumerable WithNonOrganizationAdmin_ReturnsForbidden_Da [Theory] [MemberData(nameof(WithNonOrganizationAdmin_ReturnsForbidden_Data))] - public async Task WithNonOrganizationAdmin_ReturnsForbidden(Func getCurrentUser) + public void WithNonOrganizationAdmin_ReturnsForbidden(Func getCurrentUser) { // Arrange var controller = GetController(); var account = GetAccount(controller); // Act - var result = await InvokeConfirmationRequiredPostAsync(controller, account, getCurrentUser) as HttpStatusCodeResult; + var result = InvokeConfirmationRequiredPost(controller, account, getCurrentUser) as HttpStatusCodeResult; // Assert Assert.NotNull(result); @@ -381,7 +381,7 @@ public async Task WhenAddOrganizationSucceeds_RedirectsToManageOrganization() new { accountName = org.Username, action = nameof(OrganizationsController.ManageOrganization) }); messageService.Verify( - x => x.SendNewAccountEmailAsync( + x => x.SendNewAccountEmail( org, It.Is(s => s.Contains(token))), Times.Once()); @@ -499,7 +499,7 @@ public async Task WhenMembershipRequestCreated_ReturnsSuccess(Func GetMock().Verify(s => s.AddMembershipRequestAsync(account, defaultMemberName, isAdmin), Times.Once); GetMock() - .Verify(s => s.SendOrganizationMembershipRequestAsync( + .Verify(s => s.SendOrganizationMembershipRequest( account, It.Is(u => u.Username == defaultMemberName), controller.GetCurrentUser(), @@ -508,7 +508,7 @@ public async Task WhenMembershipRequestCreated_ReturnsSuccess(Func It.IsAny(), It.IsAny())); GetMock() - .Verify(s => s.SendOrganizationMembershipRequestInitiatedNoticeAsync( + .Verify(s => s.SendOrganizationMembershipRequestInitiatedNotice( account, controller.GetCurrentUser(), It.Is(u => u.Username == defaultMemberName), @@ -571,7 +571,7 @@ public async Task WhenAccountMissingReturns404(bool isAdmin) ResultAssert.IsStatusCode(result, HttpStatusCode.NotFound); GetMock().Verify(s => s.AddMemberAsync(It.IsAny(), Fakes.User.Username, defaultConfirmationToken), Times.Never); - GetMock().Verify(s => s.SendOrganizationMemberUpdatedNoticeAsync(It.IsAny(), It.IsAny()), Times.Never); + GetMock().Verify(s => s.SendOrganizationMemberUpdatedNotice(It.IsAny(), It.IsAny()), Times.Never); } [Theory] @@ -597,7 +597,7 @@ public async Task WhenEntityException_ReturnsNonSuccess(bool isAdmin) Assert.False(model.Successful); GetMock().Verify(s => s.AddMemberAsync(account, Fakes.User.Username, defaultConfirmationToken), Times.Once); - GetMock().Verify(s => s.SendOrganizationMemberUpdatedNoticeAsync(It.IsAny(), It.IsAny()), Times.Never); + GetMock().Verify(s => s.SendOrganizationMemberUpdatedNotice(It.IsAny(), It.IsAny()), Times.Never); } [Theory] @@ -623,7 +623,7 @@ public async Task WhenMembershipRequestCreated_ReturnsSuccess(bool isAdmin) GetMock().Verify(s => s.AddMemberAsync(account, Fakes.User.Username, defaultConfirmationToken), Times.Once); GetMock() - .Verify(s => s.SendOrganizationMemberUpdatedNoticeAsync( + .Verify(s => s.SendOrganizationMemberUpdatedNotice( account, It.Is(m => Fakes.User.Username == m.Member.Username && m.Organization == account && m.IsAdmin == isAdmin)), Times.Once); } @@ -686,7 +686,7 @@ public async Task WhenAccountMissingReturns404(bool isAdmin) ResultAssert.IsStatusCode(result, HttpStatusCode.NotFound); GetMock().Verify(s => s.RejectMembershipRequestAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); - GetMock().Verify(s => s.SendOrganizationMembershipRequestRejectedNoticeAsync(It.IsAny(), It.IsAny()), Times.Never); + GetMock().Verify(s => s.SendOrganizationMembershipRequestRejectedNotice(It.IsAny(), It.IsAny()), Times.Never); } [Theory] @@ -712,7 +712,7 @@ public async Task WhenEntityException_ReturnsNonSuccess(bool isAdmin) Assert.False(model.Successful); GetMock().Verify(s => s.RejectMembershipRequestAsync(account, Fakes.User.Username, defaultConfirmationToken), Times.Once); - GetMock().Verify(s => s.SendOrganizationMembershipRequestRejectedNoticeAsync(It.IsAny(), It.IsAny()), Times.Never); + GetMock().Verify(s => s.SendOrganizationMembershipRequestRejectedNotice(It.IsAny(), It.IsAny()), Times.Never); } [Theory] @@ -735,7 +735,7 @@ public async Task WhenMembershipRequestCreated_ReturnsSuccess(bool isAdmin) Assert.True(model.Successful); GetMock().Verify(s => s.RejectMembershipRequestAsync(account, Fakes.User.Username, defaultConfirmationToken), Times.Once); - GetMock().Verify(s => s.SendOrganizationMembershipRequestRejectedNoticeAsync(account, Fakes.User), Times.Once); + GetMock().Verify(s => s.SendOrganizationMembershipRequestRejectedNotice(account, Fakes.User), Times.Once); } private Task InvokeRejectMember( @@ -883,7 +883,7 @@ public async Task WhenMembershipCreated_ReturnsSuccess(Func getCurr GetMock().Verify(s => s.UpdateMemberAsync(account, defaultMemberName, isAdmin), Times.Once); GetMock() - .Verify(s => s.SendOrganizationMemberUpdatedNoticeAsync( + .Verify(s => s.SendOrganizationMemberUpdatedNotice( account, It.Is(m => m.Organization == account && m.Member.Username == defaultMemberName && m.IsAdmin == isAdmin))); } @@ -962,7 +962,7 @@ public async Task WithNonOrganizationAdmin_ReturnsForbidden(Func ge Assert.Equal(Strings.Unauthorized, result.Data); GetMock().Verify(s => s.DeleteMemberAsync(It.IsAny(), It.IsAny()), Times.Never); - GetMock().Verify(s => s.SendOrganizationMemberRemovedNoticeAsync(It.IsAny(), It.IsAny()), Times.Never); + GetMock().Verify(s => s.SendOrganizationMemberRemovedNotice(It.IsAny(), It.IsAny()), Times.Never); } [Theory] @@ -983,7 +983,7 @@ public async Task WhenOrganizationIsUnconfirmed_ReturnsNonSuccess(Func().Verify(s => s.DeleteMemberAsync(It.IsAny(), It.IsAny()), Times.Never); - GetMock().Verify(s => s.SendOrganizationMemberRemovedNoticeAsync(It.IsAny(), It.IsAny()), Times.Never); + GetMock().Verify(s => s.SendOrganizationMemberRemovedNotice(It.IsAny(), It.IsAny()), Times.Never); } [Theory] @@ -1003,7 +1003,7 @@ public async Task WhenEntityException_ReturnsNonSuccess(Func getCur Assert.Equal("error", result.Data); GetMock().Verify(s => s.DeleteMemberAsync(account, defaultMemberName), Times.Once); - GetMock().Verify(s => s.SendOrganizationMemberRemovedNoticeAsync(It.IsAny(), It.IsAny()), Times.Never); + GetMock().Verify(s => s.SendOrganizationMemberRemovedNotice(It.IsAny(), It.IsAny()), Times.Never); } [Theory] @@ -1025,7 +1025,7 @@ public async Task WhenDeletingAsAdmin_ReturnsSuccess(Func getCurren GetMock() .Verify(s => s.DeleteMemberAsync(account, defaultMemberName), Times.Once); GetMock() - .Verify(s => s.SendOrganizationMemberRemovedNoticeAsync(account, It.Is(u => u.Username == defaultMemberName)), Times.Once); + .Verify(s => s.SendOrganizationMemberRemovedNotice(account, It.Is(u => u.Username == defaultMemberName)), Times.Once); } [Fact] @@ -1116,7 +1116,7 @@ public async Task WithNonOrganizationAdmin_ReturnsForbidden(Func ge Assert.Equal(Strings.Unauthorized, result.Data); GetMock().Verify(s => s.CancelMembershipRequestAsync(It.IsAny(), It.IsAny()), Times.Never); - GetMock().Verify(s => s.SendOrganizationMembershipRequestCancelledNoticeAsync(It.IsAny(), It.IsAny()), Times.Never); + GetMock().Verify(s => s.SendOrganizationMembershipRequestCancelledNotice(It.IsAny(), It.IsAny()), Times.Never); } [Theory] @@ -1136,7 +1136,7 @@ public async Task WhenEntityException_ReturnsNonSuccess(Func getCur Assert.Equal("error", result.Data); GetMock().Verify(s => s.CancelMembershipRequestAsync(account, defaultMemberName), Times.Once); - GetMock().Verify(s => s.SendOrganizationMembershipRequestCancelledNoticeAsync(It.IsAny(), It.IsAny()), Times.Never); + GetMock().Verify(s => s.SendOrganizationMembershipRequestCancelledNotice(It.IsAny(), It.IsAny()), Times.Never); } [Theory] @@ -1156,7 +1156,7 @@ public async Task WhenSuccess_ReturnsSuccess(Func getCurrentUser) Assert.Equal(Strings.CancelMemberRequest_Success, result.Data); GetMock().Verify(s => s.CancelMembershipRequestAsync(account, defaultMemberName), Times.Once); - GetMock().Verify(s => s.SendOrganizationMembershipRequestCancelledNoticeAsync(account, It.Is(u => u.Username == defaultMemberName)), Times.Once); + GetMock().Verify(s => s.SendOrganizationMembershipRequestCancelledNotice(account, It.Is(u => u.Username == defaultMemberName)), Times.Once); } private Task InvokeCancelMemberRequestMember( diff --git a/tests/NuGetGallery.Facts/Controllers/PackagesControllerFacts.cs b/tests/NuGetGallery.Facts/Controllers/PackagesControllerFacts.cs index 49286f239a..7f886fe0f1 100644 --- a/tests/NuGetGallery.Facts/Controllers/PackagesControllerFacts.cs +++ b/tests/NuGetGallery.Facts/Controllers/PackagesControllerFacts.cs @@ -936,7 +936,7 @@ private static Expression> Packag private static Expression> MessageServiceForConfirmOwnershipRequestExpression(PackageOwnerRequest request) { - return messageService => messageService.SendPackageOwnerAddedNoticeAsync( + return messageService => messageService.SendPackageOwnerAddedNotice( request.RequestingOwner, request.NewOwner, request.PackageRegistration, @@ -945,7 +945,7 @@ private static Expression> MessageServiceForConfirmOwner private static Expression> MessageServiceForRejectOwnershipRequestExpression(PackageOwnerRequest request) { - return messageService => messageService.SendPackageOwnerRequestRejectionNoticeAsync(request.RequestingOwner, request.NewOwner, request.PackageRegistration); + return messageService => messageService.SendPackageOwnerRequestRejectionNotice(request.RequestingOwner, request.NewOwner, request.PackageRegistration); } public static IEnumerable ReturnsSuccessIfTokenIsValid_Data @@ -1211,7 +1211,7 @@ public async Task ReturnsCancelledIfPackageOwnershipRequestExists(User currentUs Assert.Equal(packageId, model.PackageId); packageService.Verify(); packageOwnershipManagementRequestService.Verify(); - messageService.Verify(m => m.SendPackageOwnerRequestCancellationNoticeAsync(userA, userB, package)); + messageService.Verify(m => m.SendPackageOwnerRequestCancellationNotice(userA, userB, package)); } } } @@ -1411,7 +1411,7 @@ public void OnlyShowsOwnersWhoAllowReceivingEmails() } [Fact] - public async Task HtmlEncodesMessageContent() + public void HtmlEncodesMessageContent() { // arrange var packageId = "factory"; @@ -1423,7 +1423,7 @@ public async Task HtmlEncodesMessageContent() var messageService = new Mock(); string sentMessage = null; messageService.Setup( - s => s.SendContactOwnersMessageAsync( + s => s.SendContactOwnersMessage( It.IsAny(), It.IsAny(), It.IsAny(), @@ -1434,8 +1434,7 @@ public async Task HtmlEncodesMessageContent() { sentPackageUrl = packageUrl; sentMessage = msg; - }) - .Returns(Task.CompletedTask); + }); var package = new Package { PackageRegistration = new PackageRegistration {Id = packageId}, @@ -1456,14 +1455,14 @@ public async Task HtmlEncodesMessageContent() }; // act - var result = await controller.ContactOwners(packageId, packageVersion, model) as RedirectToRouteResult; + var result = controller.ContactOwners(packageId, packageVersion, model) as RedirectToRouteResult; Assert.Equal(encodedMessage, sentMessage); Assert.Equal(controller.Url.Package(package, false), sentPackageUrl); } [Fact] - public async Task CallsSendContactOwnersMessageWithUserInfo() + public void CallsSendContactOwnersMessageWithUserInfo() { // arrange var packageId = "factory"; @@ -1472,13 +1471,12 @@ public async Task CallsSendContactOwnersMessageWithUserInfo() var messageService = new Mock(); messageService.Setup( - s => s.SendContactOwnersMessageAsync( + s => s.SendContactOwnersMessage( It.IsAny(), It.IsAny(), It.IsAny(), message, - It.IsAny(), false)) - .Returns(Task.CompletedTask); + It.IsAny(), false)); var package = new Package { PackageRegistration = new PackageRegistration { Id = packageId }, @@ -1499,7 +1497,7 @@ public async Task CallsSendContactOwnersMessageWithUserInfo() }; // act - var result = await controller.ContactOwners(packageId, packageVersion, model) as RedirectToRouteResult; + var result = controller.ContactOwners(packageId, packageVersion, model) as RedirectToRouteResult; // assert Assert.NotNull(result); @@ -2643,7 +2641,7 @@ public async Task FormSendsMessageToGalleryOwnerWithEmailOnlyWhenUnauthenticated Assert.NotNull(result); messageService.Verify( - s => s.ReportAbuseAsync( + s => s.ReportAbuse( It.Is( r => r.FromAddress.Address == ReporterEmailAddress && r.Package == package @@ -2677,7 +2675,7 @@ public async Task FormSendsMessageToGalleryOwnerWithUserInfoWhenAuthenticated(Us Assert.NotNull(result); messageService.Verify( - s => s.ReportAbuseAsync( + s => s.ReportAbuse( It.Is( r => r.Message == EncodedMessage && r.FromAddress.Address == currentUser.EmailAddress @@ -2691,7 +2689,7 @@ public Task GetReportAbuseFormResult(User currentUser, User owner, { messageService = new Mock(); messageService.Setup( - s => s.ReportAbuseAsync(It.Is(r => r.Message == UnencodedMessage))); + s => s.ReportAbuse(It.Is(r => r.Message == UnencodedMessage))); package = new Package { PackageRegistration = new PackageRegistration { Id = PackageId, Owners = new[] { owner } }, @@ -2930,9 +2928,8 @@ public async Task HtmlEncodesMessageContent(User currentUser, User owner) ReportPackageRequest reportRequest = null; _messageService - .Setup(s => s.ReportMyPackageAsync(It.IsAny())) - .Callback(r => reportRequest = r) - .Returns(Task.CompletedTask); + .Setup(s => s.ReportMyPackage(It.IsAny())) + .Callback(r => reportRequest = r); // Act await _controller.ReportMyPackage( @@ -3057,7 +3054,7 @@ public async Task AllowsPackageDelete(User currentUser, User owner) currentUser.Username), Times.Once); _messageService.Verify( - x => x.SendPackageDeletedNoticeAsync( + x => x.SendPackageDeletedNotice( _package, It.IsAny(), It.IsAny()), @@ -3065,7 +3062,7 @@ public async Task AllowsPackageDelete(User currentUser, User owner) Assert.Equal(Strings.UserPackageDeleteCompleteTransientMessage, _controller.TempData["Message"]); _messageService.Verify( - x => x.ReportMyPackageAsync(It.IsAny()), + x => x.ReportMyPackage(It.IsAny()), Times.Never); } @@ -3117,13 +3114,13 @@ public async Task TreatsDeleteFailureAsNormalRequest(User currentUser, User owne It.IsAny()), Times.Never); _messageService.Verify( - x => x.SendPackageDeletedNoticeAsync( + x => x.SendPackageDeletedNotice( It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); _messageService.Verify( - x => x.ReportMyPackageAsync(It.IsAny()), + x => x.ReportMyPackage(It.IsAny()), Times.Once); } @@ -3283,7 +3280,7 @@ public async Task DoesNotRequireDeleteDecision(User currentUser, User owner, Rep It.IsAny()), Times.Never); _messageService.Verify( - x => x.ReportMyPackageAsync(It.IsAny()), + x => x.ReportMyPackage(It.IsAny()), Times.Once); } @@ -3323,7 +3320,7 @@ public async Task IgnoresDeleteRequestWhenNotAllowed(User currentUser, User owne It.IsAny()), Times.Never); _messageService.Verify( - x => x.ReportMyPackageAsync(It.IsAny()), + x => x.ReportMyPackage(It.IsAny()), Times.Once); } } @@ -5347,7 +5344,7 @@ public async Task WillSendPackageAddedNotice(bool asyncValidationEnabled, bool b // Assert fakeMessageService - .Verify(ms => ms.SendPackageAddedNoticeAsync(fakePackage, It.IsAny(), It.IsAny(), It.IsAny()), + .Verify(ms => ms.SendPackageAddedNotice(fakePackage, It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(callExpected ? 1 : 0)); } } diff --git a/tests/NuGetGallery.Facts/Controllers/PagesControllerFacts.cs b/tests/NuGetGallery.Facts/Controllers/PagesControllerFacts.cs index 91841165fc..16c4f46b1c 100644 --- a/tests/NuGetGallery.Facts/Controllers/PagesControllerFacts.cs +++ b/tests/NuGetGallery.Facts/Controllers/PagesControllerFacts.cs @@ -43,7 +43,7 @@ public async Task HtmlEncodesTheSupportContactEmail() // assert: the HTML encoded message was passed to the service GetMock() - .Verify(m => m.SendContactSupportEmailAsync( + .Verify(m => m.SendContactSupportEmail( It.Is(c => c.Message == expectedMessage && c.SubjectLine == expectedSubjectLine))); diff --git a/tests/NuGetGallery.Facts/Controllers/UsersControllerFacts.cs b/tests/NuGetGallery.Facts/Controllers/UsersControllerFacts.cs index a8e9f87680..6d80ab7319 100644 --- a/tests/NuGetGallery.Facts/Controllers/UsersControllerFacts.cs +++ b/tests/NuGetGallery.Facts/Controllers/UsersControllerFacts.cs @@ -258,8 +258,7 @@ public async Task SendsEmailWithPasswordResetUrl() PasswordResetTokenExpirationDate = DateTime.UtcNow.AddHours(Constants.PasswordResetTokenExpirationHours) }; GetMock() - .Setup(s => s.SendPasswordResetInstructionsAsync(user, resetUrl, true)) - .Returns(Task.CompletedTask); + .Setup(s => s.SendPasswordResetInstructions(user, resetUrl, true)); GetMock() .Setup(s => s.FindByEmailAddress("user")) .Returns(user); @@ -272,7 +271,7 @@ public async Task SendsEmailWithPasswordResetUrl() await controller.ForgotPassword(model); GetMock() - .Verify(s => s.SendPasswordResetInstructionsAsync(user, resetUrl, true)); + .Verify(s => s.SendPasswordResetInstructions(user, resetUrl, true)); } [Fact] @@ -448,7 +447,7 @@ public async Task SendsPasswordAddedMessageWhenForgotFalse() await controller.ResetPassword("user", "token", model, forgot: false); GetMock() - .Verify(m => m.SendCredentialAddedNoticeAsync(cred.User, + .Verify(m => m.SendCredentialAddedNotice(cred.User, It.Is(c => c.Type == cred.Type))); } @@ -953,7 +952,7 @@ public async Task SendsNotificationMailToUser() expirationInDays: 90); GetMock() - .Verify(m => m.SendCredentialAddedNoticeAsync(user, It.IsAny())); + .Verify(m => m.SendCredentialAddedNotice(user, It.IsAny())); } } @@ -1310,7 +1309,7 @@ public async Task GivenDisabledPasswordLogin_RemovesCredentialAndSendsNotice() .Verifiable(); GetMock() .Setup(m => - m.SendCredentialRemovedNoticeAsync( + m.SendCredentialRemovedNotice( user, It.Is(c => c.Type == CredentialTypes.External.MicrosoftAccount))) .Verifiable(); @@ -1379,12 +1378,8 @@ public async Task GivenNoOldPassword_ItSendsAPasswordSetEmail() string actualConfirmUrl = null; GetMock() - .Setup(a => a.SendPasswordResetInstructionsAsync(user, It.IsAny(), false)) - .Returns((_, url, __) => - { - actualConfirmUrl = url; - return Task.CompletedTask; - }) + .Setup(a => a.SendPasswordResetInstructions(user, It.IsAny(), false)) + .Callback((_, url, __) => actualConfirmUrl = url) .Verifiable(); var controller = GetController(); @@ -1515,10 +1510,9 @@ public async Task GivenValidRequest_ItRemovesCredAndSendsNotificationToUser() .Completes() .Verifiable(); GetMock() - .Setup(m => m.SendCredentialRemovedNoticeAsync( + .Setup(m => m.SendCredentialRemovedNotice( user, It.Is(c => c.Type == cred.Type))) - .Returns(Task.CompletedTask) .Verifiable(); var controller = GetController(); @@ -1622,10 +1616,9 @@ public async Task GivenValidRequest_ItRemovesCredAndSendsNotificationToUser() .Verifiable(); GetMock() .Setup(m => - m.SendCredentialRemovedNoticeAsync( + m.SendCredentialRemovedNotice( user, It.Is(c => c.Type == CredentialTypes.External.MicrosoftAccount))) - .Returns(Task.CompletedTask) .Verifiable(); var controller = GetController(); @@ -2312,7 +2305,7 @@ public async Task SucceedsIfSupportRequestIsAdded(bool successOnSentRequest) Assert.Equal(!successOnSentRequest, tempData); GetMock() .Verify( - stub => stub.SendAccountDeleteNoticeAsync(testUser), + stub => stub.SendAccountDeleteNotice(testUser), successOnSentRequest ? Times.Once() : Times.Never()); } @@ -2440,7 +2433,7 @@ public async Task WhenCanTransformReturnsFalse_ShowsError() GetMock() .Verify(m => - m.SendOrganizationTransformRequestAsync( + m.SendOrganizationTransformRequest( It.IsAny(), It.IsAny(), It.IsAny(), @@ -2450,7 +2443,7 @@ public async Task WhenCanTransformReturnsFalse_ShowsError() GetMock() .Verify( - m => m.SendOrganizationTransformInitiatedNoticeAsync( + m => m.SendOrganizationTransformInitiatedNotice( It.IsAny(), It.IsAny(), It.IsAny()), @@ -2485,7 +2478,7 @@ public async Task WhenAdminIsNotFound_ShowsError() GetMock() .Verify(m => - m.SendOrganizationTransformRequestAsync( + m.SendOrganizationTransformRequest( It.IsAny(), It.IsAny(), It.IsAny(), @@ -2495,7 +2488,7 @@ public async Task WhenAdminIsNotFound_ShowsError() GetMock() .Verify(m => - m.SendOrganizationTransformInitiatedNoticeAsync( + m.SendOrganizationTransformInitiatedNotice( It.IsAny(), It.IsAny(), It.IsAny()), @@ -2524,7 +2517,7 @@ public async Task WhenValid_CreatesRequestAndRedirects() Assert.IsType(result); GetMock() - .Verify(m => m.SendOrganizationTransformRequestAsync( + .Verify(m => m.SendOrganizationTransformRequest( It.IsAny(), It.IsAny(), It.IsAny(), @@ -2532,7 +2525,7 @@ public async Task WhenValid_CreatesRequestAndRedirects() It.IsAny())); GetMock() - .Verify(m => m.SendOrganizationTransformInitiatedNoticeAsync( + .Verify(m => m.SendOrganizationTransformInitiatedNotice( It.IsAny(), It.IsAny(), It.IsAny())); @@ -2566,7 +2559,7 @@ public async Task WhenAccountToTransformIsNotFound_ShowsError() GetMock() .Verify(m => - m.SendOrganizationTransformRequestAcceptedNoticeAsync( + m.SendOrganizationTransformRequestAcceptedNotice( It.IsAny(), It.IsAny()), Times.Never()); @@ -2597,7 +2590,7 @@ public async Task WhenCanTransformReturnsFalse_ShowsError() GetMock() .Verify(m => - m.SendOrganizationTransformRequestAcceptedNoticeAsync( + m.SendOrganizationTransformRequestAcceptedNotice( It.IsAny(), It.IsAny()), Times.Never()); @@ -2629,7 +2622,7 @@ public async Task WhenUserServiceReturnsFalse_ShowsError() GetMock() .Verify(m => - m.SendOrganizationTransformRequestAcceptedNoticeAsync( + m.SendOrganizationTransformRequestAcceptedNotice( It.IsAny(), It.IsAny()), Times.Never()); @@ -2656,7 +2649,7 @@ public async Task WhenUserServiceReturnsSuccess_Redirects() GetMock() .Verify(m => - m.SendOrganizationTransformRequestAcceptedNoticeAsync( + m.SendOrganizationTransformRequestAcceptedNotice( It.IsAny(), It.IsAny())); @@ -2718,7 +2711,7 @@ public async Task WhenAccountToTransformIsNotFound_ShowsError() GetMock() .Verify(m => - m.SendOrganizationTransformRequestRejectedNoticeAsync( + m.SendOrganizationTransformRequestRejectedNotice( It.IsAny(), It.IsAny()), Times.Never()); @@ -2745,7 +2738,7 @@ public async Task WhenUserServiceReturnsFalse_ShowsError() GetMock() .Verify(m => - m.SendOrganizationTransformRequestRejectedNoticeAsync( + m.SendOrganizationTransformRequestRejectedNotice( It.IsAny(), It.IsAny()), Times.Never()); @@ -2774,7 +2767,7 @@ public async Task WhenUserServiceReturnsSuccess_Redirects() GetMock() .Verify(m => - m.SendOrganizationTransformRequestRejectedNoticeAsync( + m.SendOrganizationTransformRequestRejectedNotice( It.IsAny(), It.IsAny())); @@ -2826,7 +2819,7 @@ public async Task WhenUserServiceReturnsFalse_ShowsError() GetMock() .Verify(m => - m.SendOrganizationTransformRequestCancelledNoticeAsync( + m.SendOrganizationTransformRequestCancelledNotice( It.IsAny(), It.IsAny()), Times.Never()); @@ -2854,7 +2847,7 @@ public async Task WhenUserServiceReturnsSuccess_Redirects() GetMock() .Verify(m => - m.SendOrganizationTransformRequestCancelledNoticeAsync( + m.SendOrganizationTransformRequestCancelledNotice( It.IsAny(), It.IsAny())); diff --git a/tests/NuGetGallery.Facts/Services/MessageServiceFacts.cs b/tests/NuGetGallery.Facts/Services/MessageServiceFacts.cs index a4cf6a3df9..ee2e7daa51 100644 --- a/tests/NuGetGallery.Facts/Services/MessageServiceFacts.cs +++ b/tests/NuGetGallery.Facts/Services/MessageServiceFacts.cs @@ -16,7 +16,6 @@ using NuGet.Versioning; using NuGet.Services.Validation; using NuGet.Services.Validation.Issues; -using System.Threading.Tasks; namespace NuGetGallery { @@ -29,7 +28,7 @@ public class TheReportAbuseMethod : TestContainer { [Fact] - public async Task WillSendEmailToGalleryOwner() + public void WillSendEmailToGalleryOwner() { // Arrange var from = new MailAddress("legit@example.com", "too"); @@ -42,7 +41,7 @@ public async Task WillSendEmailToGalleryOwner() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.ReportAbuseAsync( + messageService.ReportAbuse( new ReportPackageRequest { AlreadyContactedOwners = true, @@ -70,7 +69,7 @@ await messageService.ReportAbuseAsync( } [Fact] - public async Task WillCopySenderIfAsked() + public void WillCopySenderIfAsked() { var from = new MailAddress("legit@example.com", "too"); var package = new Package @@ -97,7 +96,7 @@ public async Task WillCopySenderIfAsked() Url = TestUtility.MockUrlHelper(), CopySender = true, }; - await messageService.ReportAbuseAsync(reportPackageRequest); + messageService.ReportAbuse(reportPackageRequest); var message = messageService.MockMailSender.Sent.Single(); Assert.Equal(TestGalleryOwner, message.To.Single()); @@ -112,7 +111,7 @@ public class TheReportMyPackageMethod : TestContainer { [Fact] - public async Task WillSendEmailToGalleryOwner() + public void WillSendEmailToGalleryOwner() { var from = new MailAddress("legit@example.com", "too"); var owner = new User @@ -132,7 +131,7 @@ public async Task WillSendEmailToGalleryOwner() var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.ReportMyPackageAsync( + messageService.ReportMyPackage( new ReportPackageRequest { FromAddress = from, @@ -158,7 +157,7 @@ await messageService.ReportMyPackageAsync( } [Fact] - public async Task WillCopySenderIfAsked() + public void WillCopySenderIfAsked() { var from = new MailAddress("legit@example.com", "too"); var package = new Package @@ -185,7 +184,7 @@ public async Task WillCopySenderIfAsked() Url = TestUtility.MockUrlHelper(), CopySender = true, }; - await messageService.ReportMyPackageAsync(reportPackageRequest); + messageService.ReportMyPackage(reportPackageRequest); var message = messageService.MockMailSender.Sent.Single(); Assert.Equal(TestGalleryOwner, message.To.Single()); @@ -200,7 +199,7 @@ public class TheSendContactOwnersMessageMethod : TestContainer { [Fact] - public async Task WillCopySenderIfAsked() + public void WillCopySenderIfAsked() { // arrange var packageId = "smangit"; @@ -228,7 +227,7 @@ public async Task WillCopySenderIfAsked() var messageService = TestableMessageService.Create(GetConfigurationService()); // act - await messageService.SendContactOwnersMessageAsync(from, package, "http://someurl/", "Test message", "http://someotherurl/", true); + messageService.SendContactOwnersMessage(from, package, "http://someurl/", "Test message", "http://someotherurl/", true); var messages = messageService.MockMailSender.Sent; // assert @@ -245,7 +244,7 @@ public async Task WillCopySenderIfAsked() } [Fact] - public async Task WillSendEmailToAllOwners() + public void WillSendEmailToAllOwners() { var id = "smangit"; var version = "1.0.0"; @@ -271,7 +270,7 @@ public async Task WillSendEmailToAllOwners() var messageService = TestableMessageService.Create(GetConfigurationService()); var packageUrl = "http://packageUrl/"; - await messageService.SendContactOwnersMessageAsync(from, package, packageUrl, "Test message", "http://emailSettingsUrl/", false); + messageService.SendContactOwnersMessage(from, package, packageUrl, "Test message", "http://emailSettingsUrl/", false); var message = messageService.MockMailSender.Sent.Last(); Assert.Equal(owner1Email, message.To[0].Address); @@ -286,7 +285,7 @@ public async Task WillSendEmailToAllOwners() } [Fact] - public async Task WillNotSendEmailToOwnerThatOptsOut() + public void WillNotSendEmailToOwnerThatOptsOut() { // arrange var packageId = "smangit"; @@ -313,7 +312,7 @@ public async Task WillNotSendEmailToOwnerThatOptsOut() var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendContactOwnersMessageAsync(from, package, "http://someurl/", "Test message", "http://someotherurl/", false); + messageService.SendContactOwnersMessage(from, package, "http://someurl/", "Test message", "http://someotherurl/", false); var message = messageService.MockMailSender.Sent.Last(); // assert @@ -322,7 +321,7 @@ public async Task WillNotSendEmailToOwnerThatOptsOut() } [Fact] - public async Task WillNotAttemptToSendIfNoOwnersAllow() + public void WillNotAttemptToSendIfNoOwnersAllow() { // arrange var packageId = "smangit"; @@ -348,14 +347,14 @@ public async Task WillNotAttemptToSendIfNoOwnersAllow() }; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendContactOwnersMessageAsync(from, package, "http://someurl/", "Test message", "http://someotherurl/", false); + messageService.SendContactOwnersMessage(from, package, "http://someurl/", "Test message", "http://someotherurl/", false); // assert Assert.Empty(messageService.MockMailSender.Sent); } [Fact] - public async Task WillNotCopySenderIfNoOwnersAllow() + public void WillNotCopySenderIfNoOwnersAllow() { // arrange var packageId = "smangit"; @@ -381,7 +380,7 @@ public async Task WillNotCopySenderIfNoOwnersAllow() }; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendContactOwnersMessageAsync(from, package, "http://someurl/", "Test message", "http://someotherurl/", false); + messageService.SendContactOwnersMessage(from, package, "http://someurl/", "Test message", "http://someotherurl/", false); // assert Assert.Empty(messageService.MockMailSender.Sent); @@ -394,14 +393,14 @@ public class TheSendNewAccountEmailMethod [Theory] [InlineData(false)] [InlineData(true)] - public async Task WillSendEmailToNewUser(bool isOrganization) + public void WillSendEmailToNewUser(bool isOrganization) { var unconfirmedEmailAddress = "unconfirmed@unconfirmed.com"; var user = isOrganization ? new Organization("organization") : new User("user"); user.UnconfirmedEmailAddress = unconfirmedEmailAddress; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendNewAccountEmailAsync(user, "http://example.com/confirmation-token-url"); + messageService.SendNewAccountEmail(user, "http://example.com/confirmation-token-url"); var message = messageService.MockMailSender.Sent.Last(); Assert.Equal(unconfirmedEmailAddress, message.To[0].Address); @@ -418,7 +417,7 @@ public class TheSendEmailChangeConfirmationNoticeMethod [Theory] [InlineData(false)] [InlineData(true)] - public async Task WillSendEmail(bool isOrganization) + public void WillSendEmail(bool isOrganization) { var unconfirmedEmailAddress = "unconfirmed@unconfirmed.com"; var user = isOrganization ? new Organization("organization") : new User("user"); @@ -426,7 +425,7 @@ public async Task WillSendEmail(bool isOrganization) var tokenUrl = "http://example.com/confirmation-token-url"; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendEmailChangeConfirmationNoticeAsync(user, tokenUrl); + messageService.SendEmailChangeConfirmationNotice(user, tokenUrl); var message = messageService.MockMailSender.Sent.Last(); Assert.Equal(user.UnconfirmedEmailAddress, message.To[0].Address); @@ -442,7 +441,7 @@ public class TheSendEmailChangeNoticeToPreviousEmailAddressMethod [Theory] [InlineData(false)] [InlineData(true)] - public async Task WillSendEmail(bool isOrganization) + public void WillSendEmail(bool isOrganization) { var newEmail = "new@email.com"; var user = isOrganization ? new Organization("organization") : new User("user"); @@ -450,7 +449,7 @@ public async Task WillSendEmail(bool isOrganization) var oldEmail = "old@email.com"; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendEmailChangeNoticeToPreviousEmailAddressAsync(user, oldEmail); + messageService.SendEmailChangeNoticeToPreviousEmailAddress(user, oldEmail); var message = messageService.MockMailSender.Sent.Last(); var accountString = isOrganization ? "organization" : "account"; @@ -468,7 +467,7 @@ public class TheSendPackageOwnerRequestMethod [Theory] [InlineData(false)] [InlineData(true)] - public async Task SendsPackageOwnerRequestConfirmationUrl(bool isOrganization) + public void SendsPackageOwnerRequestConfirmationUrl(bool isOrganization) { var to = isOrganization ? GetOrganizationWithRecipients() : new User(); to.Username = "Noob"; @@ -483,7 +482,7 @@ public async Task SendsPackageOwnerRequestConfirmationUrl(bool isOrganization) const string userMessage = "Hello World!"; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageOwnerRequestAsync(from, to, package, packageUrl, confirmationUrl, rejectionUrl, userMessage, string.Empty); + messageService.SendPackageOwnerRequest(from, to, package, packageUrl, confirmationUrl, rejectionUrl, userMessage, string.Empty); var message = messageService.MockMailSender.Sent.Last(); var yourString = isOrganization ? "your organization" : "you"; @@ -509,7 +508,7 @@ public async Task SendsPackageOwnerRequestConfirmationUrl(bool isOrganization) [Theory] [InlineData(false)] [InlineData(true)] - public async Task SendsPackageOwnerRequestConfirmationUrlWithoutUserMessage(bool isOrganization) + public void SendsPackageOwnerRequestConfirmationUrlWithoutUserMessage(bool isOrganization) { var to = isOrganization ? GetOrganizationWithRecipients() : new User(); to.Username = "Noob"; @@ -522,7 +521,7 @@ public async Task SendsPackageOwnerRequestConfirmationUrlWithoutUserMessage(bool const string rejectionUrl = "http://example.com/rejection-token-url"; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageOwnerRequestAsync(from, to, package, packageUrl, confirmationUrl, rejectionUrl, string.Empty, string.Empty); + messageService.SendPackageOwnerRequest(from, to, package, packageUrl, confirmationUrl, rejectionUrl, string.Empty, string.Empty); var message = messageService.MockMailSender.Sent.Last(); Assert.DoesNotContain("The user 'Existing' added the following message for you", message.Body); @@ -531,7 +530,7 @@ public async Task SendsPackageOwnerRequestConfirmationUrlWithoutUserMessage(bool [Theory] [InlineData(false)] [InlineData(true)] - public async Task DoesNotSendRequestIfUserDoesNotAllowEmails(bool isOrganization) + public void DoesNotSendRequestIfUserDoesNotAllowEmails(bool isOrganization) { var to = isOrganization ? GetOrganizationWithoutRecipients() : new User(); to.Username = "Noob"; @@ -544,7 +543,7 @@ public async Task DoesNotSendRequestIfUserDoesNotAllowEmails(bool isOrganization const string rejectionUrl = "http://example.com/rejection-token-url"; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageOwnerRequestAsync(from, to, package, packageUrl, confirmationUrl, rejectionUrl, string.Empty, string.Empty); + messageService.SendPackageOwnerRequest(from, to, package, packageUrl, confirmationUrl, rejectionUrl, string.Empty, string.Empty); Assert.Empty(messageService.MockMailSender.Sent); } @@ -554,7 +553,7 @@ public class TheSendPackageOwnerRequestInitiatedNoticeMethod : TestContainer { [Fact] - public async Task SendsNotice() + public void SendsNotice() { var requestingOwner = new User("Existing") { EmailAddress = "existing-owner@example.com" }; var receivingOwner = new User("Receiving") @@ -575,7 +574,7 @@ public async Task SendsNotice() }; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageOwnerRequestInitiatedNoticeAsync(requestingOwner, receivingOwner, newOwner, package, cancelUrl); + messageService.SendPackageOwnerRequestInitiatedNotice(requestingOwner, receivingOwner, newOwner, package, cancelUrl); var message = messageService.MockMailSender.Sent.Last(); Assert.Equal(receivingOwner.EmailAddress, message.To[0].Address); @@ -587,7 +586,7 @@ public async Task SendsNotice() } [Fact] - public async Task DoesNotSendNoticeIfUserDoesNotAllowEmails() + public void DoesNotSendNoticeIfUserDoesNotAllowEmails() { var requestingOwner = new User("Existing") { EmailAddress = "existing-owner@example.com" }; var receivingOwner = new User("Receiving") @@ -608,7 +607,7 @@ public async Task DoesNotSendNoticeIfUserDoesNotAllowEmails() }; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageOwnerRequestInitiatedNoticeAsync(requestingOwner, receivingOwner, newOwner, package, cancelUrl); + messageService.SendPackageOwnerRequestInitiatedNotice(requestingOwner, receivingOwner, newOwner, package, cancelUrl); Assert.Empty(messageService.MockMailSender.Sent); } @@ -620,7 +619,7 @@ public class TheSendPackageOwnerRequestRejectionNoticeMethod [Theory] [InlineData(false)] [InlineData(true)] - public async Task SendsNotice(bool isOrganization) + public void SendsNotice(bool isOrganization) { var requestingOwner = isOrganization ? GetOrganizationWithRecipients() : new User(); requestingOwner.Username = "Existing"; @@ -637,7 +636,7 @@ public async Task SendsNotice(bool isOrganization) }; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageOwnerRequestRejectionNoticeAsync(requestingOwner, newOwner, package); + messageService.SendPackageOwnerRequestRejectionNotice(requestingOwner, newOwner, package); var message = messageService.MockMailSender.Sent.Last(); var yourString = isOrganization ? "your organization's" : "your"; @@ -659,7 +658,7 @@ public async Task SendsNotice(bool isOrganization) [Theory] [InlineData(false)] [InlineData(true)] - public async Task DoesNotSendNoticeIfUserDoesNotAllowEmails(bool isOrganization) + public void DoesNotSendNoticeIfUserDoesNotAllowEmails(bool isOrganization) { var requestingOwner = isOrganization ? GetOrganizationWithoutRecipients() : new User(); requestingOwner.Username = "Existing"; @@ -676,7 +675,7 @@ public async Task DoesNotSendNoticeIfUserDoesNotAllowEmails(bool isOrganization) }; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageOwnerRequestRejectionNoticeAsync(requestingOwner, newOwner, package); + messageService.SendPackageOwnerRequestRejectionNotice(requestingOwner, newOwner, package); Assert.Empty(messageService.MockMailSender.Sent); } @@ -688,7 +687,7 @@ public class TheSendPackageOwnerRequestCancellationNoticeMethod [Theory] [InlineData(false)] [InlineData(true)] - public async Task SendsNotice(bool isOrganization) + public void SendsNotice(bool isOrganization) { var requestingOwner = new User { Username = "Existing", EmailAddress = "existing-owner@example.com" }; var newOwner = isOrganization ? GetOrganizationWithRecipients() : new User(); @@ -698,7 +697,7 @@ public async Task SendsNotice(bool isOrganization) var package = new PackageRegistration { Id = "CoolStuff" }; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageOwnerRequestCancellationNoticeAsync(requestingOwner, newOwner, package); + messageService.SendPackageOwnerRequestCancellationNotice(requestingOwner, newOwner, package); var message = messageService.MockMailSender.Sent.Last(); var yourString = isOrganization ? "your organization" : "you"; @@ -720,7 +719,7 @@ public async Task SendsNotice(bool isOrganization) [Theory] [InlineData(false)] [InlineData(true)] - public async Task DoesNotSendNoticeIfUserDoesNotAllowEmails(bool isOrganization) + public void DoesNotSendNoticeIfUserDoesNotAllowEmails(bool isOrganization) { var requestingOwner = new User { Username = "Existing", EmailAddress = "existing-owner@example.com" }; @@ -738,7 +737,7 @@ public async Task DoesNotSendNoticeIfUserDoesNotAllowEmails(bool isOrganization) }; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageOwnerRequestCancellationNoticeAsync(requestingOwner, newOwner, package); + messageService.SendPackageOwnerRequestCancellationNotice(requestingOwner, newOwner, package); Assert.Empty(messageService.MockMailSender.Sent); } @@ -750,7 +749,7 @@ public class TheSendPackageOwnerAddedNoticeMethod [Theory] [InlineData(false)] [InlineData(true)] - public async Task SendsPackageOwnerAddedNotice(bool isOrganization) + public void SendsPackageOwnerAddedNotice(bool isOrganization) { // Arrange var toUser = isOrganization ? GetOrganizationWithRecipients() : new User(); @@ -763,7 +762,7 @@ public async Task SendsPackageOwnerAddedNotice(bool isOrganization) var packageUrl = "packageUrl"; // Act - await messageService.SendPackageOwnerAddedNoticeAsync(toUser, newUser, package, packageUrl); + messageService.SendPackageOwnerAddedNotice(toUser, newUser, package, packageUrl); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -783,7 +782,7 @@ public async Task SendsPackageOwnerAddedNotice(bool isOrganization) [Theory] [InlineData(false)] [InlineData(true)] - public async Task DoesNotSendPackageOwnerAddedNoticeIfUserDoesNotAllowEmails(bool isOrganization) + public void DoesNotSendPackageOwnerAddedNoticeIfUserDoesNotAllowEmails(bool isOrganization) { // Arrange var toUser = isOrganization ? GetOrganizationWithoutRecipients() : new User(); @@ -795,7 +794,7 @@ public async Task DoesNotSendPackageOwnerAddedNoticeIfUserDoesNotAllowEmails(boo var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendPackageOwnerAddedNoticeAsync(toUser, newUser, package, "packageUrl"); + messageService.SendPackageOwnerAddedNotice(toUser, newUser, package, "packageUrl"); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -808,7 +807,7 @@ public class TheSendPackageOwnerRemovedNoticeMethod [Theory] [InlineData(false)] [InlineData(true)] - public async Task SendsPackageOwnerRemovedNotice(bool isOrganization) + public void SendsPackageOwnerRemovedNotice(bool isOrganization) { var to = isOrganization ? GetOrganizationWithRecipients() : new User(); to.Username = "Noob"; @@ -818,7 +817,7 @@ public async Task SendsPackageOwnerRemovedNotice(bool isOrganization) var package = new PackageRegistration { Id = "CoolStuff" }; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageOwnerRemovedNoticeAsync(from, to, package); + messageService.SendPackageOwnerRemovedNotice(from, to, package); var message = messageService.MockMailSender.Sent.Last(); if (isOrganization) @@ -838,7 +837,7 @@ public async Task SendsPackageOwnerRemovedNotice(bool isOrganization) [Theory] [InlineData(false)] [InlineData(true)] - public async Task DoesNotSendRemovedNoticeIfUserDoesNotAllowEmails(bool isOrganization) + public void DoesNotSendRemovedNoticeIfUserDoesNotAllowEmails(bool isOrganization) { var to = isOrganization ? GetOrganizationWithoutRecipients() : new User(); to.Username = "Noob"; @@ -848,7 +847,7 @@ public async Task DoesNotSendRemovedNoticeIfUserDoesNotAllowEmails(bool isOrgani var package = new PackageRegistration { Id = "CoolStuff" }; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageOwnerRemovedNoticeAsync(from, to, package); + messageService.SendPackageOwnerRemovedNotice(from, to, package); Assert.Empty(messageService.MockMailSender.Sent); } @@ -863,12 +862,12 @@ public class TheSendResetPasswordInstructionsMethod : TestContainer { [Fact] - public async Task WillSendInstructions() + public void WillSendInstructions() { var user = new User { EmailAddress = "legit@example.com", Username = "too" }; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPasswordResetInstructionsAsync(user, "http://example.com/pwd-reset-token-url", true); + messageService.SendPasswordResetInstructions(user, "http://example.com/pwd-reset-token-url", true); var message = messageService.MockMailSender.Sent.Last(); Assert.Equal("legit@example.com", message.To[0].Address); @@ -890,7 +889,7 @@ public TheSendCredentialRemovedNoticeMethod() } [Fact] - public async Task UsesProviderNounToDescribeCredentialIfPresent() + public void UsesProviderNounToDescribeCredentialIfPresent() { var user = new User { EmailAddress = "legit@example.com", Username = "foo" }; var cred = new CredentialBuilder().CreateExternalCredential("MicrosoftAccount", "abc123", "Test User"); @@ -898,7 +897,7 @@ public async Task UsesProviderNounToDescribeCredentialIfPresent() var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendCredentialRemovedNoticeAsync(user, _authenticationService.DescribeCredential(cred)); + messageService.SendCredentialRemovedNotice(user, _authenticationService.DescribeCredential(cred)); var message = messageService.MockMailSender.Sent.Last(); Assert.Equal(user.ToMailAddress(), message.To[0]); @@ -908,13 +907,13 @@ public async Task UsesProviderNounToDescribeCredentialIfPresent() } [Fact] - public async Task UsesTypeCaptionToDescribeCredentialIfNoProviderNounPresent() + public void UsesTypeCaptionToDescribeCredentialIfNoProviderNounPresent() { var user = new User { EmailAddress = "legit@example.com", Username = "foo" }; var cred = new CredentialBuilder().CreatePasswordCredential("bogus"); var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendCredentialRemovedNoticeAsync(user, _authenticationService.DescribeCredential(cred)); + messageService.SendCredentialRemovedNotice(user, _authenticationService.DescribeCredential(cred)); var message = messageService.MockMailSender.Sent.Last(); Assert.Equal(user.ToMailAddress(), message.To[0]); @@ -924,7 +923,7 @@ public async Task UsesTypeCaptionToDescribeCredentialIfNoProviderNounPresent() } [Fact] - public async Task ApiKeyRemovedMessageIsCorrect() + public void ApiKeyRemovedMessageIsCorrect() { var user = new User { EmailAddress = "legit@example.com", Username = "foo" }; var cred = TestCredentialHelper.CreateV2ApiKey(Guid.NewGuid(), TimeSpan.FromDays(1)).WithDefaultScopes(); @@ -932,7 +931,7 @@ public async Task ApiKeyRemovedMessageIsCorrect() cred.User = user; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendCredentialRemovedNoticeAsync(user, _authenticationService.DescribeCredential(cred)); + messageService.SendCredentialRemovedNotice(user, _authenticationService.DescribeCredential(cred)); var message = messageService.MockMailSender.Sent.Last(); Assert.Equal(user.ToMailAddress(), message.To[0]); @@ -953,14 +952,14 @@ public TheSendCredentialAddedNoticeMethod() } [Fact] - public async Task UsesProviderNounToDescribeCredentialIfPresent() + public void UsesProviderNounToDescribeCredentialIfPresent() { var user = new User { EmailAddress = "legit@example.com", Username = "foo" }; var cred = new CredentialBuilder().CreateExternalCredential("MicrosoftAccount", "abc123", "Test User"); const string MicrosoftAccountCredentialName = "Microsoft account"; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendCredentialAddedNoticeAsync(user, _authenticationService.DescribeCredential(cred)); + messageService.SendCredentialAddedNotice(user, _authenticationService.DescribeCredential(cred)); var message = messageService.MockMailSender.Sent.Last(); Assert.Equal(user.ToMailAddress(), message.To[0]); @@ -970,13 +969,13 @@ public async Task UsesProviderNounToDescribeCredentialIfPresent() } [Fact] - public async Task UsesTypeCaptionToDescribeCredentialIfNoProviderNounPresent() + public void UsesTypeCaptionToDescribeCredentialIfNoProviderNounPresent() { var user = new User { EmailAddress = "legit@example.com", Username = "foo" }; var cred = new CredentialBuilder().CreatePasswordCredential("bogus"); var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendCredentialAddedNoticeAsync(user, _authenticationService.DescribeCredential(cred)); + messageService.SendCredentialAddedNotice(user, _authenticationService.DescribeCredential(cred)); var message = messageService.MockMailSender.Sent.Last(); Assert.Equal(user.ToMailAddress(), message.To[0]); @@ -986,7 +985,7 @@ public async Task UsesTypeCaptionToDescribeCredentialIfNoProviderNounPresent() } [Fact] - public async Task ApiKeyAddedMessageIsCorrect() + public void ApiKeyAddedMessageIsCorrect() { var user = new User { EmailAddress = "legit@example.com", Username = "foo" }; var cred = TestCredentialHelper.CreateV2ApiKey(Guid.NewGuid(), TimeSpan.FromDays(1)).WithDefaultScopes(); @@ -994,7 +993,7 @@ public async Task ApiKeyAddedMessageIsCorrect() cred.User = user; var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendCredentialAddedNoticeAsync(user, _authenticationService.DescribeCredential(cred)); + messageService.SendCredentialAddedNotice(user, _authenticationService.DescribeCredential(cred)); var message = messageService.MockMailSender.Sent.Last(); Assert.Equal(user.ToMailAddress(), message.To[0]); @@ -1014,7 +1013,7 @@ public class TheSendPackageAddedNoticeMethod [InlineData("1.2.3+metadata")] [InlineData("1.2.3-alpha+metadata")] [InlineData("1.2.3-alpha.1+metadata")] - public async Task WillSendEmailToAllOwners(string version) + public void WillSendEmailToAllOwners(string version) { // Arrange var nugetVersion = new NuGetVersion(version); @@ -1040,7 +1039,7 @@ public async Task WillSendEmailToAllOwners(string version) var packageUrl = $"https://localhost/packages/{packageRegistration.Id}/{nugetVersion.ToNormalizedString()}"; var supportUrl = $"https://localhost/packages/{packageRegistration.Id}/{nugetVersion.ToNormalizedString()}/ReportMyPackage"; var emailSettingsUrl = "https://localhost/account"; - await messageService.SendPackageAddedNoticeAsync(package, packageUrl, supportUrl, emailSettingsUrl); + messageService.SendPackageAddedNotice(package, packageUrl, supportUrl, emailSettingsUrl); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1054,7 +1053,7 @@ public async Task WillSendEmailToAllOwners(string version) } [Fact] - public async Task WillNotSendEmailToOwnerThatOptsOut() + public void WillNotSendEmailToOwnerThatOptsOut() { // Arrange var packageRegistration = new PackageRegistration @@ -1076,7 +1075,7 @@ public async Task WillNotSendEmailToOwnerThatOptsOut() // Act var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageAddedNoticeAsync(package, "http://dummy1", "http://dummy2", "http://dummy3"); + messageService.SendPackageAddedNotice(package, "http://dummy1", "http://dummy2", "http://dummy3"); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1086,7 +1085,7 @@ public async Task WillNotSendEmailToOwnerThatOptsOut() } [Fact] - public async Task WillNotAttemptToSendIfNoOwnersAllow() + public void WillNotAttemptToSendIfNoOwnersAllow() { // Arrange var packageRegistration = new PackageRegistration @@ -1108,7 +1107,7 @@ public async Task WillNotAttemptToSendIfNoOwnersAllow() // Act var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendPackageAddedNoticeAsync(package, "http://dummy1", "http://dummy2", "http://dummy3"); + messageService.SendPackageAddedNotice(package, "http://dummy1", "http://dummy2", "http://dummy3"); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1153,7 +1152,7 @@ public static IEnumerable WillSendEmailToAllOwners_Data [Theory] [MemberData(nameof(WillSendEmailToAllOwners_Data))] - public async Task WillSendEmailToAllOwners(ValidationIssue validationIssue, bool user1PushAllowed, bool user2PushAllowed, bool user1EmailAllowed, bool user2EmailAllowed) + public void WillSendEmailToAllOwners(ValidationIssue validationIssue, bool user1PushAllowed, bool user2PushAllowed, bool user1EmailAllowed, bool user2EmailAllowed) { // Arrange var packageRegistration = new PackageRegistration @@ -1197,7 +1196,7 @@ public async Task WillSendEmailToAllOwners(ValidationIssue validationIssue, bool var supportUrl = $"https://supportUrl"; var announcementsUrl = "https://announcementsUrl"; var twitterUrl = "https://twitterUrl"; - await messageService.SendPackageValidationFailedNoticeAsync(package, packageValidationSet, packageUrl, supportUrl, announcementsUrl, twitterUrl); + messageService.SendPackageValidationFailedNotice(package, packageValidationSet, packageUrl, supportUrl, announcementsUrl, twitterUrl); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1261,7 +1260,7 @@ public class TheSendValidationTakingTooLongNoticeMethod [InlineData("1.2.3+metadata")] [InlineData("1.2.3-alpha+metadata")] [InlineData("1.2.3-alpha.1+metadata")] - public async Task WillSendEmailToAllOwners(string version) + public void WillSendEmailToAllOwners(string version) { // Arrange var nugetVersion = new NuGetVersion(version); @@ -1284,7 +1283,7 @@ public async Task WillSendEmailToAllOwners(string version) // Act var messageService = TestableMessageService.Create(GetConfigurationService()); var packageUrl = $"https://localhost/packages/{packageRegistration.Id}/{nugetVersion.ToNormalizedString()}"; - await messageService.SendValidationTakingTooLongNoticeAsync(package, packageUrl); + messageService.SendValidationTakingTooLongNotice(package, packageUrl); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1308,7 +1307,7 @@ public static IEnumerable EmailSettingsCombinations [Theory] [MemberData(nameof(EmailSettingsCombinations))] - public async Task WillHonorPushSettings(bool user1PushAllowed, bool user2PushAllowed, bool user1EmailAllowed, bool user2EmailAllowed) + public void WillHonorPushSettings(bool user1PushAllowed, bool user2PushAllowed, bool user1EmailAllowed, bool user2EmailAllowed) { // Arrange var packageRegistration = new PackageRegistration @@ -1332,7 +1331,7 @@ public async Task WillHonorPushSettings(bool user1PushAllowed, bool user2PushAll // Act var messageService = TestableMessageService.Create(GetConfigurationService()); - await messageService.SendValidationTakingTooLongNoticeAsync(package, "http://dummy1"); + messageService.SendValidationTakingTooLongNotice(package, "http://dummy1"); // Assert var message = messageService.MockMailSender.Sent.LastOrDefault(); @@ -1360,7 +1359,7 @@ public class TheSendPackageDeletedNoticeMethod : TestContainer { [Fact] - public async Task WillSendEmailToAllOwners() + public void WillSendEmailToAllOwners() { // Arrange var nugetVersion = new NuGetVersion("3.1.0"); @@ -1385,7 +1384,7 @@ public async Task WillSendEmailToAllOwners() var supportUrl = $"https://localhost/packages/{packageRegistration.Id}/{nugetVersion.ToNormalizedString()}/ReportMyPackage"; // Act - await messageService.SendPackageDeletedNoticeAsync(package, packageUrl, supportUrl); + messageService.SendPackageDeletedNotice(package, packageUrl, supportUrl); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1402,7 +1401,7 @@ public class TheSendOrganizationTransformRequestMethod : TestContainer { [Fact] - public async Task WillSendEmailIfEmailAllowed() + public void WillSendEmailIfEmailAllowed() { // Arrange var accountToTransform = new User("bumblebee") { EmailAddress = "bumblebee@transformers.com" }; @@ -1414,7 +1413,7 @@ public async Task WillSendEmailIfEmailAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationTransformRequestAsync(accountToTransform, adminUser, profileUrl, confirmationUrl, rejectionUrl); + messageService.SendOrganizationTransformRequest(accountToTransform, adminUser, profileUrl, confirmationUrl, rejectionUrl); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1429,7 +1428,7 @@ public async Task WillSendEmailIfEmailAllowed() } [Fact] - public async Task WillNotSendEmailIfEmailNotAllowed() + public void WillNotSendEmailIfEmailNotAllowed() { // Arrange var accountToTransform = new User("bumblebee") { EmailAddress = "bumblebee@transformers.com" }; @@ -1441,7 +1440,7 @@ public async Task WillNotSendEmailIfEmailNotAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationTransformRequestAsync(accountToTransform, adminUser, profileUrl, confirmationUrl, rejectionUrl); + messageService.SendOrganizationTransformRequest(accountToTransform, adminUser, profileUrl, confirmationUrl, rejectionUrl); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1452,7 +1451,7 @@ public class TheSendOrganizationTransformInitiatedNoticeMethod : TestContainer { [Fact] - public async Task WillSendEmailIfEmailAllowed() + public void WillSendEmailIfEmailAllowed() { // Arrange var accountToTransform = new User("bumblebee") { EmailAddress = "bumblebee@transformers.com", EmailAllowed = true }; @@ -1462,7 +1461,7 @@ public async Task WillSendEmailIfEmailAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationTransformInitiatedNoticeAsync(accountToTransform, adminUser, cancelUrl); + messageService.SendOrganizationTransformInitiatedNotice(accountToTransform, adminUser, cancelUrl); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1477,7 +1476,7 @@ public async Task WillSendEmailIfEmailAllowed() } [Fact] - public async Task WillNotSendEmailIfEmailNotAllowed() + public void WillNotSendEmailIfEmailNotAllowed() { // Arrange var accountToTransform = new User("bumblebee") { EmailAddress = "bumblebee@transformers.com", EmailAllowed = false }; @@ -1487,7 +1486,7 @@ public async Task WillNotSendEmailIfEmailNotAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationTransformInitiatedNoticeAsync(accountToTransform, adminUser, cancelUrl); + messageService.SendOrganizationTransformInitiatedNotice(accountToTransform, adminUser, cancelUrl); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1498,7 +1497,7 @@ public class TheSendOrganizationTransformRequestAcceptedNoticeMethod : TestContainer { [Fact] - public async Task WillSendEmailIfEmailAllowed() + public void WillSendEmailIfEmailAllowed() { // Arrange var accountToTransform = new User("bumblebee") { EmailAddress = "bumblebee@transformers.com", EmailAllowed = true }; @@ -1507,7 +1506,7 @@ public async Task WillSendEmailIfEmailAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationTransformRequestAcceptedNoticeAsync(accountToTransform, adminUser); + messageService.SendOrganizationTransformRequestAcceptedNotice(accountToTransform, adminUser); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1520,7 +1519,7 @@ public async Task WillSendEmailIfEmailAllowed() } [Fact] - public async Task WillNotSendEmailIfEmailNotAllowed() + public void WillNotSendEmailIfEmailNotAllowed() { // Arrange var accountToTransform = new User("bumblebee") { EmailAddress = "bumblebee@transformers.com", EmailAllowed = false }; @@ -1529,7 +1528,7 @@ public async Task WillNotSendEmailIfEmailNotAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationTransformRequestAcceptedNoticeAsync(accountToTransform, adminUser); + messageService.SendOrganizationTransformRequestAcceptedNotice(accountToTransform, adminUser); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1540,7 +1539,7 @@ public class TheSendOrganizationTransformRequestRejectedNoticeMethod : TestContainer { [Fact] - public async Task WillSendEmailIfEmailAllowed() + public void WillSendEmailIfEmailAllowed() { // Arrange var accountToTransform = new User("bumblebee") { EmailAddress = "bumblebee@transformers.com", EmailAllowed = true }; @@ -1549,7 +1548,7 @@ public async Task WillSendEmailIfEmailAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationTransformRequestRejectedNoticeAsync(accountToTransform, adminUser); + messageService.SendOrganizationTransformRequestRejectedNotice(accountToTransform, adminUser); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1562,7 +1561,7 @@ public async Task WillSendEmailIfEmailAllowed() } [Fact] - public async Task WillNotSendEmailIfEmailNotAllowed() + public void WillNotSendEmailIfEmailNotAllowed() { // Arrange var accountToTransform = new User("bumblebee") { EmailAddress = "bumblebee@transformers.com", EmailAllowed = false }; @@ -1571,7 +1570,7 @@ public async Task WillNotSendEmailIfEmailNotAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationTransformRequestRejectedNoticeAsync(accountToTransform, adminUser); + messageService.SendOrganizationTransformRequestRejectedNotice(accountToTransform, adminUser); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1582,7 +1581,7 @@ public class TheSendOrganizationTransformRequestCancelledNoticeMethod : TestContainer { [Fact] - public async Task WillSendEmailIfEmailAllowed() + public void WillSendEmailIfEmailAllowed() { // Arrange var accountToTransform = new User("bumblebee") { EmailAddress = "bumblebee@transformers.com" }; @@ -1591,7 +1590,7 @@ public async Task WillSendEmailIfEmailAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationTransformRequestCancelledNoticeAsync(accountToTransform, adminUser); + messageService.SendOrganizationTransformRequestCancelledNotice(accountToTransform, adminUser); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1604,7 +1603,7 @@ public async Task WillSendEmailIfEmailAllowed() } [Fact] - public async Task WillNotSendEmailIfEmailNotAllowed() + public void WillNotSendEmailIfEmailNotAllowed() { // Arrange var accountToTransform = new User("bumblebee") { EmailAddress = "bumblebee@transformers.com" }; @@ -1613,7 +1612,7 @@ public async Task WillNotSendEmailIfEmailNotAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationTransformRequestCancelledNoticeAsync(accountToTransform, adminUser); + messageService.SendOrganizationTransformRequestCancelledNotice(accountToTransform, adminUser); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1626,7 +1625,7 @@ public class TheSendOrganizationMembershipRequestMethod [Theory] [InlineData(false)] [InlineData(true)] - public async Task WillSendEmailIfEmailAllowed(bool isAdmin) + public void WillSendEmailIfEmailAllowed(bool isAdmin) { // Arrange var organization = new Organization("transformers") { EmailAddress = "transformers@transformers.com" }; @@ -1639,7 +1638,7 @@ public async Task WillSendEmailIfEmailAllowed(bool isAdmin) var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMembershipRequestAsync(organization, newUser, adminUser, isAdmin, profileUrl, confirmationUrl, rejectionUrl); + messageService.SendOrganizationMembershipRequest(organization, newUser, adminUser, isAdmin, profileUrl, confirmationUrl, rejectionUrl); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1658,7 +1657,7 @@ public async Task WillSendEmailIfEmailAllowed(bool isAdmin) [Theory] [InlineData(false)] [InlineData(true)] - public async Task WillNotSendEmailIfEmailNotAllowed(bool isAdmin) + public void WillNotSendEmailIfEmailNotAllowed(bool isAdmin) { // Arrange var organization = new Organization("transformers") { EmailAddress = "transformers@transformers.com" }; @@ -1671,7 +1670,7 @@ public async Task WillNotSendEmailIfEmailNotAllowed(bool isAdmin) var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMembershipRequestAsync(organization, newUser, adminUser, isAdmin, profileUrl, confirmationUrl, rejectionUrl); + messageService.SendOrganizationMembershipRequest(organization, newUser, adminUser, isAdmin, profileUrl, confirmationUrl, rejectionUrl); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1684,7 +1683,7 @@ public class TheSendOrganizationMembershipRequestInitiatedNoticeMethod [Theory] [InlineData(false)] [InlineData(true)] - public async Task WillSendEmailIfEmailAllowed(bool isAdmin) + public void WillSendEmailIfEmailAllowed(bool isAdmin) { // Arrange var organization = GetOrganizationWithRecipients(); @@ -1695,7 +1694,7 @@ public async Task WillSendEmailIfEmailAllowed(bool isAdmin) var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMembershipRequestInitiatedNoticeAsync(organization, requestingUser, pendingUser, isAdmin, cancelUrl); + messageService.SendOrganizationMembershipRequestInitiatedNotice(organization, requestingUser, pendingUser, isAdmin, cancelUrl); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1711,7 +1710,7 @@ public async Task WillSendEmailIfEmailAllowed(bool isAdmin) [Theory] [InlineData(false)] [InlineData(true)] - public async Task WillNotSendEmailIfEmailNotAllowed(bool isAdmin) + public void WillNotSendEmailIfEmailNotAllowed(bool isAdmin) { // Arrange var organization = GetOrganizationWithoutRecipients(); @@ -1722,7 +1721,7 @@ public async Task WillNotSendEmailIfEmailNotAllowed(bool isAdmin) var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMembershipRequestInitiatedNoticeAsync(organization, requestingUser, pendingUser, isAdmin, cancelUrl); + messageService.SendOrganizationMembershipRequestInitiatedNotice(organization, requestingUser, pendingUser, isAdmin, cancelUrl); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1733,7 +1732,7 @@ public class TheSendOrganizationMembershipRequestRejectedNoticeMethod : TestContainer { [Fact] - public async Task WillSendEmailIfEmailAllowed() + public void WillSendEmailIfEmailAllowed() { // Arrange var organization = GetOrganizationWithRecipients(); @@ -1742,7 +1741,7 @@ public async Task WillSendEmailIfEmailAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMembershipRequestRejectedNoticeAsync(organization, pendingUser); + messageService.SendOrganizationMembershipRequestRejectedNotice(organization, pendingUser); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1756,7 +1755,7 @@ public async Task WillSendEmailIfEmailAllowed() } [Fact] - public async Task WillNotSendEmailIfEmailNotAllowed() + public void WillNotSendEmailIfEmailNotAllowed() { // Arrange var organization = GetOrganizationWithoutRecipients(); @@ -1765,7 +1764,7 @@ public async Task WillNotSendEmailIfEmailNotAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMembershipRequestRejectedNoticeAsync(organization, pendingUser); + messageService.SendOrganizationMembershipRequestRejectedNotice(organization, pendingUser); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1776,7 +1775,7 @@ public class TheSendOrganizationMembershipRequestCancelledNoticeMethod : TestContainer { [Fact] - public async Task WillSendEmailIfEmailAllowed() + public void WillSendEmailIfEmailAllowed() { // Arrange var organization = new Organization("transformers") { EmailAddress = "transformers@transformers.com" }; @@ -1785,7 +1784,7 @@ public async Task WillSendEmailIfEmailAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMembershipRequestCancelledNoticeAsync(organization, pendingUser); + messageService.SendOrganizationMembershipRequestCancelledNotice(organization, pendingUser); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1798,7 +1797,7 @@ public async Task WillSendEmailIfEmailAllowed() } [Fact] - public async Task WillNotSendEmailIfEmailNotAllowed() + public void WillNotSendEmailIfEmailNotAllowed() { // Arrange var accountToTransform = new Organization("transformers") { EmailAddress = "transformers@transformers.com" }; @@ -1807,7 +1806,7 @@ public async Task WillNotSendEmailIfEmailNotAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMembershipRequestCancelledNoticeAsync(accountToTransform, pendingUser); + messageService.SendOrganizationMembershipRequestCancelledNotice(accountToTransform, pendingUser); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1820,7 +1819,7 @@ public class TheSendOrganizationMemberUpdatedNoticeMethod [Theory] [InlineData(false)] [InlineData(true)] - public async Task WillSendEmailIfEmailAllowed(bool isAdmin) + public void WillSendEmailIfEmailAllowed(bool isAdmin) { // Arrange var organization = new Organization("transformers") { EmailAddress = "transformers@transformers.com", EmailAllowed = true }; @@ -1830,7 +1829,7 @@ public async Task WillSendEmailIfEmailAllowed(bool isAdmin) var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMemberUpdatedNoticeAsync(organization, membership); + messageService.SendOrganizationMemberUpdatedNotice(organization, membership); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1846,7 +1845,7 @@ public async Task WillSendEmailIfEmailAllowed(bool isAdmin) [Theory] [InlineData(false)] [InlineData(true)] - public async Task WillNotSendEmailIfEmailNotAllowed(bool isAdmin) + public void WillNotSendEmailIfEmailNotAllowed(bool isAdmin) { // Arrange var organization = new Organization("transformers") { EmailAddress = "transformers@transformers.com", EmailAllowed = false }; @@ -1856,7 +1855,7 @@ public async Task WillNotSendEmailIfEmailNotAllowed(bool isAdmin) var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMemberUpdatedNoticeAsync(organization, membership); + messageService.SendOrganizationMemberUpdatedNotice(organization, membership); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1867,7 +1866,7 @@ public class TheSendOrganizationMemberRemovedNoticeMethod : TestContainer { [Fact] - public async Task WillSendEmailIfEmailAllowed() + public void WillSendEmailIfEmailAllowed() { // Arrange var organization = new Organization("transformers") { EmailAddress = "transformers@transformers.com", EmailAllowed = true }; @@ -1876,7 +1875,7 @@ public async Task WillSendEmailIfEmailAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMemberRemovedNoticeAsync(organization, removedUser); + messageService.SendOrganizationMemberRemovedNotice(organization, removedUser); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -1889,7 +1888,7 @@ public async Task WillSendEmailIfEmailAllowed() } [Fact] - public async Task WillNotSendEmailIfEmailNotAllowed() + public void WillNotSendEmailIfEmailNotAllowed() { // Arrange var organization = new Organization("transformers") { EmailAddress = "transformers@transformers.com", EmailAllowed = false }; @@ -1898,7 +1897,7 @@ public async Task WillNotSendEmailIfEmailNotAllowed() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendOrganizationMemberRemovedNoticeAsync(organization, member); + messageService.SendOrganizationMemberRemovedNotice(organization, member); // Assert Assert.Empty(messageService.MockMailSender.Sent); @@ -1909,7 +1908,7 @@ public class TheSendAccountDeleteNoticeMethod : TestContainer { [Fact] - public async Task VerifyTheMessageBody() + public void VerifyTheMessageBody() { // Arrange var userName = "deleteduser"; @@ -1919,7 +1918,7 @@ public async Task VerifyTheMessageBody() var messageService = TestableMessageService.Create(GetConfigurationService()); // Act - await messageService.SendAccountDeleteNoticeAsync(userToDelete); + messageService.SendAccountDeleteNotice(userToDelete); // Assert var message = messageService.MockMailSender.Sent.Last(); @@ -2006,12 +2005,12 @@ public class TestableMessageService : MessageService { private TestableMessageService(IGalleryConfigurationService configurationService) - : base(new TestMailSender(), configurationService.Current, new Mock().Object) { configurationService.Current.GalleryOwner = TestGalleryOwner; configurationService.Current.GalleryNoReplyAddress = TestGalleryNoReplyAddress; - MockMailSender = (TestMailSender)MailSender; + Config = configurationService.Current; + MailSender = MockMailSender = new TestMailSender(); } public Mock MockAuthService { get; protected set; } @@ -2019,7 +2018,6 @@ private TestableMessageService(IGalleryConfigurationService configurationService public static TestableMessageService Create(IGalleryConfigurationService configurationService) { - configurationService.Current.SmtpUri = new Uri("smtp://fake.mail.server"); return new TestableMessageService(configurationService); } }