Inheritance: ISmsService
        public void CheckMessageIsSent()
        {
            var twilioWrapper = MockRepository.GenerateMock<ITwilioWrapper>();
            const string sid = "sid";
            twilioWrapper
                .Expect(t => t.CheckMessage(sid))
                .Return(new SmsSent(new SmsConfirmationData("receipt", DateTime.Now, 0.04m)));

            var smsService = new SmsService { TwilioWrapper = twilioWrapper };
            smsService.CheckStatus(sid);
        }
        public void CheckMessageIsSending()
        {
            var twilioWrapper = MockRepository.GenerateMock<ITwilioWrapper>();
            const string sid = "sid";
            twilioWrapper
                .Expect(t => t.CheckMessage(sid))
                .Return(new SmsSending(sid));

            var smsService = new SmsService { TwilioWrapper = twilioWrapper };
            smsService.CheckStatus(sid);
        }
        public void SmsUsesTwilio()
        {
            _docSession.Expect(d => d.Load<SmsProviderConfiguration>("SmsProviderConfiguration")).Return(_twilioProvider);

            var messageToSend = new SendOneMessageNow { SmsData = new SmsData("mobile", "message") };
            var twilioWrapper = MockRepository.GenerateMock<ITwilioWrapper>();
            var smsService = new SmsService { TwilioWrapper = twilioWrapper, RavenDocStore = _ravenDocStore };

            twilioWrapper.Expect(t => t.SendSmsMessage(messageToSend.SmsData.Mobile, messageToSend.SmsData.Message));
            smsService.Send(messageToSend);
            twilioWrapper.VerifyAllExpectations();
        }
        public void SmsServiceAuthenticationFailed()
        {
            var messageToSend = new SendOneMessageNow { SmsData = new SmsData("mobile", "message") };
            var smsTechWrapper = MockRepository.GenerateMock<ISmsTechWrapper>();
            var smsService = new SmsService { SmsTechWrapper = smsTechWrapper };

            var smsMessageSending = new SendSmsResponse { Cost = (float)0.06, MessageId = 123456, Error = new Error { Code = "AUTH_FAILED", Description = "we don't know who you are!" } };
            smsTechWrapper
                .Expect(t => t.SendSmsMessage(messageToSend.SmsData.Mobile, messageToSend.SmsData.Message))
                .Return(smsMessageSending);

            Assert.That(() => smsService.Send(messageToSend), Throws.Exception.TypeOf<SmsTechAuthenticationFailed>().With.Message.EqualTo(smsMessageSending.Error.Description));
        }
        public void SmsServiceOutOfMoney()
        {
            var messageToSend = new SendOneMessageNow { SmsData = new SmsData("mobile", "message") };
            var smsTechWrapper = MockRepository.GenerateMock<ISmsTechWrapper>();
            var smsService = new SmsService { SmsTechWrapper = smsTechWrapper };

            var smsMessageSending = new SendSmsResponse { Cost = (float)0.06, MessageId = 123456, Error = new Error { Code = "LEDGER_ERROR", Description = "can't send a message to those dudes!" } };
            const string accountIsCurrentlyOutOfMoney = "Could not send message - account is currently out of money";
            smsTechWrapper
                .Expect(t => t.SendSmsMessage(messageToSend.SmsData.Mobile, messageToSend.SmsData.Message))
                .Return(smsMessageSending);

            Assert.That(() => smsService.Send(messageToSend), Throws.Exception.TypeOf<AccountOutOfMoneyException>().With.Message.EqualTo(accountIsCurrentlyOutOfMoney));
        }
        public void CheckMessageIsPending()
        {
            var smsTechWrapper = MockRepository.GenerateMock<ISmsTechWrapper>();
            const string sid = "sid";
            smsTechWrapper
                .Expect(t => t.CheckMessage(sid))
                .Return(new SmsSentResponse {  Recipients = new List<RecipientForSms> { new RecipientForSms { DeliveryStatus = "pending" }}});

            var smsService = new SmsService { SmsTechWrapper = smsTechWrapper };
            var smsStatus = smsService.CheckStatus(sid);

            Assert.That(smsStatus, Is.TypeOf(typeof(SmsQueued)));
            Assert.That(smsStatus.Sid, Is.EqualTo(sid));
            smsTechWrapper.VerifyAllExpectations();
        }
        public void CheckMessageIsFailed_SoftBounce()
        {
            var smsTechWrapper = MockRepository.GenerateMock<ISmsTechWrapper>();
            const string sid = "sid";
            smsTechWrapper
                .Expect(t => t.CheckMessage(sid))
                .Return(new SmsSentResponse { Recipients = new List<RecipientForSms> { new RecipientForSms { DeliveryStatus = "soft-bounce" } } });

            var smsService = new SmsService { SmsTechWrapper = smsTechWrapper };
            var smsStatus = smsService.CheckStatus(sid);

            Assert.That(smsStatus, Is.TypeOf(typeof(SmsFailed)));
            var smsFailed = smsStatus as SmsFailed;
            Assert.That(smsStatus.Sid, Is.EqualTo(sid));
            Assert.That(smsFailed.Code, Is.EqualTo("soft-bounce"));
            Assert.That(smsFailed.Message, Is.EqualTo("The message timed out after 72 hrs, either the recipient was out of range, their phone was off for longer than 72 hrs or the message was unable to be delivered due to a network outage or other connectivity issue."));
            smsTechWrapper.VerifyAllExpectations();
        }
        public void CheckMessageIsFailed_HardBounce()
        {
            var smsTechWrapper = MockRepository.GenerateMock<ISmsTechWrapper>();
            const string sid = "sid";
            smsTechWrapper
                .Expect(t => t.CheckMessage(sid))
                .Return(new SmsSentResponse { Recipients = new List<RecipientForSms> { new RecipientForSms { DeliveryStatus = "hard-bounce" } } });

            var smsService = new SmsService { SmsTechWrapper = smsTechWrapper };
            var smsStatus = smsService.CheckStatus(sid);

            Assert.That(smsStatus, Is.TypeOf(typeof(SmsFailed)));
            var smsFailed = smsStatus as SmsFailed;
            Assert.That(smsStatus.Sid, Is.EqualTo(sid));
            Assert.That(smsFailed.Code, Is.EqualTo("hard-bounce"));
            Assert.That(smsFailed.Message, Is.EqualTo("The number is invalid or disconnected."));
            smsTechWrapper.VerifyAllExpectations();
        }
        public void SmsServiceSending()
        {
            var messageToSend = new SendOneMessageNow { SmsData = new SmsData("mobile", "message") };
            var smsTechWrapper = MockRepository.GenerateMock<ISmsTechWrapper>();
            var smsService = new SmsService { SmsTechWrapper = smsTechWrapper };

            var smsMessageSending = new SendSmsResponse {Cost = (float) 0.06, MessageId = 123456, Error = new Error { Code = "SUCCESS"} };
            smsTechWrapper
                .Expect(t => t.SendSmsMessage(messageToSend.SmsData.Mobile, messageToSend.SmsData.Message))
                .Return(smsMessageSending);

            var response = smsService.Send(messageToSend);

            Assert.That(response, Is.TypeOf(typeof (SmsSending)));
            Assert.That(response.Sid, Is.EqualTo(smsMessageSending.MessageId.ToString()));
            var smsSending = response as SmsSending;
            Assert.That(smsSending.Price, Is.EqualTo(smsMessageSending.Cost));
            smsTechWrapper.VerifyAllExpectations();
        }
        public void SmsServiceInvalidNumber()
        {
            var messageToSend = new SendOneMessageNow { SmsData = new SmsData("mobile", "message") };
            var smsTechWrapper = MockRepository.GenerateMock<ISmsTechWrapper>();
            var smsService = new SmsService { SmsTechWrapper = smsTechWrapper };

            var smsMessageSending = new SendSmsResponse { Cost = (float)0.06, MessageId = 123456, Error = new Error { Code = "RECIPIENTS_ERROR", Description = "can't send a message to those dudes!"} };
            smsTechWrapper
                .Expect(t => t.SendSmsMessage(messageToSend.SmsData.Mobile, messageToSend.SmsData.Message))
                .Return(smsMessageSending);

            var response = smsService.Send(messageToSend);

            Assert.That(response, Is.TypeOf(typeof(SmsFailed)));
            Assert.That(response.Sid, Is.EqualTo(smsMessageSending.MessageId.ToString()));
            var smsFailed = response as SmsFailed;
            Assert.That(smsFailed.Code, Is.EqualTo(smsMessageSending.Error.Code));
            Assert.That(smsFailed.Message, Is.EqualTo(smsMessageSending.Error.Description));
            smsTechWrapper.VerifyAllExpectations();
        }
        public void CheckMessageIsSent()
        {
            var smsTechWrapper = MockRepository.GenerateMock<ISmsTechWrapper>();
            const string sid = "123";
            var sendAt = DateTime.Now;
            smsTechWrapper
                .Expect(t => t.CheckMessage(sid))
                .Return(new SmsSentResponse
                    {
                        Recipients = new List<RecipientForSms> { new RecipientForSms { DeliveryStatus = "delivered" } },
                        Message = new SmsResponseBase { SendAt = sendAt, MessageId = Convert.ToInt32(sid) }
                    });

            var smsService = new SmsService { SmsTechWrapper = smsTechWrapper };
            var smsStatus = smsService.CheckStatus(sid);

            Assert.That(smsStatus, Is.TypeOf(typeof(SmsSent)));
            Assert.That(smsStatus.Sid, Is.EqualTo(sid));
            var smsSent = smsStatus as SmsSent;
            Assert.That(smsSent.SentAtUtc, Is.EqualTo(sendAt));
            smsTechWrapper.VerifyAllExpectations();
        }
        public void SmsServiceSending_WithoutERRORCode_ThrowsException()
        {
            var messageToSend = new SendOneMessageNow { SmsData = new SmsData("mobile", "message") };
            var smsTechWrapper = MockRepository.GenerateMock<ISmsTechWrapper>();
            var smsService = new SmsService { SmsTechWrapper = smsTechWrapper };

            var smsMessageSending = new SendSmsResponse {Cost = (float) 0.06, MessageId = 123456, Error = new Error { Code = string.Empty } };
            smsTechWrapper
                .Expect(t => t.SendSmsMessage(messageToSend.SmsData.Mobile, messageToSend.SmsData.Message))
                .Return(smsMessageSending);

            Assert.That(() => smsService.Send(messageToSend), Throws.ArgumentException.With.Message.Contains("Error code expected"));

            smsTechWrapper.VerifyAllExpectations();
        }