diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 2b9b5d4a5..182a90af8 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -33,12 +33,12 @@ Metrics/LineLength: # Offense count: 32 # Configuration parameters: CountComments. Metrics/MethodLength: - Max: 48 + Max: 54 # Offense count: 1 # Configuration parameters: CountComments. Metrics/ModuleLength: - Max: 308 + Max: 314 # Offense count: 6 # Configuration parameters: CountKeywordArgs. diff --git a/.travis.yml b/.travis.yml index 8c214ea69..e532c5b2f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ sudo: false env: global: # If changing this number, please also change it in `test/test_helper.rb`. - - STRIPE_MOCK_VERSION=0.19.0 + - STRIPE_MOCK_VERSION=0.23.0 cache: directories: diff --git a/lib/stripe.rb b/lib/stripe.rb index d552fe2ca..3fa139d01 100644 --- a/lib/stripe.rb +++ b/lib/stripe.rb @@ -60,6 +60,12 @@ require "stripe/invoice_item" require "stripe/invoice_line_item" require "stripe/issuer_fraud_record" +require "stripe/issuing/authorization" +require "stripe/issuing/card" +require "stripe/issuing/cardholder" +require "stripe/issuing/card_details" +require "stripe/issuing/dispute" +require "stripe/issuing/transaction" require "stripe/login_link" require "stripe/order" require "stripe/order_return" diff --git a/lib/stripe/issuing/authorization.rb b/lib/stripe/issuing/authorization.rb new file mode 100644 index 000000000..048982f53 --- /dev/null +++ b/lib/stripe/issuing/authorization.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Stripe + module Issuing + class Authorization < Stripe::APIResource + extend Stripe::APIOperations::List + include Stripe::APIOperations::Save + + OBJECT_NAME = "issuing.authorization".freeze + + def approve(params = {}, opts = {}) + resp, opts = request(:post, resource_url + "/approve", params, opts) + initialize_from(resp.data, opts) + end + + def decline(params = {}, opts = {}) + resp, opts = request(:post, resource_url + "/decline", params, opts) + initialize_from(resp.data, opts) + end + end + end +end diff --git a/lib/stripe/issuing/card.rb b/lib/stripe/issuing/card.rb new file mode 100644 index 000000000..9ec4805ed --- /dev/null +++ b/lib/stripe/issuing/card.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Stripe + module Issuing + class Card < Stripe::APIResource + extend Stripe::APIOperations::Create + extend Stripe::APIOperations::List + include Stripe::APIOperations::Save + + OBJECT_NAME = "issuing.card".freeze + + def details(params = {}, opts = {}) + resp, opts = request(:get, resource_url + "/details", params, opts) + Util.convert_to_stripe_object(resp.data, opts) + end + end + end +end diff --git a/lib/stripe/issuing/card_details.rb b/lib/stripe/issuing/card_details.rb new file mode 100644 index 000000000..4d483cd57 --- /dev/null +++ b/lib/stripe/issuing/card_details.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module Stripe + module Issuing + class CardDetails < Stripe::StripeObject + OBJECT_NAME = "issuing.card_details".freeze + end + end +end diff --git a/lib/stripe/issuing/cardholder.rb b/lib/stripe/issuing/cardholder.rb new file mode 100644 index 000000000..2c1fd48b8 --- /dev/null +++ b/lib/stripe/issuing/cardholder.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Stripe + module Issuing + class Cardholder < Stripe::APIResource + extend Stripe::APIOperations::Create + extend Stripe::APIOperations::List + include Stripe::APIOperations::Save + + OBJECT_NAME = "issuing.cardholder".freeze + end + end +end diff --git a/lib/stripe/issuing/dispute.rb b/lib/stripe/issuing/dispute.rb new file mode 100644 index 000000000..251a8892d --- /dev/null +++ b/lib/stripe/issuing/dispute.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Stripe + module Issuing + class Dispute < Stripe::APIResource + extend Stripe::APIOperations::Create + extend Stripe::APIOperations::List + include Stripe::APIOperations::Save + + OBJECT_NAME = "issuing.dispute".freeze + end + end +end diff --git a/lib/stripe/issuing/transaction.rb b/lib/stripe/issuing/transaction.rb new file mode 100644 index 000000000..a2a64265d --- /dev/null +++ b/lib/stripe/issuing/transaction.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +module Stripe + module Issuing + class Transaction < Stripe::APIResource + extend Stripe::APIOperations::List + include Stripe::APIOperations::Save + + OBJECT_NAME = "issuing.transaction".freeze + end + end +end diff --git a/lib/stripe/util.rb b/lib/stripe/util.rb index 3d5f4d734..13011e933 100644 --- a/lib/stripe/util.rb +++ b/lib/stripe/util.rb @@ -45,51 +45,57 @@ def self.object_classes ListObject::OBJECT_NAME => ListObject, # business objects - Account::OBJECT_NAME => Account, - 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, - 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, - FileUpload::OBJECT_NAME => FileUpload, - Invoice::OBJECT_NAME => Invoice, - InvoiceItem::OBJECT_NAME => InvoiceItem, - InvoiceLineItem::OBJECT_NAME => InvoiceLineItem, - IssuerFraudRecord::OBJECT_NAME => IssuerFraudRecord, - LoginLink::OBJECT_NAME => LoginLink, - Order::OBJECT_NAME => Order, - OrderReturn::OBJECT_NAME => OrderReturn, - PaymentIntent::OBJECT_NAME => PaymentIntent, - Payout::OBJECT_NAME => Payout, - Plan::OBJECT_NAME => Plan, - Product::OBJECT_NAME => Product, - Recipient::OBJECT_NAME => Recipient, - RecipientTransfer::OBJECT_NAME => RecipientTransfer, - Refund::OBJECT_NAME => Refund, - Reversal::OBJECT_NAME => Reversal, - SKU::OBJECT_NAME => SKU, - Source::OBJECT_NAME => Source, - SourceTransaction::OBJECT_NAME => SourceTransaction, - Subscription::OBJECT_NAME => Subscription, - SubscriptionItem::OBJECT_NAME => SubscriptionItem, - ThreeDSecure::OBJECT_NAME => ThreeDSecure, - Token::OBJECT_NAME => Token, - Topup::OBJECT_NAME => Topup, - Transfer::OBJECT_NAME => Transfer, - UsageRecord::OBJECT_NAME => UsageRecord, + Account::OBJECT_NAME => Account, + 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, + 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, + FileUpload::OBJECT_NAME => FileUpload, + 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, + Plan::OBJECT_NAME => Plan, + Product::OBJECT_NAME => Product, + Recipient::OBJECT_NAME => Recipient, + RecipientTransfer::OBJECT_NAME => RecipientTransfer, + Refund::OBJECT_NAME => Refund, + Reversal::OBJECT_NAME => Reversal, + SKU::OBJECT_NAME => SKU, + Source::OBJECT_NAME => Source, + SourceTransaction::OBJECT_NAME => SourceTransaction, + Subscription::OBJECT_NAME => Subscription, + SubscriptionItem::OBJECT_NAME => SubscriptionItem, + ThreeDSecure::OBJECT_NAME => ThreeDSecure, + Token::OBJECT_NAME => Token, + Topup::OBJECT_NAME => Topup, + Transfer::OBJECT_NAME => Transfer, + UsageRecord::OBJECT_NAME => UsageRecord, } end diff --git a/test/stripe/api_operations_test.rb b/test/stripe/api_operations_test.rb index bad71667e..ef39144ee 100644 --- a/test/stripe/api_operations_test.rb +++ b/test/stripe/api_operations_test.rb @@ -38,6 +38,8 @@ class MainResource < APIResource OBJECT_NAME = "mainresource".freeze nested_resource_class_methods :nested, operations: %i[create retrieve update delete list] + + OBJECT_NAME = "mainresource".freeze end should "define a create method" do diff --git a/test/stripe/issuing/authorization_test.rb b/test/stripe/issuing/authorization_test.rb new file mode 100644 index 000000000..8e912dd29 --- /dev/null +++ b/test/stripe/issuing/authorization_test.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require File.expand_path("../../../test_helper", __FILE__) + +module Stripe + module Issuing + class AuthorizationTest < Test::Unit::TestCase + should "be listable" do + authorizations = Stripe::Issuing::Authorization.list + assert_requested :get, "#{Stripe.api_base}/v1/issuing/authorizations" + assert authorizations.data.is_a?(Array) + assert authorizations.data[0].is_a?(Stripe::Issuing::Authorization) + end + + should "be retrievable" do + authorization = Stripe::Issuing::Authorization.retrieve("iauth_123") + assert_requested :get, "#{Stripe.api_base}/v1/issuing/authorizations/iauth_123" + assert authorization.is_a?(Stripe::Issuing::Authorization) + end + + should "be saveable" do + authorization = Stripe::Issuing::Authorization.retrieve("iauth_123") + authorization.metadata["key"] = "value" + authorization.save + assert_requested :post, "#{Stripe.api_base}/v1/issuing/authorizations/#{authorization.id}" + assert authorization.is_a?(Stripe::Issuing::Authorization) + end + + should "be updateable" do + authorization = Stripe::Issuing::Authorization.update("iauth_123", metadata: { foo: "bar" }) + assert_requested :post, "#{Stripe.api_base}/v1/issuing/authorizations/iauth_123" + assert authorization.is_a?(Stripe::Issuing::Authorization) + end + + should "be approveable" do + authorization = Stripe::Issuing::Authorization.retrieve("iauth_123") + authorization.approve + assert_requested :post, "#{Stripe.api_base}/v1/issuing/authorizations/iauth_123/approve" + assert authorization.is_a?(Stripe::Issuing::Authorization) + end + + should "be declineable" do + authorization = Stripe::Issuing::Authorization.retrieve("iauth_123") + authorization.decline + assert_requested :post, "#{Stripe.api_base}/v1/issuing/authorizations/iauth_123/decline" + assert authorization.is_a?(Stripe::Issuing::Authorization) + end + end + end +end diff --git a/test/stripe/issuing/card_test.rb b/test/stripe/issuing/card_test.rb new file mode 100644 index 000000000..e55712974 --- /dev/null +++ b/test/stripe/issuing/card_test.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require File.expand_path("../../../test_helper", __FILE__) + +module Stripe + module Issuing + class CardTest < Test::Unit::TestCase + should "be creatable" do + card = Stripe::Issuing::Card.create( + currency: "usd", + type: "physical" + ) + assert_requested :post, "#{Stripe.api_base}/v1/issuing/cards" + assert card.is_a?(Stripe::Issuing::Card) + end + + should "be listable" do + cards = Stripe::Issuing::Card.list + assert_requested :get, "#{Stripe.api_base}/v1/issuing/cards" + assert cards.data.is_a?(Array) + assert cards.data[0].is_a?(Stripe::Issuing::Card) + end + + should "be retrievable" do + card = Stripe::Issuing::Card.retrieve("ic_123") + assert_requested :get, "#{Stripe.api_base}/v1/issuing/cards/ic_123" + assert card.is_a?(Stripe::Issuing::Card) + end + + should "be saveable" do + card = Stripe::Issuing::Card.retrieve("ic_123") + card.metadata["key"] = "value" + card.save + assert_requested :post, "#{Stripe.api_base}/v1/issuing/cards/ic_123" + assert card.is_a?(Stripe::Issuing::Card) + end + + should "be updateable" do + card = Stripe::Issuing::Card.update("ic_123", metadata: { foo: "bar" }) + assert_requested :post, "#{Stripe.api_base}/v1/issuing/cards/ic_123" + assert card.is_a?(Stripe::Issuing::Card) + end + + should "be able to retrieve card details" do + card = Stripe::Issuing::Card.retrieve("ic_123") + + card_details = card.details + assert_requested :get, "#{Stripe.api_base}/v1/issuing/cards/ic_123/details" + assert card_details.is_a?(Stripe::Issuing::CardDetails) + end + end + end +end diff --git a/test/stripe/issuing/cardholder_test.rb b/test/stripe/issuing/cardholder_test.rb new file mode 100644 index 000000000..dc10711ab --- /dev/null +++ b/test/stripe/issuing/cardholder_test.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require File.expand_path("../../../test_helper", __FILE__) + +module Stripe + module Issuing + class CardholderTest < Test::Unit::TestCase + should "be creatable" do + cardholder = Stripe::Issuing::Cardholder.create( + billing: { + address: { + city: "city", + country: "US", + line1: "line1", + postal_code: "postal_code", + }, + }, + name: "Jenny Rosen", + type: "individual" + ) + assert_requested :post, "#{Stripe.api_base}/v1/issuing/cardholders" + assert cardholder.is_a?(Stripe::Issuing::Cardholder) + end + + should "be listable" do + cardholders = Stripe::Issuing::Cardholder.list + assert_requested :get, "#{Stripe.api_base}/v1/issuing/cardholders" + assert cardholders.data.is_a?(Array) + assert cardholders.data[0].is_a?(Stripe::Issuing::Cardholder) + end + + should "be retrievable" do + cardholder = Stripe::Issuing::Cardholder.retrieve("ich_123") + assert_requested :get, "#{Stripe.api_base}/v1/issuing/cardholders/ich_123" + assert cardholder.is_a?(Stripe::Issuing::Cardholder) + end + + should "be saveable" do + cardholder = Stripe::Issuing::Cardholder.retrieve("ich_123") + cardholder.metadata["key"] = "value" + cardholder.save + assert_requested :post, "#{Stripe.api_base}/v1/issuing/cardholders/#{cardholder.id}" + assert cardholder.is_a?(Stripe::Issuing::Cardholder) + end + + should "be updateable" do + cardholder = Stripe::Issuing::Cardholder.update("ich_123", metadata: { foo: "bar" }) + assert_requested :post, "#{Stripe.api_base}/v1/issuing/cardholders/ich_123" + assert cardholder.is_a?(Stripe::Issuing::Cardholder) + end + end + end +end diff --git a/test/stripe/issuing/dispute_test.rb b/test/stripe/issuing/dispute_test.rb new file mode 100644 index 000000000..9ad4a1072 --- /dev/null +++ b/test/stripe/issuing/dispute_test.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require File.expand_path("../../../test_helper", __FILE__) + +module Stripe + module Issuing + class DisputeTest < Test::Unit::TestCase + should "be creatable" do + dispute = Stripe::Issuing::Dispute.create( + reason: "fraudulent", + transaction: "ipi_123" + ) + assert_requested :post, "#{Stripe.api_base}/v1/issuing/disputes" + assert dispute.is_a?(Stripe::Issuing::Dispute) + end + + should "be listable" do + disputes = Stripe::Issuing::Dispute.list + assert_requested :get, "#{Stripe.api_base}/v1/issuing/disputes" + assert disputes.data.is_a?(Array) + assert disputes.data[0].is_a?(Stripe::Issuing::Dispute) + end + + should "be retrievable" do + dispute = Stripe::Issuing::Dispute.retrieve("ich_123") + assert_requested :get, "#{Stripe.api_base}/v1/issuing/disputes/ich_123" + assert dispute.is_a?(Stripe::Issuing::Dispute) + end + + should "be saveable" do + dispute = Stripe::Issuing::Dispute.retrieve("ich_123") + dispute.metadata["key"] = "value" + dispute.save + assert_requested :post, "#{Stripe.api_base}/v1/issuing/disputes/#{dispute.id}" + assert dispute.is_a?(Stripe::Issuing::Dispute) + end + + should "be updateable" do + dispute = Stripe::Issuing::Dispute.update("ich_123", metadata: { foo: "bar" }) + assert_requested :post, "#{Stripe.api_base}/v1/issuing/disputes/ich_123" + assert dispute.is_a?(Stripe::Issuing::Dispute) + end + end + end +end diff --git a/test/stripe/issuing/transaction_test.rb b/test/stripe/issuing/transaction_test.rb new file mode 100644 index 000000000..5f2eb0216 --- /dev/null +++ b/test/stripe/issuing/transaction_test.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require File.expand_path("../../../test_helper", __FILE__) + +module Stripe + module Issuing + class TransactionTest < Test::Unit::TestCase + should "be listable" do + stub_request(:get, "#{Stripe.api_base}/v1/issuing/transactions") + .to_return(body: JSON.generate(object: "list", data: [{ id: "ipi_123", object: "issuing.transaction" }])) + + transactions = Stripe::Issuing::Transaction.list + assert_requested :get, "#{Stripe.api_base}/v1/issuing/transactions" + assert transactions.data.is_a?(Array) + assert transactions.data[0].is_a?(Stripe::Issuing::Transaction) + end + + should "be retrievable" do + stub_request(:get, "#{Stripe.api_base}/v1/issuing/transactions/ipi_123") + .to_return(body: JSON.generate(id: "ipi_123", object: "issuing.transaction")) + + transaction = Stripe::Issuing::Transaction.retrieve("ipi_123") + assert_requested :get, "#{Stripe.api_base}/v1/issuing/transactions/ipi_123" + assert transaction.is_a?(Stripe::Issuing::Transaction) + end + + should "be saveable" do + stub_request(:post, "#{Stripe.api_base}/v1/issuing/transactions/ipi_123") + .to_return(body: JSON.generate(id: "ipi_123", object: "issuing.transaction")) + + transaction = Stripe::Issuing::Transaction.construct_from(id: "ipi_123", object: "issuing.transaction", metadata: {}) + transaction.metadata["key"] = "value" + transaction.save + assert_requested :post, "#{Stripe.api_base}/v1/issuing/transactions/#{transaction.id}" + assert transaction.is_a?(Stripe::Issuing::Transaction) + end + + should "be updateable" do + stub_request(:post, "#{Stripe.api_base}/v1/issuing/transactions/ipi_123") + .to_return(body: JSON.generate(id: "ipi_123", object: "issuing.transaction")) + + transaction = Stripe::Issuing::Transaction.update("ipi_123", metadata: { foo: "bar" }) + assert_requested :post, "#{Stripe.api_base}/v1/issuing/transactions/ipi_123" + assert transaction.is_a?(Stripe::Issuing::Transaction) + end + end + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 0a722c379..d608f5ff6 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -16,7 +16,7 @@ require File.expand_path("../test_data", __FILE__) # If changing this number, please also change it in `.travis.yml`. -MOCK_MINIMUM_VERSION = "0.16.0".freeze +MOCK_MINIMUM_VERSION = "0.23.0".freeze MOCK_PORT = ENV["STRIPE_MOCK_PORT"] || 12_111 # Disable all real network connections except those that are outgoing to