public async Task SmsReturnsTrueIfValidCredentialsAndMessageQueued()
        {
            var lookupsMock = new Mock <ITwilioLookupsApi>(MockBehavior.Strict);

            lookupsMock.Setup(api => api.NumberInfo(It.IsAny <string>(), It.IsAny <string>(), "carrier"))
            .ReturnsAsync((string phoneNumber, string countryCode, string type) =>
                          JObject.Parse($"{{\"url\": \"https://lookups.twilio.com/v1/PhoneNumbers/{phoneNumber}?Type=carrier\",\"carrier\": {{ \"type\": \"mobile\" }},\"phone_number\": \"{phoneNumber}\",\"country_code\": \"{countryCode}\"}}"));

            var smsBodyNumber = IVRWorkflow.SwitchCallerId(_customerNumber);
            var messagingMock = new Mock <ITwilioMessagingApi>(MockBehavior.Strict);

            messagingMock.Setup(api => api.SendSMS(It.IsAny <string>(), It.Is <Dictionary <string, string> >(
                                                       args => args["From"].Equals(_systemNumber) && args["To"].Equals(_customerNumber) && args["Body"].Contains($"={smsBodyNumber}"))))
            .ReturnsAsync((string accountSid, Dictionary <string, string> args) =>
                          JObject.Parse($"{{\"account_sid\": \"{accountSid}\",\"api_version\": \"2010-04-01\",\"body\": \"{args["Body"]}\",\"from\": \"{args["From"]}\",\"status\": \"queued\",\"to\": \"{args["To"]}\"}}"));

            var twilioApi = new TwilioApi(lookupsMock.Object, messagingMock.Object, "ACxxxxxxxxxxxxxx", _systemNumber);

            var connectFunction = new SmsWorkflow(twilioApi);
            var result          = await connectFunction.Process(ConnectEventWithMessageEndingWithPhoneParameter, _context);

            Assert.Single(result);
            var lambdaResult = result["LambdaResult"];

            Assert.NotNull(lambdaResult);
            Assert.True(lambdaResult.Type == JTokenType.Boolean, "LambdaResult type is not Boolean");
            Assert.True(lambdaResult.Value <bool>(), "LambdaResult value is not true");

            lookupsMock.VerifyAll();
            messagingMock.VerifyAll();
        }
        public async Task SmsReturnsFalseIfValidButBadCredentials()
        {
            var lookupsMock      = new Mock <ITwilioLookupsApi>(MockBehavior.Strict);
            var lookupsException =
                await TwilioTests.CreateException($"https://lookups.twilio.com/v1/PhoneNumbers/{_customerNumber}?Type=carrier", HttpMethod.Get, HttpStatusCode.Unauthorized);

            lookupsMock.Setup(api => api.NumberInfo(_customerNumber, It.IsAny <string>(), "carrier"))
            .ThrowsAsync(lookupsException);

            var messagingMock = new Mock <ITwilioMessagingApi>(MockBehavior.Strict);

            var twilioApi = new TwilioApi(lookupsMock.Object, messagingMock.Object, "ACxxxxxxxxxxxxxx", _systemNumber);

            var connectFunction = new SmsWorkflow(twilioApi);
            var result          = await connectFunction.Process(ConnectEventWithMessageEndingWithPhoneParameter, _context);

            Assert.Single(result);
            var lambdaResult = result["LambdaResult"];

            Assert.NotNull(lambdaResult);
            Assert.True(lambdaResult.Type == JTokenType.Boolean);
            Assert.False(lambdaResult.Value <bool>());

            lookupsMock.VerifyAll();
        }