From 449fd6c49c6f19e8a70fb1a766f56b9cc3189199 Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 6 May 2022 22:26:52 -0500 Subject: [PATCH] upgrades: factor out Stripe integration. Factor out the Stripe code from the UserUpgrade class. Introduce a new PaymentTransaction abstract class that represents a payment with some payment processor, and a PaymentTransaction::Stripe class that implements transactions with Stripe. Note that we can't completely eliminate Stripe even though we no longer accept payments with it because we still need to be able to look up old payments in Stripe. --- app/controllers/webhooks_controller.rb | 2 +- app/logical/payment_transaction.rb | 55 ++++++ app/logical/payment_transaction/stripe.rb | 190 ++++++++++++++++++++ app/models/user_upgrade.rb | 187 +------------------ app/views/user_upgrades/create.js.erb | 2 +- config/danbooru_default_config.rb | 5 + test/functional/webhooks_controller_test.rb | 22 +-- test/test_helpers/stripe_test_helper.rb | 4 +- test/unit/user_upgrade_test.rb | 40 ++--- 9 files changed, 293 insertions(+), 214 deletions(-) create mode 100644 app/logical/payment_transaction.rb create mode 100644 app/logical/payment_transaction/stripe.rb diff --git a/app/controllers/webhooks_controller.rb b/app/controllers/webhooks_controller.rb index 7e588a2f4..fef02abb2 100644 --- a/app/controllers/webhooks_controller.rb +++ b/app/controllers/webhooks_controller.rb @@ -8,7 +8,7 @@ class WebhooksController < ApplicationController def receive case params[:source] when "stripe" - UserUpgrade.receive_webhook(request) + PaymentTransaction::Stripe.receive_webhook(request) head 200 when "discord" json = DiscordSlashCommand.receive_webhook(request) diff --git a/app/logical/payment_transaction.rb b/app/logical/payment_transaction.rb new file mode 100644 index 000000000..3d0839f7a --- /dev/null +++ b/app/logical/payment_transaction.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +# A PaymentTransaction represents a payment in some payment processor's backend API. +# +# @see app/logical/payment_transaction/stripe.rb +class PaymentTransaction + attr_reader :user_upgrade + delegate :recipient, :purchaser, :upgrade_type, :pending?, :stripe_id, to: :user_upgrade + + def initialize(user_upgrade) + @user_upgrade = user_upgrade + end + + # Initiate a new payment. Normally this sets up a checkout page with the payment processor, which + # we redirect the user to. When the payment succeeds, the user is redirected to a success page and + # the processor sends us a webhook, which we catch to finalize the upgrade. If the payment fails, + # the user is redirected to an error page and the upgrade doesn't go through. + # + # Normally this returns a processor-specific transaction object containing an ID or URL, which is + # used to redirect to the checkout page. + def create!(country: "US", allow_promotion_codes: false) + raise NotImplementedError + end + + # Refund a completed payment to the purchaser. + def refund! + raise NotImplementedError + end + + # Handle a webhook from the payment processor. Normally the payment processor sends us a webhook + # to notify us of successful payments, which we listen for to complete the upgrade. + def receive_webhook!(request) + raise NotImplementedError + end + + # A public link to the payment processor's receipt for the transaction. + def receipt_url + nil + end + + # A private link to the transaction in the payment processor's admin area. + def payment_url + nil + end + + # The amount of money paid in the transaction. + def amount + nil + end + + # The currency used in the transaction. + def currency + nil + end +end diff --git a/app/logical/payment_transaction/stripe.rb b/app/logical/payment_transaction/stripe.rb new file mode 100644 index 000000000..7f6c1d4f5 --- /dev/null +++ b/app/logical/payment_transaction/stripe.rb @@ -0,0 +1,190 @@ +# frozen_string_literal: true + +class PaymentTransaction::Stripe < PaymentTransaction + delegate :stripe_id, to: :user_upgrade + + def self.enabled? + Danbooru.config.stripe_secret_key.present? && Danbooru.config.stripe_publishable_key.present? && Danbooru.config.stripe_webhook_secret.present? + end + + def create!(country: "US", allow_promotion_codes: false) + checkout_session = ::Stripe::Checkout::Session.create( + mode: "payment", + success_url: Routes.user_upgrade_url(user_upgrade), + cancel_url: Routes.new_user_upgrade_url(user_id: recipient.id), + client_reference_id: "user_upgrade_#{user_upgrade.id}", + customer_email: purchaser.email_address&.address, + payment_method_types: payment_method_types(country), + allow_promotion_codes: allow_promotion_codes.presence, + line_items: [{ + price: upgrade_price_id(country), + quantity: 1, + }], + discounts: [{ + coupon: promotion_discount_id, + }], + metadata: { + user_upgrade_id: user_upgrade.id, + purchaser_id: purchaser.id, + recipient_id: recipient.id, + purchaser_name: purchaser.name, + recipient_name: recipient.name, + upgrade_type: upgrade_type, + country: country, + is_gift: user_upgrade.is_gift?, + level: user_upgrade.level, + } + ) + + user_upgrade.update!(stripe_id: checkout_session.id) + checkout_session + end + + def refund!(reason = nil) + ::Stripe::Refund.create(payment_intent: payment_intent.id, reason: reason) + end + + concerning :WebhookMethods do + class_methods do + def receive_webhook(request) + event = build_event(request) + + case event.type + when "checkout.session.completed" + checkout_session_completed(event.data.object) + when "charge.dispute.created" + charge_dispute_created(event.data.object) + when "radar.early_fraud_warning.created" + radar_early_fraud_warning_created(event.data.object) + end + end + + private def build_event(request) + payload = request.body.read + signature = request.headers["Stripe-Signature"] + ::Stripe::Webhook.construct_event(payload, signature, Danbooru.config.stripe_webhook_secret) + end + + private def checkout_session_completed(checkout) + user_upgrade = UserUpgrade.find(checkout.metadata.user_upgrade_id) + user_upgrade.process_upgrade!(checkout.payment_status) + end + + private def charge_dispute_created(dispute) + Dmail.create_automated(to: User.owner, title: "Stripe Dispute", body: <<~EOS) + Dispute: https://stripe.com/payments/#{dispute.charge} + EOS + end + + private def radar_early_fraud_warning_created(fraud_warning) + Dmail.create_automated(to: User.owner, title: "Stripe Early Fraud Warning", body: <<~EOS) + Charge: https://stripe.com/payments/#{fraud_warning.charge} + EOS + end + + private def register_webhook + webhook = ::Stripe::WebhookEndpoint.create({ + url: Routes.webhook_user_upgrade_url(source: "stripe"), + enabled_events: [ + "checkout.session.completed", + "checkout.session.async_payment_failed", + "checkout.session.async_payment_succeeded", + "charge.dispute.created", + "radar.early_fraud_warning.created", + ], + }) + + webhook.secret + end + end + end + + def receipt_url + return nil if pending? || stripe_id.nil? + charge.receipt_url + end + + def payment_url + return nil if pending? || stripe_id.nil? + "https://dashboard.stripe.com/payments/#{payment_intent.id}" + end + + def amount + payment_intent.amount + end + + def currency + payment_intent.currency + end + + private def checkout_session + return nil if stripe_id.nil? + @checkout_session ||= ::Stripe::Checkout::Session.retrieve(stripe_id) + end + + private def payment_intent + return nil if checkout_session.nil? + @payment_intent ||= ::Stripe::PaymentIntent.retrieve(checkout_session.payment_intent) + end + + private def charge + payment_intent.charges.data.first + end + + private def payment_method_types(country) + case country.to_s.upcase + # Austria, https://stripe.com/docs/payments/bancontact + when "AT" + ["card", "eps"] + # Belgium, https://stripe.com/docs/payments/eps + when "BE" + ["card", "bancontact"] + # Germany, https://stripe.com/docs/payments/giropay + when "DE" + ["card", "giropay"] + # Netherlands, https://stripe.com/docs/payments/ideal + when "NL" + ["card", "ideal"] + # Poland, https://stripe.com/docs/payments/p24 + when "PL" + ["card", "p24"] + else + ["card"] + end + end + + private def preferred_currency(country) + case country.to_s.upcase + # Austria, Belgium, Germany, Netherlands, Poland + when "AT", "BE", "DE", "NL", "PL" + "eur" + else + "usd" + end + end + + private def upgrade_price_id(country) + case [upgrade_type, preferred_currency(country)] + when ["gold", "usd"] + Danbooru.config.stripe_gold_usd_price_id + when ["gold", "eur"] + Danbooru.config.stripe_gold_eur_price_id + when ["platinum", "usd"] + Danbooru.config.stripe_platinum_usd_price_id + when ["platinum", "eur"] + Danbooru.config.stripe_platinum_eur_price_id + when ["gold_to_platinum", "usd"] + Danbooru.config.stripe_gold_to_platinum_usd_price_id + when ["gold_to_platinum", "eur"] + Danbooru.config.stripe_gold_to_platinum_eur_price_id + else + raise NotImplementedError + end + end + + private def promotion_discount_id + if Danbooru.config.is_promotion? + Danbooru.config.stripe_promotion_discount_id + end + end +end diff --git a/app/models/user_upgrade.rb b/app/models/user_upgrade.rb index fc9721c81..03c2d0dfb 100644 --- a/app/models/user_upgrade.rb +++ b/app/models/user_upgrade.rb @@ -4,6 +4,8 @@ class UserUpgrade < ApplicationRecord belongs_to :recipient, class_name: "User" belongs_to :purchaser, class_name: "User" + delegate :payment_url, :receipt_url, to: :transaction + enum upgrade_type: { gold: 0, platinum: 10, @@ -21,19 +23,7 @@ class UserUpgrade < ApplicationRecord scope :self_upgrade, -> { where("recipient_id = purchaser_id") } def self.enabled? - stripe_secret_key.present? && stripe_publishable_key.present? && stripe_webhook_secret.present? - end - - def self.stripe_secret_key - Danbooru.config.stripe_secret_key - end - - def self.stripe_publishable_key - Danbooru.config.stripe_publishable_key - end - - def self.stripe_webhook_secret - Danbooru.config.stripe_webhook_secret + Danbooru.config.user_upgrades_enabled? end def self.gold_price @@ -147,74 +137,23 @@ class UserUpgrade < ApplicationRecord end end - concerning :StripeMethods do + concerning :TransactionMethods do def create_checkout!(country: "US", allow_promotion_codes: false) - methods = payment_method_types(country) - currency = preferred_currency(country) - price_id = upgrade_price_id(currency) - - checkout = Stripe::Checkout::Session.create( - mode: "payment", - success_url: Routes.user_upgrade_url(self), - cancel_url: Routes.new_user_upgrade_url(user_id: recipient.id), - client_reference_id: "user_upgrade_#{id}", - customer_email: purchaser.email_address&.address, - payment_method_types: methods, - allow_promotion_codes: allow_promotion_codes.presence, - line_items: [{ - price: price_id, - quantity: 1, - }], - discounts: [{ - coupon: promotion_discount_id, - }], - metadata: { - user_upgrade_id: id, - purchaser_id: purchaser.id, - recipient_id: recipient.id, - purchaser_name: purchaser.name, - recipient_name: recipient.name, - upgrade_type: upgrade_type, - country: country, - is_gift: is_gift?, - level: level, - } - ) - - update!(stripe_id: checkout.id) - checkout + transaction.create!(country: country, allow_promotion_codes: allow_promotion_codes) end def refund!(reason: nil) with_lock do return if refunded? - Stripe::Refund.create(payment_intent: payment_intent.id, reason: reason) + transaction.refund!(reason) recipient.update!(level: previous_level) update!(status: "refunded") end end - def receipt_url - return nil if pending? || stripe_id.nil? - charge.receipt_url - end - - def payment_url - return nil if pending? || stripe_id.nil? - "https://dashboard.stripe.com/payments/#{payment_intent.id}" - end - - def checkout_session - @checkout_session ||= Stripe::Checkout::Session.retrieve(stripe_id) - end - - def payment_intent - @payment_intent ||= Stripe::PaymentIntent.retrieve(checkout_session.payment_intent) - end - - def charge - payment_intent.charges.data.first + def transaction + PaymentTransaction::Stripe.new(self) end def has_receipt? @@ -224,115 +163,5 @@ class UserUpgrade < ApplicationRecord def has_payment? !pending? end - - def promotion_discount_id - if Danbooru.config.is_promotion? - Danbooru.config.stripe_promotion_discount_id - end - end - - def upgrade_price_id(currency) - case [upgrade_type, currency] - when ["gold", "usd"] - Danbooru.config.stripe_gold_usd_price_id - when ["gold", "eur"] - Danbooru.config.stripe_gold_eur_price_id - when ["platinum", "usd"] - Danbooru.config.stripe_platinum_usd_price_id - when ["platinum", "eur"] - Danbooru.config.stripe_platinum_eur_price_id - when ["gold_to_platinum", "usd"] - Danbooru.config.stripe_gold_to_platinum_usd_price_id - when ["gold_to_platinum", "eur"] - Danbooru.config.stripe_gold_to_platinum_eur_price_id - else - raise NotImplementedError - end - end - - def payment_method_types(country) - case country.to_s.upcase - # Austria, https://stripe.com/docs/payments/bancontact - when "AT" - ["card", "eps"] - # Belgium, https://stripe.com/docs/payments/eps - when "BE" - ["card", "bancontact"] - # Germany, https://stripe.com/docs/payments/giropay - when "DE" - ["card", "giropay"] - # Netherlands, https://stripe.com/docs/payments/ideal - when "NL" - ["card", "ideal"] - # Poland, https://stripe.com/docs/payments/p24 - when "PL" - ["card", "p24"] - else - ["card"] - end - end - - def preferred_currency(country) - case country.to_s.upcase - # Austria, Belgium, Germany, Netherlands, Poland - when "AT", "BE", "DE", "NL", "PL" - "eur" - else - "usd" - end - end - - class_methods do - def register_webhook - webhook = Stripe::WebhookEndpoint.create({ - url: Routes.webhook_user_upgrade_url(source: "stripe"), - enabled_events: [ - "checkout.session.completed", - "checkout.session.async_payment_failed", - "checkout.session.async_payment_succeeded", - "charge.dispute.created", - "radar.early_fraud_warning.created", - ], - }) - - webhook.secret - end - - def receive_webhook(request) - event = build_event(request) - - case event.type - when "checkout.session.completed" - checkout_session_completed(event.data.object) - when "charge.dispute.created" - charge_dispute_created(event.data.object) - when "radar.early_fraud_warning.created" - radar_early_fraud_warning_created(event.data.object) - end - end - - def build_event(request) - payload = request.body.read - signature = request.headers["Stripe-Signature"] - Stripe::Webhook.construct_event(payload, signature, stripe_webhook_secret) - end - - def checkout_session_completed(checkout) - user_upgrade = UserUpgrade.find(checkout.metadata.user_upgrade_id) - user_upgrade.process_upgrade!(checkout.payment_status) - end - - def charge_dispute_created(dispute) - Dmail.create_automated(to: User.owner, title: "Stripe Dispute", body: <<~EOS) - Dispute: https://stripe.com/payments/#{dispute.charge} - EOS - end - - def radar_early_fraud_warning_created(fraud_warning) - Dmail.create_automated(to: User.owner, title: "Stripe Early Fraud Warning", body: <<~EOS) - Charge: https://stripe.com/payments/#{fraud_warning.charge} - EOS - end - end end end diff --git a/app/views/user_upgrades/create.js.erb b/app/views/user_upgrades/create.js.erb index e08bc3438..e57465e98 100644 --- a/app/views/user_upgrades/create.js.erb +++ b/app/views/user_upgrades/create.js.erb @@ -1,2 +1,2 @@ -var stripe = Stripe("<%= j UserUpgrade.stripe_publishable_key %>"); +var stripe = Stripe("<%= j Danbooru.config.stripe_publishable_key %>"); stripe.redirectToCheckout({ sessionId: "<%= j @checkout.id %>" }); diff --git a/config/danbooru_default_config.rb b/config/danbooru_default_config.rb index 50094e871..23dcce551 100644 --- a/config/danbooru_default_config.rb +++ b/config/danbooru_default_config.rb @@ -363,6 +363,11 @@ module Danbooru resolution_mismatch source_larger source_smaller] end + # Whether the Gold account upgrade page should be enabled. + def user_upgrades_enabled? + true + end + def stripe_secret_key end diff --git a/test/functional/webhooks_controller_test.rb b/test/functional/webhooks_controller_test.rb index c39d08d0a..e6dd44ea4 100644 --- a/test/functional/webhooks_controller_test.rb +++ b/test/functional/webhooks_controller_test.rb @@ -9,8 +9,8 @@ class WebhooksControllerTest < ActionDispatch::IntegrationTest StripeMock.stop end - def post_webhook(*args, metadata: {}, payment_status: "paid") - skip unless UserUpgrade.enabled? + def post_stripe_webhook(*args, metadata: {}, payment_status: "paid") + skip unless PaymentTransaction::Stripe.enabled? event = StripeMock.mock_webhook_event(*args, payment_status: payment_status, metadata: metadata) signature = generate_stripe_signature(event) headers = { "Stripe-Signature": signature } @@ -22,7 +22,7 @@ class WebhooksControllerTest < ActionDispatch::IntegrationTest # https://stripe.com/docs/webhooks/signatures def generate_stripe_signature(event) time = Time.now - secret = UserUpgrade.stripe_webhook_secret + secret = Danbooru.config.stripe_webhook_secret signature = Stripe::Webhook::Signature.compute_signature(time, event.to_json, secret) Stripe::Webhook::Signature.generate_header(time, signature, scheme: Stripe::Webhook::Signature::EXPECTED_SCHEME) end @@ -58,7 +58,7 @@ class WebhooksControllerTest < ActionDispatch::IntegrationTest context "for a payment_intent.created event" do should "work" do - post_webhook("payment_intent.created") + post_stripe_webhook("payment_intent.created") assert_response 200 end @@ -68,7 +68,7 @@ class WebhooksControllerTest < ActionDispatch::IntegrationTest context "for completed event with an unpaid payment status" do should "not upgrade the user" do @user_upgrade = create(:self_gold_upgrade) - post_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }, payment_status: "unpaid") + post_stripe_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }, payment_status: "unpaid") assert_response 200 assert_equal("processing", @user_upgrade.reload.status) @@ -80,7 +80,7 @@ class WebhooksControllerTest < ActionDispatch::IntegrationTest context "to Gold" do should "upgrade the user" do @user_upgrade = create(:self_gold_upgrade) - post_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) + post_stripe_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) assert_response 200 assert_equal("complete", @user_upgrade.reload.status) @@ -91,7 +91,7 @@ class WebhooksControllerTest < ActionDispatch::IntegrationTest context "to Platinum" do should "upgrade the user" do @user_upgrade = create(:self_platinum_upgrade) - post_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) + post_stripe_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) assert_response 200 assert_equal("complete", @user_upgrade.reload.status) @@ -102,7 +102,7 @@ class WebhooksControllerTest < ActionDispatch::IntegrationTest context "from Gold to Platinum" do should "upgrade the user" do @user_upgrade = create(:self_gold_to_platinum_upgrade) - post_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) + post_stripe_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) assert_response 200 assert_equal("complete", @user_upgrade.reload.status) @@ -115,7 +115,7 @@ class WebhooksControllerTest < ActionDispatch::IntegrationTest context "to Gold" do should "upgrade the user" do @user_upgrade = create(:gift_gold_upgrade) - post_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) + post_stripe_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) assert_response 200 assert_equal("complete", @user_upgrade.reload.status) @@ -126,7 +126,7 @@ class WebhooksControllerTest < ActionDispatch::IntegrationTest context "to Platinum" do should "upgrade the user" do @user_upgrade = create(:gift_platinum_upgrade) - post_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) + post_stripe_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) assert_response 200 assert_equal("complete", @user_upgrade.reload.status) @@ -137,7 +137,7 @@ class WebhooksControllerTest < ActionDispatch::IntegrationTest context "from Gold to Platinum" do should "upgrade the user" do @user_upgrade = create(:gift_gold_to_platinum_upgrade) - post_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) + post_stripe_webhook("checkout.session.completed", metadata: { user_upgrade_id: @user_upgrade.id }) assert_response 200 assert_equal("complete", @user_upgrade.reload.status) diff --git a/test/test_helpers/stripe_test_helper.rb b/test/test_helpers/stripe_test_helper.rb index 9bfc845f9..8d1d7589c 100644 --- a/test/test_helpers/stripe_test_helper.rb +++ b/test/test_helpers/stripe_test_helper.rb @@ -3,11 +3,11 @@ StripeMock.webhook_fixture_path = "test/fixtures/stripe-webhooks" module StripeTestHelper def mock_stripe! setup do - StripeMock.start unless UserUpgrade.enabled? + StripeMock.start unless PaymentTransaction::Stripe.enabled? end teardown do - StripeMock.stop unless UserUpgrade.enabled? + StripeMock.stop unless PaymentTransaction::Stripe.enabled? end end end diff --git a/test/unit/user_upgrade_test.rb b/test/unit/user_upgrade_test.rb index 84b1f7961..a233dceb7 100644 --- a/test/unit/user_upgrade_test.rb +++ b/test/unit/user_upgrade_test.rb @@ -44,7 +44,7 @@ class UserUpgradeTest < ActiveSupport::TestCase context "for a gifted upgrade" do context "to Gold" do should "prefill the Stripe checkout page with the purchaser's email address" do - skip "Stripe API keys not configured" unless UserUpgrade.enabled? + skip "Stripe API keys not configured" unless PaymentTransaction::Stripe.enabled? @user = create(:user, email_address: build(:email_address)) @user_upgrade = create(:gift_gold_upgrade, purchaser: @user) @@ -64,48 +64,48 @@ class UserUpgradeTest < ActiveSupport::TestCase @user_upgrade = create(:self_gold_upgrade) @checkout = @user_upgrade.create_checkout!(country: "US") - assert_equal(UserUpgrade.gold_price, @user_upgrade.payment_intent.amount) - assert_equal("usd", @user_upgrade.payment_intent.currency) + assert_equal(UserUpgrade.gold_price, @user_upgrade.transaction.amount) + assert_equal("usd", @user_upgrade.transaction.currency) end should "choose the right price in USD for a platinum upgrade" do @user_upgrade = create(:self_platinum_upgrade) @checkout = @user_upgrade.create_checkout!(country: "US") - assert_equal(UserUpgrade.platinum_price, @user_upgrade.payment_intent.amount) - assert_equal("usd", @user_upgrade.payment_intent.currency) + assert_equal(UserUpgrade.platinum_price, @user_upgrade.transaction.amount) + assert_equal("usd", @user_upgrade.transaction.currency) end should "choose the right price in USD for a gold to platinum upgrade" do @user_upgrade = create(:self_gold_to_platinum_upgrade) @checkout = @user_upgrade.create_checkout!(country: "US") - assert_equal(UserUpgrade.gold_to_platinum_price, @user_upgrade.payment_intent.amount) - assert_equal("usd", @user_upgrade.payment_intent.currency) + assert_equal(UserUpgrade.gold_to_platinum_price, @user_upgrade.transaction.amount) + assert_equal("usd", @user_upgrade.transaction.currency) end should "choose the right price in EUR for a gold upgrade" do @user_upgrade = create(:self_gold_upgrade) @checkout = @user_upgrade.create_checkout!(country: "DE") - assert_equal(0.8 * UserUpgrade.gold_price, @user_upgrade.payment_intent.amount) - assert_equal("eur", @user_upgrade.payment_intent.currency) + assert_equal(0.8 * UserUpgrade.gold_price, @user_upgrade.transaction.amount) + assert_equal("eur", @user_upgrade.transaction.currency) end should "choose the right price in EUR for a platinum upgrade" do @user_upgrade = create(:self_platinum_upgrade) @checkout = @user_upgrade.create_checkout!(country: "DE") - assert_equal(0.8 * UserUpgrade.platinum_price, @user_upgrade.payment_intent.amount) - assert_equal("eur", @user_upgrade.payment_intent.currency) + assert_equal(0.8 * UserUpgrade.platinum_price, @user_upgrade.transaction.amount) + assert_equal("eur", @user_upgrade.transaction.currency) end should "choose the right price in EUR for a gold to platinum upgrade" do @user_upgrade = create(:self_gold_to_platinum_upgrade) @checkout = @user_upgrade.create_checkout!(country: "DE") - assert_equal(0.8 * UserUpgrade.gold_to_platinum_price, @user_upgrade.payment_intent.amount) - assert_equal("eur", @user_upgrade.payment_intent.currency) + assert_equal(0.8 * UserUpgrade.gold_to_platinum_price, @user_upgrade.transaction.amount) + assert_equal("eur", @user_upgrade.transaction.currency) end end @@ -119,49 +119,49 @@ class UserUpgradeTest < ActiveSupport::TestCase @checkout = @user_upgrade.create_checkout!(country: "US") assert_equal(["card"], @checkout.payment_method_types) - assert_equal("usd", @user_upgrade.payment_intent.currency) + assert_equal("usd", @user_upgrade.transaction.currency) end should "choose the right payment methods for AT" do @checkout = @user_upgrade.create_checkout!(country: "AT") assert_equal(["card", "eps"], @checkout.payment_method_types) - assert_equal("eur", @user_upgrade.payment_intent.currency) + assert_equal("eur", @user_upgrade.transaction.currency) end should "choose the right payment methods for BE" do @checkout = @user_upgrade.create_checkout!(country: "BE") assert_equal(["card", "bancontact"], @checkout.payment_method_types) - assert_equal("eur", @user_upgrade.payment_intent.currency) + assert_equal("eur", @user_upgrade.transaction.currency) end should "choose the right payment methods for DE" do @checkout = @user_upgrade.create_checkout!(country: "DE") assert_equal(["card", "giropay"], @checkout.payment_method_types) - assert_equal("eur", @user_upgrade.payment_intent.currency) + assert_equal("eur", @user_upgrade.transaction.currency) end should "choose the right payment methods for NL" do @checkout = @user_upgrade.create_checkout!(country: "NL") assert_equal(["card", "ideal"], @checkout.payment_method_types) - assert_equal("eur", @user_upgrade.payment_intent.currency) + assert_equal("eur", @user_upgrade.transaction.currency) end should "choose the right payment methods for PL" do @checkout = @user_upgrade.create_checkout!(country: "PL") assert_equal(["card", "p24"], @checkout.payment_method_types) - assert_equal("eur", @user_upgrade.payment_intent.currency) + assert_equal("eur", @user_upgrade.transaction.currency) end should "choose the right payment methods for an unsupported country" do @checkout = @user_upgrade.create_checkout!(country: "MX") assert_equal(["card"], @checkout.payment_method_types) - assert_equal("usd", @user_upgrade.payment_intent.currency) + assert_equal("usd", @user_upgrade.transaction.currency) end end end