private void UpdateRecurringGiftAndDonorAccount(RecurringGift gift, StripeAccount account, StripeSubscription subscription, MinistryPlatformContext mpDB, StripeOnboardingContext stripeDB) { gift.Subscription_ID = subscription.Id; gift.DonorAccount.Processor_Account_ID = account.NewCardId; gift.DonorAccount.Processor_ID = account.StripeCustomer.CustomerId; mpDB.SaveChanges(); account.StripeCustomer.Imported = true; stripeDB.SaveChanges(); }
public void TestEditRecurringGiftChangePaymentAndStartDate() { const string authUserToken = "auth"; var today = DateTime.Today; const int congregationId = 1; var editGift = new RecurringGiftDto { RecurringGiftId = 345, StripeTokenId = "tok_123", PlanAmount = 800M, Program = "3", PlanInterval = PlanInterval.Weekly, StartDate = today }; var donor = new ContactDonor { DonorId = 456, ProcessorId = "cus_123", Email = "*****@*****.**" }; var existingGift = new CreateDonationDistDto { Amount = 50000, ProgramId = "3", Frequency = 1, StartDate = today.AddDays(-7), DonorAccountId = 234, SubscriptionId = "sub_123", DayOfWeek = (int)today.AddDays(-7).DayOfWeek, RecurringGiftId = 345, DonorId = 789, StripeCustomerId = "cus_456", StripeAccountId = "card_456" }; var stripeSource = new SourceData { brand = "Visa", last4 = "1234", id = "card_123" }; const int newDonorAccountId = 987; var oldSubscription = new StripeSubscription { Id = "sub_123", Plan = new StripePlan { Id = "plan_123" } }; var newPlan = new StripePlan { Id = "plan_456" }; var newSubscription = new StripeSubscription { Id = "sub_456" }; const int newRecurringGiftId = 765; var newRecurringGift = new CreateDonationDistDto { Amount = 80000, ProgramId = "3", Frequency = 1, StartDate = today, DonorAccountId = 234, SubscriptionId = "sub_456", DayOfWeek = (int)today.DayOfWeek, RecurringGiftId = newRecurringGiftId, DonorId = 789 }; var contact = new MyContact() { Congregation_ID = congregationId }; _mpDonorService.Setup(mocked => mocked.GetRecurringGiftById(authUserToken, editGift.RecurringGiftId)).Returns(existingGift); _paymentService.Setup(mocked => mocked.UpdateCustomerSource(existingGift.StripeCustomerId, editGift.StripeTokenId)).Returns(stripeSource); _mpDonorService.Setup(mocked => mocked.CreateDonorAccount(stripeSource.brand, "0", stripeSource.last4, null, existingGift.DonorId, stripeSource.id, existingGift.StripeCustomerId)).Returns(newDonorAccountId); _paymentService.Setup(mocked => mocked.CancelSubscription(existingGift.StripeCustomerId, existingGift.SubscriptionId)).Returns(oldSubscription); _paymentService.Setup(mocked => mocked.CreateSubscription(newPlan.Id, existingGift.StripeCustomerId, newRecurringGift.StartDate.Value)).Returns(newSubscription); _paymentService.Setup(mocked => mocked.CancelPlan(oldSubscription.Plan.Id)).Returns(oldSubscription.Plan); _paymentService.Setup(mocked => mocked.CreatePlan(editGift, donor)).Returns(newPlan); _mpDonorService.Setup(mocked => mocked.CancelRecurringGift(authUserToken, existingGift.RecurringGiftId.Value)); _mpContactService.Setup(mocked => mocked.GetContactById(donor.ContactId)).Returns(contact); _mpDonorService.Setup( mocked => mocked.CreateRecurringGiftRecord(authUserToken, donor.DonorId, newDonorAccountId, EnumMemberSerializationUtils.ToEnumString(editGift.PlanInterval), editGift.PlanAmount, editGift.StartDate, editGift.Program, newSubscription.Id, contact.Congregation_ID.Value)).Returns(newRecurringGiftId); _mpDonorService.Setup(mocked => mocked.GetRecurringGiftById(authUserToken, newRecurringGiftId)).Returns(newRecurringGift); var result = _fixture.EditRecurringGift(authUserToken, editGift, donor); _mpDonorService.VerifyAll(); _paymentService.VerifyAll(); Assert.IsNotNull(result); Assert.AreEqual(newRecurringGift.RecurringGiftId, result.RecurringGiftId); Assert.AreEqual(newRecurringGift.StartDate, result.StartDate); Assert.AreEqual(newRecurringGift.Amount, result.PlanAmount); Assert.AreEqual(PlanInterval.Weekly, result.PlanInterval); Assert.AreEqual(newRecurringGift.ProgramId, result.Program); Assert.AreEqual(newRecurringGift.DonorId, result.DonorID); Assert.AreEqual(donor.Email, result.EmailAddress); Assert.AreEqual(newSubscription.Id, result.SubscriptionID); }
public void TestCancelRecurringGift() { const string authUserToken = "auth"; const int recurringGiftId = 123; var gift = new CreateDonationDistDto { DonorId = 456, SubscriptionId = "sub_123", StripeCustomerId = "cus_456", StripeAccountId = "card_789", ProgramName = "Crossroads", Amount = 123.45M, Recurrence = "12th of the month", DonorAccountId = 90 }; var plan = new StripePlan { Id = "plan_123" }; var subscription = new StripeSubscription { Plan = plan }; _mpDonorService.Setup(mocked => mocked.GetRecurringGiftById(authUserToken, recurringGiftId)).Returns(gift); _paymentService.Setup(mocked => mocked.CancelSubscription(gift.StripeCustomerId, gift.SubscriptionId)).Returns(subscription); _paymentService.Setup(mocked => mocked.CancelPlan(subscription.Plan.Id)).Returns(plan); _mpDonorService.Setup(mocked => mocked.CancelRecurringGift(authUserToken, recurringGiftId)); _mpDonorService.Setup(mocked => mocked.GetDonorAccountPymtType(gift.DonorAccountId.Value)).Returns(1); _mpDonorService.Setup( mocked => mocked.SendEmail(RecurringGiftCancelEmailTemplateId, gift.DonorId, (int)(123.45M / 100), "Check", It.IsAny<DateTime>(), "Crossroads", string.Empty, "12th of the month")); _fixture.CancelRecurringGift(authUserToken, recurringGiftId); _mpDonorService.VerifyAll(); _paymentService.VerifyAll(); }
public void TestCreateRecurringGiftNoCongregation() { var recurringGiftDto = new RecurringGiftDto { StripeTokenId = "tok_123", PlanAmount = 123.45M, PlanInterval = PlanInterval.Weekly, Program = "987", StartDate = DateTime.Parse("1973-10-15") }; var contactDonor = new ContactDonor { DonorId = 678, ProcessorId = "cus_123" }; var stripeCustomer = new StripeCustomer { brand = "visa", last4 = "9876", id = "card_123" }; var stripePlan = new StripePlan { Id = "plan_123" }; const int donorAccountId = 999; var stripeSubscription = new StripeSubscription { Id = "sub_123" }; var contact = new MyContact() { Congregation_ID = null }; const int recurringGiftId = 888; _paymentService.Setup(mocked => mocked.AddSourceToCustomer(contactDonor.ProcessorId, recurringGiftDto.StripeTokenId)).Returns(stripeCustomer); _paymentService.Setup(mocked => mocked.CreatePlan(recurringGiftDto, contactDonor)).Returns(stripePlan); _mpDonorService.Setup( mocked => mocked.CreateDonorAccount(stripeCustomer.brand, It.IsAny<string>(), stripeCustomer.last4, null, contactDonor.DonorId, stripeCustomer.id, contactDonor.ProcessorId)).Returns(donorAccountId); _paymentService.Setup(mocked => mocked.CreateSubscription(stripePlan.Id, contactDonor.ProcessorId, recurringGiftDto.StartDate)).Returns(stripeSubscription); _mpContactService.Setup(mocked => mocked.GetContactById(contactDonor.DonorId)).Returns(contact); _mpDonorService.Setup( mocked => mocked.CreateRecurringGiftRecord("auth", contactDonor.DonorId, donorAccountId, EnumMemberSerializationUtils.ToEnumString(recurringGiftDto.PlanInterval), recurringGiftDto.PlanAmount, recurringGiftDto.StartDate, recurringGiftDto.Program, stripeSubscription.Id, NotSiteSpecificCongregation)).Returns(recurringGiftId); var response = _fixture.CreateRecurringGift("auth", recurringGiftDto, contactDonor); _paymentService.VerifyAll(); _mpDonorService.VerifyAll(); _mpContactService.VerifyAll(); Assert.AreEqual(recurringGiftId, response); }
public void TestCreateRecurringGiftWholeLottaFailures() { var recurringGiftDto = new RecurringGiftDto { StripeTokenId = "tok_123", PlanAmount = 123.45M, PlanInterval = PlanInterval.Weekly, Program = "987", StartDate = DateTime.Parse("1973-10-15") }; var contactDonor = new ContactDonor { DonorId = 678, ProcessorId = "cus_123", ContactId = 909090 }; var defaultSource = new SourceData { id = "card_123", brand = "Visa", last4 = "5150" }; var stripeCustomer = new StripeCustomer { brand = "visa", last4 = "9876", id = "cus_123", default_source = "card_123", sources = new Sources { data = new List<SourceData> { new SourceData { id = "bank_123", bank_last4 = "5678" }, defaultSource } } }; var stripePlan = new StripePlan { Id = "plan_123" }; const int donorAccountId = 999; var stripeSubscription = new StripeSubscription { Id = "sub_123" }; var contact = new MyContact() { Congregation_ID = 1 }; _paymentService.Setup(mocked => mocked.CreateCustomer(recurringGiftDto.StripeTokenId, "678, Recurring Gift Subscription")).Returns(stripeCustomer); _paymentService.Setup(mocked => mocked.CreatePlan(recurringGiftDto, contactDonor)).Returns(stripePlan); _mpDonorService.Setup( mocked => mocked.CreateDonorAccount(defaultSource.brand, It.IsAny<string>(), defaultSource.last4, null, contactDonor.DonorId, defaultSource.id, stripeCustomer.id)).Returns(donorAccountId); _paymentService.Setup(mocked => mocked.CreateSubscription(stripePlan.Id, stripeCustomer.id, recurringGiftDto.StartDate)).Returns(stripeSubscription); _mpContactService.Setup(mocked => mocked.GetContactById(contactDonor.ContactId)).Returns(contact); var exception = new ApplicationException("Do it to it Lars"); _mpDonorService.Setup( mocked => mocked.CreateRecurringGiftRecord("auth", contactDonor.DonorId, donorAccountId, EnumMemberSerializationUtils.ToEnumString(recurringGiftDto.PlanInterval), recurringGiftDto.PlanAmount, recurringGiftDto.StartDate, recurringGiftDto.Program, stripeSubscription.Id, contact.Congregation_ID.Value)).Throws(exception); _paymentService.Setup(mocked => mocked.CancelSubscription(stripeCustomer.id, stripeSubscription.Id)).Throws(new Exception()); _paymentService.Setup(mocked => mocked.CancelPlan(stripePlan.Id)).Throws(new Exception()); _paymentService.Setup(mocked => mocked.DeleteCustomer(stripeCustomer.id)).Throws(new Exception()); _mpDonorService.Setup(mocked => mocked.DeleteDonorAccount("auth", donorAccountId)).Throws(new Exception()); try { _fixture.CreateRecurringGift("auth", recurringGiftDto, contactDonor); Assert.Fail("Expected exception was not thrown"); } catch (ApplicationException e) { Assert.AreSame(exception, e); } _paymentService.VerifyAll(); _mpDonorService.VerifyAll(); _mpContactService.VerifyAll(); }
public void TestCreateRecurringGift() { var recurringGiftDto = new RecurringGiftDto { StripeTokenId = "tok_123", PlanAmount = 123.45M, PlanInterval = PlanInterval.Weekly, Program = "987", StartDate = DateTime.Parse("1973-10-15") }; var contactDonor = new ContactDonor { DonorId = 678, ProcessorId = "cus_123", ContactId = 909090 }; var defaultSource = new SourceData { id = "card_123", brand = "Visa", last4 = "5150" }; var stripeCustomer = new StripeCustomer { brand = "visa", last4 = "9876", id = "cus_123", default_source = "card_123", sources = new Sources { data = new List<SourceData> { new SourceData { id = "bank_123", bank_last4 = "5678" }, defaultSource } } }; var stripePlan = new StripePlan { Id = "plan_123" }; const int donorAccountId = 999; var stripeSubscription = new StripeSubscription { Id = "sub_123" }; var contact = new MyContact() { Congregation_ID = 1 }; const int recurringGiftId = 888; var recurringGift = new CreateDonationDistDto { ProgramName = "Crossroads", Amount = 123.45M, Recurrence = "12th of the month", DonorAccountId = 90 }; _paymentService.Setup(mocked => mocked.CreateCustomer(recurringGiftDto.StripeTokenId, "678, Recurring Gift Subscription")).Returns(stripeCustomer); _paymentService.Setup(mocked => mocked.CreatePlan(recurringGiftDto, contactDonor)).Returns(stripePlan); _mpDonorService.Setup( mocked => mocked.CreateDonorAccount(defaultSource.brand, It.IsAny<string>(), defaultSource.last4, null, contactDonor.DonorId, defaultSource.id, stripeCustomer.id)).Returns(donorAccountId); _paymentService.Setup(mocked => mocked.CreateSubscription(stripePlan.Id, stripeCustomer.id, recurringGiftDto.StartDate)).Returns(stripeSubscription); _mpContactService.Setup(mocked => mocked.GetContactById(contactDonor.ContactId)).Returns(contact); _mpDonorService.Setup( mocked => mocked.CreateRecurringGiftRecord("auth", contactDonor.DonorId, donorAccountId, EnumMemberSerializationUtils.ToEnumString(recurringGiftDto.PlanInterval), recurringGiftDto.PlanAmount, recurringGiftDto.StartDate, recurringGiftDto.Program, stripeSubscription.Id, contact.Congregation_ID.Value)).Returns(recurringGiftId); _mpDonorService.Setup(mocked => mocked.GetRecurringGiftById("auth", recurringGiftId)).Returns(recurringGift); _mpDonorService.Setup(mocked => mocked.GetDonorAccountPymtType(recurringGift.DonorAccountId.Value)).Returns(1); _mpDonorService.Setup( mocked => mocked.SendEmail(RecurringGiftSetupEmailTemplateId, recurringGift.DonorId, (int)(123.45M/100), "Check", It.IsAny<DateTime>(), "Crossroads", string.Empty, "12th of the month")); var response = _fixture.CreateRecurringGift("auth", recurringGiftDto, contactDonor); _paymentService.VerifyAll(); _mpDonorService.VerifyAll(); Assert.AreEqual(recurringGiftId, response); }
public void TestInvoicePaymentFailedCancelPlanAndSubscription() { const string processorId = "cus_123"; const string donorAccountProcessorId = "cus_456"; const string subscriptionId = "sub_123"; const int failCount = 3; const int recurringGiftId = 123456; const int donorId = 3421; const int frequency = 2; const string id = "9876"; const string charge = "ch_2468"; const string planId = "Donor ID #3421 weekly"; var e = new StripeEvent { LiveMode = true, Type = "invoice.payment_failed", Created = DateTime.Now.AddDays(-1), Data = new StripeEventData { Object = JObject.FromObject(new StripeInvoice() { Id = id, Customer = processorId, Charge = charge, Subscription = subscriptionId }) } }; var gift = new CreateDonationDistDto { Frequency = frequency, RecurringGiftId = recurringGiftId, SubscriptionId = subscriptionId, ConsecutiveFailureCount = failCount, DonorId = donorId, StripeCustomerId = donorAccountProcessorId }; var plan = new StripePlan { Id = planId }; var subscription = new StripeSubscription { Plan = plan }; _mpDonorService.Setup(mocked => mocked.ProcessRecurringGiftDecline(subscriptionId)); _mpDonorService.Setup(mocked => mocked.GetRecurringGiftForSubscription(subscriptionId)).Returns(gift); _paymentService.Setup(mocked => mocked.CancelSubscription(donorAccountProcessorId, subscriptionId)).Returns(subscription); _paymentService.Setup(mocked => mocked.CancelPlan(subscription.Plan.Id)).Returns(plan); _mpDonorService.Setup(mocked => mocked.CancelRecurringGift(recurringGiftId)); Assert.IsNull(_fixture.ProcessStripeEvent(e)); _fixture.ProcessStripeEvent(e); _donorService.VerifyAll(); _mpDonorService.VerifyAll(); _donorService.VerifyAll(); _paymentService.VerifyAll(); }
/// <summary> /// Edit an existing recurring gift. This will cancel (end-date) an existing RecurringGift and then create a new one /// if the Program, Amount, Frequency, Day of Week, or Day of Month are changed. This will simply edit the existing gift /// if only the payment method (credit card, bank account) is changed. /// </summary> /// <param name="authorizedUserToken">An OAuth token for the user who is logged in to cr.net/MP</param> /// <param name="editGift">The edited values for the Recurring Gift</param> /// <param name="donor">The donor performing the edits</param> /// <returns>A RecurringGiftDto, populated with any new/updated values after any edits</returns> public RecurringGiftDto EditRecurringGift(string authorizedUserToken, RecurringGiftDto editGift, ContactDonor donor) { var existingGift = _mpDonorService.GetRecurringGiftById(authorizedUserToken, editGift.RecurringGiftId); // Assuming payment info is changed if a token is given. var changedPayment = !string.IsNullOrWhiteSpace(editGift.StripeTokenId); var changedAmount = (int)(editGift.PlanAmount * Constants.StripeDecimalConversionValue) != existingGift.Amount; var changedProgram = !editGift.Program.Equals(existingGift.ProgramId); var changedFrequency = !editGift.PlanInterval.Equals(existingGift.Frequency == RecurringGiftFrequencyWeekly ? PlanInterval.Weekly : PlanInterval.Monthly); var changedDayOfWeek = changedFrequency || (editGift.PlanInterval == PlanInterval.Weekly && (int) editGift.StartDate.DayOfWeek != existingGift.DayOfWeek); var changedDayOfMonth = changedFrequency || (editGift.PlanInterval == PlanInterval.Monthly && editGift.StartDate.Day != existingGift.DayOfMonth); var changedStartDate = editGift.StartDate.Date != existingGift.StartDate.GetValueOrDefault().Date; var needsUpdatedStripeSubscription = changedAmount && !(changedFrequency || changedDayOfWeek || changedDayOfMonth || changedStartDate); var needsNewStripePlan = changedAmount || changedFrequency || changedDayOfWeek || changedDayOfMonth || changedStartDate; var needsNewMpRecurringGift = changedAmount || changedProgram || needsNewStripePlan; var recurringGiftId = existingGift.RecurringGiftId.GetValueOrDefault(-1); int donorAccountId; if (changedPayment) { // If the payment method changed, we need to create a new Stripe Source. var source = _paymentService.UpdateCustomerSource(existingGift.StripeCustomerId, editGift.StripeTokenId); donorAccountId = _mpDonorService.CreateDonorAccount(source.brand, DonorRoutingNumberDefault, string.IsNullOrWhiteSpace(source.bank_last4) ? source.last4 : source.bank_last4, null, //Encrypted account existingGift.DonorId, source.id, existingGift.StripeCustomerId); // If we are not going to create a new Recurring Gift, then we'll update the existing // gift with the new donor account if (!needsNewMpRecurringGift) { _mpDonorService.UpdateRecurringGiftDonorAccount(authorizedUserToken, recurringGiftId, donorAccountId); } } else { // If the payment method is not changed, set the donorAccountId with the existing ID so we can use it later donorAccountId = existingGift.DonorAccountId.GetValueOrDefault(); } // Initialize a StripeSubscription, as we need the ID later on var stripeSubscription = new StripeSubscription {Id = existingGift.SubscriptionId}; if (needsNewMpRecurringGift) { if (needsNewStripePlan) { // Create the new Stripe Plan var plan = _paymentService.CreatePlan(editGift, donor); StripeSubscription oldSubscription; if (needsUpdatedStripeSubscription) { // If we just changed the amount, we just need to update the Subscription to point to the new plan oldSubscription = _paymentService.GetSubscription(existingGift.StripeCustomerId, stripeSubscription.Id); stripeSubscription = _paymentService.UpdateSubscriptionPlan(existingGift.StripeCustomerId, stripeSubscription.Id, plan.Id, oldSubscription.TrialEnd); } else { // Otherwise, we need to cancel the old Subscription and create a new one oldSubscription = _paymentService.CancelSubscription(existingGift.StripeCustomerId, stripeSubscription.Id); stripeSubscription = _paymentService.CreateSubscription(plan.Id, existingGift.StripeCustomerId, editGift.StartDate); } // In either case, we created a new Stripe Plan above, so cancel the old one _paymentService.CancelPlan(oldSubscription.Plan.Id); } // Cancel the old recurring gift, and create a new one _mpDonorService.CancelRecurringGift(authorizedUserToken, recurringGiftId); var contact = _mpContactService.GetContactById(donor.ContactId); var congregation = contact.Congregation_ID ?? 5; recurringGiftId = _mpDonorService.CreateRecurringGiftRecord(authorizedUserToken, donor.DonorId, donorAccountId, EnumMemberSerializationUtils.ToEnumString(editGift.PlanInterval), editGift.PlanAmount, editGift.StartDate, editGift.Program, stripeSubscription.Id, congregation); } // Get the new/updated recurring gift so we can return a DTO with all the new values var newGift = _mpDonorService.GetRecurringGiftById(authorizedUserToken, recurringGiftId); var newRecurringGift = new RecurringGiftDto { RecurringGiftId = newGift.RecurringGiftId.GetValueOrDefault(), StartDate = newGift.StartDate.GetValueOrDefault(), PlanAmount = newGift.Amount, PlanInterval = newGift.Frequency == RecurringGiftFrequencyWeekly ? PlanInterval.Weekly : PlanInterval.Monthly, Program = newGift.ProgramId, DonorID = newGift.DonorId, EmailAddress = donor.Email, SubscriptionID = stripeSubscription.Id, }; SendRecurringGiftConfirmationEmail(authorizedUserToken, _recurringGiftUpdateEmailTemplateId, newGift); return (newRecurringGift); }
public void TestGetSubscription() { var stripeSubscription = new StripeSubscription(); var stripeResponse = new Mock<IRestResponse<StripeSubscription>>(MockBehavior.Strict); stripeResponse.SetupGet(mocked => mocked.ResponseStatus).Returns(ResponseStatus.Completed).Verifiable(); stripeResponse.SetupGet(mocked => mocked.StatusCode).Returns(HttpStatusCode.OK).Verifiable(); stripeResponse.SetupGet(mocked => mocked.Data).Returns(stripeSubscription).Verifiable(); _restClient.Setup(mocked => mocked.Execute<StripeSubscription>(It.IsAny<IRestRequest>())).Returns(stripeResponse.Object); const string sub = "sub_123"; const string customer = "cus_123"; var response = _fixture.GetSubscription(customer, sub); _restClient.Verify( mocked => mocked.Execute<StripeSubscription>( It.Is<IRestRequest>( o => o.Method == Method.GET && o.Resource.Equals("customers/" + customer + "/subscriptions/" + sub)))); Assert.AreSame(stripeSubscription, response); }
public void TestUpdateSubscriptionPlanWithNoTrial() { var stripeSubscription = new StripeSubscription(); var stripeResponse = new Mock<IRestResponse<StripeSubscription>>(MockBehavior.Strict); stripeResponse.SetupGet(mocked => mocked.ResponseStatus).Returns(ResponseStatus.Completed).Verifiable(); stripeResponse.SetupGet(mocked => mocked.StatusCode).Returns(HttpStatusCode.OK).Verifiable(); stripeResponse.SetupGet(mocked => mocked.Data).Returns(stripeSubscription).Verifiable(); _restClient.Setup(mocked => mocked.Execute<StripeSubscription>(It.IsAny<IRestRequest>())).Returns(stripeResponse.Object); const string sub = "sub_123"; const string customer = "cus_123"; const string plan = "plan_123"; var response = _fixture.UpdateSubscriptionPlan(customer, sub, plan); _restClient.Verify( mocked => mocked.Execute<StripeSubscription>( It.Is<IRestRequest>( o => o.Method == Method.POST && o.Resource.Equals("customers/" + customer + "/subscriptions/" + sub) && o.Parameters.Matches("plan", plan) && o.Parameters.Matches("prorate", false) && !o.Parameters.Contains("trial_end")))); Assert.AreSame(stripeSubscription, response); }
public void TestCreateSubscriptionNoTrial() { var stripeSubscription = new StripeSubscription(); var stripeResponse = new Mock<IRestResponse<StripeSubscription>>(MockBehavior.Strict); stripeResponse.SetupGet(mocked => mocked.ResponseStatus).Returns(ResponseStatus.Completed).Verifiable(); stripeResponse.SetupGet(mocked => mocked.StatusCode).Returns(HttpStatusCode.OK).Verifiable(); stripeResponse.SetupGet(mocked => mocked.Data).Returns(stripeSubscription).Verifiable(); _restClient.Setup(mocked => mocked.Execute<StripeSubscription>(It.IsAny<IRestRequest>())).Returns(stripeResponse.Object); const string plan = "Take over the world."; const string customer = "cus_123"; var trialEndDate = DateTime.Today; var response = _fixture.CreateSubscription(plan, customer, trialEndDate); _restClient.Verify( mocked => mocked.Execute<StripeSubscription>( It.Is<IRestRequest>( o => o.Method == Method.POST && o.Resource.Equals("customers/" + customer + "/subscriptions") && o.Parameters.Matches("plan", plan) && !o.Parameters.Contains("trial_end")))); Assert.AreSame(stripeSubscription, response); }