# frozen_string_literal: true require "stripe" require "test/unit" require "mocha/test_unit" require "stringio" require "shoulda/context" require "webmock/test_unit" PROJECT_ROOT = File.expand_path("../", __dir__) require File.expand_path("test_data", __dir__) require File.expand_path("stripe_mock", __dir__) MOCK_MINIMUM_VERSION = "0.109.0" MOCK_PORT = Stripe::StripeMock.start # Disable all real network connections except those that are outgoing to # stripe-mock. WebMock.disable_net_connect!(allow: "localhost:#{MOCK_PORT}") # Try one initial test connection to stripe-mock so that if there's a problem # we can print one error and fail fast so that it's more clear to the user how # they should fix the problem. begin resp = Net::HTTP.get_response(URI("http://localhost:#{MOCK_PORT}/")) version = resp["Stripe-Mock-Version"] if version.nil? abort("Couldn't find `Stripe-Mock-Version` in response from " \ "`localhost:#{MOCK_PORT}`. Is the service running there stripe-mock?") end if version != "master" && Gem::Version.new(version) < Gem::Version.new(MOCK_MINIMUM_VERSION) abort("Your version of stripe-mock (#{version}) is too old. The minimum " \ "version to run this test suite is #{MOCK_MINIMUM_VERSION}. Please " \ "see its repository for upgrade instructions.") end rescue Errno::ECONNREFUSED abort("Couldn't reach stripe-mock at `localhost:#{MOCK_PORT}`. Is " \ "it running? Please see README for setup instructions.") end Test::Unit.at_exit do Stripe::StripeMock.stop end module Test module Unit class TestCase include Stripe::TestData include Mocha WRITE_TIMEOUT_SUPPORTED = Net::HTTP.instance_methods.include?(:write_timeout=) setup do Stripe.api_key = "sk_test_123" Stripe.api_base = "http://localhost:#{MOCK_PORT}" Stripe.uploads_base = "http://localhost:#{MOCK_PORT}" stub_connect end teardown do Stripe.api_key = nil end private def stub_connect stub_request(:any, /^#{Stripe.connect_base}/).to_return(body: "{}") end end end # helpers for writing webhook-related tests module WebhookHelpers SECRET = "whsec_test_secret" # calculate a verification header from a given payload def self.generate_header(opts = {}) raise ArgumentError, "payload must be supplied!" unless opts[:payload] opts[:timestamp] ||= Time.now opts[:secret] ||= SECRET opts[:scheme] ||= Stripe::Webhook::Signature::EXPECTED_SCHEME opts[:signature] ||= Stripe::Webhook::Signature.compute_signature( opts[:timestamp], opts[:payload], opts[:secret] ) Stripe::Webhook::Signature.generate_header( opts[:timestamp], opts[:signature], scheme: opts[:scheme] ) end end end