예제 #1
0
        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);
            }