Exemple #1
0
        public void Parse_HappyPath_WellFormatted_VerifyParsedResult()
        {
            // Arrange
            const string message = "Qty 3 A\r\nQty 1 C\rQty 2 B\nQty 3 D\r\n\r\nQty 14 G\r\n";

            var expectedOrderLines = new Dictionary <OrderReferenceLabel, OrderQuantity>
            {
                { OrderReferenceLabel.Create("A"), OrderQuantity.Create(3) },
                { OrderReferenceLabel.Create("C"), OrderQuantity.Create(1) },
                { OrderReferenceLabel.Create("B"), OrderQuantity.Create(2) },
                { OrderReferenceLabel.Create("D"), OrderQuantity.Create(3) },
                { OrderReferenceLabel.Create("G"), OrderQuantity.Create(14) },
            };
            // Act
            var actual = Sut.Parse(PhoneNumber, SmsMessage.Create(message));

            // Assert
            actual.Should().BeOfType <PlaceOrderCommand>();
            ((PlaceOrderCommand)actual).PhoneNumber.Should().Be(PhoneNumber);

            var orderDetails = ((PlaceOrderCommand)actual).OrderDetails;

            orderDetails.Should().HaveCount(expectedOrderLines.Count);
            orderDetails.Should().BeEquivalentTo(expectedOrderLines);
        }
Exemple #2
0
        private async Task HandleSimpleSmsRequestAsync(SendSmsData <string> request)
        {
            Console.WriteLine($"SMS: {request.MessageData}. Receiver: {request.PhoneNumber}, UTC: {DateTime.UtcNow}");

            var sender = GetSender(request.UseAlternativeProvider);

            await sender.ProcessSmsAsync(request.PhoneNumber, SmsMessage.Create(sender.GetSenderNumber(request.PhoneNumber), request.MessageData));
        }
Exemple #3
0
        private async Task HandleSmsRequestAsync(SendSmsData <SmsConfirmationData> request)
        {
            Console.WriteLine($"SMS: Phone confirmation. Receiver: {request.PhoneNumber}, UTC: {DateTime.UtcNow}");

            var msgText = await _smsTextGenerator.GenerateConfirmSmsText(request.MessageData.ConfirmationCode);

            var sender = GetSender(request.UseAlternativeProvider);

            await sender.ProcessSmsAsync(request.PhoneNumber, SmsMessage.Create(sender.GetSenderNumber(request.PhoneNumber), msgText));
        }
Exemple #4
0
        public void Parse_QuantityTooGreat_VerifyErrorResult()
        {
            // Arrange
            const string message = "Qty 3 A\rQty 16 B\r";
            // Act
            var actual = Sut.Parse(PhoneNumber, SmsMessage.Create(message));

            // Assert
            actual.Should().BeOfType <SendOrderParsingErrorSmsCommand>();
            ((SendOrderParsingErrorSmsCommand)actual).PhoneNumber.Should().Be(PhoneNumber);
            ((string)((SendOrderParsingErrorSmsCommand)actual).Message).Should().Be(
                "You can't order more than 15 bags of any coffee. Looks like you tried to order 16 bags of B.");
        }
Exemple #5
0
        public void Parse_DuplicateLabel_VerifyErrorResult()
        {
            // Arrange
            const string message = "Qty 3 A\rQty 1 A\r";
            // Act
            var actual = Sut.Parse(PhoneNumber, SmsMessage.Create(message));

            // Assert
            actual.Should().BeOfType <SendOrderParsingErrorSmsCommand>();
            ((SendOrderParsingErrorSmsCommand)actual).PhoneNumber.Should().Be(PhoneNumber);
            ((string)((SendOrderParsingErrorSmsCommand)actual).Message).Should().Be(
                "Multiple lines contained the label 'A'.");
        }
Exemple #6
0
        public void Parse_LineFailsToParse_VerifyErrorResult()
        {
            // Arrange
            const string message = "Qty 3 A\rI like cheese\rQty 1 B\r";
            // Act
            var actual = Sut.Parse(PhoneNumber, SmsMessage.Create(message));

            // Assert
            actual.Should().BeOfType <SendOrderParsingErrorSmsCommand>();
            ((SendOrderParsingErrorSmsCommand)actual).PhoneNumber.Should().Be(PhoneNumber);
            ((string)((SendOrderParsingErrorSmsCommand)actual).Message).Should().Be(
                "We couldn't understand this line: 'I like cheese'.");
        }
Exemple #7
0
        public void Parse_CombinationOfErrors_VerifyErrorResult()
        {
            // Arrange
            const string message = "Qty 3\r\nQty 4 A\r\nQty 4 A\r\nQty 23 Z\r\n\r\n ";
            // Act
            var actual = Sut.Parse(PhoneNumber, SmsMessage.Create(message));

            // Assert
            actual.Should().BeOfType <SendOrderParsingErrorSmsCommand>();
            ((SendOrderParsingErrorSmsCommand)actual).PhoneNumber.Should().Be(PhoneNumber);
            ((string)((SendOrderParsingErrorSmsCommand)actual).Message).Should().Be(
                "We couldn't understand this line: 'Qty 3'. " +
                "Multiple lines contained the label 'A'. " +
                "You can't order more than 15 bags of any coffee. Looks like you tried to order 23 bags of Z.");
        }
Exemple #8
0
        public async Task Handle(
            PlaceOrderCommand cmd,
            DomainBehaviorException exception,
            RequestExceptionHandlerState <Unit> state,
            CancellationToken cancellationToken)
        {
            var msg = exception switch
            {
                ContactNotPartOfRoastingEventException =>
                "Sorry, you cannot place an order at this time. Keep an eye out for the next text blast!",
                ContactAlreadyPlacedOrderException =>
                "Woops! Looks like you already placed an order. Reply CANCEL to cancel your order first if you want to make a change.",
                OrderContainedInvalidCoffeesException ex =>
                await GetInvalidCoffeesMessage(ex, cancellationToken),
                _ =>
                throw new ArgumentOutOfRangeException(nameof(exception)),
            };

            await _outboundSms.Send(cmd.PhoneNumber, SmsMessage.Create(msg));

            state.SetHandled(Unit.Value);
        }
        public async Task <SmsMessage> GetByMessageIdAsync(string messageId)
        {
            var entity = await _tableStorage.GetDataAsync(_index, MessageIdIndex, messageId);

            return(SmsMessage.Create(entity));
        }