private async Task <PrepareToSendOnChannelResult> PrepareToSendOnChannelAsync( INotification notification, IAudience audience, IDeliveryChannel channel, IReadOnlyCollection <NamedValue <string> > inheritableTags) { PrepareToSendOnChannelResult result; try { var prepareToSendOnChannelOp = new PrepareToSendOnChannelOp(notification, audience, channel, inheritableTags); result = await this.prepareToSendOnChannelProtocol.ExecuteAsync(prepareToSendOnChannelOp); result.AsOp().Must().NotBeNull(Invariant($"Executing {nameof(PrepareToSendOnChannelOp)} should not return null.")); } catch (Exception ex) { result = new PrepareToSendOnChannelResult(null, new[] { new ExceptionThrownFailure(ex.ToString()) }, PrepareToSendOnChannelFailureAction.DoNotSendOnChannel); } return(result); }
static PrepareToSendOnChannelOpTest() { ConstructorArgumentValidationTestScenarios .RemoveAllScenarios() .AddScenario(() => new ConstructorArgumentValidationTestScenario <PrepareToSendOnChannelOp> { Name = "constructor should throw ArgumentNullException when parameter 'notification' is null scenario", ConstructionFunc = () => { var referenceObject = A.Dummy <PrepareToSendOnChannelOp>(); var result = new PrepareToSendOnChannelOp( null, referenceObject.Audience, referenceObject.DeliveryChannel, referenceObject.InheritableTags); return(result); }, ExpectedExceptionType = typeof(ArgumentNullException), ExpectedExceptionMessageContains = new[] { "notification", }, }) .AddScenario(() => new ConstructorArgumentValidationTestScenario <PrepareToSendOnChannelOp> { Name = "constructor should throw ArgumentNullException when parameter 'audience' is null scenario", ConstructionFunc = () => { var referenceObject = A.Dummy <PrepareToSendOnChannelOp>(); var result = new PrepareToSendOnChannelOp( referenceObject.Notification, null, referenceObject.DeliveryChannel, referenceObject.InheritableTags); return(result); }, ExpectedExceptionType = typeof(ArgumentNullException), ExpectedExceptionMessageContains = new[] { "audience", }, }) .AddScenario(() => new ConstructorArgumentValidationTestScenario <PrepareToSendOnChannelOp> { Name = "constructor should throw ArgumentNullException when parameter 'deliveryChannel' is null scenario", ConstructionFunc = () => { var referenceObject = A.Dummy <PrepareToSendOnChannelOp>(); var result = new PrepareToSendOnChannelOp( referenceObject.Notification, referenceObject.Audience, null, referenceObject.InheritableTags); return(result); }, ExpectedExceptionType = typeof(ArgumentNullException), ExpectedExceptionMessageContains = new[] { "deliveryChannel", }, }); }
public async Task <PrepareToSendOnChannelResult> ExecuteAsync( PrepareToSendOnChannelOp operation) { new { operation }.AsArg().Must().NotBeNull(); new { operation.Notification }.AsArg().Must().NotBeNull().And().BeOfType <IntegrationTestNotification>(); new { operation.Audience }.AsArg().Must().NotBeNull().And().BeOfType <IntegrationTestAudience>(); new { operation.DeliveryChannel }.AsArg().Must().NotBeNull(); new { operation.InheritableTags }.AsArg().Must().NotBeNullNorEmptyDictionaryNorContainAnyNullValues(); IReadOnlyList <ChannelOperationInstruction> channelOperationInstructions; var audience = (IntegrationTestAudience)operation.Audience; var notification = (IntegrationTestNotification)operation.Notification; if (operation.DeliveryChannel is EmailDeliveryChannel) { var trackingCodeId = await this.streams.EmailOperationStream.GetNextUniqueLongAsync(); var emailParticipants = new EmailParticipants( new EmailMailbox(audience.SenderEmailAddress), new[] { new EmailMailbox(audience.RecipientEmailAddress) }); var emailContent = new EmailContent(notification.ScenarioBeingTested, "Here is the body for scenario: " + notification.ScenarioBeingTested); var tags = (operation.InheritableTags.DeepClone() ?? new List <NamedValue <string> >()).ToList(); tags.Add(new NamedValue <string>("recipient-email-address", emailParticipants.To.First().Address)); tags.Add(new NamedValue <string>("sender-email-address", emailParticipants.From.Address)); channelOperationInstructions = new[] { new ChannelOperationInstruction( new SendEmailOp(new SendEmailRequest(emailParticipants, emailContent)), new ChannelOperationMonitoringInfo( trackingCodeId, typeof(SucceededInSendingEmailEvent <long>).ToRepresentation(), typeof(FailedToSendEmailEvent <long>).ToRepresentation()), tags), }; } else if (operation.DeliveryChannel is SlackDeliveryChannel) { var sendMessageTrackingCodeId = await this.streams.SlackOperationStream.GetNextUniqueLongAsync(); var uploadFileTrackingCodeId = await this.streams.SlackOperationStream.GetNextUniqueLongAsync(); var tags = (operation.InheritableTags.DeepClone() ?? new List <NamedValue <string> >()).ToList(); tags.Add(new NamedValue <string>("slack-channel-id", audience.SlackChannelId)); var fileBytes = AssemblyHelper.ReadEmbeddedResourceAsBytes("test-file-png"); channelOperationInstructions = new[] { new ChannelOperationInstruction( new SendSlackMessageOp(new SendSlackTextMessageRequest(audience.SlackChannelId, notification.ScenarioBeingTested)), new ChannelOperationMonitoringInfo( sendMessageTrackingCodeId, typeof(SucceededInSendingSlackMessageEvent <long>).ToRepresentation(), typeof(FailedToSendSlackMessageEvent <long>).ToRepresentation()), tags), new ChannelOperationInstruction( new UploadFileToSlackOp(new UploadFileToSlackRequest(fileBytes, new[] { audience.SlackChannelId }, FileType.Png)), new ChannelOperationMonitoringInfo( uploadFileTrackingCodeId, typeof(SucceededInUploadingFileToSlackEvent <long>).ToRepresentation(), typeof(FailedToUploadFileToSlackEvent <long>).ToRepresentation()), tags), }; } else { throw new NotSupportedException("This delivery channel is not supported: " + operation.DeliveryChannel.GetType().ToStringReadable()); } var prepareToSendOnChannelResult = new PrepareToSendOnChannelResult( channelOperationInstructions, new[] { new ExceptionThrownFailure("exception-thrown-prepare-to-send-on-channel-" + operation.DeliveryChannel.GetType().ToStringReadable()), }, PrepareToSendOnChannelFailureAction.IgnoreAndProceedIfPossibleOtherwiseDoNotSendOnChannel); var result = await Task.FromResult(prepareToSendOnChannelResult); return(result); }