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); }
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)); }
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)); }
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."); }
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'."); }
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'."); }
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."); }
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)); }