From d7848199012afa77d6333d1530f8490dc9eff52f Mon Sep 17 00:00:00 2001 From: Remi Jannel Date: Tue, 29 Jan 2019 20:03:11 -0800 Subject: [PATCH] Add support for Subscription Schedules --- .travis.yml | 2 +- lib/stripe.rb | 2 + lib/stripe/subscription_schedule.rb | 32 +++++ lib/stripe/subscription_schedule_revision.rb | 25 ++++ lib/stripe/util.rb | 136 +++++++++--------- test/stripe/checkout/session_test.rb | 2 +- test/stripe/payment_intent_test.rb | 4 +- .../subscription_schedule_revision_test.rb | 37 +++++ ...tion_schedule_revisions_operations_test.rb | 35 +++++ test/stripe/subscription_schedule_test.rb | 64 +++++++++ test/test_helper.rb | 2 +- 11 files changed, 269 insertions(+), 72 deletions(-) create mode 100644 lib/stripe/subscription_schedule.rb create mode 100644 lib/stripe/subscription_schedule_revision.rb create mode 100644 test/stripe/subscription_schedule_revision_test.rb create mode 100644 test/stripe/subscription_schedule_revisions_operations_test.rb create mode 100644 test/stripe/subscription_schedule_test.rb diff --git a/.travis.yml b/.travis.yml index 49a263698..c16dd9122 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,7 @@ sudo: false env: global: # If changing this number, please also change it in `test/test_helper.rb`. - - STRIPE_MOCK_VERSION=0.42.0 + - STRIPE_MOCK_VERSION=0.44.0 cache: directories: diff --git a/lib/stripe.rb b/lib/stripe.rb index a2463c6b6..67d39075b 100644 --- a/lib/stripe.rb +++ b/lib/stripe.rb @@ -92,6 +92,8 @@ require "stripe/source_transaction" require "stripe/subscription" require "stripe/subscription_item" +require "stripe/subscription_schedule" +require "stripe/subscription_schedule_revision" require "stripe/terminal/connection_token" require "stripe/terminal/location" require "stripe/terminal/reader" diff --git a/lib/stripe/subscription_schedule.rb b/lib/stripe/subscription_schedule.rb new file mode 100644 index 000000000..2bfdccfac --- /dev/null +++ b/lib/stripe/subscription_schedule.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Stripe + class SubscriptionSchedule < APIResource + extend Stripe::APIOperations::List + extend Stripe::APIOperations::Create + include Stripe::APIOperations::Save + extend Stripe::APIOperations::NestedResource + + OBJECT_NAME = "subscription_schedule".freeze + + nested_resource_class_methods :revision, + operations: %i[retrieve list] + + def cancel(params = {}, opts = {}) + url = resource_url + "/cancel" + resp, opts = request(:post, url, params, opts) + initialize_from(resp.data, opts) + end + + def release(params = {}, opts = {}) + url = resource_url + "/release" + resp, opts = request(:post, url, params, opts) + initialize_from(resp.data, opts) + end + + def revisions(params = {}, opts = {}) + resp, opts = request(:get, resource_url + "/revisions", params, Util.normalize_opts(opts)) + Util.convert_to_stripe_object(resp.data, opts) + end + end +end diff --git a/lib/stripe/subscription_schedule_revision.rb b/lib/stripe/subscription_schedule_revision.rb new file mode 100644 index 000000000..b4293b601 --- /dev/null +++ b/lib/stripe/subscription_schedule_revision.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Stripe + class SubscriptionScheduleRevision < APIResource + extend Stripe::APIOperations::List + + OBJECT_NAME = "subscription_schedule_revision".freeze + + def resource_url + if !respond_to?(:schedule) || schedule.nil? + raise NotImplementedError, + "Subscription Schedule Revisions cannot be accessed without a Subscription Schedule ID." + end + "#{SubscriptionSchedule.resource_url}/#{CGI.escape(schedule)}/revisions/#{CGI.escape(id)}" + end + + def self.retrieve(_id, _opts = {}) + raise NotImplementedError, "Subscription Schedule Revisions cannot be retrieved without a Subscription Schedule ID. Retrieve it using schedule.revisions.retrieve('revision_id')" + end + + def self.list(_id, _opts = {}) + raise NotImplementedError, "Subscription Schedule Revisions cannot be listed without a Subscription Schedule ID. List those using schedule.revisions" + end + end +end diff --git a/lib/stripe/util.rb b/lib/stripe/util.rb index b1831dfe3..a89ef9eac 100644 --- a/lib/stripe/util.rb +++ b/lib/stripe/util.rb @@ -45,73 +45,75 @@ def self.object_classes # rubocop:disable Metrics/MethodLength ListObject::OBJECT_NAME => ListObject, # business objects - Account::OBJECT_NAME => Account, - AccountLink::OBJECT_NAME => AccountLink, - AlipayAccount::OBJECT_NAME => AlipayAccount, - ApplePayDomain::OBJECT_NAME => ApplePayDomain, - ApplicationFee::OBJECT_NAME => ApplicationFee, - ApplicationFeeRefund::OBJECT_NAME => ApplicationFeeRefund, - Balance::OBJECT_NAME => Balance, - BalanceTransaction::OBJECT_NAME => BalanceTransaction, - BankAccount::OBJECT_NAME => BankAccount, - BitcoinReceiver::OBJECT_NAME => BitcoinReceiver, - BitcoinTransaction::OBJECT_NAME => BitcoinTransaction, - Card::OBJECT_NAME => Card, - Charge::OBJECT_NAME => Charge, - Checkout::Session::OBJECT_NAME => Checkout::Session, - CountrySpec::OBJECT_NAME => CountrySpec, - Coupon::OBJECT_NAME => Coupon, - Customer::OBJECT_NAME => Customer, - Dispute::OBJECT_NAME => Dispute, - EphemeralKey::OBJECT_NAME => EphemeralKey, - Event::OBJECT_NAME => Event, - ExchangeRate::OBJECT_NAME => ExchangeRate, - File::OBJECT_NAME => File, - File::OBJECT_NAME_ALT => File, - FileLink::OBJECT_NAME => FileLink, - Invoice::OBJECT_NAME => Invoice, - InvoiceItem::OBJECT_NAME => InvoiceItem, - InvoiceLineItem::OBJECT_NAME => InvoiceLineItem, - IssuerFraudRecord::OBJECT_NAME => IssuerFraudRecord, - Issuing::Authorization::OBJECT_NAME => Issuing::Authorization, - Issuing::Card::OBJECT_NAME => Issuing::Card, - Issuing::CardDetails::OBJECT_NAME => Issuing::CardDetails, - Issuing::Cardholder::OBJECT_NAME => Issuing::Cardholder, - Issuing::Dispute::OBJECT_NAME => Issuing::Dispute, - Issuing::Transaction::OBJECT_NAME => Issuing::Transaction, - LoginLink::OBJECT_NAME => LoginLink, - Order::OBJECT_NAME => Order, - OrderReturn::OBJECT_NAME => OrderReturn, - PaymentIntent::OBJECT_NAME => PaymentIntent, - Payout::OBJECT_NAME => Payout, - Person::OBJECT_NAME => Person, - Plan::OBJECT_NAME => Plan, - Product::OBJECT_NAME => Product, - Radar::ValueList::OBJECT_NAME => Radar::ValueList, - Radar::ValueListItem::OBJECT_NAME => Radar::ValueListItem, - Recipient::OBJECT_NAME => Recipient, - RecipientTransfer::OBJECT_NAME => RecipientTransfer, - Refund::OBJECT_NAME => Refund, - Reporting::ReportRun::OBJECT_NAME => Reporting::ReportRun, - Reporting::ReportType::OBJECT_NAME => Reporting::ReportType, - Reversal::OBJECT_NAME => Reversal, - Review::OBJECT_NAME => Review, - SKU::OBJECT_NAME => SKU, - Sigma::ScheduledQueryRun::OBJECT_NAME => Sigma::ScheduledQueryRun, - Source::OBJECT_NAME => Source, - SourceTransaction::OBJECT_NAME => SourceTransaction, - Subscription::OBJECT_NAME => Subscription, - SubscriptionItem::OBJECT_NAME => SubscriptionItem, - Terminal::ConnectionToken::OBJECT_NAME => Terminal::ConnectionToken, - Terminal::Location::OBJECT_NAME => Terminal::Location, - Terminal::Reader::OBJECT_NAME => Terminal::Reader, - ThreeDSecure::OBJECT_NAME => ThreeDSecure, - Token::OBJECT_NAME => Token, - Topup::OBJECT_NAME => Topup, - Transfer::OBJECT_NAME => Transfer, - UsageRecord::OBJECT_NAME => UsageRecord, - UsageRecordSummary::OBJECT_NAME => UsageRecordSummary, - WebhookEndpoint::OBJECT_NAME => WebhookEndpoint, + Account::OBJECT_NAME => Account, + AccountLink::OBJECT_NAME => AccountLink, + AlipayAccount::OBJECT_NAME => AlipayAccount, + ApplePayDomain::OBJECT_NAME => ApplePayDomain, + ApplicationFee::OBJECT_NAME => ApplicationFee, + ApplicationFeeRefund::OBJECT_NAME => ApplicationFeeRefund, + Balance::OBJECT_NAME => Balance, + BalanceTransaction::OBJECT_NAME => BalanceTransaction, + BankAccount::OBJECT_NAME => BankAccount, + BitcoinReceiver::OBJECT_NAME => BitcoinReceiver, + BitcoinTransaction::OBJECT_NAME => BitcoinTransaction, + Card::OBJECT_NAME => Card, + Charge::OBJECT_NAME => Charge, + Checkout::Session::OBJECT_NAME => Checkout::Session, + CountrySpec::OBJECT_NAME => CountrySpec, + Coupon::OBJECT_NAME => Coupon, + Customer::OBJECT_NAME => Customer, + Dispute::OBJECT_NAME => Dispute, + EphemeralKey::OBJECT_NAME => EphemeralKey, + Event::OBJECT_NAME => Event, + ExchangeRate::OBJECT_NAME => ExchangeRate, + File::OBJECT_NAME => File, + File::OBJECT_NAME_ALT => File, + FileLink::OBJECT_NAME => FileLink, + Invoice::OBJECT_NAME => Invoice, + InvoiceItem::OBJECT_NAME => InvoiceItem, + InvoiceLineItem::OBJECT_NAME => InvoiceLineItem, + IssuerFraudRecord::OBJECT_NAME => IssuerFraudRecord, + Issuing::Authorization::OBJECT_NAME => Issuing::Authorization, + Issuing::Card::OBJECT_NAME => Issuing::Card, + Issuing::CardDetails::OBJECT_NAME => Issuing::CardDetails, + Issuing::Cardholder::OBJECT_NAME => Issuing::Cardholder, + Issuing::Dispute::OBJECT_NAME => Issuing::Dispute, + Issuing::Transaction::OBJECT_NAME => Issuing::Transaction, + LoginLink::OBJECT_NAME => LoginLink, + Order::OBJECT_NAME => Order, + OrderReturn::OBJECT_NAME => OrderReturn, + PaymentIntent::OBJECT_NAME => PaymentIntent, + Payout::OBJECT_NAME => Payout, + Person::OBJECT_NAME => Person, + Plan::OBJECT_NAME => Plan, + Product::OBJECT_NAME => Product, + Radar::ValueList::OBJECT_NAME => Radar::ValueList, + Radar::ValueListItem::OBJECT_NAME => Radar::ValueListItem, + Recipient::OBJECT_NAME => Recipient, + RecipientTransfer::OBJECT_NAME => RecipientTransfer, + Refund::OBJECT_NAME => Refund, + Reporting::ReportRun::OBJECT_NAME => Reporting::ReportRun, + Reporting::ReportType::OBJECT_NAME => Reporting::ReportType, + Reversal::OBJECT_NAME => Reversal, + Review::OBJECT_NAME => Review, + SKU::OBJECT_NAME => SKU, + Sigma::ScheduledQueryRun::OBJECT_NAME => Sigma::ScheduledQueryRun, + Source::OBJECT_NAME => Source, + SourceTransaction::OBJECT_NAME => SourceTransaction, + Subscription::OBJECT_NAME => Subscription, + SubscriptionItem::OBJECT_NAME => SubscriptionItem, + SubscriptionSchedule::OBJECT_NAME => SubscriptionSchedule, + SubscriptionScheduleRevision::OBJECT_NAME => SubscriptionScheduleRevision, + Terminal::ConnectionToken::OBJECT_NAME => Terminal::ConnectionToken, + Terminal::Location::OBJECT_NAME => Terminal::Location, + Terminal::Reader::OBJECT_NAME => Terminal::Reader, + ThreeDSecure::OBJECT_NAME => ThreeDSecure, + Token::OBJECT_NAME => Token, + Topup::OBJECT_NAME => Topup, + Transfer::OBJECT_NAME => Transfer, + UsageRecord::OBJECT_NAME => UsageRecord, + UsageRecordSummary::OBJECT_NAME => UsageRecordSummary, + WebhookEndpoint::OBJECT_NAME => WebhookEndpoint, } end diff --git a/test/stripe/checkout/session_test.rb b/test/stripe/checkout/session_test.rb index 72d75bc3f..e104086a7 100644 --- a/test/stripe/checkout/session_test.rb +++ b/test/stripe/checkout/session_test.rb @@ -7,7 +7,6 @@ module Checkout class SessionTest < Test::Unit::TestCase should "be creatable" do session = Stripe::Checkout::Session.create( - allowed_source_types: ["card"], cancel_url: "https://stripe.com/cancel", client_reference_id: "1234", line_items: [ @@ -25,6 +24,7 @@ class SessionTest < Test::Unit::TestCase payment_intent_data: [ receipt_email: "test@stripe.com", ], + payment_method_types: ["card"], success_url: "https://stripe.com/success" ) assert_requested :post, "#{Stripe.api_base}/v1/checkout/sessions" diff --git a/test/stripe/payment_intent_test.rb b/test/stripe/payment_intent_test.rb index 70b7e02e9..dab87c86a 100644 --- a/test/stripe/payment_intent_test.rb +++ b/test/stripe/payment_intent_test.rb @@ -21,9 +21,9 @@ class PaymentIntentTest < Test::Unit::TestCase should "be creatable" do payment_intent = Stripe::PaymentIntent.create( - allowed_source_types: ["card"], amount: 1234, - currency: "usd" + currency: "usd", + payment_method_types: ["card"] ) assert_requested :post, "#{Stripe.api_base}/v1/payment_intents" assert payment_intent.is_a?(Stripe::PaymentIntent) diff --git a/test/stripe/subscription_schedule_revision_test.rb b/test/stripe/subscription_schedule_revision_test.rb new file mode 100644 index 000000000..33981c0e9 --- /dev/null +++ b/test/stripe/subscription_schedule_revision_test.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require ::File.expand_path("../../test_helper", __FILE__) + +module Stripe + class SubscriptionScheduleRevisionTest < Test::Unit::TestCase + context "#resource_url" do + should "return a resource URL" do + revision = Stripe::SubscriptionScheduleRevision.construct_from( + id: "sub_sched_rev_123", + schedule: "sub_sched_123" + ) + assert_equal "/v1/subscription_schedules/sub_sched_123/revisions/sub_sched_rev_123", + revision.resource_url + end + + should "raise without a subscription schedule" do + revision = Stripe::SubscriptionScheduleRevision.construct_from(id: "sub_sched_rev_123") + assert_raises NotImplementedError do + revision.resource_url + end + end + end + + should "raise on #retrieve" do + assert_raises NotImplementedError do + Stripe::SubscriptionScheduleRevision.retrieve("sub_sched_rev_123") + end + end + + should "raise on #list" do + assert_raises NotImplementedError do + Stripe::SubscriptionScheduleRevision.list("sub_sched_rev_123", {}) + end + end + end +end diff --git a/test/stripe/subscription_schedule_revisions_operations_test.rb b/test/stripe/subscription_schedule_revisions_operations_test.rb new file mode 100644 index 000000000..92115c95a --- /dev/null +++ b/test/stripe/subscription_schedule_revisions_operations_test.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require ::File.expand_path("../../test_helper", __FILE__) + +module Stripe + class SubscriptionScheduleRevisionsOperationsTest < Test::Unit::TestCase + setup do + @schedule_id = "sub_sched_123" + @revision_id = "sub_sched_rev_123" + end + + context "#retrieve_revision" do + should "retrieve a subscription schedule revision" do + revision = Stripe::SubscriptionSchedule.retrieve_revision( + @schedule_id, + @revision_id + ) + assert_requested :get, "#{Stripe.api_base}/v1/subscription_schedules/#{@schedule_id}/revisions/#{@revision_id}" + assert revision.is_a?(Stripe::SubscriptionScheduleRevision) + end + end + + context "#list_revisions" do + should "list a subscription schedule's revisions" do + revisions = Stripe::SubscriptionSchedule.list_revisions( + @schedule_id + ) + assert_requested :get, "#{Stripe.api_base}/v1/subscription_schedules/#{@schedule_id}/revisions" + assert revisions.is_a?(Stripe::ListObject) + assert revisions.data.is_a?(Array) + assert revisions.data[0].is_a?(Stripe::SubscriptionScheduleRevision) + end + end + end +end diff --git a/test/stripe/subscription_schedule_test.rb b/test/stripe/subscription_schedule_test.rb new file mode 100644 index 000000000..a280641ab --- /dev/null +++ b/test/stripe/subscription_schedule_test.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +require ::File.expand_path("../../test_helper", __FILE__) + +module Stripe + class SubscriptionScheduleTest < Test::Unit::TestCase + should "be listable" do + subscriptions = Stripe::SubscriptionSchedule.list + assert_requested :get, "#{Stripe.api_base}/v1/subscription_schedules" + assert subscriptions.data.is_a?(Array) + assert subscriptions.data[0].is_a?(Stripe::SubscriptionSchedule) + end + + should "be retrievable" do + schedule = Stripe::SubscriptionSchedule.retrieve("sub_sched_123") + assert_requested :get, + "#{Stripe.api_base}/v1/subscription_schedules/sub_sched_123" + assert schedule.is_a?(Stripe::SubscriptionSchedule) + end + + should "be creatable" do + schedule = Stripe::SubscriptionSchedule.create( + customer: "cus_123" + ) + assert_requested :post, "#{Stripe.api_base}/v1/subscription_schedules" + assert schedule.is_a?(Stripe::SubscriptionSchedule) + end + + should "be saveable" do + schedule = Stripe::SubscriptionSchedule.retrieve("sub_sched_123") + schedule.metadata["key"] = "value" + schedule.save + assert_requested :post, + "#{Stripe.api_base}/v1/subscription_schedules/#{schedule.id}" + end + + should "be updateable" do + schedule = Stripe::SubscriptionSchedule.update("sub_sched_123", metadata: { foo: "bar" }) + assert_requested :post, + "#{Stripe.api_base}/v1/subscription_schedules/sub_sched_123" + assert schedule.is_a?(Stripe::SubscriptionSchedule) + end + + context "#cancel" do + should "cancel a subscription schedule" do + schedule = Stripe::SubscriptionSchedule.retrieve("sub_sched_123") + schedule = schedule.cancel + assert_requested :post, + "#{Stripe.api_base}/v1/subscription_schedules/#{schedule.id}/cancel" + assert schedule.is_a?(Stripe::SubscriptionSchedule) + end + end + + context "#release" do + should "release a subscription schedule" do + schedule = Stripe::SubscriptionSchedule.retrieve("sub_sched_123") + schedule = schedule.release + assert_requested :post, + "#{Stripe.api_base}/v1/subscription_schedules/#{schedule.id}/release" + assert schedule.is_a?(Stripe::SubscriptionSchedule) + end + end + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index d077ddaef..a3a428e5f 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -17,7 +17,7 @@ require ::File.expand_path("../stripe_mock", __FILE__) # If changing this number, please also change it in `.travis.yml`. -MOCK_MINIMUM_VERSION = "0.42.0".freeze +MOCK_MINIMUM_VERSION = "0.44.0".freeze MOCK_PORT = Stripe::StripeMock.start # Disable all real network connections except those that are outgoing to